]> git.proxmox.com Git - framework7.git/blame - framework7/js/framework7.bundle.js
upgrade and bump version to 4.4.7
[framework7.git] / framework7 / js / framework7.bundle.js
CommitLineData
5309fbda 1/**
5d51ea26 2 * Framework7 4.4.7
5309fbda
DC
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 *
5d51ea26 10 * Released on: July 19, 2019
5309fbda
DC
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 /**
5d51ea26 20 * Template7 1.4.2
5309fbda
DC
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 *
5d51ea26 31 * Released on: June 14, 2019
5309fbda
DC
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 }
5d51ea26
DC
263 if (
264 (typeof variable === 'string')
265 || Array.isArray(variable)
266 || (variable.constructor && variable.constructor === Object)
267 ) {
5309fbda
DC
268 variable = JSON.stringify(variable);
269 }
270 if (variable === undefined) { variable = 'undefined'; }
271
272 arr.push(variable);
273 return arr;
274 }, []).join('');
5d51ea26 275
5309fbda
DC
276 },
277 parseJsParents: function parseJsParents(expression, parents) {
278 return expression.split(/([+ \-*^()&=|<>!%:?])/g).reduce(function (arr, part) {
279 if (!part) {
280 return arr;
281 }
282
283 if (part.indexOf('../') < 0) {
284 arr.push(part);
285 return arr;
286 }
287
288 if (!parents || parents.length === 0) {
289 arr.push(JSON.stringify(''));
290 return arr;
291 }
292
293 var levelsUp = part.split('../').length - 1;
294 var parentData = levelsUp > parents.length ? parents[parents.length - 1] : parents[levelsUp - 1];
295
296 var variable = parentData;
297 var parentPart = part.replace(/..\//g, '');
298 parentPart.split('.').forEach(function (partName) {
299 if (typeof variable[partName] !== 'undefined') { variable = variable[partName]; }
300 else { variable = 'undefined'; }
301 });
302 if (variable === false || variable === true) {
303 arr.push(JSON.stringify(variable));
304 return arr;
305 }
306 if (variable === null || variable === 'undefined') {
307 arr.push(JSON.stringify(''));
308 return arr;
309 }
310 arr.push(JSON.stringify(variable));
311 return arr;
312 }, []).join('');
313 },
314 getCompileVar: function getCompileVar(name, ctx, data) {
315 if ( data === void 0 ) data = 'data_1';
316
317 var variable = ctx;
318 var parts;
319 var levelsUp = 0;
320 var newDepth;
321 if (name.indexOf('../') === 0) {
322 levelsUp = name.split('../').length - 1;
323 newDepth = variable.split('_')[1] - levelsUp;
324 variable = "ctx_" + (newDepth >= 1 ? newDepth : 1);
325 parts = name.split('../')[levelsUp].split('.');
326 } else if (name.indexOf('@global') === 0) {
327 variable = 'Template7.global';
328 parts = name.split('@global.')[1].split('.');
329 } else if (name.indexOf('@root') === 0) {
330 variable = 'root';
331 parts = name.split('@root.')[1].split('.');
332 } else {
333 parts = name.split('.');
334 }
335 for (var i = 0; i < parts.length; i += 1) {
336 var part = parts[i];
337 if (part.indexOf('@') === 0) {
338 var dataLevel = data.split('_')[1];
339 if (levelsUp > 0) {
340 dataLevel = newDepth;
341 }
342 if (i > 0) {
343 variable += "[(data_" + dataLevel + " && data_" + dataLevel + "." + (part.replace('@', '')) + ")]";
344 } else {
345 variable = "(data_" + dataLevel + " && data_" + dataLevel + "." + (part.replace('@', '')) + ")";
346 }
347 } else if (Number.isFinite ? Number.isFinite(part) : Template7Context.isFinite(part)) {
348 variable += "[" + part + "]";
349 } else if (part === 'this' || part.indexOf('this.') >= 0 || part.indexOf('this[') >= 0 || part.indexOf('this(') >= 0) {
350 variable = part.replace('this', ctx);
351 } else {
352 variable += "." + part;
353 }
354 }
355 return variable;
356 },
357 getCompiledArguments: function getCompiledArguments(contextArray, ctx, data) {
358 var arr = [];
359 for (var i = 0; i < contextArray.length; i += 1) {
360 if (/^['"]/.test(contextArray[i])) { arr.push(contextArray[i]); }
361 else if (/^(true|false|\d+)$/.test(contextArray[i])) { arr.push(contextArray[i]); }
362 else {
363 arr.push(Template7Utils.getCompileVar(contextArray[i], ctx, data));
364 }
365 }
366
367 return arr.join(', ');
368 },
369 };
370
371 /* eslint no-eval: "off" */
372
373 var Template7Helpers = {
374 _partial: function _partial(partialName, options) {
375 var ctx = this;
376 var p = Template7Class.partials[partialName];
377 if (!p || (p && !p.template)) { return ''; }
378 if (!p.compiled) {
379 p.compiled = new Template7Class(p.template).compile();
380 }
381 Object.keys(options.hash).forEach(function (hashName) {
382 ctx[hashName] = options.hash[hashName];
383 });
384 return p.compiled(ctx, options.data, options.root);
385 },
386 escape: function escape(context) {
5d51ea26 387 if (typeof context === 'undefined' || context === null) { return ''; }
5309fbda
DC
388 if (typeof context !== 'string') {
389 throw new Error('Template7: Passed context to "escape" helper should be a string');
390 }
391 return Template7Utils.escape(context);
392 },
393 if: function if$1(context, options) {
394 var ctx = context;
395 if (Template7Utils.isFunction(ctx)) { ctx = ctx.call(this); }
396 if (ctx) {
397 return options.fn(this, options.data);
398 }
399
400 return options.inverse(this, options.data);
401 },
402 unless: function unless(context, options) {
403 var ctx = context;
404 if (Template7Utils.isFunction(ctx)) { ctx = ctx.call(this); }
405 if (!ctx) {
406 return options.fn(this, options.data);
407 }
408
409 return options.inverse(this, options.data);
410 },
411 each: function each(context, options) {
412 var ctx = context;
413 var ret = '';
414 var i = 0;
415 if (Template7Utils.isFunction(ctx)) { ctx = ctx.call(this); }
416 if (Array.isArray(ctx)) {
417 if (options.hash.reverse) {
418 ctx = ctx.reverse();
419 }
420 for (i = 0; i < ctx.length; i += 1) {
421 ret += options.fn(ctx[i], { first: i === 0, last: i === ctx.length - 1, index: i });
422 }
423 if (options.hash.reverse) {
424 ctx = ctx.reverse();
425 }
426 } else {
427 // eslint-disable-next-line
428 for (var key in ctx) {
429 i += 1;
430 ret += options.fn(ctx[key], { key: key });
431 }
432 }
433 if (i > 0) { return ret; }
434 return options.inverse(this);
435 },
436 with: function with$1(context, options) {
437 var ctx = context;
438 if (Template7Utils.isFunction(ctx)) { ctx = context.call(this); }
439 return options.fn(ctx);
440 },
441 join: function join(context, options) {
442 var ctx = context;
443 if (Template7Utils.isFunction(ctx)) { ctx = ctx.call(this); }
444 return ctx.join(options.hash.delimiter || options.hash.delimeter);
445 },
446 js: function js(expression, options) {
447 var data = options.data;
448 var func;
449 var execute = expression;
450 ('index first last key').split(' ').forEach(function (prop) {
451 if (typeof data[prop] !== 'undefined') {
452 var re1 = new RegExp(("this.@" + prop), 'g');
453 var re2 = new RegExp(("@" + prop), 'g');
454 execute = execute
455 .replace(re1, JSON.stringify(data[prop]))
456 .replace(re2, JSON.stringify(data[prop]));
457 }
458 });
459 if (options.root && execute.indexOf('@root') >= 0) {
460 execute = Template7Utils.parseJsVariable(execute, '@root', options.root);
461 }
462 if (execute.indexOf('@global') >= 0) {
463 execute = Template7Utils.parseJsVariable(execute, '@global', Template7Context.Template7.global);
464 }
465 if (execute.indexOf('../') >= 0) {
466 execute = Template7Utils.parseJsParents(execute, options.parents);
467 }
468 if (execute.indexOf('return') >= 0) {
469 func = "(function(){" + execute + "})";
470 } else {
471 func = "(function(){return (" + execute + ")})";
472 }
473 return eval(func).call(this);
474 },
475 js_if: function js_if(expression, options) {
476 var data = options.data;
477 var func;
478 var execute = expression;
479 ('index first last key').split(' ').forEach(function (prop) {
480 if (typeof data[prop] !== 'undefined') {
481 var re1 = new RegExp(("this.@" + prop), 'g');
482 var re2 = new RegExp(("@" + prop), 'g');
483 execute = execute
484 .replace(re1, JSON.stringify(data[prop]))
485 .replace(re2, JSON.stringify(data[prop]));
486 }
487 });
488 if (options.root && execute.indexOf('@root') >= 0) {
489 execute = Template7Utils.parseJsVariable(execute, '@root', options.root);
490 }
491 if (execute.indexOf('@global') >= 0) {
492 execute = Template7Utils.parseJsVariable(execute, '@global', Template7Context.Template7.global);
493 }
494 if (execute.indexOf('../') >= 0) {
495 execute = Template7Utils.parseJsParents(execute, options.parents);
496 }
497 if (execute.indexOf('return') >= 0) {
498 func = "(function(){" + execute + "})";
499 } else {
500 func = "(function(){return (" + execute + ")})";
501 }
502 var condition = eval(func).call(this);
503 if (condition) {
504 return options.fn(this, options.data);
505 }
506
507 return options.inverse(this, options.data);
508 },
509 };
510 Template7Helpers.js_compare = Template7Helpers.js_if;
511
512 var Template7Options = {};
513 var Template7Partials = {};
514
515 var Template7Class = function Template7Class(template) {
516 var t = this;
517 t.template = template;
518 };
519
520 var staticAccessors = { options: { configurable: true },partials: { configurable: true },helpers: { configurable: true } };
521 Template7Class.prototype.compile = function compile (template, depth) {
522 if ( template === void 0 ) template = this.template;
523 if ( depth === void 0 ) depth = 1;
524
525 var t = this;
526 if (t.compiled) { return t.compiled; }
527
528 if (typeof template !== 'string') {
529 throw new Error('Template7: Template must be a string');
530 }
531 var stringToBlocks = Template7Utils.stringToBlocks;
532 var getCompileVar = Template7Utils.getCompileVar;
533 var getCompiledArguments = Template7Utils.getCompiledArguments;
534
535 var blocks = stringToBlocks(template);
536 var ctx = "ctx_" + depth;
537 var data = "data_" + depth;
538 if (blocks.length === 0) {
539 return function empty() { return ''; };
540 }
541
542 function getCompileFn(block, newDepth) {
543 if (block.content) { return t.compile(block.content, newDepth); }
544 return function empty() { return ''; };
545 }
546 function getCompileInverse(block, newDepth) {
547 if (block.inverseContent) { return t.compile(block.inverseContent, newDepth); }
548 return function empty() { return ''; };
549 }
550
551 var resultString = '';
552 if (depth === 1) {
553 resultString += "(function (" + ctx + ", " + data + ", root) {\n";
554 } else {
555 resultString += "(function (" + ctx + ", " + data + ") {\n";
556 }
557 if (depth === 1) {
558 resultString += 'function isArray(arr){return Array.isArray(arr);}\n';
559 resultString += 'function isFunction(func){return (typeof func === \'function\');}\n';
560 resultString += 'function c(val, ctx) {if (typeof val !== "undefined" && val !== null) {if (isFunction(val)) {return val.call(ctx);} else return val;} else return "";}\n';
561 resultString += 'root = root || ctx_1 || {};\n';
562 }
563 resultString += 'var r = \'\';\n';
564 var i;
565 for (i = 0; i < blocks.length; i += 1) {
566 var block = blocks[i];
567 // Plain block
568 if (block.type === 'plain') {
569 // eslint-disable-next-line
570 resultString += "r +='" + ((block.content).replace(/\r/g, '\\r').replace(/\n/g, '\\n').replace(/'/g, '\\' + '\'')) + "';";
571 continue;
572 }
573 var variable = (void 0);
574 var compiledArguments = (void 0);
575 // Variable block
576 if (block.type === 'variable') {
577 variable = getCompileVar(block.contextName, ctx, data);
578 resultString += "r += c(" + variable + ", " + ctx + ");";
579 }
580 // Helpers block
581 if (block.type === 'helper') {
582 var parents = (void 0);
583 if (ctx !== 'ctx_1') {
584 var level = ctx.split('_')[1];
585 var parentsString = "ctx_" + (level - 1);
586 for (var j = level - 2; j >= 1; j -= 1) {
587 parentsString += ", ctx_" + j;
588 }
589 parents = "[" + parentsString + "]";
590 } else {
591 parents = "[" + ctx + "]";
592 }
593 var dynamicHelper = (void 0);
594 if (block.helperName.indexOf('[') === 0) {
595 block.helperName = getCompileVar(block.helperName.replace(/[[\]]/g, ''), ctx, data);
596 dynamicHelper = true;
597 }
598 if (dynamicHelper || block.helperName in Template7Helpers) {
599 compiledArguments = getCompiledArguments(block.contextName, ctx, data);
600 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 + "});";
601 } else if (block.contextName.length > 0) {
602 throw new Error(("Template7: Missing helper: \"" + (block.helperName) + "\""));
603 } else {
604 variable = getCompileVar(block.helperName, ctx, data);
605 resultString += "if (" + variable + ") {";
606 resultString += "if (isArray(" + variable + ")) {";
607 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 + "});";
608 resultString += '}else {';
609 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 + "});";
610 resultString += '}}';
611 }
612 }
613 }
614 resultString += '\nreturn r;})';
615
616 if (depth === 1) {
617 // eslint-disable-next-line
618 t.compiled = eval(resultString);
619 return t.compiled;
620 }
621 return resultString;
622 };
623 staticAccessors.options.get = function () {
624 return Template7Options;
625 };
626 staticAccessors.partials.get = function () {
627 return Template7Partials;
628 };
629 staticAccessors.helpers.get = function () {
630 return Template7Helpers;
631 };
632
633 Object.defineProperties( Template7Class, staticAccessors );
634
635 function Template7() {
636 var args = [], len = arguments.length;
637 while ( len-- ) args[ len ] = arguments[ len ];
638
639 var template = args[0];
640 var data = args[1];
641 if (args.length === 2) {
642 var instance = new Template7Class(template);
643 var rendered = instance.compile()(data);
644 instance = null;
645 return (rendered);
646 }
647 return new Template7Class(template);
648 }
649 Template7.registerHelper = function registerHelper(name, fn) {
650 Template7Class.helpers[name] = fn;
651 };
652 Template7.unregisterHelper = function unregisterHelper(name) {
653 Template7Class.helpers[name] = undefined;
654 delete Template7Class.helpers[name];
655 };
656 Template7.registerPartial = function registerPartial(name, template) {
657 Template7Class.partials[name] = { template: template };
658 };
659 Template7.unregisterPartial = function unregisterPartial(name) {
660 if (Template7Class.partials[name]) {
661 Template7Class.partials[name] = undefined;
662 delete Template7Class.partials[name];
663 }
664 };
665 Template7.compile = function compile(template, options) {
666 var instance = new Template7Class(template, options);
667 return instance.compile();
668 };
669
670 Template7.options = Template7Class.options;
671 Template7.helpers = Template7Class.helpers;
672 Template7.partials = Template7Class.partials;
673
674 /**
675 * SSR Window 1.0.1
676 * Better handling for window object in SSR environment
677 * https://github.com/nolimits4web/ssr-window
678 *
679 * Copyright 2018, Vladimir Kharlampidi
680 *
681 * Licensed under MIT
682 *
683 * Released on: July 18, 2018
684 */
685 var doc = (typeof document === 'undefined') ? {
686 body: {},
687 addEventListener: function addEventListener() {},
688 removeEventListener: function removeEventListener() {},
689 activeElement: {
690 blur: function blur() {},
691 nodeName: '',
692 },
693 querySelector: function querySelector() {
694 return null;
695 },
696 querySelectorAll: function querySelectorAll() {
697 return [];
698 },
699 getElementById: function getElementById() {
700 return null;
701 },
702 createEvent: function createEvent() {
703 return {
704 initEvent: function initEvent() {},
705 };
706 },
707 createElement: function createElement() {
708 return {
709 children: [],
710 childNodes: [],
711 style: {},
712 setAttribute: function setAttribute() {},
713 getElementsByTagName: function getElementsByTagName() {
714 return [];
715 },
716 };
717 },
718 location: { hash: '' },
719 } : document; // eslint-disable-line
720
721 var win = (typeof window === 'undefined') ? {
722 document: doc,
723 navigator: {
724 userAgent: '',
725 },
726 location: {},
727 history: {},
728 CustomEvent: function CustomEvent() {
729 return this;
730 },
731 addEventListener: function addEventListener() {},
732 removeEventListener: function removeEventListener() {},
733 getComputedStyle: function getComputedStyle() {
734 return {
735 getPropertyValue: function getPropertyValue() {
736 return '';
737 },
738 };
739 },
740 Image: function Image() {},
741 Date: function Date() {},
742 screen: {},
743 setTimeout: function setTimeout() {},
744 clearTimeout: function clearTimeout() {},
745 } : window; // eslint-disable-line
746
747 /**
748 * Dom7 2.1.3
749 * Minimalistic JavaScript library for DOM manipulation, with a jQuery-compatible API
750 * http://framework7.io/docs/dom.html
751 *
752 * Copyright 2019, Vladimir Kharlampidi
753 * The iDangero.us
754 * http://www.idangero.us/
755 *
756 * Licensed under MIT
757 *
758 * Released on: February 11, 2019
759 */
760
761 var Dom7 = function Dom7(arr) {
762 var self = this;
763 // Create array-like object
764 for (var i = 0; i < arr.length; i += 1) {
765 self[i] = arr[i];
766 }
767 self.length = arr.length;
768 // Return collection with methods
769 return this;
770 };
771
772 function $(selector, context) {
773 var arr = [];
774 var i = 0;
775 if (selector && !context) {
776 if (selector instanceof Dom7) {
777 return selector;
778 }
779 }
780 if (selector) {
781 // String
782 if (typeof selector === 'string') {
783 var els;
784 var tempParent;
785 var html = selector.trim();
786 if (html.indexOf('<') >= 0 && html.indexOf('>') >= 0) {
787 var toCreate = 'div';
788 if (html.indexOf('<li') === 0) { toCreate = 'ul'; }
789 if (html.indexOf('<tr') === 0) { toCreate = 'tbody'; }
790 if (html.indexOf('<td') === 0 || html.indexOf('<th') === 0) { toCreate = 'tr'; }
791 if (html.indexOf('<tbody') === 0) { toCreate = 'table'; }
792 if (html.indexOf('<option') === 0) { toCreate = 'select'; }
793 tempParent = doc.createElement(toCreate);
794 tempParent.innerHTML = html;
795 for (i = 0; i < tempParent.childNodes.length; i += 1) {
796 arr.push(tempParent.childNodes[i]);
797 }
798 } else {
799 if (!context && selector[0] === '#' && !selector.match(/[ .<>:~]/)) {
800 // Pure ID selector
801 els = [doc.getElementById(selector.trim().split('#')[1])];
802 } else {
803 // Other selectors
804 els = (context || doc).querySelectorAll(selector.trim());
805 }
806 for (i = 0; i < els.length; i += 1) {
807 if (els[i]) { arr.push(els[i]); }
808 }
809 }
810 } else if (selector.nodeType || selector === win || selector === doc) {
811 // Node/element
812 arr.push(selector);
813 } else if (selector.length > 0 && selector[0].nodeType) {
814 // Array of elements or instance of Dom
815 for (i = 0; i < selector.length; i += 1) {
816 arr.push(selector[i]);
817 }
818 }
819 }
820 return new Dom7(arr);
821 }
822
823 $.fn = Dom7.prototype;
824 $.Class = Dom7;
825 $.Dom7 = Dom7;
826
827 function unique(arr) {
828 var uniqueArray = [];
829 for (var i = 0; i < arr.length; i += 1) {
830 if (uniqueArray.indexOf(arr[i]) === -1) { uniqueArray.push(arr[i]); }
831 }
832 return uniqueArray;
833 }
834 function toCamelCase(string) {
835 return string.toLowerCase().replace(/-(.)/g, function (match, group1) { return group1.toUpperCase(); });
836 }
837
838 function requestAnimationFrame(callback) {
839 if (win.requestAnimationFrame) { return win.requestAnimationFrame(callback); }
840 else if (win.webkitRequestAnimationFrame) { return win.webkitRequestAnimationFrame(callback); }
841 return win.setTimeout(callback, 1000 / 60);
842 }
843 function cancelAnimationFrame(id) {
844 if (win.cancelAnimationFrame) { return win.cancelAnimationFrame(id); }
845 else if (win.webkitCancelAnimationFrame) { return win.webkitCancelAnimationFrame(id); }
846 return win.clearTimeout(id);
847 }
848
849 // Classes and attributes
850 function addClass(className) {
851 if (typeof className === 'undefined') {
852 return this;
853 }
854 var classes = className.split(' ');
855 for (var i = 0; i < classes.length; i += 1) {
856 for (var j = 0; j < this.length; j += 1) {
857 if (typeof this[j] !== 'undefined' && typeof this[j].classList !== 'undefined') { this[j].classList.add(classes[i]); }
858 }
859 }
860 return this;
861 }
862 function removeClass(className) {
863 var classes = className.split(' ');
864 for (var i = 0; i < classes.length; i += 1) {
865 for (var j = 0; j < this.length; j += 1) {
866 if (typeof this[j] !== 'undefined' && typeof this[j].classList !== 'undefined') { this[j].classList.remove(classes[i]); }
867 }
868 }
869 return this;
870 }
871 function hasClass(className) {
872 if (!this[0]) { return false; }
873 return this[0].classList.contains(className);
874 }
875 function toggleClass(className) {
876 var classes = className.split(' ');
877 for (var i = 0; i < classes.length; i += 1) {
878 for (var j = 0; j < this.length; j += 1) {
879 if (typeof this[j] !== 'undefined' && typeof this[j].classList !== 'undefined') { this[j].classList.toggle(classes[i]); }
880 }
881 }
882 return this;
883 }
884 function attr(attrs, value) {
885 var arguments$1 = arguments;
886
887 if (arguments.length === 1 && typeof attrs === 'string') {
888 // Get attr
889 if (this[0]) { return this[0].getAttribute(attrs); }
890 return undefined;
891 }
892
893 // Set attrs
894 for (var i = 0; i < this.length; i += 1) {
895 if (arguments$1.length === 2) {
896 // String
897 this[i].setAttribute(attrs, value);
898 } else {
899 // Object
900 // eslint-disable-next-line
901 for (var attrName in attrs) {
902 this[i][attrName] = attrs[attrName];
903 this[i].setAttribute(attrName, attrs[attrName]);
904 }
905 }
906 }
907 return this;
908 }
909 // eslint-disable-next-line
910 function removeAttr(attr) {
911 for (var i = 0; i < this.length; i += 1) {
912 this[i].removeAttribute(attr);
913 }
914 return this;
915 }
916 // eslint-disable-next-line
917 function prop(props, value) {
918 var arguments$1 = arguments;
919
920 if (arguments.length === 1 && typeof props === 'string') {
921 // Get prop
922 if (this[0]) { return this[0][props]; }
923 } else {
924 // Set props
925 for (var i = 0; i < this.length; i += 1) {
926 if (arguments$1.length === 2) {
927 // String
928 this[i][props] = value;
929 } else {
930 // Object
931 // eslint-disable-next-line
932 for (var propName in props) {
933 this[i][propName] = props[propName];
934 }
935 }
936 }
937 return this;
938 }
939 }
940 function data(key, value) {
941 var el;
942 if (typeof value === 'undefined') {
943 el = this[0];
944 // Get value
945 if (el) {
946 if (el.dom7ElementDataStorage && (key in el.dom7ElementDataStorage)) {
947 return el.dom7ElementDataStorage[key];
948 }
949
950 var dataKey = el.getAttribute(("data-" + key));
951 if (dataKey) {
952 return dataKey;
953 }
954 return undefined;
955 }
956 return undefined;
957 }
958
959 // Set value
960 for (var i = 0; i < this.length; i += 1) {
961 el = this[i];
962 if (!el.dom7ElementDataStorage) { el.dom7ElementDataStorage = {}; }
963 el.dom7ElementDataStorage[key] = value;
964 }
965 return this;
966 }
967 function removeData(key) {
968 for (var i = 0; i < this.length; i += 1) {
969 var el = this[i];
970 if (el.dom7ElementDataStorage && el.dom7ElementDataStorage[key]) {
971 el.dom7ElementDataStorage[key] = null;
972 delete el.dom7ElementDataStorage[key];
973 }
974 }
975 }
976 function dataset() {
977 var el = this[0];
978 if (!el) { return undefined; }
979 var dataset = {}; // eslint-disable-line
980 if (el.dataset) {
981 // eslint-disable-next-line
982 for (var dataKey in el.dataset) {
983 dataset[dataKey] = el.dataset[dataKey];
984 }
985 } else {
986 for (var i = 0; i < el.attributes.length; i += 1) {
987 // eslint-disable-next-line
988 var attr = el.attributes[i];
989 if (attr.name.indexOf('data-') >= 0) {
990 dataset[toCamelCase(attr.name.split('data-')[1])] = attr.value;
991 }
992 }
993 }
994 // eslint-disable-next-line
995 for (var key in dataset) {
996 if (dataset[key] === 'false') { dataset[key] = false; }
997 else if (dataset[key] === 'true') { dataset[key] = true; }
998 else if (parseFloat(dataset[key]) === dataset[key] * 1) { dataset[key] *= 1; }
999 }
1000 return dataset;
1001 }
1002 function val(value) {
1003 var dom = this;
1004 if (typeof value === 'undefined') {
1005 if (dom[0]) {
1006 if (dom[0].multiple && dom[0].nodeName.toLowerCase() === 'select') {
1007 var values = [];
1008 for (var i = 0; i < dom[0].selectedOptions.length; i += 1) {
1009 values.push(dom[0].selectedOptions[i].value);
1010 }
1011 return values;
1012 }
1013 return dom[0].value;
1014 }
1015 return undefined;
1016 }
1017
1018 for (var i$1 = 0; i$1 < dom.length; i$1 += 1) {
1019 var el = dom[i$1];
1020 if (Array.isArray(value) && el.multiple && el.nodeName.toLowerCase() === 'select') {
1021 for (var j = 0; j < el.options.length; j += 1) {
1022 el.options[j].selected = value.indexOf(el.options[j].value) >= 0;
1023 }
1024 } else {
1025 el.value = value;
1026 }
1027 }
1028 return dom;
1029 }
1030 // Transforms
1031 // eslint-disable-next-line
1032 function transform(transform) {
1033 for (var i = 0; i < this.length; i += 1) {
1034 var elStyle = this[i].style;
1035 elStyle.webkitTransform = transform;
1036 elStyle.transform = transform;
1037 }
1038 return this;
1039 }
1040 function transition(duration) {
1041 if (typeof duration !== 'string') {
1042 duration = duration + "ms"; // eslint-disable-line
1043 }
1044 for (var i = 0; i < this.length; i += 1) {
1045 var elStyle = this[i].style;
1046 elStyle.webkitTransitionDuration = duration;
1047 elStyle.transitionDuration = duration;
1048 }
1049 return this;
1050 }
1051 // Events
1052 function on() {
1053 var assign;
1054
1055 var args = [], len = arguments.length;
1056 while ( len-- ) args[ len ] = arguments[ len ];
1057 var eventType = args[0];
1058 var targetSelector = args[1];
1059 var listener = args[2];
1060 var capture = args[3];
1061 if (typeof args[1] === 'function') {
1062 (assign = args, eventType = assign[0], listener = assign[1], capture = assign[2]);
1063 targetSelector = undefined;
1064 }
1065 if (!capture) { capture = false; }
1066
1067 function handleLiveEvent(e) {
1068 var target = e.target;
1069 if (!target) { return; }
1070 var eventData = e.target.dom7EventData || [];
1071 if (eventData.indexOf(e) < 0) {
1072 eventData.unshift(e);
1073 }
1074 if ($(target).is(targetSelector)) { listener.apply(target, eventData); }
1075 else {
1076 var parents = $(target).parents(); // eslint-disable-line
1077 for (var k = 0; k < parents.length; k += 1) {
1078 if ($(parents[k]).is(targetSelector)) { listener.apply(parents[k], eventData); }
1079 }
1080 }
1081 }
1082 function handleEvent(e) {
1083 var eventData = e && e.target ? e.target.dom7EventData || [] : [];
1084 if (eventData.indexOf(e) < 0) {
1085 eventData.unshift(e);
1086 }
1087 listener.apply(this, eventData);
1088 }
1089 var events = eventType.split(' ');
1090 var j;
1091 for (var i = 0; i < this.length; i += 1) {
1092 var el = this[i];
1093 if (!targetSelector) {
1094 for (j = 0; j < events.length; j += 1) {
1095 var event = events[j];
1096 if (!el.dom7Listeners) { el.dom7Listeners = {}; }
1097 if (!el.dom7Listeners[event]) { el.dom7Listeners[event] = []; }
1098 el.dom7Listeners[event].push({
1099 listener: listener,
1100 proxyListener: handleEvent,
1101 });
1102 el.addEventListener(event, handleEvent, capture);
1103 }
1104 } else {
1105 // Live events
1106 for (j = 0; j < events.length; j += 1) {
1107 var event$1 = events[j];
1108 if (!el.dom7LiveListeners) { el.dom7LiveListeners = {}; }
1109 if (!el.dom7LiveListeners[event$1]) { el.dom7LiveListeners[event$1] = []; }
1110 el.dom7LiveListeners[event$1].push({
1111 listener: listener,
1112 proxyListener: handleLiveEvent,
1113 });
1114 el.addEventListener(event$1, handleLiveEvent, capture);
1115 }
1116 }
1117 }
1118 return this;
1119 }
1120 function off() {
1121 var assign;
1122
1123 var args = [], len = arguments.length;
1124 while ( len-- ) args[ len ] = arguments[ len ];
1125 var eventType = args[0];
1126 var targetSelector = args[1];
1127 var listener = args[2];
1128 var capture = args[3];
1129 if (typeof args[1] === 'function') {
1130 (assign = args, eventType = assign[0], listener = assign[1], capture = assign[2]);
1131 targetSelector = undefined;
1132 }
1133 if (!capture) { capture = false; }
1134
1135 var events = eventType.split(' ');
1136 for (var i = 0; i < events.length; i += 1) {
1137 var event = events[i];
1138 for (var j = 0; j < this.length; j += 1) {
1139 var el = this[j];
1140 var handlers = (void 0);
1141 if (!targetSelector && el.dom7Listeners) {
1142 handlers = el.dom7Listeners[event];
1143 } else if (targetSelector && el.dom7LiveListeners) {
1144 handlers = el.dom7LiveListeners[event];
1145 }
1146 if (handlers && handlers.length) {
1147 for (var k = handlers.length - 1; k >= 0; k -= 1) {
1148 var handler = handlers[k];
1149 if (listener && handler.listener === listener) {
1150 el.removeEventListener(event, handler.proxyListener, capture);
1151 handlers.splice(k, 1);
1152 } else if (listener && handler.listener && handler.listener.dom7proxy && handler.listener.dom7proxy === listener) {
1153 el.removeEventListener(event, handler.proxyListener, capture);
1154 handlers.splice(k, 1);
1155 } else if (!listener) {
1156 el.removeEventListener(event, handler.proxyListener, capture);
1157 handlers.splice(k, 1);
1158 }
1159 }
1160 }
1161 }
1162 }
1163 return this;
1164 }
1165 function once() {
1166 var assign;
1167
1168 var args = [], len = arguments.length;
1169 while ( len-- ) args[ len ] = arguments[ len ];
1170 var dom = this;
1171 var eventName = args[0];
1172 var targetSelector = args[1];
1173 var listener = args[2];
1174 var capture = args[3];
1175 if (typeof args[1] === 'function') {
1176 (assign = args, eventName = assign[0], listener = assign[1], capture = assign[2]);
1177 targetSelector = undefined;
1178 }
1179 function onceHandler() {
1180 var eventArgs = [], len = arguments.length;
1181 while ( len-- ) eventArgs[ len ] = arguments[ len ];
1182
1183 listener.apply(this, eventArgs);
1184 dom.off(eventName, targetSelector, onceHandler, capture);
1185 if (onceHandler.dom7proxy) {
1186 delete onceHandler.dom7proxy;
1187 }
1188 }
1189 onceHandler.dom7proxy = listener;
1190 return dom.on(eventName, targetSelector, onceHandler, capture);
1191 }
1192 function trigger() {
1193 var args = [], len = arguments.length;
1194 while ( len-- ) args[ len ] = arguments[ len ];
1195
1196 var events = args[0].split(' ');
1197 var eventData = args[1];
1198 for (var i = 0; i < events.length; i += 1) {
1199 var event = events[i];
1200 for (var j = 0; j < this.length; j += 1) {
1201 var el = this[j];
1202 var evt = (void 0);
1203 try {
1204 evt = new win.CustomEvent(event, {
1205 detail: eventData,
1206 bubbles: true,
1207 cancelable: true,
1208 });
1209 } catch (e) {
1210 evt = doc.createEvent('Event');
1211 evt.initEvent(event, true, true);
1212 evt.detail = eventData;
1213 }
1214 // eslint-disable-next-line
1215 el.dom7EventData = args.filter(function (data, dataIndex) { return dataIndex > 0; });
1216 el.dispatchEvent(evt);
1217 el.dom7EventData = [];
1218 delete el.dom7EventData;
1219 }
1220 }
1221 return this;
1222 }
1223 function transitionEnd(callback) {
1224 var events = ['webkitTransitionEnd', 'transitionend'];
1225 var dom = this;
1226 var i;
1227 function fireCallBack(e) {
1228 /* jshint validthis:true */
1229 if (e.target !== this) { return; }
1230 callback.call(this, e);
1231 for (i = 0; i < events.length; i += 1) {
1232 dom.off(events[i], fireCallBack);
1233 }
1234 }
1235 if (callback) {
1236 for (i = 0; i < events.length; i += 1) {
1237 dom.on(events[i], fireCallBack);
1238 }
1239 }
1240 return this;
1241 }
1242 function animationEnd(callback) {
1243 var events = ['webkitAnimationEnd', 'animationend'];
1244 var dom = this;
1245 var i;
1246 function fireCallBack(e) {
1247 if (e.target !== this) { return; }
1248 callback.call(this, e);
1249 for (i = 0; i < events.length; i += 1) {
1250 dom.off(events[i], fireCallBack);
1251 }
1252 }
1253 if (callback) {
1254 for (i = 0; i < events.length; i += 1) {
1255 dom.on(events[i], fireCallBack);
1256 }
1257 }
1258 return this;
1259 }
1260 // Sizing/Styles
1261 function width() {
1262 if (this[0] === win) {
1263 return win.innerWidth;
1264 }
1265
1266 if (this.length > 0) {
1267 return parseFloat(this.css('width'));
1268 }
1269
1270 return null;
1271 }
1272 function outerWidth(includeMargins) {
1273 if (this.length > 0) {
1274 if (includeMargins) {
1275 // eslint-disable-next-line
1276 var styles = this.styles();
1277 return this[0].offsetWidth + parseFloat(styles.getPropertyValue('margin-right')) + parseFloat(styles.getPropertyValue('margin-left'));
1278 }
1279 return this[0].offsetWidth;
1280 }
1281 return null;
1282 }
1283 function height() {
1284 if (this[0] === win) {
1285 return win.innerHeight;
1286 }
1287
1288 if (this.length > 0) {
1289 return parseFloat(this.css('height'));
1290 }
1291
1292 return null;
1293 }
1294 function outerHeight(includeMargins) {
1295 if (this.length > 0) {
1296 if (includeMargins) {
1297 // eslint-disable-next-line
1298 var styles = this.styles();
1299 return this[0].offsetHeight + parseFloat(styles.getPropertyValue('margin-top')) + parseFloat(styles.getPropertyValue('margin-bottom'));
1300 }
1301 return this[0].offsetHeight;
1302 }
1303 return null;
1304 }
1305 function offset() {
1306 if (this.length > 0) {
1307 var el = this[0];
1308 var box = el.getBoundingClientRect();
1309 var body = doc.body;
1310 var clientTop = el.clientTop || body.clientTop || 0;
1311 var clientLeft = el.clientLeft || body.clientLeft || 0;
1312 var scrollTop = el === win ? win.scrollY : el.scrollTop;
1313 var scrollLeft = el === win ? win.scrollX : el.scrollLeft;
1314 return {
1315 top: (box.top + scrollTop) - clientTop,
1316 left: (box.left + scrollLeft) - clientLeft,
1317 };
1318 }
1319
1320 return null;
1321 }
1322 function hide() {
1323 for (var i = 0; i < this.length; i += 1) {
1324 this[i].style.display = 'none';
1325 }
1326 return this;
1327 }
1328 function show() {
1329 for (var i = 0; i < this.length; i += 1) {
1330 var el = this[i];
1331 if (el.style.display === 'none') {
1332 el.style.display = '';
1333 }
1334 if (win.getComputedStyle(el, null).getPropertyValue('display') === 'none') {
1335 // Still not visible
1336 el.style.display = 'block';
1337 }
1338 }
1339 return this;
1340 }
1341 function styles() {
1342 if (this[0]) { return win.getComputedStyle(this[0], null); }
1343 return {};
1344 }
1345 function css(props, value) {
1346 var i;
1347 if (arguments.length === 1) {
1348 if (typeof props === 'string') {
1349 if (this[0]) { return win.getComputedStyle(this[0], null).getPropertyValue(props); }
1350 } else {
1351 for (i = 0; i < this.length; i += 1) {
1352 // eslint-disable-next-line
1353 for (var prop in props) {
1354 this[i].style[prop] = props[prop];
1355 }
1356 }
1357 return this;
1358 }
1359 }
1360 if (arguments.length === 2 && typeof props === 'string') {
1361 for (i = 0; i < this.length; i += 1) {
1362 this[i].style[props] = value;
1363 }
1364 return this;
1365 }
1366 return this;
1367 }
1368
1369 // Dom manipulation
1370 function toArray() {
1371 var arr = [];
1372 for (var i = 0; i < this.length; i += 1) {
1373 arr.push(this[i]);
1374 }
1375 return arr;
1376 }
1377 // Iterate over the collection passing elements to `callback`
1378 function each(callback) {
1379 // Don't bother continuing without a callback
1380 if (!callback) { return this; }
1381 // Iterate over the current collection
1382 for (var i = 0; i < this.length; i += 1) {
1383 // If the callback returns false
1384 if (callback.call(this[i], i, this[i]) === false) {
1385 // End the loop early
1386 return this;
1387 }
1388 }
1389 // Return `this` to allow chained DOM operations
1390 return this;
1391 }
1392 function forEach(callback) {
1393 // Don't bother continuing without a callback
1394 if (!callback) { return this; }
1395 // Iterate over the current collection
1396 for (var i = 0; i < this.length; i += 1) {
1397 // If the callback returns false
1398 if (callback.call(this[i], this[i], i) === false) {
1399 // End the loop early
1400 return this;
1401 }
1402 }
1403 // Return `this` to allow chained DOM operations
1404 return this;
1405 }
1406 function filter(callback) {
1407 var matchedItems = [];
1408 var dom = this;
1409 for (var i = 0; i < dom.length; i += 1) {
1410 if (callback.call(dom[i], i, dom[i])) { matchedItems.push(dom[i]); }
1411 }
1412 return new Dom7(matchedItems);
1413 }
1414 function map(callback) {
1415 var modifiedItems = [];
1416 var dom = this;
1417 for (var i = 0; i < dom.length; i += 1) {
1418 modifiedItems.push(callback.call(dom[i], i, dom[i]));
1419 }
1420 return new Dom7(modifiedItems);
1421 }
1422 // eslint-disable-next-line
1423 function html(html) {
1424 if (typeof html === 'undefined') {
1425 return this[0] ? this[0].innerHTML : undefined;
1426 }
1427
1428 for (var i = 0; i < this.length; i += 1) {
1429 this[i].innerHTML = html;
1430 }
1431 return this;
1432 }
1433 // eslint-disable-next-line
1434 function text(text) {
1435 if (typeof text === 'undefined') {
1436 if (this[0]) {
1437 return this[0].textContent.trim();
1438 }
1439 return null;
1440 }
1441
1442 for (var i = 0; i < this.length; i += 1) {
1443 this[i].textContent = text;
1444 }
1445 return this;
1446 }
1447 function is(selector) {
1448 var el = this[0];
1449 var compareWith;
1450 var i;
1451 if (!el || typeof selector === 'undefined') { return false; }
1452 if (typeof selector === 'string') {
1453 if (el.matches) { return el.matches(selector); }
1454 else if (el.webkitMatchesSelector) { return el.webkitMatchesSelector(selector); }
1455 else if (el.msMatchesSelector) { return el.msMatchesSelector(selector); }
1456
1457 compareWith = $(selector);
1458 for (i = 0; i < compareWith.length; i += 1) {
1459 if (compareWith[i] === el) { return true; }
1460 }
1461 return false;
1462 } else if (selector === doc) { return el === doc; }
1463 else if (selector === win) { return el === win; }
1464
1465 if (selector.nodeType || selector instanceof Dom7) {
1466 compareWith = selector.nodeType ? [selector] : selector;
1467 for (i = 0; i < compareWith.length; i += 1) {
1468 if (compareWith[i] === el) { return true; }
1469 }
1470 return false;
1471 }
1472 return false;
1473 }
1474 function indexOf(el) {
1475 for (var i = 0; i < this.length; i += 1) {
1476 if (this[i] === el) { return i; }
1477 }
1478 return -1;
1479 }
1480 function index() {
1481 var child = this[0];
1482 var i;
1483 if (child) {
1484 i = 0;
1485 // eslint-disable-next-line
1486 while ((child = child.previousSibling) !== null) {
1487 if (child.nodeType === 1) { i += 1; }
1488 }
1489 return i;
1490 }
1491 return undefined;
1492 }
1493 // eslint-disable-next-line
1494 function eq(index) {
1495 if (typeof index === 'undefined') { return this; }
1496 var length = this.length;
1497 var returnIndex;
1498 if (index > length - 1) {
1499 return new Dom7([]);
1500 }
1501 if (index < 0) {
1502 returnIndex = length + index;
1503 if (returnIndex < 0) { return new Dom7([]); }
1504 return new Dom7([this[returnIndex]]);
1505 }
1506 return new Dom7([this[index]]);
1507 }
1508 function append() {
1509 var args = [], len = arguments.length;
1510 while ( len-- ) args[ len ] = arguments[ len ];
1511
1512 var newChild;
1513
1514 for (var k = 0; k < args.length; k += 1) {
1515 newChild = args[k];
1516 for (var i = 0; i < this.length; i += 1) {
1517 if (typeof newChild === 'string') {
1518 var tempDiv = doc.createElement('div');
1519 tempDiv.innerHTML = newChild;
1520 while (tempDiv.firstChild) {
1521 this[i].appendChild(tempDiv.firstChild);
1522 }
1523 } else if (newChild instanceof Dom7) {
1524 for (var j = 0; j < newChild.length; j += 1) {
1525 this[i].appendChild(newChild[j]);
1526 }
1527 } else {
1528 this[i].appendChild(newChild);
1529 }
1530 }
1531 }
1532
1533 return this;
1534 }
1535 // eslint-disable-next-line
1536 function appendTo(parent) {
1537 $(parent).append(this);
1538 return this;
1539 }
1540 function prepend(newChild) {
1541 var i;
1542 var j;
1543 for (i = 0; i < this.length; i += 1) {
1544 if (typeof newChild === 'string') {
1545 var tempDiv = doc.createElement('div');
1546 tempDiv.innerHTML = newChild;
1547 for (j = tempDiv.childNodes.length - 1; j >= 0; j -= 1) {
1548 this[i].insertBefore(tempDiv.childNodes[j], this[i].childNodes[0]);
1549 }
1550 } else if (newChild instanceof Dom7) {
1551 for (j = 0; j < newChild.length; j += 1) {
1552 this[i].insertBefore(newChild[j], this[i].childNodes[0]);
1553 }
1554 } else {
1555 this[i].insertBefore(newChild, this[i].childNodes[0]);
1556 }
1557 }
1558 return this;
1559 }
1560 // eslint-disable-next-line
1561 function prependTo(parent) {
1562 $(parent).prepend(this);
1563 return this;
1564 }
1565 function insertBefore(selector) {
1566 var before = $(selector);
1567 for (var i = 0; i < this.length; i += 1) {
1568 if (before.length === 1) {
1569 before[0].parentNode.insertBefore(this[i], before[0]);
1570 } else if (before.length > 1) {
1571 for (var j = 0; j < before.length; j += 1) {
1572 before[j].parentNode.insertBefore(this[i].cloneNode(true), before[j]);
1573 }
1574 }
1575 }
1576 }
1577 function insertAfter(selector) {
1578 var after = $(selector);
1579 for (var i = 0; i < this.length; i += 1) {
1580 if (after.length === 1) {
1581 after[0].parentNode.insertBefore(this[i], after[0].nextSibling);
1582 } else if (after.length > 1) {
1583 for (var j = 0; j < after.length; j += 1) {
1584 after[j].parentNode.insertBefore(this[i].cloneNode(true), after[j].nextSibling);
1585 }
1586 }
1587 }
1588 }
1589 function next(selector) {
1590 if (this.length > 0) {
1591 if (selector) {
1592 if (this[0].nextElementSibling && $(this[0].nextElementSibling).is(selector)) {
1593 return new Dom7([this[0].nextElementSibling]);
1594 }
1595 return new Dom7([]);
1596 }
1597
1598 if (this[0].nextElementSibling) { return new Dom7([this[0].nextElementSibling]); }
1599 return new Dom7([]);
1600 }
1601 return new Dom7([]);
1602 }
1603 function nextAll(selector) {
1604 var nextEls = [];
1605 var el = this[0];
1606 if (!el) { return new Dom7([]); }
1607 while (el.nextElementSibling) {
1608 var next = el.nextElementSibling; // eslint-disable-line
1609 if (selector) {
1610 if ($(next).is(selector)) { nextEls.push(next); }
1611 } else { nextEls.push(next); }
1612 el = next;
1613 }
1614 return new Dom7(nextEls);
1615 }
1616 function prev(selector) {
1617 if (this.length > 0) {
1618 var el = this[0];
1619 if (selector) {
1620 if (el.previousElementSibling && $(el.previousElementSibling).is(selector)) {
1621 return new Dom7([el.previousElementSibling]);
1622 }
1623 return new Dom7([]);
1624 }
1625
1626 if (el.previousElementSibling) { return new Dom7([el.previousElementSibling]); }
1627 return new Dom7([]);
1628 }
1629 return new Dom7([]);
1630 }
1631 function prevAll(selector) {
1632 var prevEls = [];
1633 var el = this[0];
1634 if (!el) { return new Dom7([]); }
1635 while (el.previousElementSibling) {
1636 var prev = el.previousElementSibling; // eslint-disable-line
1637 if (selector) {
1638 if ($(prev).is(selector)) { prevEls.push(prev); }
1639 } else { prevEls.push(prev); }
1640 el = prev;
1641 }
1642 return new Dom7(prevEls);
1643 }
1644 function siblings(selector) {
1645 return this.nextAll(selector).add(this.prevAll(selector));
1646 }
1647 function parent(selector) {
1648 var parents = []; // eslint-disable-line
1649 for (var i = 0; i < this.length; i += 1) {
1650 if (this[i].parentNode !== null) {
1651 if (selector) {
1652 if ($(this[i].parentNode).is(selector)) { parents.push(this[i].parentNode); }
1653 } else {
1654 parents.push(this[i].parentNode);
1655 }
1656 }
1657 }
1658 return $(unique(parents));
1659 }
1660 function parents(selector) {
1661 var parents = []; // eslint-disable-line
1662 for (var i = 0; i < this.length; i += 1) {
1663 var parent = this[i].parentNode; // eslint-disable-line
1664 while (parent) {
1665 if (selector) {
1666 if ($(parent).is(selector)) { parents.push(parent); }
1667 } else {
1668 parents.push(parent);
1669 }
1670 parent = parent.parentNode;
1671 }
1672 }
1673 return $(unique(parents));
1674 }
1675 function closest(selector) {
1676 var closest = this; // eslint-disable-line
1677 if (typeof selector === 'undefined') {
1678 return new Dom7([]);
1679 }
1680 if (!closest.is(selector)) {
1681 closest = closest.parents(selector).eq(0);
1682 }
1683 return closest;
1684 }
1685 function find(selector) {
1686 var foundElements = [];
1687 for (var i = 0; i < this.length; i += 1) {
1688 var found = this[i].querySelectorAll(selector);
1689 for (var j = 0; j < found.length; j += 1) {
1690 foundElements.push(found[j]);
1691 }
1692 }
1693 return new Dom7(foundElements);
1694 }
1695 function children(selector) {
1696 var children = []; // eslint-disable-line
1697 for (var i = 0; i < this.length; i += 1) {
1698 var childNodes = this[i].childNodes;
1699
1700 for (var j = 0; j < childNodes.length; j += 1) {
1701 if (!selector) {
1702 if (childNodes[j].nodeType === 1) { children.push(childNodes[j]); }
1703 } else if (childNodes[j].nodeType === 1 && $(childNodes[j]).is(selector)) {
1704 children.push(childNodes[j]);
1705 }
1706 }
1707 }
1708 return new Dom7(unique(children));
1709 }
1710 function remove() {
1711 for (var i = 0; i < this.length; i += 1) {
1712 if (this[i].parentNode) { this[i].parentNode.removeChild(this[i]); }
1713 }
1714 return this;
1715 }
1716 function detach() {
1717 return this.remove();
1718 }
1719 function add() {
1720 var args = [], len = arguments.length;
1721 while ( len-- ) args[ len ] = arguments[ len ];
1722
1723 var dom = this;
1724 var i;
1725 var j;
1726 for (i = 0; i < args.length; i += 1) {
1727 var toAdd = $(args[i]);
1728 for (j = 0; j < toAdd.length; j += 1) {
1729 dom[dom.length] = toAdd[j];
1730 dom.length += 1;
1731 }
1732 }
1733 return dom;
1734 }
1735 function empty() {
1736 for (var i = 0; i < this.length; i += 1) {
1737 var el = this[i];
1738 if (el.nodeType === 1) {
1739 for (var j = 0; j < el.childNodes.length; j += 1) {
1740 if (el.childNodes[j].parentNode) {
1741 el.childNodes[j].parentNode.removeChild(el.childNodes[j]);
1742 }
1743 }
1744 el.textContent = '';
1745 }
1746 }
1747 return this;
1748 }
1749
1750 var Methods = /*#__PURE__*/Object.freeze({
1751 addClass: addClass,
1752 removeClass: removeClass,
1753 hasClass: hasClass,
1754 toggleClass: toggleClass,
1755 attr: attr,
1756 removeAttr: removeAttr,
1757 prop: prop,
1758 data: data,
1759 removeData: removeData,
1760 dataset: dataset,
1761 val: val,
1762 transform: transform,
1763 transition: transition,
1764 on: on,
1765 off: off,
1766 once: once,
1767 trigger: trigger,
1768 transitionEnd: transitionEnd,
1769 animationEnd: animationEnd,
1770 width: width,
1771 outerWidth: outerWidth,
1772 height: height,
1773 outerHeight: outerHeight,
1774 offset: offset,
1775 hide: hide,
1776 show: show,
1777 styles: styles,
1778 css: css,
1779 toArray: toArray,
1780 each: each,
1781 forEach: forEach,
1782 filter: filter,
1783 map: map,
1784 html: html,
1785 text: text,
1786 is: is,
1787 indexOf: indexOf,
1788 index: index,
1789 eq: eq,
1790 append: append,
1791 appendTo: appendTo,
1792 prepend: prepend,
1793 prependTo: prependTo,
1794 insertBefore: insertBefore,
1795 insertAfter: insertAfter,
1796 next: next,
1797 nextAll: nextAll,
1798 prev: prev,
1799 prevAll: prevAll,
1800 siblings: siblings,
1801 parent: parent,
1802 parents: parents,
1803 closest: closest,
1804 find: find,
1805 children: children,
1806 remove: remove,
1807 detach: detach,
1808 add: add,
1809 empty: empty
1810 });
1811
1812 function scrollTo() {
1813 var assign;
1814
1815 var args = [], len = arguments.length;
1816 while ( len-- ) args[ len ] = arguments[ len ];
1817 var left = args[0];
1818 var top = args[1];
1819 var duration = args[2];
1820 var easing = args[3];
1821 var callback = args[4];
1822 if (args.length === 4 && typeof easing === 'function') {
1823 callback = easing;
1824 (assign = args, left = assign[0], top = assign[1], duration = assign[2], callback = assign[3], easing = assign[4]);
1825 }
1826 if (typeof easing === 'undefined') { easing = 'swing'; }
1827
1828 return this.each(function animate() {
1829 var el = this;
1830 var currentTop;
1831 var currentLeft;
1832 var maxTop;
1833 var maxLeft;
1834 var newTop;
1835 var newLeft;
1836 var scrollTop; // eslint-disable-line
1837 var scrollLeft; // eslint-disable-line
1838 var animateTop = top > 0 || top === 0;
1839 var animateLeft = left > 0 || left === 0;
1840 if (typeof easing === 'undefined') {
1841 easing = 'swing';
1842 }
1843 if (animateTop) {
1844 currentTop = el.scrollTop;
1845 if (!duration) {
1846 el.scrollTop = top;
1847 }
1848 }
1849 if (animateLeft) {
1850 currentLeft = el.scrollLeft;
1851 if (!duration) {
1852 el.scrollLeft = left;
1853 }
1854 }
1855 if (!duration) { return; }
1856 if (animateTop) {
1857 maxTop = el.scrollHeight - el.offsetHeight;
1858 newTop = Math.max(Math.min(top, maxTop), 0);
1859 }
1860 if (animateLeft) {
1861 maxLeft = el.scrollWidth - el.offsetWidth;
1862 newLeft = Math.max(Math.min(left, maxLeft), 0);
1863 }
1864 var startTime = null;
1865 if (animateTop && newTop === currentTop) { animateTop = false; }
1866 if (animateLeft && newLeft === currentLeft) { animateLeft = false; }
1867 function render(time) {
1868 if ( time === void 0 ) time = new Date().getTime();
1869
1870 if (startTime === null) {
1871 startTime = time;
1872 }
1873 var progress = Math.max(Math.min((time - startTime) / duration, 1), 0);
1874 var easeProgress = easing === 'linear' ? progress : (0.5 - (Math.cos(progress * Math.PI) / 2));
1875 var done;
1876 if (animateTop) { scrollTop = currentTop + (easeProgress * (newTop - currentTop)); }
1877 if (animateLeft) { scrollLeft = currentLeft + (easeProgress * (newLeft - currentLeft)); }
1878 if (animateTop && newTop > currentTop && scrollTop >= newTop) {
1879 el.scrollTop = newTop;
1880 done = true;
1881 }
1882 if (animateTop && newTop < currentTop && scrollTop <= newTop) {
1883 el.scrollTop = newTop;
1884 done = true;
1885 }
1886 if (animateLeft && newLeft > currentLeft && scrollLeft >= newLeft) {
1887 el.scrollLeft = newLeft;
1888 done = true;
1889 }
1890 if (animateLeft && newLeft < currentLeft && scrollLeft <= newLeft) {
1891 el.scrollLeft = newLeft;
1892 done = true;
1893 }
1894
1895 if (done) {
1896 if (callback) { callback(); }
1897 return;
1898 }
1899 if (animateTop) { el.scrollTop = scrollTop; }
1900 if (animateLeft) { el.scrollLeft = scrollLeft; }
1901 requestAnimationFrame(render);
1902 }
1903 requestAnimationFrame(render);
1904 });
1905 }
1906 // scrollTop(top, duration, easing, callback) {
1907 function scrollTop() {
1908 var assign;
1909
1910 var args = [], len = arguments.length;
1911 while ( len-- ) args[ len ] = arguments[ len ];
1912 var top = args[0];
1913 var duration = args[1];
1914 var easing = args[2];
1915 var callback = args[3];
1916 if (args.length === 3 && typeof easing === 'function') {
1917 (assign = args, top = assign[0], duration = assign[1], callback = assign[2], easing = assign[3]);
1918 }
1919 var dom = this;
1920 if (typeof top === 'undefined') {
1921 if (dom.length > 0) { return dom[0].scrollTop; }
1922 return null;
1923 }
1924 return dom.scrollTo(undefined, top, duration, easing, callback);
1925 }
1926 function scrollLeft() {
1927 var assign;
1928
1929 var args = [], len = arguments.length;
1930 while ( len-- ) args[ len ] = arguments[ len ];
1931 var left = args[0];
1932 var duration = args[1];
1933 var easing = args[2];
1934 var callback = args[3];
1935 if (args.length === 3 && typeof easing === 'function') {
1936 (assign = args, left = assign[0], duration = assign[1], callback = assign[2], easing = assign[3]);
1937 }
1938 var dom = this;
1939 if (typeof left === 'undefined') {
1940 if (dom.length > 0) { return dom[0].scrollLeft; }
1941 return null;
1942 }
1943 return dom.scrollTo(left, undefined, duration, easing, callback);
1944 }
1945
1946 var Scroll = /*#__PURE__*/Object.freeze({
1947 scrollTo: scrollTo,
1948 scrollTop: scrollTop,
1949 scrollLeft: scrollLeft
1950 });
1951
1952 function animate(initialProps, initialParams) {
1953 var els = this;
1954 var a = {
1955 props: Object.assign({}, initialProps),
1956 params: Object.assign({
1957 duration: 300,
1958 easing: 'swing', // or 'linear'
1959 /* Callbacks
1960 begin(elements)
1961 complete(elements)
1962 progress(elements, complete, remaining, start, tweenValue)
1963 */
1964 }, initialParams),
1965
1966 elements: els,
1967 animating: false,
1968 que: [],
1969
1970 easingProgress: function easingProgress(easing, progress) {
1971 if (easing === 'swing') {
1972 return 0.5 - (Math.cos(progress * Math.PI) / 2);
1973 }
1974 if (typeof easing === 'function') {
1975 return easing(progress);
1976 }
1977 return progress;
1978 },
1979 stop: function stop() {
1980 if (a.frameId) {
1981 cancelAnimationFrame(a.frameId);
1982 }
1983 a.animating = false;
1984 a.elements.each(function (index, el) {
1985 var element = el;
1986 delete element.dom7AnimateInstance;
1987 });
1988 a.que = [];
1989 },
1990 done: function done(complete) {
1991 a.animating = false;
1992 a.elements.each(function (index, el) {
1993 var element = el;
1994 delete element.dom7AnimateInstance;
1995 });
1996 if (complete) { complete(els); }
1997 if (a.que.length > 0) {
1998 var que = a.que.shift();
1999 a.animate(que[0], que[1]);
2000 }
2001 },
2002 animate: function animate(props, params) {
2003 if (a.animating) {
2004 a.que.push([props, params]);
2005 return a;
2006 }
2007 var elements = [];
2008
2009 // Define & Cache Initials & Units
2010 a.elements.each(function (index, el) {
2011 var initialFullValue;
2012 var initialValue;
2013 var unit;
2014 var finalValue;
2015 var finalFullValue;
2016
2017 if (!el.dom7AnimateInstance) { a.elements[index].dom7AnimateInstance = a; }
2018
2019 elements[index] = {
2020 container: el,
2021 };
2022 Object.keys(props).forEach(function (prop) {
2023 initialFullValue = win.getComputedStyle(el, null).getPropertyValue(prop).replace(',', '.');
2024 initialValue = parseFloat(initialFullValue);
2025 unit = initialFullValue.replace(initialValue, '');
2026 finalValue = parseFloat(props[prop]);
2027 finalFullValue = props[prop] + unit;
2028 elements[index][prop] = {
2029 initialFullValue: initialFullValue,
2030 initialValue: initialValue,
2031 unit: unit,
2032 finalValue: finalValue,
2033 finalFullValue: finalFullValue,
2034 currentValue: initialValue,
2035 };
2036 });
2037 });
2038
2039 var startTime = null;
2040 var time;
2041 var elementsDone = 0;
2042 var propsDone = 0;
2043 var done;
2044 var began = false;
2045
2046 a.animating = true;
2047
2048 function render() {
2049 time = new Date().getTime();
2050 var progress;
2051 var easeProgress;
2052 // let el;
2053 if (!began) {
2054 began = true;
2055 if (params.begin) { params.begin(els); }
2056 }
2057 if (startTime === null) {
2058 startTime = time;
2059 }
2060 if (params.progress) {
2061 // eslint-disable-next-line
2062 params.progress(els, Math.max(Math.min((time - startTime) / params.duration, 1), 0), ((startTime + params.duration) - time < 0 ? 0 : (startTime + params.duration) - time), startTime);
2063 }
2064
2065 elements.forEach(function (element) {
2066 var el = element;
2067 if (done || el.done) { return; }
2068 Object.keys(props).forEach(function (prop) {
2069 if (done || el.done) { return; }
2070 progress = Math.max(Math.min((time - startTime) / params.duration, 1), 0);
2071 easeProgress = a.easingProgress(params.easing, progress);
2072 var ref = el[prop];
2073 var initialValue = ref.initialValue;
2074 var finalValue = ref.finalValue;
2075 var unit = ref.unit;
2076 el[prop].currentValue = initialValue + (easeProgress * (finalValue - initialValue));
2077 var currentValue = el[prop].currentValue;
2078
2079 if (
2080 (finalValue > initialValue && currentValue >= finalValue) ||
2081 (finalValue < initialValue && currentValue <= finalValue)) {
2082 el.container.style[prop] = finalValue + unit;
2083 propsDone += 1;
2084 if (propsDone === Object.keys(props).length) {
2085 el.done = true;
2086 elementsDone += 1;
2087 }
2088 if (elementsDone === elements.length) {
2089 done = true;
2090 }
2091 }
2092 if (done) {
2093 a.done(params.complete);
2094 return;
2095 }
2096 el.container.style[prop] = currentValue + unit;
2097 });
2098 });
2099 if (done) { return; }
2100 // Then call
2101 a.frameId = requestAnimationFrame(render);
2102 }
2103 a.frameId = requestAnimationFrame(render);
2104 return a;
2105 },
2106 };
2107
2108 if (a.elements.length === 0) {
2109 return els;
2110 }
2111
2112 var animateInstance;
2113 for (var i = 0; i < a.elements.length; i += 1) {
2114 if (a.elements[i].dom7AnimateInstance) {
2115 animateInstance = a.elements[i].dom7AnimateInstance;
2116 } else { a.elements[i].dom7AnimateInstance = a; }
2117 }
2118 if (!animateInstance) {
2119 animateInstance = a;
2120 }
2121
2122 if (initialProps === 'stop') {
2123 animateInstance.stop();
2124 } else {
2125 animateInstance.animate(a.props, a.params);
2126 }
2127
2128 return els;
2129 }
2130
2131 function stop() {
2132 var els = this;
2133 for (var i = 0; i < els.length; i += 1) {
2134 if (els[i].dom7AnimateInstance) {
2135 els[i].dom7AnimateInstance.stop();
2136 }
2137 }
2138 }
2139
2140 var Animate = /*#__PURE__*/Object.freeze({
2141 animate: animate,
2142 stop: stop
2143 });
2144
2145 var noTrigger = ('resize scroll').split(' ');
2146 function eventShortcut(name) {
2147 var ref;
2148
2149 var args = [], len = arguments.length - 1;
2150 while ( len-- > 0 ) args[ len ] = arguments[ len + 1 ];
2151 if (typeof args[0] === 'undefined') {
2152 for (var i = 0; i < this.length; i += 1) {
2153 if (noTrigger.indexOf(name) < 0) {
2154 if (name in this[i]) { this[i][name](); }
2155 else {
2156 $(this[i]).trigger(name);
2157 }
2158 }
2159 }
2160 return this;
2161 }
2162 return (ref = this).on.apply(ref, [ name ].concat( args ));
2163 }
2164
2165 function click() {
2166 var args = [], len = arguments.length;
2167 while ( len-- ) args[ len ] = arguments[ len ];
2168
2169 return eventShortcut.bind(this).apply(void 0, [ 'click' ].concat( args ));
2170 }
2171 function blur() {
2172 var args = [], len = arguments.length;
2173 while ( len-- ) args[ len ] = arguments[ len ];
2174
2175 return eventShortcut.bind(this).apply(void 0, [ 'blur' ].concat( args ));
2176 }
2177 function focus() {
2178 var args = [], len = arguments.length;
2179 while ( len-- ) args[ len ] = arguments[ len ];
2180
2181 return eventShortcut.bind(this).apply(void 0, [ 'focus' ].concat( args ));
2182 }
2183 function focusin() {
2184 var args = [], len = arguments.length;
2185 while ( len-- ) args[ len ] = arguments[ len ];
2186
2187 return eventShortcut.bind(this).apply(void 0, [ 'focusin' ].concat( args ));
2188 }
2189 function focusout() {
2190 var args = [], len = arguments.length;
2191 while ( len-- ) args[ len ] = arguments[ len ];
2192
2193 return eventShortcut.bind(this).apply(void 0, [ 'focusout' ].concat( args ));
2194 }
2195 function keyup() {
2196 var args = [], len = arguments.length;
2197 while ( len-- ) args[ len ] = arguments[ len ];
2198
2199 return eventShortcut.bind(this).apply(void 0, [ 'keyup' ].concat( args ));
2200 }
2201 function keydown() {
2202 var args = [], len = arguments.length;
2203 while ( len-- ) args[ len ] = arguments[ len ];
2204
2205 return eventShortcut.bind(this).apply(void 0, [ 'keydown' ].concat( args ));
2206 }
2207 function keypress() {
2208 var args = [], len = arguments.length;
2209 while ( len-- ) args[ len ] = arguments[ len ];
2210
2211 return eventShortcut.bind(this).apply(void 0, [ 'keypress' ].concat( args ));
2212 }
2213 function submit() {
2214 var args = [], len = arguments.length;
2215 while ( len-- ) args[ len ] = arguments[ len ];
2216
2217 return eventShortcut.bind(this).apply(void 0, [ 'submit' ].concat( args ));
2218 }
2219 function change() {
2220 var args = [], len = arguments.length;
2221 while ( len-- ) args[ len ] = arguments[ len ];
2222
2223 return eventShortcut.bind(this).apply(void 0, [ 'change' ].concat( args ));
2224 }
2225 function mousedown() {
2226 var args = [], len = arguments.length;
2227 while ( len-- ) args[ len ] = arguments[ len ];
2228
2229 return eventShortcut.bind(this).apply(void 0, [ 'mousedown' ].concat( args ));
2230 }
2231 function mousemove() {
2232 var args = [], len = arguments.length;
2233 while ( len-- ) args[ len ] = arguments[ len ];
2234
2235 return eventShortcut.bind(this).apply(void 0, [ 'mousemove' ].concat( args ));
2236 }
2237 function mouseup() {
2238 var args = [], len = arguments.length;
2239 while ( len-- ) args[ len ] = arguments[ len ];
2240
2241 return eventShortcut.bind(this).apply(void 0, [ 'mouseup' ].concat( args ));
2242 }
2243 function mouseenter() {
2244 var args = [], len = arguments.length;
2245 while ( len-- ) args[ len ] = arguments[ len ];
2246
2247 return eventShortcut.bind(this).apply(void 0, [ 'mouseenter' ].concat( args ));
2248 }
2249 function mouseleave() {
2250 var args = [], len = arguments.length;
2251 while ( len-- ) args[ len ] = arguments[ len ];
2252
2253 return eventShortcut.bind(this).apply(void 0, [ 'mouseleave' ].concat( args ));
2254 }
2255 function mouseout() {
2256 var args = [], len = arguments.length;
2257 while ( len-- ) args[ len ] = arguments[ len ];
2258
2259 return eventShortcut.bind(this).apply(void 0, [ 'mouseout' ].concat( args ));
2260 }
2261 function mouseover() {
2262 var args = [], len = arguments.length;
2263 while ( len-- ) args[ len ] = arguments[ len ];
2264
2265 return eventShortcut.bind(this).apply(void 0, [ 'mouseover' ].concat( args ));
2266 }
2267 function touchstart() {
2268 var args = [], len = arguments.length;
2269 while ( len-- ) args[ len ] = arguments[ len ];
2270
2271 return eventShortcut.bind(this).apply(void 0, [ 'touchstart' ].concat( args ));
2272 }
2273 function touchend() {
2274 var args = [], len = arguments.length;
2275 while ( len-- ) args[ len ] = arguments[ len ];
2276
2277 return eventShortcut.bind(this).apply(void 0, [ 'touchend' ].concat( args ));
2278 }
2279 function touchmove() {
2280 var args = [], len = arguments.length;
2281 while ( len-- ) args[ len ] = arguments[ len ];
2282
2283 return eventShortcut.bind(this).apply(void 0, [ 'touchmove' ].concat( args ));
2284 }
2285 function resize() {
2286 var args = [], len = arguments.length;
2287 while ( len-- ) args[ len ] = arguments[ len ];
2288
2289 return eventShortcut.bind(this).apply(void 0, [ 'resize' ].concat( args ));
2290 }
2291 function scroll() {
2292 var args = [], len = arguments.length;
2293 while ( len-- ) args[ len ] = arguments[ len ];
2294
2295 return eventShortcut.bind(this).apply(void 0, [ 'scroll' ].concat( args ));
2296 }
2297
2298 var eventShortcuts = /*#__PURE__*/Object.freeze({
2299 click: click,
2300 blur: blur,
2301 focus: focus,
2302 focusin: focusin,
2303 focusout: focusout,
2304 keyup: keyup,
2305 keydown: keydown,
2306 keypress: keypress,
2307 submit: submit,
2308 change: change,
2309 mousedown: mousedown,
2310 mousemove: mousemove,
2311 mouseup: mouseup,
2312 mouseenter: mouseenter,
2313 mouseleave: mouseleave,
2314 mouseout: mouseout,
2315 mouseover: mouseover,
2316 touchstart: touchstart,
2317 touchend: touchend,
2318 touchmove: touchmove,
2319 resize: resize,
2320 scroll: scroll
2321 });
2322
2323 [Methods, Scroll, Animate, eventShortcuts].forEach(function (group) {
2324 Object.keys(group).forEach(function (methodName) {
2325 $.fn[methodName] = group[methodName];
2326 });
2327 });
2328
2329 /**
2330 * https://github.com/gre/bezier-easing
2331 * BezierEasing - use bezier curve for transition easing function
2332 * by Gaëtan Renaudeau 2014 - 2015 – MIT License
2333 */
2334
2335 /* eslint-disable */
2336
2337 // These values are established by empiricism with tests (tradeoff: performance VS precision)
2338 var NEWTON_ITERATIONS = 4;
2339 var NEWTON_MIN_SLOPE = 0.001;
2340 var SUBDIVISION_PRECISION = 0.0000001;
2341 var SUBDIVISION_MAX_ITERATIONS = 10;
2342
2343 var kSplineTableSize = 11;
2344 var kSampleStepSize = 1.0 / (kSplineTableSize - 1.0);
2345
2346 var float32ArraySupported = typeof Float32Array === 'function';
2347
2348 function A (aA1, aA2) { return 1.0 - 3.0 * aA2 + 3.0 * aA1; }
2349 function B (aA1, aA2) { return 3.0 * aA2 - 6.0 * aA1; }
2350 function C (aA1) { return 3.0 * aA1; }
2351
2352 // Returns x(t) given t, x1, and x2, or y(t) given t, y1, and y2.
2353 function calcBezier (aT, aA1, aA2) { return ((A(aA1, aA2) * aT + B(aA1, aA2)) * aT + C(aA1)) * aT; }
2354
2355 // Returns dx/dt given t, x1, and x2, or dy/dt given t, y1, and y2.
2356 function getSlope (aT, aA1, aA2) { return 3.0 * A(aA1, aA2) * aT * aT + 2.0 * B(aA1, aA2) * aT + C(aA1); }
2357
2358 function binarySubdivide (aX, aA, aB, mX1, mX2) {
2359 var currentX, currentT, i = 0;
2360 do {
2361 currentT = aA + (aB - aA) / 2.0;
2362 currentX = calcBezier(currentT, mX1, mX2) - aX;
2363 if (currentX > 0.0) {
2364 aB = currentT;
2365 } else {
2366 aA = currentT;
2367 }
2368 } while (Math.abs(currentX) > SUBDIVISION_PRECISION && ++i < SUBDIVISION_MAX_ITERATIONS);
2369 return currentT;
2370 }
2371
2372 function newtonRaphsonIterate (aX, aGuessT, mX1, mX2) {
2373 for (var i = 0; i < NEWTON_ITERATIONS; ++i) {
2374 var currentSlope = getSlope(aGuessT, mX1, mX2);
2375 if (currentSlope === 0.0) {
2376 return aGuessT;
2377 }
2378 var currentX = calcBezier(aGuessT, mX1, mX2) - aX;
2379 aGuessT -= currentX / currentSlope;
2380 }
2381 return aGuessT;
2382 }
2383
2384 function bezier (mX1, mY1, mX2, mY2) {
2385 if (!(0 <= mX1 && mX1 <= 1 && 0 <= mX2 && mX2 <= 1)) {
2386 throw new Error('bezier x values must be in [0, 1] range');
2387 }
2388
2389 // Precompute samples table
2390 var sampleValues = float32ArraySupported ? new Float32Array(kSplineTableSize) : new Array(kSplineTableSize);
2391 if (mX1 !== mY1 || mX2 !== mY2) {
2392 for (var i = 0; i < kSplineTableSize; ++i) {
2393 sampleValues[i] = calcBezier(i * kSampleStepSize, mX1, mX2);
2394 }
2395 }
2396
2397 function getTForX (aX) {
2398 var intervalStart = 0.0;
2399 var currentSample = 1;
2400 var lastSample = kSplineTableSize - 1;
2401
2402 for (; currentSample !== lastSample && sampleValues[currentSample] <= aX; ++currentSample) {
2403 intervalStart += kSampleStepSize;
2404 }
2405 --currentSample;
2406
2407 // Interpolate to provide an initial guess for t
2408 var dist = (aX - sampleValues[currentSample]) / (sampleValues[currentSample + 1] - sampleValues[currentSample]);
2409 var guessForT = intervalStart + dist * kSampleStepSize;
2410
2411 var initialSlope = getSlope(guessForT, mX1, mX2);
2412 if (initialSlope >= NEWTON_MIN_SLOPE) {
2413 return newtonRaphsonIterate(aX, guessForT, mX1, mX2);
2414 } else if (initialSlope === 0.0) {
2415 return guessForT;
2416 } else {
2417 return binarySubdivide(aX, intervalStart, intervalStart + kSampleStepSize, mX1, mX2);
2418 }
2419 }
2420
2421 return function BezierEasing (x) {
2422 if (mX1 === mY1 && mX2 === mY2) {
2423 return x; // linear
2424 }
2425 // Because JavaScript number are imprecise, we should guarantee the extremes are right.
2426 if (x === 0) {
2427 return 0;
2428 }
2429 if (x === 1) {
2430 return 1;
2431 }
2432 return calcBezier(getTForX(x), mY1, mY2);
2433 };
2434 }
2435
2436 /* eslint no-control-regex: "off" */
2437
2438 // Remove Diacritics
2439 var defaultDiacriticsRemovalap = [
2440 { 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' },
2441 { base: 'AA', letters: '\uA732' },
2442 { base: 'AE', letters: '\u00C6\u01FC\u01E2' },
2443 { base: 'AO', letters: '\uA734' },
2444 { base: 'AU', letters: '\uA736' },
2445 { base: 'AV', letters: '\uA738\uA73A' },
2446 { base: 'AY', letters: '\uA73C' },
2447 { base: 'B', letters: '\u0042\u24B7\uFF22\u1E02\u1E04\u1E06\u0243\u0182\u0181' },
2448 { base: 'C', letters: '\u0043\u24B8\uFF23\u0106\u0108\u010A\u010C\u00C7\u1E08\u0187\u023B\uA73E' },
2449 { base: 'D', letters: '\u0044\u24B9\uFF24\u1E0A\u010E\u1E0C\u1E10\u1E12\u1E0E\u0110\u018B\u018A\u0189\uA779' },
2450 { base: 'DZ', letters: '\u01F1\u01C4' },
2451 { base: 'Dz', letters: '\u01F2\u01C5' },
2452 { 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' },
2453 { base: 'F', letters: '\u0046\u24BB\uFF26\u1E1E\u0191\uA77B' },
2454 { base: 'G', letters: '\u0047\u24BC\uFF27\u01F4\u011C\u1E20\u011E\u0120\u01E6\u0122\u01E4\u0193\uA7A0\uA77D\uA77E' },
2455 { base: 'H', letters: '\u0048\u24BD\uFF28\u0124\u1E22\u1E26\u021E\u1E24\u1E28\u1E2A\u0126\u2C67\u2C75\uA78D' },
2456 { base: 'I', letters: '\u0049\u24BE\uFF29\u00CC\u00CD\u00CE\u0128\u012A\u012C\u0130\u00CF\u1E2E\u1EC8\u01CF\u0208\u020A\u1ECA\u012E\u1E2C\u0197' },
2457 { base: 'J', letters: '\u004A\u24BF\uFF2A\u0134\u0248' },
2458 { base: 'K', letters: '\u004B\u24C0\uFF2B\u1E30\u01E8\u1E32\u0136\u1E34\u0198\u2C69\uA740\uA742\uA744\uA7A2' },
2459 { base: 'L', letters: '\u004C\u24C1\uFF2C\u013F\u0139\u013D\u1E36\u1E38\u013B\u1E3C\u1E3A\u0141\u023D\u2C62\u2C60\uA748\uA746\uA780' },
2460 { base: 'LJ', letters: '\u01C7' },
2461 { base: 'Lj', letters: '\u01C8' },
2462 { base: 'M', letters: '\u004D\u24C2\uFF2D\u1E3E\u1E40\u1E42\u2C6E\u019C' },
2463 { base: 'N', letters: '\u004E\u24C3\uFF2E\u01F8\u0143\u00D1\u1E44\u0147\u1E46\u0145\u1E4A\u1E48\u0220\u019D\uA790\uA7A4' },
2464 { base: 'NJ', letters: '\u01CA' },
2465 { base: 'Nj', letters: '\u01CB' },
2466 { 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' },
2467 { base: 'OI', letters: '\u01A2' },
2468 { base: 'OO', letters: '\uA74E' },
2469 { base: 'OU', letters: '\u0222' },
2470 { base: 'OE', letters: '\u008C\u0152' },
2471 { base: 'oe', letters: '\u009C\u0153' },
2472 { base: 'P', letters: '\u0050\u24C5\uFF30\u1E54\u1E56\u01A4\u2C63\uA750\uA752\uA754' },
2473 { base: 'Q', letters: '\u0051\u24C6\uFF31\uA756\uA758\u024A' },
2474 { base: 'R', letters: '\u0052\u24C7\uFF32\u0154\u1E58\u0158\u0210\u0212\u1E5A\u1E5C\u0156\u1E5E\u024C\u2C64\uA75A\uA7A6\uA782' },
2475 { base: 'S', letters: '\u0053\u24C8\uFF33\u1E9E\u015A\u1E64\u015C\u1E60\u0160\u1E66\u1E62\u1E68\u0218\u015E\u2C7E\uA7A8\uA784' },
2476 { base: 'T', letters: '\u0054\u24C9\uFF34\u1E6A\u0164\u1E6C\u021A\u0162\u1E70\u1E6E\u0166\u01AC\u01AE\u023E\uA786' },
2477 { base: 'TZ', letters: '\uA728' },
2478 { 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' },
2479 { base: 'V', letters: '\u0056\u24CB\uFF36\u1E7C\u1E7E\u01B2\uA75E\u0245' },
2480 { base: 'VY', letters: '\uA760' },
2481 { base: 'W', letters: '\u0057\u24CC\uFF37\u1E80\u1E82\u0174\u1E86\u1E84\u1E88\u2C72' },
2482 { base: 'X', letters: '\u0058\u24CD\uFF38\u1E8A\u1E8C' },
2483 { base: 'Y', letters: '\u0059\u24CE\uFF39\u1EF2\u00DD\u0176\u1EF8\u0232\u1E8E\u0178\u1EF6\u1EF4\u01B3\u024E\u1EFE' },
2484 { base: 'Z', letters: '\u005A\u24CF\uFF3A\u0179\u1E90\u017B\u017D\u1E92\u1E94\u01B5\u0224\u2C7F\u2C6B\uA762' },
2485 { 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' },
2486 { base: 'aa', letters: '\uA733' },
2487 { base: 'ae', letters: '\u00E6\u01FD\u01E3' },
2488 { base: 'ao', letters: '\uA735' },
2489 { base: 'au', letters: '\uA737' },
2490 { base: 'av', letters: '\uA739\uA73B' },
2491 { base: 'ay', letters: '\uA73D' },
2492 { base: 'b', letters: '\u0062\u24D1\uFF42\u1E03\u1E05\u1E07\u0180\u0183\u0253' },
2493 { base: 'c', letters: '\u0063\u24D2\uFF43\u0107\u0109\u010B\u010D\u00E7\u1E09\u0188\u023C\uA73F\u2184' },
2494 { base: 'd', letters: '\u0064\u24D3\uFF44\u1E0B\u010F\u1E0D\u1E11\u1E13\u1E0F\u0111\u018C\u0256\u0257\uA77A' },
2495 { base: 'dz', letters: '\u01F3\u01C6' },
2496 { 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' },
2497 { base: 'f', letters: '\u0066\u24D5\uFF46\u1E1F\u0192\uA77C' },
2498 { base: 'g', letters: '\u0067\u24D6\uFF47\u01F5\u011D\u1E21\u011F\u0121\u01E7\u0123\u01E5\u0260\uA7A1\u1D79\uA77F' },
2499 { base: 'h', letters: '\u0068\u24D7\uFF48\u0125\u1E23\u1E27\u021F\u1E25\u1E29\u1E2B\u1E96\u0127\u2C68\u2C76\u0265' },
2500 { base: 'hv', letters: '\u0195' },
2501 { base: 'i', letters: '\u0069\u24D8\uFF49\u00EC\u00ED\u00EE\u0129\u012B\u012D\u00EF\u1E2F\u1EC9\u01D0\u0209\u020B\u1ECB\u012F\u1E2D\u0268\u0131' },
2502 { base: 'j', letters: '\u006A\u24D9\uFF4A\u0135\u01F0\u0249' },
2503 { base: 'k', letters: '\u006B\u24DA\uFF4B\u1E31\u01E9\u1E33\u0137\u1E35\u0199\u2C6A\uA741\uA743\uA745\uA7A3' },
2504 { base: 'l', letters: '\u006C\u24DB\uFF4C\u0140\u013A\u013E\u1E37\u1E39\u013C\u1E3D\u1E3B\u017F\u0142\u019A\u026B\u2C61\uA749\uA781\uA747' },
2505 { base: 'lj', letters: '\u01C9' },
2506 { base: 'm', letters: '\u006D\u24DC\uFF4D\u1E3F\u1E41\u1E43\u0271\u026F' },
2507 { base: 'n', letters: '\u006E\u24DD\uFF4E\u01F9\u0144\u00F1\u1E45\u0148\u1E47\u0146\u1E4B\u1E49\u019E\u0272\u0149\uA791\uA7A5' },
2508 { base: 'nj', letters: '\u01CC' },
2509 { 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' },
2510 { base: 'oi', letters: '\u01A3' },
2511 { base: 'ou', letters: '\u0223' },
2512 { base: 'oo', letters: '\uA74F' },
2513 { base: 'p', letters: '\u0070\u24DF\uFF50\u1E55\u1E57\u01A5\u1D7D\uA751\uA753\uA755' },
2514 { base: 'q', letters: '\u0071\u24E0\uFF51\u024B\uA757\uA759' },
2515 { base: 'r', letters: '\u0072\u24E1\uFF52\u0155\u1E59\u0159\u0211\u0213\u1E5B\u1E5D\u0157\u1E5F\u024D\u027D\uA75B\uA7A7\uA783' },
2516 { base: 's', letters: '\u0073\u24E2\uFF53\u00DF\u015B\u1E65\u015D\u1E61\u0161\u1E67\u1E63\u1E69\u0219\u015F\u023F\uA7A9\uA785\u1E9B' },
2517 { base: 't', letters: '\u0074\u24E3\uFF54\u1E6B\u1E97\u0165\u1E6D\u021B\u0163\u1E71\u1E6F\u0167\u01AD\u0288\u2C66\uA787' },
2518 { base: 'tz', letters: '\uA729' },
2519 { 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' },
2520 { base: 'v', letters: '\u0076\u24E5\uFF56\u1E7D\u1E7F\u028B\uA75F\u028C' },
2521 { base: 'vy', letters: '\uA761' },
2522 { base: 'w', letters: '\u0077\u24E6\uFF57\u1E81\u1E83\u0175\u1E87\u1E85\u1E98\u1E89\u2C73' },
2523 { base: 'x', letters: '\u0078\u24E7\uFF58\u1E8B\u1E8D' },
2524 { base: 'y', letters: '\u0079\u24E8\uFF59\u1EF3\u00FD\u0177\u1EF9\u0233\u1E8F\u00FF\u1EF7\u1E99\u1EF5\u01B4\u024F\u1EFF' },
2525 { base: 'z', letters: '\u007A\u24E9\uFF5A\u017A\u1E91\u017C\u017E\u1E93\u1E95\u01B6\u0225\u0240\u2C6C\uA763' } ];
2526
2527 var diacriticsMap = {};
2528 for (var i = 0; i < defaultDiacriticsRemovalap.length; i += 1) {
2529 var letters = defaultDiacriticsRemovalap[i].letters;
2530 for (var j = 0; j < letters.length; j += 1) {
2531 diacriticsMap[letters[j]] = defaultDiacriticsRemovalap[i].base;
2532 }
2533 }
2534
2535 var uniqueNumber = 1;
2536
2537 var Utils = {
2538 uniqueNumber: function uniqueNumber$1() {
2539 uniqueNumber += 1;
2540 return uniqueNumber;
2541 },
2542 id: function id(mask, map) {
2543 if ( mask === void 0 ) mask = 'xxxxxxxxxx';
2544 if ( map === void 0 ) map = '0123456789abcdef';
2545
2546 var length = map.length;
2547 return mask.replace(/x/g, function () { return map[Math.floor((Math.random() * length))]; });
2548 },
2549 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(),
5d51ea26
DC
2550 iosPreloaderContent: ("\n <span class=\"preloader-inner\">\n " + ([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11].map(function () { return '<span class="preloader-inner-line"></span>'; }).join('')) + "\n </span>\n ").trim(),
2551 auroraPreloaderContent: "\n <span class=\"preloader-inner\">\n <span class=\"preloader-inner-circle\"></span>\n </span>\n ",
5309fbda
DC
2552 eventNameToColonCase: function eventNameToColonCase(eventName) {
2553 var hasColon;
2554 return eventName.split('').map(function (char, index) {
2555 if (char.match(/[A-Z]/) && index !== 0 && !hasColon) {
2556 hasColon = true;
2557 return (":" + (char.toLowerCase()));
2558 }
2559 return char.toLowerCase();
2560 }).join('');
2561 },
2562 deleteProps: function deleteProps(obj) {
2563 var object = obj;
2564 Object.keys(object).forEach(function (key) {
2565 try {
2566 object[key] = null;
2567 } catch (e) {
2568 // no setter for object
2569 }
2570 try {
2571 delete object[key];
2572 } catch (e) {
2573 // something got wrong
2574 }
2575 });
2576 },
2577 bezier: function bezier$1() {
2578 var args = [], len = arguments.length;
2579 while ( len-- ) args[ len ] = arguments[ len ];
2580
2581 return bezier.apply(void 0, args);
2582 },
2583 nextTick: function nextTick(callback, delay) {
2584 if ( delay === void 0 ) delay = 0;
2585
2586 return setTimeout(callback, delay);
2587 },
2588 nextFrame: function nextFrame(callback) {
2589 return Utils.requestAnimationFrame(function () {
2590 Utils.requestAnimationFrame(callback);
2591 });
2592 },
2593 now: function now() {
2594 return Date.now();
2595 },
2596 requestAnimationFrame: function requestAnimationFrame(callback) {
2597 return win.requestAnimationFrame(callback);
2598 },
2599 cancelAnimationFrame: function cancelAnimationFrame(id) {
2600 return win.cancelAnimationFrame(id);
2601 },
2602 removeDiacritics: function removeDiacritics(str) {
2603 return str.replace(/[^\u0000-\u007E]/g, function (a) { return diacriticsMap[a] || a; });
2604 },
2605 parseUrlQuery: function parseUrlQuery(url) {
2606 var query = {};
2607 var urlToParse = url || win.location.href;
2608 var i;
2609 var params;
2610 var param;
2611 var length;
2612 if (typeof urlToParse === 'string' && urlToParse.length) {
2613 urlToParse = urlToParse.indexOf('?') > -1 ? urlToParse.replace(/\S*\?/, '') : '';
2614 params = urlToParse.split('&').filter(function (paramsPart) { return paramsPart !== ''; });
2615 length = params.length;
2616
2617 for (i = 0; i < length; i += 1) {
2618 param = params[i].replace(/#\S+/g, '').split('=');
2619 query[decodeURIComponent(param[0])] = typeof param[1] === 'undefined' ? undefined : decodeURIComponent(param.slice(1).join('=')) || '';
2620 }
2621 }
2622 return query;
2623 },
2624 getTranslate: function getTranslate(el, axis) {
2625 if ( axis === void 0 ) axis = 'x';
2626
2627 var matrix;
2628 var curTransform;
2629 var transformMatrix;
2630
2631 var curStyle = win.getComputedStyle(el, null);
2632
2633 if (win.WebKitCSSMatrix) {
2634 curTransform = curStyle.transform || curStyle.webkitTransform;
2635 if (curTransform.split(',').length > 6) {
2636 curTransform = curTransform.split(', ').map(function (a) { return a.replace(',', '.'); }).join(', ');
2637 }
2638 // Some old versions of Webkit choke when 'none' is passed; pass
2639 // empty string instead in this case
2640 transformMatrix = new win.WebKitCSSMatrix(curTransform === 'none' ? '' : curTransform);
2641 } else {
2642 transformMatrix = curStyle.MozTransform || curStyle.OTransform || curStyle.MsTransform || curStyle.msTransform || curStyle.transform || curStyle.getPropertyValue('transform').replace('translate(', 'matrix(1, 0, 0, 1,');
2643 matrix = transformMatrix.toString().split(',');
2644 }
2645
2646 if (axis === 'x') {
2647 // Latest Chrome and webkits Fix
2648 if (win.WebKitCSSMatrix) { curTransform = transformMatrix.m41; }
2649 // Crazy IE10 Matrix
2650 else if (matrix.length === 16) { curTransform = parseFloat(matrix[12]); }
2651 // Normal Browsers
2652 else { curTransform = parseFloat(matrix[4]); }
2653 }
2654 if (axis === 'y') {
2655 // Latest Chrome and webkits Fix
2656 if (win.WebKitCSSMatrix) { curTransform = transformMatrix.m42; }
2657 // Crazy IE10 Matrix
2658 else if (matrix.length === 16) { curTransform = parseFloat(matrix[13]); }
2659 // Normal Browsers
2660 else { curTransform = parseFloat(matrix[5]); }
2661 }
2662 return curTransform || 0;
2663 },
2664 serializeObject: function serializeObject(obj, parents) {
2665 if ( parents === void 0 ) parents = [];
2666
2667 if (typeof obj === 'string') { return obj; }
2668 var resultArray = [];
2669 var separator = '&';
2670 var newParents;
2671 function varName(name) {
2672 if (parents.length > 0) {
2673 var parentParts = '';
2674 for (var j = 0; j < parents.length; j += 1) {
2675 if (j === 0) { parentParts += parents[j]; }
2676 else { parentParts += "[" + (encodeURIComponent(parents[j])) + "]"; }
2677 }
2678 return (parentParts + "[" + (encodeURIComponent(name)) + "]");
2679 }
2680 return encodeURIComponent(name);
2681 }
2682 function varValue(value) {
2683 return encodeURIComponent(value);
2684 }
2685 Object.keys(obj).forEach(function (prop) {
2686 var toPush;
2687 if (Array.isArray(obj[prop])) {
2688 toPush = [];
2689 for (var i = 0; i < obj[prop].length; i += 1) {
2690 if (!Array.isArray(obj[prop][i]) && typeof obj[prop][i] === 'object') {
2691 newParents = parents.slice();
2692 newParents.push(prop);
2693 newParents.push(String(i));
2694 toPush.push(Utils.serializeObject(obj[prop][i], newParents));
2695 } else {
2696 toPush.push(((varName(prop)) + "[]=" + (varValue(obj[prop][i]))));
2697 }
2698 }
2699 if (toPush.length > 0) { resultArray.push(toPush.join(separator)); }
2700 } else if (obj[prop] === null || obj[prop] === '') {
2701 resultArray.push(((varName(prop)) + "="));
2702 } else if (typeof obj[prop] === 'object') {
2703 // Object, convert to named array
2704 newParents = parents.slice();
2705 newParents.push(prop);
2706 toPush = Utils.serializeObject(obj[prop], newParents);
2707 if (toPush !== '') { resultArray.push(toPush); }
2708 } else if (typeof obj[prop] !== 'undefined' && obj[prop] !== '') {
2709 // Should be string or plain value
2710 resultArray.push(((varName(prop)) + "=" + (varValue(obj[prop]))));
2711 } else if (obj[prop] === '') { resultArray.push(varName(prop)); }
2712 });
2713 return resultArray.join(separator);
2714 },
2715 isObject: function isObject(o) {
2716 return typeof o === 'object' && o !== null && o.constructor && o.constructor === Object;
2717 },
2718 merge: function merge() {
2719 var args = [], len$1 = arguments.length;
2720 while ( len$1-- ) args[ len$1 ] = arguments[ len$1 ];
2721
2722 var to = args[0];
2723 args.splice(0, 1);
2724 var from = args;
2725
2726 for (var i = 0; i < from.length; i += 1) {
2727 var nextSource = args[i];
2728 if (nextSource !== undefined && nextSource !== null) {
2729 var keysArray = Object.keys(Object(nextSource));
2730 for (var nextIndex = 0, len = keysArray.length; nextIndex < len; nextIndex += 1) {
2731 var nextKey = keysArray[nextIndex];
2732 var desc = Object.getOwnPropertyDescriptor(nextSource, nextKey);
2733 if (desc !== undefined && desc.enumerable) {
2734 to[nextKey] = nextSource[nextKey];
2735 }
2736 }
2737 }
2738 }
2739 return to;
2740 },
2741 extend: function extend() {
2742 var args = [], len$1 = arguments.length;
2743 while ( len$1-- ) args[ len$1 ] = arguments[ len$1 ];
2744
2745 var deep = true;
2746 var to;
2747 var from;
2748 if (typeof args[0] === 'boolean') {
2749 deep = args[0];
2750 to = args[1];
2751 args.splice(0, 2);
2752 from = args;
2753 } else {
2754 to = args[0];
2755 args.splice(0, 1);
2756 from = args;
2757 }
2758 for (var i = 0; i < from.length; i += 1) {
2759 var nextSource = args[i];
2760 if (nextSource !== undefined && nextSource !== null) {
2761 var keysArray = Object.keys(Object(nextSource));
2762 for (var nextIndex = 0, len = keysArray.length; nextIndex < len; nextIndex += 1) {
2763 var nextKey = keysArray[nextIndex];
2764 var desc = Object.getOwnPropertyDescriptor(nextSource, nextKey);
2765 if (desc !== undefined && desc.enumerable) {
2766 if (!deep) {
2767 to[nextKey] = nextSource[nextKey];
2768 } else if (Utils.isObject(to[nextKey]) && Utils.isObject(nextSource[nextKey])) {
2769 Utils.extend(to[nextKey], nextSource[nextKey]);
2770 } else if (!Utils.isObject(to[nextKey]) && Utils.isObject(nextSource[nextKey])) {
2771 to[nextKey] = {};
2772 Utils.extend(to[nextKey], nextSource[nextKey]);
2773 } else {
2774 to[nextKey] = nextSource[nextKey];
2775 }
2776 }
2777 }
2778 }
2779 }
2780 return to;
2781 },
2782 colorHexToRgb: function colorHexToRgb(hex) {
2783 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; });
2784 var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(h);
2785 return result
2786 ? result.slice(1).map(function (n) { return parseInt(n, 16); })
2787 : null;
2788 },
2789 colorRgbToHex: function colorRgbToHex(r, g, b) {
2790 var result = [r, g, b].map(function (n) {
2791 var hex = n.toString(16);
2792 return hex.length === 1 ? ("0" + hex) : hex;
2793 }).join('');
2794 return ("#" + result);
2795 },
2796 colorRgbToHsl: function colorRgbToHsl(r, g, b) {
2797 r /= 255; // eslint-disable-line
2798 g /= 255; // eslint-disable-line
2799 b /= 255; // eslint-disable-line
2800 var max = Math.max(r, g, b);
2801 var min = Math.min(r, g, b);
2802 var d = max - min;
2803 var h;
2804 if (d === 0) { h = 0; }
2805 else if (max === r) { h = ((g - b) / d) % 6; }
2806 else if (max === g) { h = (b - r) / d + 2; }
2807 else if (max === b) { h = (r - g) / d + 4; }
2808 var l = (min + max) / 2;
2809 var s = d === 0 ? 0 : d / (1 - Math.abs(2 * l - 1));
5d51ea26 2810 if (h < 0) { h = 360 / 60 + h; }
5309fbda
DC
2811 return [h * 60, s, l];
2812 },
2813 colorHslToRgb: function colorHslToRgb(h, s, l) {
2814 var c = (1 - Math.abs(2 * l - 1)) * s;
2815 var hp = h / 60;
2816 var x = c * (1 - Math.abs((hp % 2) - 1));
2817 var rgb1;
2818 if (Number.isNaN(h) || typeof h === 'undefined') {
2819 rgb1 = [0, 0, 0];
2820 } else if (hp <= 1) { rgb1 = [c, x, 0]; }
2821 else if (hp <= 2) { rgb1 = [x, c, 0]; }
2822 else if (hp <= 3) { rgb1 = [0, c, x]; }
2823 else if (hp <= 4) { rgb1 = [0, x, c]; }
2824 else if (hp <= 5) { rgb1 = [x, 0, c]; }
2825 else if (hp <= 6) { rgb1 = [c, 0, x]; }
2826 var m = l - (c / 2);
2827 return rgb1.map(function (n) { return Math.max(0, Math.min(255, Math.round(255 * (n + m)))); });
2828 },
5d51ea26
DC
2829 colorHsbToHsl: function colorHsbToHsl(h, s, b) {
2830 var HSL = {
2831 h: h,
2832 s: 0,
2833 l: 0,
2834 };
2835 var HSB = { h: h, s: s, b: b };
2836
2837 HSL.l = (2 - HSB.s) * HSB.b / 2;
2838 HSL.s = HSL.l && HSL.l < 1 ? HSB.s * HSB.b / (HSL.l < 0.5 ? HSL.l * 2 : 2 - HSL.l * 2) : HSL.s;
2839
2840 return [HSL.h, HSL.s, HSL.l];
2841 },
2842 colorHslToHsb: function colorHslToHsb(h, s, l) {
2843 var HSB = {
2844 h: h,
2845 s: 0,
2846 b: 0,
2847 };
2848 var HSL = { h: h, s: s, l: l };
2849
2850 var t = HSL.s * (HSL.l < 0.5 ? HSL.l : 1 - HSL.l);
2851 HSB.b = HSL.l + t;
2852 HSB.s = HSL.l > 0 ? 2 * t / HSB.b : HSB.s;
2853
2854 return [HSB.h, HSB.s, HSB.b];
2855 },
5309fbda
DC
2856 colorThemeCSSProperties: function colorThemeCSSProperties() {
2857 var args = [], len = arguments.length;
2858 while ( len-- ) args[ len ] = arguments[ len ];
2859
2860 var hex;
2861 var rgb;
2862 if (args.length === 1) {
2863 hex = args[0];
2864 rgb = Utils.colorHexToRgb(hex);
2865 } else if (args.length === 3) {
2866 rgb = args;
2867 hex = Utils.colorRgbToHex.apply(Utils, rgb);
2868 }
2869 if (!rgb) { return {}; }
2870 var hsl = Utils.colorRgbToHsl.apply(Utils, rgb);
2871 var hslShade = [hsl[0], hsl[1], Math.max(0, (hsl[2] - 0.08))];
2872 var hslTint = [hsl[0], hsl[1], Math.max(0, (hsl[2] + 0.08))];
2873 var shade = Utils.colorRgbToHex.apply(Utils, Utils.colorHslToRgb.apply(Utils, hslShade));
2874 var tint = Utils.colorRgbToHex.apply(Utils, Utils.colorHslToRgb.apply(Utils, hslTint));
2875 return {
2876 '--f7-theme-color': hex,
2877 '--f7-theme-color-rgb': rgb.join(', '),
2878 '--f7-theme-color-shade': shade,
2879 '--f7-theme-color-tint': tint,
2880 };
2881 },
2882 };
2883
5d51ea26
DC
2884 var Support = (function Support() {
2885 var testDiv = doc.createElement('div');
2886
2887 return {
2888 touch: (function checkTouch() {
2889 return !!((win.navigator.maxTouchPoints > 0) || ('ontouchstart' in win) || (win.DocumentTouch && doc instanceof win.DocumentTouch));
2890 }()),
2891
2892 pointerEvents: !!(win.navigator.pointerEnabled || win.PointerEvent || ('maxTouchPoints' in win.navigator && win.navigator.maxTouchPoints > 0)),
2893 prefixedPointerEvents: !!win.navigator.msPointerEnabled,
2894
2895 transition: (function checkTransition() {
2896 var style = testDiv.style;
2897 return ('transition' in style || 'webkitTransition' in style || 'MozTransition' in style);
2898 }()),
2899 transforms3d: (win.Modernizr && win.Modernizr.csstransforms3d === true) || (function checkTransforms3d() {
2900 var style = testDiv.style;
2901 return ('webkitPerspective' in style || 'MozPerspective' in style || 'OPerspective' in style || 'MsPerspective' in style || 'perspective' in style);
2902 }()),
2903
2904 flexbox: (function checkFlexbox() {
2905 var div = doc.createElement('div').style;
2906 var styles = ('alignItems webkitAlignItems webkitBoxAlign msFlexAlign mozBoxAlign webkitFlexDirection msFlexDirection mozBoxDirection mozBoxOrient webkitBoxDirection webkitBoxOrient').split(' ');
2907 for (var i = 0; i < styles.length; i += 1) {
2908 if (styles[i] in div) { return true; }
2909 }
2910 return false;
2911 }()),
2912
2913 observer: (function checkObserver() {
2914 return ('MutationObserver' in win || 'WebkitMutationObserver' in win);
2915 }()),
2916
2917 passiveListener: (function checkPassiveListener() {
2918 var supportsPassive = false;
2919 try {
2920 var opts = Object.defineProperty({}, 'passive', {
2921 // eslint-disable-next-line
2922 get: function get() {
2923 supportsPassive = true;
2924 },
2925 });
2926 win.addEventListener('testPassiveListener', null, opts);
2927 } catch (e) {
2928 // No support
2929 }
2930 return supportsPassive;
2931 }()),
2932
2933 gestures: (function checkGestures() {
2934 return 'ongesturestart' in win;
2935 }()),
2936
2937 intersectionObserver: (function checkObserver() {
2938 return ('IntersectionObserver' in win);
2939 }()),
2940 };
2941 }());
2942
5309fbda
DC
2943 var Device = (function Device() {
2944 var platform = win.navigator.platform;
2945 var ua = win.navigator.userAgent;
2946
2947 var device = {
2948 ios: false,
2949 android: false,
2950 androidChrome: false,
2951 desktop: false,
2952 windowsPhone: false,
2953 iphone: false,
2954 iphoneX: false,
2955 ipod: false,
2956 ipad: false,
2957 edge: false,
2958 ie: false,
2959 firefox: false,
2960 macos: false,
2961 windows: false,
2962 cordova: !!(win.cordova || win.phonegap),
2963 phonegap: !!(win.cordova || win.phonegap),
5d51ea26 2964 electron: false,
5309fbda
DC
2965 };
2966
2967 var screenWidth = win.screen.width;
2968 var screenHeight = win.screen.height;
2969
2970 var windowsPhone = ua.match(/(Windows Phone);?[\s\/]+([\d.]+)?/); // eslint-disable-line
2971 var android = ua.match(/(Android);?[\s\/]+([\d.]+)?/); // eslint-disable-line
2972 var ipad = ua.match(/(iPad).*OS\s([\d_]+)/);
2973 var ipod = ua.match(/(iPod)(.*OS\s([\d_]+))?/);
2974 var iphone = !ipad && ua.match(/(iPhone\sOS|iOS)\s([\d_]+)/);
2975 var iphoneX = iphone && (
2976 (screenWidth === 375 && screenHeight === 812) // X/XS
2977 || (screenWidth === 414 && screenHeight === 896) // XR / XS Max
2978 );
2979 var ie = ua.indexOf('MSIE ') >= 0 || ua.indexOf('Trident/') >= 0;
2980 var edge = ua.indexOf('Edge/') >= 0;
2981 var firefox = ua.indexOf('Gecko/') >= 0 && ua.indexOf('Firefox/') >= 0;
5309fbda 2982 var windows = platform === 'Win32';
5d51ea26
DC
2983 var electron = ua.toLowerCase().indexOf('electron') >= 0;
2984 var macos = platform === 'MacIntel';
2985
2986 // iPadOs 13 fix
2987 if (!ipad
2988 && macos
2989 && Support.touch
2990 && (
2991 (screenWidth === 1024 && screenHeight === 1366) // Pro 12.9
2992 || (screenWidth === 834 && screenHeight === 1194) // Pro 11
2993 || (screenWidth === 834 && screenHeight === 1112) // Pro 10.5
2994 || (screenWidth === 768 && screenHeight === 1024) // other
2995 )
2996 ) {
2997 ipad = ua.match(/(Version)\/([\d.]+)/);
2998 macos = false;
2999 }
5309fbda
DC
3000
3001 device.ie = ie;
3002 device.edge = edge;
3003 device.firefox = firefox;
3004
3005 // Windows
3006 if (windowsPhone) {
5d51ea26 3007 device.os = 'windowsPhone';
5309fbda
DC
3008 device.osVersion = windowsPhone[2];
3009 device.windowsPhone = true;
3010 }
3011 // Android
3012 if (android && !windows) {
3013 device.os = 'android';
3014 device.osVersion = android[2];
3015 device.android = true;
3016 device.androidChrome = ua.toLowerCase().indexOf('chrome') >= 0;
3017 }
3018 if (ipad || iphone || ipod) {
3019 device.os = 'ios';
3020 device.ios = true;
3021 }
3022 // iOS
3023 if (iphone && !ipod) {
3024 device.osVersion = iphone[2].replace(/_/g, '.');
3025 device.iphone = true;
3026 device.iphoneX = iphoneX;
3027 }
3028 if (ipad) {
3029 device.osVersion = ipad[2].replace(/_/g, '.');
3030 device.ipad = true;
3031 }
3032 if (ipod) {
3033 device.osVersion = ipod[3] ? ipod[3].replace(/_/g, '.') : null;
5d51ea26 3034 device.ipod = true;
5309fbda
DC
3035 }
3036 // iOS 8+ changed UA
3037 if (device.ios && device.osVersion && ua.indexOf('Version/') >= 0) {
3038 if (device.osVersion.split('.')[0] === '10') {
3039 device.osVersion = ua.toLowerCase().split('version/')[1].split(' ')[0];
3040 }
3041 }
3042
3043 // Webview
3044 device.webView = !!((iphone || ipad || ipod) && (ua.match(/.*AppleWebKit(?!.*Safari)/i) || win.navigator.standalone))
3045 || (win.matchMedia && win.matchMedia('(display-mode: standalone)').matches);
3046 device.webview = device.webView;
3047 device.standalone = device.webView;
3048
3049 // Desktop
5d51ea26 3050 device.desktop = !(device.ios || device.android || device.windowsPhone) || electron;
5309fbda 3051 if (device.desktop) {
5d51ea26 3052 device.electron = electron;
5309fbda
DC
3053 device.macos = macos;
3054 device.windows = windows;
3055 }
3056
5309fbda
DC
3057 // Meta statusbar
3058 var metaStatusbar = doc.querySelector('meta[name="apple-mobile-web-app-status-bar-style"]');
3059
3060 // Check for status bar and fullscreen app mode
3061 device.needsStatusbarOverlay = function needsStatusbarOverlay() {
5d51ea26 3062 if (device.desktop) { return false; }
5309fbda
DC
3063 if (device.standalone && device.ios && metaStatusbar && metaStatusbar.content === 'black-translucent') {
3064 return true;
3065 }
3066 if ((device.webView || (device.android && device.cordova)) && (win.innerWidth * win.innerHeight === win.screen.width * win.screen.height)) {
3067 if (device.iphoneX && (win.orientation === 90 || win.orientation === -90)) {
3068 return false;
3069 }
3070 return true;
3071 }
3072 return false;
3073 };
3074 device.statusbar = device.needsStatusbarOverlay();
3075
3076 // Pixel Ratio
3077 device.pixelRatio = win.devicePixelRatio || 1;
3078
5d51ea26
DC
3079 // Color Scheme
3080 var DARK = '(prefers-color-scheme: dark)';
3081 var LIGHT = '(prefers-color-scheme: light)';
3082 device.prefersColorScheme = function prefersColorTheme() {
3083 var theme;
3084 if (win.matchMedia && win.matchMedia(LIGHT).matches) {
3085 theme = 'light';
3086 }
3087 if (win.matchMedia && win.matchMedia(DARK).matches) {
3088 theme = 'dark';
3089 }
3090 return theme;
3091 };
3092
5309fbda
DC
3093 // Export object
3094 return device;
3095 }());
3096
3097 var EventsClass = function EventsClass(parents) {
3098 if ( parents === void 0 ) parents = [];
3099
3100 var self = this;
3101 self.eventsParents = parents;
3102 self.eventsListeners = {};
3103 };
3104
3105 EventsClass.prototype.on = function on (events, handler, priority) {
3106 var self = this;
3107 if (typeof handler !== 'function') { return self; }
3108 var method = priority ? 'unshift' : 'push';
3109 events.split(' ').forEach(function (event) {
3110 if (!self.eventsListeners[event]) { self.eventsListeners[event] = []; }
3111 self.eventsListeners[event][method](handler);
3112 });
3113 return self;
3114 };
3115
3116 EventsClass.prototype.once = function once (events, handler, priority) {
3117 var self = this;
3118 if (typeof handler !== 'function') { return self; }
3119 function onceHandler() {
3120 var args = [], len = arguments.length;
3121 while ( len-- ) args[ len ] = arguments[ len ];
3122
3123 handler.apply(self, args);
3124 self.off(events, onceHandler);
3125 if (onceHandler.f7proxy) {
3126 delete onceHandler.f7proxy;
3127 }
3128 }
3129 onceHandler.f7proxy = handler;
3130 return self.on(events, onceHandler, priority);
3131 };
3132
3133 EventsClass.prototype.off = function off (events, handler) {
3134 var self = this;
3135 if (!self.eventsListeners) { return self; }
3136 events.split(' ').forEach(function (event) {
3137 if (typeof handler === 'undefined') {
3138 self.eventsListeners[event] = [];
3139 } else if (self.eventsListeners[event]) {
3140 self.eventsListeners[event].forEach(function (eventHandler, index) {
3141 if (eventHandler === handler || (eventHandler.f7proxy && eventHandler.f7proxy === handler)) {
3142 self.eventsListeners[event].splice(index, 1);
3143 }
3144 });
3145 }
3146 });
3147 return self;
3148 };
3149
3150 EventsClass.prototype.emit = function emit () {
3151 var args = [], len = arguments.length;
3152 while ( len-- ) args[ len ] = arguments[ len ];
3153
3154 var self = this;
3155 if (!self.eventsListeners) { return self; }
3156 var events;
3157 var data;
3158 var context;
3159 var eventsParents;
3160 if (typeof args[0] === 'string' || Array.isArray(args[0])) {
3161 events = args[0];
3162 data = args.slice(1, args.length);
3163 context = self;
3164 eventsParents = self.eventsParents;
3165 } else {
3166 events = args[0].events;
3167 data = args[0].data;
3168 context = args[0].context || self;
3169 eventsParents = args[0].local ? [] : args[0].parents || self.eventsParents;
3170 }
3171 var eventsArray = Array.isArray(events) ? events : events.split(' ');
3172 var localEvents = eventsArray.map(function (eventName) { return eventName.replace('local::', ''); });
3173 var parentEvents = eventsArray.filter(function (eventName) { return eventName.indexOf('local::') < 0; });
3174
3175 localEvents.forEach(function (event) {
3176 if (self.eventsListeners && self.eventsListeners[event]) {
3177 var handlers = [];
3178 self.eventsListeners[event].forEach(function (eventHandler) {
3179 handlers.push(eventHandler);
3180 });
3181 handlers.forEach(function (eventHandler) {
3182 eventHandler.apply(context, data);
3183 });
3184 }
3185 });
3186 if (eventsParents && eventsParents.length > 0) {
3187 eventsParents.forEach(function (eventsParent) {
3188 eventsParent.emit.apply(eventsParent, [ parentEvents ].concat( data ));
3189 });
3190 }
3191 return self;
3192 };
3193
5d51ea26 3194 var Framework7Class = /*@__PURE__*/(function (EventsClass) {
5309fbda
DC
3195 function Framework7Class(params, parents) {
3196 if ( params === void 0 ) params = {};
3197 if ( parents === void 0 ) parents = [];
3198
5d51ea26 3199 EventsClass.call(this, parents);
5309fbda
DC
3200 var self = this;
3201 self.params = params;
3202
3203 if (self.params && self.params.on) {
3204 Object.keys(self.params.on).forEach(function (eventName) {
3205 self.on(eventName, self.params.on[eventName]);
3206 });
3207 }
3208 }
3209
5d51ea26
DC
3210 if ( EventsClass ) Framework7Class.__proto__ = EventsClass;
3211 Framework7Class.prototype = Object.create( EventsClass && EventsClass.prototype );
5309fbda
DC
3212 Framework7Class.prototype.constructor = Framework7Class;
3213
3214 var staticAccessors = { components: { configurable: true } };
3215
3216 // eslint-disable-next-line
3217 Framework7Class.prototype.useModuleParams = function useModuleParams (module, instanceParams) {
3218 if (module.params) {
3219 var originalParams = {};
3220 Object.keys(module.params).forEach(function (paramKey) {
3221 if (typeof instanceParams[paramKey] === 'undefined') { return; }
3222 originalParams[paramKey] = Utils.extend({}, instanceParams[paramKey]);
3223 });
3224 Utils.extend(instanceParams, module.params);
3225 Object.keys(originalParams).forEach(function (paramKey) {
3226 Utils.extend(instanceParams[paramKey], originalParams[paramKey]);
3227 });
3228 }
3229 };
3230
3231 Framework7Class.prototype.useModulesParams = function useModulesParams (instanceParams) {
3232 var instance = this;
3233 if (!instance.modules) { return; }
3234 Object.keys(instance.modules).forEach(function (moduleName) {
3235 var module = instance.modules[moduleName];
3236 // Extend params
3237 if (module.params) {
3238 Utils.extend(instanceParams, module.params);
3239 }
3240 });
3241 };
3242
3243 Framework7Class.prototype.useModule = function useModule (moduleName, moduleParams) {
3244 if ( moduleName === void 0 ) moduleName = '';
3245 if ( moduleParams === void 0 ) moduleParams = {};
3246
3247 var instance = this;
3248 if (!instance.modules) { return; }
3249 var module = typeof moduleName === 'string' ? instance.modules[moduleName] : moduleName;
3250 if (!module) { return; }
3251
3252 // Extend instance methods and props
3253 if (module.instance) {
3254 Object.keys(module.instance).forEach(function (modulePropName) {
3255 var moduleProp = module.instance[modulePropName];
3256 if (typeof moduleProp === 'function') {
3257 instance[modulePropName] = moduleProp.bind(instance);
3258 } else {
3259 instance[modulePropName] = moduleProp;
3260 }
3261 });
3262 }
3263 // Add event listeners
3264 if (module.on && instance.on) {
3265 Object.keys(module.on).forEach(function (moduleEventName) {
3266 instance.on(moduleEventName, module.on[moduleEventName]);
3267 });
3268 }
3269 // Add vnode hooks
3270 if (module.vnode) {
3271 if (!instance.vnodeHooks) { instance.vnodeHooks = {}; }
3272 Object.keys(module.vnode).forEach(function (vnodeId) {
3273 Object.keys(module.vnode[vnodeId]).forEach(function (hookName) {
3274 var handler = module.vnode[vnodeId][hookName];
3275 if (!instance.vnodeHooks[hookName]) { instance.vnodeHooks[hookName] = {}; }
3276 if (!instance.vnodeHooks[hookName][vnodeId]) { instance.vnodeHooks[hookName][vnodeId] = []; }
3277 instance.vnodeHooks[hookName][vnodeId].push(handler.bind(instance));
3278 });
3279 });
3280 }
3281 // Module create callback
3282 if (module.create) {
3283 module.create.bind(instance)(moduleParams);
3284 }
3285 };
3286
3287 Framework7Class.prototype.useModules = function useModules (modulesParams) {
3288 if ( modulesParams === void 0 ) modulesParams = {};
3289
3290 var instance = this;
3291 if (!instance.modules) { return; }
3292 Object.keys(instance.modules).forEach(function (moduleName) {
3293 var moduleParams = modulesParams[moduleName] || {};
3294 instance.useModule(moduleName, moduleParams);
3295 });
3296 };
3297
3298 staticAccessors.components.set = function (components) {
3299 var Class = this;
3300 if (!Class.use) { return; }
3301 Class.use(components);
3302 };
3303
3304 Framework7Class.installModule = function installModule (module) {
3305 var params = [], len = arguments.length - 1;
3306 while ( len-- > 0 ) params[ len ] = arguments[ len + 1 ];
3307
3308 var Class = this;
3309 if (!Class.prototype.modules) { Class.prototype.modules = {}; }
3310 var name = module.name || (((Object.keys(Class.prototype.modules).length) + "_" + (Utils.now())));
3311 Class.prototype.modules[name] = module;
3312 // Prototype
3313 if (module.proto) {
3314 Object.keys(module.proto).forEach(function (key) {
3315 Class.prototype[key] = module.proto[key];
3316 });
3317 }
3318 // Class
3319 if (module.static) {
3320 Object.keys(module.static).forEach(function (key) {
3321 Class[key] = module.static[key];
3322 });
3323 }
3324 // Callback
3325 if (module.install) {
3326 module.install.apply(Class, params);
3327 }
3328 return Class;
3329 };
3330
3331 Framework7Class.use = function use (module) {
3332 var params = [], len = arguments.length - 1;
3333 while ( len-- > 0 ) params[ len ] = arguments[ len + 1 ];
3334
3335 var Class = this;
3336 if (Array.isArray(module)) {
3337 module.forEach(function (m) { return Class.installModule(m); });
3338 return Class;
3339 }
3340 return Class.installModule.apply(Class, [ module ].concat( params ));
3341 };
3342
3343 Object.defineProperties( Framework7Class, staticAccessors );
3344
3345 return Framework7Class;
3346 }(EventsClass));
3347
3348 function ConstructorMethods (parameters) {
3349 if ( parameters === void 0 ) parameters = {};
3350
3351 var defaultSelector = parameters.defaultSelector;
3352 var constructor = parameters.constructor;
3353 var domProp = parameters.domProp;
3354 var app = parameters.app;
3355 var addMethods = parameters.addMethods;
3356 var methods = {
3357 create: function create() {
3358 var args = [], len = arguments.length;
3359 while ( len-- ) args[ len ] = arguments[ len ];
3360
3361 if (app) { return new (Function.prototype.bind.apply( constructor, [ null ].concat( [app], args) )); }
3362 return new (Function.prototype.bind.apply( constructor, [ null ].concat( args) ));
3363 },
3364 get: function get(el) {
3365 if ( el === void 0 ) el = defaultSelector;
3366
3367 if (el instanceof constructor) { return el; }
3368 var $el = $(el);
3369 if ($el.length === 0) { return undefined; }
3370 return $el[0][domProp];
3371 },
3372 destroy: function destroy(el) {
3373 var instance = methods.get(el);
3374 if (instance && instance.destroy) { return instance.destroy(); }
3375 return undefined;
3376 },
3377 };
3378 if (addMethods && Array.isArray(addMethods)) {
3379 addMethods.forEach(function (methodName) {
3380 methods[methodName] = function (el) {
3381 if ( el === void 0 ) el = defaultSelector;
3382 var args = [], len = arguments.length - 1;
3383 while ( len-- > 0 ) args[ len ] = arguments[ len + 1 ];
3384
3385 var instance = methods.get(el);
3386 if (instance && instance[methodName]) { return instance[methodName].apply(instance, args); }
3387 return undefined;
3388 };
3389 });
3390 }
3391 return methods;
3392 }
3393
3394 function ModalMethods (parameters) {
3395 if ( parameters === void 0 ) parameters = {};
3396
3397 var defaultSelector = parameters.defaultSelector;
3398 var constructor = parameters.constructor;
3399 var app = parameters.app;
3400 var methods = Utils.extend(
3401 ConstructorMethods({
3402 defaultSelector: defaultSelector,
3403 constructor: constructor,
3404 app: app,
3405 domProp: 'f7Modal',
3406 }),
3407 {
3408 open: function open(el, animate) {
3409 var $el = $(el);
3410 var instance = $el[0].f7Modal;
3411 if (!instance) { instance = new constructor(app, { el: $el }); }
3412 return instance.open(animate);
3413 },
3414 close: function close(el, animate) {
3415 if ( el === void 0 ) el = defaultSelector;
3416
3417 var $el = $(el);
3418 if ($el.length === 0) { return undefined; }
3419 var instance = $el[0].f7Modal;
3420 if (!instance) { instance = new constructor(app, { el: $el }); }
3421 return instance.close(animate);
3422 },
3423 }
3424 );
3425 return methods;
3426 }
3427
3428 var fetchedModules = [];
3429 function loadModule(moduleToLoad) {
3430 var Framework7 = this;
3431 return new Promise(function (resolve, reject) {
3432 var app = Framework7.instance;
3433 var modulePath;
3434 var moduleObj;
3435 var moduleFunc;
3436 if (!moduleToLoad) {
3437 reject(new Error('Framework7: Lazy module must be specified'));
3438 return;
3439 }
3440
3441 function install(module) {
3442 Framework7.use(module);
3443
3444 if (app) {
3445 app.useModuleParams(module, app.params);
3446 app.useModule(module);
3447 }
3448 }
3449
3450 if (typeof moduleToLoad === 'string') {
3451 var matchNamePattern = moduleToLoad.match(/([a-z0-9-]*)/i);
3452 if (moduleToLoad.indexOf('.') < 0 && matchNamePattern && matchNamePattern[0].length === moduleToLoad.length) {
3453 if (!app || (app && !app.params.lazyModulesPath)) {
3454 reject(new Error('Framework7: "lazyModulesPath" app parameter must be specified to fetch module by name'));
3455 return;
3456 }
3457 modulePath = (app.params.lazyModulesPath) + "/" + moduleToLoad + ".js";
3458 } else {
3459 modulePath = moduleToLoad;
3460 }
3461 } else if (typeof moduleToLoad === 'function') {
3462 moduleFunc = moduleToLoad;
3463 } else {
3464 // considering F7-Plugin object
3465 moduleObj = moduleToLoad;
3466 }
3467
3468 if (moduleFunc) {
3469 var module = moduleFunc(Framework7, false);
3470 if (!module) {
3471 reject(new Error('Framework7: Can\'t find Framework7 component in specified component function'));
3472 return;
3473 }
3474 // Check if it was added
3475 if (Framework7.prototype.modules && Framework7.prototype.modules[module.name]) {
3476 resolve();
3477 return;
3478 }
3479 // Install It
3480 install(module);
3481
3482 resolve();
3483 }
3484 if (moduleObj) {
3485 var module$1 = moduleObj;
3486 if (!module$1) {
3487 reject(new Error('Framework7: Can\'t find Framework7 component in specified component'));
3488 return;
3489 }
3490 // Check if it was added
3491 if (Framework7.prototype.modules && Framework7.prototype.modules[module$1.name]) {
3492 resolve();
3493 return;
3494 }
3495 // Install It
3496 install(module$1);
3497
3498 resolve();
3499 }
3500 if (modulePath) {
3501 if (fetchedModules.indexOf(modulePath) >= 0) {
3502 resolve();
3503 return;
3504 }
3505 fetchedModules.push(modulePath);
3506 var scriptLoad = new Promise(function (resolveScript, rejectScript) {
3507 Framework7.request.get(
3508 modulePath,
3509 function (scriptContent) {
3510 var id = Utils.id();
3511 var callbackLoadName = "f7_component_loader_callback_" + id;
3512
3513 var scriptEl = document.createElement('script');
3514 scriptEl.innerHTML = "window." + callbackLoadName + " = function (Framework7, Framework7AutoInstallComponent) {return " + (scriptContent.trim()) + "}";
3515 $('head').append(scriptEl);
3516
3517 var componentLoader = window[callbackLoadName];
3518 delete window[callbackLoadName];
3519 $(scriptEl).remove();
3520
3521 var module = componentLoader(Framework7, false);
3522
3523 if (!module) {
3524 rejectScript(new Error(("Framework7: Can't find Framework7 component in " + modulePath + " file")));
3525 return;
3526 }
3527
3528 // Check if it was added
3529 if (Framework7.prototype.modules && Framework7.prototype.modules[module.name]) {
3530 resolveScript();
3531 return;
3532 }
3533
3534 // Install It
3535 install(module);
3536
3537 resolveScript();
3538 },
3539 function (xhr, status) {
3540 rejectScript(xhr, status);
3541 }
3542 );
3543 });
3544 var styleLoad = new Promise(function (resolveStyle) {
3545 Framework7.request.get(
3546 modulePath.replace('.js', app.rtl ? '.rtl.css' : '.css'),
3547 function (styleContent) {
3548 var styleEl = document.createElement('style');
3549 styleEl.innerHTML = styleContent;
3550 $('head').append(styleEl);
3551
3552 resolveStyle();
3553 },
3554 function () {
3555 resolveStyle();
3556 }
3557 );
3558 });
3559
3560 Promise.all([scriptLoad, styleLoad]).then(function () {
3561 resolve();
3562 }).catch(function (err) {
3563 reject(err);
3564 });
3565 }
3566 });
3567 }
3568
5d51ea26 3569 var Framework7 = /*@__PURE__*/(function (Framework7Class) {
5309fbda 3570 function Framework7(params) {
5d51ea26 3571 Framework7Class.call(this, params);
5309fbda
DC
3572 if (Framework7.instance) {
3573 throw new Error('Framework7 is already initialized and can\'t be initialized more than once');
3574 }
3575
3576 var passedParams = Utils.extend({}, params);
3577
3578 // App Instance
3579 var app = this;
3580
3581 Framework7.instance = app;
3582
3583 // Default
3584 var defaults = {
3585 version: '1.0.0',
3586 id: 'io.framework7.testapp',
3587 root: 'body',
3588 theme: 'auto',
3589 language: win.navigator.language,
3590 routes: [],
3591 name: 'Framework7',
3592 lazyModulesPath: null,
3593 initOnDeviceReady: true,
3594 init: true,
5d51ea26 3595 autoDarkTheme: false,
5309fbda
DC
3596 };
3597
3598 // Extend defaults with modules params
3599 app.useModulesParams(defaults);
3600
3601 // Extend defaults with passed params
3602 app.params = Utils.extend(defaults, params);
3603
3604 var $rootEl = $(app.params.root);
3605
3606 Utils.extend(app, {
3607 // App Id
3608 id: app.params.id,
3609 // App Name
3610 name: app.params.name,
3611 // App version
3612 version: app.params.version,
3613 // Routes
3614 routes: app.params.routes,
3615 // Lang
3616 language: app.params.language,
3617 // Root
3618 root: $rootEl,
3619 // RTL
3620 rtl: $rootEl.css('direction') === 'rtl',
3621 // Theme
3622 theme: (function getTheme() {
3623 if (app.params.theme === 'auto') {
5d51ea26
DC
3624 if (Device.ios) { return 'ios'; }
3625 if (Device.desktop && Device.electron) { return 'aurora'; }
3626 return 'md';
5309fbda
DC
3627 }
3628 return app.params.theme;
3629 }()),
3630 // Initially passed parameters
3631 passedParams: passedParams,
3632 });
3633
3634 // Save Root
3635 if (app.root && app.root[0]) {
3636 app.root[0].f7 = app;
3637 }
3638
3639 // Install Modules
3640 app.useModules();
3641
3642 // Init Data & Methods
3643 app.initData();
3644
5d51ea26
DC
3645 // Auto Dark Theme
3646 var DARK = '(prefers-color-scheme: dark)';
3647 var LIGHT = '(prefers-color-scheme: light)';
3648 app.mq = {};
3649 if (win.matchMedia) {
3650 app.mq.dark = win.matchMedia(DARK);
3651 app.mq.light = win.matchMedia(LIGHT);
3652 }
3653 app.colorSchemeListener = function colorSchemeListener(ref) {
3654 var matches = ref.matches;
3655 var media = ref.media;
3656
3657 if (!matches) {
3658 return;
3659 }
3660 var html = doc.querySelector('html');
3661 if (media === DARK) {
3662 html.classList.add('theme-dark');
3663 } else if (media === LIGHT) {
3664 html.classList.remove('theme-dark');
3665 }
3666 };
5309fbda
DC
3667 // Init
3668 if (app.params.init) {
3669 if (Device.cordova && app.params.initOnDeviceReady) {
3670 $(doc).on('deviceready', function () {
3671 app.init();
3672 });
3673 } else {
3674 app.init();
3675 }
3676 }
3677 // Return app instance
3678 return app;
3679 }
3680
5d51ea26
DC
3681 if ( Framework7Class ) Framework7.__proto__ = Framework7Class;
3682 Framework7.prototype = Object.create( Framework7Class && Framework7Class.prototype );
5309fbda
DC
3683 Framework7.prototype.constructor = Framework7;
3684
3685 var prototypeAccessors = { $: { configurable: true },t7: { configurable: true } };
3686 var staticAccessors = { Dom7: { configurable: true },$: { configurable: true },Template7: { configurable: true },Class: { configurable: true },Events: { configurable: true } };
3687
3688 Framework7.prototype.initData = function initData () {
3689 var app = this;
3690
3691 // Data
3692 app.data = {};
3693 if (app.params.data && typeof app.params.data === 'function') {
3694 Utils.extend(app.data, app.params.data.bind(app)());
3695 } else if (app.params.data) {
3696 Utils.extend(app.data, app.params.data);
3697 }
3698 // Methods
3699 app.methods = {};
3700 if (app.params.methods) {
3701 Object.keys(app.params.methods).forEach(function (methodName) {
3702 if (typeof app.params.methods[methodName] === 'function') {
3703 app.methods[methodName] = app.params.methods[methodName].bind(app);
3704 } else {
3705 app.methods[methodName] = app.params.methods[methodName];
3706 }
3707 });
3708 }
3709 };
3710
5d51ea26
DC
3711 Framework7.prototype.enableAutoDarkTheme = function enableAutoDarkTheme () {
3712 if (!win.matchMedia) { return; }
3713 var app = this;
3714 var html = doc.querySelector('html');
3715 if (app.mq.dark && app.mq.light) {
3716 app.mq.dark.addListener(app.colorSchemeListener);
3717 app.mq.light.addListener(app.colorSchemeListener);
3718 }
3719 if (app.mq.dark && app.mq.dark.matches) {
3720 html.classList.add('theme-dark');
3721 } else if (app.mq.light && app.mq.light.matches) {
3722 html.classList.remove('theme-dark');
3723 }
3724 };
3725
3726 Framework7.prototype.disableAutoDarkTheme = function disableAutoDarkTheme () {
3727 if (!win.matchMedia) { return; }
3728 var app = this;
3729 if (app.mq.dark) { app.mq.dark.removeListener(app.colorSchemeListener); }
3730 if (app.mq.light) { app.mq.light.removeListener(app.colorSchemeListener); }
3731 };
3732
5309fbda
DC
3733 Framework7.prototype.init = function init () {
3734 var app = this;
3735 if (app.initialized) { return app; }
3736
3737 app.root.addClass('framework7-initializing');
3738
3739 // RTL attr
3740 if (app.rtl) {
3741 $('html').attr('dir', 'rtl');
3742 }
3743
5d51ea26
DC
3744 // Auto Dark Theme
3745 if (app.params.autoDarkTheme) {
3746 app.enableAutoDarkTheme();
3747 }
3748
5309fbda
DC
3749 // Root class
3750 app.root.addClass('framework7-root');
3751
3752 // Theme class
3753 $('html').removeClass('ios md').addClass(app.theme);
3754
3755 // Init class
3756 Utils.nextFrame(function () {
3757 app.root.removeClass('framework7-initializing');
3758 });
3759 // Emit, init other modules
3760 app.initialized = true;
3761 app.emit('init');
3762
3763 return app;
3764 };
3765
3766 // eslint-disable-next-line
5d51ea26 3767 Framework7.prototype.loadModule = function loadModule () {
5309fbda
DC
3768 var args = [], len = arguments.length;
3769 while ( len-- ) args[ len ] = arguments[ len ];
3770
3771 return Framework7.loadModule.apply(Framework7, args);
3772 };
3773
3774 // eslint-disable-next-line
3775 Framework7.prototype.loadModules = function loadModules () {
3776 var args = [], len = arguments.length;
3777 while ( len-- ) args[ len ] = arguments[ len ];
3778
3779 return Framework7.loadModules.apply(Framework7, args);
3780 };
3781
3782 Framework7.prototype.getVnodeHooks = function getVnodeHooks (hook, id) {
3783 var app = this;
3784 if (!app.vnodeHooks || !app.vnodeHooks[hook]) { return []; }
3785 return app.vnodeHooks[hook][id] || [];
3786 };
3787
3788 // eslint-disable-next-line
3789 prototypeAccessors.$.get = function () {
3790 return $;
3791 };
3792 // eslint-disable-next-line
3793 prototypeAccessors.t7.get = function () {
3794 return Template7;
3795 };
3796
3797 staticAccessors.Dom7.get = function () {
3798 return $;
3799 };
3800
3801 staticAccessors.$.get = function () {
3802 return $;
3803 };
3804
3805 staticAccessors.Template7.get = function () {
3806 return Template7;
3807 };
3808
3809 staticAccessors.Class.get = function () {
5d51ea26 3810 return Framework7Class;
5309fbda
DC
3811 };
3812
3813 staticAccessors.Events.get = function () {
3814 return EventsClass;
3815 };
3816
3817 Object.defineProperties( Framework7.prototype, prototypeAccessors );
3818 Object.defineProperties( Framework7, staticAccessors );
3819
3820 return Framework7;
3821 }(Framework7Class));
3822
3823 Framework7.ModalMethods = ModalMethods;
3824 Framework7.ConstructorMethods = ConstructorMethods;
3825
3826 Framework7.loadModule = loadModule;
3827 Framework7.loadModules = function loadModules(modules) {
3828 return Promise.all(modules.map(function (module) { return Framework7.loadModule(module); }));
3829 };
3830
3831 var DeviceModule = {
3832 name: 'device',
3833 proto: {
3834 device: Device,
3835 },
3836 static: {
3837 device: Device,
3838 },
3839 on: {
3840 init: function init() {
3841 var classNames = [];
3842 var html = doc.querySelector('html');
3843 var metaStatusbar = doc.querySelector('meta[name="apple-mobile-web-app-status-bar-style"]');
3844 if (!html) { return; }
3845 if (Device.standalone && Device.ios && metaStatusbar && metaStatusbar.content === 'black-translucent') {
3846 classNames.push('device-full-viewport');
3847 }
3848
3849 // Pixel Ratio
3850 classNames.push(("device-pixel-ratio-" + (Math.floor(Device.pixelRatio))));
3851 if (Device.pixelRatio >= 2) {
3852 classNames.push('device-retina');
3853 }
3854 // OS classes
3855 if (Device.os) {
3856 classNames.push(
3857 ("device-" + (Device.os)),
3858 ("device-" + (Device.os) + "-" + (Device.osVersion.split('.')[0])),
3859 ("device-" + (Device.os) + "-" + (Device.osVersion.replace(/\./g, '-')))
3860 );
3861 if (Device.os === 'ios') {
3862 var major = parseInt(Device.osVersion.split('.')[0], 10);
3863 for (var i = major - 1; i >= 6; i -= 1) {
3864 classNames.push(("device-ios-gt-" + i));
3865 }
3866 if (Device.iphoneX) {
3867 classNames.push('device-iphone-x');
3868 }
3869 }
3870 } else if (Device.desktop) {
3871 classNames.push('device-desktop');
3872 if (Device.macos) { classNames.push('device-macos'); }
3873 else if (Device.windows) { classNames.push('device-windows'); }
3874 }
3875 if (Device.cordova || Device.phonegap) {
3876 classNames.push('device-cordova');
3877 }
3878
3879 // Add html classes
3880 classNames.forEach(function (className) {
3881 html.classList.add(className);
3882 });
3883 },
3884 },
3885 };
3886
5309fbda
DC
3887 var SupportModule = {
3888 name: 'support',
3889 proto: {
3890 support: Support,
3891 },
3892 static: {
3893 support: Support,
3894 },
3895 on: {
3896 init: function init() {
3897 var html = doc.querySelector('html');
3898 if (!html) { return; }
3899 var classNames = [];
3900 // Add html classes
3901 classNames.forEach(function (className) {
3902 html.classList.add(className);
3903 });
3904 },
3905 },
3906 };
3907
3908 var UtilsModule = {
3909 name: 'utils',
3910 proto: {
3911 utils: Utils,
3912 },
3913 static: {
3914 utils: Utils,
3915 },
3916 };
3917
3918 var ResizeModule = {
3919 name: 'resize',
3920 instance: {
3921 getSize: function getSize() {
3922 var app = this;
3923 if (!app.root[0]) { return { width: 0, height: 0, left: 0, top: 0 }; }
3924 var offset = app.root.offset();
3925 var ref = [app.root[0].offsetWidth, app.root[0].offsetHeight, offset.left, offset.top];
3926 var width = ref[0];
3927 var height = ref[1];
3928 var left = ref[2];
3929 var top = ref[3];
3930 app.width = width;
3931 app.height = height;
3932 app.left = left;
3933 app.top = top;
3934 return { width: width, height: height, left: left, top: top };
3935 },
3936 },
3937 on: {
3938 init: function init() {
3939 var app = this;
3940
3941 // Get Size
3942 app.getSize();
3943
3944 // Emit resize
3945 win.addEventListener('resize', function () {
3946 app.emit('resize');
3947 }, false);
3948
3949 // Emit orientationchange
3950 win.addEventListener('orientationchange', function () {
3951 app.emit('orientationchange');
3952 });
3953 },
3954 orientationchange: function orientationchange() {
3955 var app = this;
5309fbda
DC
3956 // Fix iPad weird body scroll
3957 if (app.device.ipad) {
3958 doc.body.scrollLeft = 0;
3959 setTimeout(function () {
3960 doc.body.scrollLeft = 0;
3961 }, 0);
3962 }
3963 },
3964 resize: function resize() {
3965 var app = this;
3966 app.getSize();
3967 },
3968 },
3969 };
3970
3971 var globals = {};
3972 var jsonpRequests = 0;
3973
3974 function Request(requestOptions) {
3975 var globalsNoCallbacks = Utils.extend({}, globals);
3976 ('beforeCreate beforeOpen beforeSend error complete success statusCode').split(' ').forEach(function (callbackName) {
3977 delete globalsNoCallbacks[callbackName];
3978 });
3979 var defaults = Utils.extend({
3980 url: win.location.toString(),
3981 method: 'GET',
3982 data: false,
3983 async: true,
3984 cache: true,
3985 user: '',
3986 password: '',
3987 headers: {},
3988 xhrFields: {},
3989 statusCode: {},
3990 processData: true,
3991 dataType: 'text',
3992 contentType: 'application/x-www-form-urlencoded',
3993 timeout: 0,
3994 }, globalsNoCallbacks);
3995
3996 var options = Utils.extend({}, defaults, requestOptions);
3997 var proceedRequest;
3998
3999 // Function to run XHR callbacks and events
4000 function fireCallback(callbackName) {
4001 var data = [], len = arguments.length - 1;
4002 while ( len-- > 0 ) data[ len ] = arguments[ len + 1 ];
4003
4004 /*
4005 Callbacks:
4006 beforeCreate (options),
4007 beforeOpen (xhr, options),
4008 beforeSend (xhr, options),
4009 error (xhr, status),
4010 complete (xhr, stautus),
4011 success (response, status, xhr),
4012 statusCode ()
4013 */
4014 var globalCallbackValue;
4015 var optionCallbackValue;
4016 if (globals[callbackName]) {
4017 globalCallbackValue = globals[callbackName].apply(globals, data);
4018 }
4019 if (options[callbackName]) {
4020 optionCallbackValue = options[callbackName].apply(options, data);
4021 }
4022 if (typeof globalCallbackValue !== 'boolean') { globalCallbackValue = true; }
4023 if (typeof optionCallbackValue !== 'boolean') { optionCallbackValue = true; }
4024 return (globalCallbackValue && optionCallbackValue);
4025 }
4026
4027 // Before create callback
4028 proceedRequest = fireCallback('beforeCreate', options);
4029 if (proceedRequest === false) { return undefined; }
4030
4031 // For jQuery guys
4032 if (options.type) { options.method = options.type; }
4033
4034 // Parameters Prefix
4035 var paramsPrefix = options.url.indexOf('?') >= 0 ? '&' : '?';
4036
4037 // UC method
4038 var method = options.method.toUpperCase();
4039
4040 // Data to modify GET URL
4041 if ((method === 'GET' || method === 'HEAD' || method === 'OPTIONS' || method === 'DELETE') && options.data) {
4042 var stringData;
4043 if (typeof options.data === 'string') {
4044 // Should be key=value string
4045 if (options.data.indexOf('?') >= 0) { stringData = options.data.split('?')[1]; }
4046 else { stringData = options.data; }
4047 } else {
4048 // Should be key=value object
4049 stringData = Utils.serializeObject(options.data);
4050 }
4051 if (stringData.length) {
4052 options.url += paramsPrefix + stringData;
4053 if (paramsPrefix === '?') { paramsPrefix = '&'; }
4054 }
4055 }
4056
4057 // JSONP
4058 if (options.dataType === 'json' && options.url.indexOf('callback=') >= 0) {
4059 var callbackName = "f7jsonp_" + (Date.now() + ((jsonpRequests += 1)));
4060 var abortTimeout;
4061 var callbackSplit = options.url.split('callback=');
4062 var requestUrl = (callbackSplit[0]) + "callback=" + callbackName;
4063 if (callbackSplit[1].indexOf('&') >= 0) {
4064 var addVars = callbackSplit[1].split('&').filter(function (el) { return el.indexOf('=') > 0; }).join('&');
4065 if (addVars.length > 0) { requestUrl += "&" + addVars; }
4066 }
4067
4068 // Create script
4069 var script = doc.createElement('script');
4070 script.type = 'text/javascript';
4071 script.onerror = function onerror() {
4072 clearTimeout(abortTimeout);
4073 fireCallback('error', null, 'scripterror');
4074 fireCallback('complete', null, 'scripterror');
4075 };
4076 script.src = requestUrl;
4077
4078 // Handler
4079 win[callbackName] = function jsonpCallback(data) {
4080 clearTimeout(abortTimeout);
4081 fireCallback('success', data);
4082 script.parentNode.removeChild(script);
4083 script = null;
4084 delete win[callbackName];
4085 };
4086 doc.querySelector('head').appendChild(script);
4087
4088 if (options.timeout > 0) {
4089 abortTimeout = setTimeout(function () {
4090 script.parentNode.removeChild(script);
4091 script = null;
4092 fireCallback('error', null, 'timeout');
4093 }, options.timeout);
4094 }
4095
4096 return undefined;
4097 }
4098
4099 // Cache for GET/HEAD requests
4100 if (method === 'GET' || method === 'HEAD' || method === 'OPTIONS' || method === 'DELETE') {
4101 if (options.cache === false) {
4102 options.url += paramsPrefix + "_nocache" + (Date.now());
4103 }
4104 }
4105
4106 // Create XHR
4107 var xhr = new XMLHttpRequest();
4108
4109 // Save Request URL
4110 xhr.requestUrl = options.url;
4111 xhr.requestParameters = options;
4112
4113 // Before open callback
4114 proceedRequest = fireCallback('beforeOpen', xhr, options);
4115 if (proceedRequest === false) { return xhr; }
4116
4117 // Open XHR
4118 xhr.open(method, options.url, options.async, options.user, options.password);
4119
4120 // Create POST Data
4121 var postData = null;
4122
4123 if ((method === 'POST' || method === 'PUT' || method === 'PATCH') && options.data) {
4124 if (options.processData) {
4125 var postDataInstances = [ArrayBuffer, Blob, Document, FormData];
4126 // Post Data
4127 if (postDataInstances.indexOf(options.data.constructor) >= 0) {
4128 postData = options.data;
4129 } else {
4130 // POST Headers
4131 var boundary = "---------------------------" + (Date.now().toString(16));
4132
4133 if (options.contentType === 'multipart/form-data') {
4134 xhr.setRequestHeader('Content-Type', ("multipart/form-data; boundary=" + boundary));
4135 } else {
4136 xhr.setRequestHeader('Content-Type', options.contentType);
4137 }
4138 postData = '';
4139 var data$1 = Utils.serializeObject(options.data);
4140 if (options.contentType === 'multipart/form-data') {
4141 data$1 = data$1.split('&');
4142 var newData = [];
4143 for (var i = 0; i < data$1.length; i += 1) {
4144 newData.push(("Content-Disposition: form-data; name=\"" + (data$1[i].split('=')[0]) + "\"\r\n\r\n" + (data$1[i].split('=')[1]) + "\r\n"));
4145 }
4146 postData = "--" + boundary + "\r\n" + (newData.join(("--" + boundary + "\r\n"))) + "--" + boundary + "--\r\n";
4147 } else if (options.contentType === 'application/json') {
4148 postData = JSON.stringify(options.data);
4149 } else {
4150 postData = data$1;
4151 }
4152 }
4153 } else {
4154 postData = options.data;
4155 xhr.setRequestHeader('Content-Type', options.contentType);
4156 }
4157 }
5d51ea26
DC
4158 if (options.dataType === 'json' && (!options.headers || !options.headers.Accept)) {
4159 xhr.setRequestHeader('Accept', 'application/json');
4160 }
5309fbda
DC
4161
4162 // Additional headers
4163 if (options.headers) {
4164 Object.keys(options.headers).forEach(function (headerName) {
4165 xhr.setRequestHeader(headerName, options.headers[headerName]);
4166 });
4167 }
4168
4169 // Check for crossDomain
4170 if (typeof options.crossDomain === 'undefined') {
4171 // eslint-disable-next-line
4172 options.crossDomain = /^([\w-]+:)?\/\/([^\/]+)/.test(options.url) && RegExp.$2 !== win.location.host;
4173 }
4174
4175 if (!options.crossDomain) {
4176 xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
4177 }
4178
4179 if (options.xhrFields) {
4180 Utils.extend(xhr, options.xhrFields);
4181 }
4182
4183 var xhrTimeout;
4184
4185 // Handle XHR
4186 xhr.onload = function onload() {
4187 if (xhrTimeout) { clearTimeout(xhrTimeout); }
4188 if ((xhr.status >= 200 && xhr.status < 300) || xhr.status === 0) {
4189 var responseData;
4190 if (options.dataType === 'json') {
4191 var parseError;
4192 try {
4193 responseData = JSON.parse(xhr.responseText);
4194 } catch (err) {
4195 parseError = true;
4196 }
4197 if (!parseError) {
4198 fireCallback('success', responseData, xhr.status, xhr);
4199 } else {
4200 fireCallback('error', xhr, 'parseerror');
4201 }
4202 } else {
4203 responseData = xhr.responseType === 'text' || xhr.responseType === '' ? xhr.responseText : xhr.response;
4204 fireCallback('success', responseData, xhr.status, xhr);
4205 }
4206 } else {
4207 fireCallback('error', xhr, xhr.status);
4208 }
4209 if (options.statusCode) {
4210 if (globals.statusCode && globals.statusCode[xhr.status]) { globals.statusCode[xhr.status](xhr); }
4211 if (options.statusCode[xhr.status]) { options.statusCode[xhr.status](xhr); }
4212 }
4213 fireCallback('complete', xhr, xhr.status);
4214 };
4215
4216 xhr.onerror = function onerror() {
4217 if (xhrTimeout) { clearTimeout(xhrTimeout); }
4218 fireCallback('error', xhr, xhr.status);
4219 fireCallback('complete', xhr, 'error');
4220 };
4221
4222 // Timeout
4223 if (options.timeout > 0) {
4224 xhr.onabort = function onabort() {
4225 if (xhrTimeout) { clearTimeout(xhrTimeout); }
4226 };
4227 xhrTimeout = setTimeout(function () {
4228 xhr.abort();
4229 fireCallback('error', xhr, 'timeout');
4230 fireCallback('complete', xhr, 'timeout');
4231 }, options.timeout);
4232 }
4233
4234 // Ajax start callback
4235 proceedRequest = fireCallback('beforeSend', xhr, options);
4236 if (proceedRequest === false) { return xhr; }
4237
4238 // Send XHR
4239 xhr.send(postData);
4240
4241 // Return XHR object
4242 return xhr;
4243 }
4244 function RequestShortcut(method) {
4245 var assign, assign$1;
4246
4247 var args = [], len = arguments.length - 1;
4248 while ( len-- > 0 ) args[ len ] = arguments[ len + 1 ];
4249 var ref = [];
4250 var url = ref[0];
4251 var data = ref[1];
4252 var success = ref[2];
4253 var error = ref[3];
4254 var dataType = ref[4];
4255 if (typeof args[1] === 'function') {
4256 (assign = args, url = assign[0], success = assign[1], error = assign[2], dataType = assign[3]);
4257 } else {
4258 (assign$1 = args, url = assign$1[0], data = assign$1[1], success = assign$1[2], error = assign$1[3], dataType = assign$1[4]);
4259 }
4260 [success, error].forEach(function (callback) {
4261 if (typeof callback === 'string') {
4262 dataType = callback;
4263 if (callback === success) { success = undefined; }
4264 else { error = undefined; }
4265 }
4266 });
4267 dataType = dataType || (method === 'json' || method === 'postJSON' ? 'json' : undefined);
4268 var requestOptions = {
4269 url: url,
4270 method: method === 'post' || method === 'postJSON' ? 'POST' : 'GET',
4271 data: data,
4272 success: success,
4273 error: error,
4274 dataType: dataType,
4275 };
4276 if (method === 'postJSON') {
4277 Utils.extend(requestOptions, {
4278 contentType: 'application/json',
4279 processData: false,
4280 crossDomain: true,
4281 data: typeof data === 'string' ? data : JSON.stringify(data),
4282 });
4283 }
4284 return Request(requestOptions);
4285 }
4286 function RequestShortcutPromise(method) {
4287 var args = [], len = arguments.length - 1;
4288 while ( len-- > 0 ) args[ len ] = arguments[ len + 1 ];
4289
4290 var url = args[0];
4291 var data = args[1];
4292 var dataType = args[2];
4293 return new Promise(function (resolve, reject) {
4294 RequestShortcut(
4295 method,
4296 url,
4297 data,
4298 function (response) {
4299 resolve(response);
4300 },
4301 function (xhr, status) {
4302 reject(status);
4303 },
4304 dataType
4305 );
4306 });
4307 }
4308 Object.assign(Request, {
4309 get: function () {
4310 var args = [], len = arguments.length;
4311 while ( len-- ) args[ len ] = arguments[ len ];
4312
4313 return RequestShortcut.apply(void 0, [ 'get' ].concat( args ));
4314 },
4315 post: function () {
4316 var args = [], len = arguments.length;
4317 while ( len-- ) args[ len ] = arguments[ len ];
4318
4319 return RequestShortcut.apply(void 0, [ 'post' ].concat( args ));
4320 },
4321 json: function () {
4322 var args = [], len = arguments.length;
4323 while ( len-- ) args[ len ] = arguments[ len ];
4324
4325 return RequestShortcut.apply(void 0, [ 'json' ].concat( args ));
4326 },
4327 getJSON: function () {
4328 var args = [], len = arguments.length;
4329 while ( len-- ) args[ len ] = arguments[ len ];
4330
4331 return RequestShortcut.apply(void 0, [ 'json' ].concat( args ));
4332 },
4333 postJSON: function () {
4334 var args = [], len = arguments.length;
4335 while ( len-- ) args[ len ] = arguments[ len ];
4336
4337 return RequestShortcut.apply(void 0, [ 'postJSON' ].concat( args ));
4338 },
4339 });
4340
4341 Request.promise = function requestPromise(requestOptions) {
4342 return new Promise(function (resolve, reject) {
4343 Request(Object.assign(requestOptions, {
4344 success: function success(data) {
4345 resolve(data);
4346 },
4347 error: function error(xhr, status) {
4348 reject(status);
4349 },
4350 }));
4351 });
4352 };
4353 Object.assign(Request.promise, {
4354 get: function () {
4355 var args = [], len = arguments.length;
4356 while ( len-- ) args[ len ] = arguments[ len ];
4357
4358 return RequestShortcutPromise.apply(void 0, [ 'get' ].concat( args ));
4359 },
4360 post: function () {
4361 var args = [], len = arguments.length;
4362 while ( len-- ) args[ len ] = arguments[ len ];
4363
4364 return RequestShortcutPromise.apply(void 0, [ 'post' ].concat( args ));
4365 },
4366 json: function () {
4367 var args = [], len = arguments.length;
4368 while ( len-- ) args[ len ] = arguments[ len ];
4369
4370 return RequestShortcutPromise.apply(void 0, [ 'json' ].concat( args ));
4371 },
4372 getJSON: function () {
4373 var args = [], len = arguments.length;
4374 while ( len-- ) args[ len ] = arguments[ len ];
4375
4376 return RequestShortcutPromise.apply(void 0, [ 'json' ].concat( args ));
4377 },
4378 postJSON: function () {
4379 var args = [], len = arguments.length;
4380 while ( len-- ) args[ len ] = arguments[ len ];
4381
4382 return RequestShortcutPromise.apply(void 0, [ 'postJSON' ].concat( args ));
4383 },
4384 });
4385
4386 Request.setup = function setup(options) {
4387 if (options.type && !options.method) {
4388 Utils.extend(options, { method: options.type });
4389 }
4390 Utils.extend(globals, options);
4391 };
4392
4393 /* eslint no-param-reassign: "off" */
4394
4395 var RequestModule = {
4396 name: 'request',
4397 proto: {
4398 request: Request,
4399 },
4400 static: {
4401 request: Request,
4402 },
4403 };
4404
4405 function initTouch() {
4406 var app = this;
4407 var params = app.params.touch;
4408 var useRipple = params[((app.theme) + "TouchRipple")];
4409
4410 if (Device.ios && Device.webView) {
4411 // Strange hack required for iOS 8 webview to work on inputs
4412 win.addEventListener('touchstart', function () {});
4413 }
4414
4415 var touchStartX;
4416 var touchStartY;
4417 var touchStartTime;
4418 var targetElement;
4419 var trackClick;
4420 var activeSelection;
4421 var scrollParent;
4422 var lastClickTime;
4423 var isMoved;
4424 var tapHoldFired;
4425 var tapHoldTimeout;
4426 var preventClick;
4427
4428 var activableElement;
4429 var activeTimeout;
4430
4431 var needsFastClick;
4432 var needsFastClickTimeOut;
4433
4434 var rippleWave;
4435 var rippleTarget;
4436 var rippleTimeout;
4437
4438 function findActivableElement(el) {
4439 var target = $(el);
4440 var parents = target.parents(params.activeStateElements);
4441 var activable;
4442 if (target.is(params.activeStateElements)) {
4443 activable = target;
4444 }
4445 if (parents.length > 0) {
4446 activable = activable ? activable.add(parents) : parents;
4447 }
5d51ea26
DC
4448 if (activable && activable.length > 1) {
4449 var newActivable = [];
4450 var preventPropagation;
4451 for (var i = 0; i < activable.length; i += 1) {
4452 if (!preventPropagation) {
4453 newActivable.push(activable[i]);
4454 if (activable.eq(i).hasClass('prevent-active-state-propagation')
4455 || activable.eq(i).hasClass('no-active-state-propagation')
4456 ) {
4457 preventPropagation = true;
4458 }
4459 }
4460 }
4461 activable = $(newActivable);
4462 }
5309fbda
DC
4463 return activable || target;
4464 }
4465
4466 function isInsideScrollableViewLight(el) {
4467 var pageContent = el.parents('.page-content');
4468 return pageContent.length > 0;
4469 }
4470 function isInsideScrollableView(el) {
4471 var pageContent = el.parents('.page-content');
4472
4473 if (pageContent.length === 0) {
4474 return false;
4475 }
4476
4477 // This event handler covers the "tap to stop scrolling".
4478 if (pageContent.prop('scrollHandlerSet') !== 'yes') {
4479 pageContent.on('scroll', function () {
4480 clearTimeout(activeTimeout);
4481 clearTimeout(rippleTimeout);
4482 });
4483 pageContent.prop('scrollHandlerSet', 'yes');
4484 }
4485
4486 return true;
4487 }
4488 function addActive() {
4489 if (!activableElement) { return; }
4490 activableElement.addClass('active-state');
4491 }
4492 function removeActive() {
4493 if (!activableElement) { return; }
4494 activableElement.removeClass('active-state');
4495 activableElement = null;
4496 }
4497 function isFormElement(el) {
4498 var nodes = ('input select textarea label').split(' ');
4499 if (el.nodeName && nodes.indexOf(el.nodeName.toLowerCase()) >= 0) { return true; }
4500 return false;
4501 }
4502 function androidNeedsBlur(el) {
4503 var noBlur = ('button input textarea select').split(' ');
4504 if (doc.activeElement && el !== doc.activeElement && doc.activeElement !== doc.body) {
4505 if (noBlur.indexOf(el.nodeName.toLowerCase()) >= 0) {
4506 return false;
4507 }
4508 return true;
4509 }
4510 return false;
4511 }
4512 function targetNeedsFastClick(el) {
4513 /*
4514 if (
4515 Device.ios
4516 &&
4517 (
4518 Device.osVersion.split('.')[0] > 9
4519 ||
4520 (Device.osVersion.split('.')[0] * 1 === 9 && Device.osVersion.split('.')[1] >= 1)
4521 )
4522 ) {
4523 return false;
4524 }
4525 */
4526 var $el = $(el);
4527 if (el.nodeName.toLowerCase() === 'input' && (el.type === 'file' || el.type === 'range')) { return false; }
4528 if (el.nodeName.toLowerCase() === 'select' && Device.android) { return false; }
4529 if ($el.hasClass('no-fastclick') || $el.parents('.no-fastclick').length > 0) { return false; }
4530 if (params.fastClicksExclude && $el.closest(params.fastClicksExclude).length > 0) { return false; }
4531
4532 return true;
4533 }
4534 function targetNeedsFocus(el) {
4535 if (doc.activeElement === el) {
4536 return false;
4537 }
4538 var tag = el.nodeName.toLowerCase();
4539 var skipInputs = ('button checkbox file image radio submit').split(' ');
4540 if (el.disabled || el.readOnly) { return false; }
4541 if (tag === 'textarea') { return true; }
4542 if (tag === 'select') {
4543 if (Device.android) { return false; }
4544 return true;
4545 }
4546 if (tag === 'input' && skipInputs.indexOf(el.type) < 0) { return true; }
4547 return false;
4548 }
4549 function targetNeedsPrevent(el) {
4550 var $el = $(el);
4551 var prevent = true;
4552 if ($el.is('label') || $el.parents('label').length > 0) {
4553 if (Device.android) {
4554 prevent = false;
4555 } else if (Device.ios && $el.is('input')) {
4556 prevent = true;
4557 } else { prevent = false; }
4558 }
4559 return prevent;
4560 }
4561
4562 // Ripple handlers
4563 function findRippleElement(el) {
4564 var rippleElements = params.touchRippleElements;
4565 var $el = $(el);
4566 if ($el.is(rippleElements)) {
4567 if ($el.hasClass('no-ripple')) {
4568 return false;
4569 }
4570 return $el;
4571 }
4572 if ($el.parents(rippleElements).length > 0) {
4573 var rippleParent = $el.parents(rippleElements).eq(0);
4574 if (rippleParent.hasClass('no-ripple')) {
4575 return false;
4576 }
4577 return rippleParent;
4578 }
4579 return false;
4580 }
4581 function createRipple($el, x, y) {
4582 if (!$el) { return; }
4583 rippleWave = app.touchRipple.create($el, x, y);
4584 }
4585
4586 function removeRipple() {
4587 if (!rippleWave) { return; }
4588 rippleWave.remove();
4589 rippleWave = undefined;
4590 rippleTarget = undefined;
4591 }
4592 function rippleTouchStart(el) {
4593 rippleTarget = findRippleElement(el);
4594 if (!rippleTarget || rippleTarget.length === 0) {
4595 rippleTarget = undefined;
4596 return;
4597 }
4598 var inScrollable = params.fastClicks
4599 ? isInsideScrollableView(rippleTarget)
4600 : isInsideScrollableViewLight(rippleTarget);
4601
4602 if (!inScrollable) {
5d51ea26 4603 removeRipple();
5309fbda
DC
4604 createRipple(rippleTarget, touchStartX, touchStartY);
4605 } else {
5d51ea26 4606 clearTimeout(rippleTimeout);
5309fbda 4607 rippleTimeout = setTimeout(function () {
5d51ea26 4608 removeRipple();
5309fbda
DC
4609 createRipple(rippleTarget, touchStartX, touchStartY);
4610 }, 80);
4611 }
4612 }
4613 function rippleTouchMove() {
4614 clearTimeout(rippleTimeout);
4615 removeRipple();
4616 }
4617 function rippleTouchEnd() {
5d51ea26 4618 if (!rippleWave && rippleTarget && !isMoved) {
5309fbda
DC
4619 clearTimeout(rippleTimeout);
4620 createRipple(rippleTarget, touchStartX, touchStartY);
4621 setTimeout(removeRipple, 0);
4622 } else {
4623 removeRipple();
4624 }
4625 }
4626
4627 // Mouse Handlers
4628 function handleMouseDown(e) {
4629 findActivableElement(e.target).addClass('active-state');
4630 if ('which' in e && e.which === 3) {
4631 setTimeout(function () {
4632 $('.active-state').removeClass('active-state');
4633 }, 0);
4634 }
4635 if (useRipple) {
4636 touchStartX = e.pageX;
4637 touchStartY = e.pageY;
4638 rippleTouchStart(e.target, e.pageX, e.pageY);
4639 }
4640 }
4641 function handleMouseMove() {
4642 $('.active-state').removeClass('active-state');
4643 if (useRipple) {
4644 rippleTouchMove();
4645 }
4646 }
4647 function handleMouseUp() {
4648 $('.active-state').removeClass('active-state');
4649 if (useRipple) {
4650 rippleTouchEnd();
4651 }
4652 }
4653
4654 // Send Click
4655 function sendClick(e) {
4656 var touch = e.changedTouches[0];
4657 var evt = doc.createEvent('MouseEvents');
4658 var eventType = 'click';
4659 if (Device.android && targetElement.nodeName.toLowerCase() === 'select') {
4660 eventType = 'mousedown';
4661 }
4662 evt.initMouseEvent(eventType, true, true, win, 1, touch.screenX, touch.screenY, touch.clientX, touch.clientY, false, false, false, false, 0, null);
4663 evt.forwardedTouchEvent = true;
4664
4665 if (app.device.ios && win.navigator.standalone) {
4666 // Fix the issue happens in iOS home screen apps where the wrong element is selected during a momentum scroll.
4667 // Upon tapping, we give the scrolling time to stop, then we grab the element based where the user tapped.
4668 setTimeout(function () {
4669 targetElement = doc.elementFromPoint(e.changedTouches[0].clientX, e.changedTouches[0].clientY);
5d51ea26
DC
4670 if (targetElement) {
4671 targetElement.dispatchEvent(evt);
4672 }
5309fbda
DC
4673 }, 10);
4674 } else {
4675 targetElement.dispatchEvent(evt);
4676 }
4677 }
4678
4679 // Touch Handlers
4680 function handleTouchStart(e) {
4681 var this$1 = this;
4682
4683 isMoved = false;
4684 tapHoldFired = false;
4685 if (e.targetTouches.length > 1) {
4686 if (activableElement) { removeActive(); }
4687 return true;
4688 }
4689 if (e.touches.length > 1 && activableElement) {
4690 removeActive();
4691 }
4692 if (params.tapHold) {
4693 if (tapHoldTimeout) { clearTimeout(tapHoldTimeout); }
4694 tapHoldTimeout = setTimeout(function () {
4695 if (e && e.touches && e.touches.length > 1) { return; }
4696 tapHoldFired = true;
4697 e.preventDefault();
4698 $(e.target).trigger('taphold');
4699 }, params.tapHoldDelay);
4700 }
4701 if (needsFastClickTimeOut) { clearTimeout(needsFastClickTimeOut); }
4702 needsFastClick = targetNeedsFastClick(e.target);
4703
4704 if (!needsFastClick) {
4705 trackClick = false;
4706 return true;
4707 }
4708 if (Device.ios || (Device.android && 'getSelection' in win)) {
4709 var selection = win.getSelection();
4710 if (
4711 selection.rangeCount
4712 && selection.focusNode !== doc.body
4713 && (!selection.isCollapsed || doc.activeElement === selection.focusNode)
4714 ) {
4715 activeSelection = true;
4716 return true;
4717 }
4718
4719 activeSelection = false;
4720 }
4721 if (Device.android) {
4722 if (androidNeedsBlur(e.target)) {
4723 doc.activeElement.blur();
4724 }
4725 }
4726
4727 trackClick = true;
4728 targetElement = e.target;
4729 touchStartTime = (new Date()).getTime();
4730 touchStartX = e.targetTouches[0].pageX;
4731 touchStartY = e.targetTouches[0].pageY;
4732
4733 // Detect scroll parent
4734 if (Device.ios) {
4735 scrollParent = undefined;
4736 $(targetElement).parents().each(function () {
4737 var parent = this$1;
4738 if (parent.scrollHeight > parent.offsetHeight && !scrollParent) {
4739 scrollParent = parent;
4740 scrollParent.f7ScrollTop = scrollParent.scrollTop;
4741 }
4742 });
4743 }
4744 if ((touchStartTime - lastClickTime) < params.fastClicksDelayBetweenClicks) {
4745 e.preventDefault();
4746 }
4747
4748 if (params.activeState) {
4749 activableElement = findActivableElement(targetElement);
4750 activeTimeout = setTimeout(addActive, 0);
4751 }
4752 if (useRipple) {
5d51ea26 4753 rippleTouchStart(targetElement);
5309fbda
DC
4754 }
4755 return true;
4756 }
4757 function handleTouchMove(e) {
4758 if (!trackClick) { return; }
4759 var distance = params.fastClicksDistanceThreshold;
4760 if (distance) {
4761 var pageX = e.targetTouches[0].pageX;
4762 var pageY = e.targetTouches[0].pageY;
4763 if (Math.abs(pageX - touchStartX) > distance || Math.abs(pageY - touchStartY) > distance) {
4764 isMoved = true;
4765 }
4766 } else {
4767 isMoved = true;
4768 }
4769 if (isMoved) {
4770 trackClick = false;
4771 targetElement = null;
4772 isMoved = true;
4773 if (params.tapHold) {
4774 clearTimeout(tapHoldTimeout);
4775 }
4776 if (params.activeState) {
4777 clearTimeout(activeTimeout);
4778 removeActive();
4779 }
4780 if (useRipple) {
4781 rippleTouchMove();
4782 }
4783 }
4784 }
4785 function handleTouchEnd(e) {
4786 clearTimeout(activeTimeout);
4787 clearTimeout(tapHoldTimeout);
4788
4789 var touchEndTime = (new Date()).getTime();
4790
4791 if (!trackClick) {
4792 if (!activeSelection && needsFastClick) {
4793 if (!(Device.android && !e.cancelable) && e.cancelable) {
4794 e.preventDefault();
4795 }
4796 }
4797 if (params.activeState) { removeActive(); }
4798 if (useRipple) {
4799 rippleTouchEnd();
4800 }
4801 return true;
4802 }
4803
4804 if (doc.activeElement === e.target) {
4805 if (params.activeState) { removeActive(); }
4806 if (useRipple) {
4807 rippleTouchEnd();
4808 }
4809 return true;
4810 }
4811
4812 if (!activeSelection) {
4813 e.preventDefault();
4814 }
4815
4816 if ((touchEndTime - lastClickTime) < params.fastClicksDelayBetweenClicks) {
4817 setTimeout(removeActive, 0);
4818 if (useRipple) {
4819 rippleTouchEnd();
4820 }
4821 return true;
4822 }
4823
4824 lastClickTime = touchEndTime;
4825
4826 trackClick = false;
4827
4828 if (Device.ios && scrollParent) {
4829 if (scrollParent.scrollTop !== scrollParent.f7ScrollTop) {
4830 return false;
4831 }
4832 }
4833
4834 // Add active-state here because, in a very fast tap, the timeout didn't
4835 // have the chance to execute. Removing active-state in a timeout gives
4836 // the chance to the animation execute.
4837 if (params.activeState) {
4838 addActive();
4839 setTimeout(removeActive, 0);
4840 }
4841 // Remove Ripple
4842 if (useRipple) {
4843 rippleTouchEnd();
4844 }
4845
4846 // Trigger focus when required
4847 if (targetNeedsFocus(targetElement)) {
4848 if (Device.ios && Device.webView) {
4849 targetElement.focus();
4850 return false;
4851 }
4852
4853 targetElement.focus();
4854 }
4855
4856 // Blur active elements
4857 if (doc.activeElement && targetElement !== doc.activeElement && doc.activeElement !== doc.body && targetElement.nodeName.toLowerCase() !== 'label') {
4858 doc.activeElement.blur();
4859 }
4860
4861 // Send click
4862 e.preventDefault();
4863 if (params.tapHoldPreventClicks && tapHoldFired) {
4864 return false;
4865 }
4866 sendClick(e);
4867 return false;
4868 }
4869 function handleTouchCancel() {
4870 trackClick = false;
4871 targetElement = null;
4872
4873 // Remove Active State
4874 clearTimeout(activeTimeout);
4875 clearTimeout(tapHoldTimeout);
4876 if (params.activeState) {
4877 removeActive();
4878 }
4879
4880 // Remove Ripple
4881 if (useRipple) {
4882 rippleTouchEnd();
4883 }
4884 }
4885
4886 function handleClick(e) {
4887 var allowClick = false;
4888 if (trackClick) {
4889 targetElement = null;
4890 trackClick = false;
4891 return true;
4892 }
4893 if ((e.target.type === 'submit' && e.detail === 0) || e.target.type === 'file') {
4894 return true;
4895 }
4896 if (!targetElement) {
4897 if (!isFormElement(e.target)) {
4898 allowClick = true;
4899 }
4900 }
4901 if (!needsFastClick) {
4902 allowClick = true;
4903 }
4904 if (doc.activeElement === targetElement) {
4905 allowClick = true;
4906 }
4907 if (e.forwardedTouchEvent) {
4908 allowClick = true;
4909 }
4910 if (!e.cancelable) {
4911 allowClick = true;
4912 }
4913 if (params.tapHold && params.tapHoldPreventClicks && tapHoldFired) {
4914 allowClick = false;
4915 }
4916 if (!allowClick) {
4917 e.stopImmediatePropagation();
4918 e.stopPropagation();
4919 if (targetElement) {
4920 if (targetNeedsPrevent(targetElement) || isMoved) {
4921 e.preventDefault();
4922 }
4923 } else {
4924 e.preventDefault();
4925 }
4926 targetElement = null;
4927 }
4928 needsFastClickTimeOut = setTimeout(function () {
4929 needsFastClick = false;
4930 }, (Device.ios || Device.androidChrome ? 100 : 400));
4931
4932 if (params.tapHold) {
4933 tapHoldTimeout = setTimeout(function () {
4934 tapHoldFired = false;
4935 }, (Device.ios || Device.androidChrome ? 100 : 400));
4936 }
4937
4938 return allowClick;
4939 }
4940
4941 function handleTouchStartLight(e) {
4942 isMoved = false;
4943 tapHoldFired = false;
4944 preventClick = false;
4945 if (e.targetTouches.length > 1) {
4946 if (activableElement) { removeActive(); }
4947 return true;
4948 }
4949 if (e.touches.length > 1 && activableElement) {
4950 removeActive();
4951 }
4952 if (params.tapHold) {
4953 if (tapHoldTimeout) { clearTimeout(tapHoldTimeout); }
4954 tapHoldTimeout = setTimeout(function () {
4955 if (e && e.touches && e.touches.length > 1) { return; }
4956 tapHoldFired = true;
4957 e.preventDefault();
4958 preventClick = true;
4959 $(e.target).trigger('taphold');
4960 }, params.tapHoldDelay);
4961 }
4962 targetElement = e.target;
4963 touchStartX = e.targetTouches[0].pageX;
4964 touchStartY = e.targetTouches[0].pageY;
4965
4966 if (params.activeState) {
4967 activableElement = findActivableElement(targetElement);
4968 if (!isInsideScrollableViewLight(activableElement)) {
4969 addActive();
4970 } else {
4971 activeTimeout = setTimeout(addActive, 80);
4972 }
4973 }
4974 if (useRipple) {
5d51ea26 4975 rippleTouchStart(targetElement);
5309fbda
DC
4976 }
4977 return true;
4978 }
4979 function handleTouchMoveLight(e) {
5d51ea26
DC
4980 var touch;
4981 var distance;
4982 if (e.type === 'touchmove') {
4983 touch = e.targetTouches[0];
4984 distance = params.touchClicksDistanceThreshold;
4985 // if (touch && touch.touchType === 'stylus') {
4986 // distance = 5;
4987 // } else {
4988 // distance = 3;
4989 // }
4990 }
4991
4992 if (distance && touch) {
4993 var pageX = touch.pageX;
4994 var pageY = touch.pageY;
5309fbda
DC
4995 if (Math.abs(pageX - touchStartX) > distance || Math.abs(pageY - touchStartY) > distance) {
4996 isMoved = true;
4997 }
4998 } else {
4999 isMoved = true;
5000 }
5001 if (isMoved) {
5002 preventClick = true;
5003 if (params.tapHold) {
5004 clearTimeout(tapHoldTimeout);
5005 }
5006 if (params.activeState) {
5007 clearTimeout(activeTimeout);
5008 removeActive();
5009 }
5010 if (useRipple) {
5011 rippleTouchMove();
5012 }
5013 }
5014 }
5015 function handleTouchEndLight(e) {
5016 clearTimeout(activeTimeout);
5017 clearTimeout(tapHoldTimeout);
5018 if (doc.activeElement === e.target) {
5019 if (params.activeState) { removeActive(); }
5020 if (useRipple) {
5021 rippleTouchEnd();
5022 }
5023 return true;
5024 }
5025 if (params.activeState) {
5026 addActive();
5027 setTimeout(removeActive, 0);
5028 }
5029 if (useRipple) {
5030 rippleTouchEnd();
5031 }
5032 if ((params.tapHoldPreventClicks && tapHoldFired) || preventClick) {
5033 if (e.cancelable) { e.preventDefault(); }
5034 preventClick = true;
5035 return false;
5036 }
5037 return true;
5038 }
5039 function handleClickLight(e) {
5040 var localPreventClick = preventClick;
5041 if (targetElement && e.target !== targetElement) {
5042 localPreventClick = true;
5043 }
5044 if (params.tapHold && params.tapHoldPreventClicks && tapHoldFired) {
5045 localPreventClick = true;
5046 }
5047 if (localPreventClick) {
5048 e.stopImmediatePropagation();
5049 e.stopPropagation();
5050 e.preventDefault();
5051 }
5052
5053 if (params.tapHold) {
5054 tapHoldTimeout = setTimeout(
5055 function () {
5056 tapHoldFired = false;
5057 },
5058 (Device.ios || Device.androidChrome ? 100 : 400)
5059 );
5060 }
5061 preventClick = false;
5062 targetElement = null;
5063
5064 return !localPreventClick;
5065 }
5066
5067 function emitAppTouchEvent(name, e) {
5068 app.emit({
5069 events: name,
5070 data: [e],
5071 });
5072 }
5073 function appClick(e) {
5074 emitAppTouchEvent('click', e);
5075 }
5076 function appTouchStartActive(e) {
5077 emitAppTouchEvent('touchstart touchstart:active', e);
5078 }
5079 function appTouchMoveActive(e) {
5080 emitAppTouchEvent('touchmove touchmove:active', e);
5081 }
5082 function appTouchEndActive(e) {
5083 emitAppTouchEvent('touchend touchend:active', e);
5084 }
5085 function appTouchStartPassive(e) {
5086 emitAppTouchEvent('touchstart:passive', e);
5087 }
5088 function appTouchMovePassive(e) {
5089 emitAppTouchEvent('touchmove:passive', e);
5090 }
5091 function appTouchEndPassive(e) {
5092 emitAppTouchEvent('touchend:passive', e);
5093 }
5094
5095 var passiveListener = Support.passiveListener ? { passive: true } : false;
5096 var activeListener = Support.passiveListener ? { passive: false } : false;
5097
5098 doc.addEventListener('click', appClick, true);
5099
5100 if (Support.passiveListener) {
5101 doc.addEventListener(app.touchEvents.start, appTouchStartActive, activeListener);
5102 doc.addEventListener(app.touchEvents.move, appTouchMoveActive, activeListener);
5103 doc.addEventListener(app.touchEvents.end, appTouchEndActive, activeListener);
5104
5105 doc.addEventListener(app.touchEvents.start, appTouchStartPassive, passiveListener);
5106 doc.addEventListener(app.touchEvents.move, appTouchMovePassive, passiveListener);
5107 doc.addEventListener(app.touchEvents.end, appTouchEndPassive, passiveListener);
5108 } else {
5109 doc.addEventListener(app.touchEvents.start, function (e) {
5110 appTouchStartActive(e);
5111 appTouchStartPassive(e);
5112 }, false);
5113 doc.addEventListener(app.touchEvents.move, function (e) {
5114 appTouchMoveActive(e);
5115 appTouchMovePassive(e);
5116 }, false);
5117 doc.addEventListener(app.touchEvents.end, function (e) {
5118 appTouchEndActive(e);
5119 appTouchEndPassive(e);
5120 }, false);
5121 }
5122
5123 if (Support.touch) {
5124 if (params.fastClicks) {
5125 app.on('click', handleClick);
5126 app.on('touchstart', handleTouchStart);
5127 app.on('touchmove', handleTouchMove);
5128 app.on('touchend', handleTouchEnd);
5129 } else {
5130 app.on('click', handleClickLight);
5131 app.on('touchstart', handleTouchStartLight);
5132 app.on('touchmove', handleTouchMoveLight);
5133 app.on('touchend', handleTouchEndLight);
5134 }
5135
5136 doc.addEventListener('touchcancel', handleTouchCancel, { passive: true });
5137 } else if (params.activeState) {
5138 app.on('touchstart', handleMouseDown);
5139 app.on('touchmove', handleMouseMove);
5140 app.on('touchend', handleMouseUp);
5141 }
5142 doc.addEventListener('contextmenu', function (e) {
5143 if (params.disableContextMenu && (Device.ios || Device.android || Device.cordova)) {
5144 e.preventDefault();
5145 }
5146 if (useRipple) {
5147 if (activableElement) { removeActive(); }
5148 rippleTouchEnd();
5149 }
5150 });
5151 }
5152
5153 var TouchModule = {
5154 name: 'touch',
5155 params: {
5156 touch: {
5157 // Fast clicks
5158 fastClicks: false,
5159 fastClicksDistanceThreshold: 10,
5160 fastClicksDelayBetweenClicks: 50,
5161 fastClicksExclude: '', // CSS selector
5d51ea26
DC
5162 // Clicks
5163 touchClicksDistanceThreshold: 5,
5309fbda
DC
5164 // ContextMenu
5165 disableContextMenu: false,
5166 // Tap Hold
5167 tapHold: false,
5168 tapHoldDelay: 750,
5169 tapHoldPreventClicks: true,
5170 // Active State
5171 activeState: true,
5d51ea26 5172 activeStateElements: 'a, button, label, span, .actions-button, .stepper-button, .stepper-button-plus, .stepper-button-minus, .card-expandable, .menu-item, .link, .item-link',
5309fbda
DC
5173 mdTouchRipple: true,
5174 iosTouchRipple: false,
5d51ea26 5175 auroraTouchRipple: false,
5309fbda
DC
5176 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',
5177 },
5178 },
5179 instance: {
5180 touchEvents: {
5181 start: Support.touch ? 'touchstart' : 'mousedown',
5182 move: Support.touch ? 'touchmove' : 'mousemove',
5183 end: Support.touch ? 'touchend' : 'mouseup',
5184 },
5185 },
5186 on: {
5187 init: initTouch,
5188 },
5189 };
5190
5191 /**
5192 * Expose `pathToRegexp`.
5193 */
5194 var pathToRegexp_1 = pathToRegexp;
5195 var parse_1 = parse;
5196 var compile_1 = compile;
5197 var tokensToFunction_1 = tokensToFunction;
5198 var tokensToRegExp_1 = tokensToRegExp;
5199
5200 /**
5201 * Default configs.
5202 */
5203 var DEFAULT_DELIMITER = '/';
5204
5205 /**
5206 * The main path matching regexp utility.
5207 *
5208 * @type {RegExp}
5209 */
5210 var PATH_REGEXP = new RegExp([
5211 // Match escaped characters that would otherwise appear in future matches.
5212 // This allows the user to escape special characters that won't transform.
5213 '(\\\\.)',
5214 // Match Express-style parameters and un-named parameters with a prefix
5215 // and optional suffixes. Matches appear as:
5216 //
5217 // ":test(\\d+)?" => ["test", "\d+", undefined, "?"]
5218 // "(\\d+)" => [undefined, undefined, "\d+", undefined]
5219 '(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?'
5220 ].join('|'), 'g');
5221
5222 /**
5223 * Parse a string for the raw tokens.
5224 *
5225 * @param {string} str
5226 * @param {Object=} options
5227 * @return {!Array}
5228 */
5229 function parse (str, options) {
5230 var tokens = [];
5231 var key = 0;
5232 var index = 0;
5233 var path = '';
5234 var defaultDelimiter = (options && options.delimiter) || DEFAULT_DELIMITER;
5235 var whitelist = (options && options.whitelist) || undefined;
5236 var pathEscaped = false;
5237 var res;
5238
5239 while ((res = PATH_REGEXP.exec(str)) !== null) {
5240 var m = res[0];
5241 var escaped = res[1];
5242 var offset = res.index;
5243 path += str.slice(index, offset);
5244 index = offset + m.length;
5245
5246 // Ignore already escaped sequences.
5247 if (escaped) {
5248 path += escaped[1];
5249 pathEscaped = true;
5250 continue
5251 }
5252
5253 var prev = '';
5254 var name = res[2];
5255 var capture = res[3];
5256 var group = res[4];
5257 var modifier = res[5];
5258
5259 if (!pathEscaped && path.length) {
5260 var k = path.length - 1;
5261 var c = path[k];
5262 var matches = whitelist ? whitelist.indexOf(c) > -1 : true;
5263
5264 if (matches) {
5265 prev = c;
5266 path = path.slice(0, k);
5267 }
5268 }
5269
5270 // Push the current path onto the tokens.
5271 if (path) {
5272 tokens.push(path);
5273 path = '';
5274 pathEscaped = false;
5275 }
5276
5277 var repeat = modifier === '+' || modifier === '*';
5278 var optional = modifier === '?' || modifier === '*';
5279 var pattern = capture || group;
5280 var delimiter = prev || defaultDelimiter;
5281
5282 tokens.push({
5283 name: name || key++,
5284 prefix: prev,
5285 delimiter: delimiter,
5286 optional: optional,
5287 repeat: repeat,
5288 pattern: pattern
5289 ? escapeGroup(pattern)
5290 : '[^' + escapeString(delimiter === defaultDelimiter ? delimiter : (delimiter + defaultDelimiter)) + ']+?'
5291 });
5292 }
5293
5294 // Push any remaining characters.
5295 if (path || index < str.length) {
5296 tokens.push(path + str.substr(index));
5297 }
5298
5299 return tokens
5300 }
5301
5302 /**
5303 * Compile a string to a template function for the path.
5304 *
5305 * @param {string} str
5306 * @param {Object=} options
5307 * @return {!function(Object=, Object=)}
5308 */
5309 function compile (str, options) {
5310 return tokensToFunction(parse(str, options))
5311 }
5312
5313 /**
5314 * Expose a method for transforming tokens into the path function.
5315 */
5316 function tokensToFunction (tokens) {
5317 // Compile all the tokens into regexps.
5318 var matches = new Array(tokens.length);
5319
5320 // Compile all the patterns before compilation.
5321 for (var i = 0; i < tokens.length; i++) {
5322 if (typeof tokens[i] === 'object') {
5323 matches[i] = new RegExp('^(?:' + tokens[i].pattern + ')$');
5324 }
5325 }
5326
5327 return function (data, options) {
5328 var path = '';
5329 var encode = (options && options.encode) || encodeURIComponent;
5330
5331 for (var i = 0; i < tokens.length; i++) {
5332 var token = tokens[i];
5333
5334 if (typeof token === 'string') {
5335 path += token;
5336 continue
5337 }
5338
5339 var value = data ? data[token.name] : undefined;
5340 var segment;
5341
5342 if (Array.isArray(value)) {
5343 if (!token.repeat) {
5344 throw new TypeError('Expected "' + token.name + '" to not repeat, but got array')
5345 }
5346
5347 if (value.length === 0) {
5348 if (token.optional) { continue }
5349
5350 throw new TypeError('Expected "' + token.name + '" to not be empty')
5351 }
5352
5353 for (var j = 0; j < value.length; j++) {
5354 segment = encode(value[j], token);
5355
5356 if (!matches[i].test(segment)) {
5357 throw new TypeError('Expected all "' + token.name + '" to match "' + token.pattern + '"')
5358 }
5359
5360 path += (j === 0 ? token.prefix : token.delimiter) + segment;
5361 }
5362
5363 continue
5364 }
5365
5366 if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {
5367 segment = encode(String(value), token);
5368
5369 if (!matches[i].test(segment)) {
5370 throw new TypeError('Expected "' + token.name + '" to match "' + token.pattern + '", but got "' + segment + '"')
5371 }
5372
5373 path += token.prefix + segment;
5374 continue
5375 }
5376
5377 if (token.optional) { continue }
5378
5379 throw new TypeError('Expected "' + token.name + '" to be ' + (token.repeat ? 'an array' : 'a string'))
5380 }
5381
5382 return path
5383 }
5384 }
5385
5386 /**
5387 * Escape a regular expression string.
5388 *
5389 * @param {string} str
5390 * @return {string}
5391 */
5392 function escapeString (str) {
5393 return str.replace(/([.+*?=^!:${}()[\]|/\\])/g, '\\$1')
5394 }
5395
5396 /**
5397 * Escape the capturing group by escaping special characters and meaning.
5398 *
5399 * @param {string} group
5400 * @return {string}
5401 */
5402 function escapeGroup (group) {
5403 return group.replace(/([=!:$/()])/g, '\\$1')
5404 }
5405
5406 /**
5407 * Get the flags for a regexp from the options.
5408 *
5409 * @param {Object} options
5410 * @return {string}
5411 */
5412 function flags (options) {
5413 return options && options.sensitive ? '' : 'i'
5414 }
5415
5416 /**
5417 * Pull out keys from a regexp.
5418 *
5419 * @param {!RegExp} path
5420 * @param {Array=} keys
5421 * @return {!RegExp}
5422 */
5423 function regexpToRegexp (path, keys) {
5424 if (!keys) { return path }
5425
5426 // Use a negative lookahead to match only capturing groups.
5427 var groups = path.source.match(/\((?!\?)/g);
5428
5429 if (groups) {
5430 for (var i = 0; i < groups.length; i++) {
5431 keys.push({
5432 name: i,
5433 prefix: null,
5434 delimiter: null,
5435 optional: false,
5436 repeat: false,
5437 pattern: null
5438 });
5439 }
5440 }
5441
5442 return path
5443 }
5444
5445 /**
5446 * Transform an array into a regexp.
5447 *
5448 * @param {!Array} path
5449 * @param {Array=} keys
5450 * @param {Object=} options
5451 * @return {!RegExp}
5452 */
5453 function arrayToRegexp (path, keys, options) {
5454 var parts = [];
5455
5456 for (var i = 0; i < path.length; i++) {
5457 parts.push(pathToRegexp(path[i], keys, options).source);
5458 }
5459
5460 return new RegExp('(?:' + parts.join('|') + ')', flags(options))
5461 }
5462
5463 /**
5464 * Create a path regexp from string input.
5465 *
5466 * @param {string} path
5467 * @param {Array=} keys
5468 * @param {Object=} options
5469 * @return {!RegExp}
5470 */
5471 function stringToRegexp (path, keys, options) {
5472 return tokensToRegExp(parse(path, options), keys, options)
5473 }
5474
5475 /**
5476 * Expose a function for taking tokens and returning a RegExp.
5477 *
5478 * @param {!Array} tokens
5479 * @param {Array=} keys
5480 * @param {Object=} options
5481 * @return {!RegExp}
5482 */
5483 function tokensToRegExp (tokens, keys, options) {
5484 options = options || {};
5485
5486 var strict = options.strict;
5487 var start = options.start !== false;
5488 var end = options.end !== false;
5489 var delimiter = options.delimiter || DEFAULT_DELIMITER;
5490 var endsWith = [].concat(options.endsWith || []).map(escapeString).concat('$').join('|');
5491 var route = start ? '^' : '';
5492
5493 // Iterate over the tokens and create our regexp string.
5494 for (var i = 0; i < tokens.length; i++) {
5495 var token = tokens[i];
5496
5497 if (typeof token === 'string') {
5498 route += escapeString(token);
5499 } else {
5500 var capture = token.repeat
5501 ? '(?:' + token.pattern + ')(?:' + escapeString(token.delimiter) + '(?:' + token.pattern + '))*'
5502 : token.pattern;
5503
5504 if (keys) { keys.push(token); }
5505
5506 if (token.optional) {
5507 if (!token.prefix) {
5508 route += '(' + capture + ')?';
5509 } else {
5510 route += '(?:' + escapeString(token.prefix) + '(' + capture + '))?';
5511 }
5512 } else {
5513 route += escapeString(token.prefix) + '(' + capture + ')';
5514 }
5515 }
5516 }
5517
5518 if (end) {
5519 if (!strict) { route += '(?:' + escapeString(delimiter) + ')?'; }
5520
5521 route += endsWith === '$' ? '$' : '(?=' + endsWith + ')';
5522 } else {
5523 var endToken = tokens[tokens.length - 1];
5524 var isEndDelimited = typeof endToken === 'string'
5525 ? endToken[endToken.length - 1] === delimiter
5526 : endToken === undefined;
5527
5528 if (!strict) { route += '(?:' + escapeString(delimiter) + '(?=' + endsWith + '))?'; }
5529 if (!isEndDelimited) { route += '(?=' + escapeString(delimiter) + '|' + endsWith + ')'; }
5530 }
5531
5532 return new RegExp(route, flags(options))
5533 }
5534
5535 /**
5536 * Normalize the given path string, returning a regular expression.
5537 *
5538 * An empty array can be passed in for the keys, which will hold the
5539 * placeholder key descriptions. For example, using `/user/:id`, `keys` will
5540 * contain `[{ name: 'id', delimiter: '/', optional: false, repeat: false }]`.
5541 *
5542 * @param {(string|RegExp|Array)} path
5543 * @param {Array=} keys
5544 * @param {Object=} options
5545 * @return {!RegExp}
5546 */
5547 function pathToRegexp (path, keys, options) {
5548 if (path instanceof RegExp) {
5549 return regexpToRegexp(path, keys)
5550 }
5551
5552 if (Array.isArray(path)) {
5553 return arrayToRegexp(/** @type {!Array} */ (path), keys, options)
5554 }
5555
5556 return stringToRegexp(/** @type {string} */ (path), keys, options)
5557 }
5558 pathToRegexp_1.parse = parse_1;
5559 pathToRegexp_1.compile = compile_1;
5560 pathToRegexp_1.tokensToFunction = tokensToFunction_1;
5561 pathToRegexp_1.tokensToRegExp = tokensToRegExp_1;
5562
5563 var History = {
5564 queue: [],
5565 clearQueue: function clearQueue() {
5566 if (History.queue.length === 0) { return; }
5567 var currentQueue = History.queue.shift();
5568 currentQueue();
5569 },
5570 routerQueue: [],
5571 clearRouterQueue: function clearRouterQueue() {
5572 if (History.routerQueue.length === 0) { return; }
5573 var currentQueue = History.routerQueue.pop();
5574 var router = currentQueue.router;
5575 var stateUrl = currentQueue.stateUrl;
5576 var action = currentQueue.action;
5577
5578 var animate = router.params.animate;
5579 if (router.params.pushStateAnimate === false) { animate = false; }
5580
5581 if (action === 'back') {
5582 router.back({ animate: animate, pushState: false });
5583 }
5584 if (action === 'load') {
5585 router.navigate(stateUrl, { animate: animate, pushState: false });
5586 }
5587 },
5588 handle: function handle(e) {
5589 if (History.blockPopstate) { return; }
5590 var app = this;
5591 // const mainView = app.views.main;
5592 var state = e.state;
5593 History.previousState = History.state;
5594 History.state = state;
5595
5596 History.allowChange = true;
5597 History.clearQueue();
5598
5599 state = History.state;
5600 if (!state) { state = {}; }
5601
5602 app.views.forEach(function (view) {
5603 var router = view.router;
5604 var viewState = state[view.id];
5605 if (!viewState && view.params.pushState) {
5606 viewState = {
5607 url: view.router.history[0],
5608 };
5609 }
5610 if (!viewState) { return; }
5611 var stateUrl = viewState.url || undefined;
5612
5613 var animate = router.params.animate;
5614 if (router.params.pushStateAnimate === false) { animate = false; }
5615
5616 if (stateUrl !== router.url) {
5617 if (router.history.indexOf(stateUrl) >= 0) {
5618 // Go Back
5619 if (router.allowPageChange) {
5620 router.back({ animate: animate, pushState: false });
5621 } else {
5622 History.routerQueue.push({
5623 action: 'back',
5624 router: router,
5625 });
5626 }
5627 } else if (router.allowPageChange) {
5628 // Load page
5629 router.navigate(stateUrl, { animate: animate, pushState: false });
5630 } else {
5631 History.routerQueue.unshift({
5632 action: 'load',
5633 stateUrl: stateUrl,
5634 router: router,
5635 });
5636 }
5637 }
5638 });
5639 },
5640 initViewState: function initViewState(viewId, viewState) {
5641 var obj;
5642
5643 var newState = Utils.extend({}, (History.state || {}), ( obj = {}, obj[viewId] = viewState, obj ));
5644 History.state = newState;
5645 win.history.replaceState(newState, '');
5646 },
5647 push: function push(viewId, viewState, url) {
5648 var obj;
5649
5650 if (!History.allowChange) {
5651 History.queue.push(function () {
5652 History.push(viewId, viewState, url);
5653 });
5654 return;
5655 }
5656 History.previousState = History.state;
5657 var newState = Utils.extend({}, (History.previousState || {}), ( obj = {}, obj[viewId] = viewState, obj ));
5658 History.state = newState;
5659 win.history.pushState(newState, '', url);
5660 },
5661 replace: function replace(viewId, viewState, url) {
5662 var obj;
5663
5664 if (!History.allowChange) {
5665 History.queue.push(function () {
5666 History.replace(viewId, viewState, url);
5667 });
5668 return;
5669 }
5670 History.previousState = History.state;
5671 var newState = Utils.extend({}, (History.previousState || {}), ( obj = {}, obj[viewId] = viewState, obj ));
5672 History.state = newState;
5673 win.history.replaceState(newState, '', url);
5674 },
5675 go: function go(index) {
5676 History.allowChange = false;
5677 win.history.go(index);
5678 },
5679 back: function back() {
5680 History.allowChange = false;
5681 win.history.back();
5682 },
5683 allowChange: true,
5684 previousState: {},
5685 state: win.history.state,
5686 blockPopstate: true,
5687 init: function init(app) {
5688 $(win).on('load', function () {
5689 setTimeout(function () {
5690 History.blockPopstate = false;
5691 }, 0);
5692 });
5693
5694 if (doc.readyState && doc.readyState === 'complete') {
5695 History.blockPopstate = false;
5696 }
5697
5698 $(win).on('popstate', History.handle.bind(app));
5699 },
5700 };
5701
5702 function SwipeBack(r) {
5703 var router = r;
5704 var $el = router.$el;
5705 var $navbarEl = router.$navbarEl;
5706 var app = router.app;
5707 var params = router.params;
5708 var isTouched = false;
5709 var isMoved = false;
5710 var touchesStart = {};
5711 var isScrolling;
5d51ea26
DC
5712 var $currentPageEl = [];
5713 var $previousPageEl = [];
5309fbda
DC
5714 var viewContainerWidth;
5715 var touchesDiff;
5716 var allowViewTouchMove = true;
5717 var touchStartTime;
5d51ea26
DC
5718 var $currentNavbarInnerEl = [];
5719 var $previousNavbarInnerEl = [];
5309fbda
DC
5720 var dynamicNavbar;
5721 var separateNavbar;
5d51ea26
DC
5722 var $pageShadowEl;
5723 var $pageOpacityEl;
5309fbda
DC
5724
5725 var animatableNavEls;
5726
5727 var paramsSwipeBackAnimateShadow = params[((app.theme) + "SwipeBackAnimateShadow")];
5728 var paramsSwipeBackAnimateOpacity = params[((app.theme) + "SwipeBackAnimateOpacity")];
5729 var paramsSwipeBackActiveArea = params[((app.theme) + "SwipeBackActiveArea")];
5730 var paramsSwipeBackThreshold = params[((app.theme) + "SwipeBackThreshold")];
5731
5732 var transformOrigin = app.rtl ? 'right center' : 'left center';
5733
5734 function animatableNavElements() {
5735 var els = [];
5736 var inverter = app.rtl ? -1 : 1;
5d51ea26
DC
5737 var currentNavIsLarge = $currentNavbarInnerEl.hasClass('navbar-inner-large');
5738 var previousNavIsLarge = $previousNavbarInnerEl.hasClass('navbar-inner-large');
5739 var fromLarge = currentNavIsLarge && !$currentNavbarInnerEl.hasClass('navbar-inner-large-collapsed');
5740 var toLarge = previousNavIsLarge && !$previousNavbarInnerEl.hasClass('navbar-inner-large-collapsed');
5741 var $currentNavElements = $currentNavbarInnerEl.children('.left, .title, .right, .subnavbar, .fading, .title-large');
5742 var $previousNavElements = $previousNavbarInnerEl.children('.left, .title, .right, .subnavbar, .fading, .title-large');
5309fbda
DC
5743 var activeNavBackIconText;
5744 var previousNavBackIconText;
5745
5746 if (params.iosAnimateNavbarBackIcon) {
5d51ea26
DC
5747 if ($currentNavbarInnerEl.hasClass('sliding')) {
5748 activeNavBackIconText = $currentNavbarInnerEl.children('.left').find('.back .icon + span').eq(0);
5309fbda 5749 } else {
5d51ea26 5750 activeNavBackIconText = $currentNavbarInnerEl.children('.left.sliding').find('.back .icon + span').eq(0);
5309fbda 5751 }
5d51ea26
DC
5752 if ($previousNavbarInnerEl.hasClass('sliding')) {
5753 previousNavBackIconText = $previousNavbarInnerEl.children('.left').find('.back .icon + span').eq(0);
5309fbda 5754 } else {
5d51ea26 5755 previousNavBackIconText = $previousNavbarInnerEl.children('.left.sliding').find('.back .icon + span').eq(0);
5309fbda
DC
5756 }
5757 if (activeNavBackIconText.length) {
5758 $previousNavElements.each(function (index, el) {
5759 if (!$(el).hasClass('title')) { return; }
5760 el.f7NavbarLeftOffset += activeNavBackIconText.prev('.icon')[0].offsetWidth;
5761 });
5762 }
5763 }
5764 $currentNavElements
5765 .each(function (index, navEl) {
5766 var $navEl = $(navEl);
5767 var isSubnavbar = $navEl.hasClass('subnavbar');
5768 var isLeft = $navEl.hasClass('left');
5769 var isTitle = $navEl.hasClass('title');
5770 if (!fromLarge && $navEl.hasClass('.title-large')) { return; }
5771 var el = {
5772 el: navEl,
5773 };
5774 if (fromLarge) {
5775 if (isTitle) { return; }
5776 if ($navEl.hasClass('title-large')) {
5777 if (!separateNavbar) { return; }
5778 if (toLarge) {
5779 if (els.indexOf(el) < 0) { els.push(el); }
5780 el.overflow = 'visible';
5781 el.transform = 'translateX(100%)';
5782 $navEl.find('.title-large-text, .title-large-inner').each(function (subIndex, subNavEl) {
5783 els.push({
5784 el: subNavEl,
5785 transform: function (progress) { return ("translateX(" + (-100 + progress * 100 * inverter) + "%)"); },
5786 });
5787 });
5788 } else {
5789 if (els.indexOf(el) < 0) { els.push(el); }
5790 el.overflow = 'hidden';
5791 el.transform = function (progress) { return ("translateY(calc(" + (-progress) + " * var(--f7-navbar-large-title-height)))"); };
5792 $navEl.find('.title-large-text, .title-large-inner').each(function (subIndex, subNavEl) {
5793 els.push({
5794 el: subNavEl,
5795 transform: function (progress) { return ("translateX(" + (progress * 100 * inverter) + "%) translateY(calc(" + progress + " * var(--f7-navbar-large-title-height)))"); },
5796 });
5797 });
5798 }
5799 return;
5800 }
5801 }
5802 if (toLarge) {
5803 if (!fromLarge) {
5804 if ($navEl.hasClass('title-large')) {
5805 if (!separateNavbar) { return; }
5806 if (els.indexOf(el) < 0) { els.push(el); }
5807 el.opacity = 0;
5808 }
5809 }
5810 if (isLeft && separateNavbar) {
5811 if (els.indexOf(el) < 0) { els.push(el); }
5812 el.opacity = function (progress) { return (1 - (Math.pow( progress, 0.33 ))); };
5813 $navEl.find('.back span').each(function (subIndex, subNavEl) {
5814 els.push({
5815 el: subNavEl,
5816 'transform-origin': transformOrigin,
5817 transform: function (progress) { return ("translateY(calc(var(--f7-navbar-height) * " + progress + ")) scale(" + (1 + (1 * progress)) + ")"); },
5818 });
5819 });
5820 return;
5821 }
5822 }
5823 if ($navEl.hasClass('title-large')) { return; }
5d51ea26 5824 var isSliding = $navEl.hasClass('sliding') || $currentNavbarInnerEl.hasClass('sliding');
5309fbda
DC
5825 if (els.indexOf(el) < 0) { els.push(el); }
5826 if (!isSubnavbar || (isSubnavbar && !isSliding)) {
5827 el.opacity = function (progress) { return (1 - (Math.pow( progress, 0.33 ))); };
5828 }
5829 if (isSliding) {
5830 var transformTarget = el;
5831 if (isLeft && activeNavBackIconText.length && params.iosAnimateNavbarBackIcon) {
5832 var textEl = { el: activeNavBackIconText[0] };
5833 transformTarget = textEl;
5834 els.push(textEl);
5835 }
5836 transformTarget.transform = function (progress) {
5837 var activeNavTranslate = progress * transformTarget.el.f7NavbarRightOffset;
5838 if (Device.pixelRatio === 1) { activeNavTranslate = Math.round(activeNavTranslate); }
5839 if (isSubnavbar && currentNavIsLarge && separateNavbar) {
5840 return ("translate3d(" + activeNavTranslate + "px, calc(-1 * var(--f7-navbar-large-collapse-progress) * var(--f7-navbar-large-title-height)), 0)");
5841 }
5842 return ("translate3d(" + activeNavTranslate + "px,0,0)");
5843 };
5844 }
5845 });
5846 $previousNavElements
5847 .each(function (index, navEl) {
5848 var $navEl = $(navEl);
5849 var isSubnavbar = $navEl.hasClass('subnavbar');
5850 var isLeft = $navEl.hasClass('left');
5851 var isTitle = $navEl.hasClass('title');
5852 var el = {
5853 el: navEl,
5854 };
5855 if (toLarge) {
5856 if (isTitle) { return; }
5857 if (els.indexOf(el) < 0) { els.push(el); }
5858
5859 if ($navEl.hasClass('title-large')) {
5860 if (!separateNavbar) { return; }
5861 if (fromLarge) {
5862 el.opacity = 1;
5863 el.overflow = 'visible';
5864 el.transform = 'translateY(0)';
5865 $navEl.find('.title-large-text').each(function (subIndex, subNavEl) {
5866 els.push({
5867 el: subNavEl,
5868 'transform-origin': transformOrigin,
5869 opacity: function (progress) { return (Math.pow( progress, 3 )); },
5870 transform: function (progress) { return ("translateY(calc(" + (-1 + progress * 1) + " * var(--f7-navbar-large-title-height))) scale(" + (0.5 + progress * 0.5) + ")"); },
5871 });
5872 });
5873 } else {
5874 el.transform = function (progress) { return ("translateY(calc(" + (progress - 1) + " * var(--f7-navbar-large-title-height)))"); };
5875 el.opacity = 1;
5876 el.overflow = 'hidden';
5877 $navEl.find('.title-large-text').each(function (subIndex, subNavEl) {
5878 els.push({
5879 el: subNavEl,
5880 'transform-origin': transformOrigin,
5881 opacity: function (progress) { return (Math.pow( progress, 3 )); },
5882 transform: function (progress) { return ("scale(" + (0.5 + progress * 0.5) + ")"); },
5883 });
5884 });
5885 }
5886 $navEl.find('.title-large-inner').each(function (subIndex, subNavEl) {
5887 els.push({
5888 el: subNavEl,
5889 'transform-origin': transformOrigin,
5890 opacity: function (progress) { return (Math.pow( progress, 3 )); },
5891 transform: function (progress) { return ("translateX(" + (-100 * (1 - progress) * inverter) + "%)"); },
5892 });
5893 });
5894 return;
5895 }
5896 }
5897 if ($navEl.hasClass('title-large')) { return; }
5d51ea26 5898 var isSliding = $navEl.hasClass('sliding') || $previousNavbarInnerEl.hasClass('sliding');
5309fbda
DC
5899 if (els.indexOf(el) < 0) { els.push(el); }
5900 if (!isSubnavbar || (isSubnavbar && !isSliding)) {
5901 el.opacity = function (progress) { return (Math.pow( progress, 3 )); };
5902 }
5903 if (isSliding) {
5904 var transformTarget = el;
5905 if (isLeft && previousNavBackIconText.length && params.iosAnimateNavbarBackIcon) {
5d51ea26 5906 var textEl = { el: previousNavBackIconText[0] };
5309fbda
DC
5907 transformTarget = textEl;
5908 els.push(textEl);
5909 }
5910 transformTarget.transform = function (progress) {
5911 var previousNavTranslate = transformTarget.el.f7NavbarLeftOffset * (1 - progress);
5912 if (Device.pixelRatio === 1) { previousNavTranslate = Math.round(previousNavTranslate); }
5913 if (isSubnavbar && previousNavIsLarge && separateNavbar) {
5914 return ("translate3d(" + previousNavTranslate + "px, calc(-1 * var(--f7-navbar-large-collapse-progress) * var(--f7-navbar-large-title-height)), 0)");
5915 }
5916 return ("translate3d(" + previousNavTranslate + "px,0,0)");
5917 };
5918 }
5919 });
5920 return els;
5921 }
5922
5923 function setAnimatableNavElements(ref) {
5924 if ( ref === void 0 ) ref = {};
5925 var progress = ref.progress;
5926 var reset = ref.reset;
5927 var transition = ref.transition;
5928
5929 var styles = ['overflow', 'transform', 'transform-origin', 'opacity'];
5930 for (var i = 0; i < animatableNavEls.length; i += 1) {
5931 var el = animatableNavEls[i];
5932 if (el && el.el) {
5933 if (transition === true) { el.el.classList.add('navbar-page-transitioning'); }
5934 if (transition === false) { el.el.classList.remove('navbar-page-transitioning'); }
5935 for (var j = 0; j < styles.length; j += 1) {
5936 var styleProp = styles[j];
5937 if (el[styleProp]) {
5938 if (reset) {
5939 el.el.style[styleProp] = '';
5940 } else if (typeof el[styleProp] === 'function') {
5941 el.el.style[styleProp] = el[styleProp](progress);
5942 } else {
5943 el.el.style[styleProp] = el[styleProp];
5944 }
5945 }
5946 }
5947 }
5948 }
5949 }
5950
5951 function handleTouchStart(e) {
5952 var swipeBackEnabled = params[((app.theme) + "SwipeBack")];
5953 if (!allowViewTouchMove || !swipeBackEnabled || isTouched || (app.swipeout && app.swipeout.el) || !router.allowPageChange) { return; }
5954 if ($(e.target).closest('.range-slider, .calendar-months').length > 0) { return; }
5955 if ($(e.target).closest('.page-master, .page-master-detail').length > 0 && params.masterDetailBreakpoint > 0 && app.width >= params.masterDetailBreakpoint) { return; }
5956 isMoved = false;
5957 isTouched = true;
5958 isScrolling = undefined;
5959 touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
5960 touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
5961 touchStartTime = Utils.now();
5962 dynamicNavbar = router.dynamicNavbar;
5963 separateNavbar = router.separateNavbar;
5964 }
5965 function handleTouchMove(e) {
5966 if (!isTouched) { return; }
5967 var pageX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;
5968 var pageY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
5969 if (typeof isScrolling === 'undefined') {
5970 isScrolling = !!(isScrolling || Math.abs(pageY - touchesStart.y) > Math.abs(pageX - touchesStart.x)) || (pageX < touchesStart.x && !app.rtl) || (pageX > touchesStart.x && app.rtl);
5971 }
5972 if (isScrolling || e.f7PreventSwipeBack || app.preventSwipeBack) {
5973 isTouched = false;
5974 return;
5975 }
5976 if (!isMoved) {
5977 // Calc values during first move fired
5978 var cancel = false;
5979 var target = $(e.target);
5980
5981 var swipeout = target.closest('.swipeout');
5982 if (swipeout.length > 0) {
5983 if (!app.rtl && swipeout.find('.swipeout-actions-left').length > 0) { cancel = true; }
5984 if (app.rtl && swipeout.find('.swipeout-actions-right').length > 0) { cancel = true; }
5985 }
5986
5d51ea26
DC
5987 $currentPageEl = target.closest('.page');
5988 if ($currentPageEl.hasClass('no-swipeback') || target.closest('.no-swipeback, .card-opened').length > 0) { cancel = true; }
5989 $previousPageEl = $el.find('.page-previous:not(.stacked)');
5990 if ($previousPageEl.length > 1) {
5991 $previousPageEl = $previousPageEl.eq($previousPageEl.length - 1);
5992 }
5309fbda
DC
5993 var notFromBorder = touchesStart.x - $el.offset().left > paramsSwipeBackActiveArea;
5994 viewContainerWidth = $el.width();
5995 if (app.rtl) {
5996 notFromBorder = touchesStart.x < ($el.offset().left - $el[0].scrollLeft) + (viewContainerWidth - paramsSwipeBackActiveArea);
5997 } else {
5998 notFromBorder = touchesStart.x - $el.offset().left > paramsSwipeBackActiveArea;
5999 }
6000 if (notFromBorder) { cancel = true; }
5d51ea26 6001 if ($previousPageEl.length === 0 || $currentPageEl.length === 0) { cancel = true; }
5309fbda
DC
6002 if (cancel) {
6003 isTouched = false;
6004 return;
6005 }
6006
6007 if (paramsSwipeBackAnimateShadow) {
5d51ea26
DC
6008 $pageShadowEl = $currentPageEl.find('.page-shadow-effect');
6009 if ($pageShadowEl.length === 0) {
6010 $pageShadowEl = $('<div class="page-shadow-effect"></div>');
6011 $currentPageEl.append($pageShadowEl);
5309fbda
DC
6012 }
6013 }
6014 if (paramsSwipeBackAnimateOpacity) {
5d51ea26
DC
6015 $pageOpacityEl = $previousPageEl.find('.page-opacity-effect');
6016 if ($pageOpacityEl.length === 0) {
6017 $pageOpacityEl = $('<div class="page-opacity-effect"></div>');
6018 $previousPageEl.append($pageOpacityEl);
5309fbda
DC
6019 }
6020 }
6021
6022 if (dynamicNavbar) {
6023 if (separateNavbar) {
5d51ea26
DC
6024 $currentNavbarInnerEl = $navbarEl.find('.navbar-current:not(.stacked)');
6025 $previousNavbarInnerEl = $navbarEl.find('.navbar-previous:not(.stacked)');
5309fbda 6026 } else {
5d51ea26
DC
6027 $currentNavbarInnerEl = $currentPageEl.children('.navbar').children('.navbar-inner');
6028 $previousNavbarInnerEl = $previousPageEl.children('.navbar').children('.navbar-inner');
6029 }
6030 if ($previousNavbarInnerEl.length > 1) {
6031 $previousNavbarInnerEl = $previousNavbarInnerEl.eq($previousNavbarInnerEl.length - 1);
5309fbda
DC
6032 }
6033
5d51ea26 6034 animatableNavEls = animatableNavElements();
5309fbda
DC
6035 }
6036
6037 // Close/Hide Any Picker
6038 if ($('.sheet.modal-in').length > 0 && app.sheet) {
6039 app.sheet.close($('.sheet.modal-in'));
6040 }
6041 }
6042 e.f7PreventPanelSwipe = true;
6043 isMoved = true;
6044 app.preventSwipePanelBySwipeBack = true;
6045 e.preventDefault();
6046
6047 // RTL inverter
6048 var inverter = app.rtl ? -1 : 1;
6049
6050 // Touches diff
6051 touchesDiff = (pageX - touchesStart.x - paramsSwipeBackThreshold) * inverter;
6052 if (touchesDiff < 0) { touchesDiff = 0; }
6053 var percentage = Math.min(Math.max(touchesDiff / viewContainerWidth, 0), 1);
6054
6055 // Swipe Back Callback
6056 var callbackData = {
6057 percentage: percentage,
6058 progress: percentage,
5d51ea26
DC
6059 currentPageEl: $currentPageEl[0],
6060 previousPageEl: $previousPageEl[0],
6061 currentNavbarEl: $currentNavbarInnerEl[0],
6062 previousNavbarEl: $previousNavbarInnerEl[0],
5309fbda
DC
6063 };
6064 $el.trigger('swipeback:move', callbackData);
6065 router.emit('swipebackMove', callbackData);
6066
6067 // Transform pages
6068 var currentPageTranslate = touchesDiff * inverter;
6069 var previousPageTranslate = ((touchesDiff / 5) - (viewContainerWidth / 5)) * inverter;
6070 if (!app.rtl) {
6071 currentPageTranslate = Math.min(currentPageTranslate, viewContainerWidth);
6072 previousPageTranslate = Math.min(previousPageTranslate, 0);
6073 } else {
6074 currentPageTranslate = Math.max(currentPageTranslate, -viewContainerWidth);
6075 previousPageTranslate = Math.max(previousPageTranslate, 0);
6076 }
6077 if (Device.pixelRatio === 1) {
6078 currentPageTranslate = Math.round(currentPageTranslate);
6079 previousPageTranslate = Math.round(previousPageTranslate);
6080 }
6081
6082 router.swipeBackActive = true;
5d51ea26 6083 $([$currentPageEl[0], $previousPageEl[0]]).addClass('page-swipeback-active');
5309fbda 6084
5d51ea26
DC
6085 $currentPageEl.transform(("translate3d(" + currentPageTranslate + "px,0,0)"));
6086 if (paramsSwipeBackAnimateShadow) { $pageShadowEl[0].style.opacity = 1 - (1 * percentage); }
5309fbda 6087
5d51ea26
DC
6088 if (app.theme === 'ios') {
6089 $previousPageEl.transform(("translate3d(" + previousPageTranslate + "px,0,0)"));
5309fbda 6090 }
5d51ea26 6091 if (paramsSwipeBackAnimateOpacity) { $pageShadowEl[0].style.opacity = 1 - (1 * percentage); }
5309fbda
DC
6092
6093 // Dynamic Navbars Animation
6094 if (!dynamicNavbar) { return; }
6095
6096 setAnimatableNavElements({ progress: percentage });
6097 }
6098 function handleTouchEnd() {
6099 app.preventSwipePanelBySwipeBack = false;
6100 if (!isTouched || !isMoved) {
6101 isTouched = false;
6102 isMoved = false;
6103 return;
6104 }
6105 isTouched = false;
6106 isMoved = false;
6107 router.swipeBackActive = false;
5d51ea26 6108 $([$currentPageEl[0], $previousPageEl[0]]).removeClass('page-swipeback-active');
5309fbda 6109 if (touchesDiff === 0) {
5d51ea26
DC
6110 $([$currentPageEl[0], $previousPageEl[0]]).transform('');
6111 if ($pageShadowEl && $pageShadowEl.length > 0) { $pageShadowEl.remove(); }
6112 if ($pageOpacityEl && $pageOpacityEl.length > 0) { $pageOpacityEl.remove(); }
5309fbda
DC
6113 if (dynamicNavbar) {
6114 setAnimatableNavElements({ reset: true });
6115 }
6116 return;
6117 }
6118 var timeDiff = Utils.now() - touchStartTime;
6119 var pageChanged = false;
6120 // Swipe back to previous page
6121 if (
6122 (timeDiff < 300 && touchesDiff > 10)
6123 || (timeDiff >= 300 && touchesDiff > viewContainerWidth / 2)
6124 ) {
5d51ea26
DC
6125 $currentPageEl.removeClass('page-current').addClass(("page-next" + (app.theme !== 'ios' ? ' page-next-on-right' : '')));
6126 $previousPageEl.removeClass('page-previous').addClass('page-current').removeAttr('aria-hidden');
6127 if ($pageShadowEl) { $pageShadowEl[0].style.opacity = ''; }
6128 if ($pageOpacityEl) { $pageOpacityEl[0].style.opacity = ''; }
5309fbda 6129 if (dynamicNavbar) {
5d51ea26
DC
6130 $currentNavbarInnerEl.removeClass('navbar-current').addClass('navbar-next');
6131 $previousNavbarInnerEl.removeClass('navbar-previous').addClass('navbar-current').removeAttr('aria-hidden');
5309fbda
DC
6132 }
6133 pageChanged = true;
6134 }
6135 // Reset custom styles
6136 // Add transitioning class for transition-duration
5d51ea26 6137 $([$currentPageEl[0], $previousPageEl[0]]).addClass('page-transitioning page-transitioning-swipeback').transform('');
5309fbda
DC
6138
6139 if (dynamicNavbar) {
6140 setAnimatableNavElements({ progress: pageChanged ? 1 : 0, transition: true });
6141 }
6142 allowViewTouchMove = false;
6143 router.allowPageChange = false;
6144
6145 // Swipe Back Callback
6146 var callbackData = {
5d51ea26
DC
6147 currentPageEl: $currentPageEl[0],
6148 previousPageEl: $previousPageEl[0],
6149 currentNavbarEl: $currentNavbarInnerEl[0],
6150 previousNavbarEl: $previousNavbarInnerEl[0],
5309fbda
DC
6151 };
6152
6153 if (pageChanged) {
6154 // Update Route
5d51ea26
DC
6155 router.currentRoute = $previousPageEl[0].f7Page.route;
6156 router.currentPage = $previousPageEl[0];
5309fbda
DC
6157
6158 // Page before animation callback
5d51ea26
DC
6159 router.pageCallback('beforeOut', $currentPageEl, $currentNavbarInnerEl, 'current', 'next', { route: $currentPageEl[0].f7Page.route, swipeBack: true });
6160 router.pageCallback('beforeIn', $previousPageEl, $previousNavbarInnerEl, 'previous', 'current', { route: $previousPageEl[0].f7Page.route, swipeBack: true }, $currentPageEl[0]);
5309fbda
DC
6161
6162 $el.trigger('swipeback:beforechange', callbackData);
6163 router.emit('swipebackBeforeChange', callbackData);
6164 } else {
6165 $el.trigger('swipeback:beforereset', callbackData);
6166 router.emit('swipebackBeforeReset', callbackData);
6167 }
6168
5d51ea26
DC
6169 $currentPageEl.transitionEnd(function () {
6170 $([$currentPageEl[0], $previousPageEl[0]]).removeClass('page-transitioning page-transitioning-swipeback');
5309fbda
DC
6171 if (dynamicNavbar) {
6172 setAnimatableNavElements({ reset: true, transition: false });
6173 }
6174 allowViewTouchMove = true;
6175 router.allowPageChange = true;
6176 if (pageChanged) {
6177 // Update History
6178 if (router.history.length === 1) {
6179 router.history.unshift(router.url);
6180 }
6181 router.history.pop();
6182 router.saveHistory();
6183
6184 // Update push state
6185 if (params.pushState) {
6186 History.back();
6187 }
6188
6189 // Page after animation callback
5d51ea26
DC
6190 router.pageCallback('afterOut', $currentPageEl, $currentNavbarInnerEl, 'current', 'next', { route: $currentPageEl[0].f7Page.route, swipeBack: true });
6191 router.pageCallback('afterIn', $previousPageEl, $previousNavbarInnerEl, 'previous', 'current', { route: $previousPageEl[0].f7Page.route, swipeBack: true });
5309fbda
DC
6192
6193 // Remove Old Page
5d51ea26
DC
6194 if (params.stackPages && router.initialPages.indexOf($currentPageEl[0]) >= 0) {
6195 $currentPageEl.addClass('stacked');
5309fbda 6196 if (separateNavbar) {
5d51ea26 6197 $currentNavbarInnerEl.addClass('stacked');
5309fbda
DC
6198 }
6199 } else {
5d51ea26
DC
6200 router.pageCallback('beforeRemove', $currentPageEl, $currentNavbarInnerEl, 'next', { swipeBack: true });
6201 router.removePage($currentPageEl);
5309fbda 6202 if (separateNavbar) {
5d51ea26 6203 router.removeNavbar($currentNavbarInnerEl);
5309fbda
DC
6204 }
6205 }
6206
6207 $el.trigger('swipeback:afterchange', callbackData);
6208 router.emit('swipebackAfterChange', callbackData);
6209
6210 router.emit('routeChanged', router.currentRoute, router.previousRoute, router);
6211
6212 if (params.preloadPreviousPage) {
6213 router.back(router.history[router.history.length - 2], { preload: true });
6214 }
6215 } else {
6216 $el.trigger('swipeback:afterreset', callbackData);
6217 router.emit('swipebackAfterReset', callbackData);
6218 }
5d51ea26
DC
6219 if ($pageShadowEl && $pageShadowEl.length > 0) { $pageShadowEl.remove(); }
6220 if ($pageOpacityEl && $pageOpacityEl.length > 0) { $pageOpacityEl.remove(); }
5309fbda
DC
6221 });
6222 }
6223
6224 function attachEvents() {
6225 var passiveListener = (app.touchEvents.start === 'touchstart' && Support.passiveListener) ? { passive: true, capture: false } : false;
6226 $el.on(app.touchEvents.start, handleTouchStart, passiveListener);
6227 app.on('touchmove:active', handleTouchMove);
6228 app.on('touchend:passive', handleTouchEnd);
6229 }
6230 function detachEvents() {
6231 var passiveListener = (app.touchEvents.start === 'touchstart' && Support.passiveListener) ? { passive: true, capture: false } : false;
6232 $el.off(app.touchEvents.start, handleTouchStart, passiveListener);
6233 app.off('touchmove:active', handleTouchMove);
6234 app.off('touchend:passive', handleTouchEnd);
6235 }
6236
6237 attachEvents();
6238
6239 router.on('routerDestroy', detachEvents);
6240 }
6241
6242 function redirect (direction, route, options) {
6243 var router = this;
6244 var redirect = route.route.redirect;
6245 if (options.initial && router.params.pushState) {
6246 options.replaceState = true; // eslint-disable-line
6247 options.history = true; // eslint-disable-line
6248 }
6249 function redirectResolve(redirectUrl, redirectOptions) {
6250 if ( redirectOptions === void 0 ) redirectOptions = {};
6251
6252 router.allowPageChange = true;
6253 router[direction](redirectUrl, Utils.extend({}, options, redirectOptions));
6254 }
6255 function redirectReject() {
6256 router.allowPageChange = true;
6257 }
6258 if (typeof redirect === 'function') {
6259 router.allowPageChange = false;
6260 var redirectUrl = redirect.call(router, route, redirectResolve, redirectReject);
6261 if (redirectUrl && typeof redirectUrl === 'string') {
6262 router.allowPageChange = true;
6263 return router[direction](redirectUrl, options);
6264 }
6265 return router;
6266 }
6267 return router[direction](redirect, options);
6268 }
6269
6270 function processQueue(router, routerQueue, routeQueue, to, from, resolve, reject) {
6271 var queue = [];
6272
6273 if (Array.isArray(routeQueue)) {
6274 queue.push.apply(queue, routeQueue);
6275 } else if (routeQueue && typeof routeQueue === 'function') {
6276 queue.push(routeQueue);
6277 }
6278 if (routerQueue) {
6279 if (Array.isArray(routerQueue)) {
6280 queue.push.apply(queue, routerQueue);
6281 } else {
6282 queue.push(routerQueue);
6283 }
6284 }
6285
6286 function next() {
6287 if (queue.length === 0) {
6288 resolve();
6289 return;
6290 }
6291 var queueItem = queue.shift();
6292
6293 queueItem.call(
6294 router,
6295 to,
6296 from,
6297 function () {
6298 next();
6299 },
6300 function () {
6301 reject();
6302 }
6303 );
6304 }
6305 next();
6306 }
6307
6308 function processRouteQueue (to, from, resolve, reject) {
6309 var router = this;
6310 function enterNextRoute() {
6311 if (to && to.route && (router.params.routesBeforeEnter || to.route.beforeEnter)) {
6312 router.allowPageChange = false;
6313 processQueue(
6314 router,
6315 router.params.routesBeforeEnter,
6316 to.route.beforeEnter,
6317 to,
6318 from,
6319 function () {
6320 router.allowPageChange = true;
6321 resolve();
6322 },
6323 function () {
6324 reject();
6325 }
6326 );
6327 } else {
6328 resolve();
6329 }
6330 }
6331 function leaveCurrentRoute() {
6332 if (from && from.route && (router.params.routesBeforeLeave || from.route.beforeLeave)) {
6333 router.allowPageChange = false;
6334 processQueue(
6335 router,
6336 router.params.routesBeforeLeave,
6337 from.route.beforeLeave,
6338 to,
6339 from,
6340 function () {
6341 router.allowPageChange = true;
6342 enterNextRoute();
6343 },
6344 function () {
6345 reject();
6346 }
6347 );
6348 } else {
6349 enterNextRoute();
6350 }
6351 }
6352 leaveCurrentRoute();
6353 }
6354
6355 function appRouterCheck (router, method) {
6356 if (!router.view) {
6357 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 + "(...)"));
6358 }
6359 }
6360
6361 function refreshPage() {
6362 var router = this;
6363 appRouterCheck(router, 'refreshPage');
6364 return router.navigate(router.currentRoute.url, {
6365 ignoreCache: true,
6366 reloadCurrent: true,
6367 });
6368 }
6369
6370 function forward(el, forwardOptions) {
6371 if ( forwardOptions === void 0 ) forwardOptions = {};
6372
6373 var router = this;
6374 var $el = $(el);
6375 var app = router.app;
6376 var view = router.view;
6377 var options = Utils.extend(false, {
6378 animate: router.params.animate,
6379 pushState: true,
6380 replaceState: false,
6381 history: true,
6382 reloadCurrent: router.params.reloadPages,
6383 reloadPrevious: false,
6384 reloadAll: false,
6385 clearPreviousHistory: false,
6386 reloadDetail: router.params.reloadDetail,
6387 on: {},
6388 }, forwardOptions);
6389
6390 var masterDetailEnabled = router.params.masterDetailBreakpoint > 0;
6391 var isMaster = masterDetailEnabled && options.route && options.route.route && options.route.route.master === true;
6392 var masterPageEl;
6393 var otherDetailPageEl;
6394
6395 var currentRouteIsModal = router.currentRoute.modal;
6396 var modalType;
6397 if (!currentRouteIsModal) {
6398 ('popup popover sheet loginScreen actions customModal panel').split(' ').forEach(function (modalLoadProp) {
6399 if (router.currentRoute && router.currentRoute.route && router.currentRoute.route[modalLoadProp]) {
6400 currentRouteIsModal = true;
6401 modalType = modalLoadProp;
6402 }
6403 });
6404 }
6405
6406 if (currentRouteIsModal) {
6407 var modalToClose = router.currentRoute.modal
6408 || router.currentRoute.route.modalInstance
6409 || app[modalType].get();
6410 var previousUrl = router.history[router.history.length - 2];
6411 var previousRoute = router.findMatchingRoute(previousUrl);
6412 if (!previousRoute && previousUrl) {
6413 previousRoute = {
6414 url: previousUrl,
6415 path: previousUrl.split('?')[0],
6416 query: Utils.parseUrlQuery(previousUrl),
6417 route: {
6418 path: previousUrl.split('?')[0],
6419 url: previousUrl,
6420 },
6421 };
6422 }
6423
6424 router.modalRemove(modalToClose);
6425 }
6426
6427 var dynamicNavbar = router.dynamicNavbar;
6428 var separateNavbar = router.separateNavbar;
6429
6430 var $viewEl = router.$el;
6431 var $newPage = $el;
6432 var reload = options.reloadPrevious || options.reloadCurrent || options.reloadAll;
6433 var $oldPage;
6434
6435 var $navbarEl;
6436 var $newNavbarInner;
6437 var $oldNavbarInner;
6438
6439 router.allowPageChange = false;
6440 if ($newPage.length === 0) {
6441 router.allowPageChange = true;
6442 return router;
6443 }
6444
6445 if ($newPage.length) {
6446 // Remove theme elements
6447 router.removeThemeElements($newPage);
6448 }
6449
6450 if (dynamicNavbar) {
6451 $newNavbarInner = $newPage.children('.navbar').children('.navbar-inner');
6452 if (separateNavbar) {
6453 $navbarEl = router.$navbarEl;
6454 if ($newNavbarInner.length > 0) {
6455 $newPage.children('.navbar').remove();
6456 }
6457 if ($newNavbarInner.length === 0 && $newPage[0] && $newPage[0].f7Page) {
6458 // Try from pageData
6459 $newNavbarInner = $newPage[0].f7Page.$navbarEl;
6460 }
6461 }
6462 }
6463
6464 // Save Keep Alive Cache
6465 if (options.route && options.route.route && options.route.route.keepAlive && !options.route.route.keepAliveData) {
6466 options.route.route.keepAliveData = {
6467 pageEl: $el[0],
6468 };
6469 }
6470
6471 // Pages In View
6472 var $pagesInView = $viewEl
6473 .children('.page:not(.stacked)')
6474 .filter(function (index, pageInView) { return pageInView !== $newPage[0]; });
6475
6476 // Navbars In View
6477 var $navbarsInView;
6478 if (separateNavbar) {
6479 $navbarsInView = $navbarEl
6480 .children('.navbar-inner:not(.stacked)')
6481 .filter(function (index, navbarInView) { return navbarInView !== $newNavbarInner[0]; });
6482 }
6483
6484 // Exit when reload previous and only 1 page in view so nothing ro reload
6485 if (options.reloadPrevious && $pagesInView.length < 2) {
6486 router.allowPageChange = true;
6487 return router;
6488 }
6489
6490 // Find Detail' master page
6491 var isDetail;
6492 var reloadDetail;
6493 if (masterDetailEnabled && !options.reloadAll) {
6494 for (var i = 0; i < $pagesInView.length; i += 1) {
6495 if (!masterPageEl
6496 && $pagesInView[i].classList.contains('page-master')
6497 ) {
6498 masterPageEl = $pagesInView[i];
6499 continue; // eslint-disable-line
6500 }
6501 }
6502 isDetail = !isMaster && masterPageEl;
6503
6504 if (isDetail) {
6505 // Find Other Detail
6506 if (masterPageEl) {
6507 for (var i$1 = 0; i$1 < $pagesInView.length; i$1 += 1) {
6508 if ($pagesInView[i$1].classList.contains('page-master-detail')
6509 ) {
6510 otherDetailPageEl = $pagesInView[i$1];
6511 continue; // eslint-disable-line
6512 }
6513 }
6514 }
6515 }
6516 reloadDetail = isDetail && options.reloadDetail && app.width >= router.params.masterDetailBreakpoint && masterPageEl;
6517 }
6518
6519 // New Page
6520 var newPagePosition = 'next';
6521 if (options.reloadCurrent || options.reloadAll || reloadDetail) {
6522 newPagePosition = 'current';
6523 } else if (options.reloadPrevious) {
6524 newPagePosition = 'previous';
6525 }
6526 $newPage
5d51ea26 6527 .removeClass('page-previous page-current page-next')
5309fbda
DC
6528 .addClass(("page-" + newPagePosition + (isMaster ? ' page-master' : '') + (isDetail ? ' page-master-detail' : '')))
6529 .removeClass('stacked')
6530 .trigger('page:unstack')
6531 .trigger('page:position', { position: newPagePosition });
5d51ea26
DC
6532 router.emit('pageUnstack', $newPage[0]);
6533 router.emit('pagePosition', $newPage[0], newPagePosition);
6534
5309fbda
DC
6535 if (isMaster || isDetail) {
6536 $newPage.trigger('page:role', { role: isMaster ? 'master' : 'detail' });
6537 }
6538
6539
6540 if (dynamicNavbar && $newNavbarInner.length) {
6541 $newNavbarInner
5d51ea26 6542 .removeClass('navbar-previous navbar-current navbar-next')
5309fbda
DC
6543 .addClass(("navbar-" + newPagePosition + (isMaster ? ' navbar-master' : '') + (isDetail ? ' navbar-master-detail' : '')))
6544 .removeClass('stacked');
6545 }
6546
6547 // Find Old Page
6548 if (options.reloadCurrent || reloadDetail) {
6549 $oldPage = $pagesInView.eq($pagesInView.length - 1);
6550 if (separateNavbar) {
6551 // $oldNavbarInner = $navbarsInView.eq($pagesInView.length - 1);
6552 $oldNavbarInner = $(app.navbar.getElByPage($oldPage));
6553 }
6554 } else if (options.reloadPrevious) {
6555 $oldPage = $pagesInView.eq($pagesInView.length - 2);
6556 if (separateNavbar) {
6557 // $oldNavbarInner = $navbarsInView.eq($pagesInView.length - 2);
6558 $oldNavbarInner = $(app.navbar.getElByPage($oldPage));
6559 }
6560 } else if (options.reloadAll) {
6561 $oldPage = $pagesInView.filter(function (index, pageEl) { return pageEl !== $newPage[0]; });
6562 if (separateNavbar) {
6563 $oldNavbarInner = $navbarsInView.filter(function (index, navbarEl) { return navbarEl !== $newNavbarInner[0]; });
6564 }
6565 } else {
6566 if ($pagesInView.length > 1) {
6567 var i$2 = 0;
6568 for (i$2 = 0; i$2 < $pagesInView.length - 1; i$2 += 1) {
6569 if (masterPageEl
6570 && $pagesInView[i$2] === masterPageEl
6571 ) {
6572 $pagesInView.eq(i$2).addClass('page-master-stacked');
6573 $pagesInView.eq(i$2).trigger('page:masterstack');
5d51ea26 6574 router.emit('pageMasterStack', $pagesInView[i$2]);
5309fbda
DC
6575 if (separateNavbar) {
6576 $(app.navbar.getElByPage(masterPageEl)).addClass('navbar-master-stacked');
6577 }
6578 continue; // eslint-disable-line
6579 }
6580 var oldNavbarInnerEl = app.navbar.getElByPage($pagesInView.eq(i$2));
6581 if (router.params.stackPages) {
6582 $pagesInView.eq(i$2).addClass('stacked');
6583 $pagesInView.eq(i$2).trigger('page:stack');
5d51ea26 6584 router.emit('pageStack', $pagesInView[i$2]);
5309fbda
DC
6585 if (separateNavbar) {
6586 $(oldNavbarInnerEl).addClass('stacked');
6587 }
6588 } else {
6589 // Page remove event
6590 router.pageCallback('beforeRemove', $pagesInView[i$2], $navbarsInView && $navbarsInView[i$2], 'previous', undefined, options);
6591 router.removePage($pagesInView[i$2]);
6592 if (separateNavbar && oldNavbarInnerEl) {
6593 router.removeNavbar(oldNavbarInnerEl);
6594 }
6595 }
6596 }
6597 }
6598 $oldPage = $viewEl
6599 .children('.page:not(.stacked)')
6600 .filter(function (index, page) { return page !== $newPage[0]; });
6601 if (separateNavbar) {
6602 $oldNavbarInner = $navbarEl
6603 .children('.navbar-inner:not(.stacked)')
6604 .filter(function (index, navbarInner) { return navbarInner !== $newNavbarInner[0]; });
6605 }
6606 }
6607
6608 if (dynamicNavbar && !separateNavbar) {
6609 $oldNavbarInner = $oldPage.children('.navbar').children('.navbar-inner');
6610 }
6611 if (isDetail && !options.reloadAll) {
6612 if ($oldPage.length > 1 || reloadDetail) {
6613 $oldPage = $oldPage.filter(function (pageIndex, pageEl) { return !pageEl.classList.contains('page-master'); });
6614 }
6615 if ($oldNavbarInner && ($oldNavbarInner.length > 1 || reloadDetail)) {
6616 $oldNavbarInner = $oldNavbarInner.filter(function (navbarIndex, navbarEl) { return !navbarEl.classList.contains('navbar-master'); });
6617 }
6618 }
6619
6620 // Push State
6621 if (router.params.pushState && (options.pushState || options.replaceState) && !options.reloadPrevious) {
6622 var pushStateRoot = router.params.pushStateRoot || '';
6623 History[options.reloadCurrent || (reloadDetail && otherDetailPageEl) || options.reloadAll || options.replaceState ? 'replace' : 'push'](
6624 view.id,
6625 {
6626 url: options.route.url,
6627 },
6628 pushStateRoot + router.params.pushStateSeparator + options.route.url
6629 );
6630 }
6631
6632 if (!options.reloadPrevious) {
6633 // Current Page & Navbar
6634 router.currentPageEl = $newPage[0];
6635 if (dynamicNavbar && $newNavbarInner.length) {
6636 router.currentNavbarEl = $newNavbarInner[0];
6637 } else {
6638 delete router.currentNavbarEl;
6639 }
6640
6641 // Current Route
6642 router.currentRoute = options.route;
6643 }
6644
6645 // Update router history
6646 var url = options.route.url;
6647
6648 if (options.history) {
6649 if (((options.reloadCurrent || (reloadDetail && otherDetailPageEl)) && router.history.length) > 0 || options.replaceState) {
6650 router.history[router.history.length - (options.reloadPrevious ? 2 : 1)] = url;
6651 } else if (options.reloadPrevious) {
6652 router.history[router.history.length - 2] = url;
6653 } else if (options.reloadAll) {
6654 router.history = [url];
6655 } else {
6656 router.history.push(url);
6657 }
6658 }
6659 router.saveHistory();
6660
6661 // Insert new page and navbar
6662 var newPageInDom = $newPage.parents(doc).length > 0;
6663 var f7Component = $newPage[0].f7Component;
6664 if (options.reloadPrevious) {
6665 if (f7Component && !newPageInDom) {
6666 f7Component.$mount(function (componentEl) {
6667 $(componentEl).insertBefore($oldPage);
6668 });
6669 } else {
6670 $newPage.insertBefore($oldPage);
6671 }
6672 if (separateNavbar && $newNavbarInner.length) {
6673 if ($newNavbarInner.children('.title-large').length) {
6674 $newNavbarInner.addClass('navbar-inner-large');
6675 }
6676 if ($oldNavbarInner.length) {
6677 $newNavbarInner.insertBefore($oldNavbarInner);
6678 } else {
6679 if (!router.$navbarEl.parents(doc).length) {
6680 router.$el.prepend(router.$navbarEl);
6681 }
6682 $navbarEl.append($newNavbarInner);
6683 }
6684 }
6685 } else {
6686 if ($oldPage.next('.page')[0] !== $newPage[0]) {
6687 if (f7Component && !newPageInDom) {
6688 f7Component.$mount(function (componentEl) {
6689 $viewEl.append(componentEl);
6690 });
6691 } else {
6692 $viewEl.append($newPage[0]);
6693 }
6694 }
6695 if (separateNavbar && $newNavbarInner.length) {
6696 if ($newNavbarInner.children('.title-large').length) {
6697 $newNavbarInner.addClass('navbar-inner-large');
6698 }
6699 if (!router.$navbarEl.parents(doc).length) {
6700 router.$el.prepend(router.$navbarEl);
6701 }
6702 $navbarEl.append($newNavbarInner[0]);
6703 }
6704 }
6705 if (!newPageInDom) {
6706 router.pageCallback('mounted', $newPage, $newNavbarInner, newPagePosition, reload ? newPagePosition : 'current', options, $oldPage);
6707 } else if (options.route && options.route.route && options.route.route.keepAlive && !$newPage[0].f7PageMounted) {
6708 $newPage[0].f7PageMounted = true;
6709 router.pageCallback('mounted', $newPage, $newNavbarInner, newPagePosition, reload ? newPagePosition : 'current', options, $oldPage);
6710 }
6711
6712 // Remove old page
6713 if ((options.reloadCurrent || reloadDetail) && $oldPage.length > 0) {
6714 if (router.params.stackPages && router.initialPages.indexOf($oldPage[0]) >= 0) {
6715 $oldPage.addClass('stacked');
6716 $oldPage.trigger('page:stack');
5d51ea26 6717 router.emit('pageStack', $oldPage[0]);
5309fbda
DC
6718 if (separateNavbar) {
6719 $oldNavbarInner.addClass('stacked');
6720 }
6721 } else {
6722 // Page remove event
5d51ea26
DC
6723 router.pageCallback('beforeOut', $oldPage, $oldNavbarInner, 'current', undefined, options);
6724 router.pageCallback('afterOut', $oldPage, $oldNavbarInner, 'current', undefined, options);
6725 router.pageCallback('beforeRemove', $oldPage, $oldNavbarInner, 'current', undefined, options);
5309fbda
DC
6726 router.removePage($oldPage);
6727 if (separateNavbar && $oldNavbarInner && $oldNavbarInner.length) {
6728 router.removeNavbar($oldNavbarInner);
6729 }
6730 }
6731 } else if (options.reloadAll) {
6732 $oldPage.each(function (index, pageEl) {
6733 var $oldPageEl = $(pageEl);
6734 var $oldNavbarInnerEl = $(app.navbar.getElByPage($oldPageEl));
6735 if (router.params.stackPages && router.initialPages.indexOf($oldPageEl[0]) >= 0) {
6736 $oldPageEl.addClass('stacked');
6737 $oldPageEl.trigger('page:stack');
5d51ea26 6738 router.emit('pageStack', $oldPageEl[0]);
5309fbda
DC
6739 if (separateNavbar) {
6740 $oldNavbarInnerEl.addClass('stacked');
6741 }
6742 } else {
6743 // Page remove event
5d51ea26
DC
6744 if ($oldPageEl.hasClass('page-current')) {
6745 router.pageCallback('beforeOut', $oldPage, $oldNavbarInner, 'current', undefined, options);
6746 router.pageCallback('afterOut', $oldPage, $oldNavbarInner, 'current', undefined, options);
6747 }
5309fbda
DC
6748 router.pageCallback('beforeRemove', $oldPageEl, $oldNavbarInner && $oldNavbarInner.eq(index), 'previous', undefined, options);
6749 router.removePage($oldPageEl);
6750 if (separateNavbar && $oldNavbarInnerEl.length) {
6751 router.removeNavbar($oldNavbarInnerEl);
6752 }
6753 }
6754 });
6755 } else if (options.reloadPrevious) {
6756 if (router.params.stackPages && router.initialPages.indexOf($oldPage[0]) >= 0) {
6757 $oldPage.addClass('stacked');
6758 $oldPage.trigger('page:stack');
5d51ea26 6759 router.emit('pageStack', $oldPage[0]);
5309fbda
DC
6760 if (separateNavbar) {
6761 $oldNavbarInner.addClass('stacked');
6762 }
6763 } else {
6764 // Page remove event
6765 router.pageCallback('beforeRemove', $oldPage, $oldNavbarInner, 'previous', undefined, options);
6766 router.removePage($oldPage);
6767 if (separateNavbar && $oldNavbarInner && $oldNavbarInner.length) {
6768 router.removeNavbar($oldNavbarInner);
6769 }
6770 }
6771 }
6772
6773 // Load Tab
6774 if (options.route.route.tab) {
6775 router.tabLoad(options.route.route.tab, Utils.extend({}, options, {
6776 history: false,
6777 pushState: false,
6778 }));
6779 }
6780
6781 // Page init and before init events
6782 router.pageCallback('init', $newPage, $newNavbarInner, newPagePosition, reload ? newPagePosition : 'current', options, $oldPage);
6783
6784 if (options.reloadCurrent || options.reloadAll || reloadDetail) {
6785 router.allowPageChange = true;
6786 router.pageCallback('beforeIn', $newPage, $newNavbarInner, newPagePosition, 'current', options);
5d51ea26
DC
6787 $newPage.removeAttr('aria-hidden');
6788 if (dynamicNavbar && $newNavbarInner) {
6789 $newNavbarInner.removeAttr('aria-hidden');
6790 }
5309fbda
DC
6791 router.pageCallback('afterIn', $newPage, $newNavbarInner, newPagePosition, 'current', options);
6792 if (options.reloadCurrent && options.clearPreviousHistory) { router.clearPreviousHistory(); }
6793 if (reloadDetail) {
6794 masterPageEl.classList.add('page-previous');
6795 masterPageEl.classList.remove('page-current');
6796 $(masterPageEl).trigger('page:position', { position: 'previous' });
5d51ea26
DC
6797 router.emit('pagePosition', masterPageEl, 'previous');
6798
5309fbda
DC
6799 if (masterPageEl.f7Page && masterPageEl.f7Page.navbarEl) {
6800 masterPageEl.f7Page.navbarEl.classList.add('navbar-previous');
6801 masterPageEl.f7Page.navbarEl.classList.remove('navbar-current');
6802 }
6803 }
6804 return router;
6805 }
6806 if (options.reloadPrevious) {
6807 router.allowPageChange = true;
6808 return router;
6809 }
6810
6811 // Before animation event
5309fbda 6812 router.pageCallback('beforeOut', $oldPage, $oldNavbarInner, 'current', 'previous', options);
5d51ea26 6813 router.pageCallback('beforeIn', $newPage, $newNavbarInner, 'next', 'current', options);
5309fbda
DC
6814
6815 // Animation
6816 function afterAnimation() {
6817 var pageClasses = 'page-previous page-current page-next';
6818 var navbarClasses = 'navbar-previous navbar-current navbar-next';
6819 $newPage.removeClass(pageClasses).addClass('page-current').removeAttr('aria-hidden').trigger('page:position', { position: 'current' });
5d51ea26 6820 router.emit('pagePosition', $newPage[0], 'current');
5309fbda 6821 $oldPage.removeClass(pageClasses).addClass('page-previous').trigger('page:position', { position: 'previous' });
5d51ea26
DC
6822 router.emit('pagePosition', $oldPage[0], 'previous');
6823
5309fbda
DC
6824 if (!$oldPage.hasClass('page-master')) {
6825 $oldPage.attr('aria-hidden', 'true');
6826 }
6827 if (dynamicNavbar) {
6828 $newNavbarInner.removeClass(navbarClasses).addClass('navbar-current').removeAttr('aria-hidden');
6829 $oldNavbarInner.removeClass(navbarClasses).addClass('navbar-previous');
6830 if (!$oldNavbarInner.hasClass('navbar-master')) {
6831 $oldNavbarInner.attr('aria-hidden', 'true');
6832 }
6833 }
6834 // After animation event
6835 router.allowPageChange = true;
5309fbda 6836 router.pageCallback('afterOut', $oldPage, $oldNavbarInner, 'current', 'previous', options);
5d51ea26 6837 router.pageCallback('afterIn', $newPage, $newNavbarInner, 'next', 'current', options);
5309fbda 6838
5d51ea26 6839 var keepOldPage = (router.params.preloadPreviousPage || router.params[((app.theme) + "SwipeBack")]) && !isMaster;
5309fbda 6840 if (!keepOldPage) {
5d51ea26 6841 if ($newPage.hasClass('smart-select-page') || $newPage.hasClass('photo-browser-page') || $newPage.hasClass('autocomplete-page') || $newPage.hasClass('color-picker-page')) {
5309fbda
DC
6842 keepOldPage = true;
6843 }
6844 }
6845 if (!keepOldPage) {
6846 if (router.params.stackPages) {
6847 $oldPage.addClass('stacked');
6848 $oldPage.trigger('page:stack');
5d51ea26 6849 router.emit('pageStack', $oldPage[0]);
5309fbda
DC
6850 if (separateNavbar) {
6851 $oldNavbarInner.addClass('stacked');
6852 }
6853 } else if (!($newPage.attr('data-name') && $newPage.attr('data-name') === 'smart-select-page')) {
6854 // Remove event
6855 router.pageCallback('beforeRemove', $oldPage, $oldNavbarInner, 'previous', undefined, options);
6856 router.removePage($oldPage);
6857 if (separateNavbar && $oldNavbarInner.length) {
6858 router.removeNavbar($oldNavbarInner);
6859 }
6860 }
6861 }
6862 if (options.clearPreviousHistory) { router.clearPreviousHistory(); }
6863 router.emit('routeChanged', router.currentRoute, router.previousRoute, router);
6864
6865 if (router.params.pushState) {
6866 History.clearRouterQueue();
6867 }
6868 }
6869 function setPositionClasses() {
6870 var pageClasses = 'page-previous page-current page-next';
6871 var navbarClasses = 'navbar-previous navbar-current navbar-next';
6872 $oldPage.removeClass(pageClasses).addClass('page-current').removeAttr('aria-hidden').trigger('page:position', { position: 'current' });
5d51ea26 6873 router.emit('pagePosition', $oldPage[0], 'current');
5309fbda 6874 $newPage.removeClass(pageClasses).addClass('page-next').removeAttr('aria-hidden').trigger('page:position', { position: 'next' });
5d51ea26 6875 router.emit('pagePosition', $newPage[0], 'next');
5309fbda
DC
6876 if (dynamicNavbar) {
6877 $oldNavbarInner.removeClass(navbarClasses).addClass('navbar-current').removeAttr('aria-hidden');
6878 $newNavbarInner.removeClass(navbarClasses).addClass('navbar-next').removeAttr('aria-hidden');
6879 }
6880 }
6881 if (options.animate && !(isMaster && app.width >= router.params.masterDetailBreakpoint)) {
5d51ea26 6882 var delay = router.params[((router.app.theme) + "PageLoadDelay")];
5309fbda
DC
6883 if (delay) {
6884 setTimeout(function () {
6885 setPositionClasses();
6886 router.animate($oldPage, $newPage, $oldNavbarInner, $newNavbarInner, 'forward', function () {
6887 afterAnimation();
6888 });
6889 }, delay);
6890 } else {
6891 setPositionClasses();
6892 router.animate($oldPage, $newPage, $oldNavbarInner, $newNavbarInner, 'forward', function () {
6893 afterAnimation();
6894 });
6895 }
6896 } else {
6897 afterAnimation();
6898 }
6899 return router;
6900 }
6901 function load(loadParams, loadOptions, ignorePageChange) {
6902 if ( loadParams === void 0 ) loadParams = {};
6903 if ( loadOptions === void 0 ) loadOptions = {};
6904
6905 var router = this;
6906 if (!router.allowPageChange && !ignorePageChange) { return router; }
6907 var params = loadParams;
6908 var options = loadOptions;
6909 var url = params.url;
6910 var content = params.content;
6911 var el = params.el;
6912 var pageName = params.pageName;
6913 var template = params.template;
6914 var templateUrl = params.templateUrl;
6915 var component = params.component;
6916 var componentUrl = params.componentUrl;
6917
6918 if (!options.reloadCurrent
6919 && options.route
6920 && options.route.route
6921 && options.route.route.parentPath
6922 && router.currentRoute.route
6923 && router.currentRoute.route.parentPath === options.route.route.parentPath) {
6924 // Do something nested
6925 if (options.route.url === router.url) {
6926 router.allowPageChange = true;
6927 return false;
6928 }
6929 // Check for same params
6930 var sameParams = Object.keys(options.route.params).length === Object.keys(router.currentRoute.params).length;
6931 if (sameParams) {
6932 // Check for equal params name
6933 Object.keys(options.route.params).forEach(function (paramName) {
6934 if (
6935 !(paramName in router.currentRoute.params)
6936 || (router.currentRoute.params[paramName] !== options.route.params[paramName])
6937 ) {
6938 sameParams = false;
6939 }
6940 });
6941 }
6942 if (sameParams) {
6943 if (options.route.route.tab) {
6944 return router.tabLoad(options.route.route.tab, options);
6945 }
6946 return false;
6947 }
6948 if (!sameParams
6949 && options.route.route.tab
6950 && router.currentRoute.route.tab
6951 && router.currentRoute.parentPath === options.route.parentPath
6952 ) {
6953 return router.tabLoad(options.route.route.tab, options);
6954 }
6955 }
6956
6957 if (
6958 options.route
6959 && options.route.url
6960 && router.url === options.route.url
6961 && !(options.reloadCurrent || options.reloadPrevious)
6962 && !router.params.allowDuplicateUrls
6963 ) {
6964 router.allowPageChange = true;
6965 return false;
6966 }
6967
6968 if (!options.route && url) {
6969 options.route = router.parseRouteUrl(url);
6970 Utils.extend(options.route, { route: { url: url, path: url } });
6971 }
6972
6973 // Component Callbacks
6974 function resolve(pageEl, newOptions) {
6975 return router.forward(pageEl, Utils.extend(options, newOptions));
6976 }
6977 function reject() {
6978 router.allowPageChange = true;
6979 return router;
6980 }
6981
6982 if (url || templateUrl || componentUrl) {
6983 router.allowPageChange = false;
6984 }
6985
6986 // Proceed
6987 if (content) {
6988 router.forward(router.getPageEl(content), options);
6989 } else if (template || templateUrl) {
6990 // Parse template and send page element
6991 try {
6992 router.pageTemplateLoader(template, templateUrl, options, resolve, reject);
6993 } catch (err) {
6994 router.allowPageChange = true;
6995 throw err;
6996 }
6997 } else if (el) {
6998 // Load page from specified HTMLElement or by page name in pages container
6999 router.forward(router.getPageEl(el), options);
7000 } else if (pageName) {
7001 // Load page by page name in pages container
7002 router.forward(router.$el.children((".page[data-name=\"" + pageName + "\"]")).eq(0), options);
7003 } else if (component || componentUrl) {
7004 // Load from component (F7/Vue/React/...)
7005 try {
7006 router.pageComponentLoader(router.el, component, componentUrl, options, resolve, reject);
7007 } catch (err) {
7008 router.allowPageChange = true;
7009 throw err;
7010 }
7011 } else if (url) {
7012 // Load using XHR
7013 if (router.xhr) {
7014 router.xhr.abort();
7015 router.xhr = false;
7016 }
7017 router.xhrRequest(url, options)
7018 .then(function (pageContent) {
7019 router.forward(router.getPageEl(pageContent), options);
7020 })
7021 .catch(function () {
7022 router.allowPageChange = true;
7023 });
7024 }
7025 return router;
7026 }
7027 function navigate(navigateParams, navigateOptions) {
7028 if ( navigateOptions === void 0 ) navigateOptions = {};
7029
7030 var router = this;
7031 if (router.swipeBackActive) { return router; }
7032 var url;
7033 var createRoute;
7034 var name;
7035 var query;
7036 var params;
7037 var route;
7038 if (typeof navigateParams === 'string') {
7039 url = navigateParams;
7040 } else {
7041 url = navigateParams.url;
7042 createRoute = navigateParams.route;
7043 name = navigateParams.name;
7044 query = navigateParams.query;
7045 params = navigateParams.params;
7046 }
7047 if (name) {
7048 // find route by name
7049 route = router.findRouteByKey('name', name);
7050 if (!route) {
7051 throw new Error(("Framework7: route with name \"" + name + "\" not found"));
7052 }
7053 url = router.constructRouteUrl(route, { params: params, query: query });
7054 if (url) {
7055 return router.navigate(url, navigateOptions);
7056 }
7057 throw new Error(("Framework7: can't construct URL for route with name \"" + name + "\""));
7058 }
7059 var app = router.app;
7060 appRouterCheck(router, 'navigate');
7061 if (url === '#' || url === '') {
7062 return router;
7063 }
7064
7065 var navigateUrl = url.replace('./', '');
7066 if (navigateUrl[0] !== '/' && navigateUrl.indexOf('#') !== 0) {
7067 var currentPath = router.currentRoute.parentPath || router.currentRoute.path;
7068 navigateUrl = ((currentPath ? (currentPath + "/") : '/') + navigateUrl)
7069 .replace('///', '/')
7070 .replace('//', '/');
7071 }
7072 if (createRoute) {
7073 route = Utils.extend(router.parseRouteUrl(navigateUrl), {
7074 route: Utils.extend({}, createRoute),
7075 });
7076 } else {
7077 route = router.findMatchingRoute(navigateUrl);
7078 }
7079
7080 if (!route) {
7081 return router;
7082 }
7083
7084 if (route.route.redirect) {
7085 return redirect.call(router, 'navigate', route, navigateOptions);
7086 }
7087
7088
7089 var options = {};
7090 if (route.route.options) {
7091 Utils.extend(options, route.route.options, navigateOptions);
7092 } else {
7093 Utils.extend(options, navigateOptions);
7094 }
7095 options.route = route;
7096
7097 if (options && options.context) {
7098 route.context = options.context;
7099 options.route.context = options.context;
7100 }
7101
7102 function resolve() {
7103 var routerLoaded = false;
7104 ('popup popover sheet loginScreen actions customModal panel').split(' ').forEach(function (modalLoadProp) {
7105 if (route.route[modalLoadProp] && !routerLoaded) {
7106 routerLoaded = true;
7107 router.modalLoad(modalLoadProp, route, options);
7108 }
7109 });
7110 if (route.route.keepAlive && route.route.keepAliveData) {
7111 router.load({ el: route.route.keepAliveData.pageEl }, options, false);
7112 routerLoaded = true;
7113 }
7114 ('url content component pageName el componentUrl template templateUrl').split(' ').forEach(function (pageLoadProp) {
7115 var obj;
7116
7117 if (route.route[pageLoadProp] && !routerLoaded) {
7118 routerLoaded = true;
7119 router.load(( obj = {}, obj[pageLoadProp] = route.route[pageLoadProp], obj ), options, false);
7120 }
7121 });
7122 if (routerLoaded) { return; }
7123 // Async
7124 function asyncResolve(resolveParams, resolveOptions) {
7125 router.allowPageChange = false;
7126 var resolvedAsModal = false;
7127 if (resolveOptions && resolveOptions.context) {
7128 if (!route.context) { route.context = resolveOptions.context; }
7129 else { route.context = Utils.extend({}, route.context, resolveOptions.context); }
7130 options.route.context = route.context;
7131 }
7132 ('popup popover sheet loginScreen actions customModal panel').split(' ').forEach(function (modalLoadProp) {
7133 if (resolveParams[modalLoadProp]) {
7134 resolvedAsModal = true;
7135 var modalRoute = Utils.extend({}, route, { route: resolveParams });
7136 router.allowPageChange = true;
7137 router.modalLoad(modalLoadProp, modalRoute, Utils.extend(options, resolveOptions));
7138 }
7139 });
7140 if (resolvedAsModal) { return; }
7141 router.load(resolveParams, Utils.extend(options, resolveOptions), true);
7142 }
7143 function asyncReject() {
7144 router.allowPageChange = true;
7145 }
7146 if (route.route.async) {
7147 router.allowPageChange = false;
7148
7149 route.route.async.call(router, options.route, router.currentRoute, asyncResolve, asyncReject);
7150 }
7151 }
7152 function reject() {
7153 router.allowPageChange = true;
7154 }
7155
7156 if (router.params.masterDetailBreakpoint > 0 && route.route.masterRoute) {
7157 // load detail route
7158 var preloadMaster = true;
5d51ea26 7159 var masterLoaded = false;
5309fbda 7160 if (router.currentRoute && router.currentRoute.route) {
5d51ea26
DC
7161 if (
7162 router.currentRoute.route.master
7163 && (
7164 router.currentRoute.route === route.route.masterRoute
7165 || router.currentRoute.route.path === route.route.masterRoute.path
7166 )
7167 ) {
5309fbda
DC
7168 preloadMaster = false;
7169 }
5d51ea26
DC
7170 if (
7171 router.currentRoute.route.masterRoute
7172 && (router.currentRoute.route.masterRoute === route.route.masterRoute
7173 || router.currentRoute.route.masterRoute.path === route.route.masterRoute.path
7174 )
7175 ) {
5309fbda 7176 preloadMaster = false;
5d51ea26 7177 masterLoaded = true;
5309fbda
DC
7178 }
7179 }
5d51ea26 7180 if (preloadMaster || (masterLoaded && navigateOptions.reloadAll)) {
5309fbda
DC
7181 router.navigate(route.route.masterRoute.path, {
7182 animate: false,
7183 reloadAll: navigateOptions.reloadAll,
7184 reloadCurrent: navigateOptions.reloadCurrent,
7185 reloadPrevious: navigateOptions.reloadPrevious,
5d51ea26
DC
7186 pushState: !navigateOptions.initial,
7187 history: !navigateOptions.initial,
5309fbda
DC
7188 once: {
7189 pageAfterIn: function pageAfterIn() {
7190 router.navigate(navigateParams, Utils.extend({}, navigateOptions, {
7191 animate: false,
7192 reloadAll: false,
7193 reloadCurrent: false,
7194 reloadPrevious: false,
5d51ea26
DC
7195 history: !navigateOptions.initial,
7196 pushState: !navigateOptions.initial,
5309fbda
DC
7197 }));
7198 },
7199 },
7200 });
7201 return router;
7202 }
7203 }
7204
7205 processRouteQueue.call(
7206 router,
7207 route,
7208 router.currentRoute,
7209 function () {
7210 if (route.route.modules) {
7211 app
7212 .loadModules(Array.isArray(route.route.modules) ? route.route.modules : [route.route.modules])
7213 .then(function () {
7214 resolve();
7215 })
7216 .catch(function () {
7217 reject();
7218 });
7219 } else {
7220 resolve();
7221 }
7222 },
7223 function () {
7224 reject();
7225 }
7226 );
7227
7228 // Return Router
7229 return router;
7230 }
7231
7232 function tabLoad(tabRoute, loadOptions) {
7233 if ( loadOptions === void 0 ) loadOptions = {};
7234
7235 var router = this;
7236 var options = Utils.extend({
7237 animate: router.params.animate,
7238 pushState: true,
7239 history: true,
7240 parentPageEl: null,
7241 preload: false,
7242 on: {},
7243 }, loadOptions);
7244
7245 var currentRoute;
7246 var previousRoute;
7247 if (options.route) {
7248 // Set Route
7249 if (!options.preload && options.route !== router.currentRoute) {
7250 previousRoute = router.previousRoute;
7251 router.currentRoute = options.route;
7252 }
7253 if (options.preload) {
7254 currentRoute = options.route;
7255 previousRoute = router.currentRoute;
7256 } else {
7257 currentRoute = router.currentRoute;
7258 if (!previousRoute) { previousRoute = router.previousRoute; }
7259 }
7260
7261 // Update Browser History
7262 if (router.params.pushState && options.pushState && !options.reloadPrevious) {
7263 History.replace(
7264 router.view.id,
7265 {
7266 url: options.route.url,
7267 },
7268 (router.params.pushStateRoot || '') + router.params.pushStateSeparator + options.route.url
7269 );
7270 }
7271
7272 // Update Router History
7273 if (options.history) {
7274 router.history[Math.max(router.history.length - 1, 0)] = options.route.url;
7275 router.saveHistory();
7276 }
7277 }
7278
7279 // Show Tab
7280 var $parentPageEl = $(options.parentPageEl || router.currentPageEl);
7281 var tabEl;
7282 if ($parentPageEl.length && $parentPageEl.find(("#" + (tabRoute.id))).length) {
7283 tabEl = $parentPageEl.find(("#" + (tabRoute.id))).eq(0);
7284 } else if (router.view.selector) {
7285 tabEl = (router.view.selector) + " #" + (tabRoute.id);
7286 } else {
7287 tabEl = "#" + (tabRoute.id);
7288 }
7289 var tabShowResult = router.app.tab.show({
7290 tabEl: tabEl,
7291 animate: options.animate,
7292 tabRoute: options.route,
7293 });
7294
7295 var $newTabEl = tabShowResult.$newTabEl;
7296 var $oldTabEl = tabShowResult.$oldTabEl;
7297 var animated = tabShowResult.animated;
7298 var onTabsChanged = tabShowResult.onTabsChanged;
7299
7300 if ($newTabEl && $newTabEl.parents('.page').length > 0 && options.route) {
7301 var tabParentPageData = $newTabEl.parents('.page')[0].f7Page;
7302 if (tabParentPageData && options.route) {
7303 tabParentPageData.route = options.route;
7304 }
7305 }
7306
7307 // Tab Content Loaded
7308 function onTabLoaded(contentEl) {
7309 // Remove theme elements
7310 router.removeThemeElements($newTabEl);
7311
7312 var tabEventTarget = $newTabEl;
7313 if (typeof contentEl !== 'string') { tabEventTarget = $(contentEl); }
7314
7315 tabEventTarget.trigger('tab:init tab:mounted', tabRoute);
7316 router.emit('tabInit tabMounted', $newTabEl[0], tabRoute);
7317
7318 if ($oldTabEl && $oldTabEl.length) {
7319 if (animated) {
7320 onTabsChanged(function () {
7321 router.emit('routeChanged', router.currentRoute, router.previousRoute, router);
7322 if (router.params.unloadTabContent) {
7323 router.tabRemove($oldTabEl, $newTabEl, tabRoute);
7324 }
7325 });
7326 } else {
7327 router.emit('routeChanged', router.currentRoute, router.previousRoute, router);
7328 if (router.params.unloadTabContent) {
7329 router.tabRemove($oldTabEl, $newTabEl, tabRoute);
7330 }
7331 }
7332 }
7333 }
7334
7335 if ($newTabEl[0].f7RouterTabLoaded) {
7336 if (!$oldTabEl || !$oldTabEl.length) { return router; }
7337 if (animated) {
7338 onTabsChanged(function () {
7339 router.emit('routeChanged', router.currentRoute, router.previousRoute, router);
7340 });
7341 } else {
7342 router.emit('routeChanged', router.currentRoute, router.previousRoute, router);
7343 }
7344 return router;
7345 }
7346
7347 // Load Tab Content
7348 function loadTab(loadTabParams, loadTabOptions) {
7349 // Load Tab Props
7350 var url = loadTabParams.url;
7351 var content = loadTabParams.content;
7352 var el = loadTabParams.el;
7353 var template = loadTabParams.template;
7354 var templateUrl = loadTabParams.templateUrl;
7355 var component = loadTabParams.component;
7356 var componentUrl = loadTabParams.componentUrl;
7357 // Component/Template Callbacks
7358 function resolve(contentEl) {
7359 router.allowPageChange = true;
7360 if (!contentEl) { return; }
7361 if (typeof contentEl === 'string') {
7362 $newTabEl.html(contentEl);
7363 } else {
7364 $newTabEl.html('');
7365 if (contentEl.f7Component) {
7366 contentEl.f7Component.$mount(function (componentEl) {
7367 $newTabEl.append(componentEl);
7368 });
7369 } else {
7370 $newTabEl.append(contentEl);
7371 }
7372 }
7373 $newTabEl[0].f7RouterTabLoaded = true;
7374 onTabLoaded(contentEl);
7375 }
7376 function reject() {
7377 router.allowPageChange = true;
7378 return router;
7379 }
7380
7381 if (content) {
7382 resolve(content);
7383 } else if (template || templateUrl) {
7384 try {
7385 router.tabTemplateLoader(template, templateUrl, loadTabOptions, resolve, reject);
7386 } catch (err) {
7387 router.allowPageChange = true;
7388 throw err;
7389 }
7390 } else if (el) {
7391 resolve(el);
7392 } else if (component || componentUrl) {
7393 // Load from component (F7/Vue/React/...)
7394 try {
7395 router.tabComponentLoader($newTabEl[0], component, componentUrl, loadTabOptions, resolve, reject);
7396 } catch (err) {
7397 router.allowPageChange = true;
7398 throw err;
7399 }
7400 } else if (url) {
7401 // Load using XHR
7402 if (router.xhr) {
7403 router.xhr.abort();
7404 router.xhr = false;
7405 }
7406 router.xhrRequest(url, loadTabOptions)
7407 .then(function (tabContent) {
7408 resolve(tabContent);
7409 })
7410 .catch(function () {
7411 router.allowPageChange = true;
7412 });
7413 }
7414 }
7415
7416 var hasContentLoadProp;
7417 ('url content component el componentUrl template templateUrl').split(' ').forEach(function (tabLoadProp) {
7418 var obj;
7419
7420 if (tabRoute[tabLoadProp]) {
7421 hasContentLoadProp = true;
7422 loadTab(( obj = {}, obj[tabLoadProp] = tabRoute[tabLoadProp], obj ), options);
7423 }
7424 });
7425
7426 // Async
7427 function asyncResolve(resolveParams, resolveOptions) {
7428 loadTab(resolveParams, Utils.extend(options, resolveOptions));
7429 }
7430 function asyncReject() {
7431 router.allowPageChange = true;
7432 }
7433 if (tabRoute.async) {
7434 tabRoute.async.call(router, currentRoute, previousRoute, asyncResolve, asyncReject);
7435 } else if (!hasContentLoadProp) {
7436 router.allowPageChange = true;
7437 }
7438
7439 return router;
7440 }
7441 function tabRemove($oldTabEl, $newTabEl, tabRoute) {
7442 var router = this;
7443
7444 var hasTabComponentChild;
7445 if ($oldTabEl[0]) {
7446 $oldTabEl[0].f7RouterTabLoaded = false;
7447 delete $oldTabEl[0].f7RouterTabLoaded;
7448 }
7449 $oldTabEl.children().each(function (index, tabChild) {
7450 if (tabChild.f7Component) {
7451 hasTabComponentChild = true;
7452 $(tabChild).trigger('tab:beforeremove', tabRoute);
7453 tabChild.f7Component.$destroy();
7454 }
7455 });
7456 if (!hasTabComponentChild) {
7457 $oldTabEl.trigger('tab:beforeremove', tabRoute);
7458 }
7459 router.emit('tabBeforeRemove', $oldTabEl[0], $newTabEl[0], tabRoute);
7460 router.removeTabContent($oldTabEl[0], tabRoute);
7461 }
7462
7463 function modalLoad(modalType, route, loadOptions) {
7464 if ( loadOptions === void 0 ) loadOptions = {};
7465
7466 var router = this;
7467 var app = router.app;
7468 var isPanel = modalType === 'panel';
7469 var modalOrPanel = isPanel ? 'panel' : 'modal';
7470
7471 var options = Utils.extend({
7472 animate: router.params.animate,
7473 pushState: true,
7474 history: true,
7475 on: {},
7476 }, loadOptions);
7477
7478 var modalParams = Utils.extend({}, route.route[modalType]);
7479 var modalRoute = route.route;
7480
7481 function onModalLoaded() {
7482 // Create Modal
7483 var modal = app[modalType].create(modalParams);
7484 modalRoute.modalInstance = modal;
7485
7486 var hasEl = modal.el;
7487
7488 function closeOnSwipeBack() {
7489 modal.close();
7490 }
7491 modal.on((modalOrPanel + "Open"), function () {
7492 if (!hasEl) {
7493 // Remove theme elements
7494 router.removeThemeElements(modal.el);
7495
7496 // Emit events
7497 modal.$el.trigger(((modalType.toLowerCase()) + ":init " + (modalType.toLowerCase()) + ":mounted"), route, modal);
7498 router.emit(((!isPanel ? 'modalInit' : '') + " " + modalType + "Init " + modalType + "Mounted"), modal.el, route, modal);
7499 }
7500 router.once('swipeBackMove', closeOnSwipeBack);
7501 });
7502 modal.on((modalOrPanel + "Close"), function () {
7503 router.off('swipeBackMove', closeOnSwipeBack);
7504 if (!modal.closeByRouter) {
7505 router.back();
7506 }
7507 });
7508
7509 modal.on((modalOrPanel + "Closed"), function () {
7510 modal.$el.trigger(((modalType.toLowerCase()) + ":beforeremove"), route, modal);
7511 modal.emit(("" + (!isPanel ? 'modalBeforeRemove ' : '') + modalType + "BeforeRemove"), modal.el, route, modal);
7512 var modalComponent = modal.el.f7Component;
7513 if (modalComponent) {
7514 modalComponent.$destroy();
7515 }
7516 Utils.nextTick(function () {
7517 if (modalComponent || modalParams.component) {
7518 router.removeModal(modal.el);
7519 }
7520 modal.destroy();
7521 delete modal.route;
7522 delete modalRoute.modalInstance;
7523 });
7524 });
7525
7526 if (options.route) {
7527 // Update Browser History
7528 if (router.params.pushState && options.pushState) {
7529 History.push(
7530 router.view.id,
7531 {
7532 url: options.route.url,
7533 modal: modalType,
7534 },
7535 (router.params.pushStateRoot || '') + router.params.pushStateSeparator + options.route.url
7536 );
7537 }
7538
7539 // Set Route
7540 if (options.route !== router.currentRoute) {
7541 modal.route = Utils.extend(options.route, { modal: modal });
7542 router.currentRoute = modal.route;
7543 }
7544
7545 // Update Router History
7546 if (options.history) {
7547 router.history.push(options.route.url);
7548 router.saveHistory();
7549 }
7550 }
7551
7552 if (hasEl) {
7553 // Remove theme elements
7554 router.removeThemeElements(modal.el);
7555
7556 // Emit events
7557 modal.$el.trigger(((modalType.toLowerCase()) + ":init " + (modalType.toLowerCase()) + ":mounted"), route, modal);
7558 router.emit((modalOrPanel + "Init " + modalType + "Init " + modalType + "Mounted"), modal.el, route, modal);
7559 }
7560
7561 // Open
7562 modal.open();
7563 }
7564
7565 // Load Modal Content
7566 function loadModal(loadModalParams, loadModalOptions) {
7567 // Load Modal Props
7568 var url = loadModalParams.url;
7569 var content = loadModalParams.content;
7570 var template = loadModalParams.template;
7571 var templateUrl = loadModalParams.templateUrl;
7572 var component = loadModalParams.component;
7573 var componentUrl = loadModalParams.componentUrl;
7574
7575 // Component/Template Callbacks
7576 function resolve(contentEl) {
7577 if (contentEl) {
7578 if (typeof contentEl === 'string') {
7579 modalParams.content = contentEl;
7580 } else if (contentEl.f7Component) {
7581 contentEl.f7Component.$mount(function (componentEl) {
7582 modalParams.el = componentEl;
7583 app.root.append(componentEl);
7584 });
7585 } else {
7586 modalParams.el = contentEl;
7587 }
7588 onModalLoaded();
7589 }
7590 }
7591 function reject() {
7592 router.allowPageChange = true;
7593 return router;
7594 }
7595
7596 if (content) {
7597 resolve(content);
7598 } else if (template || templateUrl) {
7599 try {
7600 router.modalTemplateLoader(template, templateUrl, loadModalOptions, resolve, reject);
7601 } catch (err) {
7602 router.allowPageChange = true;
7603 throw err;
7604 }
7605 } else if (component || componentUrl) {
7606 // Load from component (F7/Vue/React/...)
7607 try {
7608 router.modalComponentLoader(app.root[0], component, componentUrl, loadModalOptions, resolve, reject);
7609 } catch (err) {
7610 router.allowPageChange = true;
7611 throw err;
7612 }
7613 } else if (url) {
7614 // Load using XHR
7615 if (router.xhr) {
7616 router.xhr.abort();
7617 router.xhr = false;
7618 }
7619 router.xhrRequest(url, loadModalOptions)
7620 .then(function (modalContent) {
7621 modalParams.content = modalContent;
7622 onModalLoaded();
7623 })
7624 .catch(function () {
7625 router.allowPageChange = true;
7626 });
7627 } else {
7628 onModalLoaded();
7629 }
7630 }
7631
7632 var foundLoadProp;
7633 ('url content component el componentUrl template templateUrl').split(' ').forEach(function (modalLoadProp) {
7634 var obj;
7635
7636 if (modalParams[modalLoadProp] && !foundLoadProp) {
7637 foundLoadProp = true;
7638 loadModal(( obj = {}, obj[modalLoadProp] = modalParams[modalLoadProp], obj ), options);
7639 }
7640 });
7641 if (!foundLoadProp && modalType === 'actions') {
7642 onModalLoaded();
7643 }
7644
7645 // Async
7646 function asyncResolve(resolveParams, resolveOptions) {
7647 loadModal(resolveParams, Utils.extend(options, resolveOptions));
7648 }
7649 function asyncReject() {
7650 router.allowPageChange = true;
7651 }
7652 if (modalParams.async) {
7653 modalParams.async.call(router, options.route, router.currentRoute, asyncResolve, asyncReject);
7654 }
7655 return router;
7656 }
7657 function modalRemove(modal) {
7658 Utils.extend(modal, { closeByRouter: true });
7659 modal.close();
7660 }
7661
7662 function backward(el, backwardOptions) {
7663 var router = this;
7664 var $el = $(el);
7665 var app = router.app;
7666 var view = router.view;
7667
7668 var options = Utils.extend({
7669 animate: router.params.animate,
7670 pushState: true,
5d51ea26 7671 replaceState: false,
5309fbda
DC
7672 }, backwardOptions);
7673
7674 var masterDetailEnabled = router.params.masterDetailBreakpoint > 0;
7675 var isMaster = masterDetailEnabled && options.route && options.route.route && options.route.route.master === true;
7676 var masterPageEl;
7677
7678 var dynamicNavbar = router.dynamicNavbar;
7679 var separateNavbar = router.separateNavbar;
7680
7681 var $newPage = $el;
7682 var $oldPage = router.$el.children('.page-current');
7683 var currentIsMaster = masterDetailEnabled && $oldPage.hasClass('page-master');
7684
7685 if ($newPage.length) {
7686 // Remove theme elements
7687 router.removeThemeElements($newPage);
7688 }
7689
7690 var $navbarEl;
7691 var $newNavbarInner;
7692 var $oldNavbarInner;
7693
7694 if (dynamicNavbar) {
7695 $newNavbarInner = $newPage.children('.navbar').children('.navbar-inner');
7696 if (separateNavbar) {
7697 $navbarEl = router.$navbarEl;
7698 if ($newNavbarInner.length > 0) {
7699 $newPage.children('.navbar').remove();
7700 }
7701 if ($newNavbarInner.length === 0 && $newPage[0] && $newPage[0].f7Page) {
7702 // Try from pageData
7703 $newNavbarInner = $newPage[0].f7Page.$navbarEl;
7704 }
7705 $oldNavbarInner = $navbarEl.find('.navbar-current');
7706 } else {
7707 $oldNavbarInner = $oldPage.children('.navbar').children('.navbar-inner');
7708 }
7709 }
7710
7711 router.allowPageChange = false;
7712 if ($newPage.length === 0 || $oldPage.length === 0) {
7713 router.allowPageChange = true;
7714 return router;
7715 }
7716
7717 // Remove theme elements
7718 router.removeThemeElements($newPage);
7719
7720 // Save Keep Alive Cache
7721 if (options.route && options.route.route && options.route.route.keepAlive && !options.route.route.keepAliveData) {
7722 options.route.route.keepAliveData = {
7723 pageEl: $el[0],
7724 };
7725 }
7726
7727 // Pages In View
7728 var isDetail;
7729 if (masterDetailEnabled) {
7730 var $pagesInView = router.$el
7731 .children('.page:not(.stacked)')
7732 .filter(function (index, pageInView) { return pageInView !== $newPage[0]; });
7733
7734 // Find Detail' master page
7735 for (var i = 0; i < $pagesInView.length; i += 1) {
7736 if (!masterPageEl
7737 && $pagesInView[i].classList.contains('page-master')
7738 ) {
7739 masterPageEl = $pagesInView[i];
7740 continue; // eslint-disable-line
7741 }
7742 }
7743
7744 isDetail = !isMaster
7745 && masterPageEl
7746 && (router.history.indexOf(options.route.url) > router.history.indexOf(masterPageEl.f7Page.route.url));
5d51ea26
DC
7747
7748 if (!isDetail && !isMaster && masterPageEl && masterPageEl.f7Page && options.route.route.masterRoute) {
7749 isDetail = options.route.route.masterRoute.path === masterPageEl.f7Page.route.route.path;
7750 }
5309fbda
DC
7751 }
7752
7753
7754 // New Page
7755 $newPage
7756 .addClass(("page-previous" + (isMaster ? ' page-master' : '') + (isDetail ? ' page-master-detail' : '')))
7757 .removeClass('stacked')
7758 .removeAttr('aria-hidden')
7759 .trigger('page:unstack')
7760 .trigger('page:position', { position: 'previous' });
5d51ea26
DC
7761 router.emit('pageUnstack', $newPage[0]);
7762 router.emit('pagePosition', $newPage[0], 'previous');
5309fbda
DC
7763 if (isMaster || isDetail) {
7764 $newPage.trigger('page:role', { role: isMaster ? 'master' : 'detail' });
7765 }
7766
7767 if (dynamicNavbar && $newNavbarInner.length > 0) {
7768 $newNavbarInner
7769 .addClass(("navbar-previous" + (isMaster ? ' navbar-master' : '') + (isDetail ? ' navbar-master-detail' : '')))
7770 .removeClass('stacked')
7771 .removeAttr('aria-hidden');
7772 }
7773
7774 // Remove previous page in case of "forced"
7775 var backIndex;
7776 if (options.force) {
7777 if ($oldPage.prev('.page-previous:not(.stacked)').length > 0 || $oldPage.prev('.page-previous').length === 0) {
7778 if (router.history.indexOf(options.route.url) >= 0) {
7779 backIndex = router.history.length - router.history.indexOf(options.route.url) - 1;
7780 router.history = router.history.slice(0, router.history.indexOf(options.route.url) + 2);
7781 view.history = router.history;
7782 } else if (router.history[[router.history.length - 2]]) {
7783 router.history[router.history.length - 2] = options.route.url;
7784 } else {
7785 router.history.unshift(router.url);
7786 }
7787
7788 if (backIndex && router.params.stackPages) {
7789 $oldPage.prevAll('.page-previous').each(function (index, pageToRemove) {
7790 var $pageToRemove = $(pageToRemove);
7791 var $navbarToRemove;
7792 if (separateNavbar) {
7793 // $navbarToRemove = $oldNavbarInner.prevAll('.navbar-previous').eq(index);
7794 $navbarToRemove = $(app.navbar.getElByPage($pageToRemove));
7795 }
7796 if ($pageToRemove[0] !== $newPage[0] && $pageToRemove.index() > $newPage.index()) {
7797 if (router.initialPages.indexOf($pageToRemove[0]) >= 0) {
7798 $pageToRemove.addClass('stacked');
7799 $pageToRemove.trigger('page:stack');
5d51ea26 7800 router.emit('pageStack', $pageToRemove[0]);
5309fbda
DC
7801 if (separateNavbar) {
7802 $navbarToRemove.addClass('stacked');
7803 }
7804 } else {
7805 router.pageCallback('beforeRemove', $pageToRemove, $navbarToRemove, 'previous', undefined, options);
7806 router.removePage($pageToRemove);
7807 if (separateNavbar && $navbarToRemove.length > 0) {
7808 router.removeNavbar($navbarToRemove);
7809 }
7810 }
7811 }
7812 });
7813 } else {
7814 var $pageToRemove = $oldPage.prev('.page-previous:not(.stacked)');
7815 var $navbarToRemove;
7816 if (separateNavbar) {
7817 // $navbarToRemove = $oldNavbarInner.prev('.navbar-inner:not(.stacked)');
7818 $navbarToRemove = $(app.navbar.getElByPage($pageToRemove));
7819 }
7820 if (router.params.stackPages && router.initialPages.indexOf($pageToRemove[0]) >= 0) {
7821 $pageToRemove.addClass('stacked');
7822 $pageToRemove.trigger('page:stack');
5d51ea26 7823 router.emit('pageStack', $pageToRemove[0]);
5309fbda
DC
7824 $navbarToRemove.addClass('stacked');
7825 } else if ($pageToRemove.length > 0) {
7826 router.pageCallback('beforeRemove', $pageToRemove, $navbarToRemove, 'previous', undefined, options);
7827 router.removePage($pageToRemove);
7828 if (separateNavbar && $navbarToRemove.length) {
7829 router.removeNavbar($navbarToRemove);
7830 }
7831 }
7832 }
7833 }
7834 }
7835
7836 // Insert new page
7837 var newPageInDom = $newPage.parents(doc).length > 0;
7838 var f7Component = $newPage[0].f7Component;
7839
7840 function insertPage() {
7841 if ($newPage.next($oldPage).length === 0) {
7842 if (!newPageInDom && f7Component) {
7843 f7Component.$mount(function (componentEl) {
7844 $(componentEl).insertBefore($oldPage);
7845 });
7846 } else {
7847 $newPage.insertBefore($oldPage);
7848 }
7849 }
7850 if (separateNavbar && $newNavbarInner.length) {
7851 if ($newNavbarInner.children('.title-large').length) {
7852 $newNavbarInner.addClass('navbar-inner-large');
7853 }
7854 $newNavbarInner.insertBefore($oldNavbarInner);
7855 if ($oldNavbarInner.length > 0) {
7856 $newNavbarInner.insertBefore($oldNavbarInner);
7857 } else {
7858 if (!router.$navbarEl.parents(doc).length) {
7859 router.$el.prepend(router.$navbarEl);
7860 }
7861 $navbarEl.append($newNavbarInner);
7862 }
7863 }
7864 if (!newPageInDom) {
7865 router.pageCallback('mounted', $newPage, $newNavbarInner, 'previous', 'current', options, $oldPage);
7866 } else if (options.route && options.route.route && options.route.route.keepAlive && !$newPage[0].f7PageMounted) {
7867 $newPage[0].f7PageMounted = true;
7868 router.pageCallback('mounted', $newPage, $newNavbarInner, 'previous', 'current', options, $oldPage);
7869 }
7870 }
7871
7872 if (options.preload) {
7873 // Insert Page
7874 insertPage();
7875 // Tab route
7876 if (options.route.route.tab) {
7877 router.tabLoad(options.route.route.tab, Utils.extend({}, options, {
7878 history: false,
7879 pushState: false,
7880 preload: true,
7881 }));
7882 }
7883 if (isMaster) {
7884 $newPage
7885 .removeClass('page-master-stacked')
7886 .trigger('page:masterunstack');
5d51ea26 7887 router.emit('pageMasterUnstack', $newPage[0]);
5309fbda
DC
7888 if (separateNavbar) {
7889 $(app.navbar.getElByPage($newPage)).removeClass('navbar-master-stacked');
7890 }
7891 }
7892 // Page init and before init events
7893 router.pageCallback('init', $newPage, $newNavbarInner, 'previous', 'current', options, $oldPage);
7894 var $previousPages = $newPage.prevAll('.page-previous:not(.stacked):not(.page-master)');
7895 if ($previousPages.length > 0) {
7896 $previousPages.each(function (index, pageToRemove) {
7897 var $pageToRemove = $(pageToRemove);
7898 var $navbarToRemove;
7899 if (separateNavbar) {
7900 // $navbarToRemove = $newNavbarInner.prevAll('.navbar-previous:not(.stacked)').eq(index);
7901 $navbarToRemove = $(app.navbar.getElByPage($pageToRemove));
7902 }
7903 if (router.params.stackPages && router.initialPages.indexOf(pageToRemove) >= 0) {
7904 $pageToRemove.addClass('stacked');
7905 $pageToRemove.trigger('page:stack');
5d51ea26 7906 router.emit('pageStack', $pageToRemove[0]);
5309fbda
DC
7907 if (separateNavbar) {
7908 $navbarToRemove.addClass('stacked');
7909 }
7910 } else {
7911 router.pageCallback('beforeRemove', $pageToRemove, $navbarToRemove, 'previous', undefined);
7912 router.removePage($pageToRemove);
7913 if (separateNavbar && $navbarToRemove.length) {
7914 router.removeNavbar($navbarToRemove);
7915 }
7916 }
7917 });
7918 }
7919 router.allowPageChange = true;
7920 return router;
7921 }
7922
7923 // History State
7924 if (!(Device.ie || Device.edge || (Device.firefox && !Device.ios))) {
7925 if (router.params.pushState && options.pushState) {
5d51ea26
DC
7926 if (options.replaceState) {
7927 var pushStateRoot = router.params.pushStateRoot || '';
7928 History.replace(
7929 view.id,
7930 {
7931 url: options.route.url,
7932 },
7933 pushStateRoot + router.params.pushStateSeparator + options.route.url
7934 );
7935 } else if (backIndex) {
7936 History.go(-backIndex);
7937 } else {
7938 History.back();
7939 }
5309fbda
DC
7940 }
7941 }
7942
7943 // Update History
5d51ea26
DC
7944 if (options.replaceState) {
7945 router.history[router.history.length - 1] = options.route.url;
7946 } else {
7947 if (router.history.length === 1) {
7948 router.history.unshift(router.url);
7949 }
7950 router.history.pop();
5309fbda 7951 }
5309fbda
DC
7952 router.saveHistory();
7953
7954 // Current Page & Navbar
7955 router.currentPageEl = $newPage[0];
7956 if (dynamicNavbar && $newNavbarInner.length) {
7957 router.currentNavbarEl = $newNavbarInner[0];
7958 } else {
7959 delete router.currentNavbarEl;
7960 }
7961
7962 // Current Route
7963 router.currentRoute = options.route;
7964
7965 // History State
7966 if (Device.ie || Device.edge || (Device.firefox && !Device.ios)) {
7967 if (router.params.pushState && options.pushState) {
5d51ea26
DC
7968 if (options.replaceState) {
7969 var pushStateRoot$1 = router.params.pushStateRoot || '';
7970 History.replace(
7971 view.id,
7972 {
7973 url: options.route.url,
7974 },
7975 pushStateRoot$1 + router.params.pushStateSeparator + options.route.url
7976 );
7977 } else if (backIndex) {
7978 History.go(-backIndex);
7979 } else {
7980 History.back();
7981 }
5309fbda
DC
7982 }
7983 }
7984
7985 // Insert Page
7986 insertPage();
7987
7988 // Load Tab
7989 if (options.route.route.tab) {
7990 router.tabLoad(options.route.route.tab, Utils.extend({}, options, {
7991 history: false,
7992 pushState: false,
7993 }));
7994 }
7995
7996 // Page init and before init events
7997 router.pageCallback('init', $newPage, $newNavbarInner, 'previous', 'current', options, $oldPage);
7998
7999 // Before animation callback
5309fbda 8000 router.pageCallback('beforeOut', $oldPage, $oldNavbarInner, 'current', 'next', options);
5d51ea26 8001 router.pageCallback('beforeIn', $newPage, $newNavbarInner, 'previous', 'current', options);
5309fbda
DC
8002
8003 // Animation
8004 function afterAnimation() {
8005 // Set classes
8006 var pageClasses = 'page-previous page-current page-next';
8007 var navbarClasses = 'navbar-previous navbar-current navbar-next';
8008 $newPage.removeClass(pageClasses).addClass('page-current').removeAttr('aria-hidden').trigger('page:position', { position: 'current' });
5d51ea26 8009 router.emit('pagePosition', $newPage[0], 'current');
5309fbda 8010 $oldPage.removeClass(pageClasses).addClass('page-next').attr('aria-hidden', 'true').trigger('page:position', { position: 'next' });
5d51ea26 8011 router.emit('pagePosition', $oldPage[0], 'next');
5309fbda
DC
8012 if (dynamicNavbar) {
8013 $newNavbarInner.removeClass(navbarClasses).addClass('navbar-current').removeAttr('aria-hidden');
8014 $oldNavbarInner.removeClass(navbarClasses).addClass('navbar-next').attr('aria-hidden', 'true');
8015 }
8016
8017 // After animation event
5309fbda 8018 router.pageCallback('afterOut', $oldPage, $oldNavbarInner, 'current', 'next', options);
5d51ea26 8019 router.pageCallback('afterIn', $newPage, $newNavbarInner, 'previous', 'current', options);
5309fbda
DC
8020
8021 // Remove Old Page
8022 if (router.params.stackPages && router.initialPages.indexOf($oldPage[0]) >= 0) {
8023 $oldPage.addClass('stacked');
8024 $oldPage.trigger('page:stack');
5d51ea26 8025 router.emit('pageStack', $oldPage[0]);
5309fbda
DC
8026 if (separateNavbar) {
8027 $oldNavbarInner.addClass('stacked');
8028 }
8029 } else {
8030 router.pageCallback('beforeRemove', $oldPage, $oldNavbarInner, 'next', undefined, options);
8031 router.removePage($oldPage);
8032 if (separateNavbar && $oldNavbarInner.length) {
8033 router.removeNavbar($oldNavbarInner);
8034 }
8035 }
8036
8037 router.allowPageChange = true;
8038 router.emit('routeChanged', router.currentRoute, router.previousRoute, router);
8039
8040 // Preload previous page
5d51ea26 8041 var preloadPreviousPage = router.params.preloadPreviousPage || router.params[((app.theme) + "SwipeBack")];
5309fbda
DC
8042 if (preloadPreviousPage && router.history[router.history.length - 2] && !isMaster) {
8043 router.back(router.history[router.history.length - 2], { preload: true });
8044 }
8045 if (router.params.pushState) {
8046 History.clearRouterQueue();
8047 }
8048 }
8049
8050 function setPositionClasses() {
8051 var pageClasses = 'page-previous page-current page-next';
8052 var navbarClasses = 'navbar-previous navbar-current navbar-next';
8053 $oldPage.removeClass(pageClasses).addClass('page-current').trigger('page:position', { position: 'current' });
5d51ea26 8054 router.emit('pagePosition', $oldPage[0], 'current');
5309fbda 8055 $newPage.removeClass(pageClasses).addClass('page-previous').removeAttr('aria-hidden').trigger('page:position', { position: 'previous' });
5d51ea26 8056 router.emit('pagePosition', $newPage[0], 'previous');
5309fbda
DC
8057 if (dynamicNavbar) {
8058 $oldNavbarInner.removeClass(navbarClasses).addClass('navbar-current');
8059 $newNavbarInner.removeClass(navbarClasses).addClass('navbar-previous').removeAttr('aria-hidden');
8060 }
8061 }
8062
8063 if (options.animate && !(currentIsMaster && app.width >= router.params.masterDetailBreakpoint)) {
8064 setPositionClasses();
8065 router.animate($oldPage, $newPage, $oldNavbarInner, $newNavbarInner, 'backward', function () {
8066 afterAnimation();
8067 });
8068 } else {
8069 afterAnimation();
8070 }
8071
8072 return router;
8073 }
8074 function loadBack(backParams, backOptions, ignorePageChange) {
8075 var router = this;
8076
8077 if (!router.allowPageChange && !ignorePageChange) { return router; }
8078 var params = backParams;
8079 var options = backOptions;
8080 var url = params.url;
8081 var content = params.content;
8082 var el = params.el;
8083 var pageName = params.pageName;
8084 var template = params.template;
8085 var templateUrl = params.templateUrl;
8086 var component = params.component;
8087 var componentUrl = params.componentUrl;
8088
8089 if (
8090 options.route.url
8091 && router.url === options.route.url
8092 && !(options.reloadCurrent || options.reloadPrevious)
8093 && !router.params.allowDuplicateUrls
8094 ) {
8095 return false;
8096 }
8097
8098 if (!options.route && url) {
8099 options.route = router.parseRouteUrl(url);
8100 }
8101
8102 // Component Callbacks
8103 function resolve(pageEl, newOptions) {
8104 return router.backward(pageEl, Utils.extend(options, newOptions));
8105 }
8106 function reject() {
8107 router.allowPageChange = true;
8108 return router;
8109 }
8110
8111 if (url || templateUrl || componentUrl) {
8112 router.allowPageChange = false;
8113 }
8114
8115 // Proceed
8116 if (content) {
8117 router.backward(router.getPageEl(content), options);
8118 } else if (template || templateUrl) {
8119 // Parse template and send page element
8120 try {
8121 router.pageTemplateLoader(template, templateUrl, options, resolve, reject);
8122 } catch (err) {
8123 router.allowPageChange = true;
8124 throw err;
8125 }
8126 } else if (el) {
8127 // Load page from specified HTMLElement or by page name in pages container
8128 router.backward(router.getPageEl(el), options);
8129 } else if (pageName) {
8130 // Load page by page name in pages container
8131 router.backward(router.$el.children((".page[data-name=\"" + pageName + "\"]")).eq(0), options);
8132 } else if (component || componentUrl) {
8133 // Load from component (F7/Vue/React/...)
8134 try {
8135 router.pageComponentLoader(router.el, component, componentUrl, options, resolve, reject);
8136 } catch (err) {
8137 router.allowPageChange = true;
8138 throw err;
8139 }
8140 } else if (url) {
8141 // Load using XHR
8142 if (router.xhr) {
8143 router.xhr.abort();
8144 router.xhr = false;
8145 }
8146 router.xhrRequest(url, options)
8147 .then(function (pageContent) {
8148 router.backward(router.getPageEl(pageContent), options);
8149 })
8150 .catch(function () {
8151 router.allowPageChange = true;
8152 });
8153 }
8154 return router;
8155 }
8156 function back() {
8157 var args = [], len = arguments.length;
8158 while ( len-- ) args[ len ] = arguments[ len ];
8159
8160 var router = this;
8161 if (router.swipeBackActive) { return router; }
8162 var navigateUrl;
8163 var navigateOptions;
8164 var route;
8165 if (typeof args[0] === 'object') {
8166 navigateOptions = args[0] || {};
8167 } else {
8168 navigateUrl = args[0];
8169 navigateOptions = args[1] || {};
8170 }
8171
8172 var name = navigateOptions.name;
8173 var params = navigateOptions.params;
8174 var query = navigateOptions.query;
8175 if (name) {
8176 // find route by name
8177 route = router.findRouteByKey('name', name);
8178 if (!route) {
8179 throw new Error(("Framework7: route with name \"" + name + "\" not found"));
8180 }
8181 navigateUrl = router.constructRouteUrl(route, { params: params, query: query });
8182 if (navigateUrl) {
8183 return router.back(navigateUrl, Utils.extend({}, navigateOptions, {
8184 name: null,
8185 params: null,
8186 query: null,
8187 }));
8188 }
8189 throw new Error(("Framework7: can't construct URL for route with name \"" + name + "\""));
8190 }
8191
8192 var app = router.app;
8193 appRouterCheck(router, 'back');
8194
8195 var currentRouteIsModal = router.currentRoute.modal;
8196 var modalType;
8197 if (!currentRouteIsModal) {
8198 ('popup popover sheet loginScreen actions customModal panel').split(' ').forEach(function (modalLoadProp) {
8199 if (router.currentRoute.route[modalLoadProp]) {
8200 currentRouteIsModal = true;
8201 modalType = modalLoadProp;
8202 }
8203 });
8204 }
8205 if (currentRouteIsModal) {
8206 var modalToClose = router.currentRoute.modal
8207 || router.currentRoute.route.modalInstance
8208 || app[modalType].get();
8209 var previousUrl = router.history[router.history.length - 2];
8210 var previousRoute;
8211 // check if previous route is modal too
8212 if (modalToClose && modalToClose.$el) {
8213 var prevOpenedModals = modalToClose.$el.prevAll('.modal-in');
8214 if (prevOpenedModals.length && prevOpenedModals[0].f7Modal) {
8215 previousRoute = prevOpenedModals[0].f7Modal.route;
8216 }
8217 }
8218 if (!previousRoute) {
8219 previousRoute = router.findMatchingRoute(previousUrl);
8220 }
8221
8222 if (!previousRoute && previousUrl) {
8223 previousRoute = {
8224 url: previousUrl,
8225 path: previousUrl.split('?')[0],
8226 query: Utils.parseUrlQuery(previousUrl),
8227 route: {
8228 path: previousUrl.split('?')[0],
8229 url: previousUrl,
8230 },
8231 };
8232 }
8233 if (!navigateUrl || navigateUrl.replace(/[# ]/g, '').trim().length === 0) {
8234 if (!previousRoute || !modalToClose) {
8235 return router;
8236 }
8237 }
8238 var forceOtherUrl = navigateOptions.force && previousRoute && navigateUrl;
8239 if (previousRoute && modalToClose) {
8240 if (router.params.pushState && navigateOptions.pushState !== false) {
8241 History.back();
8242 }
8243 router.currentRoute = previousRoute;
8244 router.history.pop();
8245 router.saveHistory();
8246 router.modalRemove(modalToClose);
8247 if (forceOtherUrl) {
8248 router.navigate(navigateUrl, { reloadCurrent: true });
8249 }
8250 } else if (modalToClose) {
8251 router.modalRemove(modalToClose);
8252 if (navigateUrl) {
8253 router.navigate(navigateUrl, { reloadCurrent: true });
8254 }
8255 }
8256 return router;
8257 }
8258 var $previousPage = router.$el.children('.page-current').prevAll('.page-previous:not(.page-master)').eq(0);
8259
8260 var skipMaster;
8261 if (router.params.masterDetailBreakpoint > 0) {
8262 var $previousMaster = router.$el.children('.page-current').prevAll('.page-master').eq(0);
8263 if ($previousMaster.length) {
8264 var expectedPreviousPageUrl = router.history[router.history.length - 2];
8265 var expectedPreviousPageRoute = router.findMatchingRoute(expectedPreviousPageUrl);
8266 if (expectedPreviousPageRoute && expectedPreviousPageRoute.route === $previousMaster[0].f7Page.route.route) {
8267 $previousPage = $previousMaster;
8268 if (!navigateOptions.preload) {
8269 skipMaster = app.width >= router.params.masterDetailBreakpoint;
8270 }
8271 }
8272 }
8273 }
8274 if (!navigateOptions.force && $previousPage.length && !skipMaster) {
8275 if (router.params.pushState
8276 && $previousPage[0].f7Page
8277 && router.history[router.history.length - 2] !== $previousPage[0].f7Page.route.url
8278 ) {
8279 router.back(
8280 router.history[router.history.length - 2],
8281 Utils.extend(navigateOptions, { force: true })
8282 );
8283 return router;
8284 }
8285 var previousPageRoute = $previousPage[0].f7Page.route;
8286
8287 processRouteQueue.call(
8288 router,
8289 previousPageRoute,
8290 router.currentRoute,
8291 function () {
8292 router.loadBack({ el: $previousPage }, Utils.extend(navigateOptions, {
8293 route: previousPageRoute,
8294 }));
8295 },
8296 function () {}
8297 );
8298
8299 return router;
8300 }
8301
8302 // Navigate URL
8303 if (navigateUrl === '#') {
8304 navigateUrl = undefined;
8305 }
8306 if (navigateUrl && navigateUrl[0] !== '/' && navigateUrl.indexOf('#') !== 0) {
8307 navigateUrl = ((router.path || '/') + navigateUrl).replace('//', '/');
8308 }
8309 if (!navigateUrl && router.history.length > 1) {
8310 navigateUrl = router.history[router.history.length - 2];
8311 }
8312 if (skipMaster && !navigateOptions.force && router.history[router.history.length - 3]) {
8313 return router.back(router.history[router.history.length - 3], Utils.extend({}, navigateOptions || {}, {
8314 force: true,
8315 animate: false,
8316 }));
8317 }
8318 if (skipMaster && !navigateOptions.force) {
8319 return router;
8320 }
8321
8322 // Find route to load
8323 route = router.findMatchingRoute(navigateUrl);
8324 if (!route) {
8325 if (navigateUrl) {
8326 route = {
8327 url: navigateUrl,
8328 path: navigateUrl.split('?')[0],
8329 query: Utils.parseUrlQuery(navigateUrl),
8330 route: {
8331 path: navigateUrl.split('?')[0],
8332 url: navigateUrl,
8333 },
8334 };
8335 }
8336 }
8337 if (!route) {
8338 return router;
8339 }
8340
8341 if (route.route.redirect) {
8342 return redirect.call(router, 'back', route, navigateOptions);
8343 }
8344
8345 var options = {};
8346 if (route.route.options) {
8347 Utils.extend(options, route.route.options, navigateOptions);
8348 } else {
8349 Utils.extend(options, navigateOptions);
8350 }
8351 options.route = route;
8352
8353 if (options && options.context) {
8354 route.context = options.context;
8355 options.route.context = options.context;
8356 }
8357
8358 var backForceLoaded;
8359 if (options.force && router.params.stackPages) {
8360 router.$el.children('.page-previous.stacked').each(function (index, pageEl) {
8361 if (pageEl.f7Page && pageEl.f7Page.route && pageEl.f7Page.route.url === route.url) {
8362 backForceLoaded = true;
8363 router.loadBack({ el: pageEl }, options);
8364 }
8365 });
8366 if (backForceLoaded) {
8367 return router;
8368 }
8369 }
8370 function resolve() {
8371 var routerLoaded = false;
8372 if (route.route.keepAlive && route.route.keepAliveData) {
8373 router.loadBack({ el: route.route.keepAliveData.pageEl }, options);
8374 routerLoaded = true;
8375 }
8376 ('url content component pageName el componentUrl template templateUrl').split(' ').forEach(function (pageLoadProp) {
8377 var obj;
8378
8379 if (route.route[pageLoadProp] && !routerLoaded) {
8380 routerLoaded = true;
8381 router.loadBack(( obj = {}, obj[pageLoadProp] = route.route[pageLoadProp], obj ), options);
8382 }
8383 });
8384 if (routerLoaded) { return; }
8385 // Async
8386 function asyncResolve(resolveParams, resolveOptions) {
8387 router.allowPageChange = false;
8388 if (resolveOptions && resolveOptions.context) {
8389 if (!route.context) { route.context = resolveOptions.context; }
8390 else { route.context = Utils.extend({}, route.context, resolveOptions.context); }
8391 options.route.context = route.context;
8392 }
8393 router.loadBack(resolveParams, Utils.extend(options, resolveOptions), true);
8394 }
8395 function asyncReject() {
8396 router.allowPageChange = true;
8397 }
8398 if (route.route.async) {
8399 router.allowPageChange = false;
8400
8401 route.route.async.call(router, route, router.currentRoute, asyncResolve, asyncReject);
8402 }
8403 }
8404 function reject() {
8405 router.allowPageChange = true;
8406 }
8407
8408 if (options.preload) {
8409 resolve();
8410 } else {
8411 processRouteQueue.call(
8412 router,
8413 route,
8414 router.currentRoute,
8415 function () {
8416 if (route.route.modules) {
8417 app
8418 .loadModules(Array.isArray(route.route.modules) ? route.route.modules : [route.route.modules])
8419 .then(function () {
8420 resolve();
8421 })
8422 .catch(function () {
8423 reject();
8424 });
8425 } else {
8426 resolve();
8427 }
8428 },
8429 function () {
8430 reject();
8431 }
8432 );
8433 }
8434
8435 // Return Router
8436 return router;
8437 }
8438
8439 function clearPreviousPages() {
8440 var router = this;
8441 appRouterCheck(router, 'clearPreviousPages');
8442 var app = router.app;
8443 var separateNavbar = router.separateNavbar;
8444
8445 var $pagesToRemove = router.$el
8446 .children('.page')
8447 .filter(function (index, pageInView) {
8448 if (router.currentRoute && (router.currentRoute.modal || router.currentRoute.panel)) { return true; }
8449 return pageInView !== router.currentPageEl;
8450 });
8451
8452 $pagesToRemove.each(function (index, pageEl) {
8453 var $oldPageEl = $(pageEl);
8454 var $oldNavbarInnerEl = $(app.navbar.getElByPage($oldPageEl));
8455 if (router.params.stackPages && router.initialPages.indexOf($oldPageEl[0]) >= 0) {
8456 $oldPageEl.addClass('stacked');
8457 if (separateNavbar) {
8458 $oldNavbarInnerEl.addClass('stacked');
8459 }
8460 } else {
8461 // Page remove event
8462 router.pageCallback('beforeRemove', $oldPageEl, $oldNavbarInnerEl, 'previous', undefined, {});
8463 router.removePage($oldPageEl);
8464 if (separateNavbar && $oldNavbarInnerEl.length) {
8465 router.removeNavbar($oldNavbarInnerEl);
8466 }
8467 }
8468 });
8469 }
8470
8471 function clearPreviousHistory() {
8472 var router = this;
8473 appRouterCheck(router, 'clearPreviousHistory');
8474 var url = router.history[router.history.length - 1];
8475
8476 router.clearPreviousPages();
8477
8478 router.history = [url];
8479 router.view.history = [url];
8480 router.saveHistory();
8481 }
8482
5d51ea26 8483 var Router = /*@__PURE__*/(function (Framework7Class) {
5309fbda 8484 function Router(app, view) {
5d51ea26 8485 Framework7Class.call(this, {}, [typeof view === 'undefined' ? app : view]);
5309fbda
DC
8486 var router = this;
8487
8488 // Is App Router
8489 router.isAppRouter = typeof view === 'undefined';
8490
8491 if (router.isAppRouter) {
8492 // App Router
8493 Utils.extend(false, router, {
8494 app: app,
8495 params: app.params.view,
8496 routes: app.routes || [],
8497 cache: app.cache,
8498 });
8499 } else {
8500 // View Router
8501 Utils.extend(false, router, {
8502 app: app,
8503 view: view,
8504 viewId: view.id,
8505 params: view.params,
8506 routes: view.routes,
8507 $el: view.$el,
8508 el: view.el,
8509 $navbarEl: view.$navbarEl,
8510 navbarEl: view.navbarEl,
8511 history: view.history,
8512 scrollHistory: view.scrollHistory,
8513 cache: app.cache,
8514 dynamicNavbar: app.theme === 'ios' && view.params.iosDynamicNavbar,
8515 separateNavbar: app.theme === 'ios' && view.params.iosDynamicNavbar && view.params.iosSeparateDynamicNavbar,
8516 initialPages: [],
8517 initialNavbars: [],
8518 });
8519 }
8520
8521 // Install Modules
8522 router.useModules();
8523
8524 // Temporary Dom
8525 router.tempDom = doc.createElement('div');
8526
8527 // AllowPageChage
8528 router.allowPageChange = true;
8529
8530 // Current Route
8531 var currentRoute = {};
8532 var previousRoute = {};
8533 Object.defineProperty(router, 'currentRoute', {
8534 enumerable: true,
8535 configurable: true,
8536 set: function set(newRoute) {
8537 if ( newRoute === void 0 ) newRoute = {};
8538
8539 previousRoute = Utils.extend({}, currentRoute);
8540 currentRoute = newRoute;
8541 if (!currentRoute) { return; }
8542 router.url = currentRoute.url;
8543 router.emit('routeChange', newRoute, previousRoute, router);
8544 },
8545 get: function get() {
8546 return currentRoute;
8547 },
8548 });
8549 Object.defineProperty(router, 'previousRoute', {
8550 enumerable: true,
8551 configurable: true,
8552 get: function get() {
8553 return previousRoute;
8554 },
8555 set: function set(newRoute) {
8556 previousRoute = newRoute;
8557 },
8558 });
8559
8560 return router;
8561 }
8562
5d51ea26
DC
8563 if ( Framework7Class ) Router.__proto__ = Framework7Class;
8564 Router.prototype = Object.create( Framework7Class && Framework7Class.prototype );
5309fbda
DC
8565 Router.prototype.constructor = Router;
8566
8567 Router.prototype.animatableNavElements = function animatableNavElements (newNavbarInner, oldNavbarInner, toLarge, fromLarge, direction) {
8568 var router = this;
8569 var dynamicNavbar = router.dynamicNavbar;
8570 var separateNavbar = router.separateNavbar;
8571 var animateIcon = router.params.iosAnimateNavbarBackIcon;
8572
8573 var newNavEls;
8574 var oldNavEls;
8575 function animatableNavEl($el, navbarInner) {
8576 var isSliding = $el.hasClass('sliding') || navbarInner.hasClass('sliding');
8577 var isSubnavbar = $el.hasClass('subnavbar');
8578 var needsOpacityTransition = isSliding ? !isSubnavbar : true;
8579 var $iconEl = $el.find('.back .icon');
8580 var isIconLabel;
8581 if (isSliding && animateIcon && $el.hasClass('left') && $iconEl.length > 0 && $iconEl.next('span').length) {
8582 $el = $iconEl.next('span'); // eslint-disable-line
8583 isIconLabel = true;
8584 }
8585 return {
8586 $el: $el,
8587 isIconLabel: isIconLabel,
8588 leftOffset: $el[0].f7NavbarLeftOffset,
8589 rightOffset: $el[0].f7NavbarRightOffset,
8590 isSliding: isSliding,
8591 isSubnavbar: isSubnavbar,
8592 needsOpacityTransition: needsOpacityTransition,
8593 };
8594 }
8595 if (dynamicNavbar) {
8596 newNavEls = [];
8597 oldNavEls = [];
8598 newNavbarInner.children('.left, .right, .title, .subnavbar').each(function (index, navEl) {
8599 var $navEl = $(navEl);
8600 if ($navEl.hasClass('left') && fromLarge && direction === 'forward' && separateNavbar) { return; }
8601 if ($navEl.hasClass('title') && toLarge) { return; }
8602 newNavEls.push(animatableNavEl($navEl, newNavbarInner));
8603 });
8604 if (!(oldNavbarInner.hasClass('navbar-master') && router.params.masterDetailBreakpoint > 0 && router.app.width >= router.params.masterDetailBreakpoint)) {
8605 oldNavbarInner.children('.left, .right, .title, .subnavbar').each(function (index, navEl) {
8606 var $navEl = $(navEl);
8607 if ($navEl.hasClass('left') && toLarge && !fromLarge && direction === 'forward' && separateNavbar) { return; }
8608 if ($navEl.hasClass('left') && toLarge && direction === 'backward' && separateNavbar) { return; }
8609 if ($navEl.hasClass('title') && fromLarge) {
8610 return;
8611 }
8612 oldNavEls.push(animatableNavEl($navEl, oldNavbarInner));
8613 });
8614 }
8615 [oldNavEls, newNavEls].forEach(function (navEls) {
8616 navEls.forEach(function (navEl) {
8617 var n = navEl;
8618 var isSliding = navEl.isSliding;
8619 var $el = navEl.$el;
8620 var otherEls = navEls === oldNavEls ? newNavEls : oldNavEls;
8621 if (!(isSliding && $el.hasClass('title') && otherEls)) { return; }
8622 otherEls.forEach(function (otherNavEl) {
8623 if (otherNavEl.isIconLabel) {
8624 var iconTextEl = otherNavEl.$el[0];
8625 n.leftOffset += iconTextEl ? (iconTextEl.offsetLeft || 0) : 0;
8626 }
8627 });
8628 });
8629 });
8630 }
8631
8632 return { newNavEls: newNavEls, oldNavEls: oldNavEls };
8633 };
8634
8635 Router.prototype.animate = function animate (oldPage, newPage, oldNavbarInner, newNavbarInner, direction, callback) {
8636 var router = this;
8637 if (router.params.animateCustom) {
8638 router.params.animateCustom.apply(router, [oldPage, newPage, oldNavbarInner, newNavbarInner, direction, callback]);
8639 return;
8640 }
8641 var dynamicNavbar = router.dynamicNavbar;
8642 var ios = router.app.theme === 'ios';
8643 // Router Animation class
8644 var routerTransitionClass = "router-transition-" + direction + " router-transition";
8645
8646 var newNavEls;
8647 var oldNavEls;
8648
8649 var fromLarge;
8650 var toLarge;
8651
8652 var oldIsLarge;
8653 var newIsLarge;
8654
8655 if (ios && dynamicNavbar) {
8656 oldIsLarge = oldNavbarInner && oldNavbarInner.hasClass('navbar-inner-large');
8657 newIsLarge = newNavbarInner && newNavbarInner.hasClass('navbar-inner-large');
8658 fromLarge = oldIsLarge && !oldNavbarInner.hasClass('navbar-inner-large-collapsed');
8659 toLarge = newIsLarge && !newNavbarInner.hasClass('navbar-inner-large-collapsed');
8660 var navEls = router.animatableNavElements(newNavbarInner, oldNavbarInner, toLarge, fromLarge, direction);
8661 newNavEls = navEls.newNavEls;
8662 oldNavEls = navEls.oldNavEls;
8663 }
8664
8665 function animateNavbars(progress) {
8666 if (!(ios && dynamicNavbar)) { return; }
8667 if (progress === 1) {
8668 if (toLarge) {
8669 newNavbarInner.addClass('router-navbar-transition-to-large');
8670 oldNavbarInner.addClass('router-navbar-transition-to-large');
8671 }
8672 if (fromLarge) {
8673 newNavbarInner.addClass('router-navbar-transition-from-large');
8674 oldNavbarInner.addClass('router-navbar-transition-from-large');
8675 }
8676 }
8677 newNavEls.forEach(function (navEl) {
8678 var $el = navEl.$el;
8679 var offset = direction === 'forward' ? navEl.rightOffset : navEl.leftOffset;
8680 if (navEl.isSliding) {
8681 if (navEl.isSubnavbar && newIsLarge) {
8682 $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');
8683 } else {
8684 $el.transform(("translate3d(" + (offset * (1 - progress)) + "px,0,0)"));
8685 }
8686 }
8687 });
8688 oldNavEls.forEach(function (navEl) {
8689 var $el = navEl.$el;
8690 var offset = direction === 'forward' ? navEl.leftOffset : navEl.rightOffset;
8691 if (navEl.isSliding) {
8692 if (navEl.isSubnavbar && oldIsLarge) {
8693 $el.transform(("translate3d(" + (offset * (progress)) + "px, calc(-1 * var(--f7-navbar-large-collapse-progress) * var(--f7-navbar-large-title-height)), 0)"));
8694 } else {
8695 $el.transform(("translate3d(" + (offset * (progress)) + "px,0,0)"));
8696 }
8697 }
8698 });
8699 }
8700
8701 // AnimationEnd Callback
8702 function onDone() {
8703 if (router.dynamicNavbar) {
8704 if (newNavbarInner) {
8705 newNavbarInner.removeClass('router-navbar-transition-to-large router-navbar-transition-from-large');
8706 newNavbarInner.addClass('navbar-no-title-large-transition');
8707 Utils.nextFrame(function () {
8708 newNavbarInner.removeClass('navbar-no-title-large-transition');
8709 });
8710 }
8711 if (oldNavbarInner) {
8712 oldNavbarInner.removeClass('router-navbar-transition-to-large router-navbar-transition-from-large');
8713 }
8714 if (newNavbarInner.hasClass('sliding')) {
8715 newNavbarInner.find('.title, .left, .right, .left .icon, .subnavbar').transform('');
8716 } else {
8717 newNavbarInner.find('.sliding').transform('');
8718 }
8719 if (oldNavbarInner.hasClass('sliding')) {
8720 oldNavbarInner.find('.title, .left, .right, .left .icon, .subnavbar').transform('');
8721 } else {
8722 oldNavbarInner.find('.sliding').transform('');
8723 }
8724 }
8725 router.$el.removeClass(routerTransitionClass);
8726 if (callback) { callback(); }
8727 }
8728
8729 (direction === 'forward' ? newPage : oldPage).animationEnd(function () {
8730 onDone();
8731 });
8732
8733 // Animate
8734 if (dynamicNavbar) {
8735 // Prepare Navbars
8736 animateNavbars(0);
8737 Utils.nextFrame(function () {
8738 // Add class, start animation
8739 animateNavbars(1);
8740 router.$el.addClass(routerTransitionClass);
8741 });
8742 } else {
8743 // Add class, start animation
8744 router.$el.addClass(routerTransitionClass);
8745 }
8746 };
8747
8748 Router.prototype.removeModal = function removeModal (modalEl) {
8749 var router = this;
8750 router.removeEl(modalEl);
8751 };
8752 // eslint-disable-next-line
8753 Router.prototype.removeTabContent = function removeTabContent (tabEl) {
8754 var $tabEl = $(tabEl);
8755 $tabEl.html('');
8756 };
8757
8758 Router.prototype.removeNavbar = function removeNavbar (el) {
8759 var router = this;
8760 router.removeEl(el);
8761 };
8762
8763 Router.prototype.removePage = function removePage (el) {
8764 var $el = $(el);
8765 var f7Page = $el && $el[0] && $el[0].f7Page;
8766 var router = this;
8767 if (f7Page && f7Page.route && f7Page.route.route && f7Page.route.route.keepAlive) {
8768 $el.remove();
8769 return;
8770 }
8771 router.removeEl(el);
8772 };
8773
8774 Router.prototype.removeEl = function removeEl (el) {
8775 if (!el) { return; }
8776 var router = this;
8777 var $el = $(el);
8778 if ($el.length === 0) { return; }
8779 $el.find('.tab').each(function (tabIndex, tabEl) {
8780 $(tabEl).children().each(function (index, tabChild) {
8781 if (tabChild.f7Component) {
8782 $(tabChild).trigger('tab:beforeremove');
8783 tabChild.f7Component.$destroy();
8784 }
8785 });
8786 });
8787 if ($el[0].f7Component && $el[0].f7Component.$destroy) {
8788 $el[0].f7Component.$destroy();
8789 }
8790 if (!router.params.removeElements) {
8791 return;
8792 }
8793 if (router.params.removeElementsWithTimeout) {
8794 setTimeout(function () {
8795 $el.remove();
8796 }, router.params.removeElementsTimeout);
8797 } else {
8798 $el.remove();
8799 }
8800 };
8801
8802 Router.prototype.getPageEl = function getPageEl (content) {
8803 var router = this;
8804 if (typeof content === 'string') {
8805 router.tempDom.innerHTML = content;
8806 } else {
8807 if ($(content).hasClass('page')) {
8808 return content;
8809 }
8810 router.tempDom.innerHTML = '';
8811 $(router.tempDom).append(content);
8812 }
8813
8814 return router.findElement('.page', router.tempDom);
8815 };
8816
8817 Router.prototype.findElement = function findElement (stringSelector, container, notStacked) {
8818 var router = this;
8819 var view = router.view;
8820 var app = router.app;
8821
8822 // Modals Selector
8823 var modalsSelector = '.popup, .dialog, .popover, .actions-modal, .sheet-modal, .login-screen, .page';
8824
8825 var $container = $(container);
8826 var selector = stringSelector;
8827 if (notStacked) { selector += ':not(.stacked)'; }
8828
8829 var found = $container
8830 .find(selector)
8831 .filter(function (index, el) { return $(el).parents(modalsSelector).length === 0; });
8832
8833 if (found.length > 1) {
8834 if (typeof view.selector === 'string') {
8835 // Search in related view
8836 found = $container.find(((view.selector) + " " + selector));
8837 }
8838 if (found.length > 1) {
8839 // Search in main view
8840 found = $container.find(("." + (app.params.viewMainClass) + " " + selector));
8841 }
8842 }
8843 if (found.length === 1) { return found; }
8844
8845 // Try to find not stacked
8846 if (!notStacked) { found = router.findElement(selector, $container, true); }
8847 if (found && found.length === 1) { return found; }
8848 if (found && found.length > 1) { return $(found[0]); }
8849 return undefined;
8850 };
8851
8852 Router.prototype.flattenRoutes = function flattenRoutes (routes) {
8853 if ( routes === void 0 ) routes = this.routes;
8854
8855 var router = this;
8856 var flattenedRoutes = [];
8857 routes.forEach(function (route) {
8858 var hasTabRoutes = false;
8859 if ('tabs' in route && route.tabs) {
8860 var mergedPathsRoutes = route.tabs.map(function (tabRoute) {
8861 var tRoute = Utils.extend({}, route, {
8862 path: (((route.path) + "/" + (tabRoute.path))).replace('///', '/').replace('//', '/'),
8863 parentPath: route.path,
8864 tab: tabRoute,
8865 });
8866 delete tRoute.tabs;
8867 delete tRoute.routes;
8868 return tRoute;
8869 });
8870 hasTabRoutes = true;
8871 flattenedRoutes = flattenedRoutes.concat(router.flattenRoutes(mergedPathsRoutes));
8872 }
8873 if ('detailRoutes' in route) {
8874 var mergedPathsRoutes$1 = route.detailRoutes.map(function (detailRoute) {
8875 var dRoute = Utils.extend({}, detailRoute);
8876 dRoute.masterRoute = route;
8877 dRoute.masterRoutePath = route.path;
8878 return dRoute;
8879 });
8880 flattenedRoutes = flattenedRoutes.concat(route, router.flattenRoutes(mergedPathsRoutes$1));
8881 }
8882 if ('routes' in route) {
8883 var mergedPathsRoutes$2 = route.routes.map(function (childRoute) {
8884 var cRoute = Utils.extend({}, childRoute);
8885 cRoute.path = (((route.path) + "/" + (cRoute.path))).replace('///', '/').replace('//', '/');
8886 return cRoute;
8887 });
8888 if (hasTabRoutes) {
8889 flattenedRoutes = flattenedRoutes.concat(router.flattenRoutes(mergedPathsRoutes$2));
8890 } else {
8891 flattenedRoutes = flattenedRoutes.concat(route, router.flattenRoutes(mergedPathsRoutes$2));
8892 }
8893 }
8894 if (!('routes' in route) && !('tabs' in route && route.tabs) && !('detailRoutes' in route)) {
8895 flattenedRoutes.push(route);
8896 }
8897 });
8898 return flattenedRoutes;
8899 };
8900
8901 // eslint-disable-next-line
8902 Router.prototype.parseRouteUrl = function parseRouteUrl (url) {
8903 if (!url) { return {}; }
8904 var query = Utils.parseUrlQuery(url);
8905 var hash = url.split('#')[1];
8906 var params = {};
8907 var path = url.split('#')[0].split('?')[0];
8908 return {
8909 query: query,
8910 hash: hash,
8911 params: params,
8912 url: url,
8913 path: path,
8914 };
8915 };
8916
8917 // eslint-disable-next-line
8918 Router.prototype.constructRouteUrl = function constructRouteUrl (route, ref) {
8919 if ( ref === void 0 ) ref = {};
8920 var params = ref.params;
8921 var query = ref.query;
8922
8923 var path = route.path;
8924 var toUrl = pathToRegexp_1.compile(path);
8925 var url;
8926 try {
8927 url = toUrl(params || {});
8928 } catch (error) {
8929 throw new Error(("Framework7: error constructing route URL from passed params:\nRoute: " + path + "\n" + (error.toString())));
8930 }
8931
8932 if (query) {
8933 if (typeof query === 'string') { url += "?" + query; }
8934 else { url += "?" + (Utils.serializeObject(query)); }
8935 }
8936
8937 return url;
8938 };
8939
8940 Router.prototype.findTabRoute = function findTabRoute (tabEl) {
8941 var router = this;
8942 var $tabEl = $(tabEl);
8943 var parentPath = router.currentRoute.route.parentPath;
8944 var tabId = $tabEl.attr('id');
8945 var flattenedRoutes = router.flattenRoutes(router.routes);
8946 var foundTabRoute;
8947 flattenedRoutes.forEach(function (route) {
8948 if (
8949 route.parentPath === parentPath
8950 && route.tab
8951 && route.tab.id === tabId
8952 ) {
8953 foundTabRoute = route;
8954 }
8955 });
8956 return foundTabRoute;
8957 };
8958
8959 Router.prototype.findRouteByKey = function findRouteByKey (key, value) {
8960 var router = this;
8961 var routes = router.routes;
8962 var flattenedRoutes = router.flattenRoutes(routes);
8963 var matchingRoute;
8964
8965 flattenedRoutes.forEach(function (route) {
8966 if (matchingRoute) { return; }
8967 if (route[key] === value) {
8968 matchingRoute = route;
8969 }
8970 });
8971 return matchingRoute;
8972 };
8973
8974 Router.prototype.findMatchingRoute = function findMatchingRoute (url) {
8975 if (!url) { return undefined; }
8976 var router = this;
8977 var routes = router.routes;
8978 var flattenedRoutes = router.flattenRoutes(routes);
8979 var ref = router.parseRouteUrl(url);
8980 var path = ref.path;
8981 var query = ref.query;
8982 var hash = ref.hash;
8983 var params = ref.params;
8984 var matchingRoute;
8985 flattenedRoutes.forEach(function (route) {
8986 if (matchingRoute) { return; }
8987 var keys = [];
8988
8989 var pathsToMatch = [route.path];
8990 if (route.alias) {
8991 if (typeof route.alias === 'string') { pathsToMatch.push(route.alias); }
8992 else if (Array.isArray(route.alias)) {
8993 route.alias.forEach(function (aliasPath) {
8994 pathsToMatch.push(aliasPath);
8995 });
8996 }
8997 }
8998
8999 var matched;
9000 pathsToMatch.forEach(function (pathToMatch) {
9001 if (matched) { return; }
9002 matched = pathToRegexp_1(pathToMatch, keys).exec(path);
9003 });
9004
9005 if (matched) {
9006 keys.forEach(function (keyObj, index) {
9007 if (typeof keyObj.name === 'number') { return; }
9008 var paramValue = matched[index + 1];
5d51ea26
DC
9009 if (typeof paramValue === 'undefined' || paramValue === null) {
9010 params[keyObj.name] = paramValue;
9011 } else {
9012 params[keyObj.name] = decodeURIComponent(paramValue);
9013 }
5309fbda
DC
9014 });
9015
9016 var parentPath;
9017 if (route.parentPath) {
9018 parentPath = path.split('/').slice(0, route.parentPath.split('/').length - 1).join('/');
9019 }
9020
9021 matchingRoute = {
9022 query: query,
9023 hash: hash,
9024 params: params,
9025 url: url,
9026 path: path,
9027 parentPath: parentPath,
9028 route: route,
9029 name: route.name,
9030 };
9031 }
9032 });
9033 return matchingRoute;
9034 };
9035
9036 // eslint-disable-next-line
9037 Router.prototype.replaceRequestUrlParams = function replaceRequestUrlParams (url, options) {
9038 if ( url === void 0 ) url = '';
9039 if ( options === void 0 ) options = {};
9040
9041 var compiledUrl = url;
9042 if (typeof compiledUrl === 'string'
9043 && compiledUrl.indexOf('{{') >= 0
9044 && options
9045 && options.route
9046 && options.route.params
9047 && Object.keys(options.route.params).length
9048 ) {
9049 Object.keys(options.route.params).forEach(function (paramName) {
9050 var regExp = new RegExp(("{{" + paramName + "}}"), 'g');
9051 compiledUrl = compiledUrl.replace(regExp, options.route.params[paramName] || '');
9052 });
9053 }
9054 return compiledUrl;
9055 };
9056
9057 Router.prototype.removeFromXhrCache = function removeFromXhrCache (url) {
9058 var router = this;
9059 var xhrCache = router.cache.xhr;
9060 var index = false;
9061 for (var i = 0; i < xhrCache.length; i += 1) {
9062 if (xhrCache[i].url === url) { index = i; }
9063 }
9064 if (index !== false) { xhrCache.splice(index, 1); }
9065 };
9066
9067 Router.prototype.xhrRequest = function xhrRequest (requestUrl, options) {
9068 var router = this;
9069 var params = router.params;
9070 var ignoreCache = options.ignoreCache;
9071 var url = requestUrl;
9072
9073 var hasQuery = url.indexOf('?') >= 0;
9074 if (params.passRouteQueryToRequest
9075 && options
9076 && options.route
9077 && options.route.query
9078 && Object.keys(options.route.query).length
9079 ) {
9080 url += "" + (hasQuery ? '&' : '?') + (Utils.serializeObject(options.route.query));
9081 hasQuery = true;
9082 }
9083
9084 if (params.passRouteParamsToRequest
9085 && options
9086 && options.route
9087 && options.route.params
9088 && Object.keys(options.route.params).length
9089 ) {
9090 url += "" + (hasQuery ? '&' : '?') + (Utils.serializeObject(options.route.params));
9091 hasQuery = true;
9092 }
9093
9094 if (url.indexOf('{{') >= 0) {
9095 url = router.replaceRequestUrlParams(url, options);
9096 }
9097 // should we ignore get params or not
9098 if (params.xhrCacheIgnoreGetParameters && url.indexOf('?') >= 0) {
9099 url = url.split('?')[0];
9100 }
9101 return new Promise(function (resolve, reject) {
9102 if (params.xhrCache && !ignoreCache && url.indexOf('nocache') < 0 && params.xhrCacheIgnore.indexOf(url) < 0) {
9103 for (var i = 0; i < router.cache.xhr.length; i += 1) {
9104 var cachedUrl = router.cache.xhr[i];
9105 if (cachedUrl.url === url) {
9106 // Check expiration
9107 if (Utils.now() - cachedUrl.time < params.xhrCacheDuration) {
9108 // Load from cache
9109 resolve(cachedUrl.content);
9110 return;
9111 }
9112 }
9113 }
9114 }
9115 router.xhr = router.app.request({
9116 url: url,
9117 method: 'GET',
9118 beforeSend: function beforeSend(xhr) {
9119 router.emit('routerAjaxStart', xhr, options);
9120 },
9121 complete: function complete(xhr, status) {
9122 router.emit('routerAjaxComplete', xhr);
9123 if ((status !== 'error' && status !== 'timeout' && (xhr.status >= 200 && xhr.status < 300)) || xhr.status === 0) {
9124 if (params.xhrCache && xhr.responseText !== '') {
9125 router.removeFromXhrCache(url);
9126 router.cache.xhr.push({
9127 url: url,
9128 time: Utils.now(),
9129 content: xhr.responseText,
9130 });
9131 }
9132 router.emit('routerAjaxSuccess', xhr, options);
9133 resolve(xhr.responseText);
9134 } else {
9135 router.emit('routerAjaxError', xhr, options);
9136 reject(xhr);
9137 }
9138 },
9139 error: function error(xhr) {
9140 router.emit('routerAjaxError', xhr, options);
9141 reject(xhr);
9142 },
9143 });
9144 });
9145 };
9146
9147 // Remove theme elements
9148 Router.prototype.removeThemeElements = function removeThemeElements (el) {
9149 var router = this;
9150 var theme = router.app.theme;
5d51ea26
DC
9151 var toRemove;
9152 if (theme === 'ios') {
9153 toRemove = '.md-only, .aurora-only, .if-md, .if-aurora, .if-not-ios, .not-ios';
9154 } else if (theme === 'md') {
9155 toRemove = '.ios-only, .aurora-only, .if-ios, .if-aurora, .if-not-md, .not-md';
9156 } else if (theme === 'aurora') {
9157 toRemove = '.ios-only, .md-only, .if-ios, .if-md, .if-not-aurora, .not-aurora';
9158 }
9159 $(el).find(toRemove).remove();
5309fbda
DC
9160 };
9161
9162 Router.prototype.getPageData = function getPageData (pageEl, navbarEl, from, to, route, pageFromEl) {
9163 if ( route === void 0 ) route = {};
9164
9165 var router = this;
9166 var $pageEl = $(pageEl).eq(0);
9167 var $navbarEl = $(navbarEl).eq(0);
9168 var currentPage = $pageEl[0].f7Page || {};
9169 var direction;
9170 var pageFrom;
9171 if ((from === 'next' && to === 'current') || (from === 'current' && to === 'previous')) { direction = 'forward'; }
9172 if ((from === 'current' && to === 'next') || (from === 'previous' && to === 'current')) { direction = 'backward'; }
9173 if (currentPage && !currentPage.fromPage) {
9174 var $pageFromEl = $(pageFromEl);
9175 if ($pageFromEl.length) {
9176 pageFrom = $pageFromEl[0].f7Page;
9177 }
9178 }
9179 pageFrom = currentPage.pageFrom || pageFrom;
9180 if (pageFrom && pageFrom.pageFrom) {
9181 pageFrom.pageFrom = null;
9182 }
9183 var page = {
9184 app: router.app,
9185 view: router.view,
9186 router: router,
9187 $el: $pageEl,
9188 el: $pageEl[0],
9189 $pageEl: $pageEl,
9190 pageEl: $pageEl[0],
9191 $navbarEl: $navbarEl,
9192 navbarEl: $navbarEl[0],
9193 name: $pageEl.attr('data-name'),
9194 position: from,
9195 from: from,
9196 to: to,
9197 direction: direction,
9198 route: currentPage.route ? currentPage.route : route,
9199 pageFrom: pageFrom,
9200 };
9201
9202 $pageEl[0].f7Page = page;
9203 return page;
9204 };
9205
9206 // Callbacks
9207 Router.prototype.pageCallback = function pageCallback (callback, pageEl, navbarEl, from, to, options, pageFromEl) {
9208 if ( options === void 0 ) options = {};
9209
9210 if (!pageEl) { return; }
9211 var router = this;
9212 var $pageEl = $(pageEl);
9213 if (!$pageEl.length) { return; }
9214 var $navbarEl = $(navbarEl);
9215 var route = options.route;
9216 var restoreScrollTopOnBack = router.params.restoreScrollTopOnBack
9217 && !(
9218 router.params.masterDetailBreakpoint > 0
9219 && $pageEl.hasClass('page-master')
9220 && router.app.width >= router.params.masterDetailBreakpoint
9221 );
9222 var keepAlive = $pageEl[0].f7Page && $pageEl[0].f7Page.route && $pageEl[0].f7Page.route.route && $pageEl[0].f7Page.route.route.keepAlive;
9223
9224 if (callback === 'beforeRemove' && keepAlive) {
9225 callback = 'beforeUnmount'; // eslint-disable-line
9226 }
9227
9228 var camelName = "page" + (callback[0].toUpperCase() + callback.slice(1, callback.length));
9229 var colonName = "page:" + (callback.toLowerCase());
9230
9231 var page = {};
9232 if (callback === 'beforeRemove' && $pageEl[0].f7Page) {
9233 page = Utils.extend($pageEl[0].f7Page, { from: from, to: to, position: from });
9234 } else {
9235 page = router.getPageData($pageEl[0], $navbarEl[0], from, to, route, pageFromEl);
9236 }
9237 page.swipeBack = !!options.swipeBack;
9238
9239 var ref = options.route ? options.route.route : {};
9240 var on = ref.on; if ( on === void 0 ) on = {};
9241 var once = ref.once; if ( once === void 0 ) once = {};
9242 if (options.on) {
9243 Utils.extend(on, options.on);
9244 }
9245 if (options.once) {
9246 Utils.extend(once, options.once);
9247 }
9248
9249 function attachEvents() {
9250 if ($pageEl[0].f7RouteEventsAttached) { return; }
9251 $pageEl[0].f7RouteEventsAttached = true;
9252 if (on && Object.keys(on).length > 0) {
9253 $pageEl[0].f7RouteEventsOn = on;
9254 Object.keys(on).forEach(function (eventName) {
9255 on[eventName] = on[eventName].bind(router);
9256 $pageEl.on(Utils.eventNameToColonCase(eventName), on[eventName]);
9257 });
9258 }
9259 if (once && Object.keys(once).length > 0) {
9260 $pageEl[0].f7RouteEventsOnce = once;
9261 Object.keys(once).forEach(function (eventName) {
9262 once[eventName] = once[eventName].bind(router);
9263 $pageEl.once(Utils.eventNameToColonCase(eventName), once[eventName]);
9264 });
9265 }
9266 }
9267
9268 function detachEvents() {
9269 if (!$pageEl[0].f7RouteEventsAttached) { return; }
9270 if ($pageEl[0].f7RouteEventsOn) {
9271 Object.keys($pageEl[0].f7RouteEventsOn).forEach(function (eventName) {
9272 $pageEl.off(Utils.eventNameToColonCase(eventName), $pageEl[0].f7RouteEventsOn[eventName]);
9273 });
9274 }
9275 if ($pageEl[0].f7RouteEventsOnce) {
9276 Object.keys($pageEl[0].f7RouteEventsOnce).forEach(function (eventName) {
9277 $pageEl.off(Utils.eventNameToColonCase(eventName), $pageEl[0].f7RouteEventsOnce[eventName]);
9278 });
9279 }
9280 $pageEl[0].f7RouteEventsAttached = null;
9281 $pageEl[0].f7RouteEventsOn = null;
9282 $pageEl[0].f7RouteEventsOnce = null;
9283 delete $pageEl[0].f7RouteEventsAttached;
9284 delete $pageEl[0].f7RouteEventsOn;
9285 delete $pageEl[0].f7RouteEventsOnce;
9286 }
9287
9288 if (callback === 'mounted') {
9289 attachEvents();
9290 }
9291 if (callback === 'init') {
9292 if (restoreScrollTopOnBack && (from === 'previous' || !from) && to === 'current' && router.scrollHistory[page.route.url] && !$pageEl.hasClass('no-restore-scroll')) {
9293 var $pageContent = $pageEl.find('.page-content');
9294 if ($pageContent.length > 0) {
9295 // eslint-disable-next-line
9296 $pageContent = $pageContent.filter(function (pageContentIndex, pageContentEl) {
9297 return (
9298 $(pageContentEl).parents('.tab:not(.tab-active)').length === 0
9299 && !$(pageContentEl).is('.tab:not(.tab-active)')
9300 );
9301 });
9302 }
9303 $pageContent.scrollTop(router.scrollHistory[page.route.url]);
9304 }
9305 attachEvents();
9306 if ($pageEl[0].f7PageInitialized) {
9307 $pageEl.trigger('page:reinit', page);
9308 router.emit('pageReinit', page);
9309 return;
9310 }
9311 $pageEl[0].f7PageInitialized = true;
9312 }
9313 if (restoreScrollTopOnBack && callback === 'beforeOut' && from === 'current' && to === 'previous') {
9314 // Save scroll position
9315 var $pageContent$1 = $pageEl.find('.page-content');
9316 if ($pageContent$1.length > 0) {
9317 // eslint-disable-next-line
9318 $pageContent$1 = $pageContent$1.filter(function (pageContentIndex, pageContentEl) {
9319 return (
9320 $(pageContentEl).parents('.tab:not(.tab-active)').length === 0
9321 && !$(pageContentEl).is('.tab:not(.tab-active)')
9322 );
9323 });
9324 }
9325 router.scrollHistory[page.route.url] = $pageContent$1.scrollTop();
9326 }
9327 if (restoreScrollTopOnBack && callback === 'beforeOut' && from === 'current' && to === 'next') {
9328 // Delete scroll position
9329 delete router.scrollHistory[page.route.url];
9330 }
9331
9332 $pageEl.trigger(colonName, page);
9333 router.emit(camelName, page);
9334
9335 if (callback === 'beforeRemove' || callback === 'beforeUnmount') {
9336 detachEvents();
9337 if (!keepAlive) {
9338 if ($pageEl[0].f7Page && $pageEl[0].f7Page.navbarEl) {
9339 delete $pageEl[0].f7Page.navbarEl.f7Page;
9340 }
9341 $pageEl[0].f7Page = null;
9342 }
9343 }
9344 };
9345
9346 Router.prototype.saveHistory = function saveHistory () {
9347 var router = this;
9348 router.view.history = router.history;
9349 if (router.params.pushState) {
9350 win.localStorage[("f7router-" + (router.view.id) + "-history")] = JSON.stringify(router.history);
9351 }
9352 };
9353
9354 Router.prototype.restoreHistory = function restoreHistory () {
9355 var router = this;
9356 if (router.params.pushState && win.localStorage[("f7router-" + (router.view.id) + "-history")]) {
9357 router.history = JSON.parse(win.localStorage[("f7router-" + (router.view.id) + "-history")]);
9358 router.view.history = router.history;
9359 }
9360 };
9361
9362 Router.prototype.clearHistory = function clearHistory () {
9363 var router = this;
9364 router.history = [];
9365 if (router.view) { router.view.history = []; }
9366 router.saveHistory();
9367 };
9368
9369 Router.prototype.updateCurrentUrl = function updateCurrentUrl (newUrl) {
9370 var router = this;
9371 appRouterCheck(router, 'updateCurrentUrl');
9372 // Update history
9373 if (router.history.length) {
9374 router.history[router.history.length - 1] = newUrl;
9375 } else {
9376 router.history.push(newUrl);
9377 }
9378
9379 // Update current route params
9380 var ref = router.parseRouteUrl(newUrl);
9381 var query = ref.query;
9382 var hash = ref.hash;
9383 var params = ref.params;
9384 var url = ref.url;
9385 var path = ref.path;
9386 if (router.currentRoute) {
9387 Utils.extend(router.currentRoute, {
9388 query: query,
9389 hash: hash,
9390 params: params,
9391 url: url,
9392 path: path,
9393 });
9394 }
9395
9396 if (router.params.pushState) {
9397 var pushStateRoot = router.params.pushStateRoot || '';
9398 History.replace(
9399 router.view.id,
9400 {
9401 url: newUrl,
9402 },
9403 pushStateRoot + router.params.pushStateSeparator + newUrl
9404 );
9405 }
9406
9407 // Save History
9408 router.saveHistory();
9409
9410 router.emit('routeUrlUpdate', router.currentRoute, router);
9411 };
9412
9413 Router.prototype.init = function init () {
9414 var router = this;
9415 var app = router.app;
9416 var view = router.view;
9417
9418 // Init Swipeback
9419 {
9420 if (
9421 (view && router.params.iosSwipeBack && app.theme === 'ios')
9422 || (view && router.params.mdSwipeBack && app.theme === 'md')
5d51ea26 9423 || (view && router.params.auroraSwipeBack && app.theme === 'aurora')
5309fbda
DC
9424 ) {
9425 SwipeBack(router);
9426 }
9427 }
9428
9429 // Dynamic not separated navbbar
9430 if (router.dynamicNavbar && !router.separateNavbar) {
9431 router.$el.addClass('router-dynamic-navbar-inside');
9432 }
9433
9434 var initUrl = router.params.url;
9435 var documentUrl = doc.location.href.split(doc.location.origin)[1];
9436 var historyRestored;
9437 var ref = router.params;
9438 var pushState = ref.pushState;
9439 var pushStateOnLoad = ref.pushStateOnLoad;
9440 var pushStateSeparator = ref.pushStateSeparator;
9441 var pushStateAnimateOnLoad = ref.pushStateAnimateOnLoad;
9442 var ref$1 = router.params;
9443 var pushStateRoot = ref$1.pushStateRoot;
9444 if (win.cordova && pushState && !pushStateSeparator && !pushStateRoot && doc.location.pathname.indexOf('index.html')) {
9445 // eslint-disable-next-line
9446 console.warn('Framework7: wrong or not complete pushState configuration, trying to guess pushStateRoot');
9447 pushStateRoot = doc.location.pathname.split('index.html')[0];
9448 }
5309fbda
DC
9449 if (!pushState || !pushStateOnLoad) {
9450 if (!initUrl) {
9451 initUrl = documentUrl;
9452 }
9453 if (doc.location.search && initUrl.indexOf('?') < 0) {
9454 initUrl += doc.location.search;
9455 }
9456 if (doc.location.hash && initUrl.indexOf('#') < 0) {
9457 initUrl += doc.location.hash;
9458 }
9459 } else {
9460 if (pushStateRoot && documentUrl.indexOf(pushStateRoot) >= 0) {
9461 documentUrl = documentUrl.split(pushStateRoot)[1];
9462 if (documentUrl === '') { documentUrl = '/'; }
9463 }
9464 if (pushStateSeparator.length > 0 && documentUrl.indexOf(pushStateSeparator) >= 0) {
9465 initUrl = documentUrl.split(pushStateSeparator)[1];
9466 } else {
9467 initUrl = documentUrl;
9468 }
9469 router.restoreHistory();
9470 if (router.history.indexOf(initUrl) >= 0) {
9471 router.history = router.history.slice(0, router.history.indexOf(initUrl) + 1);
9472 } else if (router.params.url === initUrl) {
9473 router.history = [initUrl];
9474 } else if (History.state && History.state[view.id] && History.state[view.id].url === router.history[router.history.length - 1]) {
9475 initUrl = router.history[router.history.length - 1];
9476 } else {
9477 router.history = [documentUrl.split(pushStateSeparator)[0] || '/', initUrl];
9478 }
9479 if (router.history.length > 1) {
9480 historyRestored = true;
9481 } else {
9482 router.history = [];
9483 }
9484 router.saveHistory();
9485 }
9486 var currentRoute;
9487 if (router.history.length > 1) {
9488 // Will load page
9489 currentRoute = router.findMatchingRoute(router.history[0]);
9490 if (!currentRoute) {
9491 currentRoute = Utils.extend(router.parseRouteUrl(router.history[0]), {
9492 route: {
9493 url: router.history[0],
9494 path: router.history[0].split('?')[0],
9495 },
9496 });
9497 }
9498 } else {
9499 // Don't load page
9500 currentRoute = router.findMatchingRoute(initUrl);
9501 if (!currentRoute) {
9502 currentRoute = Utils.extend(router.parseRouteUrl(initUrl), {
9503 route: {
9504 url: initUrl,
9505 path: initUrl.split('?')[0],
9506 },
9507 });
9508 }
9509 }
9510
9511 if (router.params.stackPages) {
9512 router.$el.children('.page').each(function (index, pageEl) {
9513 var $pageEl = $(pageEl);
9514 router.initialPages.push($pageEl[0]);
9515 if (router.separateNavbar && $pageEl.children('.navbar').length > 0) {
9516 router.initialNavbars.push($pageEl.children('.navbar').find('.navbar-inner')[0]);
9517 }
9518 });
9519 }
9520
9521 if (router.$el.children('.page:not(.stacked)').length === 0 && initUrl) {
9522 // No pages presented in DOM, reload new page
9523 router.navigate(initUrl, {
9524 initial: true,
9525 reloadCurrent: true,
9526 pushState: false,
9527 });
9528 } else {
9529 // Init current DOM page
9530 var hasTabRoute;
9531 router.currentRoute = currentRoute;
9532 router.$el.children('.page:not(.stacked)').each(function (index, pageEl) {
9533 var $pageEl = $(pageEl);
9534 var $navbarInnerEl;
9535 $pageEl.addClass('page-current');
9536 if (router.separateNavbar) {
9537 $navbarInnerEl = $pageEl.children('.navbar').children('.navbar-inner');
9538 if ($navbarInnerEl.length > 0) {
9539 if (!router.$navbarEl.parents(doc).length) {
9540 router.$el.prepend(router.$navbarEl);
9541 }
9542 $navbarInnerEl.addClass('navbar-current');
9543 router.$navbarEl.append($navbarInnerEl);
9544 if ($navbarInnerEl.children('.title-large').length) {
9545 $navbarInnerEl.addClass('navbar-inner-large');
9546 }
9547 $pageEl.children('.navbar').remove();
9548 } else {
9549 router.$navbarEl.addClass('navbar-hidden');
9550 if ($navbarInnerEl.children('.title-large').length) {
9551 router.$navbarEl.addClass('navbar-hidden navbar-large-hidden');
9552 }
9553 }
9554 }
9555 if (router.currentRoute && router.currentRoute.route && router.currentRoute.route.master && router.params.masterDetailBreakpoint > 0) {
9556 $pageEl.addClass('page-master');
9557 $pageEl.trigger('page:role', { role: 'master' });
9558 if ($navbarInnerEl && $navbarInnerEl.length) {
9559 $navbarInnerEl.addClass('navbar-master');
9560 }
9561 }
9562 var initOptions = {
9563 route: router.currentRoute,
9564 };
9565 if (router.currentRoute && router.currentRoute.route && router.currentRoute.route.options) {
9566 Utils.extend(initOptions, router.currentRoute.route.options);
9567 }
9568 router.currentPageEl = $pageEl[0];
9569 if (router.separateNavbar && $navbarInnerEl.length) {
9570 router.currentNavbarEl = $navbarInnerEl[0];
9571 }
9572 router.removeThemeElements($pageEl);
9573 if (router.separateNavbar && $navbarInnerEl.length) {
9574 router.removeThemeElements($navbarInnerEl);
9575 }
9576 if (initOptions.route.route.tab) {
9577 hasTabRoute = true;
9578 router.tabLoad(initOptions.route.route.tab, Utils.extend({}, initOptions));
9579 }
9580 router.pageCallback('init', $pageEl, $navbarInnerEl, 'current', undefined, initOptions);
9581 });
9582 if (historyRestored) {
9583 router.navigate(initUrl, {
9584 initial: true,
9585 pushState: false,
9586 history: false,
9587 animate: pushStateAnimateOnLoad,
9588 once: {
9589 pageAfterIn: function pageAfterIn() {
5d51ea26
DC
9590 var preloadPreviousPage = router.params.preloadPreviousPage || router.params[((app.theme) + "SwipeBack")];
9591 if (preloadPreviousPage && router.history.length > 2) {
5309fbda
DC
9592 router.back({ preload: true });
9593 }
9594 },
9595 },
9596 });
9597 }
9598 if (!historyRestored && !hasTabRoute) {
9599 router.history.push(initUrl);
9600 router.saveHistory();
9601 }
9602 }
9603 if (initUrl && pushState && pushStateOnLoad && (!History.state || !History.state[view.id])) {
9604 History.initViewState(view.id, {
9605 url: initUrl,
9606 });
9607 }
9608 router.emit('local::init routerInit', router);
9609 };
9610
9611 Router.prototype.destroy = function destroy () {
9612 var router = this;
9613
9614 router.emit('local::destroy routerDestroy', router);
9615
9616 // Delete props & methods
9617 Object.keys(router).forEach(function (routerProp) {
9618 router[routerProp] = null;
9619 delete router[routerProp];
9620 });
9621
9622 router = null;
9623 };
9624
9625 return Router;
9626 }(Framework7Class));
9627
9628 // Load
9629 Router.prototype.forward = forward;
9630 Router.prototype.load = load;
9631 Router.prototype.navigate = navigate;
9632 Router.prototype.refreshPage = refreshPage;
9633 // Tab
9634 Router.prototype.tabLoad = tabLoad;
9635 Router.prototype.tabRemove = tabRemove;
9636 // Modal
9637 Router.prototype.modalLoad = modalLoad;
9638 Router.prototype.modalRemove = modalRemove;
9639 // Back
9640 Router.prototype.backward = backward;
9641 Router.prototype.loadBack = loadBack;
9642 Router.prototype.back = back;
9643 // Clear previoius pages from the DOM
9644 Router.prototype.clearPreviousPages = clearPreviousPages;
9645 // Clear history
9646 Router.prototype.clearPreviousHistory = clearPreviousHistory;
9647
5d51ea26 9648 var RouterModule = {
5309fbda
DC
9649 name: 'router',
9650 static: {
9651 Router: Router,
9652 },
9653 instance: {
9654 cache: {
9655 xhr: [],
9656 templates: [],
9657 components: [],
9658 },
9659 },
9660 create: function create() {
9661 var instance = this;
9662 if (instance.app) {
9663 // View Router
9664 if (instance.params.router) {
9665 instance.router = new Router(instance.app, instance);
9666 }
9667 } else {
9668 // App Router
9669 instance.router = new Router(instance);
9670 }
9671 },
9672 };
9673
5d51ea26 9674 var View = /*@__PURE__*/(function (Framework7Class) {
5309fbda
DC
9675 function View(appInstance, el, viewParams) {
9676 if ( viewParams === void 0 ) viewParams = {};
9677
5d51ea26 9678 Framework7Class.call(this, viewParams, [appInstance]);
5309fbda
DC
9679
9680 var app = appInstance;
9681 var $el = $(el);
9682 var view = this;
9683
9684 var defaults = {
9685 routes: [],
9686 routesAdd: [],
9687 };
9688
9689 // Default View params
9690 view.params = Utils.extend(defaults, app.params.view, viewParams);
9691
9692 // Routes
9693 if (view.params.routes.length > 0) {
9694 view.routes = view.params.routes;
9695 } else {
9696 view.routes = [].concat(app.routes, view.params.routesAdd);
9697 }
9698
9699 // Selector
9700 var selector;
9701 if (typeof el === 'string') { selector = el; }
9702 else {
9703 // Supposed to be HTMLElement or Dom7
9704 selector = ($el.attr('id') ? ("#" + ($el.attr('id'))) : '') + ($el.attr('class') ? ("." + ($el.attr('class').replace(/ /g, '.').replace('.active', ''))) : '');
9705 }
9706
9707 // DynamicNavbar
9708 var $navbarEl;
9709 if (app.theme === 'ios' && view.params.iosDynamicNavbar && view.params.iosSeparateDynamicNavbar) {
9710 $navbarEl = $el.children('.navbar').eq(0);
9711 if ($navbarEl.length === 0) {
9712 $navbarEl = $('<div class="navbar"></div>');
9713 }
9714 }
9715
9716 // View Props
9717 Utils.extend(false, view, {
9718 app: app,
9719 $el: $el,
9720 el: $el[0],
9721 name: view.params.name,
9722 main: view.params.main || $el.hasClass('view-main'),
9723 $navbarEl: $navbarEl,
9724 navbarEl: $navbarEl ? $navbarEl[0] : undefined,
9725 selector: selector,
9726 history: [],
9727 scrollHistory: {},
9728 });
9729
9730 // Save in DOM
9731 $el[0].f7View = view;
9732
9733 // Install Modules
9734 view.useModules();
9735
9736 // Add to app
9737 app.views.push(view);
9738 if (view.main) {
9739 app.views.main = view;
9740 }
9741 if (view.name) {
9742 app.views[view.name] = view;
9743 }
9744
9745 // Index
9746 view.index = app.views.indexOf(view);
9747
9748 // View ID
9749 var viewId;
9750 if (view.name) {
9751 viewId = "view_" + (view.name);
9752 } else if (view.main) {
9753 viewId = 'view_main';
9754 } else {
9755 viewId = "view_" + (view.index);
9756 }
9757 view.id = viewId;
9758
9759 // Init View
9760 if (app.initialized) {
9761 view.init();
9762 } else {
9763 app.on('init', function () {
9764 view.init();
9765 });
9766 }
9767
9768 return view;
9769 }
9770
5d51ea26
DC
9771 if ( Framework7Class ) View.__proto__ = Framework7Class;
9772 View.prototype = Object.create( Framework7Class && Framework7Class.prototype );
5309fbda
DC
9773 View.prototype.constructor = View;
9774
9775 View.prototype.destroy = function destroy () {
9776 var view = this;
9777 var app = view.app;
9778
9779 view.$el.trigger('view:beforedestroy', view);
9780 view.emit('local::beforeDestroy viewBeforeDestroy', view);
9781
9782 app.off('resize', view.checkmasterDetailBreakpoint);
9783
9784 if (view.main) {
9785 app.views.main = null;
9786 delete app.views.main;
9787 } else if (view.name) {
9788 app.views[view.name] = null;
9789 delete app.views[view.name];
9790 }
9791 view.$el[0].f7View = null;
9792 delete view.$el[0].f7View;
9793
9794 app.views.splice(app.views.indexOf(view), 1);
9795
9796 // Destroy Router
9797 if (view.params.router && view.router) {
9798 view.router.destroy();
9799 }
9800
9801 view.emit('local::destroy viewDestroy', view);
9802
9803 // Delete props & methods
9804 Object.keys(view).forEach(function (viewProp) {
9805 view[viewProp] = null;
9806 delete view[viewProp];
9807 });
9808
9809 view = null;
9810 };
9811
9812 View.prototype.checkmasterDetailBreakpoint = function checkmasterDetailBreakpoint () {
9813 var view = this;
9814 var app = view.app;
9815 var wasMasterDetail = view.$el.hasClass('view-master-detail');
9816 if (app.width >= view.params.masterDetailBreakpoint) {
9817 view.$el.addClass('view-master-detail');
9818 if (!wasMasterDetail) {
9819 view.emit('local::masterDetailBreakpoint viewMasterDetailBreakpoint');
9820 view.$el.trigger('view:masterDetailBreakpoint', view);
9821 }
9822 } else {
9823 view.$el.removeClass('view-master-detail');
9824 if (wasMasterDetail) {
9825 view.emit('local::masterDetailBreakpoint viewMasterDetailBreakpoint');
9826 view.$el.trigger('view:masterDetailBreakpoint', view);
9827 }
9828 }
9829 };
9830
9831 View.prototype.initMasterDetail = function initMasterDetail () {
9832 var view = this;
9833 var app = view.app;
9834 view.checkmasterDetailBreakpoint = view.checkmasterDetailBreakpoint.bind(view);
9835 view.checkmasterDetailBreakpoint();
9836 app.on('resize', view.checkmasterDetailBreakpoint);
9837 };
9838
9839 View.prototype.init = function init () {
9840 var view = this;
9841 if (view.params.router) {
9842 if (view.params.masterDetailBreakpoint > 0) {
9843 view.initMasterDetail();
9844 }
9845 view.router.init();
9846 view.$el.trigger('view:init', view);
9847 view.emit('local::init viewInit', view);
9848 }
9849 };
9850
9851 return View;
9852 }(Framework7Class));
9853
9854 // Use Router
5d51ea26 9855 View.use(RouterModule);
5309fbda
DC
9856
9857 function initClicks(app) {
9858 function handleClicks(e) {
9859 var $clickedEl = $(e.target);
9860 var $clickedLinkEl = $clickedEl.closest('a');
9861 var isLink = $clickedLinkEl.length > 0;
9862 var url = isLink && $clickedLinkEl.attr('href');
5d51ea26 9863 // const isTabLink = isLink && $clickedLinkEl.hasClass('tab-link') && ($clickedLinkEl.attr('data-tab') || (url && url.indexOf('#') === 0));
5309fbda
DC
9864
9865 // Check if link is external
9866 if (isLink) {
9867 // eslint-disable-next-line
9868 if ($clickedLinkEl.is(app.params.clicks.externalLinks) || (url && url.indexOf('javascript:') >= 0)) {
9869 var target = $clickedLinkEl.attr('target');
9870 if (
9871 url
9872 && win.cordova
9873 && win.cordova.InAppBrowser
9874 && (target === '_system' || target === '_blank')
9875 ) {
9876 e.preventDefault();
9877 win.cordova.InAppBrowser.open(url, target);
9878 }
9879 return;
9880 }
9881 }
9882
9883 // Modules Clicks
9884 Object.keys(app.modules).forEach(function (moduleName) {
9885 var moduleClicks = app.modules[moduleName].clicks;
9886 if (!moduleClicks) { return; }
5d51ea26 9887 if (e.preventF7Router) { return; }
5309fbda
DC
9888 Object.keys(moduleClicks).forEach(function (clickSelector) {
9889 var matchingClickedElement = $clickedEl.closest(clickSelector).eq(0);
9890 if (matchingClickedElement.length > 0) {
9891 moduleClicks[clickSelector].call(app, matchingClickedElement, matchingClickedElement.dataset(), e);
9892 }
9893 });
9894 });
9895
5309fbda
DC
9896 // Load Page
9897 var clickedLinkData = {};
9898 if (isLink) {
9899 e.preventDefault();
9900 clickedLinkData = $clickedLinkEl.dataset();
9901 }
9902
9903 // Prevent Router
5d51ea26 9904 if (e.preventF7Router) { return; }
5309fbda
DC
9905 if ($clickedLinkEl.hasClass('prevent-router') || $clickedLinkEl.hasClass('router-prevent')) { return; }
9906
5d51ea26 9907 var validUrl = url && url.length > 0 && url[0] !== '#';
5309fbda
DC
9908 if (validUrl || $clickedLinkEl.hasClass('back')) {
9909 var view;
9910 if (clickedLinkData.view) {
9911 view = $(clickedLinkData.view)[0].f7View;
9912 } else {
9913 view = $clickedEl.parents('.view')[0] && $clickedEl.parents('.view')[0].f7View;
9914 if (!$clickedLinkEl.hasClass('back') && view && view.params.linksView) {
9915 if (typeof view.params.linksView === 'string') { view = $(view.params.linksView)[0].f7View; }
9916 else if (view.params.linksView instanceof View) { view = view.params.linksView; }
9917 }
9918 }
9919 if (!view) {
9920 if (app.views.main) { view = app.views.main; }
9921 }
9922 if (!view || !view.router) { return; }
9923 if (clickedLinkData.context && typeof clickedLinkData.context === 'string') {
9924 try {
9925 clickedLinkData.context = JSON.parse(clickedLinkData.context);
9926 } catch (err) {
9927 // something wrong there
9928 }
9929 }
9930 if ($clickedLinkEl[0].f7RouteProps) {
9931 clickedLinkData.props = $clickedLinkEl[0].f7RouteProps;
9932 }
9933 if ($clickedLinkEl.hasClass('back')) { view.router.back(url, clickedLinkData); }
9934 else { view.router.navigate(url, clickedLinkData); }
9935 }
9936 }
9937
9938 app.on('click', handleClicks);
9939
9940 // TODO: check if need this in iOS
9941 // Prevent scrolling on overlays
9942 // function preventScrolling(e) {
9943 // e.preventDefault();
9944 // }
9945 // if (Support.touch && !Device.android) {
9946 // const activeListener = Support.passiveListener ? { passive: false, capture: false } : false;
9947 // $(document).on((app.params.touch.fastClicks ? 'touchstart' : 'touchmove'), '.panel-backdrop, .dialog-backdrop, .preloader-backdrop, .popup-backdrop, .searchbar-backdrop', preventScrolling, activeListener);
9948 // }
9949 }
9950 var ClicksModule = {
9951 name: 'clicks',
9952 params: {
9953 clicks: {
9954 // External Links
9955 externalLinks: '.external',
9956 },
9957 },
9958 on: {
9959 init: function init() {
9960 var app = this;
9961 initClicks(app);
9962 },
9963 },
9964 };
9965
9966 var RouterTemplateLoaderModule = {
9967 name: 'routerTemplateLoader',
9968 proto: {
9969 templateLoader: function templateLoader(template, templateUrl, options, resolve, reject) {
9970 var router = this;
9971 function compile(t) {
9972 var compiledHtml;
9973 var context;
9974 try {
9975 context = options.context || {};
9976 if (typeof context === 'function') { context = context.call(router); }
9977 else if (typeof context === 'string') {
9978 try {
9979 context = JSON.parse(context);
9980 } catch (err) {
9981 reject();
9982 throw (err);
9983 }
9984 }
9985 if (typeof t === 'function') {
9986 compiledHtml = t(context);
9987 } else {
9988 compiledHtml = Template7.compile(t)(Utils.extend({}, context || {}, {
9989 $app: router.app,
9990 $root: Utils.extend({}, router.app.data, router.app.methods),
9991 $route: options.route,
9992 $f7route: options.route,
9993 $router: router,
9994 $f7router: router,
9995 $theme: {
9996 ios: router.app.theme === 'ios',
9997 md: router.app.theme === 'md',
5d51ea26 9998 aurora: router.app.theme === 'aurora',
5309fbda
DC
9999 },
10000 }));
10001 }
10002 } catch (err) {
10003 reject();
10004 throw (err);
10005 }
10006 resolve(compiledHtml, { context: context });
10007 }
10008 if (templateUrl) {
10009 // Load via XHR
10010 if (router.xhr) {
10011 router.xhr.abort();
10012 router.xhr = false;
10013 }
10014 router
10015 .xhrRequest(templateUrl, options)
10016 .then(function (templateContent) {
10017 compile(templateContent);
10018 })
10019 .catch(function () {
10020 reject();
10021 });
10022 } else {
10023 compile(template);
10024 }
10025 },
10026
10027 modalTemplateLoader: function modalTemplateLoader(template, templateUrl, options, resolve, reject) {
10028 var router = this;
10029 return router.templateLoader(template, templateUrl, options, function (html) {
10030 resolve(html);
10031 }, reject);
10032 },
10033
10034 tabTemplateLoader: function tabTemplateLoader(template, templateUrl, options, resolve, reject) {
10035 var router = this;
10036 return router.templateLoader(template, templateUrl, options, function (html) {
10037 resolve(html);
10038 }, reject);
10039 },
10040
10041 pageTemplateLoader: function pageTemplateLoader(template, templateUrl, options, resolve, reject) {
10042 var router = this;
10043 return router.templateLoader(template, templateUrl, options, function (html, newOptions) {
10044 if ( newOptions === void 0 ) newOptions = {};
10045
10046 resolve(router.getPageEl(html), newOptions);
10047 }, reject);
10048 },
10049 },
10050 };
10051
10052 var RouterComponentLoaderModule = {
10053 name: 'routerComponentLoader',
10054 proto: {
10055 componentLoader: function componentLoader(component, componentUrl, options, resolve, reject) {
10056 if ( options === void 0 ) options = {};
10057
10058 var router = this;
10059 var app = router.app;
10060 var url = typeof component === 'string' ? component : componentUrl;
10061 var compiledUrl = router.replaceRequestUrlParams(url, options);
10062 function compile(componentOptions) {
10063 var context = options.context || {};
10064 if (typeof context === 'function') { context = context.call(router); }
10065 else if (typeof context === 'string') {
10066 try {
10067 context = JSON.parse(context);
10068 } catch (err) {
10069 reject();
10070 throw (err);
10071 }
10072 }
10073 var extendContext = Utils.merge(
10074 {},
10075 context,
10076 {
10077 $route: options.route,
10078 $f7route: options.route,
10079 $router: router,
10080 $f7router: router,
10081 $theme: {
10082 ios: app.theme === 'ios',
10083 md: app.theme === 'md',
5d51ea26 10084 aurora: app.theme === 'aurora',
5309fbda
DC
10085 },
10086 }
10087 );
10088 var createdComponent = app.component.create(componentOptions, extendContext);
10089 resolve(createdComponent.el);
10090 }
10091 var cachedComponent;
10092 if (compiledUrl) {
10093 router.cache.components.forEach(function (cached) {
10094 if (cached.url === compiledUrl) { cachedComponent = cached.component; }
10095 });
10096 }
10097 if (compiledUrl && cachedComponent) {
10098 compile(cachedComponent);
10099 } else if (compiledUrl && !cachedComponent) {
10100 // Load via XHR
10101 if (router.xhr) {
10102 router.xhr.abort();
10103 router.xhr = false;
10104 }
10105 router
10106 .xhrRequest(url, options)
10107 .then(function (loadedComponent) {
10108 var parsedComponent = app.component.parse(loadedComponent);
10109 router.cache.components.push({
10110 url: compiledUrl,
10111 component: parsedComponent,
10112 });
10113 compile(parsedComponent);
10114 })
10115 .catch(function (err) {
10116 reject();
10117 throw (err);
10118 });
10119 } else {
10120 compile(component);
10121 }
10122 },
10123
10124 modalComponentLoader: function modalComponentLoader(rootEl, component, componentUrl, options, resolve, reject) {
10125 var router = this;
10126 router.componentLoader(component, componentUrl, options, function (el) {
10127 resolve(el);
10128 }, reject);
10129 },
10130
10131 tabComponentLoader: function tabComponentLoader(tabEl, component, componentUrl, options, resolve, reject) {
10132 var router = this;
10133 router.componentLoader(component, componentUrl, options, function (el) {
10134 resolve(el);
10135 }, reject);
10136 },
10137
10138 pageComponentLoader: function pageComponentLoader(routerEl, component, componentUrl, options, resolve, reject) {
10139 var router = this;
10140 router.componentLoader(component, componentUrl, options, function (el, newOptions) {
10141 if ( newOptions === void 0 ) newOptions = {};
10142
10143 resolve(el, newOptions);
10144 }, reject);
10145 },
10146 },
10147 };
10148
10149 var HistoryModule = {
10150 name: 'history',
10151 static: {
10152 history: History,
10153 },
10154 on: {
10155 init: function init() {
10156 History.init(this);
10157 },
10158 },
10159 };
10160
10161 var keyPrefix = 'f7storage-';
10162 var Storage = {
10163 get: function get(key) {
10164 return new Promise(function (resolve, reject) {
10165 try {
10166 var value = JSON.parse(win.localStorage.getItem(("" + keyPrefix + key)));
10167 resolve(value);
10168 } catch (e) {
10169 reject(e);
10170 }
10171 });
10172 },
10173 set: function set(key, value) {
10174 return new Promise(function (resolve, reject) {
10175 try {
10176 win.localStorage.setItem(("" + keyPrefix + key), JSON.stringify(value));
10177 resolve();
10178 } catch (e) {
10179 reject(e);
10180 }
10181 });
10182 },
10183 remove: function remove(key) {
10184 return new Promise(function (resolve, reject) {
10185 try {
10186 win.localStorage.removeItem(("" + keyPrefix + key));
10187 resolve();
10188 } catch (e) {
10189 reject(e);
10190 }
10191 });
10192 },
10193 clear: function clear() {
10194
10195 },
10196 length: function length() {
10197
10198 },
10199 keys: function keys() {
10200 return new Promise(function (resolve, reject) {
10201 try {
10202 var keys = Object.keys(win.localStorage)
10203 .filter(function (keyName) { return keyName.indexOf(keyPrefix) === 0; })
10204 .map(function (keyName) { return keyName.replace(keyPrefix, ''); });
10205 resolve(keys);
10206 } catch (e) {
10207 reject(e);
10208 }
10209 });
10210 },
10211 forEach: function forEach(callback) {
10212 return new Promise(function (resolve, reject) {
10213 try {
10214 Object.keys(win.localStorage)
10215 .filter(function (keyName) { return keyName.indexOf(keyPrefix) === 0; })
10216 .forEach(function (keyName, index) {
10217 var key = keyName.replace(keyPrefix, '');
10218 Storage.get(key).then(function (value) {
10219 callback(key, value, index);
10220 });
10221 });
10222 resolve();
10223 } catch (e) {
10224 reject(e);
10225 }
10226 });
10227 },
10228 };
10229
10230 var StorageModule = {
10231 name: 'storage',
10232 static: {
10233 Storage: Storage,
10234 storage: Storage,
10235 },
10236 };
10237
10238 function vnode(sel, data, children, text, elm) {
10239 var key = data === undefined ? undefined : data.key;
10240 return { sel: sel, data: data, children: children,
10241 text: text, elm: elm, key: key };
10242 }
10243
10244 var array = Array.isArray;
10245 function primitive(s) {
10246 return typeof s === 'string' || typeof s === 'number';
10247 }
10248
10249 function addNS(data, children, sel) {
10250 data.ns = 'http://www.w3.org/2000/svg';
10251 if (sel !== 'foreignObject' && children !== undefined) {
10252 for (var i = 0; i < children.length; ++i) {
10253 var childData = children[i].data;
10254 if (childData !== undefined) {
10255 addNS(childData, children[i].children, children[i].sel);
10256 }
10257 }
10258 }
10259 }
10260 function h(sel, b, c) {
10261 var data = {}, children, text, i;
10262 if (c !== undefined) {
10263 data = b;
10264 if (array(c)) {
10265 children = c;
10266 }
10267 else if (primitive(c)) {
10268 text = c;
10269 }
10270 else if (c && c.sel) {
10271 children = [c];
10272 }
10273 }
10274 else if (b !== undefined) {
10275 if (array(b)) {
10276 children = b;
10277 }
10278 else if (primitive(b)) {
10279 text = b;
10280 }
10281 else if (b && b.sel) {
10282 children = [b];
10283 }
10284 else {
10285 data = b;
10286 }
10287 }
10288 if (array(children)) {
10289 for (i = 0; i < children.length; ++i) {
10290 if (primitive(children[i]))
10291 { children[i] = vnode(undefined, undefined, undefined, children[i], undefined); }
10292 }
10293 }
10294 if (sel[0] === 's' && sel[1] === 'v' && sel[2] === 'g' &&
10295 (sel.length === 3 || sel[3] === '.' || sel[3] === '#')) {
10296 addNS(data, children, sel);
10297 }
10298 return vnode(sel, data, children, text, undefined);
10299 }
10300
10301 /* eslint no-use-before-define: "off" */
10302
10303 var selfClosing = 'area base br col command embed hr img input keygen link menuitem meta param source track wbr'.split(' ');
5d51ea26
DC
10304 var propsAttrs = 'hidden checked disabled readonly selected autocomplete autofocus autoplay required multiple value indeterminate'.split(' ');
10305 var booleanProps = 'hidden checked disabled readonly selected autocomplete autofocus autoplay required multiple readOnly indeterminate'.split(' ');
5309fbda
DC
10306 var tempDom = doc.createElement('div');
10307
10308 function getHooks(data, app, initial, isRoot) {
10309 var hooks = {};
10310 if (!data || !data.attrs || !data.attrs.class) { return hooks; }
10311 var classNames = data.attrs.class;
10312 var insert = [];
10313 var destroy = [];
10314 var update = [];
10315 var postpatch = [];
10316 classNames.split(' ').forEach(function (className) {
10317 if (!initial) {
10318 insert.push.apply(insert, app.getVnodeHooks('insert', className));
10319 }
10320 destroy.push.apply(destroy, app.getVnodeHooks('destroy', className));
10321 update.push.apply(update, app.getVnodeHooks('update', className));
10322 postpatch.push.apply(postpatch, app.getVnodeHooks('postpatch', className));
10323 });
10324
10325 if (isRoot && !initial) {
10326 postpatch.push(function (oldVnode, vnode) {
10327 var vn = vnode || oldVnode;
10328 if (!vn) { return; }
10329 if (vn.data && vn.data.context && vn.data.context.$options.updated) {
10330 vn.data.context.$options.updated();
10331 }
10332 });
10333 }
10334 if (insert.length === 0 && destroy.length === 0 && update.length === 0 && postpatch.length === 0) {
10335 return hooks;
10336 }
10337 if (insert.length) {
10338 hooks.insert = function (vnode) {
10339 insert.forEach(function (f) { return f(vnode); });
10340 };
10341 }
10342 if (destroy.length) {
10343 hooks.destroy = function (vnode) {
10344 destroy.forEach(function (f) { return f(vnode); });
10345 };
10346 }
10347 if (update.length) {
10348 hooks.update = function (oldVnode, vnode) {
10349 update.forEach(function (f) { return f(oldVnode, vnode); });
10350 };
10351 }
10352 if (postpatch.length) {
10353 hooks.postpatch = function (oldVnode, vnode) {
10354 postpatch.forEach(function (f) { return f(oldVnode, vnode); });
10355 };
10356 }
10357
10358 return hooks;
10359 }
10360 function getEventHandler(handlerString, context, ref) {
10361 if ( ref === void 0 ) ref = {};
10362 var stop = ref.stop;
10363 var prevent = ref.prevent;
10364 var once = ref.once;
10365
10366 var fired = false;
5309fbda
DC
10367 var methodName;
10368 var method;
10369 var customArgs = [];
10370 var needMethodBind = true;
10371
10372 if (handlerString.indexOf('(') < 0) {
10373 methodName = handlerString;
10374 } else {
10375 methodName = handlerString.split('(')[0];
10376 }
10377 if (methodName.indexOf('.') >= 0) {
10378 methodName.split('.').forEach(function (path, pathIndex) {
10379 if (pathIndex === 0 && path === 'this') { return; }
10380 if (pathIndex === 0 && path === 'window') {
10381 // eslint-disable-next-line
10382 method = win;
10383 needMethodBind = false;
10384 return;
10385 }
10386 if (!method) { method = context; }
10387 if (method[path]) { method = method[path]; }
10388 else {
10389 throw new Error(("Framework7: Component doesn't have method \"" + (methodName.split('.').slice(0, pathIndex + 1).join('.')) + "\""));
10390 }
10391 });
10392 } else {
10393 if (!context[methodName]) {
10394 throw new Error(("Framework7: Component doesn't have method \"" + methodName + "\""));
10395 }
10396 method = context[methodName];
10397 }
10398 if (needMethodBind) {
10399 method = method.bind(context);
10400 }
10401
10402 function handler() {
10403 var args = [], len = arguments.length;
10404 while ( len-- ) args[ len ] = arguments[ len ];
10405
10406 var e = args[0];
10407 if (once && fired) { return; }
10408 if (stop) { e.stopPropagation(); }
10409 if (prevent) { e.preventDefault(); }
10410 fired = true;
10411
10412 if (handlerString.indexOf('(') < 0) {
10413 customArgs = args;
10414 } else {
5d51ea26
DC
10415 var handlerArguments = handlerString
10416 .split('(')[1]
10417 .split(')')[0]
10418 .replace(/'[^']*'|"[^"]*"/g, function (a) { return a.replace(/,/g, '<_comma_>'); })
10419 .split(',')
10420 .map(function (a) { return a.replace(/<_comma_>/g, ','); });
10421 handlerArguments.forEach(function (argument) {
5309fbda
DC
10422 var arg = argument.trim();
10423 // eslint-disable-next-line
10424 if (!isNaN(arg)) { arg = parseFloat(arg); }
10425 else if (arg === 'true') { arg = true; }
10426 else if (arg === 'false') { arg = false; }
10427 else if (arg === 'null') { arg = null; }
10428 else if (arg === 'undefined') { arg = undefined; }
10429 else if (arg[0] === '"') { arg = arg.replace(/"/g, ''); }
10430 else if (arg[0] === '\'') { arg = arg.replace(/'/g, ''); }
10431 else if (arg.indexOf('.') > 0) {
10432 var deepArg;
10433 arg.split('.').forEach(function (path) {
10434 if (!deepArg) { deepArg = context; }
10435 deepArg = deepArg[path];
10436 });
10437 arg = deepArg;
10438 } else {
10439 arg = context[arg];
10440 }
10441 customArgs.push(arg);
10442 });
10443 }
10444
10445 method.apply(void 0, customArgs);
10446 }
10447
10448 return handler;
10449 }
10450
10451 function getData(el, context, app, initial, isRoot) {
10452 var data = {
10453 context: context,
10454 };
10455 var attributes = el.attributes;
10456 Array.prototype.forEach.call(attributes, function (attr) {
10457 var attrName = attr.name;
10458 var attrValue = attr.value;
10459 if (propsAttrs.indexOf(attrName) >= 0) {
10460 // Props
10461 if (!data.props) { data.props = {}; }
10462 if (attrName === 'readonly') {
10463 attrName = 'readOnly';
10464 }
10465 if (booleanProps.indexOf(attrName) >= 0) {
10466 // eslint-disable-next-line
10467 data.props[attrName] = attrValue === false ? false : true;
10468 } else {
10469 data.props[attrName] = attrValue;
10470 }
10471 } else if (attrName === 'key') {
10472 // Key
10473 data.key = attrValue;
10474 } else if (attrName.indexOf('@') === 0) {
10475 // Events
10476 if (!data.on) { data.on = {}; }
10477 var eventName = attrName.substr(1);
10478 var stop = false;
10479 var prevent = false;
10480 var once = false;
10481 if (eventName.indexOf('.') >= 0) {
10482 eventName.split('.').forEach(function (eventNamePart, eventNameIndex) {
10483 if (eventNameIndex === 0) { eventName = eventNamePart; }
10484 else {
10485 if (eventNamePart === 'stop') { stop = true; }
10486 if (eventNamePart === 'prevent') { prevent = true; }
10487 if (eventNamePart === 'once') { once = true; }
10488 }
10489 });
10490 }
10491 data.on[eventName] = getEventHandler(attrValue, context, { stop: stop, prevent: prevent, once: once });
10492 } else if (attrName === 'style') {
10493 // Style
10494 if (attrValue.indexOf('{') >= 0 && attrValue.indexOf('}') >= 0) {
10495 try {
10496 data.style = JSON.parse(attrValue);
10497 } catch (e) {
10498 if (!data.attrs) { data.attrs = {}; }
10499 data.attrs.style = attrValue;
10500 }
10501 } else {
10502 if (!data.attrs) { data.attrs = {}; }
10503 data.attrs.style = attrValue;
10504 }
10505 } else {
10506 // Rest of attribures
10507 if (!data.attrs) { data.attrs = {}; }
10508 data.attrs[attrName] = attrValue;
10509
10510 // ID -> Key
10511 if (attrName === 'id' && !data.key && !isRoot) {
10512 data.key = attrValue;
10513 }
10514 }
10515 });
10516 var hooks = getHooks(data, app, initial, isRoot);
10517 hooks.prepatch = function (oldVnode, vnode) {
10518 if (!oldVnode || !vnode) { return; }
10519 if (oldVnode && oldVnode.data && oldVnode.data.props) {
10520 Object.keys(oldVnode.data.props).forEach(function (key) {
10521 if (booleanProps.indexOf(key) < 0) { return; }
10522 if (!vnode.data) { vnode.data = {}; }
10523 if (!vnode.data.props) { vnode.data.props = {}; }
10524 if (oldVnode.data.props[key] === true && !(key in vnode.data.props)) {
10525 vnode.data.props[key] = false;
10526 }
10527 });
10528 }
10529 };
10530 if (hooks) {
10531 data.hook = hooks;
10532 }
10533 return data;
10534 }
10535
10536 function getChildren(el, context, app, initial) {
10537 var children = [];
10538 var nodes = el.childNodes;
10539 for (var i = 0; i < nodes.length; i += 1) {
10540 var childNode = nodes[i];
10541 var child = elementToVNode(childNode, context, app, initial);
10542 if (child) {
10543 children.push(child);
10544 }
10545 }
10546 return children;
10547 }
10548
10549 function elementToVNode(el, context, app, initial, isRoot) {
10550 if (el.nodeType === 1) {
5d51ea26
DC
10551 // element (statement adds inline SVG compatibility)
10552 var tagName = (el instanceof win.SVGElement) ? el.nodeName : el.nodeName.toLowerCase();
5309fbda
DC
10553 return h(
10554 tagName,
10555 getData(el, context, app, initial, isRoot),
10556 selfClosing.indexOf(tagName) >= 0 ? [] : getChildren(el, context, app, initial)
10557 );
10558 }
10559 if (el.nodeType === 3) {
10560 // text
10561 return el.textContent;
10562 }
10563 return null;
10564 }
10565
10566 function vdom (html, context, app, initial) {
10567 if ( html === void 0 ) html = '';
10568
10569 // Save to temp dom
10570 tempDom.innerHTML = html.trim();
10571
10572 // Parse DOM
10573 var rootEl;
10574 for (var i = 0; i < tempDom.childNodes.length; i += 1) {
10575 if (!rootEl && tempDom.childNodes[i].nodeType === 1) {
10576 rootEl = tempDom.childNodes[i];
10577 }
10578 }
10579 var result = elementToVNode(rootEl, context, app, initial, true);
10580
10581 // Clean
10582 tempDom.innerHTML = '';
10583
10584 return result;
10585 }
10586
10587 function createElement(tagName) {
10588 return document.createElement(tagName);
10589 }
10590 function createElementNS(namespaceURI, qualifiedName) {
10591 return document.createElementNS(namespaceURI, qualifiedName);
10592 }
10593 function createTextNode(text) {
10594 return document.createTextNode(text);
10595 }
10596 function createComment(text) {
10597 return document.createComment(text);
10598 }
10599 function insertBefore$1(parentNode, newNode, referenceNode) {
10600 parentNode.insertBefore(newNode, referenceNode);
10601 }
10602 function removeChild(node, child) {
10603 if (!node) { return; }
10604 node.removeChild(child);
10605 }
10606 function appendChild(node, child) {
10607 node.appendChild(child);
10608 }
10609 function parentNode(node) {
10610 return node.parentNode;
10611 }
10612 function nextSibling(node) {
10613 return node.nextSibling;
10614 }
10615 function tagName(elm) {
10616 return elm.tagName;
10617 }
10618 function setTextContent(node, text) {
10619 node.textContent = text;
10620 }
10621 function getTextContent(node) {
10622 return node.textContent;
10623 }
10624 function isElement(node) {
10625 return node.nodeType === 1;
10626 }
10627 function isText(node) {
10628 return node.nodeType === 3;
10629 }
10630 function isComment(node) {
10631 return node.nodeType === 8;
10632 }
10633 var htmlDomApi = {
10634 createElement: createElement,
10635 createElementNS: createElementNS,
10636 createTextNode: createTextNode,
10637 createComment: createComment,
10638 insertBefore: insertBefore$1,
10639 removeChild: removeChild,
10640 appendChild: appendChild,
10641 parentNode: parentNode,
10642 nextSibling: nextSibling,
10643 tagName: tagName,
10644 setTextContent: setTextContent,
10645 getTextContent: getTextContent,
10646 isElement: isElement,
10647 isText: isText,
10648 isComment: isComment,
10649 };
10650
10651 function isUndef(s) { return s === undefined; }
10652 function isDef(s) { return s !== undefined; }
10653 var emptyNode = vnode('', {}, [], undefined, undefined);
10654 function sameVnode(vnode1, vnode2) {
10655 return vnode1.key === vnode2.key && vnode1.sel === vnode2.sel;
10656 }
5d51ea26
DC
10657 function isVnode(vnode) {
10658 return vnode.sel !== undefined;
5309fbda
DC
10659 }
10660 function createKeyToOldIdx(children, beginIdx, endIdx) {
10661 var i, map = {}, key, ch;
10662 for (i = beginIdx; i <= endIdx; ++i) {
10663 ch = children[i];
10664 if (ch != null) {
10665 key = ch.key;
10666 if (key !== undefined)
10667 { map[key] = i; }
10668 }
10669 }
10670 return map;
10671 }
10672 var hooks = ['create', 'update', 'remove', 'destroy', 'pre', 'post'];
5d51ea26 10673 function init(modules, domApi) {
5309fbda
DC
10674 var i, j, cbs = {};
10675 var api = domApi !== undefined ? domApi : htmlDomApi;
10676 for (i = 0; i < hooks.length; ++i) {
10677 cbs[hooks[i]] = [];
10678 for (j = 0; j < modules.length; ++j) {
10679 var hook = modules[j][hooks[i]];
10680 if (hook !== undefined) {
10681 cbs[hooks[i]].push(hook);
10682 }
10683 }
10684 }
10685 function emptyNodeAt(elm) {
10686 var id = elm.id ? '#' + elm.id : '';
10687 var c = elm.className ? '.' + elm.className.split(' ').join('.') : '';
10688 return vnode(api.tagName(elm).toLowerCase() + id + c, {}, [], undefined, elm);
10689 }
10690 function createRmCb(childElm, listeners) {
10691 return function rmCb() {
10692 if (--listeners === 0) {
10693 var parent_1 = api.parentNode(childElm);
10694 api.removeChild(parent_1, childElm);
10695 }
10696 };
10697 }
5d51ea26
DC
10698 function createElm(vnode, insertedVnodeQueue) {
10699 var i, data = vnode.data;
5309fbda
DC
10700 if (data !== undefined) {
10701 if (isDef(i = data.hook) && isDef(i = i.init)) {
5d51ea26
DC
10702 i(vnode);
10703 data = vnode.data;
5309fbda
DC
10704 }
10705 }
5d51ea26 10706 var children = vnode.children, sel = vnode.sel;
5309fbda 10707 if (sel === '!') {
5d51ea26
DC
10708 if (isUndef(vnode.text)) {
10709 vnode.text = '';
5309fbda 10710 }
5d51ea26 10711 vnode.elm = api.createComment(vnode.text);
5309fbda
DC
10712 }
10713 else if (sel !== undefined) {
10714 // Parse selector
10715 var hashIdx = sel.indexOf('#');
10716 var dotIdx = sel.indexOf('.', hashIdx);
10717 var hash = hashIdx > 0 ? hashIdx : sel.length;
10718 var dot = dotIdx > 0 ? dotIdx : sel.length;
10719 var tag = hashIdx !== -1 || dotIdx !== -1 ? sel.slice(0, Math.min(hash, dot)) : sel;
5d51ea26 10720 var elm = vnode.elm = isDef(data) && isDef(i = data.ns) ? api.createElementNS(i, tag)
5309fbda
DC
10721 : api.createElement(tag);
10722 if (hash < dot)
10723 { elm.setAttribute('id', sel.slice(hash + 1, dot)); }
10724 if (dotIdx > 0)
10725 { elm.setAttribute('class', sel.slice(dot + 1).replace(/\./g, ' ')); }
10726 for (i = 0; i < cbs.create.length; ++i)
5d51ea26 10727 { cbs.create[i](emptyNode, vnode); }
5309fbda
DC
10728 if (array(children)) {
10729 for (i = 0; i < children.length; ++i) {
10730 var ch = children[i];
10731 if (ch != null) {
10732 api.appendChild(elm, createElm(ch, insertedVnodeQueue));
10733 }
10734 }
10735 }
5d51ea26
DC
10736 else if (primitive(vnode.text)) {
10737 api.appendChild(elm, api.createTextNode(vnode.text));
5309fbda 10738 }
5d51ea26 10739 i = vnode.data.hook; // Reuse variable
5309fbda
DC
10740 if (isDef(i)) {
10741 if (i.create)
5d51ea26 10742 { i.create(emptyNode, vnode); }
5309fbda 10743 if (i.insert)
5d51ea26 10744 { insertedVnodeQueue.push(vnode); }
5309fbda
DC
10745 }
10746 }
10747 else {
5d51ea26 10748 vnode.elm = api.createTextNode(vnode.text);
5309fbda 10749 }
5d51ea26 10750 return vnode.elm;
5309fbda
DC
10751 }
10752 function addVnodes(parentElm, before, vnodes, startIdx, endIdx, insertedVnodeQueue) {
10753 for (; startIdx <= endIdx; ++startIdx) {
10754 var ch = vnodes[startIdx];
10755 if (ch != null) {
10756 api.insertBefore(parentElm, createElm(ch, insertedVnodeQueue), before);
10757 }
10758 }
10759 }
5d51ea26
DC
10760 function invokeDestroyHook(vnode) {
10761 var i, j, data = vnode.data;
5309fbda
DC
10762 if (data !== undefined) {
10763 if (isDef(i = data.hook) && isDef(i = i.destroy))
5d51ea26 10764 { i(vnode); }
5309fbda 10765 for (i = 0; i < cbs.destroy.length; ++i)
5d51ea26
DC
10766 { cbs.destroy[i](vnode); }
10767 if (vnode.children !== undefined) {
10768 for (j = 0; j < vnode.children.length; ++j) {
10769 i = vnode.children[j];
5309fbda
DC
10770 if (i != null && typeof i !== "string") {
10771 invokeDestroyHook(i);
10772 }
10773 }
10774 }
10775 }
10776 }
10777 function removeVnodes(parentElm, vnodes, startIdx, endIdx) {
10778 for (; startIdx <= endIdx; ++startIdx) {
10779 var i_1 = void 0, listeners = void 0, rm = void 0, ch = vnodes[startIdx];
10780 if (ch != null) {
10781 if (isDef(ch.sel)) {
10782 invokeDestroyHook(ch);
10783 listeners = cbs.remove.length + 1;
10784 rm = createRmCb(ch.elm, listeners);
10785 for (i_1 = 0; i_1 < cbs.remove.length; ++i_1)
10786 { cbs.remove[i_1](ch, rm); }
10787 if (isDef(i_1 = ch.data) && isDef(i_1 = i_1.hook) && isDef(i_1 = i_1.remove)) {
10788 i_1(ch, rm);
10789 }
10790 else {
10791 rm();
10792 }
10793 }
10794 else {
10795 api.removeChild(parentElm, ch.elm);
10796 }
10797 }
10798 }
10799 }
10800 function updateChildren(parentElm, oldCh, newCh, insertedVnodeQueue) {
10801 var oldStartIdx = 0, newStartIdx = 0;
10802 var oldEndIdx = oldCh.length - 1;
10803 var oldStartVnode = oldCh[0];
10804 var oldEndVnode = oldCh[oldEndIdx];
10805 var newEndIdx = newCh.length - 1;
10806 var newStartVnode = newCh[0];
10807 var newEndVnode = newCh[newEndIdx];
10808 var oldKeyToIdx;
10809 var idxInOld;
10810 var elmToMove;
10811 var before;
10812 while (oldStartIdx <= oldEndIdx && newStartIdx <= newEndIdx) {
10813 if (oldStartVnode == null) {
10814 oldStartVnode = oldCh[++oldStartIdx]; // Vnode might have been moved left
10815 }
10816 else if (oldEndVnode == null) {
10817 oldEndVnode = oldCh[--oldEndIdx];
10818 }
10819 else if (newStartVnode == null) {
10820 newStartVnode = newCh[++newStartIdx];
10821 }
10822 else if (newEndVnode == null) {
10823 newEndVnode = newCh[--newEndIdx];
10824 }
10825 else if (sameVnode(oldStartVnode, newStartVnode)) {
10826 patchVnode(oldStartVnode, newStartVnode, insertedVnodeQueue);
10827 oldStartVnode = oldCh[++oldStartIdx];
10828 newStartVnode = newCh[++newStartIdx];
10829 }
10830 else if (sameVnode(oldEndVnode, newEndVnode)) {
10831 patchVnode(oldEndVnode, newEndVnode, insertedVnodeQueue);
10832 oldEndVnode = oldCh[--oldEndIdx];
10833 newEndVnode = newCh[--newEndIdx];
10834 }
10835 else if (sameVnode(oldStartVnode, newEndVnode)) {
10836 patchVnode(oldStartVnode, newEndVnode, insertedVnodeQueue);
10837 api.insertBefore(parentElm, oldStartVnode.elm, api.nextSibling(oldEndVnode.elm));
10838 oldStartVnode = oldCh[++oldStartIdx];
10839 newEndVnode = newCh[--newEndIdx];
10840 }
10841 else if (sameVnode(oldEndVnode, newStartVnode)) {
10842 patchVnode(oldEndVnode, newStartVnode, insertedVnodeQueue);
10843 api.insertBefore(parentElm, oldEndVnode.elm, oldStartVnode.elm);
10844 oldEndVnode = oldCh[--oldEndIdx];
10845 newStartVnode = newCh[++newStartIdx];
10846 }
10847 else {
10848 if (oldKeyToIdx === undefined) {
10849 oldKeyToIdx = createKeyToOldIdx(oldCh, oldStartIdx, oldEndIdx);
10850 }
10851 idxInOld = oldKeyToIdx[newStartVnode.key];
10852 if (isUndef(idxInOld)) {
10853 api.insertBefore(parentElm, createElm(newStartVnode, insertedVnodeQueue), oldStartVnode.elm);
10854 newStartVnode = newCh[++newStartIdx];
10855 }
10856 else {
10857 elmToMove = oldCh[idxInOld];
10858 if (elmToMove.sel !== newStartVnode.sel) {
10859 api.insertBefore(parentElm, createElm(newStartVnode, insertedVnodeQueue), oldStartVnode.elm);
10860 }
10861 else {
10862 patchVnode(elmToMove, newStartVnode, insertedVnodeQueue);
10863 oldCh[idxInOld] = undefined;
10864 api.insertBefore(parentElm, elmToMove.elm, oldStartVnode.elm);
10865 }
10866 newStartVnode = newCh[++newStartIdx];
10867 }
10868 }
10869 }
10870 if (oldStartIdx <= oldEndIdx || newStartIdx <= newEndIdx) {
10871 if (oldStartIdx > oldEndIdx) {
10872 before = newCh[newEndIdx + 1] == null ? null : newCh[newEndIdx + 1].elm;
10873 addVnodes(parentElm, before, newCh, newStartIdx, newEndIdx, insertedVnodeQueue);
10874 }
10875 else {
10876 removeVnodes(parentElm, oldCh, oldStartIdx, oldEndIdx);
10877 }
10878 }
10879 }
5d51ea26 10880 function patchVnode(oldVnode, vnode, insertedVnodeQueue) {
5309fbda 10881 var i, hook;
5d51ea26
DC
10882 if (isDef(i = vnode.data) && isDef(hook = i.hook) && isDef(i = hook.prepatch)) {
10883 i(oldVnode, vnode);
5309fbda 10884 }
5d51ea26 10885 var elm = vnode.elm = oldVnode.elm;
5309fbda 10886 var oldCh = oldVnode.children;
5d51ea26
DC
10887 var ch = vnode.children;
10888 if (oldVnode === vnode)
5309fbda 10889 { return; }
5d51ea26 10890 if (vnode.data !== undefined) {
5309fbda 10891 for (i = 0; i < cbs.update.length; ++i)
5d51ea26
DC
10892 { cbs.update[i](oldVnode, vnode); }
10893 i = vnode.data.hook;
5309fbda 10894 if (isDef(i) && isDef(i = i.update))
5d51ea26 10895 { i(oldVnode, vnode); }
5309fbda 10896 }
5d51ea26 10897 if (isUndef(vnode.text)) {
5309fbda
DC
10898 if (isDef(oldCh) && isDef(ch)) {
10899 if (oldCh !== ch)
10900 { updateChildren(elm, oldCh, ch, insertedVnodeQueue); }
10901 }
10902 else if (isDef(ch)) {
10903 if (isDef(oldVnode.text))
10904 { api.setTextContent(elm, ''); }
10905 addVnodes(elm, null, ch, 0, ch.length - 1, insertedVnodeQueue);
10906 }
10907 else if (isDef(oldCh)) {
10908 removeVnodes(elm, oldCh, 0, oldCh.length - 1);
10909 }
10910 else if (isDef(oldVnode.text)) {
10911 api.setTextContent(elm, '');
10912 }
10913 }
5d51ea26
DC
10914 else if (oldVnode.text !== vnode.text) {
10915 api.setTextContent(elm, vnode.text);
5309fbda
DC
10916 }
10917 if (isDef(hook) && isDef(i = hook.postpatch)) {
5d51ea26 10918 i(oldVnode, vnode);
5309fbda
DC
10919 }
10920 }
5d51ea26 10921 return function patch(oldVnode, vnode) {
5309fbda
DC
10922 var i, elm, parent;
10923 var insertedVnodeQueue = [];
10924 for (i = 0; i < cbs.pre.length; ++i)
10925 { cbs.pre[i](); }
10926 if (!isVnode(oldVnode)) {
10927 oldVnode = emptyNodeAt(oldVnode);
10928 }
5d51ea26
DC
10929 if (sameVnode(oldVnode, vnode)) {
10930 patchVnode(oldVnode, vnode, insertedVnodeQueue);
5309fbda
DC
10931 }
10932 else {
10933 elm = oldVnode.elm;
10934 parent = api.parentNode(elm);
5d51ea26 10935 createElm(vnode, insertedVnodeQueue);
5309fbda 10936 if (parent !== null) {
5d51ea26 10937 api.insertBefore(parent, vnode.elm, api.nextSibling(elm));
5309fbda
DC
10938 removeVnodes(parent, [oldVnode], 0, 0);
10939 }
10940 }
10941 for (i = 0; i < insertedVnodeQueue.length; ++i) {
10942 insertedVnodeQueue[i].data.hook.insert(insertedVnodeQueue[i]);
10943 }
10944 for (i = 0; i < cbs.post.length; ++i)
10945 { cbs.post[i](); }
5d51ea26 10946 return vnode;
5309fbda
DC
10947 };
10948 }
10949
10950 var xlinkNS = 'http://www.w3.org/1999/xlink';
10951 var xmlNS = 'http://www.w3.org/XML/1998/namespace';
10952 var colonChar = 58;
10953 var xChar = 120;
10954 function updateAttrs(oldVnode, vnode) {
10955 var key, elm = vnode.elm, oldAttrs = oldVnode.data.attrs, attrs = vnode.data.attrs;
10956 if (!oldAttrs && !attrs)
10957 { return; }
10958 if (oldAttrs === attrs)
10959 { return; }
10960 oldAttrs = oldAttrs || {};
10961 attrs = attrs || {};
10962 // update modified attributes, add new attributes
10963 for (key in attrs) {
10964 var cur = attrs[key];
10965 var old = oldAttrs[key];
10966 if (old !== cur) {
10967 if (cur === true) {
10968 elm.setAttribute(key, "");
10969 }
10970 else if (cur === false) {
10971 elm.removeAttribute(key);
10972 }
10973 else {
10974 if (key.charCodeAt(0) !== xChar) {
10975 elm.setAttribute(key, cur);
10976 }
10977 else if (key.charCodeAt(3) === colonChar) {
10978 // Assume xml namespace
10979 elm.setAttributeNS(xmlNS, key, cur);
10980 }
10981 else if (key.charCodeAt(5) === colonChar) {
10982 // Assume xlink namespace
10983 elm.setAttributeNS(xlinkNS, key, cur);
10984 }
10985 else {
10986 elm.setAttribute(key, cur);
10987 }
10988 }
10989 }
10990 }
10991 // remove removed attributes
10992 // use `in` operator since the previous `for` iteration uses it (.i.e. add even attributes with undefined value)
10993 // the other option is to remove all attributes with value == undefined
10994 for (key in oldAttrs) {
10995 if (!(key in attrs)) {
10996 elm.removeAttribute(key);
10997 }
10998 }
10999 }
11000 var attributesModule = { create: updateAttrs, update: updateAttrs };
11001
11002 function updateProps(oldVnode, vnode) {
11003 var key, cur, old, elm = vnode.elm, oldProps = oldVnode.data.props, props = vnode.data.props;
11004 if (!oldProps && !props)
11005 { return; }
11006 if (oldProps === props)
11007 { return; }
11008 oldProps = oldProps || {};
11009 props = props || {};
11010 for (key in oldProps) {
11011 if (!props[key]) {
11012 delete elm[key];
11013 }
11014 }
11015 for (key in props) {
11016 cur = props[key];
11017 old = oldProps[key];
11018 if (old !== cur && (key !== 'value' || elm[key] !== cur)) {
11019 elm[key] = cur;
11020 }
11021 }
11022 }
11023 var propsModule = { create: updateProps, update: updateProps };
11024
11025 var raf = (typeof window !== 'undefined' && window.requestAnimationFrame) || setTimeout;
11026 var nextFrame = function (fn) { raf(function () { raf(fn); }); };
11027 function setNextFrame(obj, prop, val) {
11028 nextFrame(function () { obj[prop] = val; });
11029 }
11030 function updateStyle(oldVnode, vnode) {
11031 var cur, name, elm = vnode.elm, oldStyle = oldVnode.data.style, style = vnode.data.style;
11032 if (!oldStyle && !style)
11033 { return; }
11034 if (oldStyle === style)
11035 { return; }
11036 oldStyle = oldStyle || {};
11037 style = style || {};
11038 var oldHasDel = 'delayed' in oldStyle;
11039 for (name in oldStyle) {
11040 if (!style[name]) {
11041 if (name[0] === '-' && name[1] === '-') {
11042 elm.style.removeProperty(name);
11043 }
11044 else {
11045 elm.style[name] = '';
11046 }
11047 }
11048 }
11049 for (name in style) {
11050 cur = style[name];
11051 if (name === 'delayed' && style.delayed) {
11052 for (var name2 in style.delayed) {
11053 cur = style.delayed[name2];
11054 if (!oldHasDel || cur !== oldStyle.delayed[name2]) {
11055 setNextFrame(elm.style, name2, cur);
11056 }
11057 }
11058 }
11059 else if (name !== 'remove' && cur !== oldStyle[name]) {
11060 if (name[0] === '-' && name[1] === '-') {
11061 elm.style.setProperty(name, cur);
11062 }
11063 else {
11064 elm.style[name] = cur;
11065 }
11066 }
11067 }
11068 }
11069 function applyDestroyStyle(vnode) {
11070 var style, name, elm = vnode.elm, s = vnode.data.style;
11071 if (!s || !(style = s.destroy))
11072 { return; }
11073 for (name in style) {
11074 elm.style[name] = style[name];
11075 }
11076 }
11077 function applyRemoveStyle(vnode, rm) {
11078 var s = vnode.data.style;
11079 if (!s || !s.remove) {
11080 rm();
11081 return;
11082 }
11083 var name, elm = vnode.elm, i = 0, compStyle, style = s.remove, amount = 0, applied = [];
11084 for (name in style) {
11085 applied.push(name);
11086 elm.style[name] = style[name];
11087 }
11088 compStyle = getComputedStyle(elm);
11089 var props = compStyle['transition-property'].split(', ');
11090 for (; i < props.length; ++i) {
11091 if (applied.indexOf(props[i]) !== -1)
11092 { amount++; }
11093 }
11094 elm.addEventListener('transitionend', function (ev) {
11095 if (ev.target === elm)
11096 { --amount; }
11097 if (amount === 0)
11098 { rm(); }
11099 });
11100 }
11101 var styleModule = {
11102 create: updateStyle,
11103 update: updateStyle,
11104 destroy: applyDestroyStyle,
11105 remove: applyRemoveStyle
11106 };
11107
11108 function invokeHandler(handler, event, args) {
11109 if (typeof handler === 'function') {
11110 // call function handler
11111 handler.apply(void 0, [ event ].concat( args ));
11112 }
11113 }
11114 function handleEvent(event, args, vnode) {
11115 var name = event.type;
11116 var on = vnode.data.on;
11117 // call event handler(s) if exists
11118 if (on && on[name]) {
5d51ea26 11119 invokeHandler(on[name], event, args);
5309fbda
DC
11120 }
11121 }
11122 function createListener() {
11123 return function handler(event) {
11124 var args = [], len = arguments.length - 1;
11125 while ( len-- > 0 ) args[ len ] = arguments[ len + 1 ];
11126
11127 handleEvent(event, args, handler.vnode);
11128 };
11129 }
11130 function updateEvents(oldVnode, vnode) {
11131 var oldOn = oldVnode.data.on;
11132 var oldListener = oldVnode.listener;
11133 var oldElm = oldVnode.elm;
11134 var on = vnode && vnode.data.on;
11135 var elm = (vnode && vnode.elm);
11136 // optimization for reused immutable handlers
11137 if (oldOn === on) {
11138 return;
11139 }
11140 // remove existing listeners which no longer used
11141 if (oldOn && oldListener) {
11142 // if element changed or deleted we remove all existing listeners unconditionally
11143 if (!on) {
11144 Object.keys(oldOn).forEach(function (name) {
11145 $(oldElm).off(name, oldListener);
11146 });
11147 } else {
11148 Object.keys(oldOn).forEach(function (name) {
11149 if (!on[name]) {
11150 $(oldElm).off(name, oldListener);
11151 }
11152 });
11153 }
11154 }
11155 // add new listeners which has not already attached
11156 if (on) {
11157 // reuse existing listener or create new
11158 var listener = oldVnode.listener || createListener();
11159 vnode.listener = listener;
11160 // update vnode for listener
11161 listener.vnode = vnode;
11162 // if element changed or added we add all needed listeners unconditionally
11163 if (!oldOn) {
11164 Object.keys(on).forEach(function (name) {
11165 $(elm).on(name, listener);
11166 });
11167 } else {
11168 Object.keys(on).forEach(function (name) {
11169 if (!oldOn[name]) {
11170 $(elm).on(name, listener);
11171 }
11172 });
11173 }
11174 }
11175 }
11176
11177 var eventListenersModule = {
11178 create: updateEvents,
11179 update: updateEvents,
11180 destroy: updateEvents,
11181 };
11182
11183 /* eslint import/no-named-as-default: off */
11184
5d51ea26 11185 var patch = init([
5309fbda
DC
11186 attributesModule,
11187 propsModule,
11188 styleModule,
11189 eventListenersModule ]);
11190
11191 var Framework7Component = function Framework7Component(app, options, extendContext) {
11192 if ( extendContext === void 0 ) extendContext = {};
11193
11194 var id = Utils.id();
11195 var self = Utils.merge(
11196 this,
11197 extendContext,
11198 {
11199 $: $,
11200 $$: $,
11201 $dom7: $,
11202 $app: app,
11203 $f7: app,
11204 $options: Utils.extend({ id: id }, options),
5d51ea26 11205 $id: options.id || id,
5309fbda
DC
11206 }
11207 );
11208 var $options = self.$options;
11209
11210 // Root data and methods
11211 Object.defineProperty(self, '$root', {
11212 enumerable: true,
11213 configurable: true,
11214 get: function get() {
11215 var root = Utils.merge({}, app.data, app.methods);
11216 if (win && win.Proxy) {
11217 root = new win.Proxy(root, {
11218 set: function set(target, name, val) {
11219 app.data[name] = val;
11220 },
11221 deleteProperty: function deleteProperty(target, name) {
11222 delete app.data[name];
11223 delete app.methods[name];
11224 },
11225 has: function has(target, name) {
11226 return (name in app.data || name in app.methods);
11227 },
11228 });
11229 }
11230 return root;
11231 },
11232 set: function set() {},
11233 });
11234
11235 // Apply context
11236 ('beforeCreate created beforeMount mounted beforeDestroy destroyed updated').split(' ').forEach(function (cycleKey) {
11237 if ($options[cycleKey]) { $options[cycleKey] = $options[cycleKey].bind(self); }
11238 });
11239
11240 if ($options.data) {
11241 $options.data = $options.data.bind(self);
11242 // Data
11243 Utils.extend(self, $options.data());
11244 }
11245 if ($options.render) { $options.render = $options.render.bind(self); }
11246 if ($options.methods) {
11247 Object.keys($options.methods).forEach(function (methodName) {
11248 self[methodName] = $options.methods[methodName].bind(self);
11249 });
11250 }
11251
11252 // Bind Events
11253 if ($options.on) {
11254 Object.keys($options.on).forEach(function (eventName) {
11255 $options.on[eventName] = $options.on[eventName].bind(self);
11256 });
11257 }
11258 if ($options.once) {
11259 Object.keys($options.once).forEach(function (eventName) {
11260 $options.once[eventName] = $options.once[eventName].bind(self);
11261 });
11262 }
11263
11264 // Before create hook
11265 if ($options.beforeCreate) { $options.beforeCreate(); }
11266
11267 // Render
11268 var html = self.$render();
11269
11270 // Make Dom
11271 if (html && typeof html === 'string') {
11272 html = html.trim();
11273 self.$vnode = vdom(html, self, app, true);
11274 self.el = doc.createElement('div');
11275 patch(self.el, self.$vnode);
11276 } else if (html) {
11277 self.el = html;
11278 }
11279 self.$el = $(self.el);
11280
11281 // Set styles scope ID
11282 if ($options.style) {
11283 self.$styleEl = doc.createElement('style');
11284 self.$styleEl.innerHTML = $options.style;
11285 if ($options.styleScoped) {
11286 self.el.setAttribute(("data-f7-" + ($options.id)), '');
11287 }
11288 }
11289
11290 self.$attachEvents();
11291
11292 // Created callback
11293 if ($options.created) { $options.created(); }
11294
11295 // Store component instance
11296 self.el.f7Component = self;
11297
11298 return self;
11299 };
11300
11301 Framework7Component.prototype.$attachEvents = function $attachEvents () {
11302 var self = this;
11303 var $options = self.$options;
11304 var $el = self.$el;
11305 if ($options.on) {
11306 Object.keys($options.on).forEach(function (eventName) {
11307 $el.on(Utils.eventNameToColonCase(eventName), $options.on[eventName]);
11308 });
11309 }
11310 if ($options.once) {
11311 Object.keys($options.once).forEach(function (eventName) {
11312 $el.once(Utils.eventNameToColonCase(eventName), $options.once[eventName]);
11313 });
11314 }
11315 };
11316
11317 Framework7Component.prototype.$detachEvents = function $detachEvents () {
11318 var self = this;
11319 var $options = self.$options;
11320 var $el = self.$el;
11321 if ($options.on) {
11322 Object.keys($options.on).forEach(function (eventName) {
11323 $el.off(Utils.eventNameToColonCase(eventName), $options.on[eventName]);
11324 });
11325 }
11326 if ($options.once) {
11327 Object.keys($options.once).forEach(function (eventName) {
11328 $el.off(Utils.eventNameToColonCase(eventName), $options.once[eventName]);
11329 });
11330 }
11331 };
11332
11333 Framework7Component.prototype.$render = function $render () {
11334 var self = this;
11335 var $options = self.$options;
11336 var html = '';
11337 if ($options.render) {
11338 html = $options.render();
11339 } else if ($options.template) {
11340 if (typeof $options.template === 'string') {
11341 try {
11342 html = Template7.compile($options.template)(self);
11343 } catch (err) {
11344 throw err;
11345 }
11346 } else {
11347 // Supposed to be function
11348 html = $options.template(self);
11349 }
11350 }
11351 return html;
11352 };
11353
11354 Framework7Component.prototype.$forceUpdate = function $forceUpdate () {
11355 var self = this;
11356 var html = self.$render();
11357
11358 // Make Dom
11359 if (html && typeof html === 'string') {
11360 html = html.trim();
11361 var newVNode = vdom(html, self, self.$app);
11362 self.$vnode = patch(self.$vnode, newVNode);
11363 }
11364 };
11365
11366 Framework7Component.prototype.$setState = function $setState (mergeState) {
11367 var self = this;
11368 Utils.merge(self, mergeState);
11369 self.$forceUpdate();
11370 };
11371
11372 Framework7Component.prototype.$mount = function $mount (mountMethod) {
11373 var self = this;
11374 if (self.$options.beforeMount) { self.$options.beforeMount(); }
11375 if (self.$styleEl) { $('head').append(self.$styleEl); }
11376 if (mountMethod) { mountMethod(self.el); }
11377 if (self.$options.mounted) { self.$options.mounted(); }
11378 };
11379
11380 Framework7Component.prototype.$destroy = function $destroy () {
11381 var self = this;
11382 if (self.$options.beforeDestroy) { self.$options.beforeDestroy(); }
11383 if (self.$styleEl) { $(self.$styleEl).remove(); }
11384 self.$detachEvents();
11385 if (self.$options.destroyed) { self.$options.destroyed(); }
11386 // Delete component instance
11387 if (self.el && self.el.f7Component) {
11388 self.el.f7Component = null;
11389 delete self.el.f7Component;
11390 }
11391 // Patch with empty node
11392 if (self.$vnode) {
11393 self.$vnode = patch(self.$vnode, { sel: self.$vnode.sel, data: {} });
11394 }
11395 Utils.deleteProps(self);
11396 };
11397
11398 function parseComponent(componentString) {
11399 var id = Utils.id();
11400 var callbackCreateName = "f7_component_create_callback_" + id;
11401 var callbackRenderName = "f7_component_render_callback_" + id;
11402
11403 // Template
11404 var template;
11405 var hasTemplate = componentString.match(/<template([ ]?)([a-z0-9-]*)>/);
11406 var templateType = hasTemplate[2] || 't7';
11407 if (hasTemplate) {
11408 template = componentString
11409 .split(/<template[ ]?[a-z0-9-]*>/)
11410 .filter(function (item, index) { return index > 0; })
11411 .join('<template>')
11412 .split('</template>')
11413 .filter(function (item, index, arr) { return index < arr.length - 1; })
11414 .join('</template>')
11415 .replace(/{{#raw}}([ \n]*)<template/g, '{{#raw}}<template')
11416 .replace(/\/template>([ \n]*){{\/raw}}/g, '/template>{{/raw}}')
11417 .replace(/([ \n])<template/g, '$1{{#raw}}<template')
11418 .replace(/\/template>([ \n])/g, '/template>{{/raw}}$1');
11419 }
11420
11421 // Parse Styles
11422 var style = null;
11423 var styleScoped = false;
11424
11425 if (componentString.indexOf('<style>') >= 0) {
11426 style = componentString.split('<style>')[1].split('</style>')[0];
11427 } else if (componentString.indexOf('<style scoped>') >= 0) {
11428 styleScoped = true;
11429 style = componentString.split('<style scoped>')[1].split('</style>')[0];
11430 style = style.split('\n').map(function (line) {
11431 var trimmedLine = line.trim();
11432 if (trimmedLine.indexOf('@') === 0) { return line; }
11433 if (line.indexOf('{') >= 0) {
11434 if (line.indexOf('{{this}}') >= 0) {
11435 return line.replace('{{this}}', ("[data-f7-" + id + "]"));
11436 }
11437 return ("[data-f7-" + id + "] " + (line.trim()));
11438 }
11439 return line;
11440 }).join('\n');
11441 }
11442
11443 // Parse Script
11444 var scriptContent;
11445 var scriptEl;
11446 if (componentString.indexOf('<script>') >= 0) {
11447 var scripts = componentString.split('<script>');
11448 scriptContent = scripts[scripts.length - 1].split('</script>')[0].trim();
11449 } else {
11450 scriptContent = 'return {}';
11451 }
11452 if (!scriptContent || !scriptContent.trim()) { scriptContent = 'return {}'; }
11453
11454 scriptContent = "window." + callbackCreateName + " = function () {" + scriptContent + "}";
11455
11456 // Insert Script El
11457 scriptEl = doc.createElement('script');
11458 scriptEl.innerHTML = scriptContent;
11459 $('head').append(scriptEl);
11460
11461 var component = win[callbackCreateName]();
11462
11463 // Remove Script El
11464 $(scriptEl).remove();
11465 win[callbackCreateName] = null;
11466 delete win[callbackCreateName];
11467
11468 // Assign Template
11469 if (!component.template && !component.render) {
11470 component.template = template;
11471 component.templateType = templateType;
11472 }
11473 if (component.template) {
11474 if (component.templateType === 't7') {
11475 component.template = Template7.compile(component.template);
11476 }
11477 if (component.templateType === 'es') {
11478 var renderContent = "window." + callbackRenderName + " = function () {\n return function render() {\n return `" + (component.template) + "`;\n }\n }";
11479 scriptEl = doc.createElement('script');
11480 scriptEl.innerHTML = renderContent;
11481 $('head').append(scriptEl);
11482
11483 component.render = win[callbackRenderName]();
11484
11485 // Remove Script El
11486 $(scriptEl).remove();
11487 win[callbackRenderName] = null;
11488 delete win[callbackRenderName];
11489 }
11490 }
11491
11492 // Assign Style
11493 if (style) {
11494 component.style = style;
11495 component.styleScoped = styleScoped;
11496 }
11497
11498 // Component ID
11499 component.id = id;
11500 return component;
11501 }
11502
11503 var ComponentModule = {
11504 name: 'component',
11505 create: function create() {
11506 var app = this;
11507 app.component = {
11508 parse: function parse(componentString) {
11509 return parseComponent(componentString);
11510 },
11511 create: function create(options, extendContext) {
11512 return new Framework7Component(app, options, extendContext);
11513 },
11514 };
11515 },
11516 };
11517
11518 var SW = {
11519 registrations: [],
11520 register: function register(path, scope) {
11521 var app = this;
11522 if (!('serviceWorker' in window.navigator) || !app.serviceWorker.container) {
11523 return new Promise(function (resolve, reject) {
11524 reject(new Error('Service worker is not supported'));
11525 });
11526 }
11527 return new Promise(function (resolve, reject) {
11528 app.serviceWorker.container.register(path, (scope ? { scope: scope } : {}))
11529 .then(function (reg) {
11530 SW.registrations.push(reg);
11531 app.emit('serviceWorkerRegisterSuccess', reg);
11532 resolve(reg);
11533 }).catch(function (error) {
11534 app.emit('serviceWorkerRegisterError', error);
11535 reject(error);
11536 });
11537 });
11538 },
11539 unregister: function unregister(registration) {
11540 var app = this;
11541 if (!('serviceWorker' in window.navigator) || !app.serviceWorker.container) {
11542 return new Promise(function (resolve, reject) {
11543 reject(new Error('Service worker is not supported'));
11544 });
11545 }
11546 var registrations;
11547 if (!registration) { registrations = SW.registrations; }
11548 else if (Array.isArray(registration)) { registrations = registration; }
11549 else { registrations = [registration]; }
11550 return Promise.all(registrations.map(function (reg) { return new Promise(function (resolve, reject) {
11551 reg.unregister()
11552 .then(function () {
11553 if (SW.registrations.indexOf(reg) >= 0) {
11554 SW.registrations.splice(SW.registrations.indexOf(reg), 1);
11555 }
11556 app.emit('serviceWorkerUnregisterSuccess', reg);
11557 resolve();
11558 })
11559 .catch(function (error) {
11560 app.emit('serviceWorkerUnregisterError', reg, error);
11561 reject(error);
11562 });
11563 }); }));
11564 },
11565 };
11566
11567 var ServiceWorkerModule = {
11568 name: 'sw',
11569 params: {
11570 serviceWorker: {
11571 path: undefined,
11572 scope: undefined,
11573 },
11574 },
11575 create: function create() {
11576 var app = this;
11577 Utils.extend(app, {
11578 serviceWorker: {
11579 container: ('serviceWorker' in window.navigator) ? window.navigator.serviceWorker : undefined,
11580 registrations: SW.registrations,
11581 register: SW.register.bind(app),
11582 unregister: SW.unregister.bind(app),
11583 },
11584 });
11585 },
11586 on: {
11587 init: function init() {
11588 if (!('serviceWorker' in window.navigator)) { return; }
11589 var app = this;
11590 if (!app.serviceWorker.container) { return; }
11591 var paths = app.params.serviceWorker.path;
11592 var scope = app.params.serviceWorker.scope;
11593 if (!paths || (Array.isArray(paths) && !paths.length)) { return; }
11594 var toRegister = Array.isArray(paths) ? paths : [paths];
11595 toRegister.forEach(function (path) {
11596 app.serviceWorker.register(path, scope);
11597 });
11598 },
11599 },
11600 };
11601
11602 var Statusbar = {
11603 hide: function hide() {
11604 $('html').removeClass('with-statusbar');
11605 if (Device.cordova && win.StatusBar) {
11606 win.StatusBar.hide();
11607 }
11608 },
11609 show: function show() {
11610 if (Device.cordova && win.StatusBar) {
11611 win.StatusBar.show();
11612 Utils.nextTick(function () {
11613 if (Device.needsStatusbarOverlay()) {
11614 $('html').addClass('with-statusbar');
11615 }
11616 });
11617 return;
11618 }
11619 $('html').addClass('with-statusbar');
11620 },
11621 onClick: function onClick() {
11622 var app = this;
11623 var pageContent;
11624 if ($('.popup.modal-in').length > 0) {
11625 // Check for opened popup
11626 pageContent = $('.popup.modal-in').find('.page:not(.page-previous):not(.page-next):not(.cached)').find('.page-content');
11627 } else if ($('.panel.panel-active').length > 0) {
11628 // Check for opened panel
11629 pageContent = $('.panel.panel-active').find('.page:not(.page-previous):not(.page-next):not(.cached)').find('.page-content');
11630 } else if ($('.views > .view.tab-active').length > 0) {
11631 // View in tab bar app layout
11632 pageContent = $('.views > .view.tab-active').find('.page:not(.page-previous):not(.page-next):not(.cached)').find('.page-content');
11633 } else if ($('.views').length > 0) {
11634 pageContent = $('.views').find('.page:not(.page-previous):not(.page-next):not(.cached)').find('.page-content');
11635 } else {
11636 pageContent = app.root.children('.view').find('.page:not(.page-previous):not(.page-next):not(.cached)').find('.page-content');
11637 }
11638
11639 if (pageContent && pageContent.length > 0) {
11640 // Check for tab
11641 if (pageContent.hasClass('tab')) {
11642 pageContent = pageContent.parent('.tabs').children('.page-content.tab-active');
11643 }
11644 if (pageContent.length > 0) { pageContent.scrollTop(0, 300); }
11645 }
11646 },
11647 setTextColor: function setTextColor(color) {
11648 if (Device.cordova && win.StatusBar) {
11649 if (color === 'white') {
11650 win.StatusBar.styleLightContent();
11651 } else {
11652 win.StatusBar.styleDefault();
11653 }
11654 }
11655 },
11656 setIosTextColor: function setIosTextColor(color) {
11657 if (!Device.ios) { return; }
11658 Statusbar.setTextColor(color);
11659 },
11660 setBackgroundColor: function setBackgroundColor(color) {
11661 $('.statusbar').css('background-color', color);
11662 if (Device.cordova && win.StatusBar) {
11663 win.StatusBar.backgroundColorByHexString(color);
11664 }
11665 },
11666 isVisible: function isVisible() {
11667 if (Device.cordova && win.StatusBar) {
11668 return win.StatusBar.isVisible;
11669 }
11670 return false;
11671 },
11672 overlaysWebView: function overlaysWebView(overlays) {
11673 if ( overlays === void 0 ) overlays = true;
11674
11675 if (Device.cordova && win.StatusBar) {
11676 win.StatusBar.overlaysWebView(overlays);
11677 if (overlays) {
11678 $('html').addClass('with-statusbar');
11679 } else {
11680 $('html').removeClass('with-statusbar');
11681 }
11682 }
11683 },
11684 checkOverlay: function checkOverlay() {
11685 if (Device.needsStatusbarOverlay()) {
11686 $('html').addClass('with-statusbar');
11687 } else {
11688 $('html').removeClass('with-statusbar');
11689 }
11690 },
11691 init: function init() {
11692 var app = this;
11693 var params = app.params.statusbar;
11694 if (!params.enabled) { return; }
11695
11696 if (params.overlay === 'auto') {
11697 if (Device.needsStatusbarOverlay()) {
11698 $('html').addClass('with-statusbar');
11699 } else {
11700 $('html').removeClass('with-statusbar');
11701 }
11702
11703 if (Device.ios && (Device.cordova || Device.webView)) {
11704 if (win.orientation === 0) {
11705 app.once('resize', function () {
11706 Statusbar.checkOverlay();
11707 });
11708 }
11709
11710 $(doc).on('resume', function () {
11711 Statusbar.checkOverlay();
11712 }, false);
11713
11714 app.on(Device.ios ? 'orientationchange' : 'orientationchange resize', function () {
11715 Statusbar.checkOverlay();
11716 });
11717 }
11718 } else if (params.overlay === true) {
11719 $('html').addClass('with-statusbar');
11720 } else if (params.overlay === false) {
11721 $('html').removeClass('with-statusbar');
11722 }
11723
11724 if (Device.cordova && win.StatusBar) {
11725 if (params.scrollTopOnClick) {
11726 $(win).on('statusTap', Statusbar.onClick.bind(app));
11727 }
11728 if (Device.ios) {
11729 if (params.iosOverlaysWebView) {
11730 win.StatusBar.overlaysWebView(true);
11731 } else {
11732 win.StatusBar.overlaysWebView(false);
11733 }
11734 if (params.iosTextColor === 'white') {
11735 win.StatusBar.styleLightContent();
11736 } else {
11737 win.StatusBar.styleDefault();
11738 }
11739 }
11740 if (Device.android) {
11741 if (params.androidOverlaysWebView) {
11742 win.StatusBar.overlaysWebView(true);
11743 } else {
11744 win.StatusBar.overlaysWebView(false);
11745 }
11746 if (params.androidTextColor === 'white') {
11747 win.StatusBar.styleLightContent();
11748 } else {
11749 win.StatusBar.styleDefault();
11750 }
11751 }
11752 }
11753 if (params.iosBackgroundColor && Device.ios) {
11754 Statusbar.setBackgroundColor(params.iosBackgroundColor);
11755 }
11756 if ((params.materialBackgroundColor || params.androidBackgroundColor) && Device.android) {
11757 Statusbar.setBackgroundColor(params.materialBackgroundColor || params.androidBackgroundColor);
11758 }
11759 },
11760 };
11761
11762 var Statusbar$1 = {
11763 name: 'statusbar',
11764 params: {
11765 statusbar: {
11766 enabled: true,
11767 overlay: 'auto',
11768 scrollTopOnClick: true,
11769
11770 iosOverlaysWebView: true,
11771 iosTextColor: 'black',
11772 iosBackgroundColor: null,
11773
11774 androidOverlaysWebView: false,
11775 androidTextColor: 'black',
11776 androidBackgroundColor: null,
11777 },
11778 },
11779 create: function create() {
11780 var app = this;
11781 Utils.extend(app, {
11782 statusbar: {
11783 checkOverlay: Statusbar.checkOverlay,
11784 hide: Statusbar.hide,
11785 show: Statusbar.show,
11786 overlaysWebView: Statusbar.overlaysWebView,
11787 setTextColor: Statusbar.setTextColor,
11788 setBackgroundColor: Statusbar.setBackgroundColor,
11789 isVisible: Statusbar.isVisible,
11790 init: Statusbar.init.bind(app),
11791 },
11792 });
11793 },
11794 on: {
11795 init: function init() {
11796 var app = this;
11797 Statusbar.init.call(app);
11798 },
11799 },
11800 clicks: {
11801 '.statusbar': function onStatusbarClick() {
11802 var app = this;
11803 if (!app.params.statusbar.enabled) { return; }
11804 if (!app.params.statusbar.scrollTopOnClick) { return; }
11805 Statusbar.onClick.call(app);
11806 },
11807 },
11808 };
11809
11810 function getCurrentView(app) {
5d51ea26
DC
11811 var $popoverView = $('.popover.modal-in .view');
11812 var $popupView = $('.popup.modal-in .view');
11813 var $panelView = $('.panel.panel-active .view');
11814 var $viewsEl = $('.views');
11815 if ($viewsEl.length === 0) { $viewsEl = app.root; }
5309fbda 11816 // Find active view as tab
5d51ea26 11817 var $viewEl = $viewsEl.children('.view');
5309fbda 11818 // Propably in tabs or split view
5d51ea26
DC
11819 if ($viewEl.length > 1) {
11820 if ($viewEl.hasClass('tab')) {
5309fbda 11821 // Tabs
5d51ea26 11822 $viewEl = $viewsEl.children('.view.tab-active');
5309fbda
DC
11823 }
11824 }
5d51ea26
DC
11825 if ($popoverView.length > 0 && $popoverView[0].f7View) { return $popoverView[0].f7View; }
11826 if ($popupView.length > 0 && $popupView[0].f7View) { return $popupView[0].f7View; }
11827 if ($panelView.length > 0 && $panelView[0].f7View) { return $panelView[0].f7View; }
11828 if ($viewEl.length > 0) {
11829 if ($viewEl.length === 1 && $viewEl[0].f7View) { return $viewEl[0].f7View; }
11830 if ($viewEl.length > 1) {
5309fbda
DC
11831 return app.views.main;
11832 }
11833 }
11834 return undefined;
11835 }
11836
11837 var View$1 = {
11838 name: 'view',
11839 params: {
11840 view: {
11841 name: undefined,
11842 main: false,
11843 router: true,
11844 linksView: null,
11845 stackPages: false,
11846 xhrCache: true,
11847 xhrCacheIgnore: [],
11848 xhrCacheIgnoreGetParameters: false,
11849 xhrCacheDuration: 1000 * 60 * 10, // Ten minutes
11850 preloadPreviousPage: true,
11851 allowDuplicateUrls: false,
11852 reloadPages: false,
11853 reloadDetail: false,
11854 masterDetailBreakpoint: 0,
11855 removeElements: true,
11856 removeElementsWithTimeout: false,
11857 removeElementsTimeout: 0,
11858 restoreScrollTopOnBack: true,
11859 unloadTabContent: true,
11860 passRouteQueryToRequest: true,
11861 passRouteParamsToRequest: false,
11862 // Swipe Back
11863 iosSwipeBack: true,
11864 iosSwipeBackAnimateShadow: true,
11865 iosSwipeBackAnimateOpacity: true,
11866 iosSwipeBackActiveArea: 30,
11867 iosSwipeBackThreshold: 0,
11868 mdSwipeBack: false,
11869 mdSwipeBackAnimateShadow: true,
11870 mdSwipeBackAnimateOpacity: false,
11871 mdSwipeBackActiveArea: 30,
11872 mdSwipeBackThreshold: 0,
5d51ea26
DC
11873 auroraSwipeBack: false,
11874 auroraSwipeBackAnimateShadow: false,
11875 auroraSwipeBackAnimateOpacity: true,
11876 auroraSwipeBackActiveArea: 30,
11877 auroraSwipeBackThreshold: 0,
5309fbda
DC
11878 // Push State
11879 pushState: false,
11880 pushStateRoot: undefined,
11881 pushStateAnimate: true,
11882 pushStateAnimateOnLoad: false,
11883 pushStateSeparator: '#!',
11884 pushStateOnLoad: true,
11885 // Animate Pages
11886 animate: true,
11887 // iOS Dynamic Navbar
11888 iosDynamicNavbar: true,
11889 iosSeparateDynamicNavbar: true,
11890 // Animate iOS Navbar Back Icon
11891 iosAnimateNavbarBackIcon: true,
11892 // Delays
11893 iosPageLoadDelay: 0,
11894 mdPageLoadDelay: 0,
5d51ea26 11895 auroraPageLoadDelay: 0,
5309fbda
DC
11896 // Routes hooks
11897 routesBeforeEnter: null,
11898 routesBeforeLeave: null,
11899 },
11900 },
11901 static: {
11902 View: View,
11903 },
11904 create: function create() {
11905 var app = this;
11906 Utils.extend(app, {
11907 views: Utils.extend([], {
11908 create: function create(el, params) {
11909 return new View(app, el, params);
11910 },
11911 get: function get(viewEl) {
11912 var $viewEl = $(viewEl);
11913 if ($viewEl.length && $viewEl[0].f7View) { return $viewEl[0].f7View; }
11914 return undefined;
11915 },
11916 }),
11917 });
11918 Object.defineProperty(app.views, 'current', {
11919 enumerable: true,
11920 configurable: true,
11921 get: function get() {
11922 return getCurrentView(app);
11923 },
11924 });
11925 // Alias
11926 app.view = app.views;
11927 },
11928 on: {
11929 init: function init() {
11930 var app = this;
11931 $('.view-init').each(function (index, viewEl) {
11932 if (viewEl.f7View) { return; }
11933 var viewParams = $(viewEl).dataset();
11934 app.views.create(viewEl, viewParams);
11935 });
11936 },
11937 modalOpen: function modalOpen(modal) {
11938 var app = this;
11939 modal.$el.find('.view-init').each(function (index, viewEl) {
11940 if (viewEl.f7View) { return; }
11941 var viewParams = $(viewEl).dataset();
11942 app.views.create(viewEl, viewParams);
11943 });
11944 },
11945 modalBeforeDestroy: function modalBeforeDestroy(modal) {
11946 if (!modal || !modal.$el) { return; }
11947 modal.$el.find('.view-init').each(function (index, viewEl) {
11948 var view = viewEl.f7View;
11949 if (!view) { return; }
11950 view.destroy();
11951 });
11952 },
11953 },
11954 };
11955
11956 var Navbar = {
11957 size: function size(el) {
11958 var app = this;
5d51ea26
DC
11959 if (app.theme !== 'ios' && !app.params.navbar[((app.theme) + "CenterTitle")]) {
11960 return;
11961 }
5309fbda
DC
11962 var $el = $(el);
11963 if ($el.hasClass('navbar')) {
11964 $el = $el.children('.navbar-inner').each(function (index, navbarEl) {
11965 app.navbar.size(navbarEl);
11966 });
11967 return;
11968 }
11969
11970 if (
11971 $el.hasClass('stacked')
11972 || $el.parents('.stacked').length > 0
11973 || $el.parents('.tab:not(.tab-active)').length > 0
11974 || $el.parents('.popup:not(.modal-in)').length > 0
11975 ) {
11976 return;
11977 }
11978
5d51ea26 11979 if (app.theme !== 'ios' && app.params.navbar[((app.theme) + "CenterTitle")]) {
5309fbda
DC
11980 $el.addClass('navbar-inner-centered-title');
11981 }
11982 if (app.theme === 'ios' && !app.params.navbar.iosCenterTitle) {
11983 $el.addClass('navbar-inner-left-title');
11984 }
11985
11986 var $viewEl = $el.parents('.view').eq(0);
11987 var left = app.rtl ? $el.children('.right') : $el.children('.left');
11988 var right = app.rtl ? $el.children('.left') : $el.children('.right');
11989 var title = $el.children('.title');
11990 var subnavbar = $el.children('.subnavbar');
11991 var noLeft = left.length === 0;
11992 var noRight = right.length === 0;
11993 var leftWidth = noLeft ? 0 : left.outerWidth(true);
11994 var rightWidth = noRight ? 0 : right.outerWidth(true);
11995 var titleWidth = title.outerWidth(true);
11996 var navbarStyles = $el.styles();
11997 var navbarWidth = $el[0].offsetWidth;
11998 var navbarInnerWidth = navbarWidth - parseInt(navbarStyles.paddingLeft, 10) - parseInt(navbarStyles.paddingRight, 10);
11999 var isPrevious = $el.hasClass('navbar-previous');
12000 var sliding = $el.hasClass('sliding');
12001
12002 var router;
12003 var dynamicNavbar;
12004 var separateNavbar;
12005 var separateNavbarRightOffset = 0;
12006 var separateNavbarLeftOffset = 0;
12007
12008 if ($viewEl.length > 0 && $viewEl[0].f7View) {
12009 router = $viewEl[0].f7View.router;
12010 dynamicNavbar = router && router.dynamicNavbar;
12011 separateNavbar = router && router.separateNavbar;
12012 if (!separateNavbar) {
12013 separateNavbarRightOffset = navbarWidth;
12014 separateNavbarLeftOffset = navbarWidth / 5;
12015 }
12016 }
12017
12018 var currLeft;
12019 var diff;
12020 if (noRight) {
12021 currLeft = navbarInnerWidth - titleWidth;
12022 }
12023 if (noLeft) {
12024 currLeft = 0;
12025 }
12026 if (!noLeft && !noRight) {
12027 currLeft = ((navbarInnerWidth - rightWidth - titleWidth) + leftWidth) / 2;
12028 }
12029 var requiredLeft = (navbarInnerWidth - titleWidth) / 2;
12030 if (navbarInnerWidth - leftWidth - rightWidth > titleWidth) {
12031 if (requiredLeft < leftWidth) {
12032 requiredLeft = leftWidth;
12033 }
12034 if (requiredLeft + titleWidth > navbarInnerWidth - rightWidth) {
12035 requiredLeft = navbarInnerWidth - rightWidth - titleWidth;
12036 }
12037 diff = requiredLeft - currLeft;
12038 } else {
12039 diff = 0;
12040 }
12041
12042 // RTL inverter
12043 var inverter = app.rtl ? -1 : 1;
12044
12045 if (dynamicNavbar && app.theme === 'ios') {
12046 if (title.hasClass('sliding') || (title.length > 0 && sliding)) {
12047 var titleLeftOffset = (-(currLeft + diff) * inverter) + separateNavbarLeftOffset;
12048 var titleRightOffset = ((navbarInnerWidth - currLeft - diff - titleWidth) * inverter) - separateNavbarRightOffset;
12049
12050 if (isPrevious) {
12051 if (router && router.params.iosAnimateNavbarBackIcon) {
12052 var activeNavbarBackLink = $el.parent().find('.navbar-current').children('.left.sliding').find('.back .icon ~ span');
12053 if (activeNavbarBackLink.length > 0) {
12054 titleLeftOffset += activeNavbarBackLink[0].offsetLeft;
12055 }
12056 }
12057 }
12058 title[0].f7NavbarLeftOffset = titleLeftOffset;
12059 title[0].f7NavbarRightOffset = titleRightOffset;
12060 }
12061 if (!noLeft && (left.hasClass('sliding') || sliding)) {
12062 if (app.rtl) {
12063 left[0].f7NavbarLeftOffset = (-(navbarInnerWidth - left[0].offsetWidth) / 2) * inverter;
12064 left[0].f7NavbarRightOffset = leftWidth * inverter;
12065 } else {
12066 left[0].f7NavbarLeftOffset = -leftWidth + separateNavbarLeftOffset;
12067 left[0].f7NavbarRightOffset = ((navbarInnerWidth - left[0].offsetWidth) / 2) - separateNavbarRightOffset;
12068 if (router && router.params.iosAnimateNavbarBackIcon && left.find('.back .icon').length > 0) {
12069 if (left.find('.back .icon ~ span').length) {
12070 var leftOffset = left[0].f7NavbarLeftOffset;
12071 var rightOffset = left[0].f7NavbarRightOffset;
12072 left[0].f7NavbarLeftOffset = 0;
12073 left[0].f7NavbarRightOffset = 0;
12074 left.find('.back .icon ~ span')[0].f7NavbarLeftOffset = leftOffset;
12075 left.find('.back .icon ~ span')[0].f7NavbarRightOffset = rightOffset - left.find('.back .icon')[0].offsetWidth;
12076 }
12077 }
12078 }
12079 }
12080 if (!noRight && (right.hasClass('sliding') || sliding)) {
12081 if (app.rtl) {
12082 right[0].f7NavbarLeftOffset = -rightWidth * inverter;
12083 right[0].f7NavbarRightOffset = ((navbarInnerWidth - right[0].offsetWidth) / 2) * inverter;
12084 } else {
12085 right[0].f7NavbarLeftOffset = (-(navbarInnerWidth - right[0].offsetWidth) / 2) + separateNavbarLeftOffset;
12086 right[0].f7NavbarRightOffset = rightWidth - separateNavbarRightOffset;
12087 }
12088 }
12089 if (subnavbar.length && (subnavbar.hasClass('sliding') || sliding)) {
12090 subnavbar[0].f7NavbarLeftOffset = app.rtl ? subnavbar[0].offsetWidth : (-subnavbar[0].offsetWidth + separateNavbarLeftOffset);
12091 subnavbar[0].f7NavbarRightOffset = (-subnavbar[0].f7NavbarLeftOffset - separateNavbarRightOffset) + separateNavbarLeftOffset;
12092 }
12093 }
12094
12095 // Center title
5d51ea26 12096 if (app.params.navbar[((app.theme) + "CenterTitle")]) {
5309fbda
DC
12097 var titleLeft = diff;
12098 if (app.rtl && noLeft && noRight && title.length > 0) { titleLeft = -titleLeft; }
12099 title.css({ left: (titleLeft + "px") });
12100 }
12101 },
12102 hide: function hide(el, animate) {
12103 if ( animate === void 0 ) animate = true;
12104
12105 var app = this;
12106 var $el = $(el);
12107 if ($el.hasClass('navbar-inner')) { $el = $el.parents('.navbar'); }
12108 if (!$el.length) { return; }
12109 if ($el.hasClass('navbar-hidden')) { return; }
12110 var className = "navbar-hidden" + (animate ? ' navbar-transitioning' : '');
5d51ea26
DC
12111 var currentIsLarge = app.theme === 'ios'
12112 ? $el.find('.navbar-current .title-large').length
12113 : $el.find('.title-large').length;
5309fbda
DC
12114 if (currentIsLarge) {
12115 className += ' navbar-large-hidden';
12116 }
12117 $el.transitionEnd(function () {
12118 $el.removeClass('navbar-transitioning');
12119 });
12120 $el.addClass(className);
5d51ea26
DC
12121 $el.trigger('navbar:hide');
12122 app.emit('navbarHide', $el[0]);
5309fbda
DC
12123 },
12124 show: function show(el, animate) {
12125 if ( el === void 0 ) el = '.navbar-hidden';
12126 if ( animate === void 0 ) animate = true;
12127
5d51ea26 12128 var app = this;
5309fbda
DC
12129 var $el = $(el);
12130 if ($el.hasClass('navbar-inner')) { $el = $el.parents('.navbar'); }
12131 if (!$el.length) { return; }
12132 if (!$el.hasClass('navbar-hidden')) { return; }
12133 if (animate) {
12134 $el.addClass('navbar-transitioning');
12135 $el.transitionEnd(function () {
12136 $el.removeClass('navbar-transitioning');
12137 });
12138 }
12139 $el.removeClass('navbar-hidden navbar-large-hidden');
5d51ea26
DC
12140 $el.trigger('navbar:show');
12141 app.emit('navbarShow', $el[0]);
5309fbda
DC
12142 },
12143 getElByPage: function getElByPage(page) {
12144 var $pageEl;
12145 var $navbarInnerEl;
12146 var pageData;
12147 if (page.$navbarEl || page.$el) {
12148 pageData = page;
12149 $pageEl = page.$el;
12150 } else {
12151 $pageEl = $(page);
12152 if ($pageEl.length > 0) { pageData = $pageEl[0].f7Page; }
12153 }
12154 if (pageData && pageData.$navbarEl && pageData.$navbarEl.length > 0) {
12155 $navbarInnerEl = pageData.$navbarEl;
12156 } else if ($pageEl) {
12157 $navbarInnerEl = $pageEl.children('.navbar').children('.navbar-inner');
12158 }
12159 if (!$navbarInnerEl || ($navbarInnerEl && $navbarInnerEl.length === 0)) { return undefined; }
12160 return $navbarInnerEl[0];
12161 },
12162 getPageByEl: function getPageByEl(navbarInnerEl) {
12163 var $navbarInnerEl = $(navbarInnerEl);
12164 if ($navbarInnerEl.hasClass('navbar')) {
12165 $navbarInnerEl = $navbarInnerEl.find('.navbar-inner');
12166 if ($navbarInnerEl.length > 1) { return undefined; }
12167 }
12168 if ($navbarInnerEl.parents('.page').length) {
12169 return $navbarInnerEl.parents('.page')[0];
12170 }
12171 var pageEl;
12172 $navbarInnerEl.parents('.view').find('.page').each(function (index, el) {
12173 if (el && el.f7Page && el.f7Page.navbarEl && $navbarInnerEl[0] === el.f7Page.navbarEl) {
12174 pageEl = el;
12175 }
12176 });
12177 return pageEl;
12178 },
12179
12180 collapseLargeTitle: function collapseLargeTitle(navbarInnerEl) {
12181 var app = this;
12182 var $navbarInnerEl = $(navbarInnerEl);
12183 if ($navbarInnerEl.hasClass('navbar')) {
12184 $navbarInnerEl = $navbarInnerEl.find('.navbar-inner-large');
12185 if ($navbarInnerEl.length > 1) {
12186 $navbarInnerEl = $(navbarInnerEl).find('.navbar-inner-large.navbar-current');
12187 }
12188 if ($navbarInnerEl.length > 1 || !$navbarInnerEl.length) {
12189 return;
12190 }
12191 }
12192 var $pageEl = $(app.navbar.getPageByEl($navbarInnerEl));
12193 $navbarInnerEl.addClass('navbar-inner-large-collapsed');
12194 $pageEl.eq(0).addClass('page-with-navbar-large-collapsed').trigger('page:navbarlargecollapsed');
5d51ea26
DC
12195 app.emit('pageNavbarLargeCollapsed', $pageEl[0]);
12196 var $navbarEl = $navbarInnerEl.parents('.navbar');
12197 if (app.theme === 'md' || app.theme === 'aurora') {
12198 $navbarEl.addClass('navbar-large-collapsed');
5309fbda 12199 }
5d51ea26
DC
12200 $navbarEl.trigger('navbar:collapse');
12201 app.emit('navbarCollapse', $navbarEl[0]);
5309fbda
DC
12202 },
12203 expandLargeTitle: function expandLargeTitle(navbarInnerEl) {
12204 var app = this;
12205 var $navbarInnerEl = $(navbarInnerEl);
12206 if ($navbarInnerEl.hasClass('navbar')) {
12207 $navbarInnerEl = $navbarInnerEl.find('.navbar-inner-large');
12208 if ($navbarInnerEl.length > 1) {
12209 $navbarInnerEl = $(navbarInnerEl).find('.navbar-inner-large.navbar-current');
12210 }
12211 if ($navbarInnerEl.length > 1 || !$navbarInnerEl.length) {
12212 return;
12213 }
12214 }
12215 var $pageEl = $(app.navbar.getPageByEl($navbarInnerEl));
12216 $navbarInnerEl.removeClass('navbar-inner-large-collapsed');
12217 $pageEl.eq(0).removeClass('page-with-navbar-large-collapsed').trigger('page:navbarlargeexpanded');
5d51ea26
DC
12218 app.emit('pageNavbarLargeExpanded', $pageEl[0]);
12219 var $navbarEl = $navbarInnerEl.parents('.navbar');
12220 if (app.theme === 'md' || app.theme === 'aurora') {
12221 $navbarEl.removeClass('navbar-large-collapsed');
5309fbda 12222 }
5d51ea26
DC
12223 $navbarEl.trigger('navbar:expand');
12224 app.emit('navbarExpand', $navbarEl[0]);
5309fbda
DC
12225 },
12226 toggleLargeTitle: function toggleLargeTitle(navbarInnerEl) {
12227 var app = this;
12228 var $navbarInnerEl = $(navbarInnerEl);
12229 if ($navbarInnerEl.hasClass('navbar')) {
12230 $navbarInnerEl = $navbarInnerEl.find('.navbar-inner-large');
12231 if ($navbarInnerEl.length > 1) {
12232 $navbarInnerEl = $(navbarInnerEl).find('.navbar-inner-large.navbar-current');
12233 }
12234 if ($navbarInnerEl.length > 1 || !$navbarInnerEl.length) {
12235 return;
12236 }
12237 }
12238 if ($navbarInnerEl.hasClass('navbar-inner-large-collapsed')) {
12239 app.navbar.expandLargeTitle($navbarInnerEl);
12240 } else {
12241 app.navbar.collapseLargeTitle($navbarInnerEl);
12242 }
12243 },
12244 initNavbarOnScroll: function initNavbarOnScroll(pageEl, navbarInnerEl, needHide, needCollapse) {
12245 var app = this;
12246 var $pageEl = $(pageEl);
12247 var $navbarInnerEl = $(navbarInnerEl);
5d51ea26 12248 var $navbarEl = app.theme === 'md' || app.theme === 'aurora'
5309fbda
DC
12249 ? $navbarInnerEl.parents('.navbar')
12250 : $(navbarInnerEl || app.navbar.getElByPage(pageEl)).closest('.navbar');
12251 var isLarge = $navbarInnerEl.find('.title-large').length || $navbarInnerEl.hasClass('.navbar-inner-large');
12252 var navbarHideHeight = 44;
12253 var snapPageScrollToLargeTitle = app.params.navbar.snapPageScrollToLargeTitle;
12254
12255 var previousScrollTop;
12256 var currentScrollTop;
12257
12258 var scrollHeight;
12259 var offsetHeight;
12260 var reachEnd;
12261 var action;
12262 var navbarHidden;
12263
12264 var navbarCollapsed;
12265 var navbarTitleLargeHeight;
12266 if (needCollapse || (needHide && isLarge)) {
12267 navbarTitleLargeHeight = $navbarInnerEl.css('--f7-navbar-large-title-height');
12268 if (navbarTitleLargeHeight && navbarTitleLargeHeight.indexOf('px') >= 0) {
12269 navbarTitleLargeHeight = parseInt(navbarTitleLargeHeight, 10);
12270 if (Number.isNaN(navbarTitleLargeHeight)) {
5d51ea26
DC
12271 if (app.theme === 'ios') { navbarTitleLargeHeight = 52; }
12272 else if (app.theme === 'md') { navbarTitleLargeHeight = 48; }
12273 else if (app.theme === 'aurora') { navbarTitleLargeHeight = 38; }
5309fbda 12274 }
5d51ea26
DC
12275 } else { // eslint-disable-next-line
12276 if (app.theme === 'ios') { navbarTitleLargeHeight = 52; }
12277 else if (app.theme === 'md') { navbarTitleLargeHeight = 48; }
12278 else if (app.theme === 'aurora') { navbarTitleLargeHeight = 38; }
5309fbda
DC
12279 }
12280 }
12281 if (needHide && isLarge) {
12282 navbarHideHeight += navbarTitleLargeHeight;
12283 }
12284
12285 var scrollChanged;
12286 var scrollContent;
12287 var scrollTimeoutId;
12288 var touchEndTimeoutId;
12289 var touchSnapTimeout = 70;
12290 var desktopSnapTimeout = 300;
12291
12292 function snapLargeNavbar() {
12293 var inSearchbarExpanded = $navbarInnerEl.hasClass('with-searchbar-expandable-enabled');
12294 if (inSearchbarExpanded) { return; }
12295 if (!scrollContent || currentScrollTop < 0) { return; }
12296 if (currentScrollTop >= navbarTitleLargeHeight / 2 && currentScrollTop < navbarTitleLargeHeight) {
12297 $(scrollContent).scrollTop(navbarTitleLargeHeight, 100);
12298 } else if (currentScrollTop < navbarTitleLargeHeight) {
12299 $(scrollContent).scrollTop(0, 200);
12300 }
12301 }
12302
12303 function handleLargeNavbarCollapse() {
12304 var collapseProgress = Math.min(Math.max((currentScrollTop / navbarTitleLargeHeight), 0), 1);
12305 var inSearchbarExpanded = $navbarInnerEl.hasClass('with-searchbar-expandable-enabled');
12306 if (inSearchbarExpanded) { return; }
12307 navbarCollapsed = $navbarInnerEl.hasClass('navbar-inner-large-collapsed');
12308 if (collapseProgress === 0 && navbarCollapsed) {
12309 app.navbar.expandLargeTitle($navbarInnerEl[0]);
12310 $navbarInnerEl[0].style.removeProperty('--f7-navbar-large-collapse-progress');
12311 $pageEl[0].style.removeProperty('--f7-navbar-large-collapse-progress');
12312 $navbarInnerEl[0].style.overflow = '';
5d51ea26 12313 if (app.theme === 'md' || app.theme === 'aurora') {
5309fbda
DC
12314 $navbarEl[0].style.removeProperty('--f7-navbar-large-collapse-progress');
12315 }
12316 } else if (collapseProgress === 1 && !navbarCollapsed) {
12317 app.navbar.collapseLargeTitle($navbarInnerEl[0]);
12318 $navbarInnerEl[0].style.removeProperty('--f7-navbar-large-collapse-progress');
12319 $navbarInnerEl[0].style.overflow = '';
12320 $pageEl[0].style.removeProperty('--f7-navbar-large-collapse-progress');
5d51ea26 12321 if (app.theme === 'md' || app.theme === 'aurora') {
5309fbda
DC
12322 $navbarEl[0].style.removeProperty('--f7-navbar-large-collapse-progress');
12323 }
12324 } else if ((collapseProgress === 1 && navbarCollapsed) || (collapseProgress === 0 && !navbarCollapsed)) {
12325 $navbarInnerEl[0].style.removeProperty('--f7-navbar-large-collapse-progress');
12326 $navbarInnerEl[0].style.overflow = '';
12327 $pageEl[0].style.removeProperty('--f7-navbar-large-collapse-progress');
5d51ea26 12328 if (app.theme === 'md' || app.theme === 'aurora') {
5309fbda
DC
12329 $navbarEl[0].style.removeProperty('--f7-navbar-large-collapse-progress');
12330 }
12331 } else {
12332 $navbarInnerEl[0].style.setProperty('--f7-navbar-large-collapse-progress', collapseProgress);
12333 $navbarInnerEl[0].style.overflow = 'visible';
12334 $pageEl[0].style.setProperty('--f7-navbar-large-collapse-progress', collapseProgress);
5d51ea26 12335 if (app.theme === 'md' || app.theme === 'aurora') {
5309fbda
DC
12336 $navbarEl[0].style.setProperty('--f7-navbar-large-collapse-progress', collapseProgress);
12337 }
12338 }
12339
12340 if (snapPageScrollToLargeTitle) {
12341 if (!Support.touch) {
12342 clearTimeout(scrollTimeoutId);
12343 scrollTimeoutId = setTimeout(function () {
12344 snapLargeNavbar();
12345 }, desktopSnapTimeout);
12346 } else if (touchEndTimeoutId) {
12347 clearTimeout(touchEndTimeoutId);
12348 touchEndTimeoutId = null;
12349 touchEndTimeoutId = setTimeout(function () {
12350 snapLargeNavbar();
12351 clearTimeout(touchEndTimeoutId);
12352 touchEndTimeoutId = null;
12353 }, touchSnapTimeout);
12354 }
12355 }
12356 }
12357
12358 function handleTitleHideShow() {
12359 scrollHeight = scrollContent.scrollHeight;
12360 offsetHeight = scrollContent.offsetHeight;
12361 reachEnd = currentScrollTop + offsetHeight >= scrollHeight;
12362 navbarHidden = $navbarEl.hasClass('navbar-hidden');
12363
12364 if (reachEnd) {
12365 if (app.params.navbar.showOnPageScrollEnd) {
12366 action = 'show';
12367 }
12368 } else if (previousScrollTop > currentScrollTop) {
12369 if (app.params.navbar.showOnPageScrollTop || currentScrollTop <= navbarHideHeight) {
12370 action = 'show';
12371 } else {
12372 action = 'hide';
12373 }
12374 } else if (currentScrollTop > navbarHideHeight) {
12375 action = 'hide';
12376 } else {
12377 action = 'show';
12378 }
12379
12380 if (action === 'show' && navbarHidden) {
12381 app.navbar.show($navbarEl);
12382 navbarHidden = false;
12383 } else if (action === 'hide' && !navbarHidden) {
12384 app.navbar.hide($navbarEl);
12385 navbarHidden = true;
12386 }
12387 previousScrollTop = currentScrollTop;
12388 }
12389
12390 function handleScroll() {
12391 scrollContent = this;
12392 currentScrollTop = scrollContent.scrollTop;
12393 scrollChanged = currentScrollTop;
12394
12395 if (needCollapse) {
12396 handleLargeNavbarCollapse();
12397 }
12398 if ($pageEl.hasClass('page-previous')) { return; }
12399 if (needHide) {
12400 handleTitleHideShow();
12401 }
12402 }
12403 function handeTouchStart() {
12404 scrollChanged = false;
12405 }
12406 function handleTouchEnd() {
12407 clearTimeout(touchEndTimeoutId);
12408 touchEndTimeoutId = null;
12409 touchEndTimeoutId = setTimeout(function () {
12410 if (scrollChanged !== false) {
12411 snapLargeNavbar();
12412 clearTimeout(touchEndTimeoutId);
12413 touchEndTimeoutId = null;
12414 }
12415 }, touchSnapTimeout);
12416 }
12417 $pageEl.on('scroll', '.page-content', handleScroll, true);
12418 if (Support.touch && needCollapse && snapPageScrollToLargeTitle) {
12419 app.on('touchstart:passive', handeTouchStart);
12420 app.on('touchend:passive', handleTouchEnd);
12421 }
12422 if (needCollapse) {
12423 $pageEl.find('.page-content').each(function (pageContentIndex, pageContentEl) {
12424 if (pageContentEl.scrollTop > 0) { handleScroll.call(pageContentEl); }
12425 });
12426 }
12427 $pageEl[0].f7DetachNavbarScrollHandlers = function f7DetachNavbarScrollHandlers() {
12428 delete $pageEl[0].f7DetachNavbarScrollHandlers;
12429 $pageEl.off('scroll', '.page-content', handleScroll, true);
12430 if (Support.touch && needCollapse && snapPageScrollToLargeTitle) {
12431 app.off('touchstart:passive', handeTouchStart);
12432 app.off('touchend:passive', handleTouchEnd);
12433 }
12434 };
12435 },
12436 };
12437 var Navbar$1 = {
12438 name: 'navbar',
12439 create: function create() {
12440 var app = this;
12441 Utils.extend(app, {
12442 navbar: {
12443 size: Navbar.size.bind(app),
12444 hide: Navbar.hide.bind(app),
12445 show: Navbar.show.bind(app),
12446 getElByPage: Navbar.getElByPage.bind(app),
12447 getPageByEl: Navbar.getPageByEl.bind(app),
12448 collapseLargeTitle: Navbar.collapseLargeTitle.bind(app),
12449 expandLargeTitle: Navbar.expandLargeTitle.bind(app),
12450 toggleLargeTitle: Navbar.toggleLargeTitle.bind(app),
12451 initNavbarOnScroll: Navbar.initNavbarOnScroll.bind(app),
12452 },
12453 });
12454 },
12455 params: {
12456 navbar: {
12457 scrollTopOnTitleClick: true,
12458 iosCenterTitle: true,
12459 mdCenterTitle: false,
5d51ea26 12460 auroraCenterTitle: true,
5309fbda
DC
12461 hideOnPageScroll: false,
12462 showOnPageScrollEnd: true,
12463 showOnPageScrollTop: true,
12464 collapseLargeTitleOnScroll: true,
12465 snapPageScrollToLargeTitle: true,
12466 },
12467 },
12468 on: {
5d51ea26 12469 'panelBreakpoint panelResize resize viewMasterDetailBreakpoint': function onResize() {
5309fbda
DC
12470 var app = this;
12471 $('.navbar').each(function (index, navbarEl) {
12472 app.navbar.size(navbarEl);
12473 });
12474 },
12475 pageBeforeRemove: function pageBeforeRemove(page) {
12476 if (page.$el[0].f7DetachNavbarScrollHandlers) {
12477 page.$el[0].f7DetachNavbarScrollHandlers();
12478 }
12479 },
12480 pageBeforeIn: function pageBeforeIn(page) {
12481 var app = this;
12482 if (app.theme !== 'ios') { return; }
12483 var $navbarEl;
12484 var view = page.$el.parents('.view')[0].f7View;
12485 var navbarInnerEl = app.navbar.getElByPage(page);
12486 if (!navbarInnerEl) {
12487 $navbarEl = page.$el.parents('.view').children('.navbar');
12488 } else {
12489 $navbarEl = $(navbarInnerEl).parents('.navbar');
12490 }
12491 if (page.$el.hasClass('no-navbar') || (view.router.dynamicNavbar && !navbarInnerEl)) {
12492 var animate = !!(page.pageFrom && page.router.history.length > 0);
12493 app.navbar.hide($navbarEl, animate);
12494 } else {
12495 app.navbar.show($navbarEl);
12496 }
12497 },
12498 pageReinit: function pageReinit(page) {
12499 var app = this;
12500 var $navbarInnerEl = $(app.navbar.getElByPage(page));
12501 if (!$navbarInnerEl || $navbarInnerEl.length === 0) { return; }
12502 app.navbar.size($navbarInnerEl);
12503 },
12504 pageInit: function pageInit(page) {
12505 var app = this;
12506 var $navbarInnerEl = $(app.navbar.getElByPage(page));
12507 if (!$navbarInnerEl || $navbarInnerEl.length === 0) { return; }
12508
12509 // Size
12510 app.navbar.size($navbarInnerEl);
12511
12512 // Need Collapse On Scroll
12513 var needCollapseOnScrollHandler;
12514 if ($navbarInnerEl.children('.title-large').length > 0) {
12515 $navbarInnerEl.addClass('navbar-inner-large');
12516 }
12517 if ($navbarInnerEl.hasClass('navbar-inner-large')) {
12518 if (app.params.navbar.collapseLargeTitleOnScroll) { needCollapseOnScrollHandler = true; }
5d51ea26 12519 if (app.theme === 'md' || app.theme === 'aurora') {
5309fbda
DC
12520 $navbarInnerEl.parents('.navbar').addClass('navbar-large');
12521 }
12522 page.$el.addClass('page-with-navbar-large');
12523 }
12524
12525 // Need Hide On Scroll
12526 var needHideOnScrollHandler;
12527 if (
12528 app.params.navbar.hideOnPageScroll
12529 || page.$el.find('.hide-navbar-on-scroll').length
12530 || page.$el.hasClass('hide-navbar-on-scroll')
12531 || page.$el.find('.hide-bars-on-scroll').length
12532 || page.$el.hasClass('hide-bars-on-scroll')
12533 ) {
12534 if (
12535 page.$el.find('.keep-navbar-on-scroll').length
12536 || page.$el.hasClass('keep-navbar-on-scroll')
12537 || page.$el.find('.keep-bars-on-scroll').length
12538 || page.$el.hasClass('keep-bars-on-scroll')
12539 ) {
12540 needHideOnScrollHandler = false;
12541 } else {
12542 needHideOnScrollHandler = true;
12543 }
12544 }
12545
12546 if (needCollapseOnScrollHandler || needHideOnScrollHandler) {
12547 app.navbar.initNavbarOnScroll(page.el, $navbarInnerEl[0], needHideOnScrollHandler, needCollapseOnScrollHandler);
12548 }
12549 },
12550 modalOpen: function modalOpen(modal) {
12551 var app = this;
5d51ea26 12552 if (!app.params.navbar[((app.theme) + "CenterTitle")]) {
5309fbda
DC
12553 return;
12554 }
12555 modal.$el.find('.navbar:not(.navbar-previous):not(.stacked)').each(function (index, navbarEl) {
12556 app.navbar.size(navbarEl);
12557 });
12558 },
12559 panelOpen: function panelOpen(panel) {
12560 var app = this;
5d51ea26 12561 if (!app.params.navbar[((app.theme) + "CenterTitle")]) {
5309fbda
DC
12562 return;
12563 }
12564 panel.$el.find('.navbar:not(.navbar-previous):not(.stacked)').each(function (index, navbarEl) {
12565 app.navbar.size(navbarEl);
12566 });
12567 },
12568 panelSwipeOpen: function panelSwipeOpen(panel) {
12569 var app = this;
5d51ea26 12570 if (!app.params.navbar[((app.theme) + "CenterTitle")]) {
5309fbda
DC
12571 return;
12572 }
12573 panel.$el.find('.navbar:not(.navbar-previous):not(.stacked)').each(function (index, navbarEl) {
12574 app.navbar.size(navbarEl);
12575 });
12576 },
12577 tabShow: function tabShow(tabEl) {
12578 var app = this;
5d51ea26 12579 if (!app.params.navbar[((app.theme) + "CenterTitle")]) {
5309fbda
DC
12580 return;
12581 }
12582 $(tabEl).find('.navbar:not(.navbar-previous):not(.stacked)').each(function (index, navbarEl) {
12583 app.navbar.size(navbarEl);
12584 });
12585 },
12586 },
12587 clicks: {
12588 '.navbar .title': function onTitleClick($clickedEl) {
12589 var app = this;
12590 if (!app.params.navbar.scrollTopOnTitleClick) { return; }
12591 if ($clickedEl.closest('a').length > 0) {
12592 return;
12593 }
12594 var pageContent;
12595 // Find active page
12596 var navbar = $clickedEl.parents('.navbar');
12597
12598 // Static Layout
12599 pageContent = navbar.parents('.page-content');
12600
12601 if (pageContent.length === 0) {
12602 // Fixed Layout
12603 if (navbar.parents('.page').length > 0) {
12604 pageContent = navbar.parents('.page').find('.page-content');
12605 }
12606 // Through Layout
12607 if (pageContent.length === 0) {
12608 if (navbar.nextAll('.page-current:not(.stacked)').length > 0) {
12609 pageContent = navbar.nextAll('.page-current:not(.stacked)').find('.page-content');
12610 }
12611 }
12612 }
12613 if (pageContent && pageContent.length > 0) {
12614 // Check for tab
12615 if (pageContent.hasClass('tab')) {
12616 pageContent = pageContent.parent('.tabs').children('.page-content.tab-active');
12617 }
12618 if (pageContent.length > 0) { pageContent.scrollTop(0, 300); }
12619 }
12620 },
12621 },
12622 vnode: {
12623 'navbar-inner': {
12624 postpatch: function postpatch(vnode) {
12625 var app = this;
5d51ea26 12626 if (!app.params.navbar[((app.theme) + "CenterTitle")]) {
5309fbda
DC
12627 return;
12628 }
12629 app.navbar.size(vnode.elm);
12630 },
12631 },
12632 },
12633 };
12634
12635 var Toolbar = {
12636 setHighlight: function setHighlight(tabbarEl) {
12637 var app = this;
12638 if (app.theme !== 'md') { return; }
12639
12640 var $tabbarEl = $(tabbarEl);
12641
12642 if ($tabbarEl.length === 0 || !($tabbarEl.hasClass('tabbar') || $tabbarEl.hasClass('tabbar-labels'))) { return; }
12643
12644 var $highlightEl = $tabbarEl.find('.tab-link-highlight');
12645 var tabLinksCount = $tabbarEl.find('.tab-link').length;
12646 if (tabLinksCount === 0) {
12647 $highlightEl.remove();
12648 return;
12649 }
12650
12651 if ($highlightEl.length === 0) {
12652 $tabbarEl.children('.toolbar-inner').append('<span class="tab-link-highlight"></span>');
12653 $highlightEl = $tabbarEl.find('.tab-link-highlight');
12654 } else if ($highlightEl.next().length) {
12655 $tabbarEl.children('.toolbar-inner').append($highlightEl);
12656 }
12657
12658 var $activeLink = $tabbarEl.find('.tab-link-active');
12659 var highlightWidth;
12660 var highlightTranslate;
12661
12662 if ($tabbarEl.hasClass('tabbar-scrollable') && $activeLink && $activeLink[0]) {
12663 highlightWidth = ($activeLink[0].offsetWidth) + "px";
12664 highlightTranslate = ($activeLink[0].offsetLeft) + "px";
12665 } else {
12666 var activeIndex = $activeLink.index();
12667 highlightWidth = (100 / tabLinksCount) + "%";
12668 highlightTranslate = ((app.rtl ? -activeIndex : activeIndex) * 100) + "%";
12669 }
12670
12671 Utils.nextFrame(function () {
12672 $highlightEl
12673 .css('width', highlightWidth)
12674 .transform(("translate3d(" + highlightTranslate + ",0,0)"));
12675 });
12676 },
12677 init: function init(tabbarEl) {
12678 var app = this;
12679 app.toolbar.setHighlight(tabbarEl);
12680 },
12681 hide: function hide(el, animate) {
12682 if ( animate === void 0 ) animate = true;
12683
12684 var $el = $(el);
12685 if ($el.hasClass('toolbar-hidden')) { return; }
12686 var className = "toolbar-hidden" + (animate ? ' toolbar-transitioning' : '');
12687 $el.transitionEnd(function () {
12688 $el.removeClass('toolbar-transitioning');
12689 });
12690 $el.addClass(className);
12691 },
12692 show: function show(el, animate) {
12693 if ( animate === void 0 ) animate = true;
12694
12695 var $el = $(el);
12696 if (!$el.hasClass('toolbar-hidden')) { return; }
12697 if (animate) {
12698 $el.addClass('toolbar-transitioning');
12699 $el.transitionEnd(function () {
12700 $el.removeClass('toolbar-transitioning');
12701 });
12702 }
12703 $el.removeClass('toolbar-hidden');
12704 },
12705 initHideToolbarOnScroll: function initHideToolbarOnScroll(pageEl) {
12706 var app = this;
12707 var $pageEl = $(pageEl);
12708 var $toolbarEl = $pageEl.parents('.view').children('.toolbar');
12709 if ($toolbarEl.length === 0) {
12710 $toolbarEl = $pageEl.find('.toolbar');
12711 }
12712 if ($toolbarEl.length === 0) {
12713 $toolbarEl = $pageEl.parents('.views').children('.tabbar, .tabbar-labels');
12714 }
12715 if ($toolbarEl.length === 0) {
12716 return;
12717 }
12718
12719 var previousScrollTop;
12720 var currentScrollTop;
12721
12722 var scrollHeight;
12723 var offsetHeight;
12724 var reachEnd;
12725 var action;
12726 var toolbarHidden;
12727 function handleScroll() {
12728 var scrollContent = this;
12729 if ($pageEl.hasClass('page-previous')) { return; }
12730 currentScrollTop = scrollContent.scrollTop;
12731 scrollHeight = scrollContent.scrollHeight;
12732 offsetHeight = scrollContent.offsetHeight;
12733 reachEnd = currentScrollTop + offsetHeight >= scrollHeight;
12734 toolbarHidden = $toolbarEl.hasClass('toolbar-hidden');
12735
12736 if (reachEnd) {
12737 if (app.params.toolbar.showOnPageScrollEnd) {
12738 action = 'show';
12739 }
12740 } else if (previousScrollTop > currentScrollTop) {
12741 if (app.params.toolbar.showOnPageScrollTop || currentScrollTop <= 44) {
12742 action = 'show';
12743 } else {
12744 action = 'hide';
12745 }
12746 } else if (currentScrollTop > 44) {
12747 action = 'hide';
12748 } else {
12749 action = 'show';
12750 }
12751
12752 if (action === 'show' && toolbarHidden) {
12753 app.toolbar.show($toolbarEl);
12754 toolbarHidden = false;
12755 } else if (action === 'hide' && !toolbarHidden) {
12756 app.toolbar.hide($toolbarEl);
12757 toolbarHidden = true;
12758 }
12759
12760 previousScrollTop = currentScrollTop;
12761 }
12762 $pageEl.on('scroll', '.page-content', handleScroll, true);
12763 $pageEl[0].f7ScrollToolbarHandler = handleScroll;
12764 },
12765 };
12766 var Toolbar$1 = {
12767 name: 'toolbar',
12768 create: function create() {
12769 var app = this;
12770 Utils.extend(app, {
12771 toolbar: {
12772 hide: Toolbar.hide.bind(app),
12773 show: Toolbar.show.bind(app),
12774 setHighlight: Toolbar.setHighlight.bind(app),
12775 initHideToolbarOnScroll: Toolbar.initHideToolbarOnScroll.bind(app),
12776 init: Toolbar.init.bind(app),
12777 },
12778 });
12779 },
12780 params: {
12781 toolbar: {
12782 hideOnPageScroll: false,
12783 showOnPageScrollEnd: true,
12784 showOnPageScrollTop: true,
12785 },
12786 },
12787 on: {
12788 pageBeforeRemove: function pageBeforeRemove(page) {
12789 if (page.$el[0].f7ScrollToolbarHandler) {
12790 page.$el.off('scroll', '.page-content', page.$el[0].f7ScrollToolbarHandler, true);
12791 }
12792 },
12793 pageBeforeIn: function pageBeforeIn(page) {
12794 var app = this;
12795 var $toolbarEl = page.$el.parents('.view').children('.toolbar');
12796 if ($toolbarEl.length === 0) {
12797 $toolbarEl = page.$el.parents('.views').children('.tabbar, .tabbar-labels');
12798 }
12799 if ($toolbarEl.length === 0) {
12800 $toolbarEl = page.$el.find('.toolbar');
12801 }
12802 if ($toolbarEl.length === 0) {
12803 return;
12804 }
12805 if (page.$el.hasClass('no-toolbar')) {
12806 app.toolbar.hide($toolbarEl);
12807 } else {
12808 app.toolbar.show($toolbarEl);
12809 }
12810 },
12811 pageInit: function pageInit(page) {
12812 var app = this;
12813 page.$el.find('.tabbar, .tabbar-labels').each(function (index, tabbarEl) {
12814 app.toolbar.init(tabbarEl);
12815 });
12816 if (
12817 app.params.toolbar.hideOnPageScroll
12818 || page.$el.find('.hide-toolbar-on-scroll').length
12819 || page.$el.hasClass('hide-toolbar-on-scroll')
12820 || page.$el.find('.hide-bars-on-scroll').length
12821 || page.$el.hasClass('hide-bars-on-scroll')
12822 ) {
12823 if (
12824 page.$el.find('.keep-toolbar-on-scroll').length
12825 || page.$el.hasClass('keep-toolbar-on-scroll')
12826 || page.$el.find('.keep-bars-on-scroll').length
12827 || page.$el.hasClass('keep-bars-on-scroll')
12828 ) {
12829 return;
12830 }
12831 app.toolbar.initHideToolbarOnScroll(page.el);
12832 }
12833 },
12834 init: function init() {
12835 var app = this;
12836 app.root.find('.tabbar, .tabbar-labels').each(function (index, tabbarEl) {
12837 app.toolbar.init(tabbarEl);
12838 });
12839 },
12840 },
12841 };
12842
12843 var Subnavbar = {
12844 name: 'subnavbar',
12845 on: {
12846 pageInit: function pageInit(page) {
12847 if (page.$navbarEl && page.$navbarEl.length && page.$navbarEl.find('.subnavbar').length) {
12848 page.$el.addClass('page-with-subnavbar');
12849 }
12850 if (page.$el.find('.subnavbar').length) {
12851 page.$el.addClass('page-with-subnavbar');
12852 }
12853 },
12854 },
12855 };
12856
12857 var TouchRipple = function TouchRipple($el, x, y) {
12858 var ripple = this;
12859 if (!$el) { return undefined; }
12860 var box = $el[0].getBoundingClientRect();
12861 var center = {
12862 x: x - box.left,
12863 y: y - box.top,
12864 };
12865 var width = box.width;
12866 var height = box.height;
12867 var diameter = Math.max((Math.pow( ((Math.pow( height, 2 )) + (Math.pow( width, 2 ))), 0.5 )), 48);
12868
12869 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>"));
12870
12871 $el.prepend(ripple.$rippleWaveEl);
12872
5309fbda
DC
12873 ripple.rippleTransform = "translate3d(" + (-center.x + (width / 2)) + "px, " + (-center.y + (height / 2)) + "px, 0) scale(1)";
12874
12875 Utils.nextFrame(function () {
12876 if (!ripple || !ripple.$rippleWaveEl) { return; }
12877 ripple.$rippleWaveEl.transform(ripple.rippleTransform);
12878 });
12879
12880 return ripple;
12881 };
12882
5d51ea26 12883 TouchRipple.prototype.destroy = function destroy () {
5309fbda
DC
12884 var ripple = this;
12885 if (ripple.$rippleWaveEl) {
12886 ripple.$rippleWaveEl.remove();
12887 }
12888 Object.keys(ripple).forEach(function (key) {
12889 ripple[key] = null;
12890 delete ripple[key];
12891 });
12892 ripple = null;
12893 };
12894
12895 TouchRipple.prototype.remove = function remove () {
12896 var ripple = this;
12897 if (ripple.removing) { return; }
12898 var $rippleWaveEl = this.$rippleWaveEl;
12899 var rippleTransform = this.rippleTransform;
12900 var removeTimeout = Utils.nextTick(function () {
5d51ea26 12901 ripple.destroy();
5309fbda
DC
12902 }, 400);
12903 ripple.removing = true;
12904 $rippleWaveEl
12905 .addClass('ripple-wave-fill')
12906 .transform(rippleTransform.replace('scale(1)', 'scale(1.01)'))
12907 .transitionEnd(function () {
12908 clearTimeout(removeTimeout);
12909 Utils.nextFrame(function () {
12910 $rippleWaveEl
12911 .addClass('ripple-wave-out')
12912 .transform(rippleTransform.replace('scale(1)', 'scale(1.01)'));
12913
12914 removeTimeout = Utils.nextTick(function () {
5d51ea26 12915 ripple.destroy();
5309fbda
DC
12916 }, 700);
12917
12918 $rippleWaveEl.transitionEnd(function () {
12919 clearTimeout(removeTimeout);
5d51ea26 12920 ripple.destroy();
5309fbda
DC
12921 });
12922 });
12923 });
12924 };
12925
12926 var TouchRipple$1 = {
12927 name: 'touch-ripple',
12928 static: {
12929 TouchRipple: TouchRipple,
12930 },
12931 create: function create() {
12932 var app = this;
12933 app.touchRipple = {
12934 create: function create() {
12935 var args = [], len = arguments.length;
12936 while ( len-- ) args[ len ] = arguments[ len ];
12937
12938 return new (Function.prototype.bind.apply( TouchRipple, [ null ].concat( args) ));
12939 },
12940 };
12941 },
12942 };
12943
12944 var openedModals = [];
12945 var dialogsQueue = [];
12946 function clearDialogsQueue() {
12947 if (dialogsQueue.length === 0) { return; }
12948 var dialog = dialogsQueue.shift();
12949 dialog.open();
12950 }
5d51ea26 12951 var Modal = /*@__PURE__*/(function (Framework7Class) {
5309fbda 12952 function Modal(app, params) {
5d51ea26 12953 Framework7Class.call(this, params, [app]);
5309fbda
DC
12954
12955 var modal = this;
12956
12957 var defaults = {};
12958
12959 // Extend defaults with modules params
12960 modal.useModulesParams(defaults);
12961
12962 modal.params = Utils.extend(defaults, params);
12963 modal.opened = false;
12964
12965 // Install Modules
12966 modal.useModules();
12967
12968 return this;
12969 }
12970
5d51ea26
DC
12971 if ( Framework7Class ) Modal.__proto__ = Framework7Class;
12972 Modal.prototype = Object.create( Framework7Class && Framework7Class.prototype );
5309fbda
DC
12973 Modal.prototype.constructor = Modal;
12974
12975 Modal.prototype.onOpen = function onOpen () {
12976 var modal = this;
12977 modal.opened = true;
12978 openedModals.push(modal);
12979 $('html').addClass(("with-modal-" + (modal.type.toLowerCase())));
12980 modal.$el.trigger(("modal:open " + (modal.type.toLowerCase()) + ":open"), modal);
12981 modal.emit(("local::open modalOpen " + (modal.type) + "Open"), modal);
12982 };
12983
12984 Modal.prototype.onOpened = function onOpened () {
12985 var modal = this;
12986 modal.$el.trigger(("modal:opened " + (modal.type.toLowerCase()) + ":opened"), modal);
12987 modal.emit(("local::opened modalOpened " + (modal.type) + "Opened"), modal);
12988 };
12989
12990 Modal.prototype.onClose = function onClose () {
12991 var modal = this;
12992 modal.opened = false;
12993 if (!modal.type || !modal.$el) { return; }
12994 openedModals.splice(openedModals.indexOf(modal), 1);
12995 $('html').removeClass(("with-modal-" + (modal.type.toLowerCase())));
12996 modal.$el.trigger(("modal:close " + (modal.type.toLowerCase()) + ":close"), modal);
12997 modal.emit(("local::close modalClose " + (modal.type) + "Close"), modal);
12998 };
12999
13000 Modal.prototype.onClosed = function onClosed () {
13001 var modal = this;
13002 if (!modal.type || !modal.$el) { return; }
13003 modal.$el.removeClass('modal-out');
13004 modal.$el.hide();
13005 modal.$el.trigger(("modal:closed " + (modal.type.toLowerCase()) + ":closed"), modal);
13006 modal.emit(("local::closed modalClosed " + (modal.type) + "Closed"), modal);
13007 };
13008
13009 Modal.prototype.open = function open (animateModal) {
13010 var modal = this;
13011 var app = modal.app;
13012 var $el = modal.$el;
13013 var $backdropEl = modal.$backdropEl;
13014 var type = modal.type;
13015 var animate = true;
13016 if (typeof animateModal !== 'undefined') { animate = animateModal; }
13017 else if (typeof modal.params.animate !== 'undefined') {
13018 animate = modal.params.animate;
13019 }
13020
13021 if (!$el || $el.hasClass('modal-in')) {
13022 return modal;
13023 }
13024
13025 if (type === 'dialog' && app.params.modal.queueDialogs) {
13026 var pushToQueue;
13027 if ($('.dialog.modal-in').length > 0) {
13028 pushToQueue = true;
13029 } else if (openedModals.length > 0) {
13030 openedModals.forEach(function (openedModal) {
13031 if (openedModal.type === 'dialog') { pushToQueue = true; }
13032 });
13033 }
13034 if (pushToQueue) {
13035 dialogsQueue.push(modal);
13036 return modal;
13037 }
13038 }
13039
13040 var $modalParentEl = $el.parent();
13041 var wasInDom = $el.parents(doc).length > 0;
13042 if (app.params.modal.moveToRoot && !$modalParentEl.is(app.root)) {
13043 app.root.append($el);
13044 modal.once((type + "Closed"), function () {
13045 if (wasInDom) {
13046 $modalParentEl.append($el);
13047 } else {
13048 $el.remove();
13049 }
13050 });
13051 }
13052 // Show Modal
13053 $el.show();
13054
13055 /* eslint no-underscore-dangle: ["error", { "allow": ["_clientLeft"] }] */
13056 modal._clientLeft = $el[0].clientLeft;
13057
13058 // Modal
13059 function transitionEnd() {
13060 if ($el.hasClass('modal-out')) {
13061 modal.onClosed();
13062 } else if ($el.hasClass('modal-in')) {
13063 modal.onOpened();
13064 }
13065 }
13066 if (animate) {
13067 if ($backdropEl) {
13068 $backdropEl.removeClass('not-animated');
13069 $backdropEl.addClass('backdrop-in');
13070 }
13071 $el
13072 .animationEnd(function () {
13073 transitionEnd();
13074 });
13075 $el
13076 .transitionEnd(function () {
13077 transitionEnd();
13078 });
13079 $el
13080 .removeClass('modal-out not-animated')
13081 .addClass('modal-in');
13082 modal.onOpen();
13083 } else {
13084 if ($backdropEl) {
13085 $backdropEl.addClass('backdrop-in not-animated');
13086 }
13087 $el.removeClass('modal-out').addClass('modal-in not-animated');
13088 modal.onOpen();
13089 modal.onOpened();
13090 }
13091
13092 return modal;
13093 };
13094
13095 Modal.prototype.close = function close (animateModal) {
13096 var modal = this;
13097 var $el = modal.$el;
13098 var $backdropEl = modal.$backdropEl;
13099
13100 var animate = true;
13101 if (typeof animateModal !== 'undefined') { animate = animateModal; }
13102 else if (typeof modal.params.animate !== 'undefined') {
13103 animate = modal.params.animate;
13104 }
13105
13106 if (!$el || !$el.hasClass('modal-in')) {
13107 return modal;
13108 }
13109
13110 // backdrop
13111 if ($backdropEl) {
13112 var needToHideBackdrop = true;
13113 if (modal.type === 'popup') {
13114 modal.$el.prevAll('.popup.modal-in').each(function (index, popupEl) {
13115 var popupInstance = popupEl.f7Modal;
13116 if (!popupInstance) { return; }
13117 if (
13118 popupInstance.params.closeByBackdropClick
13119 && popupInstance.params.backdrop
13120 && popupInstance.backdropEl === modal.backdropEl
13121 ) {
13122 needToHideBackdrop = false;
13123 }
13124 });
13125 }
13126 if (needToHideBackdrop) {
13127 $backdropEl[animate ? 'removeClass' : 'addClass']('not-animated');
13128 $backdropEl.removeClass('backdrop-in');
13129 }
13130 }
13131
13132 // Modal
13133 $el[animate ? 'removeClass' : 'addClass']('not-animated');
13134 function transitionEnd() {
13135 if ($el.hasClass('modal-out')) {
13136 modal.onClosed();
13137 } else if ($el.hasClass('modal-in')) {
13138 modal.onOpened();
13139 }
13140 }
13141 if (animate) {
13142 $el
13143 .animationEnd(function () {
13144 transitionEnd();
13145 });
13146 $el
13147 .transitionEnd(function () {
13148 transitionEnd();
13149 });
13150 $el
13151 .removeClass('modal-in')
13152 .addClass('modal-out');
13153 // Emit close
13154 modal.onClose();
13155 } else {
13156 $el
13157 .addClass('not-animated')
13158 .removeClass('modal-in')
13159 .addClass('modal-out');
13160 // Emit close
13161 modal.onClose();
13162 modal.onClosed();
13163 }
13164
13165 if (modal.type === 'dialog') {
13166 clearDialogsQueue();
13167 }
13168
13169 return modal;
13170 };
13171
13172 Modal.prototype.destroy = function destroy () {
13173 var modal = this;
13174 if (modal.destroyed) { return; }
13175 modal.emit(("local::beforeDestroy modalBeforeDestroy " + (modal.type) + "BeforeDestroy"), modal);
13176 if (modal.$el) {
13177 modal.$el.trigger(("modal:beforedestroy " + (modal.type.toLowerCase()) + ":beforedestroy"), modal);
13178 if (modal.$el.length && modal.$el[0].f7Modal) {
13179 delete modal.$el[0].f7Modal;
13180 }
13181 }
13182 Utils.deleteProps(modal);
13183 modal.destroyed = true;
13184 };
13185
13186 return Modal;
13187 }(Framework7Class));
13188
5d51ea26 13189 var CustomModal = /*@__PURE__*/(function (Modal) {
5309fbda
DC
13190 function CustomModal(app, params) {
13191 var extendedParams = Utils.extend({
13192 backdrop: true,
13193 closeByBackdropClick: true,
13194 on: {},
13195 }, params);
13196
13197 // Extends with open/close Modal methods;
5d51ea26 13198 Modal.call(this, app, extendedParams);
5309fbda
DC
13199
13200 var customModal = this;
13201
13202 customModal.params = extendedParams;
13203
13204 // Find Element
13205 var $el;
13206 if (!customModal.params.el) {
13207 $el = $(customModal.params.content);
13208 } else {
13209 $el = $(customModal.params.el);
13210 }
13211
13212 if ($el && $el.length > 0 && $el[0].f7Modal) {
13213 return $el[0].f7Modal;
13214 }
13215
13216 if ($el.length === 0) {
13217 return customModal.destroy();
13218 }
13219 var $backdropEl;
13220 if (customModal.params.backdrop) {
13221 $backdropEl = app.root.children('.custom-modal-backdrop');
13222 if ($backdropEl.length === 0) {
13223 $backdropEl = $('<div class="custom-modal-backdrop"></div>');
13224 app.root.append($backdropEl);
13225 }
13226 }
13227
13228 function handleClick(e) {
13229 if (!customModal || customModal.destroyed) { return; }
13230 if ($backdropEl && e.target === $backdropEl[0]) {
13231 customModal.close();
13232 }
13233 }
13234
13235 customModal.on('customModalOpened', function () {
13236 if (customModal.params.closeByBackdropClick && customModal.params.backdrop) {
13237 app.on('click', handleClick);
13238 }
13239 });
13240 customModal.on('customModalClose', function () {
13241 if (customModal.params.closeByBackdropClick && customModal.params.backdrop) {
13242 app.off('click', handleClick);
13243 }
13244 });
13245
13246 Utils.extend(customModal, {
13247 app: app,
13248 $el: $el,
13249 el: $el[0],
13250 $backdropEl: $backdropEl,
13251 backdropEl: $backdropEl && $backdropEl[0],
13252 type: 'customModal',
13253 });
13254
13255 $el[0].f7Modal = customModal;
13256
13257 return customModal;
13258 }
13259
5d51ea26
DC
13260 if ( Modal ) CustomModal.__proto__ = Modal;
13261 CustomModal.prototype = Object.create( Modal && Modal.prototype );
5309fbda
DC
13262 CustomModal.prototype.constructor = CustomModal;
13263
13264 return CustomModal;
13265 }(Modal));
13266
13267 var Modal$1 = {
13268 name: 'modal',
13269 static: {
13270 Modal: Modal,
13271 CustomModal: CustomModal,
13272 },
13273 create: function create() {
13274 var app = this;
13275 app.customModal = {
13276 create: function create(params) {
13277 return new CustomModal(app, params);
13278 },
13279 };
13280 },
13281 params: {
13282 modal: {
13283 moveToRoot: true,
13284 queueDialogs: true,
13285 },
13286 },
13287 };
13288
5d51ea26
DC
13289 var Appbar = {
13290 name: 'appbar',
13291 };
13292
13293 var Dialog = /*@__PURE__*/(function (Modal) {
5309fbda
DC
13294 function Dialog(app, params) {
13295 var extendedParams = Utils.extend({
13296 title: app.params.dialog.title,
13297 text: undefined,
13298 content: '',
13299 buttons: [],
13300 verticalButtons: false,
13301 onClick: undefined,
13302 cssClass: undefined,
13303 destroyOnClose: false,
13304 on: {},
13305 }, params);
13306 if (typeof extendedParams.closeByBackdropClick === 'undefined') {
13307 extendedParams.closeByBackdropClick = app.params.dialog.closeByBackdropClick;
13308 }
13309
13310 // Extends with open/close Modal methods;
5d51ea26 13311 Modal.call(this, app, extendedParams);
5309fbda
DC
13312
13313 var dialog = this;
13314
13315 var title = extendedParams.title;
13316 var text = extendedParams.text;
13317 var content = extendedParams.content;
13318 var buttons = extendedParams.buttons;
13319 var verticalButtons = extendedParams.verticalButtons;
13320 var cssClass = extendedParams.cssClass;
13321
13322 dialog.params = extendedParams;
13323
13324 // Find Element
13325 var $el;
13326 if (!dialog.params.el) {
13327 var dialogClasses = ['dialog'];
13328 if (buttons.length === 0) { dialogClasses.push('dialog-no-buttons'); }
13329 if (buttons.length > 0) { dialogClasses.push(("dialog-buttons-" + (buttons.length))); }
13330 if (verticalButtons) { dialogClasses.push('dialog-buttons-vertical'); }
13331 if (cssClass) { dialogClasses.push(cssClass); }
13332
13333 var buttonsHTML = '';
13334 if (buttons.length > 0) {
13335 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 ";
13336 }
13337
13338 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 ";
13339 $el = $(dialogHtml);
13340 } else {
13341 $el = $(dialog.params.el);
13342 }
13343
13344 if ($el && $el.length > 0 && $el[0].f7Modal) {
13345 return $el[0].f7Modal;
13346 }
13347
13348 if ($el.length === 0) {
13349 return dialog.destroy();
13350 }
13351
13352 var $backdropEl = app.root.children('.dialog-backdrop');
13353 if ($backdropEl.length === 0) {
13354 $backdropEl = $('<div class="dialog-backdrop"></div>');
13355 app.root.append($backdropEl);
13356 }
13357
13358 // Assign events
13359 function buttonOnClick(e) {
13360 var buttonEl = this;
13361 var index = $(buttonEl).index();
13362 var button = buttons[index];
13363 if (button.onClick) { button.onClick(dialog, e); }
13364 if (dialog.params.onClick) { dialog.params.onClick(dialog, index); }
13365 if (button.close !== false) { dialog.close(); }
13366 }
13367 var addKeyboardHander;
5d51ea26 13368 function onKeyDown(e) {
5309fbda
DC
13369 var keyCode = e.keyCode;
13370 buttons.forEach(function (button, index) {
13371 if (button.keyCodes && button.keyCodes.indexOf(keyCode) >= 0) {
13372 if (doc.activeElement) { doc.activeElement.blur(); }
13373 if (button.onClick) { button.onClick(dialog, e); }
13374 if (dialog.params.onClick) { dialog.params.onClick(dialog, index); }
13375 if (button.close !== false) { dialog.close(); }
13376 }
13377 });
13378 }
13379 if (buttons && buttons.length > 0) {
13380 dialog.on('open', function () {
13381 $el.find('.dialog-button').each(function (index, buttonEl) {
13382 var button = buttons[index];
13383 if (button.keyCodes) { addKeyboardHander = true; }
13384 $(buttonEl).on('click', buttonOnClick);
13385 });
13386 if (
13387 addKeyboardHander
13388 && !app.device.ios
13389 && !app.device.android
13390 && !app.device.cordova
13391 ) {
5d51ea26 13392 $(doc).on('keydown', onKeyDown);
5309fbda
DC
13393 }
13394 });
13395 dialog.on('close', function () {
13396 $el.find('.dialog-button').each(function (index, buttonEl) {
13397 $(buttonEl).off('click', buttonOnClick);
13398 });
13399 if (
13400 addKeyboardHander
13401 && !app.device.ios
13402 && !app.device.android
13403 && !app.device.cordova
13404 ) {
5d51ea26 13405 $(doc).off('keydown', onKeyDown);
5309fbda
DC
13406 }
13407 addKeyboardHander = false;
13408 });
13409 }
13410 Utils.extend(dialog, {
13411 app: app,
13412 $el: $el,
13413 el: $el[0],
13414 $backdropEl: $backdropEl,
13415 backdropEl: $backdropEl[0],
13416 type: 'dialog',
13417 setProgress: function setProgress(progress, duration) {
13418 app.progressbar.set($el.find('.progressbar'), progress, duration);
13419 return dialog;
13420 },
13421 setText: function setText(newText) {
13422 var $textEl = $el.find('.dialog-text');
13423 if ($textEl.length === 0) {
13424 $textEl = $('<div class="dialog-text"></div>');
13425 if (typeof title !== 'undefined') {
13426 $textEl.insertAfter($el.find('.dialog-title'));
13427 } else {
13428 $el.find('.dialog-inner').prepend($textEl);
13429 }
13430 }
13431 $textEl.html(newText);
13432 dialog.params.text = newText;
13433 return dialog;
13434 },
13435 setTitle: function setTitle(newTitle) {
13436 var $titleEl = $el.find('.dialog-title');
13437 if ($titleEl.length === 0) {
13438 $titleEl = $('<div class="dialog-title"></div>');
13439 $el.find('.dialog-inner').prepend($titleEl);
13440 }
13441 $titleEl.html(newTitle);
13442 dialog.params.title = newTitle;
13443 return dialog;
13444 },
13445 });
13446
13447 function handleClick(e) {
13448 var target = e.target;
13449 var $target = $(target);
13450 if ($target.closest(dialog.el).length === 0) {
13451 if (
13452 dialog.params.closeByBackdropClick
13453 && dialog.backdropEl
13454 && dialog.backdropEl === target
13455 ) {
13456 dialog.close();
13457 }
13458 }
13459 }
13460
13461 dialog.on('opened', function () {
13462 if (dialog.params.closeByBackdropClick) {
13463 app.on('click', handleClick);
13464 }
13465 });
13466 dialog.on('close', function () {
13467 if (dialog.params.closeByBackdropClick) {
13468 app.off('click', handleClick);
13469 }
13470 });
13471
13472 $el[0].f7Modal = dialog;
13473
13474 if (dialog.params.destroyOnClose) {
13475 dialog.once('closed', function () {
13476 setTimeout(function () {
13477 dialog.destroy();
13478 }, 0);
13479 });
13480 }
13481
13482 return dialog;
13483 }
13484
5d51ea26
DC
13485 if ( Modal ) Dialog.__proto__ = Modal;
13486 Dialog.prototype = Object.create( Modal && Modal.prototype );
5309fbda
DC
13487 Dialog.prototype.constructor = Dialog;
13488
13489 return Dialog;
13490 }(Modal));
13491
13492 var Dialog$1 = {
13493 name: 'dialog',
13494 params: {
13495 dialog: {
13496 title: undefined,
13497 buttonOk: 'OK',
13498 buttonCancel: 'Cancel',
13499 usernamePlaceholder: 'Username',
13500 passwordPlaceholder: 'Password',
13501 preloaderTitle: 'Loading... ',
13502 progressTitle: 'Loading... ',
13503 closeByBackdropClick: false,
13504 destroyPredefinedDialogs: true,
13505 keyboardActions: true,
13506 },
13507 },
13508 static: {
13509 Dialog: Dialog,
13510 },
13511 create: function create() {
13512 var app = this;
13513 function defaultDialogTitle() {
13514 return app.params.dialog.title || app.name;
13515 }
13516 var destroyOnClose = app.params.dialog.destroyPredefinedDialogs;
13517 var keyboardActions = app.params.dialog.keyboardActions;
13518 app.dialog = Utils.extend(
13519 ModalMethods({
13520 app: app,
13521 constructor: Dialog,
13522 defaultSelector: '.dialog.modal-in',
13523 }),
13524 {
13525 // Shortcuts
13526 alert: function alert() {
13527 var assign;
13528
13529 var args = [], len = arguments.length;
13530 while ( len-- ) args[ len ] = arguments[ len ];
13531 var text = args[0];
13532 var title = args[1];
13533 var callbackOk = args[2];
13534 if (args.length === 2 && typeof args[1] === 'function') {
13535 (assign = args, text = assign[0], callbackOk = assign[1], title = assign[2]);
13536 }
13537 return new Dialog(app, {
13538 title: typeof title === 'undefined' ? defaultDialogTitle() : title,
13539 text: text,
13540 buttons: [{
13541 text: app.params.dialog.buttonOk,
13542 bold: true,
13543 onClick: callbackOk,
13544 keyCodes: keyboardActions ? [13, 27] : null,
13545 }],
13546 destroyOnClose: destroyOnClose,
13547 }).open();
13548 },
13549 prompt: function prompt() {
13550 var assign;
13551
13552 var args = [], len = arguments.length;
13553 while ( len-- ) args[ len ] = arguments[ len ];
13554 var text = args[0];
13555 var title = args[1];
13556 var callbackOk = args[2];
13557 var callbackCancel = args[3];
13558 var defaultValue = args[4];
13559 if (typeof args[1] === 'function') {
13560 (assign = args, text = assign[0], callbackOk = assign[1], callbackCancel = assign[2], defaultValue = assign[3], title = assign[4]);
13561 }
13562 defaultValue = typeof defaultValue === 'undefined' || defaultValue === null ? '' : defaultValue;
13563 return new Dialog(app, {
13564 title: typeof title === 'undefined' ? defaultDialogTitle() : title,
13565 text: text,
13566 content: ("<div class=\"dialog-input-field input\"><input type=\"text\" class=\"dialog-input\" value=\"" + defaultValue + "\"></div>"),
13567 buttons: [
13568 {
13569 text: app.params.dialog.buttonCancel,
13570 keyCodes: keyboardActions ? [27] : null,
5d51ea26 13571 color: app.theme === 'aurora' ? 'gray' : null,
5309fbda
DC
13572 },
13573 {
13574 text: app.params.dialog.buttonOk,
13575 bold: true,
13576 keyCodes: keyboardActions ? [13] : null,
13577 } ],
13578 onClick: function onClick(dialog, index) {
13579 var inputValue = dialog.$el.find('.dialog-input').val();
13580 if (index === 0 && callbackCancel) { callbackCancel(inputValue); }
13581 if (index === 1 && callbackOk) { callbackOk(inputValue); }
13582 },
13583 destroyOnClose: destroyOnClose,
13584 }).open();
13585 },
13586 confirm: function confirm() {
13587 var assign;
13588
13589 var args = [], len = arguments.length;
13590 while ( len-- ) args[ len ] = arguments[ len ];
13591 var text = args[0];
13592 var title = args[1];
13593 var callbackOk = args[2];
13594 var callbackCancel = args[3];
13595 if (typeof args[1] === 'function') {
13596 (assign = args, text = assign[0], callbackOk = assign[1], callbackCancel = assign[2], title = assign[3]);
13597 }
13598 return new Dialog(app, {
13599 title: typeof title === 'undefined' ? defaultDialogTitle() : title,
13600 text: text,
13601 buttons: [
13602 {
13603 text: app.params.dialog.buttonCancel,
13604 onClick: callbackCancel,
13605 keyCodes: keyboardActions ? [27] : null,
5d51ea26 13606 color: app.theme === 'aurora' ? 'gray' : null,
5309fbda
DC
13607 },
13608 {
13609 text: app.params.dialog.buttonOk,
13610 bold: true,
13611 onClick: callbackOk,
13612 keyCodes: keyboardActions ? [13] : null,
13613 } ],
13614 destroyOnClose: destroyOnClose,
13615 }).open();
13616 },
13617 login: function login() {
13618 var assign;
13619
13620 var args = [], len = arguments.length;
13621 while ( len-- ) args[ len ] = arguments[ len ];
13622 var text = args[0];
13623 var title = args[1];
13624 var callbackOk = args[2];
13625 var callbackCancel = args[3];
13626 if (typeof args[1] === 'function') {
13627 (assign = args, text = assign[0], callbackOk = assign[1], callbackCancel = assign[2], title = assign[3]);
13628 }
13629 return new Dialog(app, {
13630 title: typeof title === 'undefined' ? defaultDialogTitle() : title,
13631 text: text,
13632 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>"),
13633 buttons: [
13634 {
13635 text: app.params.dialog.buttonCancel,
13636 keyCodes: keyboardActions ? [27] : null,
5d51ea26 13637 color: app.theme === 'aurora' ? 'gray' : null,
5309fbda
DC
13638 },
13639 {
13640 text: app.params.dialog.buttonOk,
13641 bold: true,
13642 keyCodes: keyboardActions ? [13] : null,
13643 } ],
13644 onClick: function onClick(dialog, index) {
13645 var username = dialog.$el.find('[name="dialog-username"]').val();
13646 var password = dialog.$el.find('[name="dialog-password"]').val();
13647 if (index === 0 && callbackCancel) { callbackCancel(username, password); }
13648 if (index === 1 && callbackOk) { callbackOk(username, password); }
13649 },
13650 destroyOnClose: destroyOnClose,
13651 }).open();
13652 },
13653 password: function password() {
13654 var assign;
13655
13656 var args = [], len = arguments.length;
13657 while ( len-- ) args[ len ] = arguments[ len ];
13658 var text = args[0];
13659 var title = args[1];
13660 var callbackOk = args[2];
13661 var callbackCancel = args[3];
13662 if (typeof args[1] === 'function') {
13663 (assign = args, text = assign[0], callbackOk = assign[1], callbackCancel = assign[2], title = assign[3]);
13664 }
13665 return new Dialog(app, {
13666 title: typeof title === 'undefined' ? defaultDialogTitle() : title,
13667 text: text,
13668 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>"),
13669 buttons: [
13670 {
13671 text: app.params.dialog.buttonCancel,
13672 keyCodes: keyboardActions ? [27] : null,
5d51ea26 13673 color: app.theme === 'aurora' ? 'gray' : null,
5309fbda
DC
13674 },
13675 {
13676 text: app.params.dialog.buttonOk,
13677 bold: true,
13678 keyCodes: keyboardActions ? [13] : null,
13679 } ],
13680 onClick: function onClick(dialog, index) {
13681 var password = dialog.$el.find('[name="dialog-password"]').val();
13682 if (index === 0 && callbackCancel) { callbackCancel(password); }
13683 if (index === 1 && callbackOk) { callbackOk(password); }
13684 },
13685 destroyOnClose: destroyOnClose,
13686 }).open();
13687 },
13688 preloader: function preloader(title, color) {
13689 var preloaderInner = Utils[((app.theme) + "PreloaderContent")] || '';
13690 return new Dialog(app, {
13691 title: typeof title === 'undefined' || title === null ? app.params.dialog.preloaderTitle : title,
13692 content: ("<div class=\"preloader" + (color ? (" color-" + color) : '') + "\">" + preloaderInner + "</div>"),
13693 cssClass: 'dialog-preloader',
13694 destroyOnClose: destroyOnClose,
13695 }).open();
13696 },
13697 progress: function progress() {
13698 var assign, assign$1, assign$2;
13699
13700 var args = [], len = arguments.length;
13701 while ( len-- ) args[ len ] = arguments[ len ];
13702 var title = args[0];
13703 var progress = args[1];
13704 var color = args[2];
13705 if (args.length === 2) {
13706 if (typeof args[0] === 'number') {
13707 (assign = args, progress = assign[0], color = assign[1], title = assign[2]);
13708 } else if (typeof args[0] === 'string' && typeof args[1] === 'string') {
13709 (assign$1 = args, title = assign$1[0], color = assign$1[1], progress = assign$1[2]);
13710 }
13711 } else if (args.length === 1) {
13712 if (typeof args[0] === 'number') {
13713 (assign$2 = args, progress = assign$2[0], title = assign$2[1], color = assign$2[2]);
13714 }
13715 }
13716 var infinite = typeof progress === 'undefined';
13717 var dialog = new Dialog(app, {
13718 title: typeof title === 'undefined' ? app.params.dialog.progressTitle : title,
13719 cssClass: 'dialog-progress',
13720 content: ("\n <div class=\"progressbar" + (infinite ? '-infinite' : '') + (color ? (" color-" + color) : '') + "\">\n " + (!infinite ? '<span></span>' : '') + "\n </div>\n "),
13721 destroyOnClose: destroyOnClose,
13722 });
13723 if (!infinite) { dialog.setProgress(progress); }
13724 return dialog.open();
13725 },
13726 }
13727 );
13728 },
13729 };
13730
5d51ea26 13731 var Popup = /*@__PURE__*/(function (Modal) {
5309fbda
DC
13732 function Popup(app, params) {
13733 var extendedParams = Utils.extend(
13734 { on: {} },
13735 app.params.popup,
13736 params
13737 );
13738
13739 // Extends with open/close Modal methods;
5d51ea26 13740 Modal.call(this, app, extendedParams);
5309fbda
DC
13741
13742 var popup = this;
13743
13744 popup.params = extendedParams;
13745
13746 // Find Element
13747 var $el;
13748 if (!popup.params.el) {
5d51ea26 13749 $el = $(popup.params.content).filter(function (elIndex, node) { return node.nodeType === 1; }).eq(0);
5309fbda 13750 } else {
5d51ea26 13751 $el = $(popup.params.el).eq(0);
5309fbda
DC
13752 }
13753
13754 if ($el && $el.length > 0 && $el[0].f7Modal) {
13755 return $el[0].f7Modal;
13756 }
13757
13758 if ($el.length === 0) {
13759 return popup.destroy();
13760 }
13761
13762 var $backdropEl;
5d51ea26
DC
13763 if (popup.params.backdrop && popup.params.backdropEl) {
13764 $backdropEl = $(popup.params.backdropEl);
13765 } else if (popup.params.backdrop) {
5309fbda
DC
13766 $backdropEl = app.root.children('.popup-backdrop');
13767 if ($backdropEl.length === 0) {
13768 $backdropEl = $('<div class="popup-backdrop"></div>');
13769 app.root.append($backdropEl);
13770 }
13771 }
13772
13773 Utils.extend(popup, {
13774 app: app,
13775 $el: $el,
13776 el: $el[0],
13777 $backdropEl: $backdropEl,
13778 backdropEl: $backdropEl && $backdropEl[0],
13779 type: 'popup',
13780 });
13781
13782 function handleClick(e) {
13783 var target = e.target;
13784 var $target = $(target);
5d51ea26
DC
13785 var keyboardOpened = !app.device.desktop && app.device.cordova && ((window.Keyboard && window.Keyboard.isVisible) || (window.cordova.plugins && window.cordova.plugins.Keyboard && window.cordova.plugins.Keyboard.isVisible));
13786 if (keyboardOpened) { return; }
5309fbda
DC
13787 if ($target.closest(popup.el).length === 0) {
13788 if (
13789 popup.params
13790 && popup.params.closeByBackdropClick
13791 && popup.params.backdrop
13792 && popup.backdropEl
13793 && popup.backdropEl === target
13794 ) {
13795 var needToClose = true;
13796 popup.$el.nextAll('.popup.modal-in').each(function (index, popupEl) {
13797 var popupInstance = popupEl.f7Modal;
13798 if (!popupInstance) { return; }
13799 if (
13800 popupInstance.params.closeByBackdropClick
13801 && popupInstance.params.backdrop
13802 && popupInstance.backdropEl === popup.backdropEl
13803 ) {
13804 needToClose = false;
13805 }
13806 });
13807 if (needToClose) {
13808 popup.close();
13809 }
13810 }
13811 }
13812 }
13813
5d51ea26
DC
13814 function onKeyDown(e) {
13815 var keyCode = e.keyCode;
13816 if (keyCode === 27 && popup.params.closeOnEscape) {
13817 popup.close();
13818 }
13819 }
13820 if (popup.params.closeOnEscape) {
13821 popup.on('popupOpen', function () {
13822 $(document).on('keydown', onKeyDown);
13823 });
13824 popup.on('popupClose', function () {
13825 $(document).off('keydown', onKeyDown);
13826 });
13827 }
13828
5309fbda 13829 popup.on('popupOpened', function () {
5d51ea26 13830 $el.removeClass('swipe-close-to-bottom swipe-close-to-top');
5309fbda
DC
13831 if (popup.params.closeByBackdropClick) {
13832 app.on('click', handleClick);
13833 }
13834 });
13835 popup.on('popupClose', function () {
13836 if (popup.params.closeByBackdropClick) {
13837 app.off('click', handleClick);
13838 }
13839 });
13840
5d51ea26
DC
13841 var allowSwipeToClose = true;
13842 var isTouched = false;
13843 var startTouch;
13844 var currentTouch;
13845 var isScrolling;
13846 var touchStartTime;
13847 var touchesDiff;
13848 var isMoved = false;
13849 var pageContentEl;
13850 var pageContentScrollTop;
13851 var pageContentOffsetHeight;
13852 var pageContentScrollHeight;
13853
13854 function handleTouchStart(e) {
13855 if (isTouched || !allowSwipeToClose || !popup.params.swipeToClose) { return; }
13856 if (popup.params.swipeHandler && $(e.target).closest(popup.params.swipeHandler).length === 0) {
13857 return;
13858 }
13859 isTouched = true;
13860 isMoved = false;
13861 startTouch = {
13862 x: e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX,
13863 y: e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY,
13864 };
13865 touchStartTime = Utils.now();
13866 isScrolling = undefined;
13867 if (!popup.params.swipeHandler && e.type === 'touchstart') {
13868 pageContentEl = $(e.target).closest('.page-content')[0];
13869 }
13870 }
13871 function handleTouchMove(e) {
13872 if (!isTouched) { return; }
13873 currentTouch = {
13874 x: e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX,
13875 y: e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY,
13876 };
13877
13878 if (typeof isScrolling === 'undefined') {
13879 isScrolling = !!(isScrolling || Math.abs(currentTouch.x - startTouch.x) > Math.abs(currentTouch.y - startTouch.y));
13880 }
13881 if (isScrolling) {
13882 isTouched = false;
13883 isMoved = false;
13884 return;
13885 }
13886
13887 touchesDiff = startTouch.y - currentTouch.y;
13888 var direction = touchesDiff < 0 ? 'to-bottom' : 'to-top';
13889 $el.transition(0);
13890
13891 if (typeof popup.params.swipeToClose === 'string' && direction !== popup.params.swipeToClose) {
13892 $el.transform('');
13893 return;
13894 }
13895
13896 if (!isMoved) {
13897 if (pageContentEl) {
13898 pageContentScrollTop = pageContentEl.scrollTop;
13899 pageContentScrollHeight = pageContentEl.scrollHeight;
13900 pageContentOffsetHeight = pageContentEl.offsetHeight;
13901 if (
13902 !(pageContentScrollHeight === pageContentOffsetHeight)
13903 && !(direction === 'to-bottom' && pageContentScrollTop === 0)
13904 && !(direction === 'to-top' && pageContentScrollTop === (pageContentScrollHeight - pageContentOffsetHeight))
13905 ) {
13906 $el.transform('');
13907 isTouched = false;
13908 isMoved = false;
13909 return;
13910 }
13911 }
13912 isMoved = true;
13913 }
13914 e.preventDefault();
13915 $el.transition(0).transform(("translate3d(0," + (-touchesDiff) + "px,0)"));
13916 }
13917 function handleTouchEnd() {
13918 isTouched = false;
13919 if (!isMoved) {
13920 return;
13921 }
13922 isMoved = false;
13923 allowSwipeToClose = false;
13924 $el.transition('');
13925 var direction = touchesDiff < 0 ? 'to-bottom' : 'to-top';
13926 if ((typeof popup.params.swipeToClose === 'string' && direction !== popup.params.swipeToClose)) {
13927 $el.transform('');
13928 allowSwipeToClose = true;
13929 return;
13930 }
13931 var diff = Math.abs(touchesDiff);
13932 var timeDiff = (new Date()).getTime() - touchStartTime;
13933 if ((timeDiff < 300 && diff > 20) || (timeDiff >= 300 && diff > 100)) {
13934 Utils.nextTick(function () {
13935 if (direction === 'to-bottom') {
13936 $el.addClass('swipe-close-to-bottom');
13937 } else {
13938 $el.addClass('swipe-close-to-top');
13939 }
13940 $el.transform('');
13941 popup.close();
13942 allowSwipeToClose = true;
13943 });
13944 return;
13945 }
13946 allowSwipeToClose = true;
13947 $el.transform('');
13948 }
13949
13950 var passive = Support.passiveListener ? { passive: true } : false;
13951 if (popup.params.swipeToClose) {
13952 $el.on(app.touchEvents.start, handleTouchStart, passive);
13953 app.on('touchmove', handleTouchMove);
13954 app.on('touchend:passive', handleTouchEnd);
13955 popup.once('popupDestroy', function () {
13956 $el.off(app.touchEvents.start, handleTouchStart, passive);
13957 app.off('touchmove', handleTouchMove);
13958 app.off('touchend:passive', handleTouchEnd);
13959 });
13960 }
13961
5309fbda
DC
13962 $el[0].f7Modal = popup;
13963
13964 return popup;
13965 }
13966
5d51ea26
DC
13967 if ( Modal ) Popup.__proto__ = Modal;
13968 Popup.prototype = Object.create( Modal && Modal.prototype );
5309fbda
DC
13969 Popup.prototype.constructor = Popup;
13970
13971 return Popup;
13972 }(Modal));
13973
13974 var Popup$1 = {
13975 name: 'popup',
13976 params: {
13977 popup: {
13978 backdrop: true,
5d51ea26 13979 backdropEl: undefined,
5309fbda 13980 closeByBackdropClick: true,
5d51ea26
DC
13981 closeOnEscape: false,
13982 swipeToClose: false,
13983 swipeHandler: null,
5309fbda
DC
13984 },
13985 },
13986 static: {
13987 Popup: Popup,
13988 },
13989 create: function create() {
13990 var app = this;
13991 app.popup = ModalMethods({
13992 app: app,
13993 constructor: Popup,
13994 defaultSelector: '.popup.modal-in',
13995 });
13996 },
13997 clicks: {
13998 '.popup-open': function openPopup($clickedEl, data) {
13999 if ( data === void 0 ) data = {};
14000
14001 var app = this;
14002 app.popup.open(data.popup, data.animate);
14003 },
14004 '.popup-close': function closePopup($clickedEl, data) {
14005 if ( data === void 0 ) data = {};
14006
14007 var app = this;
14008 app.popup.close(data.popup, data.animate);
14009 },
14010 },
14011 };
14012
5d51ea26 14013 var LoginScreen = /*@__PURE__*/(function (Modal) {
5309fbda
DC
14014 function LoginScreen(app, params) {
14015 var extendedParams = Utils.extend({
14016 on: {},
14017 }, params);
14018
14019 // Extends with open/close Modal methods;
5d51ea26 14020 Modal.call(this, app, extendedParams);
5309fbda
DC
14021
14022 var loginScreen = this;
14023
14024 loginScreen.params = extendedParams;
14025
14026 // Find Element
14027 var $el;
14028 if (!loginScreen.params.el) {
5d51ea26 14029 $el = $(loginScreen.params.content).filter(function (elIndex, node) { return node.nodeType === 1; }).eq(0);
5309fbda 14030 } else {
5d51ea26 14031 $el = $(loginScreen.params.el).eq(0);
5309fbda
DC
14032 }
14033
14034 if ($el && $el.length > 0 && $el[0].f7Modal) {
14035 return $el[0].f7Modal;
14036 }
14037
14038 if ($el.length === 0) {
14039 return loginScreen.destroy();
14040 }
14041
14042 Utils.extend(loginScreen, {
14043 app: app,
14044 $el: $el,
14045 el: $el[0],
14046 type: 'loginScreen',
14047 });
14048
14049 $el[0].f7Modal = loginScreen;
14050
14051 return loginScreen;
14052 }
14053
5d51ea26
DC
14054 if ( Modal ) LoginScreen.__proto__ = Modal;
14055 LoginScreen.prototype = Object.create( Modal && Modal.prototype );
5309fbda
DC
14056 LoginScreen.prototype.constructor = LoginScreen;
14057
14058 return LoginScreen;
14059 }(Modal));
14060
14061 var LoginScreen$1 = {
14062 name: 'loginScreen',
14063 static: {
14064 LoginScreen: LoginScreen,
14065 },
14066 create: function create() {
14067 var app = this;
14068 app.loginScreen = ModalMethods({
14069 app: app,
14070 constructor: LoginScreen,
14071 defaultSelector: '.login-screen.modal-in',
14072 });
14073 },
14074 clicks: {
14075 '.login-screen-open': function openLoginScreen($clickedEl, data) {
14076 if ( data === void 0 ) data = {};
14077
14078 var app = this;
14079 app.loginScreen.open(data.loginScreen, data.animate);
14080 },
14081 '.login-screen-close': function closeLoginScreen($clickedEl, data) {
14082 if ( data === void 0 ) data = {};
14083
14084 var app = this;
14085 app.loginScreen.close(data.loginScreen, data.animate);
14086 },
14087 },
14088 };
14089
5d51ea26 14090 var Popover = /*@__PURE__*/(function (Modal) {
5309fbda
DC
14091 function Popover(app, params) {
14092 var extendedParams = Utils.extend(
14093 { on: {} },
14094 app.params.popover,
14095 params
14096 );
14097
14098 // Extends with open/close Modal methods;
5d51ea26 14099 Modal.call(this, app, extendedParams);
5309fbda
DC
14100
14101 var popover = this;
14102
14103 popover.params = extendedParams;
14104
14105 // Find Element
14106 var $el;
14107 if (!popover.params.el) {
5d51ea26 14108 $el = $(popover.params.content).filter(function (elIndex, node) { return node.nodeType === 1; }).eq(0);
5309fbda 14109 } else {
5d51ea26 14110 $el = $(popover.params.el).eq(0);
5309fbda
DC
14111 }
14112
14113 if ($el && $el.length > 0 && $el[0].f7Modal) {
14114 return $el[0].f7Modal;
14115 }
14116
14117 // Find Target
14118 var $targetEl = $(popover.params.targetEl).eq(0);
14119
14120 if ($el.length === 0) {
14121 return popover.destroy();
14122 }
14123
14124 // Backdrop
14125 var $backdropEl;
5d51ea26
DC
14126 if (popover.params.backdrop && popover.params.backdropEl) {
14127 $backdropEl = $(popover.params.backdropEl);
14128 } else if (popover.params.backdrop) {
5309fbda
DC
14129 $backdropEl = app.root.children('.popover-backdrop');
14130 if ($backdropEl.length === 0) {
14131 $backdropEl = $('<div class="popover-backdrop"></div>');
14132 app.root.append($backdropEl);
14133 }
14134 }
14135
14136 // Find Angle
14137 var $angleEl;
14138 if ($el.find('.popover-angle').length === 0) {
14139 $angleEl = $('<div class="popover-angle"></div>');
14140 $el.prepend($angleEl);
14141 } else {
14142 $angleEl = $el.find('.popover-angle');
14143 }
14144
14145 // Open
14146 var originalOpen = popover.open;
14147
14148 Utils.extend(popover, {
14149 app: app,
14150 $el: $el,
14151 el: $el[0],
14152 $targetEl: $targetEl,
14153 targetEl: $targetEl[0],
14154 $angleEl: $angleEl,
14155 angleEl: $angleEl[0],
14156 $backdropEl: $backdropEl,
14157 backdropEl: $backdropEl && $backdropEl[0],
14158 type: 'popover',
14159 open: function open() {
14160 var assign;
14161
14162 var args = [], len = arguments.length;
14163 while ( len-- ) args[ len ] = arguments[ len ];
14164 var targetEl = args[0];
14165 var animate = args[1];
14166 if (typeof args[0] === 'boolean') { (assign = args, animate = assign[0], targetEl = assign[1]); }
14167 if (targetEl) {
14168 popover.$targetEl = $(targetEl);
14169 popover.targetEl = popover.$targetEl[0];
14170 }
14171 return originalOpen.call(popover, animate);
14172 },
14173 });
14174
14175 function handleResize() {
14176 popover.resize();
14177 }
14178 popover.on('popoverOpen', function () {
14179 popover.resize();
14180 app.on('resize', handleResize);
5d51ea26 14181 $(window).on('keyboardDidShow keyboardDidHide', handleResize);
5309fbda
DC
14182 popover.on('popoverClose popoverBeforeDestroy', function () {
14183 app.off('resize', handleResize);
5d51ea26 14184 $(window).off('keyboardDidShow keyboardDidHide', handleResize);
5309fbda
DC
14185 });
14186 });
14187
14188 function handleClick(e) {
14189 var target = e.target;
14190 var $target = $(target);
5d51ea26
DC
14191 var keyboardOpened = !app.device.desktop && app.device.cordova && ((window.Keyboard && window.Keyboard.isVisible) || (window.cordova.plugins && window.cordova.plugins.Keyboard && window.cordova.plugins.Keyboard.isVisible));
14192 if (keyboardOpened) { return; }
5309fbda
DC
14193 if ($target.closest(popover.el).length === 0) {
14194 if (
14195 popover.params.closeByBackdropClick
14196 && popover.params.backdrop
14197 && popover.backdropEl
14198 && popover.backdropEl === target
14199 ) {
14200 popover.close();
14201 } else if (popover.params.closeByOutsideClick) {
14202 popover.close();
14203 }
14204 }
14205 }
14206
5d51ea26
DC
14207 function onKeyDown(e) {
14208 var keyCode = e.keyCode;
14209 if (keyCode === 27 && popover.params.closeOnEscape) {
14210 popover.close();
14211 }
14212 }
14213
14214 if (popover.params.closeOnEscape) {
14215 popover.on('popoverOpen', function () {
14216 $(document).on('keydown', onKeyDown);
14217 });
14218 popover.on('popoverClose', function () {
14219 $(document).off('keydown', onKeyDown);
14220 });
14221 }
14222
5309fbda
DC
14223 popover.on('popoverOpened', function () {
14224 if (popover.params.closeByOutsideClick || popover.params.closeByBackdropClick) {
14225 app.on('click', handleClick);
14226 }
14227 });
14228 popover.on('popoverClose', function () {
14229 if (popover.params.closeByOutsideClick || popover.params.closeByBackdropClick) {
14230 app.off('click', handleClick);
14231 }
14232 });
14233
14234 $el[0].f7Modal = popover;
14235
14236 return popover;
14237 }
14238
5d51ea26
DC
14239 if ( Modal ) Popover.__proto__ = Modal;
14240 Popover.prototype = Object.create( Modal && Modal.prototype );
5309fbda
DC
14241 Popover.prototype.constructor = Popover;
14242
14243 Popover.prototype.resize = function resize () {
14244 var popover = this;
14245 var app = popover.app;
14246 var $el = popover.$el;
14247 var $targetEl = popover.$targetEl;
14248 var $angleEl = popover.$angleEl;
14249 var ref = popover.params;
14250 var targetX = ref.targetX;
14251 var targetY = ref.targetY;
14252 $el.css({ left: '', top: '' });
14253 var ref$1 = [$el.width(), $el.height()];
14254 var width = ref$1[0];
14255 var height = ref$1[1];
14256 var angleSize = 0;
14257 var angleLeft;
14258 var angleTop;
5d51ea26 14259 if (app.theme === 'ios' || app.theme === 'aurora') {
5309fbda
DC
14260 $angleEl.removeClass('on-left on-right on-top on-bottom').css({ left: '', top: '' });
14261 angleSize = $angleEl.width() / 2;
14262 } else {
5d51ea26 14263 $el.removeClass('popover-on-left popover-on-right popover-on-top popover-on-bottom popover-on-middle').css({ left: '', top: '' });
5309fbda
DC
14264 }
14265
14266 var targetWidth;
14267 var targetHeight;
14268 var targetOffsetLeft;
14269 var targetOffsetTop;
14270 if ($targetEl && $targetEl.length > 0) {
14271 targetWidth = $targetEl.outerWidth();
14272 targetHeight = $targetEl.outerHeight();
14273
14274 var targetOffset = $targetEl.offset();
14275 targetOffsetLeft = targetOffset.left - app.left;
14276 targetOffsetTop = targetOffset.top - app.top;
14277
14278 var targetParentPage = $targetEl.parents('.page');
14279 if (targetParentPage.length > 0) {
14280 targetOffsetTop -= targetParentPage[0].scrollTop;
14281 }
14282 } else if (typeof targetX !== 'undefined' && targetY !== 'undefined') {
14283 targetOffsetLeft = targetX;
14284 targetOffsetTop = targetY;
14285 targetWidth = popover.params.targetWidth || 0;
14286 targetHeight = popover.params.targetHeight || 0;
14287 }
14288
14289 var ref$2 = [0, 0, 0];
14290 var left = ref$2[0];
14291 var top = ref$2[1];
14292 var diff = ref$2[2];
14293 // Top Position
14294 var position = app.theme === 'md' ? 'bottom' : 'top';
14295 if (app.theme === 'md') {
14296 if (height < app.height - targetOffsetTop - targetHeight) {
14297 // On bottom
14298 position = 'bottom';
5d51ea26 14299 top = targetOffsetTop + targetHeight;
5309fbda
DC
14300 } else if (height < targetOffsetTop) {
14301 // On top
5d51ea26 14302 top = targetOffsetTop - height;
5309fbda
DC
14303 position = 'top';
14304 } else {
14305 // On middle
5d51ea26
DC
14306 position = 'middle';
14307 top = ((targetHeight / 2) + targetOffsetTop) - (height / 2);
5309fbda 14308 }
5d51ea26 14309 top = Math.max(8, Math.min(top, app.height - height - 8));
5309fbda
DC
14310
14311 // Horizontal Position
5d51ea26
DC
14312 var hPosition;
14313 if (targetOffsetLeft < app.width / 2) {
14314 hPosition = 'right';
14315 left = position === 'middle'
14316 ? targetOffsetLeft + targetWidth
14317 : targetOffsetLeft;
14318 } else {
14319 hPosition = 'left';
14320 left = position === 'middle'
14321 ? targetOffsetLeft - width
14322 : (targetOffsetLeft + targetWidth) - width;
5309fbda 14323 }
5d51ea26
DC
14324 left = Math.max(8, Math.min(left, app.width - width - 8));
14325 $el.addClass(("popover-on-" + position + " popover-on-" + hPosition));
5309fbda 14326 } else {
5d51ea26 14327 // ios and aurora
5309fbda
DC
14328 if ((height + angleSize) < targetOffsetTop) {
14329 // On top
14330 top = targetOffsetTop - height - angleSize;
14331 } else if ((height + angleSize) < app.height - targetOffsetTop - targetHeight) {
14332 // On bottom
14333 position = 'bottom';
14334 top = targetOffsetTop + targetHeight + angleSize;
14335 } else {
14336 // On middle
14337 position = 'middle';
14338 top = ((targetHeight / 2) + targetOffsetTop) - (height / 2);
14339 diff = top;
5d51ea26 14340 top = Math.max(5, Math.min(top, app.height - height - 5));
5309fbda
DC
14341 diff -= top;
14342 }
14343
14344 // Horizontal Position
14345 if (position === 'top' || position === 'bottom') {
14346 left = ((targetWidth / 2) + targetOffsetLeft) - (width / 2);
14347 diff = left;
5d51ea26 14348 left = Math.max(5, Math.min(left, app.width - width - 5));
5309fbda
DC
14349 if (position === 'top') {
14350 $angleEl.addClass('on-bottom');
14351 }
14352 if (position === 'bottom') {
14353 $angleEl.addClass('on-top');
14354 }
14355 diff -= left;
14356 angleLeft = ((width / 2) - angleSize) + diff;
14357 angleLeft = Math.max(Math.min(angleLeft, width - (angleSize * 2) - 13), 13);
14358 $angleEl.css({ left: (angleLeft + "px") });
14359 } else if (position === 'middle') {
14360 left = targetOffsetLeft - width - angleSize;
14361 $angleEl.addClass('on-right');
14362 if (left < 5 || (left + width > app.width)) {
14363 if (left < 5) { left = targetOffsetLeft + targetWidth + angleSize; }
14364 if (left + width > app.width) { left = app.width - width - 5; }
14365 $angleEl.removeClass('on-right').addClass('on-left');
14366 }
14367 angleTop = ((height / 2) - angleSize) + diff;
14368 angleTop = Math.max(Math.min(angleTop, height - (angleSize * 2) - 13), 13);
14369 $angleEl.css({ top: (angleTop + "px") });
14370 }
14371 }
14372
14373 // Apply Styles
14374 $el.css({ top: (top + "px"), left: (left + "px") });
14375 };
14376
14377 return Popover;
14378 }(Modal));
14379
14380 var Popover$1 = {
14381 name: 'popover',
14382 params: {
14383 popover: {
5d51ea26
DC
14384 backdrop: true,
14385 backdropEl: undefined,
5309fbda
DC
14386 closeByBackdropClick: true,
14387 closeByOutsideClick: true,
5d51ea26 14388 closeOnEscape: false,
5309fbda
DC
14389 },
14390 },
14391 static: {
14392 Popover: Popover,
14393 },
14394 create: function create() {
14395 var app = this;
14396 app.popover = Utils.extend(
14397 ModalMethods({
14398 app: app,
14399 constructor: Popover,
14400 defaultSelector: '.popover.modal-in',
14401 }),
14402 {
14403 open: function open(popoverEl, targetEl, animate) {
14404 var $popoverEl = $(popoverEl);
14405 var popover = $popoverEl[0].f7Modal;
14406 if (!popover) { popover = new Popover(app, { el: $popoverEl, targetEl: targetEl }); }
14407 return popover.open(targetEl, animate);
14408 },
14409 }
14410 );
14411 },
14412 clicks: {
14413 '.popover-open': function openPopover($clickedEl, data) {
14414 if ( data === void 0 ) data = {};
14415
14416 var app = this;
14417 app.popover.open(data.popover, $clickedEl, data.animate);
14418 },
14419 '.popover-close': function closePopover($clickedEl, data) {
14420 if ( data === void 0 ) data = {};
14421
14422 var app = this;
14423 app.popover.close(data.popover, data.animate);
14424 },
14425 },
14426 };
14427
14428 /* eslint indent: ["off"] */
14429
5d51ea26 14430 var Actions = /*@__PURE__*/(function (Modal) {
5309fbda
DC
14431 function Actions(app, params) {
14432 var extendedParams = Utils.extend(
14433 { on: {} },
14434 app.params.actions,
14435 params
14436 );
14437
14438 // Extends with open/close Modal methods;
5d51ea26 14439 Modal.call(this, app, extendedParams);
5309fbda
DC
14440
14441 var actions = this;
14442
14443 actions.params = extendedParams;
14444
14445 // Buttons
14446 var groups;
14447 if (actions.params.buttons) {
14448 groups = actions.params.buttons;
14449 if (!Array.isArray(groups[0])) { groups = [groups]; }
14450 }
14451 actions.groups = groups;
14452
14453 // Find Element
14454 var $el;
14455 if (actions.params.el) {
5d51ea26 14456 $el = $(actions.params.el).eq(0);
5309fbda 14457 } else if (actions.params.content) {
5d51ea26 14458 $el = $(actions.params.content).filter(function (elIndex, node) { return node.nodeType === 1; }).eq(0);
5309fbda
DC
14459 } else if (actions.params.buttons) {
14460 if (actions.params.convertToPopover) {
14461 actions.popoverHtml = actions.renderPopover();
14462 }
14463 actions.actionsHtml = actions.render();
14464 }
14465
14466 if ($el && $el.length > 0 && $el[0].f7Modal) {
14467 return $el[0].f7Modal;
14468 }
14469
14470 if ($el && $el.length === 0 && !(actions.actionsHtml || actions.popoverHtml)) {
14471 return actions.destroy();
14472 }
14473
14474 // Backdrop
14475 var $backdropEl;
5d51ea26
DC
14476 if (actions.params.backdrop && actions.params.backdropEl) {
14477 $backdropEl = $(actions.params.backdropEl);
14478 } else if (actions.params.backdrop) {
5309fbda
DC
14479 $backdropEl = app.root.children('.actions-backdrop');
14480 if ($backdropEl.length === 0) {
14481 $backdropEl = $('<div class="actions-backdrop"></div>');
14482 app.root.append($backdropEl);
14483 }
14484 }
14485
14486 var originalOpen = actions.open;
14487 var originalClose = actions.close;
14488
14489 var popover;
14490 function buttonOnClick(e) {
5d51ea26 14491 var $buttonEl = $(this);
5309fbda
DC
14492 var buttonIndex;
14493 var groupIndex;
5d51ea26
DC
14494 if ($buttonEl.hasClass('list-button') || $buttonEl.hasClass('item-link')) {
14495 buttonIndex = $buttonEl.parents('li').index();
14496 groupIndex = $buttonEl.parents('.list').index();
5309fbda 14497 } else {
5d51ea26
DC
14498 buttonIndex = $buttonEl.index();
14499 groupIndex = $buttonEl.parents('.actions-group').index();
5309fbda
DC
14500 }
14501 if (typeof groups !== 'undefined') {
14502 var button = groups[groupIndex][buttonIndex];
14503 if (button.onClick) { button.onClick(actions, e); }
14504 if (actions.params.onClick) { actions.params.onClick(actions, e); }
14505 if (button.close !== false) { actions.close(); }
14506 }
14507 }
14508 actions.open = function open(animate) {
14509 var convertToPopover = false;
14510 var ref = actions.params;
14511 var targetEl = ref.targetEl;
14512 var targetX = ref.targetX;
14513 var targetY = ref.targetY;
14514 var targetWidth = ref.targetWidth;
14515 var targetHeight = ref.targetHeight;
14516 if (actions.params.convertToPopover && (targetEl || (targetX !== undefined && targetY !== undefined))) {
14517 // Popover
14518 if (
14519 actions.params.forceToPopover
14520 || (app.device.ios && app.device.ipad)
14521 || app.width >= 768
5d51ea26 14522 || (app.device.desktop && app.theme === 'aurora')
5309fbda
DC
14523 ) {
14524 convertToPopover = true;
14525 }
14526 }
14527 if (convertToPopover && actions.popoverHtml) {
14528 popover = app.popover.create({
14529 content: actions.popoverHtml,
14530 backdrop: actions.params.backdrop,
14531 targetEl: targetEl,
14532 targetX: targetX,
14533 targetY: targetY,
14534 targetWidth: targetWidth,
14535 targetHeight: targetHeight,
14536 });
14537 popover.open(animate);
14538 popover.once('popoverOpened', function () {
5d51ea26 14539 popover.$el.find('.list-button, .item-link').each(function (groupIndex, buttonEl) {
5309fbda
DC
14540 $(buttonEl).on('click', buttonOnClick);
14541 });
14542 });
14543 popover.once('popoverClosed', function () {
5d51ea26 14544 popover.$el.find('.list-button, .item-link').each(function (groupIndex, buttonEl) {
5309fbda
DC
14545 $(buttonEl).off('click', buttonOnClick);
14546 });
14547 Utils.nextTick(function () {
14548 popover.destroy();
14549 popover = undefined;
14550 });
14551 });
14552 } else {
14553 actions.$el = actions.actionsHtml ? $(actions.actionsHtml) : actions.$el;
14554 actions.$el[0].f7Modal = actions;
14555 if (actions.groups) {
14556 actions.$el.find('.actions-button').each(function (groupIndex, buttonEl) {
14557 $(buttonEl).on('click', buttonOnClick);
14558 });
14559 actions.once('actionsClosed', function () {
14560 actions.$el.find('.actions-button').each(function (groupIndex, buttonEl) {
14561 $(buttonEl).off('click', buttonOnClick);
14562 });
14563 });
14564 }
14565 actions.el = actions.$el[0];
14566 originalOpen.call(actions, animate);
14567 }
14568 return actions;
14569 };
14570
14571 actions.close = function close(animate) {
14572 if (popover) {
14573 popover.close(animate);
14574 } else {
14575 originalClose.call(actions, animate);
14576 }
14577 return actions;
14578 };
14579
14580 Utils.extend(actions, {
14581 app: app,
14582 $el: $el,
14583 el: $el ? $el[0] : undefined,
14584 $backdropEl: $backdropEl,
14585 backdropEl: $backdropEl && $backdropEl[0],
14586 type: 'actions',
14587 });
14588
14589 function handleClick(e) {
14590 var target = e.target;
14591 var $target = $(target);
5d51ea26
DC
14592 var keyboardOpened = !app.device.desktop && app.device.cordova && ((window.Keyboard && window.Keyboard.isVisible) || (window.cordova.plugins && window.cordova.plugins.Keyboard && window.cordova.plugins.Keyboard.isVisible));
14593 if (keyboardOpened) { return; }
5309fbda
DC
14594 if ($target.closest(actions.el).length === 0) {
14595 if (
14596 actions.params.closeByBackdropClick
14597 && actions.params.backdrop
14598 && actions.backdropEl
14599 && actions.backdropEl === target
14600 ) {
14601 actions.close();
14602 } else if (actions.params.closeByOutsideClick) {
14603 actions.close();
14604 }
14605 }
14606 }
14607
5d51ea26
DC
14608 function onKeyDown(e) {
14609 var keyCode = e.keyCode;
14610 if (keyCode === 27 && actions.params.closeOnEscape) {
14611 actions.close();
14612 }
14613 }
14614
14615 if (actions.params.closeOnEscape) {
14616 actions.on('open', function () {
14617 $(document).on('keydown', onKeyDown);
14618 });
14619 actions.on('close', function () {
14620 $(document).off('keydown', onKeyDown);
14621 });
14622 }
14623
5309fbda
DC
14624 actions.on('opened', function () {
14625 if (actions.params.closeByBackdropClick || actions.params.closeByOutsideClick) {
14626 app.on('click', handleClick);
14627 }
14628 });
14629 actions.on('close', function () {
14630 if (actions.params.closeByBackdropClick || actions.params.closeByOutsideClick) {
14631 app.off('click', handleClick);
14632 }
14633 });
14634
14635 if ($el) {
14636 $el[0].f7Modal = actions;
14637 }
14638
14639 return actions;
14640 }
14641
5d51ea26
DC
14642 if ( Modal ) Actions.__proto__ = Modal;
14643 Actions.prototype = Object.create( Modal && Modal.prototype );
5309fbda
DC
14644 Actions.prototype.constructor = Actions;
14645
14646 Actions.prototype.render = function render () {
14647 var actions = this;
14648 if (actions.params.render) { return actions.params.render.call(actions, actions); }
14649 var groups = actions.groups;
14650 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) {
14651 var buttonClasses = [("actions-" + (button.label ? 'label' : 'button'))];
14652 var color = button.color;
14653 var bg = button.bg;
14654 var bold = button.bold;
14655 var disabled = button.disabled;
14656 var label = button.label;
14657 var text = button.text;
14658 var icon = button.icon;
14659 if (color) { buttonClasses.push(("color-" + color)); }
14660 if (bg) { buttonClasses.push(("bg-color-" + bg)); }
14661 if (bold) { buttonClasses.push('actions-button-bold'); }
14662 if (disabled) { buttonClasses.push('disabled'); }
14663 if (label) {
14664 return ("<div class=\"" + (buttonClasses.join(' ')) + "\">" + text + "</div>");
14665 }
14666 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();
14667 }).join('')) + "\n </div>"); }).join('')) + "\n </div>\n ").trim();
14668 };
14669
14670 Actions.prototype.renderPopover = function renderPopover () {
14671 var actions = this;
14672 if (actions.params.renderPopover) { return actions.params.renderPopover.call(actions, actions); }
14673 var groups = actions.groups;
14674 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) {
14675 var itemClasses = [];
14676 var color = button.color;
14677 var bg = button.bg;
14678 var bold = button.bold;
14679 var disabled = button.disabled;
14680 var label = button.label;
14681 var text = button.text;
14682 var icon = button.icon;
14683 if (color) { itemClasses.push(("color-" + color)); }
14684 if (bg) { itemClasses.push(("bg-color-" + bg)); }
14685 if (bold) { itemClasses.push('popover-from-actions-bold'); }
14686 if (disabled) { itemClasses.push('disabled'); }
14687 if (label) {
14688 itemClasses.push('popover-from-actions-label');
14689 return ("<li class=\"" + (itemClasses.join(' ')) + "\">" + text + "</li>");
14690 }
14691 if (icon) {
14692 itemClasses.push('item-link item-content');
14693 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 ");
14694 }
14695 itemClasses.push('list-button');
5d51ea26 14696 return ("\n <li>\n <a class=\"" + (itemClasses.join(' ')) + "\">" + text + "</a>\n </li>\n ");
5309fbda
DC
14697 }).join('')) + "\n </ul>\n </div>\n "); }).join('')) + "\n </div>\n </div>\n ").trim();
14698 };
14699
14700 return Actions;
14701 }(Modal));
14702
14703 var Actions$1 = {
14704 name: 'actions',
14705 params: {
14706 actions: {
14707 convertToPopover: true,
14708 forceToPopover: false,
5d51ea26
DC
14709 backdrop: true,
14710 backdropEl: undefined,
5309fbda 14711 closeByBackdropClick: true,
5d51ea26 14712 closeOnEscape: false,
5309fbda
DC
14713 render: null,
14714 renderPopover: null,
5309fbda
DC
14715 },
14716 },
14717 static: {
14718 Actions: Actions,
14719 },
14720 create: function create() {
14721 var app = this;
14722 app.actions = ModalMethods({
14723 app: app,
14724 constructor: Actions,
14725 defaultSelector: '.actions-modal.modal-in',
14726 });
14727 },
14728 clicks: {
14729 '.actions-open': function openActions($clickedEl, data) {
14730 if ( data === void 0 ) data = {};
14731
14732 var app = this;
14733 app.actions.open(data.actions, data.animate);
14734 },
14735 '.actions-close': function closeActions($clickedEl, data) {
14736 if ( data === void 0 ) data = {};
14737
14738 var app = this;
14739 app.actions.close(data.actions, data.animate);
14740 },
14741 },
14742 };
14743
5d51ea26 14744 var Sheet = /*@__PURE__*/(function (Modal) {
5309fbda
DC
14745 function Sheet(app, params) {
14746 var extendedParams = Utils.extend(
14747 { on: {} },
14748 app.params.sheet,
14749 params
14750 );
14751
14752 // Extends with open/close Modal methods;
5d51ea26 14753 Modal.call(this, app, extendedParams);
5309fbda
DC
14754
14755 var sheet = this;
14756
14757 sheet.params = extendedParams;
5d51ea26
DC
14758 if (typeof sheet.params.backdrop === 'undefined') {
14759 sheet.params.backdrop = app.theme !== 'ios';
14760 }
5309fbda
DC
14761
14762 // Find Element
14763 var $el;
14764 if (!sheet.params.el) {
5d51ea26 14765 $el = $(sheet.params.content).filter(function (elIndex, node) { return node.nodeType === 1; }).eq(0);
5309fbda 14766 } else {
5d51ea26 14767 $el = $(sheet.params.el).eq(0);
5309fbda
DC
14768 }
14769
14770 if ($el && $el.length > 0 && $el[0].f7Modal) {
14771 return $el[0].f7Modal;
14772 }
14773
14774 if ($el.length === 0) {
14775 return sheet.destroy();
14776 }
14777 var $backdropEl;
5d51ea26
DC
14778
14779 if (sheet.params.backdrop && sheet.params.backdropEl) {
14780 $backdropEl = $(sheet.params.backdropEl);
14781 } else if (sheet.params.backdrop) {
5309fbda
DC
14782 $backdropEl = app.root.children('.sheet-backdrop');
14783 if ($backdropEl.length === 0) {
14784 $backdropEl = $('<div class="sheet-backdrop"></div>');
14785 app.root.append($backdropEl);
14786 }
14787 }
14788
5d51ea26
DC
14789 Utils.extend(sheet, {
14790 app: app,
14791 $el: $el,
14792 el: $el[0],
14793 $backdropEl: $backdropEl,
14794 backdropEl: $backdropEl && $backdropEl[0],
14795 type: 'sheet',
14796 });
14797
5309fbda 14798 var $pageContentEl;
5d51ea26 14799 function scrollToElementOnOpen() {
5309fbda
DC
14800 var $scrollEl = $(sheet.params.scrollToEl).eq(0);
14801 if ($scrollEl.length === 0) { return; }
14802 $pageContentEl = $scrollEl.parents('.page-content');
14803 if ($pageContentEl.length === 0) { return; }
14804
14805 var paddingTop = parseInt($pageContentEl.css('padding-top'), 10);
14806 var paddingBottom = parseInt($pageContentEl.css('padding-bottom'), 10);
14807 var pageHeight = $pageContentEl[0].offsetHeight - paddingTop - $el.height();
14808 var pageScrollHeight = $pageContentEl[0].scrollHeight - paddingTop - $el.height();
14809 var pageScroll = $pageContentEl.scrollTop();
14810
14811 var newPaddingBottom;
14812
14813 var scrollElTop = ($scrollEl.offset().top - paddingTop) + $scrollEl[0].offsetHeight;
14814 if (scrollElTop > pageHeight) {
14815 var scrollTop = (pageScroll + scrollElTop) - pageHeight;
14816 if (scrollTop + pageHeight > pageScrollHeight) {
14817 newPaddingBottom = ((scrollTop + pageHeight) - pageScrollHeight) + paddingBottom;
14818 if (pageHeight === pageScrollHeight) {
14819 newPaddingBottom = $el.height();
14820 }
14821 $pageContentEl.css({
14822 'padding-bottom': (newPaddingBottom + "px"),
14823 });
14824 }
14825 $pageContentEl.scrollTop(scrollTop, 300);
14826 }
14827 }
14828
5d51ea26 14829 function scrollToElementOnClose() {
5309fbda
DC
14830 if ($pageContentEl && $pageContentEl.length > 0) {
14831 $pageContentEl.css({
14832 'padding-bottom': '',
14833 });
14834 }
14835 }
14836 function handleClick(e) {
14837 var target = e.target;
14838 var $target = $(target);
5d51ea26
DC
14839 var keyboardOpened = !app.device.desktop && app.device.cordova && ((window.Keyboard && window.Keyboard.isVisible) || (window.cordova.plugins && window.cordova.plugins.Keyboard && window.cordova.plugins.Keyboard.isVisible));
14840 if (keyboardOpened) { return; }
5309fbda
DC
14841 if ($target.closest(sheet.el).length === 0) {
14842 if (
14843 sheet.params.closeByBackdropClick
14844 && sheet.params.backdrop
14845 && sheet.backdropEl
14846 && sheet.backdropEl === target
14847 ) {
14848 sheet.close();
14849 } else if (sheet.params.closeByOutsideClick) {
14850 sheet.close();
14851 }
14852 }
14853 }
14854
5d51ea26
DC
14855 function onKeyDown(e) {
14856 var keyCode = e.keyCode;
14857 if (keyCode === 27 && sheet.params.closeOnEscape) {
14858 sheet.close();
14859 }
14860 }
14861
14862
14863 var isTouched = false;
14864 var startTouch;
14865 var currentTouch;
14866 var isScrolling;
14867 var touchStartTime;
14868 var touchesDiff;
14869 var isMoved = false;
14870 var isTopSheetModal;
14871 var swipeStepTranslate;
14872 var startTranslate;
14873 var currentTranslate;
14874 var sheetElOffsetHeight;
14875 var minTranslate;
14876 var maxTranslate;
14877
14878 function handleTouchStart(e) {
14879 if (isTouched || !(sheet.params.swipeToClose || sheet.params.swipeToStep)) { return; }
14880 if (sheet.params.swipeHandler && $(e.target).closest(sheet.params.swipeHandler).length === 0) {
14881 return;
14882 }
14883 isTouched = true;
14884 isMoved = false;
14885 startTouch = {
14886 x: e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX,
14887 y: e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY,
14888 };
14889 touchStartTime = Utils.now();
14890 isScrolling = undefined;
14891 isTopSheetModal = $el.hasClass('sheet-modal-top');
14892 }
14893 function handleTouchMove(e) {
14894 if (!isTouched) { return; }
14895 currentTouch = {
14896 x: e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX,
14897 y: e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY,
14898 };
14899
14900 if (typeof isScrolling === 'undefined') {
14901 isScrolling = !!(isScrolling || Math.abs(currentTouch.x - startTouch.x) > Math.abs(currentTouch.y - startTouch.y));
14902 }
14903 if (isScrolling) {
14904 isTouched = false;
14905 isMoved = false;
14906 return;
14907 }
14908
14909 touchesDiff = startTouch.y - currentTouch.y;
14910 if (!isMoved) {
14911 sheetElOffsetHeight = $el[0].offsetHeight;
14912 startTranslate = Utils.getTranslate($el[0], 'y');
14913 if (isTopSheetModal) {
14914 minTranslate = sheet.params.swipeToClose ? -sheetElOffsetHeight : -swipeStepTranslate;
14915 maxTranslate = 0;
14916 } else {
14917 minTranslate = 0;
14918 maxTranslate = sheet.params.swipeToClose ? sheetElOffsetHeight : swipeStepTranslate;
14919 }
14920 isMoved = true;
14921 }
14922 currentTranslate = startTranslate - touchesDiff;
14923 currentTranslate = Math.min(Math.max(currentTranslate, minTranslate), maxTranslate);
14924 e.preventDefault();
14925 $el
14926 .transition(0)
14927 .transform(("translate3d(0," + currentTranslate + "px,0)"));
14928 if (sheet.params.swipeToStep) {
14929 var progress;
14930 if (isTopSheetModal) {
14931 progress = 1 - (currentTranslate / swipeStepTranslate);
14932 } else {
14933 progress = (swipeStepTranslate - currentTranslate) / swipeStepTranslate;
14934 }
14935 progress = Math.min(Math.max(progress, 0), 1);
14936 $el.trigger('sheet:stepprogress', progress);
14937 sheet.emit('local::stepProgress sheetStepProgress', sheet, progress);
14938 }
14939 }
14940 function handleTouchEnd() {
14941 isTouched = false;
14942 if (!isMoved) {
14943 return;
14944 }
14945 isMoved = false;
14946 $el.transform('').transition('');
14947
14948 var direction = touchesDiff < 0 ? 'to-bottom' : 'to-top';
14949
14950 var diff = Math.abs(touchesDiff);
14951 if (diff === 0 || currentTranslate === startTranslate) { return; }
14952
14953 var timeDiff = (new Date()).getTime() - touchStartTime;
14954
14955 if (!sheet.params.swipeToStep) {
14956 if (direction !== (isTopSheetModal ? 'to-top' : 'to-bottom')) {
14957 return;
14958 }
14959 if ((timeDiff < 300 && diff > 20) || (timeDiff >= 300 && diff > (sheetElOffsetHeight / 2))) {
14960 sheet.close();
14961 }
14962 return;
14963 }
14964
14965 var openDirection = isTopSheetModal ? 'to-bottom' : 'to-top';
14966 var closeDirection = isTopSheetModal ? 'to-top' : 'to-bottom';
14967 var absCurrentTranslate = Math.abs(currentTranslate);
14968 var absSwipeStepTranslate = Math.abs(swipeStepTranslate);
14969
14970 if (timeDiff < 300 && diff > 10) {
14971 if (direction === openDirection && absCurrentTranslate < absSwipeStepTranslate) {
14972 // open step
14973 $el.removeClass('modal-in-swipe-step');
14974 $el.trigger('sheet:stepprogress', 1);
14975 sheet.emit('local::stepProgress sheetStepProgress', sheet, 1);
14976 $el.trigger('sheet:stepopen');
14977 sheet.emit('local::stepOpen sheetStepOpen', sheet);
14978 }
14979 if (direction === closeDirection && absCurrentTranslate > absSwipeStepTranslate) {
14980 // close sheet
14981 if (sheet.params.swipeToClose) {
14982 sheet.close();
14983 } else {
14984 // close step
14985 $el.addClass('modal-in-swipe-step');
14986 $el.trigger('sheet:stepprogress', 0);
14987 sheet.emit('local::stepProgress sheetStepProgress', sheet, 0);
14988 $el.trigger('sheet:stepclose');
14989 sheet.emit('local::stepClose sheetStepClose', sheet);
14990 }
14991 }
14992 if (direction === closeDirection && absCurrentTranslate <= absSwipeStepTranslate) {
14993 // close step
14994 $el.addClass('modal-in-swipe-step');
14995 $el.trigger('sheet:stepprogress', 0);
14996 sheet.emit('local::stepProgress sheetStepProgress', sheet, 0);
14997 $el.trigger('sheet:stepclose');
14998 sheet.emit('local::stepClose sheetStepClose', sheet);
14999 }
15000 return;
15001 }
15002 if (timeDiff >= 300) {
15003 var stepOpened = !$el.hasClass('modal-in-swipe-step');
15004 if (!stepOpened) {
15005 if (absCurrentTranslate < (absSwipeStepTranslate / 2)) {
15006 // open step
15007 $el.removeClass('modal-in-swipe-step');
15008 $el.trigger('sheet:stepprogress', 1);
15009 sheet.emit('local::stepProgress sheetStepProgress', sheet, 1);
15010 $el.trigger('sheet:stepopen');
15011 sheet.emit('local::stepOpen sheetStepOpen', sheet);
15012 } else if ((absCurrentTranslate - absSwipeStepTranslate) > (sheetElOffsetHeight - absSwipeStepTranslate) / 2) {
15013 // close sheet
15014 if (sheet.params.swipeToClose) { sheet.close(); }
15015 }
15016 } else if (stepOpened) {
15017 if (absCurrentTranslate > absSwipeStepTranslate + (sheetElOffsetHeight - absSwipeStepTranslate) / 2) {
15018 // close sheet
15019 if (sheet.params.swipeToClose) { sheet.close(); }
15020 } else if (absCurrentTranslate > absSwipeStepTranslate / 2) {
15021 // close step
15022 $el.addClass('modal-in-swipe-step');
15023 $el.trigger('sheet:stepprogress', 0);
15024 sheet.emit('local::stepProgress sheetStepProgress', sheet, 0);
15025 $el.trigger('sheet:stepclose');
15026 sheet.emit('local::stepClose sheetStepClose', sheet);
15027 }
15028 }
15029 }
15030 }
15031
15032 function setSwipeStep(byResize) {
15033 var $swipeStepEl = $el.find('.sheet-modal-swipe-step').eq(0);
15034 if (!$swipeStepEl.length) { return; }
15035 if ($el.hasClass('sheet-modal-top')) {
15036 swipeStepTranslate = -($swipeStepEl.offset().top - $el.offset().top + $swipeStepEl[0].offsetHeight);
15037 } else {
15038 swipeStepTranslate = $el[0].offsetHeight - ($swipeStepEl.offset().top - $el.offset().top + $swipeStepEl[0].offsetHeight);
15039 }
15040 $el[0].style.setProperty('--f7-sheet-swipe-step', (swipeStepTranslate + "px"));
15041 if (!byResize) {
15042 $el.addClass('modal-in-swipe-step');
15043 }
15044 }
15045
15046 function onResize() {
15047 setSwipeStep(true);
15048 }
15049
15050 var passive = Support.passiveListener ? { passive: true } : false;
15051 if (sheet.params.swipeToClose || sheet.params.swipeToStep) {
15052 $el.on(app.touchEvents.start, handleTouchStart, passive);
15053 app.on('touchmove', handleTouchMove);
15054 app.on('touchend:passive', handleTouchEnd);
15055 sheet.once('sheetDestroy', function () {
15056 $el.off(app.touchEvents.start, handleTouchStart, passive);
15057 app.off('touchmove', handleTouchMove);
15058 app.off('touchend:passive', handleTouchEnd);
15059 });
15060 }
15061
5309fbda 15062 sheet.on('sheetOpen', function () {
5d51ea26
DC
15063 if (sheet.params.closeOnEscape) {
15064 $(document).on('keydown', onKeyDown);
15065 }
15066 if (sheet.params.swipeToStep) {
15067 setSwipeStep();
15068 app.on('resize', onResize);
15069 }
5309fbda 15070 if (sheet.params.scrollToEl) {
5d51ea26 15071 scrollToElementOnOpen();
5309fbda
DC
15072 }
15073 });
15074 sheet.on('sheetOpened', function () {
15075 if (sheet.params.closeByOutsideClick || sheet.params.closeByBackdropClick) {
15076 app.on('click', handleClick);
15077 }
15078 });
15079 sheet.on('sheetClose', function () {
5d51ea26
DC
15080 if (sheet.params.swipeToStep) {
15081 $el.removeClass('modal-in-swipe-step');
15082 app.off('resize', onResize);
15083 }
15084 if (sheet.params.closeOnEscape) {
15085 $(document).off('keydown', onKeyDown);
15086 }
5309fbda 15087 if (sheet.params.scrollToEl) {
5d51ea26 15088 scrollToElementOnClose();
5309fbda
DC
15089 }
15090 if (sheet.params.closeByOutsideClick || sheet.params.closeByBackdropClick) {
15091 app.off('click', handleClick);
15092 }
15093 });
15094
5d51ea26
DC
15095 sheet.stepOpen = function stepOpen() {
15096 $el.removeClass('modal-in-swipe-step');
15097 };
15098 sheet.stepClose = function stepClose() {
15099 $el.addClass('modal-in-swipe-step');
15100 };
15101 sheet.stepToggle = function stepToggle() {
15102 $el.toggleClass('modal-in-swipe-step');
15103 };
5309fbda
DC
15104
15105 $el[0].f7Modal = sheet;
15106
15107 return sheet;
15108 }
15109
5d51ea26
DC
15110 if ( Modal ) Sheet.__proto__ = Modal;
15111 Sheet.prototype = Object.create( Modal && Modal.prototype );
5309fbda
DC
15112 Sheet.prototype.constructor = Sheet;
15113
15114 return Sheet;
15115 }(Modal));
15116
15117 var Sheet$1 = {
15118 name: 'sheet',
15119 params: {
15120 sheet: {
5d51ea26
DC
15121 backdrop: undefined,
15122 backdropEl: undefined,
5309fbda
DC
15123 closeByBackdropClick: true,
15124 closeByOutsideClick: false,
5d51ea26
DC
15125 closeOnEscape: false,
15126 swipeToClose: false,
15127 swipeToStep: false,
15128 swipeHandler: null,
5309fbda
DC
15129 },
15130 },
15131 static: {
15132 Sheet: Sheet,
15133 },
15134 create: function create() {
15135 var app = this;
5309fbda
DC
15136 app.sheet = Utils.extend(
15137 {},
15138 ModalMethods({
15139 app: app,
15140 constructor: Sheet,
15141 defaultSelector: '.sheet-modal.modal-in',
5d51ea26
DC
15142 }),
15143 {
15144 stepOpen: function stepOpen(sheet) {
15145 var sheetInstance = app.sheet.get(sheet);
15146 if (sheetInstance && sheetInstance.stepOpen) { return sheetInstance.stepOpen(); }
15147 return undefined;
15148 },
15149 stepClose: function stepClose(sheet) {
15150 var sheetInstance = app.sheet.get(sheet);
15151 if (sheetInstance && sheetInstance.stepClose) { return sheetInstance.stepClose(); }
15152 return undefined;
15153 },
15154 stepToggle: function stepToggle(sheet) {
15155 var sheetInstance = app.sheet.get(sheet);
15156 if (sheetInstance && sheetInstance.stepToggle) { return sheetInstance.stepToggle(); }
15157 return undefined;
15158 },
15159 }
5309fbda
DC
15160 );
15161 },
15162 clicks: {
15163 '.sheet-open': function openSheet($clickedEl, data) {
15164 if ( data === void 0 ) data = {};
15165
15166 var app = this;
15167 if ($('.sheet-modal.modal-in').length > 0 && data.sheet && $(data.sheet)[0] !== $('.sheet-modal.modal-in')[0]) {
15168 app.sheet.close('.sheet-modal.modal-in');
15169 }
15170 app.sheet.open(data.sheet, data.animate);
15171 },
15172 '.sheet-close': function closeSheet($clickedEl, data) {
15173 if ( data === void 0 ) data = {};
15174
15175 var app = this;
15176 app.sheet.close(data.sheet, data.animate);
15177 },
15178 },
15179 };
15180
5d51ea26 15181 var Toast = /*@__PURE__*/(function (Modal) {
5309fbda
DC
15182 function Toast(app, params) {
15183 var extendedParams = Utils.extend({
15184 on: {},
15185 }, app.params.toast, params);
15186
15187 // Extends with open/close Modal methods;
5d51ea26 15188 Modal.call(this, app, extendedParams);
5309fbda
DC
15189
15190 var toast = this;
15191
15192 toast.app = app;
15193
15194 toast.params = extendedParams;
15195
15196 var ref = toast.params;
15197 var closeButton = ref.closeButton;
15198 var closeTimeout = ref.closeTimeout;
15199
15200 var $el;
15201 if (!toast.params.el) {
15202 // Find Element
15203 var toastHtml = toast.render();
15204
15205 $el = $(toastHtml);
15206 } else {
15207 $el = $(toast.params.el);
15208 }
15209
15210 if ($el && $el.length > 0 && $el[0].f7Modal) {
15211 return $el[0].f7Modal;
15212 }
15213
15214 if ($el.length === 0) {
15215 return toast.destroy();
15216 }
15217
15218 Utils.extend(toast, {
15219 $el: $el,
15220 el: $el[0],
15221 type: 'toast',
15222 });
15223
15224 $el[0].f7Modal = toast;
15225
15226 if (closeButton) {
15227 $el.find('.toast-button').on('click', function () {
15228 toast.emit('local::closeButtonClick toastCloseButtonClick', toast);
15229 toast.close();
15230 });
15231
15232 toast.on('beforeDestroy', function () {
15233 $el.find('.toast-button').off('click');
15234 });
15235 }
15236
15237 var timeoutId;
15238 toast.on('open', function () {
15239 $('.toast.modal-in').each(function (index, openedEl) {
15240 var toastInstance = app.toast.get(openedEl);
15241 if (openedEl !== toast.el && toastInstance) {
15242 toastInstance.close();
15243 }
15244 });
15245 if (closeTimeout) {
15246 timeoutId = Utils.nextTick(function () {
15247 toast.close();
15248 }, closeTimeout);
15249 }
15250 });
15251 toast.on('close', function () {
15252 win.clearTimeout(timeoutId);
15253 });
15254
15255 if (toast.params.destroyOnClose) {
15256 toast.once('closed', function () {
15257 setTimeout(function () {
15258 toast.destroy();
15259 }, 0);
15260 });
15261 }
15262
15263 return toast;
15264 }
15265
5d51ea26
DC
15266 if ( Modal ) Toast.__proto__ = Modal;
15267 Toast.prototype = Object.create( Modal && Modal.prototype );
5309fbda
DC
15268 Toast.prototype.constructor = Toast;
15269
15270 Toast.prototype.render = function render () {
15271 var toast = this;
15272 if (toast.params.render) { return toast.params.render.call(toast, toast); }
15273 var ref = toast.params;
15274 var position = ref.position;
15275 var cssClass = ref.cssClass;
15276 var icon = ref.icon;
15277 var text = ref.text;
15278 var closeButton = ref.closeButton;
15279 var closeButtonColor = ref.closeButtonColor;
15280 var closeButtonText = ref.closeButtonText;
15281 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();
15282 };
15283
15284 return Toast;
15285 }(Modal));
15286
15287 var Toast$1 = {
15288 name: 'toast',
15289 static: {
15290 Toast: Toast,
15291 },
15292 create: function create() {
15293 var app = this;
15294 app.toast = Utils.extend(
15295 {},
15296 ModalMethods({
15297 app: app,
15298 constructor: Toast,
15299 defaultSelector: '.toast.modal-in',
15300 }),
15301 {
15302 // Shortcuts
15303 show: function show(params) {
15304 Utils.extend(params, {
15305 destroyOnClose: true,
15306 });
15307 return new Toast(app, params).open();
15308 },
15309 }
15310 );
15311 },
15312 params: {
15313 toast: {
15314 icon: null,
15315 text: null,
15316 position: 'bottom',
15317 closeButton: false,
15318 closeButtonColor: null,
15319 closeButtonText: 'Ok',
15320 closeTimeout: null,
15321 cssClass: null,
15322 render: null,
15323 },
15324 },
15325 };
15326
15327 var Preloader = {
15328 init: function init(el) {
15329 var app = this;
15330 var $el = $(el);
15331 if ($el.length === 0 || $el.children('.preloader-inner').length > 0 || $el.children('.preloader-inner-line').length > 0) { return; }
15332 $el.append(Utils[((app.theme) + "PreloaderContent")]);
15333 },
15334 // Modal
15335 visible: false,
15336 show: function show(color) {
15337 if ( color === void 0 ) color = 'white';
15338
15339 var app = this;
15340 if (Preloader.visible) { return; }
15341 var preloaderInner = Utils[((app.theme) + "PreloaderContent")] || '';
15342 $('html').addClass('with-modal-preloader');
15343 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 "));
15344 Preloader.visible = true;
15345 },
15346 hide: function hide() {
15347 var app = this;
15348 if (!Preloader.visible) { return; }
15349 $('html').removeClass('with-modal-preloader');
15350 app.root.find('.preloader-backdrop, .preloader-modal').remove();
15351 Preloader.visible = false;
15352 },
15353 };
15354 var Preloader$1 = {
15355 name: 'preloader',
15356 create: function create() {
15357 var app = this;
15358 Utils.extend(app, {
15359 preloader: {
15360 init: Preloader.init.bind(app),
15361 show: Preloader.show.bind(app),
15362 hide: Preloader.hide.bind(app),
15363 },
15364 });
15365 },
15366 on: {
15367 photoBrowserOpen: function photoBrowserOpen(pb) {
15368 var app = this;
15369 pb.$el.find('.preloader').each(function (index, preloaderEl) {
15370 app.preloader.init(preloaderEl);
15371 });
15372 },
15373 pageInit: function pageInit(page) {
15374 var app = this;
15375 page.$el.find('.preloader').each(function (index, preloaderEl) {
15376 app.preloader.init(preloaderEl);
15377 });
15378 },
15379 },
15380 vnode: {
15381 preloader: {
15382 insert: function insert(vnode) {
15383 var app = this;
15384 var preloaderEl = vnode.elm;
15385 app.preloader.init(preloaderEl);
15386 },
15387 },
15388 },
15389 };
15390
15391 var Progressbar = {
15392 set: function set() {
15393 var assign;
15394
15395 var args = [], len = arguments.length;
15396 while ( len-- ) args[ len ] = arguments[ len ];
15397 var app = this;
15398 var el = args[0];
15399 var progress = args[1];
15400 var duration = args[2];
15401 if (typeof args[0] === 'number') {
15402 (assign = args, progress = assign[0], duration = assign[1]);
15403 el = app.root;
15404 }
15405 if (typeof progress === 'undefined' || progress === null) { return el; }
15406 if (!progress) { progress = 0; }
15407
15408 var $el = $(el || app.root);
15409 if ($el.length === 0) {
15410 return el;
15411 }
15412 var progressNormalized = Math.min(Math.max(progress, 0), 100);
15413 var $progressbarEl;
15414 if ($el.hasClass('progressbar')) { $progressbarEl = $el.eq(0); }
15415 else {
15416 $progressbarEl = $el.children('.progressbar');
15417 }
15418 if ($progressbarEl.length === 0 || $progressbarEl.hasClass('progressbar-infinite')) {
15419 return $progressbarEl;
15420 }
15421 var $progressbarLine = $progressbarEl.children('span');
15422 if ($progressbarLine.length === 0) {
15423 $progressbarLine = $('<span></span>');
15424 $progressbarEl.append($progressbarLine);
15425 }
15426 $progressbarLine
15427 .transition(typeof duration !== 'undefined' ? duration : '')
15428 .transform(("translate3d(" + ((-100 + progressNormalized)) + "%,0,0)"));
15429
15430 return $progressbarEl[0];
15431 },
15432 show: function show() {
15433 var assign, assign$1;
15434
15435 var args = [], len = arguments.length;
15436 while ( len-- ) args[ len ] = arguments[ len ];
15437 var app = this;
15438
15439 // '.page', 50, 'multi'
15440 var el = args[0];
15441 var progress = args[1];
15442 var color = args[2];
15443 var type = 'determined';
15444
15445 if (args.length === 2) {
15446 if ((typeof args[0] === 'string' || typeof args[0] === 'object') && typeof args[1] === 'string') {
15447 // '.page', 'multi'
15448 (assign = args, el = assign[0], color = assign[1], progress = assign[2]);
15449 type = 'infinite';
15450 } else if (typeof args[0] === 'number' && typeof args[1] === 'string') {
15451 // 50, 'multi'
15452 (assign$1 = args, progress = assign$1[0], color = assign$1[1]);
15453 el = app.root;
15454 }
15455 } else if (args.length === 1) {
15456 if (typeof args[0] === 'number') {
15457 el = app.root;
15458 progress = args[0];
15459 } else if (typeof args[0] === 'string') {
15460 type = 'infinite';
15461 el = app.root;
15462 color = args[0];
15463 }
15464 } else if (args.length === 0) {
15465 type = 'infinite';
15466 el = app.root;
15467 }
15468
15469 var $el = $(el);
15470 if ($el.length === 0) { return undefined; }
15471
15472 var $progressbarEl;
15473 if ($el.hasClass('progressbar') || $el.hasClass('progressbar-infinite')) {
15474 $progressbarEl = $el;
15475 } else {
15476 $progressbarEl = $el.children('.progressbar:not(.progressbar-out), .progressbar-infinite:not(.progressbar-out)');
15477 if ($progressbarEl.length === 0) {
15478 $progressbarEl = $(("\n <span class=\"progressbar" + (type === 'infinite' ? '-infinite' : '') + (color ? (" color-" + color) : '') + " progressbar-in\">\n " + (type === 'infinite' ? '' : '<span></span>') + "\n </span>"));
15479 $el.append($progressbarEl);
15480 }
15481 }
15482
15483 if (typeof progress !== 'undefined') {
15484 app.progressbar.set($progressbarEl, progress);
15485 }
15486
15487 return $progressbarEl[0];
15488 },
15489 hide: function hide(el, removeAfterHide) {
15490 if ( removeAfterHide === void 0 ) removeAfterHide = true;
15491
15492 var app = this;
15493 var $el = $(el || app.root);
15494 if ($el.length === 0) { return undefined; }
15495 var $progressbarEl;
15496 if ($el.hasClass('progressbar') || $el.hasClass('progressbar-infinite')) {
15497 $progressbarEl = $el;
15498 } else {
15499 $progressbarEl = $el.children('.progressbar, .progressbar-infinite');
15500 }
15501 if ($progressbarEl.length === 0 || !$progressbarEl.hasClass('progressbar-in') || $progressbarEl.hasClass('progressbar-out')) {
15502 return $progressbarEl;
15503 }
15504 $progressbarEl
15505 .removeClass('progressbar-in')
15506 .addClass('progressbar-out')
15507 .animationEnd(function () {
15508 if (removeAfterHide) {
15509 $progressbarEl.remove();
15510 }
15511 });
15512 return $progressbarEl;
15513 },
15514 };
15515
15516 var Progressbar$1 = {
15517 name: 'progressbar',
15518 create: function create() {
15519 var app = this;
15520 Utils.extend(app, {
15521 progressbar: {
15522 set: Progressbar.set.bind(app),
15523 show: Progressbar.show.bind(app),
15524 hide: Progressbar.hide.bind(app),
15525 },
15526 });
15527 },
15528 on: {
15529 pageInit: function pageInit(page) {
15530 var app = this;
15531 page.$el.find('.progressbar').each(function (index, progressbarEl) {
15532 var $progressbarEl = $(progressbarEl);
15533 app.progressbar.set($progressbarEl, $progressbarEl.attr('data-progress'));
15534 });
15535 },
15536 },
5d51ea26
DC
15537 vnode: {
15538 progressbar: {
15539 insert: function insert(vnode) {
15540 var app = this;
15541 var el = vnode.elm;
15542 app.progressbar.set(el, el.getAttribute('data-progress'));
15543 },
15544 update: function update(vnode) {
15545 var app = this;
15546 var el = vnode.elm;
15547 app.progressbar.set(el, el.getAttribute('data-progress'));
15548 },
15549 },
15550 },
5309fbda
DC
15551 };
15552
15553 var Sortable = {
15554 init: function init() {
15555 var app = this;
15556 var isTouched;
15557 var isMoved;
15558 var touchStartY;
15559 var touchesDiff;
15560 var $sortingEl;
15561 var $sortingItems;
15562 var $sortableContainer;
15563 var sortingElHeight;
15564 var minTop;
15565 var maxTop;
15566 var $insertAfterEl;
15567 var $insertBeforeEl;
15568 var indexFrom;
15569 var $pageEl;
15570 var $pageContentEl;
15571 var pageHeight;
15572 var pageOffset;
15573 var sortingElOffsetLocal;
15574 var sortingElOffsetTop;
15575 var initialScrollTop;
15576
15577 function handleTouchStart(e) {
15578 isMoved = false;
15579 isTouched = true;
15580 touchStartY = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
15581 $sortingEl = $(this).parent('li');
15582 indexFrom = $sortingEl.index();
15583 $sortableContainer = $sortingEl.parents('.sortable');
15584 var $listGroup = $sortingEl.parents('.list-group');
15585 if ($listGroup.length && $listGroup.parents($sortableContainer).length) {
15586 $sortableContainer = $listGroup;
15587 }
15588 $sortingItems = $sortableContainer.children('ul').children('li');
15589 if (app.panel) { app.panel.allowOpen = false; }
15590 if (app.swipeout) { app.swipeout.allow = false; }
15591 }
15592 function handleTouchMove(e) {
15593 if (!isTouched || !$sortingEl) { return; }
15594 var pageY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
15595 if (!isMoved) {
15596 $pageEl = $sortingEl.parents('.page');
15597 $pageContentEl = $sortingEl.parents('.page-content');
15598 var paddingTop = parseInt($pageContentEl.css('padding-top'), 10);
15599 var paddingBottom = parseInt($pageContentEl.css('padding-bottom'), 10);
15600 initialScrollTop = $pageContentEl[0].scrollTop;
15601 pageOffset = $pageEl.offset().top + paddingTop;
15602 pageHeight = $pageEl.height() - paddingTop - paddingBottom;
15603 $sortingEl.addClass('sorting');
15604 $sortableContainer.addClass('sortable-sorting');
15605 sortingElOffsetLocal = $sortingEl[0].offsetTop;
15606 minTop = $sortingEl[0].offsetTop;
15607 maxTop = $sortingEl.parent().height() - sortingElOffsetLocal - $sortingEl.height();
15608 sortingElHeight = $sortingEl[0].offsetHeight;
15609 sortingElOffsetTop = $sortingEl.offset().top;
15610 }
15611 isMoved = true;
15612
15613 e.preventDefault();
15614 e.f7PreventSwipePanel = true;
15615
15616 touchesDiff = pageY - touchStartY;
15617
15618 var translateScrollOffset = $pageContentEl[0].scrollTop - initialScrollTop;
15619 var translate = Math.min(Math.max(touchesDiff + translateScrollOffset, -minTop), maxTop);
15620 $sortingEl.transform(("translate3d(0," + translate + "px,0)"));
15621
15622 var scrollAddition = 44;
15623 var allowScroll = true;
15624 if ((touchesDiff + translateScrollOffset) + scrollAddition < -minTop) {
15625 allowScroll = false;
15626 }
15627 if ((touchesDiff + translateScrollOffset) - scrollAddition > maxTop) {
15628 allowScroll = false;
15629 }
15630
15631 $insertBeforeEl = undefined;
15632 $insertAfterEl = undefined;
15633
15634 var scrollDiff;
15635 if (allowScroll) {
15636 if (sortingElOffsetTop + touchesDiff + sortingElHeight + scrollAddition > pageOffset + pageHeight) {
15637 // To Bottom
15638 scrollDiff = (sortingElOffsetTop + touchesDiff + sortingElHeight + scrollAddition) - (pageOffset + pageHeight);
15639 }
15640 if (sortingElOffsetTop + touchesDiff < pageOffset + scrollAddition) {
15641 // To Top
15642 scrollDiff = (sortingElOffsetTop + touchesDiff) - pageOffset - scrollAddition;
15643 }
15644 if (scrollDiff) {
15645 $pageContentEl[0].scrollTop += scrollDiff;
15646 }
15647 }
15648
15649 $sortingItems.each(function (index, el) {
15650 var $currentEl = $(el);
15651 if ($currentEl[0] === $sortingEl[0]) { return; }
15652 var currentElOffset = $currentEl[0].offsetTop;
15653 var currentElHeight = $currentEl.height();
15654 var sortingElOffset = sortingElOffsetLocal + translate;
15655
15656 if ((sortingElOffset >= currentElOffset - (currentElHeight / 2)) && $sortingEl.index() < $currentEl.index()) {
15657 $currentEl.transform(("translate3d(0, " + (-sortingElHeight) + "px,0)"));
15658 $insertAfterEl = $currentEl;
15659 $insertBeforeEl = undefined;
15660 } else if ((sortingElOffset <= currentElOffset + (currentElHeight / 2)) && $sortingEl.index() > $currentEl.index()) {
15661 $currentEl.transform(("translate3d(0, " + sortingElHeight + "px,0)"));
15662 $insertAfterEl = undefined;
15663 if (!$insertBeforeEl) { $insertBeforeEl = $currentEl; }
15664 } else {
15665 $currentEl.transform('translate3d(0, 0%,0)');
15666 }
15667 });
15668 }
15669 function handleTouchEnd() {
15670 if (!isTouched || !isMoved) {
15671 isTouched = false;
15672 isMoved = false;
15673 if (isTouched && !isMoved) {
15674 if (app.panel) { app.panel.allowOpen = true; }
15675 if (app.swipeout) { app.swipeout.allow = true; }
15676 }
15677 return;
15678 }
15679 if (app.panel) { app.panel.allowOpen = true; }
15680 if (app.swipeout) { app.swipeout.allow = true; }
15681
15682 $sortingItems.transform('');
15683 $sortingEl.removeClass('sorting');
15684 $sortableContainer.removeClass('sortable-sorting');
15685
15686 var indexTo;
15687 if ($insertAfterEl) { indexTo = $insertAfterEl.index(); }
15688 else if ($insertBeforeEl) { indexTo = $insertBeforeEl.index(); }
15689
15690 if (app.params.sortable.moveElements) {
15691 if ($insertAfterEl) {
15692 $sortingEl.insertAfter($insertAfterEl);
15693 }
15694 if ($insertBeforeEl) {
15695 $sortingEl.insertBefore($insertBeforeEl);
15696 }
15697 }
15698
15699 if (($insertAfterEl || $insertBeforeEl)
15700 && $sortableContainer.hasClass('virtual-list')
15701 ) {
15702 indexFrom = $sortingEl[0].f7VirtualListIndex;
15703 if (typeof indexFrom === 'undefined') { indexFrom = $sortingEl.attr('data-virtual-list-index'); }
15704 if ($insertBeforeEl) {
15705 indexTo = $insertBeforeEl[0].f7VirtualListIndex;
15706 if (typeof indexTo === 'undefined') { indexTo = $insertBeforeEl.attr('data-virtual-list-index'); }
15707 } else {
15708 indexTo = $insertAfterEl[0].f7VirtualListIndex;
15709 if (typeof indexTo === 'undefined') { indexTo = $insertAfterEl.attr('data-virtual-list-index'); }
15710 }
15711 if (indexTo !== null) { indexTo = parseInt(indexTo, 10); }
15712 else { indexTo = undefined; }
15713
15714 var virtualList = $sortableContainer[0].f7VirtualList;
15715 if (virtualList) { virtualList.moveItem(indexFrom, indexTo); }
15716 }
15717 if (typeof indexTo !== 'undefined' && !Number.isNaN(indexTo) && indexTo !== indexFrom) {
15718 $sortingEl.trigger('sortable:sort', { from: indexFrom, to: indexTo });
15719 app.emit('sortableSort', $sortingEl[0], { from: indexFrom, to: indexTo });
15720 }
15721
15722 $insertBeforeEl = undefined;
15723 $insertAfterEl = undefined;
15724 isTouched = false;
15725 isMoved = false;
15726 }
15727
15728 var activeListener = app.support.passiveListener ? { passive: false, capture: false } : false;
15729
15730 $(doc).on(app.touchEvents.start, '.list.sortable .sortable-handler', handleTouchStart, activeListener);
15731 app.on('touchmove:active', handleTouchMove);
15732 app.on('touchend:passive', handleTouchEnd);
15733 },
15734 enable: function enable(el) {
15735 if ( el === void 0 ) el = '.list.sortable';
15736
15737 var app = this;
15738 var $el = $(el);
15739 if ($el.length === 0) { return; }
15740 $el.addClass('sortable-enabled');
15741 $el.trigger('sortable:enable');
15742 app.emit('sortableEnable', $el[0]);
15743 },
15744 disable: function disable(el) {
15745 if ( el === void 0 ) el = '.list.sortable';
15746
15747 var app = this;
15748 var $el = $(el);
15749 if ($el.length === 0) { return; }
15750 $el.removeClass('sortable-enabled');
15751 $el.trigger('sortable:disable');
15752 app.emit('sortableDisable', $el[0]);
15753 },
15754 toggle: function toggle(el) {
15755 if ( el === void 0 ) el = '.list.sortable';
15756
15757 var app = this;
15758 var $el = $(el);
15759 if ($el.length === 0) { return; }
15760 if ($el.hasClass('sortable-enabled')) {
15761 app.sortable.disable($el);
15762 } else {
15763 app.sortable.enable($el);
15764 }
15765 },
15766 };
15767 var Sortable$1 = {
15768 name: 'sortable',
15769 params: {
15770 sortable: {
15771 moveElements: true,
15772 },
15773 },
15774 create: function create() {
15775 var app = this;
15776 Utils.extend(app, {
15777 sortable: {
15778 init: Sortable.init.bind(app),
15779 enable: Sortable.enable.bind(app),
15780 disable: Sortable.disable.bind(app),
15781 toggle: Sortable.toggle.bind(app),
15782 },
15783 });
15784 },
15785 on: {
15786 init: function init() {
15787 var app = this;
15788 if (!app.params.sortable) { return; }
15789 app.sortable.init();
15790 },
15791 },
15792 clicks: {
15793 '.sortable-enable': function enable($clickedEl, data) {
15794 if ( data === void 0 ) data = {};
15795
15796 var app = this;
15797 app.sortable.enable(data.sortable);
15798 },
15799 '.sortable-disable': function disable($clickedEl, data) {
15800 if ( data === void 0 ) data = {};
15801
15802 var app = this;
15803 app.sortable.disable(data.sortable);
15804 },
15805 '.sortable-toggle': function toggle($clickedEl, data) {
15806 if ( data === void 0 ) data = {};
15807
15808 var app = this;
15809 app.sortable.toggle(data.sortable);
15810 },
15811 },
15812 };
15813
15814 var Swipeout = {
15815 init: function init() {
15816 var app = this;
15817 var touchesStart = {};
15818 var isTouched;
15819 var isMoved;
15820 var isScrolling;
15821 var touchStartTime;
15822 var touchesDiff;
15823 var $swipeoutEl;
15824 var $swipeoutContent;
15825 var $actionsRight;
15826 var $actionsLeft;
15827 var actionsLeftWidth;
15828 var actionsRightWidth;
15829 var translate;
15830 var opened;
15831 var openedActionsSide;
15832 var $leftButtons;
15833 var $rightButtons;
15834 var direction;
15835 var $overswipeLeftButton;
15836 var $overswipeRightButton;
15837 var overswipeLeft;
15838 var overswipeRight;
15839
15840 function handleTouchStart(e) {
15841 if (!Swipeout.allow) { return; }
15842 isMoved = false;
15843 isTouched = true;
15844 isScrolling = undefined;
15845 touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
15846 touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
15847 touchStartTime = (new Date()).getTime();
15848 $swipeoutEl = $(this);
15849 }
15850 function handleTouchMove(e) {
15851 if (!isTouched) { return; }
15852 var pageX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;
15853 var pageY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
15854 if (typeof isScrolling === 'undefined') {
15855 isScrolling = !!(isScrolling || Math.abs(pageY - touchesStart.y) > Math.abs(pageX - touchesStart.x));
15856 }
15857 if (isScrolling) {
15858 isTouched = false;
15859 return;
15860 }
15861
15862 if (!isMoved) {
15863 if ($('.list.sortable-opened').length > 0) { return; }
15864 $swipeoutContent = $swipeoutEl.find('.swipeout-content');
15865 $actionsRight = $swipeoutEl.find('.swipeout-actions-right');
15866 $actionsLeft = $swipeoutEl.find('.swipeout-actions-left');
15867 actionsLeftWidth = null;
15868 actionsRightWidth = null;
15869 $leftButtons = null;
15870 $rightButtons = null;
15871 $overswipeRightButton = null;
15872 $overswipeLeftButton = null;
15873 if ($actionsLeft.length > 0) {
15874 actionsLeftWidth = $actionsLeft.outerWidth();
15875 $leftButtons = $actionsLeft.children('a');
15876 $overswipeLeftButton = $actionsLeft.find('.swipeout-overswipe');
15877 }
15878 if ($actionsRight.length > 0) {
15879 actionsRightWidth = $actionsRight.outerWidth();
15880 $rightButtons = $actionsRight.children('a');
15881 $overswipeRightButton = $actionsRight.find('.swipeout-overswipe');
15882 }
15883 opened = $swipeoutEl.hasClass('swipeout-opened');
15884 if (opened) {
15885 openedActionsSide = $swipeoutEl.find('.swipeout-actions-left.swipeout-actions-opened').length > 0 ? 'left' : 'right';
15886 }
15887 $swipeoutEl.removeClass('swipeout-transitioning');
15888 if (!app.params.swipeout.noFollow) {
15889 $swipeoutEl.find('.swipeout-actions-opened').removeClass('swipeout-actions-opened');
15890 $swipeoutEl.removeClass('swipeout-opened');
15891 }
15892 }
15893 isMoved = true;
15894 e.preventDefault();
15895
15896 touchesDiff = pageX - touchesStart.x;
15897 translate = touchesDiff;
15898
15899 if (opened) {
15900 if (openedActionsSide === 'right') { translate -= actionsRightWidth; }
15901 else { translate += actionsLeftWidth; }
15902 }
15903
15904 if (
15905 (translate > 0 && $actionsLeft.length === 0)
15906 || (translate < 0 && $actionsRight.length === 0)
15907 ) {
15908 if (!opened) {
15909 isTouched = false;
15910 isMoved = false;
15911 $swipeoutContent.transform('');
15912 if ($rightButtons && $rightButtons.length > 0) {
15913 $rightButtons.transform('');
15914 }
15915 if ($leftButtons && $leftButtons.length > 0) {
15916 $leftButtons.transform('');
15917 }
15918 return;
15919 }
15920 translate = 0;
15921 }
15922
15923 if (translate < 0) { direction = 'to-left'; }
15924 else if (translate > 0) { direction = 'to-right'; }
15925 else if (!direction) { direction = 'to-left'; }
15926
15927 var buttonOffset;
15928 var progress;
15929
15930 e.f7PreventSwipePanel = true;
15931 if (app.params.swipeout.noFollow) {
15932 if (opened) {
15933 if (openedActionsSide === 'right' && touchesDiff > 0) {
15934 app.swipeout.close($swipeoutEl);
15935 }
15936 if (openedActionsSide === 'left' && touchesDiff < 0) {
15937 app.swipeout.close($swipeoutEl);
15938 }
15939 } else {
15940 if (touchesDiff < 0 && $actionsRight.length > 0) {
15941 app.swipeout.open($swipeoutEl, 'right');
15942 }
15943 if (touchesDiff > 0 && $actionsLeft.length > 0) {
15944 app.swipeout.open($swipeoutEl, 'left');
15945 }
15946 }
15947 isTouched = false;
15948 isMoved = false;
15949 return;
15950 }
15951 overswipeLeft = false;
15952 overswipeRight = false;
15953 if ($actionsRight.length > 0) {
15954 // Show right actions
15955 var buttonTranslate = translate;
15956 progress = buttonTranslate / actionsRightWidth;
15957 if (buttonTranslate < -actionsRightWidth) {
15958 buttonTranslate = -actionsRightWidth - (Math.pow( (-buttonTranslate - actionsRightWidth), 0.8 ));
15959 translate = buttonTranslate;
15960 if ($overswipeRightButton.length > 0) {
15961 overswipeRight = true;
15962 }
15963 }
15964 if (direction !== 'to-left') {
15965 progress = 0;
15966 buttonTranslate = 0;
15967 }
15968 $rightButtons.each(function (index, buttonEl) {
15969 var $buttonEl = $(buttonEl);
15970 if (typeof buttonEl.f7SwipeoutButtonOffset === 'undefined') {
15971 $buttonEl[0].f7SwipeoutButtonOffset = buttonEl.offsetLeft;
15972 }
15973 buttonOffset = buttonEl.f7SwipeoutButtonOffset;
15974 if ($overswipeRightButton.length > 0 && $buttonEl.hasClass('swipeout-overswipe') && direction === 'to-left') {
15975 $buttonEl.css({ left: ((overswipeRight ? -buttonOffset : 0) + "px") });
15976 if (overswipeRight) {
15977 if (!$buttonEl.hasClass('swipeout-overswipe-active')) {
15978 $swipeoutEl.trigger('swipeout:overswipeenter');
15979 app.emit('swipeoutOverswipeEnter', $swipeoutEl[0]);
15980 }
15981 $buttonEl.addClass('swipeout-overswipe-active');
15982 } else {
15983 if ($buttonEl.hasClass('swipeout-overswipe-active')) {
15984 $swipeoutEl.trigger('swipeout:overswipeexit');
15985 app.emit('swipeoutOverswipeExit', $swipeoutEl[0]);
15986 }
15987 $buttonEl.removeClass('swipeout-overswipe-active');
15988 }
15989 }
15990 $buttonEl.transform(("translate3d(" + (buttonTranslate - (buttonOffset * (1 + Math.max(progress, -1)))) + "px,0,0)"));
15991 });
15992 }
15993 if ($actionsLeft.length > 0) {
15994 // Show left actions
15995 var buttonTranslate$1 = translate;
15996 progress = buttonTranslate$1 / actionsLeftWidth;
15997 if (buttonTranslate$1 > actionsLeftWidth) {
15998 buttonTranslate$1 = actionsLeftWidth + (Math.pow( (buttonTranslate$1 - actionsLeftWidth), 0.8 ));
15999 translate = buttonTranslate$1;
16000 if ($overswipeLeftButton.length > 0) {
16001 overswipeLeft = true;
16002 }
16003 }
16004 if (direction !== 'to-right') {
16005 buttonTranslate$1 = 0;
16006 progress = 0;
16007 }
16008 $leftButtons.each(function (index, buttonEl) {
16009 var $buttonEl = $(buttonEl);
16010 if (typeof buttonEl.f7SwipeoutButtonOffset === 'undefined') {
16011 $buttonEl[0].f7SwipeoutButtonOffset = actionsLeftWidth - buttonEl.offsetLeft - buttonEl.offsetWidth;
16012 }
16013 buttonOffset = buttonEl.f7SwipeoutButtonOffset;
16014 if ($overswipeLeftButton.length > 0 && $buttonEl.hasClass('swipeout-overswipe') && direction === 'to-right') {
16015 $buttonEl.css({ left: ((overswipeLeft ? buttonOffset : 0) + "px") });
16016 if (overswipeLeft) {
16017 if (!$buttonEl.hasClass('swipeout-overswipe-active')) {
16018 $swipeoutEl.trigger('swipeout:overswipeenter');
16019 app.emit('swipeoutOverswipeEnter', $swipeoutEl[0]);
16020 }
16021 $buttonEl.addClass('swipeout-overswipe-active');
16022 } else {
16023 if ($buttonEl.hasClass('swipeout-overswipe-active')) {
16024 $swipeoutEl.trigger('swipeout:overswipeexit');
16025 app.emit('swipeoutOverswipeExit', $swipeoutEl[0]);
16026 }
16027 $buttonEl.removeClass('swipeout-overswipe-active');
16028 }
16029 }
16030 if ($leftButtons.length > 1) {
16031 $buttonEl.css('z-index', $leftButtons.length - index);
16032 }
16033 $buttonEl.transform(("translate3d(" + (buttonTranslate$1 + (buttonOffset * (1 - Math.min(progress, 1)))) + "px,0,0)"));
16034 });
16035 }
16036 $swipeoutEl.trigger('swipeout', progress);
16037 app.emit('swipeout', $swipeoutEl[0], progress);
16038 $swipeoutContent.transform(("translate3d(" + translate + "px,0,0)"));
16039 }
16040 function handleTouchEnd() {
16041 if (!isTouched || !isMoved) {
16042 isTouched = false;
16043 isMoved = false;
16044 return;
16045 }
16046
16047 isTouched = false;
16048 isMoved = false;
16049 var timeDiff = (new Date()).getTime() - touchStartTime;
16050 var $actions = direction === 'to-left' ? $actionsRight : $actionsLeft;
16051 var actionsWidth = direction === 'to-left' ? actionsRightWidth : actionsLeftWidth;
16052 var action;
16053 var $buttons;
16054 var i;
16055
16056 if (
16057 (
16058 timeDiff < 300
16059 && (
16060 (touchesDiff < -10 && direction === 'to-left')
16061 || (touchesDiff > 10 && direction === 'to-right')
16062 )
16063 )
16064 || (
16065 timeDiff >= 300
16066 && (Math.abs(translate) > actionsWidth / 2)
16067 )
16068 ) {
16069 action = 'open';
16070 } else {
16071 action = 'close';
16072 }
16073 if (timeDiff < 300) {
16074 if (Math.abs(translate) === 0) { action = 'close'; }
16075 if (Math.abs(translate) === actionsWidth) { action = 'open'; }
16076 }
16077
16078 if (action === 'open') {
16079 Swipeout.el = $swipeoutEl[0];
16080 $swipeoutEl.trigger('swipeout:open');
16081 app.emit('swipeoutOpen', $swipeoutEl[0]);
16082 $swipeoutEl.addClass('swipeout-opened swipeout-transitioning');
16083 var newTranslate = direction === 'to-left' ? -actionsWidth : actionsWidth;
16084 $swipeoutContent.transform(("translate3d(" + newTranslate + "px,0,0)"));
16085 $actions.addClass('swipeout-actions-opened');
16086 $buttons = direction === 'to-left' ? $rightButtons : $leftButtons;
16087 if ($buttons) {
16088 for (i = 0; i < $buttons.length; i += 1) {
16089 $($buttons[i]).transform(("translate3d(" + newTranslate + "px,0,0)"));
16090 }
16091 }
16092 if (overswipeRight) {
16093 $actionsRight.find('.swipeout-overswipe')[0].click();
16094 }
16095 if (overswipeLeft) {
16096 $actionsLeft.find('.swipeout-overswipe')[0].click();
16097 }
16098 } else {
16099 $swipeoutEl.trigger('swipeout:close');
16100 app.emit('swipeoutClose', $swipeoutEl[0]);
16101 Swipeout.el = undefined;
16102 $swipeoutEl.addClass('swipeout-transitioning').removeClass('swipeout-opened');
16103 $swipeoutContent.transform('');
16104 $actions.removeClass('swipeout-actions-opened');
16105 }
16106
16107 var buttonOffset;
16108 if ($leftButtons && $leftButtons.length > 0 && $leftButtons !== $buttons) {
16109 $leftButtons.each(function (index, buttonEl) {
16110 var $buttonEl = $(buttonEl);
16111 buttonOffset = buttonEl.f7SwipeoutButtonOffset;
16112 if (typeof buttonOffset === 'undefined') {
16113 $buttonEl[0].f7SwipeoutButtonOffset = actionsLeftWidth - buttonEl.offsetLeft - buttonEl.offsetWidth;
16114 }
16115 $buttonEl.transform(("translate3d(" + buttonOffset + "px,0,0)"));
16116 });
16117 }
16118 if ($rightButtons && $rightButtons.length > 0 && $rightButtons !== $buttons) {
16119 $rightButtons.each(function (index, buttonEl) {
16120 var $buttonEl = $(buttonEl);
16121 buttonOffset = buttonEl.f7SwipeoutButtonOffset;
16122 if (typeof buttonOffset === 'undefined') {
16123 $buttonEl[0].f7SwipeoutButtonOffset = buttonEl.offsetLeft;
16124 }
16125 $buttonEl.transform(("translate3d(" + (-buttonOffset) + "px,0,0)"));
16126 });
16127 }
16128 $swipeoutContent.transitionEnd(function () {
16129 if ((opened && action === 'open') || (!opened && action === 'close')) { return; }
16130 $swipeoutEl.trigger(action === 'open' ? 'swipeout:opened' : 'swipeout:closed');
16131 app.emit(action === 'open' ? 'swipeoutOpened' : 'swipeoutClosed', $swipeoutEl[0]);
16132 $swipeoutEl.removeClass('swipeout-transitioning');
16133 if (opened && action === 'close') {
16134 if ($actionsRight.length > 0) {
16135 $rightButtons.transform('');
16136 }
16137 if ($actionsLeft.length > 0) {
16138 $leftButtons.transform('');
16139 }
16140 }
16141 });
16142 }
16143
16144 var passiveListener = app.support.passiveListener ? { passive: true } : false;
16145
16146 app.on('touchstart', function (e) {
16147 if (Swipeout.el) {
16148 var $targetEl = $(e.target);
16149 if (!(
16150 $(Swipeout.el).is($targetEl[0])
16151 || $targetEl.parents('.swipeout').is(Swipeout.el)
16152 || $targetEl.hasClass('modal-in')
16153 || ($targetEl.attr('class') || '').indexOf('-backdrop') > 0
16154 || $targetEl.hasClass('actions-modal')
16155 || $targetEl.parents('.actions-modal.modal-in, .dialog.modal-in').length > 0
16156 )) {
16157 app.swipeout.close(Swipeout.el);
16158 }
16159 }
16160 });
16161 $(doc).on(app.touchEvents.start, 'li.swipeout', handleTouchStart, passiveListener);
16162 app.on('touchmove:active', handleTouchMove);
16163 app.on('touchend:passive', handleTouchEnd);
16164 },
16165 allow: true,
16166 el: undefined,
16167 open: function open() {
16168 var assign;
16169
16170 var args = [], len = arguments.length;
16171 while ( len-- ) args[ len ] = arguments[ len ];
16172 var app = this;
16173 var el = args[0];
16174 var side = args[1];
16175 var callback = args[2];
16176 if (typeof args[1] === 'function') {
16177 (assign = args, el = assign[0], callback = assign[1], side = assign[2]);
16178 }
16179 var $el = $(el).eq(0);
16180
16181 if ($el.length === 0) { return; }
16182 if (!$el.hasClass('swipeout') || $el.hasClass('swipeout-opened')) { return; }
16183 if (!side) {
16184 if ($el.find('.swipeout-actions-right').length > 0) { side = 'right'; }
16185 else { side = 'left'; }
16186 }
16187 var $swipeoutActions = $el.find((".swipeout-actions-" + side));
16188 var $swipeoutContent = $el.find('.swipeout-content');
16189 if ($swipeoutActions.length === 0) { return; }
16190 $el.trigger('swipeout:open').addClass('swipeout-opened').removeClass('swipeout-transitioning');
16191 app.emit('swipeoutOpen', $el[0]);
16192 $swipeoutActions.addClass('swipeout-actions-opened');
16193 var $buttons = $swipeoutActions.children('a');
16194 var swipeoutActionsWidth = $swipeoutActions.outerWidth();
16195 var translate = side === 'right' ? -swipeoutActionsWidth : swipeoutActionsWidth;
16196 if ($buttons.length > 1) {
16197 $buttons.each(function (buttonIndex, buttonEl) {
16198 var $buttonEl = $(buttonEl);
16199 if (side === 'right') {
16200 $buttonEl.transform(("translate3d(" + (-buttonEl.offsetLeft) + "px,0,0)"));
16201 } else {
16202 $buttonEl.css('z-index', $buttons.length - buttonIndex).transform(("translate3d(" + (swipeoutActionsWidth - buttonEl.offsetWidth - buttonEl.offsetLeft) + "px,0,0)"));
16203 }
16204 });
16205 }
16206 $el.addClass('swipeout-transitioning');
16207 $swipeoutContent.transitionEnd(function () {
16208 $el.trigger('swipeout:opened');
16209 app.emit('swipeoutOpened', $el[0]);
16210 if (callback) { callback.call($el[0]); }
16211 });
16212 Utils.nextFrame(function () {
16213 $buttons.transform(("translate3d(" + translate + "px,0,0)"));
16214 $swipeoutContent.transform(("translate3d(" + translate + "px,0,0)"));
16215 });
16216 Swipeout.el = $el[0];
16217 },
16218 close: function close(el, callback) {
16219 var app = this;
16220 var $el = $(el).eq(0);
16221 if ($el.length === 0) { return; }
16222 if (!$el.hasClass('swipeout-opened')) { return; }
16223 var side = $el.find('.swipeout-actions-opened').hasClass('swipeout-actions-right') ? 'right' : 'left';
16224 var $swipeoutActions = $el.find('.swipeout-actions-opened').removeClass('swipeout-actions-opened');
16225 var $buttons = $swipeoutActions.children('a');
16226 var swipeoutActionsWidth = $swipeoutActions.outerWidth();
16227 Swipeout.allow = false;
16228 $el.trigger('swipeout:close');
16229 app.emit('swipeoutClose', $el[0]);
16230 $el.removeClass('swipeout-opened').addClass('swipeout-transitioning');
16231
16232 var closeTimeout;
16233 function onSwipeoutClose() {
16234 Swipeout.allow = true;
16235 if ($el.hasClass('swipeout-opened')) { return; }
16236 $el.removeClass('swipeout-transitioning');
16237 $buttons.transform('');
16238 $el.trigger('swipeout:closed');
16239 app.emit('swipeoutClosed', $el[0]);
16240 if (callback) { callback.call($el[0]); }
16241 if (closeTimeout) { clearTimeout(closeTimeout); }
16242 }
16243 $el.find('.swipeout-content').transform('').transitionEnd(onSwipeoutClose);
16244 closeTimeout = setTimeout(onSwipeoutClose, 500);
16245
16246 $buttons.each(function (index, buttonEl) {
16247 var $buttonEl = $(buttonEl);
16248 if (side === 'right') {
16249 $buttonEl.transform(("translate3d(" + (-buttonEl.offsetLeft) + "px,0,0)"));
16250 } else {
16251 $buttonEl.transform(("translate3d(" + (swipeoutActionsWidth - buttonEl.offsetWidth - buttonEl.offsetLeft) + "px,0,0)"));
16252 }
16253 $buttonEl.css({ left: '0px' }).removeClass('swipeout-overswipe-active');
16254 });
16255 if (Swipeout.el && Swipeout.el === $el[0]) { Swipeout.el = undefined; }
16256 },
16257 delete: function delete$1(el, callback) {
16258 var app = this;
16259 var $el = $(el).eq(0);
16260 if ($el.length === 0) { return; }
16261 Swipeout.el = undefined;
16262 $el.trigger('swipeout:delete');
16263 app.emit('swipeoutDelete', $el[0]);
16264 $el.css({ height: (($el.outerHeight()) + "px") });
16265 $el.transitionEnd(function () {
16266 $el.trigger('swipeout:deleted');
16267 app.emit('swipeoutDeleted', $el[0]);
16268 if (callback) { callback.call($el[0]); }
16269 if ($el.parents('.virtual-list').length > 0) {
16270 var virtualList = $el.parents('.virtual-list')[0].f7VirtualList;
16271 var virtualIndex = $el[0].f7VirtualListIndex;
16272 if (virtualList && typeof virtualIndex !== 'undefined') { virtualList.deleteItem(virtualIndex); }
16273 } else if (app.params.swipeout.removeElements) {
16274 if (app.params.swipeout.removeElementsWithTimeout) {
16275 setTimeout(function () {
16276 $el.remove();
16277 }, app.params.swipeout.removeElementsTimeout);
16278 } else {
16279 $el.remove();
16280 }
16281 } else {
16282 $el.removeClass('swipeout-deleting swipeout-transitioning');
16283 }
16284 });
16285 // eslint-disable-next-line
16286 // $el[0]._clientLeft = $el[0].clientLeft;
16287 Utils.nextFrame(function () {
16288 $el
16289 .addClass('swipeout-deleting swipeout-transitioning')
16290 .css({ height: '0px' })
16291 .find('.swipeout-content')
16292 .transform('translate3d(-100%,0,0)');
16293 });
16294 },
16295 };
16296 var Swipeout$1 = {
16297 name: 'swipeout',
16298 params: {
16299 swipeout: {
16300 actionsNoFold: false,
16301 noFollow: false,
16302 removeElements: true,
16303 removeElementsWithTimeout: false,
16304 removeElementsTimeout: 0,
16305 },
16306 },
16307 create: function create() {
16308 var app = this;
16309 Utils.extend(app, {
16310 swipeout: {
16311 init: Swipeout.init.bind(app),
16312 open: Swipeout.open.bind(app),
16313 close: Swipeout.close.bind(app),
16314 delete: Swipeout.delete.bind(app),
16315 },
16316 });
16317 Object.defineProperty(app.swipeout, 'el', {
16318 enumerable: true,
16319 configurable: true,
16320 get: function () { return Swipeout.el; },
16321 set: function set(el) {
16322 Swipeout.el = el;
16323 },
16324 });
16325 Object.defineProperty(app.swipeout, 'allow', {
16326 enumerable: true,
16327 configurable: true,
16328 get: function () { return Swipeout.allow; },
16329 set: function set(allow) {
16330 Swipeout.allow = allow;
16331 },
16332 });
16333 },
16334 clicks: {
16335 '.swipeout-open': function openSwipeout($clickedEl, data) {
16336 if ( data === void 0 ) data = {};
16337
16338 var app = this;
16339 app.swipeout.open(data.swipeout, data.side);
16340 },
16341 '.swipeout-close': function closeSwipeout($clickedEl) {
16342 var app = this;
16343 var $swipeoutEl = $clickedEl.closest('.swipeout');
16344 if ($swipeoutEl.length === 0) { return; }
16345 app.swipeout.close($swipeoutEl);
16346 },
16347 '.swipeout-delete': function deleteSwipeout($clickedEl, data) {
16348 if ( data === void 0 ) data = {};
16349
16350 var app = this;
16351 var $swipeoutEl = $clickedEl.closest('.swipeout');
16352 if ($swipeoutEl.length === 0) { return; }
16353 var confirm = data.confirm;
16354 var confirmTitle = data.confirmTitle;
16355 if (data.confirm) {
16356 app.dialog.confirm(confirm, confirmTitle, function () {
16357 app.swipeout.delete($swipeoutEl);
16358 });
16359 } else {
16360 app.swipeout.delete($swipeoutEl);
16361 }
16362 },
16363 },
16364 on: {
16365 init: function init() {
16366 var app = this;
16367 if (!app.params.swipeout) { return; }
16368 app.swipeout.init();
16369 },
16370 },
16371 };
16372
5309fbda
DC
16373 var Accordion = {
16374 toggleClicked: function toggleClicked($clickedEl) {
16375 var app = this;
16376 var $accordionItemEl = $clickedEl.closest('.accordion-item').eq(0);
16377 if (!$accordionItemEl.length) { $accordionItemEl = $clickedEl.parents('li').eq(0); }
16378
16379 var $accordionContent = $clickedEl.parents('.accordion-item-content').eq(0);
16380 if ($accordionContent.length) {
16381 if ($accordionContent.parents($accordionItemEl).length) { return; }
16382 }
16383
16384 if ($clickedEl.parents('li').length > 1 && $clickedEl.parents('li')[0] !== $accordionItemEl[0]) { return; }
16385 app.accordion.toggle($accordionItemEl);
16386 },
16387 open: function open(el) {
16388 var app = this;
16389 var $el = $(el);
16390 var prevented = false;
16391 function prevent() {
16392 prevented = true;
16393 }
16394 $el.trigger('accordion:beforeopen', { prevent: prevent }, prevent);
16395 app.emit('accordionBeforeOpen', $el[0], prevent);
16396 if (prevented) { return; }
16397 var $list = $el.parents('.accordion-list').eq(0);
16398 var $contentEl = $el.children('.accordion-item-content');
16399 $contentEl.removeAttr('aria-hidden');
16400 if ($contentEl.length === 0) { $contentEl = $el.find('.accordion-item-content'); }
16401 if ($contentEl.length === 0) { return; }
16402 var $openedItem = $list.length > 0 && $el.parent().children('.accordion-item-opened');
16403 if ($openedItem.length > 0) {
16404 app.accordion.close($openedItem);
16405 }
16406 $contentEl.transitionEnd(function () {
16407 if ($el.hasClass('accordion-item-opened')) {
16408 $contentEl.transition(0);
16409 $contentEl.css('height', 'auto');
16410 Utils.nextFrame(function () {
16411 $contentEl.transition('');
16412 $el.trigger('accordion:opened');
16413 app.emit('accordionOpened', $el[0]);
16414 });
16415 } else {
16416 $contentEl.css('height', '');
16417 $el.trigger('accordion:closed');
16418 app.emit('accordionClosed', $el[0]);
16419 }
16420 });
16421 $contentEl.css('height', (($contentEl[0].scrollHeight) + "px"));
16422 $el.trigger('accordion:open');
16423 $el.addClass('accordion-item-opened');
16424 app.emit('accordionOpen', $el[0]);
16425 },
16426 close: function close(el) {
16427 var app = this;
16428 var $el = $(el);
16429 var prevented = false;
16430 function prevent() {
16431 prevented = true;
16432 }
16433 $el.trigger('accordion:beforeclose', { prevent: prevent }, prevent);
16434 app.emit('accordionBeforeClose', $el[0], prevent);
16435 if (prevented) { return; }
16436 var $contentEl = $el.children('.accordion-item-content');
16437 if ($contentEl.length === 0) { $contentEl = $el.find('.accordion-item-content'); }
16438 $el.removeClass('accordion-item-opened');
16439 $contentEl.attr('aria-hidden', true);
16440 $contentEl.transition(0);
16441 $contentEl.css('height', (($contentEl[0].scrollHeight) + "px"));
16442 // Close
16443 $contentEl.transitionEnd(function () {
16444 if ($el.hasClass('accordion-item-opened')) {
16445 $contentEl.transition(0);
16446 $contentEl.css('height', 'auto');
16447 Utils.nextFrame(function () {
16448 $contentEl.transition('');
16449 $el.trigger('accordion:opened');
16450 app.emit('accordionOpened', $el[0]);
16451 });
16452 } else {
16453 $contentEl.css('height', '');
16454 $el.trigger('accordion:closed');
16455 app.emit('accordionClosed', $el[0]);
16456 }
16457 });
16458 Utils.nextFrame(function () {
16459 $contentEl.transition('');
16460 $contentEl.css('height', '');
16461 $el.trigger('accordion:close');
16462 app.emit('accordionClose', $el[0]);
16463 });
16464 },
16465 toggle: function toggle(el) {
16466 var app = this;
16467 var $el = $(el);
16468 if ($el.length === 0) { return; }
16469 if ($el.hasClass('accordion-item-opened')) { app.accordion.close(el); }
16470 else { app.accordion.open(el); }
16471 },
16472 };
16473
16474 var Accordion$1 = {
16475 name: 'accordion',
16476 create: function create() {
16477 var app = this;
16478 Utils.extend(app, {
16479 accordion: {
16480 open: Accordion.open.bind(app),
16481 close: Accordion.close.bind(app),
16482 toggle: Accordion.toggle.bind(app),
16483 },
16484 });
16485 },
16486 clicks: {
16487 '.accordion-item .item-link, .accordion-item-toggle, .links-list.accordion-list > ul > li > a': function open($clickedEl) {
16488 var app = this;
16489 Accordion.toggleClicked.call(app, $clickedEl);
16490 },
16491 },
16492 };
16493
16494 var ContactsList = {
16495 name: 'contactsList',
16496 };
16497
5d51ea26 16498 var VirtualList = /*@__PURE__*/(function (Framework7Class) {
5309fbda
DC
16499 function VirtualList(app, params) {
16500 if ( params === void 0 ) params = {};
16501
5d51ea26 16502 Framework7Class.call(this, params, [app]);
5309fbda
DC
16503 var vl = this;
16504
5d51ea26
DC
16505 var defaultHeight;
16506 if (app.theme === 'md') {
16507 defaultHeight = 48;
16508 } else if (app.theme === 'ios') {
16509 defaultHeight = 44;
16510 } else if (app.theme === 'aurora') {
16511 defaultHeight = 38;
16512 }
16513
5309fbda
DC
16514 var defaults = {
16515 cols: 1,
5d51ea26 16516 height: defaultHeight,
5309fbda
DC
16517 cache: true,
16518 dynamicHeightBufferSize: 1,
16519 showFilteredItemsOnly: false,
16520 renderExternal: undefined,
16521 setListHeight: true,
16522 searchByItem: undefined,
16523 searchAll: undefined,
16524 itemTemplate: undefined,
16525 ul: null,
16526 createUl: true,
5d51ea26 16527 scrollableParentEl: undefined,
5309fbda
DC
16528 renderItem: function renderItem(item) {
16529 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();
16530 },
16531 on: {},
16532 };
16533
16534 // Extend defaults with modules params
16535 vl.useModulesParams(defaults);
16536
16537 vl.params = Utils.extend(defaults, params);
16538 if (vl.params.height === undefined || !vl.params.height) {
5d51ea26 16539 vl.params.height = defaultHeight;
5309fbda
DC
16540 }
16541
16542 vl.$el = $(params.el);
16543 vl.el = vl.$el[0];
16544
16545 if (vl.$el.length === 0) { return undefined; }
16546 vl.$el[0].f7VirtualList = vl;
16547
16548 vl.items = vl.params.items;
16549 if (vl.params.showFilteredItemsOnly) {
16550 vl.filteredItems = [];
16551 }
16552 if (vl.params.itemTemplate) {
16553 if (typeof vl.params.itemTemplate === 'string') { vl.renderItem = app.t7.compile(vl.params.itemTemplate); }
16554 else if (typeof vl.params.itemTemplate === 'function') { vl.renderItem = vl.params.itemTemplate; }
16555 } else if (vl.params.renderItem) {
16556 vl.renderItem = vl.params.renderItem;
16557 }
16558 vl.$pageContentEl = vl.$el.parents('.page-content');
16559 vl.pageContentEl = vl.$pageContentEl[0];
16560
5d51ea26
DC
16561 vl.$scrollableParentEl = vl.params.scrollableParentEl ? $(vl.params.scrollableParentEl).eq(0) : vl.$pageContentEl;
16562 if (!vl.$scrollableParentEl.length && vl.$pageContentEl.length) {
16563 vl.$scrollableParentEl = vl.$pageContentEl;
16564 }
16565 vl.scrollableParentEl = vl.$scrollableParentEl[0];
16566
5309fbda
DC
16567 // Bad scroll
16568 if (typeof vl.params.updatableScroll !== 'undefined') {
16569 vl.updatableScroll = vl.params.updatableScroll;
16570 } else {
16571 vl.updatableScroll = true;
16572 if (Device.ios && Device.osVersion.split('.')[0] < 8) {
16573 vl.updatableScroll = false;
16574 }
16575 }
16576
16577 // Append <ul>
16578 var ul = vl.params.ul;
16579 vl.$ul = ul ? $(vl.params.ul) : vl.$el.children('ul');
16580 if (vl.$ul.length === 0 && vl.params.createUl) {
16581 vl.$el.append('<ul></ul>');
16582 vl.$ul = vl.$el.children('ul');
16583 }
16584 vl.ul = vl.$ul[0];
16585
16586 var $itemsWrapEl;
16587 if (!vl.ul && !vl.params.createUl) { $itemsWrapEl = vl.$el; }
16588 else { $itemsWrapEl = vl.$ul; }
16589
16590 Utils.extend(vl, {
16591 $itemsWrapEl: $itemsWrapEl,
16592 itemsWrapEl: $itemsWrapEl[0],
16593 // DOM cached items
16594 domCache: {},
16595 displayDomCache: {},
16596 // Temporary DOM Element
16597 tempDomElement: doc.createElement('ul'),
16598 // Last repain position
16599 lastRepaintY: null,
16600 // Fragment
16601 fragment: doc.createDocumentFragment(),
16602 // Props
16603 pageHeight: undefined,
16604 rowsPerScreen: undefined,
16605 rowsBefore: undefined,
16606 rowsAfter: undefined,
16607 rowsToRender: undefined,
16608 maxBufferHeight: 0,
16609 listHeight: undefined,
16610 dynamicHeight: typeof vl.params.height === 'function',
16611 });
16612
16613 // Install Modules
16614 vl.useModules();
16615
16616 // Attach events
16617 var handleScrollBound = vl.handleScroll.bind(vl);
16618 var handleResizeBound = vl.handleResize.bind(vl);
16619 var $pageEl;
16620 var $tabEl;
16621 var $panelEl;
16622 var $popupEl;
16623 vl.attachEvents = function attachEvents() {
16624 $pageEl = vl.$el.parents('.page').eq(0);
16625 $tabEl = vl.$el.parents('.tab').eq(0);
16626 $panelEl = vl.$el.parents('.panel').eq(0);
16627 $popupEl = vl.$el.parents('.popup').eq(0);
16628
5d51ea26 16629 vl.$scrollableParentEl.on('scroll', handleScrollBound);
5309fbda
DC
16630 if ($pageEl) { $pageEl.on('page:reinit', handleResizeBound); }
16631 if ($tabEl) { $tabEl.on('tab:show', handleResizeBound); }
16632 if ($panelEl) { $panelEl.on('panel:open', handleResizeBound); }
16633 if ($popupEl) { $popupEl.on('popup:open', handleResizeBound); }
16634 app.on('resize', handleResizeBound);
16635 };
16636 vl.detachEvents = function attachEvents() {
5d51ea26 16637 vl.$scrollableParentEl.off('scroll', handleScrollBound);
5309fbda
DC
16638 if ($pageEl) { $pageEl.off('page:reinit', handleResizeBound); }
16639 if ($tabEl) { $tabEl.off('tab:show', handleResizeBound); }
16640 if ($panelEl) { $panelEl.off('panel:open', handleResizeBound); }
16641 if ($popupEl) { $popupEl.off('popup:open', handleResizeBound); }
16642 app.off('resize', handleResizeBound);
16643 };
16644 // Init
16645 vl.init();
16646
16647 return vl;
16648 }
16649
5d51ea26
DC
16650 if ( Framework7Class ) VirtualList.__proto__ = Framework7Class;
16651 VirtualList.prototype = Object.create( Framework7Class && Framework7Class.prototype );
5309fbda
DC
16652 VirtualList.prototype.constructor = VirtualList;
16653
16654 VirtualList.prototype.setListSize = function setListSize () {
16655 var vl = this;
16656 var items = vl.filteredItems || vl.items;
5d51ea26 16657 vl.pageHeight = vl.$scrollableParentEl[0].offsetHeight;
5309fbda
DC
16658 if (vl.dynamicHeight) {
16659 vl.listHeight = 0;
16660 vl.heights = [];
16661 for (var i = 0; i < items.length; i += 1) {
16662 var itemHeight = vl.params.height(items[i]);
16663 vl.listHeight += itemHeight;
16664 vl.heights.push(itemHeight);
16665 }
16666 } else {
16667 vl.listHeight = Math.ceil(items.length / vl.params.cols) * vl.params.height;
16668 vl.rowsPerScreen = Math.ceil(vl.pageHeight / vl.params.height);
16669 vl.rowsBefore = vl.params.rowsBefore || vl.rowsPerScreen * 2;
16670 vl.rowsAfter = vl.params.rowsAfter || vl.rowsPerScreen;
16671 vl.rowsToRender = (vl.rowsPerScreen + vl.rowsBefore + vl.rowsAfter);
16672 vl.maxBufferHeight = (vl.rowsBefore / 2) * vl.params.height;
16673 }
16674
16675 if (vl.updatableScroll || vl.params.setListHeight) {
16676 vl.$itemsWrapEl.css({ height: ((vl.listHeight) + "px") });
16677 }
16678 };
16679
16680 VirtualList.prototype.render = function render (force, forceScrollTop) {
16681 var vl = this;
16682 if (force) { vl.lastRepaintY = null; }
16683
5d51ea26 16684 var scrollTop = -(vl.$el[0].getBoundingClientRect().top - vl.$scrollableParentEl[0].getBoundingClientRect().top);
5309fbda
DC
16685
16686 if (typeof forceScrollTop !== 'undefined') { scrollTop = forceScrollTop; }
5d51ea26 16687 if (vl.lastRepaintY === null || Math.abs(scrollTop - vl.lastRepaintY) > vl.maxBufferHeight || (!vl.updatableScroll && (vl.$scrollableParentEl[0].scrollTop + vl.pageHeight >= vl.$scrollableParentEl[0].scrollHeight))) {
5309fbda
DC
16688 vl.lastRepaintY = scrollTop;
16689 } else {
16690 return;
16691 }
16692
16693 var items = vl.filteredItems || vl.items;
16694 var fromIndex;
16695 var toIndex;
16696 var heightBeforeFirstItem = 0;
16697 var heightBeforeLastItem = 0;
16698 if (vl.dynamicHeight) {
16699 var itemTop = 0;
16700 var itemHeight;
16701 vl.maxBufferHeight = vl.pageHeight;
16702
16703 for (var j = 0; j < vl.heights.length; j += 1) {
16704 itemHeight = vl.heights[j];
16705 if (typeof fromIndex === 'undefined') {
16706 if (itemTop + itemHeight >= scrollTop - (vl.pageHeight * 2 * vl.params.dynamicHeightBufferSize)) { fromIndex = j; }
16707 else { heightBeforeFirstItem += itemHeight; }
16708 }
16709
16710 if (typeof toIndex === 'undefined') {
16711 if (itemTop + itemHeight >= scrollTop + (vl.pageHeight * 2 * vl.params.dynamicHeightBufferSize) || j === vl.heights.length - 1) { toIndex = j + 1; }
16712 heightBeforeLastItem += itemHeight;
16713 }
16714 itemTop += itemHeight;
16715 }
16716 toIndex = Math.min(toIndex, items.length);
16717 } else {
16718 fromIndex = (parseInt(scrollTop / vl.params.height, 10) - vl.rowsBefore) * vl.params.cols;
16719 if (fromIndex < 0) {
16720 fromIndex = 0;
16721 }
16722 toIndex = Math.min(fromIndex + (vl.rowsToRender * vl.params.cols), items.length);
16723 }
16724
16725 var topPosition;
16726 var renderExternalItems = [];
16727 vl.reachEnd = false;
16728 var i;
16729 for (i = fromIndex; i < toIndex; i += 1) {
16730 var itemEl = (void 0);
16731 // Define real item index
16732 var index = vl.items.indexOf(items[i]);
16733
16734 if (i === fromIndex) { vl.currentFromIndex = index; }
16735 if (i === toIndex - 1) { vl.currentToIndex = index; }
16736 if (vl.filteredItems) {
16737 if (vl.items[index] === vl.filteredItems[vl.filteredItems.length - 1]) { vl.reachEnd = true; }
16738 } else if (index === vl.items.length - 1) { vl.reachEnd = true; }
16739
16740 // Find items
16741 if (vl.params.renderExternal) {
16742 renderExternalItems.push(items[i]);
16743 } else if (vl.domCache[index]) {
16744 itemEl = vl.domCache[index];
16745 itemEl.f7VirtualListIndex = index;
16746 } else {
16747 if (vl.renderItem) {
16748 vl.tempDomElement.innerHTML = vl.renderItem(items[i], index).trim();
16749 } else {
16750 vl.tempDomElement.innerHTML = items[i].toString().trim();
16751 }
16752 itemEl = vl.tempDomElement.childNodes[0];
16753 if (vl.params.cache) { vl.domCache[index] = itemEl; }
16754 itemEl.f7VirtualListIndex = index;
16755 }
16756
16757 // Set item top position
16758 if (i === fromIndex) {
16759 if (vl.dynamicHeight) {
16760 topPosition = heightBeforeFirstItem;
16761 } else {
16762 topPosition = ((i * vl.params.height) / vl.params.cols);
16763 }
16764 }
16765 if (!vl.params.renderExternal) {
16766 itemEl.style.top = topPosition + "px";
16767
16768 // Before item insert
16769 vl.emit('local::itemBeforeInsert vlItemBeforeInsert', vl, itemEl, items[i]);
16770
16771 // Append item to fragment
16772 vl.fragment.appendChild(itemEl);
16773 }
16774 }
16775
16776 // Update list height with not updatable scroll
16777 if (!vl.updatableScroll) {
16778 if (vl.dynamicHeight) {
16779 vl.itemsWrapEl.style.height = heightBeforeLastItem + "px";
16780 } else {
16781 vl.itemsWrapEl.style.height = ((i * vl.params.height) / vl.params.cols) + "px";
16782 }
16783 }
16784
16785 // Update list html
16786 if (vl.params.renderExternal) {
16787 if (items && items.length === 0) {
16788 vl.reachEnd = true;
16789 }
16790 } else {
16791 vl.emit('local::beforeClear vlBeforeClear', vl, vl.fragment);
16792 vl.itemsWrapEl.innerHTML = '';
16793
16794 vl.emit('local::itemsBeforeInsert vlItemsBeforeInsert', vl, vl.fragment);
16795
16796 if (items && items.length === 0) {
16797 vl.reachEnd = true;
16798 if (vl.params.emptyTemplate) { vl.itemsWrapEl.innerHTML = vl.params.emptyTemplate; }
16799 } else {
16800 vl.itemsWrapEl.appendChild(vl.fragment);
16801 }
16802
16803 vl.emit('local::itemsAfterInsert vlItemsAfterInsert', vl, vl.fragment);
16804 }
16805
16806 if (typeof forceScrollTop !== 'undefined' && force) {
5d51ea26 16807 vl.$scrollableParentEl.scrollTop(forceScrollTop, 0);
5309fbda
DC
16808 }
16809 if (vl.params.renderExternal) {
16810 vl.params.renderExternal(vl, {
16811 fromIndex: fromIndex,
16812 toIndex: toIndex,
16813 listHeight: vl.listHeight,
16814 topPosition: topPosition,
16815 items: renderExternalItems,
16816 });
16817 }
16818 };
16819
16820 // Filter
16821 VirtualList.prototype.filterItems = function filterItems (indexes, resetScrollTop) {
16822 if ( resetScrollTop === void 0 ) resetScrollTop = true;
16823
16824 var vl = this;
16825 vl.filteredItems = [];
16826 for (var i = 0; i < indexes.length; i += 1) {
16827 vl.filteredItems.push(vl.items[indexes[i]]);
16828 }
16829 if (resetScrollTop) {
5d51ea26 16830 vl.$scrollableParentEl[0].scrollTop = 0;
5309fbda
DC
16831 }
16832 vl.update();
16833 };
16834
16835 VirtualList.prototype.resetFilter = function resetFilter () {
16836 var vl = this;
16837 if (vl.params.showFilteredItemsOnly) {
16838 vl.filteredItems = [];
16839 } else {
16840 vl.filteredItems = null;
16841 delete vl.filteredItems;
16842 }
16843 vl.update();
16844 };
16845
16846 VirtualList.prototype.scrollToItem = function scrollToItem (index) {
16847 var vl = this;
16848 if (index > vl.items.length) { return false; }
16849 var itemTop = 0;
16850 if (vl.dynamicHeight) {
16851 for (var i = 0; i < index; i += 1) {
16852 itemTop += vl.heights[i];
16853 }
16854 } else {
16855 itemTop = index * vl.params.height;
16856 }
16857 var listTop = vl.$el[0].offsetTop;
5d51ea26 16858 vl.render(true, (listTop + itemTop) - parseInt(vl.$scrollableParentEl.css('padding-top'), 10));
5309fbda
DC
16859 return true;
16860 };
16861
16862 VirtualList.prototype.handleScroll = function handleScroll () {
16863 var vl = this;
16864 vl.render();
16865 };
16866
16867 // Handle resize event
16868 VirtualList.prototype.isVisible = function isVisible () {
16869 var vl = this;
16870 return !!(vl.el.offsetWidth || vl.el.offsetHeight || vl.el.getClientRects().length);
16871 };
16872
16873 VirtualList.prototype.handleResize = function handleResize () {
16874 var vl = this;
16875 if (vl.isVisible()) {
16876 vl.setListSize();
16877 vl.render(true);
16878 }
16879 };
16880
16881 // Append
16882 VirtualList.prototype.appendItems = function appendItems (items) {
16883 var vl = this;
16884 for (var i = 0; i < items.length; i += 1) {
16885 vl.items.push(items[i]);
16886 }
16887 vl.update();
16888 };
16889
16890 VirtualList.prototype.appendItem = function appendItem (item) {
16891 var vl = this;
16892 vl.appendItems([item]);
16893 };
16894
16895 // Replace
16896 VirtualList.prototype.replaceAllItems = function replaceAllItems (items) {
16897 var vl = this;
16898 vl.items = items;
16899 delete vl.filteredItems;
16900 vl.domCache = {};
16901 vl.update();
16902 };
16903
16904 VirtualList.prototype.replaceItem = function replaceItem (index, item) {
16905 var vl = this;
16906 vl.items[index] = item;
16907 if (vl.params.cache) { delete vl.domCache[index]; }
16908 vl.update();
16909 };
16910
16911 // Prepend
16912 VirtualList.prototype.prependItems = function prependItems (items) {
16913 var vl = this;
16914 for (var i = items.length - 1; i >= 0; i -= 1) {
16915 vl.items.unshift(items[i]);
16916 }
16917 if (vl.params.cache) {
16918 var newCache = {};
16919 Object.keys(vl.domCache).forEach(function (cached) {
16920 newCache[parseInt(cached, 10) + items.length] = vl.domCache[cached];
16921 });
16922 vl.domCache = newCache;
16923 }
16924 vl.update();
16925 };
16926
16927 VirtualList.prototype.prependItem = function prependItem (item) {
16928 var vl = this;
16929 vl.prependItems([item]);
16930 };
16931
16932 // Move
16933 VirtualList.prototype.moveItem = function moveItem (from, to) {
16934 var vl = this;
16935 var fromIndex = from;
16936 var toIndex = to;
16937 if (fromIndex === toIndex) { return; }
16938 // remove item from array
16939 var item = vl.items.splice(fromIndex, 1)[0];
16940 if (toIndex >= vl.items.length) {
16941 // Add item to the end
16942 vl.items.push(item);
16943 toIndex = vl.items.length - 1;
16944 } else {
16945 // Add item to new index
16946 vl.items.splice(toIndex, 0, item);
16947 }
16948 // Update cache
16949 if (vl.params.cache) {
16950 var newCache = {};
16951 Object.keys(vl.domCache).forEach(function (cached) {
16952 var cachedIndex = parseInt(cached, 10);
16953 var leftIndex = fromIndex < toIndex ? fromIndex : toIndex;
16954 var rightIndex = fromIndex < toIndex ? toIndex : fromIndex;
16955 var indexShift = fromIndex < toIndex ? -1 : 1;
16956 if (cachedIndex < leftIndex || cachedIndex > rightIndex) { newCache[cachedIndex] = vl.domCache[cachedIndex]; }
16957 if (cachedIndex === leftIndex) { newCache[rightIndex] = vl.domCache[cachedIndex]; }
16958 if (cachedIndex > leftIndex && cachedIndex <= rightIndex) { newCache[cachedIndex + indexShift] = vl.domCache[cachedIndex]; }
16959 });
16960 vl.domCache = newCache;
16961 }
16962 vl.update();
16963 };
16964
16965 // Insert before
16966 VirtualList.prototype.insertItemBefore = function insertItemBefore (index, item) {
16967 var vl = this;
16968 if (index === 0) {
16969 vl.prependItem(item);
16970 return;
16971 }
16972 if (index >= vl.items.length) {
16973 vl.appendItem(item);
16974 return;
16975 }
16976 vl.items.splice(index, 0, item);
16977 // Update cache
16978 if (vl.params.cache) {
16979 var newCache = {};
16980 Object.keys(vl.domCache).forEach(function (cached) {
16981 var cachedIndex = parseInt(cached, 10);
16982 if (cachedIndex >= index) {
16983 newCache[cachedIndex + 1] = vl.domCache[cachedIndex];
16984 }
16985 });
16986 vl.domCache = newCache;
16987 }
16988 vl.update();
16989 };
16990
16991 // Delete
16992 VirtualList.prototype.deleteItems = function deleteItems (indexes) {
16993 var vl = this;
16994 var prevIndex;
16995 var indexShift = 0;
16996 var loop = function ( i ) {
16997 var index = indexes[i];
16998 if (typeof prevIndex !== 'undefined') {
16999 if (index > prevIndex) {
17000 indexShift = -i;
17001 }
17002 }
17003 index += indexShift;
17004 prevIndex = indexes[i];
17005 // Delete item
17006 var deletedItem = vl.items.splice(index, 1)[0];
17007
17008 // Delete from filtered
17009 if (vl.filteredItems && vl.filteredItems.indexOf(deletedItem) >= 0) {
17010 vl.filteredItems.splice(vl.filteredItems.indexOf(deletedItem), 1);
17011 }
17012 // Update cache
17013 if (vl.params.cache) {
17014 var newCache = {};
17015 Object.keys(vl.domCache).forEach(function (cached) {
17016 var cachedIndex = parseInt(cached, 10);
17017 if (cachedIndex === index) {
17018 delete vl.domCache[index];
17019 } else if (parseInt(cached, 10) > index) {
17020 newCache[cachedIndex - 1] = vl.domCache[cached];
17021 } else {
17022 newCache[cachedIndex] = vl.domCache[cached];
17023 }
17024 });
17025 vl.domCache = newCache;
17026 }
17027 };
17028
17029 for (var i = 0; i < indexes.length; i += 1) loop( i );
17030 vl.update();
17031 };
17032
17033 VirtualList.prototype.deleteAllItems = function deleteAllItems () {
17034 var vl = this;
17035 vl.items = [];
17036 delete vl.filteredItems;
17037 if (vl.params.cache) { vl.domCache = {}; }
17038 vl.update();
17039 };
17040
17041 VirtualList.prototype.deleteItem = function deleteItem (index) {
17042 var vl = this;
17043 vl.deleteItems([index]);
17044 };
17045
17046 // Clear cache
17047 VirtualList.prototype.clearCache = function clearCache () {
17048 var vl = this;
17049 vl.domCache = {};
17050 };
17051
17052 // Update Virtual List
17053 VirtualList.prototype.update = function update (deleteCache) {
17054 var vl = this;
17055 if (deleteCache && vl.params.cache) {
17056 vl.domCache = {};
17057 }
17058 vl.setListSize();
17059 vl.render(true);
17060 };
17061
17062 VirtualList.prototype.init = function init () {
17063 var vl = this;
17064 vl.attachEvents();
17065 vl.setListSize();
17066 vl.render();
17067 };
17068
17069 VirtualList.prototype.destroy = function destroy () {
17070 var vl = this;
17071 vl.detachEvents();
17072 vl.$el[0].f7VirtualList = null;
17073 delete vl.$el[0].f7VirtualList;
17074 Utils.deleteProps(vl);
17075 vl = null;
17076 };
17077
17078 return VirtualList;
17079 }(Framework7Class));
17080
17081 var VirtualList$1 = {
17082 name: 'virtualList',
17083 static: {
17084 VirtualList: VirtualList,
17085 },
17086 create: function create() {
17087 var app = this;
17088 app.virtualList = ConstructorMethods({
17089 defaultSelector: '.virtual-list',
17090 constructor: VirtualList,
17091 app: app,
17092 domProp: 'f7VirtualList',
17093 });
17094 },
17095 };
17096
5d51ea26 17097 var ListIndex = /*@__PURE__*/(function (Framework7Class) {
5309fbda
DC
17098 function ListIndex(app, params) {
17099 if ( params === void 0 ) params = {};
17100
5d51ea26 17101 Framework7Class.call(this, params, [app]);
5309fbda
DC
17102 var index = this;
17103
17104 var defaults = {
17105 el: null, // where to render indexes
17106 listEl: null, // list el to generate indexes
17107 indexes: 'auto', // or array of indexes
17108 iosItemHeight: 14,
17109 mdItemHeight: 14,
5d51ea26 17110 auroraItemHeight: 14,
5309fbda
DC
17111 scrollList: true,
17112 label: false,
17113 // eslint-disable-next-line
17114 renderItem: function renderItem(itemContent, itemIndex) {
17115 return ("\n <li>" + itemContent + "</li>\n ").trim();
17116 },
17117 renderSkipPlaceholder: function renderSkipPlaceholder() {
17118 return '<li class="list-index-skip-placeholder"></li>';
17119 },
17120 on: {},
17121 };
17122
17123 // Extend defaults with modules params
17124 index.useModulesParams(defaults);
17125
17126 index.params = Utils.extend(defaults, params);
17127
17128 var $el;
17129 var $listEl;
17130 var $pageContentEl;
17131 var $ul;
17132
17133 if (index.params.el) {
17134 $el = $(index.params.el);
17135 } else {
17136 return index;
17137 }
17138
17139 if ($el[0].f7ListIndex) {
17140 return $el[0].f7ListIndex;
17141 }
17142
17143 $ul = $el.find('ul');
17144 if ($ul.length === 0) {
17145 $ul = $('<ul></ul>');
17146 $el.append($ul);
17147 }
17148
17149 if (index.params.listEl) {
17150 $listEl = $(index.params.listEl);
17151 }
17152
17153 if (index.params.indexes === 'auto' && !$listEl) {
17154 return index;
17155 }
17156
17157 if ($listEl) {
17158 $pageContentEl = $listEl.parents('.page-content').eq(0);
17159 } else {
17160 $pageContentEl = $el.siblings('.page-content').eq(0);
17161 if ($pageContentEl.length === 0) {
17162 $pageContentEl = $el.parents('.page').eq(0).find('.page-content').eq(0);
17163 }
17164 }
17165
17166 $el[0].f7ListIndex = index;
17167
17168 Utils.extend(index, {
17169 app: app,
17170 $el: $el,
17171 el: $el && $el[0],
17172 $ul: $ul,
17173 ul: $ul && $ul[0],
17174 $listEl: $listEl,
17175 listEl: $listEl && $listEl[0],
17176 $pageContentEl: $pageContentEl,
17177 pageContentEl: $pageContentEl && $pageContentEl[0],
17178 indexes: params.indexes,
17179 height: 0,
17180 skipRate: 0,
17181 });
17182
17183 // Install Modules
17184 index.useModules();
17185
17186 // Attach events
17187 function handleResize() {
17188 var height = { index: index };
17189 index.calcSize();
17190 if (height !== index.height) {
17191 index.render();
17192 }
17193 }
17194
17195 function handleClick(e) {
17196 var $clickedLi = $(e.target).closest('li');
17197 if (!$clickedLi.length) { return; }
17198
17199 var itemIndex = $clickedLi.index();
17200 if (index.skipRate > 0) {
17201 var percentage = itemIndex / ($clickedLi.siblings('li').length - 1);
17202 itemIndex = Math.round((index.indexes.length - 1) * percentage);
17203 }
17204 var itemContent = index.indexes[itemIndex];
17205
17206 index.$el.trigger('listindex:click', itemContent, itemIndex);
17207 index.emit('local::click listIndexClick', index, itemContent, itemIndex);
17208 index.$el.trigger('listindex:select', itemContent, itemIndex);
17209 index.emit('local::select listIndexSelect', index, itemContent, itemIndex);
17210
17211 if (index.$listEl && index.params.scrollList) {
17212 index.scrollListToIndex(itemContent, itemIndex);
17213 }
17214 }
17215
17216 var touchesStart = {};
17217 var isTouched;
17218 var isMoved;
17219 var topPoint;
17220 var bottomPoint;
17221 var $labelEl;
17222 var previousIndex = null;
17223 function handleTouchStart(e) {
17224 var $children = $ul.children();
17225 if (!$children.length) { return; }
17226 topPoint = $children[0].getBoundingClientRect().top;
17227 bottomPoint = $children[$children.length - 1].getBoundingClientRect().top + $children[0].offsetHeight;
17228
17229 touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
17230 touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
17231 isTouched = true;
17232 isMoved = false;
17233 previousIndex = null;
17234 }
17235 function handleTouchMove(e) {
17236 if (!isTouched) { return; }
17237 if (!isMoved && index.params.label) {
17238 $labelEl = $('<span class="list-index-label"></span>');
17239 $el.append($labelEl);
17240 }
17241 isMoved = true;
17242 var pageY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
17243 e.preventDefault();
17244
17245 var percentage = (pageY - topPoint) / (bottomPoint - topPoint);
17246 percentage = Math.min(Math.max(percentage, 0), 1);
17247
17248 var itemIndex = Math.round((index.indexes.length - 1) * percentage);
17249 var itemContent = index.indexes[itemIndex];
17250
17251
17252 var ulHeight = bottomPoint - topPoint;
17253 var bubbleBottom = ((index.height - ulHeight) / 2) + ((1 - percentage) * ulHeight);
17254
17255 if (itemIndex !== previousIndex) {
17256 if (index.params.label) {
17257 $labelEl.html(itemContent).transform(("translateY(-" + bubbleBottom + "px)"));
17258 }
17259
17260 if (index.$listEl && index.params.scrollList) {
17261 index.scrollListToIndex(itemContent, itemIndex);
17262 }
17263 }
17264
17265 previousIndex = itemIndex;
17266
17267 index.$el.trigger('listindex:select', index);
17268 index.emit('local::select listIndexSelect', index, itemContent, itemIndex);
17269 }
17270 function handleTouchEnd() {
17271 if (!isTouched) { return; }
17272 isTouched = false;
17273 isMoved = false;
17274 if (index.params.label) {
17275 if ($labelEl) { $labelEl.remove(); }
17276 $labelEl = undefined;
17277 }
17278 }
17279 var passiveListener = app.support.passiveListener ? { passive: true } : false;
17280 index.attachEvents = function attachEvents() {
17281 $el.parents('.tab').on('tab:show', handleResize);
17282 $el.parents('.page').on('page:reinit', handleResize);
17283 $el.parents('.panel').on('panel:open', handleResize);
17284 $el
17285 .parents('.sheet-modal, .actions-modal, .popup, .popover, .login-screen, .dialog, .toast')
17286 .on('modal:open', handleResize);
17287 app.on('resize', handleResize);
17288
17289 $el.on('click', handleClick);
17290 $el.on(app.touchEvents.start, handleTouchStart, passiveListener);
17291 app.on('touchmove:active', handleTouchMove);
17292 app.on('touchend:passive', handleTouchEnd);
17293 };
17294 index.detachEvents = function attachEvents() {
17295 $el.parents('.tab').off('tab:show', handleResize);
17296 $el.parents('.page').off('page:reinit', handleResize);
17297 $el.parents('.panel').off('panel:open', handleResize);
17298 $el
17299 .parents('.sheet-modal, .actions-modal, .popup, .popover, .login-screen, .dialog, .toast')
17300 .off('modal:open', handleResize);
17301 app.off('resize', handleResize);
17302
17303 $el.off('click', handleClick);
17304 $el.off(app.touchEvents.start, handleTouchStart, passiveListener);
17305 app.off('touchmove:active', handleTouchMove);
17306 app.off('touchend:passive', handleTouchEnd);
17307 };
17308 // Init
17309 index.init();
17310
17311 return index;
17312 }
17313
5d51ea26
DC
17314 if ( Framework7Class ) ListIndex.__proto__ = Framework7Class;
17315 ListIndex.prototype = Object.create( Framework7Class && Framework7Class.prototype );
5309fbda
DC
17316 ListIndex.prototype.constructor = ListIndex;
17317 // eslint-disable-next-line
17318 ListIndex.prototype.scrollListToIndex = function scrollListToIndex (itemContent, itemIndex) {
17319 var index = this;
17320 var $listEl = index.$listEl;
17321 var $pageContentEl = index.$pageContentEl;
5d51ea26 17322 var app = index.app;
5309fbda
DC
17323 if (!$listEl || !$pageContentEl || $pageContentEl.length === 0) { return index; }
17324
17325 var $scrollToEl;
17326 $listEl.find('.list-group-title, .item-divider').each(function (elIndex, el) {
17327 if ($scrollToEl) { return; }
17328 var $el = $(el);
17329 if ($el.text() === itemContent) {
17330 $scrollToEl = $el;
17331 }
17332 });
17333 if (!$scrollToEl || $scrollToEl.length === 0) { return index; }
17334
17335 var parentTop = $scrollToEl.parent().offset().top;
17336 var paddingTop = parseInt($pageContentEl.css('padding-top'), 10);
17337 var scrollTop = $pageContentEl[0].scrollTop;
17338 var scrollToElTop = $scrollToEl.offset().top;
5d51ea26
DC
17339 if ($pageContentEl.parents('.page-with-navbar-large').length) {
17340 var navbarInnerEl = app.navbar.getElByPage($pageContentEl.parents('.page-with-navbar-large').eq(0));
17341 var $titleLargeEl = $(navbarInnerEl).find('.title-large');
17342 if ($titleLargeEl.length) {
17343 paddingTop -= $titleLargeEl[0].offsetHeight || 0;
17344 }
17345 }
5309fbda
DC
17346
17347 if (parentTop <= paddingTop) {
17348 $pageContentEl.scrollTop((parentTop + scrollTop) - paddingTop);
17349 } else {
17350 $pageContentEl.scrollTop((scrollToElTop + scrollTop) - paddingTop);
17351 }
17352 return index;
17353 };
17354
17355 ListIndex.prototype.renderSkipPlaceholder = function renderSkipPlaceholder () {
17356 var index = this;
17357 return index.params.renderSkipPlaceholder.call(index);
17358 };
17359
17360 ListIndex.prototype.renderItem = function renderItem (itemContent, itemIndex) {
17361 var index = this;
17362 return index.params.renderItem.call(index, itemContent, itemIndex);
17363 };
17364
17365 ListIndex.prototype.render = function render () {
17366 var index = this;
17367 var $ul = index.$ul;
17368 var indexes = index.indexes;
17369 var skipRate = index.skipRate;
17370 var wasSkipped;
17371
17372 var html = indexes.map(function (itemContent, itemIndex) {
17373 if (itemIndex % skipRate !== 0 && skipRate > 0) {
17374 wasSkipped = true;
17375 return '';
17376 }
17377 var itemHtml = index.renderItem(itemContent, itemIndex);
17378 if (wasSkipped) {
17379 itemHtml = index.renderSkipPlaceholder() + itemHtml;
17380 }
17381 wasSkipped = false;
17382 return itemHtml;
17383 }).join('');
17384
17385 $ul.html(html);
17386
17387 return index;
17388 };
17389
17390 ListIndex.prototype.calcSize = function calcSize () {
17391 var index = this;
17392 var app = index.app;
17393 var params = index.params;
17394 var el = index.el;
17395 var indexes = index.indexes;
17396 var height = el.offsetHeight;
5d51ea26 17397 var itemHeight = params[((app.theme) + "ItemHeight")];
5309fbda
DC
17398 var maxItems = Math.floor(height / itemHeight);
17399 var items = indexes.length;
17400 var skipRate = 0;
17401 if (items > maxItems) {
17402 skipRate = Math.ceil(((items * 2) - 1) / maxItems);
17403 }
17404
17405 index.height = height;
17406 index.skipRate = skipRate;
17407
17408 return index;
17409 };
17410
17411 ListIndex.prototype.calcIndexes = function calcIndexes () {
17412 var index = this;
17413 if (index.params.indexes === 'auto') {
17414 index.indexes = [];
17415
17416 index.$listEl.find('.list-group-title, .item-divider').each(function (elIndex, el) {
17417 var elContent = $(el).text();
17418 if (index.indexes.indexOf(elContent) < 0) {
17419 index.indexes.push(elContent);
17420 }
17421 });
17422 } else {
17423 index.indexes = index.params.indexes;
17424 }
17425 return index;
17426 };
17427
17428 ListIndex.prototype.update = function update () {
17429 var index = this;
17430 index.calcIndexes();
17431 index.calcSize();
17432 index.render();
17433
17434 return index;
17435 };
17436
17437 ListIndex.prototype.init = function init () {
17438 var index = this;
17439 index.calcIndexes();
17440 index.calcSize();
17441 index.render();
17442 index.attachEvents();
17443 };
17444
17445 ListIndex.prototype.destroy = function destroy () {
17446 var index = this;
17447 index.$el.trigger('listindex:beforedestroy', index);
17448 index.emit('local::beforeDestroy listIndexBeforeDestroy', index);
17449 index.detachEvents();
17450 if (index.$el[0]) {
17451 index.$el[0].f7ListIndex = null;
17452 delete index.$el[0].f7ListIndex;
17453 }
17454 Utils.deleteProps(index);
17455 index = null;
17456 };
17457
17458 return ListIndex;
17459 }(Framework7Class));
17460
17461 var ListIndex$1 = {
17462 name: 'listIndex',
17463 static: {
17464 ListIndex: ListIndex,
17465 },
17466 create: function create() {
17467 var app = this;
17468 app.listIndex = ConstructorMethods({
17469 defaultSelector: '.list-index',
17470 constructor: ListIndex,
17471 app: app,
17472 domProp: 'f7ListIndex',
17473 });
17474 },
17475 on: {
17476 tabMounted: function tabMounted(tabEl) {
17477 var app = this;
17478 $(tabEl).find('.list-index-init').each(function (index, listIndexEl) {
17479 var params = Utils.extend($(listIndexEl).dataset(), { el: listIndexEl });
17480 app.listIndex.create(params);
17481 });
17482 },
17483 tabBeforeRemove: function tabBeforeRemove(tabEl) {
17484 $(tabEl).find('.list-index-init').each(function (index, listIndexEl) {
17485 if (listIndexEl.f7ListIndex) { listIndexEl.f7ListIndex.destroy(); }
17486 });
17487 },
17488 pageInit: function pageInit(page) {
17489 var app = this;
17490 page.$el.find('.list-index-init').each(function (index, listIndexEl) {
17491 var params = Utils.extend($(listIndexEl).dataset(), { el: listIndexEl });
17492 app.listIndex.create(params);
17493 });
17494 },
17495 pageBeforeRemove: function pageBeforeRemove(page) {
17496 page.$el.find('.list-index-init').each(function (index, listIndexEl) {
17497 if (listIndexEl.f7ListIndex) { listIndexEl.f7ListIndex.destroy(); }
17498 });
17499 },
17500 },
17501 vnode: {
17502 'list-index-init': {
17503 insert: function insert(vnode) {
17504 var app = this;
17505 var listIndexEl = vnode.elm;
17506 var params = Utils.extend($(listIndexEl).dataset(), { el: listIndexEl });
17507 app.listIndex.create(params);
17508 },
17509 destroy: function destroy(vnode) {
17510 var listIndexEl = vnode.elm;
17511 if (listIndexEl.f7ListIndex) { listIndexEl.f7ListIndex.destroy(); }
17512 },
17513 },
17514 },
17515 };
17516
17517 var Timeline = {
17518 name: 'timeline',
17519 };
17520
17521 var Tab = {
17522 show: function show() {
17523 var assign, assign$1, assign$2;
17524
17525 var args = [], len = arguments.length;
17526 while ( len-- ) args[ len ] = arguments[ len ];
17527 var app = this;
17528
17529 var tabEl;
17530 var tabLinkEl;
17531 var animate;
17532 var tabRoute;
17533 if (args.length === 1 && args[0].constructor === Object) {
17534 tabEl = args[0].tabEl;
17535 tabLinkEl = args[0].tabLinkEl;
17536 animate = args[0].animate;
17537 tabRoute = args[0].tabRoute;
17538 } else {
17539 (assign = args, tabEl = assign[0], tabLinkEl = assign[1], animate = assign[2], tabRoute = assign[3]);
17540 if (typeof args[1] === 'boolean') {
17541 (assign$1 = args, tabEl = assign$1[0], animate = assign$1[1], tabLinkEl = assign$1[2], tabRoute = assign$1[3]);
17542 if (args.length > 2 && tabLinkEl.constructor === Object) {
17543 (assign$2 = args, tabEl = assign$2[0], animate = assign$2[1], tabRoute = assign$2[2], tabLinkEl = assign$2[3]);
17544 }
17545 }
17546 }
17547 if (typeof animate === 'undefined') { animate = true; }
17548
17549 var $newTabEl = $(tabEl);
17550 if (tabRoute && $newTabEl[0]) {
17551 $newTabEl[0].f7TabRoute = tabRoute;
17552 }
17553
17554 if ($newTabEl.length === 0 || $newTabEl.hasClass('tab-active')) {
17555 return {
17556 $newTabEl: $newTabEl,
17557 newTabEl: $newTabEl[0],
17558 };
17559 }
17560
17561 var $tabLinkEl;
17562 if (tabLinkEl) { $tabLinkEl = $(tabLinkEl); }
17563
17564 var $tabsEl = $newTabEl.parent('.tabs');
17565 if ($tabsEl.length === 0) {
17566 return {
17567 $newTabEl: $newTabEl,
17568 newTabEl: $newTabEl[0],
17569 };
17570 }
17571
17572 // Release swipeouts in hidden tabs
17573 if (app.swipeout) { app.swipeout.allowOpen = true; }
17574
17575 // Animated tabs
17576 var tabsChangedCallbacks = [];
17577
17578 function onTabsChanged(callback) {
17579 tabsChangedCallbacks.push(callback);
17580 }
17581 function tabsChanged() {
17582 tabsChangedCallbacks.forEach(function (callback) {
17583 callback();
17584 });
17585 }
17586
17587 var animated = false;
17588
17589 if ($tabsEl.parent().hasClass('tabs-animated-wrap')) {
17590 $tabsEl.parent()[animate ? 'removeClass' : 'addClass']('not-animated');
17591
17592 var transitionDuration = parseFloat($tabsEl.css('transition-duration').replace(',', '.'));
17593 if (animate && transitionDuration) {
17594 $tabsEl.transitionEnd(tabsChanged);
17595 animated = true;
17596 }
17597
17598 var tabsTranslate = (app.rtl ? $newTabEl.index() : -$newTabEl.index()) * 100;
17599 $tabsEl.transform(("translate3d(" + tabsTranslate + "%,0,0)"));
17600 }
17601
17602 // Swipeable tabs
17603 var swiper;
17604 if ($tabsEl.parent().hasClass('tabs-swipeable-wrap') && app.swiper) {
17605 swiper = $tabsEl.parent()[0].swiper;
17606 if (swiper && swiper.activeIndex !== $newTabEl.index()) {
17607 animated = true;
17608 swiper
17609 .once('slideChangeTransitionEnd', function () {
17610 tabsChanged();
17611 })
17612 .slideTo($newTabEl.index(), animate ? undefined : 0);
17613 } else if (swiper && swiper.animating) {
17614 animated = true;
17615 swiper
17616 .once('slideChangeTransitionEnd', function () {
17617 tabsChanged();
17618 });
17619 }
17620 }
17621
17622 // Remove active class from old tabs
17623 var $oldTabEl = $tabsEl.children('.tab-active');
17624 $oldTabEl.removeClass('tab-active');
17625 if (!swiper || (swiper && !swiper.animating) || (swiper && tabRoute)) {
17626 $oldTabEl.trigger('tab:hide');
17627 app.emit('tabHide', $oldTabEl[0]);
17628 }
17629
17630 // Trigger 'show' event on new tab
17631 $newTabEl.addClass('tab-active');
17632 if (!swiper || (swiper && !swiper.animating) || (swiper && tabRoute)) {
17633 $newTabEl.trigger('tab:show');
17634 app.emit('tabShow', $newTabEl[0]);
17635 }
17636
17637 // Find related link for new tab
17638 if (!$tabLinkEl) {
17639 // Search by id
17640 if (typeof tabEl === 'string') { $tabLinkEl = $((".tab-link[href=\"" + tabEl + "\"]")); }
17641 else { $tabLinkEl = $((".tab-link[href=\"#" + ($newTabEl.attr('id')) + "\"]")); }
17642 // Search by data-tab
17643 if (!$tabLinkEl || ($tabLinkEl && $tabLinkEl.length === 0)) {
17644 $('[data-tab]').each(function (index, el) {
17645 if ($newTabEl.is($(el).attr('data-tab'))) { $tabLinkEl = $(el); }
17646 });
17647 }
17648 if (tabRoute && (!$tabLinkEl || ($tabLinkEl && $tabLinkEl.length === 0))) {
17649 $tabLinkEl = $(("[data-route-tab-id=\"" + (tabRoute.route.tab.id) + "\"]"));
17650 if ($tabLinkEl.length === 0) {
17651 $tabLinkEl = $((".tab-link[href=\"" + (tabRoute.url) + "\"]"));
17652 }
17653 }
17654 if ($tabLinkEl.length > 1 && $newTabEl.parents('.page').length) {
17655 // eslint-disable-next-line
17656 $tabLinkEl = $tabLinkEl.filter(function (index, tabLinkElement) {
17657 return $(tabLinkElement).parents('.page')[0] === $newTabEl.parents('.page')[0];
17658 });
17659 if (app.theme === 'ios' && $tabLinkEl.length === 0 && tabRoute) {
17660 var $pageEl = $newTabEl.parents('.page');
17661 var $navbarEl = $(app.navbar.getElByPage($pageEl));
17662 $tabLinkEl = $navbarEl.find(("[data-route-tab-id=\"" + (tabRoute.route.tab.id) + "\"]"));
17663 if ($tabLinkEl.length === 0) {
17664 $tabLinkEl = $navbarEl.find((".tab-link[href=\"" + (tabRoute.url) + "\"]"));
17665 }
17666 }
17667 }
17668 }
17669 if ($tabLinkEl.length > 0) {
17670 // Find related link for old tab
17671 var $oldTabLinkEl;
17672 if ($oldTabEl && $oldTabEl.length > 0) {
17673 // Search by id
17674 var oldTabId = $oldTabEl.attr('id');
17675 if (oldTabId) {
17676 $oldTabLinkEl = $((".tab-link[href=\"#" + oldTabId + "\"]"));
17677 // Search by data-route-tab-id
17678 if (!$oldTabLinkEl || ($oldTabLinkEl && $oldTabLinkEl.length === 0)) {
17679 $oldTabLinkEl = $((".tab-link[data-route-tab-id=\"" + oldTabId + "\"]"));
17680 }
17681 }
17682 // Search by data-tab
17683 if (!$oldTabLinkEl || ($oldTabLinkEl && $oldTabLinkEl.length === 0)) {
17684 $('[data-tab]').each(function (index, tabLinkElement) {
17685 if ($oldTabEl.is($(tabLinkElement).attr('data-tab'))) { $oldTabLinkEl = $(tabLinkElement); }
17686 });
17687 }
17688 if (!$oldTabLinkEl || ($oldTabLinkEl && $oldTabLinkEl.length === 0)) {
17689 $oldTabLinkEl = $tabLinkEl.siblings('.tab-link-active');
17690 }
17691 } else if (tabRoute) {
17692 $oldTabLinkEl = $tabLinkEl.siblings('.tab-link-active');
17693 }
17694
17695 if ($oldTabLinkEl && $oldTabLinkEl.length > 1 && $oldTabEl && $oldTabEl.parents('.page').length) {
17696 // eslint-disable-next-line
17697 $oldTabLinkEl = $oldTabLinkEl.filter(function (index, tabLinkElement) {
17698 return $(tabLinkElement).parents('.page')[0] === $oldTabEl.parents('.page')[0];
17699 });
17700 }
17701
17702 if ($oldTabLinkEl && $oldTabLinkEl.length > 0) { $oldTabLinkEl.removeClass('tab-link-active'); }
17703
17704 // Update links' classes
17705 if ($tabLinkEl && $tabLinkEl.length > 0) {
17706 $tabLinkEl.addClass('tab-link-active');
17707 // Material Highlight
17708 if (app.theme === 'md' && app.toolbar) {
17709 var $tabbarEl = $tabLinkEl.parents('.tabbar, .tabbar-labels');
17710 if ($tabbarEl.length > 0) {
17711 app.toolbar.setHighlight($tabbarEl);
17712 }
17713 }
17714 }
17715 }
17716 return {
17717 $newTabEl: $newTabEl,
17718 newTabEl: $newTabEl[0],
17719 $oldTabEl: $oldTabEl,
17720 oldTabEl: $oldTabEl[0],
17721 onTabsChanged: onTabsChanged,
17722 animated: animated,
17723 };
17724 },
17725 };
17726 var Tabs = {
17727 name: 'tabs',
17728 create: function create() {
17729 var app = this;
17730 Utils.extend(app, {
17731 tab: {
17732 show: Tab.show.bind(app),
17733 },
17734 });
17735 },
17736 clicks: {
17737 '.tab-link': function tabLinkClick($clickedEl, data) {
17738 if ( data === void 0 ) data = {};
17739
17740 var app = this;
17741 if (($clickedEl.attr('href') && $clickedEl.attr('href').indexOf('#') === 0) || $clickedEl.attr('data-tab')) {
17742 app.tab.show({
17743 tabEl: data.tab || $clickedEl.attr('href'),
17744 tabLinkEl: $clickedEl,
17745 animate: data.animate,
17746 });
17747 }
17748 },
17749 },
17750 };
17751
17752 function swipePanel(panel) {
17753 var app = panel.app;
17754 Utils.extend(panel, {
17755 swipeable: true,
17756 swipeInitialized: true,
17757 });
17758 var params = app.params.panel;
17759 var $el = panel.$el;
17760 var $backdropEl = panel.$backdropEl;
17761 var side = panel.side;
17762 var effect = panel.effect;
17763 var otherPanel;
17764
17765 var isTouched;
17766 var isMoved;
17767 var isScrolling;
17768 var touchesStart = {};
17769 var touchStartTime;
17770 var touchesDiff;
17771 var translate;
17772 var backdropOpacity;
17773 var panelWidth;
17774 var direction;
17775
17776 var $viewEl;
17777
17778 var touchMoves = 0;
17779 function handleTouchStart(e) {
17780 if (!panel.swipeable) { return; }
17781 if (!app.panel.allowOpen || (!params.swipe && !params.swipeOnlyClose) || isTouched) { return; }
17782 if ($('.modal-in:not(.toast):not(.notification), .photo-browser-in').length > 0) { return; }
17783 otherPanel = app.panel[side === 'left' ? 'right' : 'left'] || {};
17784 if (!panel.opened && otherPanel.opened) { return; }
17785 if (!(params.swipeCloseOpposite || params.swipeOnlyClose)) {
17786 if (otherPanel.opened) { return; }
17787 }
17788 if (e.target && e.target.nodeName.toLowerCase() === 'input' && e.target.type === 'range') { return; }
17789 if ($(e.target).closest('.range-slider, .tabs-swipeable-wrap, .calendar-months, .no-swipe-panel, .card-opened').length > 0) { return; }
17790 touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
17791 touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
17792 if (params.swipeOnlyClose && !panel.opened) {
17793 return;
17794 }
17795 if (params.swipe !== 'both' && params.swipeCloseOpposite && params.swipe !== side && !panel.opened) {
17796 return;
17797 }
17798 if (params.swipeActiveArea && !panel.opened) {
17799 if (side === 'left') {
17800 if (touchesStart.x > params.swipeActiveArea) { return; }
17801 }
17802 if (side === 'right') {
17803 if (touchesStart.x < app.width - params.swipeActiveArea) { return; }
17804 }
17805 }
17806 if (params.swipeCloseActiveAreaSide && panel.opened) {
17807 if (side === 'left') {
17808 if (touchesStart.x < ($el[0].offsetWidth - params.swipeCloseActiveAreaSide)) { return; }
17809 }
17810 if (side === 'right') {
17811 if (touchesStart.x > ((app.width - $el[0].offsetWidth) + params.swipeCloseActiveAreaSide)) { return; }
17812 }
17813 }
17814 touchMoves = 0;
17815 $viewEl = $(panel.getViewEl());
17816 isMoved = false;
17817 isTouched = true;
17818 isScrolling = undefined;
17819
17820 touchStartTime = Utils.now();
17821 direction = undefined;
17822 }
17823 function handleTouchMove(e) {
17824 if (!isTouched) { return; }
17825 touchMoves += 1;
17826 if (touchMoves < 2) { return; }
17827 if (e.f7PreventSwipePanel || app.preventSwipePanelBySwipeBack || app.preventSwipePanel) {
17828 isTouched = false;
17829 return;
17830 }
17831 var pageX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;
17832 var pageY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
17833 if (typeof isScrolling === 'undefined') {
17834 isScrolling = !!(isScrolling || Math.abs(pageY - touchesStart.y) > Math.abs(pageX - touchesStart.x));
17835 }
17836 if (isScrolling) {
17837 isTouched = false;
17838 return;
17839 }
17840 if (!direction) {
17841 if (pageX > touchesStart.x) {
17842 direction = 'to-right';
17843 } else {
17844 direction = 'to-left';
17845 }
17846
17847 if (params.swipe === 'both') {
17848 if (params.swipeActiveArea > 0 && !panel.opened) {
17849 if (side === 'left' && touchesStart.x > params.swipeActiveArea) {
17850 isTouched = false;
17851 return;
17852 }
17853 if (side === 'right' && touchesStart.x < app.width - params.swipeActiveArea) {
17854 isTouched = false;
17855 return;
17856 }
17857 }
17858 }
17859 if ($el.hasClass('panel-visible-by-breakpoint')) {
17860 isTouched = false;
17861 return;
17862 }
17863
17864 if (
17865 (side === 'left'
17866 && (
17867 direction === 'to-left' && !$el.hasClass('panel-active')
17868 )
17869 )
17870 || (side === 'right'
17871 && (
17872 direction === 'to-right' && !$el.hasClass('panel-active')
17873 )
17874 )
17875 ) {
17876 isTouched = false;
17877 return;
17878 }
17879 }
17880
17881 var threshold = panel.opened ? 0 : -params.swipeThreshold;
17882 if (side === 'right') { threshold = -threshold; }
17883
17884 if (params.swipeNoFollow) {
17885 var touchesDiffNoFollow = (pageX - touchesStart.x);
17886 var timeDiff = (new Date()).getTime() - touchStartTime;
17887 var needToSwitch;
17888 if (!panel.opened && (
17889 (side === 'left' && touchesDiffNoFollow > -threshold)
17890 || (side === 'right' && -touchesDiffNoFollow > threshold)
17891 )) {
17892 needToSwitch = true;
17893 }
17894 if (panel.opened && (
17895 (side === 'left' && touchesDiffNoFollow < 0)
17896 || (side === 'right' && touchesDiffNoFollow > 0)
17897 )) {
17898 needToSwitch = true;
17899 }
17900
17901 if (needToSwitch) {
17902 if (timeDiff < 300) {
17903 if (direction === 'to-left') {
17904 if (side === 'right') { app.panel.open(side); }
17905 if (side === 'left' && $el.hasClass('panel-active')) { app.panel.close(); }
17906 }
17907 if (direction === 'to-right') {
17908 if (side === 'left') { app.panel.open(side); }
17909 if (side === 'right' && $el.hasClass('panel-active')) { app.panel.close(); }
17910 }
17911 }
17912 isTouched = false;
17913 isMoved = false;
17914 }
17915 return;
17916 }
17917
17918 if (!isMoved) {
17919 if (!panel.opened) {
5d51ea26
DC
17920 $el.css('display', 'block');
17921 $backdropEl.css('display', 'block');
5309fbda
DC
17922 $el.trigger('panel:swipeopen', panel);
17923 panel.emit('local::swipeOpen panelSwipeOpen', panel);
17924 }
17925 panelWidth = $el[0].offsetWidth;
17926 $el.transition(0);
17927 }
17928
17929 isMoved = true;
17930
17931 e.preventDefault();
17932
17933 touchesDiff = (pageX - touchesStart.x) + threshold;
17934
17935 if (side === 'right') {
17936 if (effect === 'cover') {
17937 translate = touchesDiff + (panel.opened ? 0 : panelWidth);
17938 if (translate < 0) { translate = 0; }
17939 if (translate > panelWidth) {
17940 translate = panelWidth;
17941 }
17942 } else {
17943 translate = touchesDiff - (panel.opened ? panelWidth : 0);
17944 if (translate > 0) { translate = 0; }
17945 if (translate < -panelWidth) {
17946 translate = -panelWidth;
17947 }
17948 }
17949 } else {
17950 translate = touchesDiff + (panel.opened ? panelWidth : 0);
17951 if (translate < 0) { translate = 0; }
17952 if (translate > panelWidth) {
17953 translate = panelWidth;
17954 }
17955 }
17956 if (effect === 'reveal') {
17957 $viewEl.transform(("translate3d(" + translate + "px,0,0)")).transition(0);
17958 $backdropEl.transform(("translate3d(" + translate + "px,0,0)")).transition(0);
17959
17960 $el.trigger('panel:swipe', panel, Math.abs(translate / panelWidth));
17961 panel.emit('local::swipe panelSwipe', panel, Math.abs(translate / panelWidth));
17962 } else {
17963 if (side === 'left') { translate -= panelWidth; }
17964 $el.transform(("translate3d(" + translate + "px,0,0)")).transition(0);
17965
17966 $backdropEl.transition(0);
17967 backdropOpacity = 1 - Math.abs(translate / panelWidth);
17968 $backdropEl.css({ opacity: backdropOpacity });
17969
17970 $el.trigger('panel:swipe', panel, Math.abs(translate / panelWidth));
17971 panel.emit('local::swipe panelSwipe', panel, Math.abs(translate / panelWidth));
17972 }
17973 }
17974 function handleTouchEnd() {
17975 if (!isTouched || !isMoved) {
17976 isTouched = false;
17977 isMoved = false;
17978 return;
17979 }
17980 isTouched = false;
17981 isMoved = false;
17982 var timeDiff = (new Date()).getTime() - touchStartTime;
17983 var action;
17984 var edge = (translate === 0 || Math.abs(translate) === panelWidth);
17985
17986 var threshold = params.swipeThreshold || 0;
17987
17988 if (!panel.opened) {
17989 if (Math.abs(touchesDiff) < threshold) {
17990 action = 'reset';
17991 } else if (effect === 'cover') {
17992 if (translate === 0) {
17993 action = 'swap'; // open
17994 } else if (timeDiff < 300 && Math.abs(translate) > 0) {
17995 action = 'swap'; // open
17996 } else if (timeDiff >= 300 && Math.abs(translate) < panelWidth / 2) {
17997 action = 'swap'; // open
17998 } else {
17999 action = 'reset'; // close
18000 }
18001 } else if (translate === 0) {
18002 action = 'reset';
18003 } else if (
18004 (timeDiff < 300 && Math.abs(translate) > 0)
18005 || (timeDiff >= 300 && (Math.abs(translate) >= panelWidth / 2))
18006 ) {
18007 action = 'swap';
18008 } else {
18009 action = 'reset';
18010 }
18011 } else if (effect === 'cover') {
18012 if (translate === 0) {
18013 action = 'reset'; // open
18014 } else if (timeDiff < 300 && Math.abs(translate) > 0) {
18015 action = 'swap'; // open
18016 } else if (timeDiff >= 300 && Math.abs(translate) < panelWidth / 2) {
18017 action = 'reset'; // open
18018 } else {
18019 action = 'swap'; // close
18020 }
18021 } else if (translate === -panelWidth) {
18022 action = 'reset';
18023 } else if (
18024 (timeDiff < 300 && Math.abs(translate) >= 0)
18025 || (timeDiff >= 300 && (Math.abs(translate) <= panelWidth / 2))
18026 ) {
18027 if (side === 'left' && translate === panelWidth) { action = 'reset'; }
18028 else { action = 'swap'; }
18029 } else {
18030 action = 'reset';
18031 }
18032 if (action === 'swap') {
18033 if (panel.opened) {
18034 panel.close(!edge);
18035 } else {
18036 panel.open(!edge);
18037 }
18038 }
18039 if (action === 'reset') {
18040 if (!panel.opened) {
18041 if (edge) {
18042 $el.css({ display: '' });
18043 } else {
18044 var target = effect === 'reveal' ? $viewEl : $el;
18045 $('html').addClass('with-panel-transitioning');
18046 target.transitionEnd(function () {
18047 if ($el.hasClass('panel-active')) { return; }
18048 $el.css({ display: '' });
18049 $('html').removeClass('with-panel-transitioning');
18050 });
18051 }
18052 }
18053 }
18054 if (effect === 'reveal') {
18055 Utils.nextFrame(function () {
18056 $viewEl.transition('');
18057 $viewEl.transform('');
18058 });
18059 }
18060 $el.transition('').transform('');
18061 $backdropEl.css({ display: '' }).transform('').transition('').css('opacity', '');
18062 }
18063
18064 // Add Events
18065 app.on('touchstart:passive', handleTouchStart);
18066 app.on('touchmove:active', handleTouchMove);
18067 app.on('touchend:passive', handleTouchEnd);
18068 panel.on('panelDestroy', function () {
18069 app.off('touchstart:passive', handleTouchStart);
18070 app.off('touchmove:active', handleTouchMove);
18071 app.off('touchend:passive', handleTouchEnd);
18072 });
18073 }
18074
5d51ea26
DC
18075 function resizablePanel(panel) {
18076 var app = panel.app;
18077 Utils.extend(panel, {
18078 resizable: true,
18079 resizableWidth: null,
18080 resizableInitialized: true,
18081 });
18082 var $htmlEl = $('html');
18083 var $el = panel.$el;
18084 var $backdropEl = panel.$backdropEl;
18085 var side = panel.side;
18086 var effect = panel.effect;
18087 if (!$el) { return; }
18088
18089 var isTouched;
18090 var isMoved;
18091 var touchesStart = {};
18092 var touchesDiff;
18093 var panelWidth;
18094
18095 var $viewEl;
18096
18097 var panelMinWidth;
18098 var panelMaxWidth;
18099 var visibleByBreakpoint;
18100
18101 function transformCSSWidth(v) {
18102 if (!v) { return null; }
18103 if (v.indexOf('%') >= 0 || v.indexOf('vw') >= 0) {
18104 return parseInt(v, 10) / 100 * app.width;
18105 }
18106 var newV = parseInt(v, 10);
18107 if (Number.isNaN(newV)) { return null; }
18108 return newV;
18109 }
5309fbda 18110
5d51ea26
DC
18111 function isResizable() {
18112 return panel.resizable && $el.hasClass('panel-resizable');
18113 }
18114
18115 function handleTouchStart(e) {
18116 if (!isResizable()) { return; }
18117 touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
18118 touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
18119 isMoved = false;
18120 isTouched = true;
18121 panelMinWidth = transformCSSWidth($el.css('min-width'));
18122 panelMaxWidth = transformCSSWidth($el.css('max-width'));
18123 visibleByBreakpoint = $el.hasClass('panel-visible-by-breakpoint');
18124 }
18125 function handleTouchMove(e) {
18126 if (!isTouched) { return; }
18127 var pageX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;
18128
18129 if (!isMoved) {
18130 panelWidth = $el[0].offsetWidth;
18131 $el.transition(0);
18132 $el.addClass('panel-resizing');
18133 $htmlEl.css('cursor', 'col-resize');
18134 if (effect === 'reveal' || visibleByBreakpoint) {
18135 $viewEl = $(panel.getViewEl());
18136 }
18137 if (effect === 'reveal' && !visibleByBreakpoint) {
18138 $backdropEl.transition(0);
18139 $viewEl.transition(0);
18140 }
18141 }
18142
18143 isMoved = true;
18144
18145 e.preventDefault();
18146
18147 touchesDiff = (pageX - touchesStart.x);
18148
18149 var newPanelWidth = side === 'left' ? panelWidth + touchesDiff : panelWidth - touchesDiff;
18150 if (panelMinWidth && !Number.isNaN(panelMinWidth)) {
18151 newPanelWidth = Math.max(newPanelWidth, panelMinWidth);
18152 }
18153 if (panelMaxWidth && !Number.isNaN(panelMaxWidth)) {
18154 newPanelWidth = Math.min(newPanelWidth, panelMaxWidth);
18155 }
18156 newPanelWidth = Math.min(Math.max(newPanelWidth, 0), app.width);
18157
18158 panel.resizableWidth = newPanelWidth;
18159 $el[0].style.width = newPanelWidth + "px";
18160 if (effect === 'reveal' && !visibleByBreakpoint) {
18161 if ($viewEl) {
18162 $viewEl.transform(("translate3d(" + (side === 'left' ? newPanelWidth : -newPanelWidth) + "px, 0, 0)"));
18163 }
18164 if ($backdropEl) {
18165 $backdropEl.transform(("translate3d(" + (side === 'left' ? newPanelWidth : -newPanelWidth) + "px, 0, 0)"));
18166 }
18167 } else if (visibleByBreakpoint && $viewEl) {
18168 $viewEl.css(("margin-" + side), (newPanelWidth + "px"));
18169 }
18170
18171 $el.trigger('panel:resize', panel, newPanelWidth);
18172 panel.emit('local::resize panelResize', panel, newPanelWidth);
18173 }
18174 function handleTouchEnd() {
18175 $('html').css('cursor', '');
18176 if (!isTouched || !isMoved) {
18177 isTouched = false;
18178 isMoved = false;
18179 return;
18180 }
18181 isTouched = false;
18182 isMoved = false;
18183
18184 $htmlEl[0].style.setProperty(("--f7-panel-" + side + "-width"), ((panel.resizableWidth) + "px"));
18185 $el[0].style.width = '';
18186 if (effect === 'reveal' && !visibleByBreakpoint) {
18187 $viewEl.transform('');
18188 $backdropEl.transform('');
18189 }
18190 $el.removeClass('panel-resizing');
18191 Utils.nextFrame(function () {
18192 if (visibleByBreakpoint) { return; }
18193 $el.transition('');
18194 if (effect === 'reveal') {
18195 $backdropEl.transition('');
18196 if ($viewEl) { $viewEl.transition(''); }
18197 }
18198 });
18199 }
18200
18201 function handleResize() {
18202 if (!panel.opened || !panel.resizableWidth) { return; }
18203 panelMinWidth = transformCSSWidth($el.css('min-width'));
18204 panelMaxWidth = transformCSSWidth($el.css('max-width'));
18205
18206 if (panelMinWidth && !Number.isNaN(panelMinWidth) && panel.resizableWidth < panelMinWidth) {
18207 panel.resizableWidth = Math.max(panel.resizableWidth, panelMinWidth);
18208 }
18209 if (panelMaxWidth && !Number.isNaN(panelMaxWidth) && panel.resizableWidth > panelMaxWidth) {
18210 panel.resizableWidth = Math.min(panel.resizableWidth, panelMaxWidth);
18211 }
18212 panel.resizableWidth = Math.min(Math.max(panel.resizableWidth, 0), app.width);
18213
18214 $htmlEl[0].style.setProperty(("--f7-panel-" + side + "-width"), ((panel.resizableWidth) + "px"));
18215 }
18216
18217 if (panel.$el.find('.panel-resize-handler').length === 0) {
18218 panel.$el.append('<div class="panel-resize-handler"></div>');
18219 }
18220 panel.$resizeHandlerEl = panel.$el.children('.panel-resize-handler');
18221
18222 $el.addClass('panel-resizable');
18223
18224 // Add Events
18225 var passive = Support.passiveListener ? { passive: true } : false;
18226
18227 panel.$el.on(app.touchEvents.start, '.panel-resize-handler', handleTouchStart, passive);
18228 app.on('touchmove:active', handleTouchMove);
18229 app.on('touchend:passive', handleTouchEnd);
18230 app.on('resize', handleResize);
18231 panel.on('beforeOpen', handleResize);
18232
18233 panel.once('panelDestroy', function () {
18234 $el.removeClass('panel-resizable');
18235 panel.$resizeHandlerEl.remove();
18236 panel.$el.off(app.touchEvents.start, '.panel-resize-handler', handleTouchStart, passive);
18237 app.off('touchmove:active', handleTouchMove);
18238 app.off('touchend:passive', handleTouchEnd);
18239 app.off('resize', handleResize);
18240 panel.off('beforeOpen', handleResize);
18241 });
18242 }
18243
18244 var Panel = /*@__PURE__*/(function (Framework7Class) {
18245 function Panel(app, params) {
5309fbda 18246 if ( params === void 0 ) params = {};
5d51ea26
DC
18247
18248 Framework7Class.call(this, params, [app]);
5309fbda
DC
18249 var panel = this;
18250
18251 var el = params.el;
18252
18253 if (!el && params.content) {
18254 el = params.content;
18255 }
18256
18257 var $el = $(el);
18258 if ($el.length === 0) { return panel; }
18259 if ($el[0].f7Panel) { return $el[0].f7Panel; }
18260
18261 $el[0].f7Panel = panel;
18262
18263 var opened = params.opened;
18264 var side = params.side;
18265 var effect = params.effect;
18266 if (typeof opened === 'undefined') { opened = $el.hasClass('panel-active'); }
18267 if (typeof side === 'undefined') { side = $el.hasClass('panel-left') ? 'left' : 'right'; }
18268 if (typeof effect === 'undefined') { effect = $el.hasClass('panel-cover') ? 'cover' : 'reveal'; }
18269
18270 if (!app.panel[side]) {
5d51ea26 18271 app.panel[side] = panel;
5309fbda
DC
18272 } else {
18273 throw new Error(("Framework7: Can't create panel; app already has a " + side + " panel!"));
18274 }
18275
18276 var $backdropEl = $('.panel-backdrop');
18277
18278 if ($backdropEl.length === 0) {
18279 $backdropEl = $('<div class="panel-backdrop"></div>');
18280 $backdropEl.insertBefore($el);
18281 }
18282
18283 Utils.extend(panel, {
18284 app: app,
18285 side: side,
18286 effect: effect,
18287 $el: $el,
18288 el: $el[0],
18289 opened: opened,
18290 $backdropEl: $backdropEl,
18291 backdropEl: $backdropEl[0],
5d51ea26 18292 params: params,
5309fbda
DC
18293 });
18294
18295 // Install Modules
18296 panel.useModules();
18297
18298 // Init
18299 panel.init();
18300
18301 return panel;
18302 }
18303
5d51ea26
DC
18304 if ( Framework7Class ) Panel.__proto__ = Framework7Class;
18305 Panel.prototype = Object.create( Framework7Class && Framework7Class.prototype );
5309fbda
DC
18306 Panel.prototype.constructor = Panel;
18307
5309fbda
DC
18308 Panel.prototype.getViewEl = function getViewEl () {
18309 var panel = this;
18310 var app = panel.app;
18311 var viewEl;
18312 if (app.root.children('.views').length > 0) {
18313 viewEl = app.root.children('.views')[0];
18314 } else {
18315 viewEl = app.root.children('.view')[0];
18316 }
18317 return viewEl;
18318 };
18319
5d51ea26
DC
18320 Panel.prototype.setBreakpoint = function setBreakpoint (emitEvents) {
18321 var obj, obj$1, obj$2;
5309fbda 18322
5d51ea26 18323 if ( emitEvents === void 0 ) emitEvents = true;
5309fbda
DC
18324 var panel = this;
18325 var app = panel.app;
18326 var side = panel.side;
18327 var $el = panel.$el;
18328 var $viewEl = $(panel.getViewEl());
18329 var breakpoint = app.params.panel[(side + "Breakpoint")];
18330 var wasVisible = $el.hasClass('panel-visible-by-breakpoint');
18331
18332 if (app.width >= breakpoint) {
18333 if (!wasVisible) {
18334 $('html').removeClass(("with-panel-" + side + "-reveal with-panel-" + side + "-cover with-panel"));
18335 $el.css('display', '').addClass('panel-visible-by-breakpoint').removeClass('panel-active');
18336 panel.onOpen();
18337 panel.onOpened();
18338 $viewEl.css(( obj = {}, obj[("margin-" + side)] = (($el.width()) + "px"), obj ));
18339 app.allowPanelOpen = true;
5d51ea26
DC
18340 if (emitEvents) {
18341 app.emit('local::breakpoint panelBreakpoint');
18342 panel.$el.trigger('panel:breakpoint', panel);
18343 }
18344 } else {
18345 $viewEl.css(( obj$1 = {}, obj$1[("margin-" + side)] = (($el.width()) + "px"), obj$1 ));
5309fbda
DC
18346 }
18347 } else if (wasVisible) {
18348 $el.css('display', '').removeClass('panel-visible-by-breakpoint panel-active');
18349 panel.onClose();
18350 panel.onClosed();
5d51ea26
DC
18351 $viewEl.css(( obj$2 = {}, obj$2[("margin-" + side)] = '', obj$2 ));
18352 if (emitEvents) {
18353 app.emit('local::breakpoint panelBreakpoint');
18354 panel.$el.trigger('panel:breakpoint', panel);
18355 }
5309fbda
DC
18356 }
18357 };
18358
18359 Panel.prototype.initBreakpoints = function initBreakpoints () {
18360 var panel = this;
18361 var app = panel.app;
18362 panel.resizeHandler = function resizeHandler() {
18363 panel.setBreakpoint();
18364 };
18365 if (app.params.panel[((panel.side) + "Breakpoint")]) {
18366 app.on('resize', panel.resizeHandler);
18367 }
18368 panel.setBreakpoint();
18369 return panel;
18370 };
18371
18372 Panel.prototype.initSwipePanel = function initSwipePanel () {
18373 {
18374 swipePanel(this);
18375 }
18376 };
18377
5d51ea26
DC
18378 Panel.prototype.initResizablePanel = function initResizablePanel () {
18379 resizablePanel(this);
18380 };
18381
18382 Panel.prototype.toggle = function toggle (animate) {
18383 if ( animate === void 0 ) animate = true;
18384
18385 var panel = this;
18386 if (panel.opened) { panel.close(animate); }
18387 else { panel.open(animate); }
18388 };
18389
18390 Panel.prototype.onOpen = function onOpen () {
18391 var panel = this;
18392 panel.opened = true;
18393
18394 panel.$el.trigger('panel:beforeopen', panel);
18395 panel.emit('local::beforeOpen panelBeforeOpen', panel);
18396
18397 panel.$el.trigger('panel:open', panel);
18398 panel.emit('local::open panelOpen', panel);
18399 };
18400
18401 Panel.prototype.onOpened = function onOpened () {
5309fbda
DC
18402 var panel = this;
18403 var app = panel.app;
5d51ea26 18404 app.panel.allowOpen = true;
5309fbda 18405
5d51ea26
DC
18406 panel.$el.trigger('panel:opened', panel);
18407 panel.emit('local::opened panelOpened', panel);
18408 };
5309fbda 18409
5d51ea26
DC
18410 Panel.prototype.onClose = function onClose () {
18411 var panel = this;
18412 panel.opened = false;
18413 panel.$el.addClass('panel-closing');
5309fbda 18414
5d51ea26
DC
18415 panel.$el.trigger('panel:beforeclose', panel);
18416 panel.emit('local::beforeClose panelBeforeClose', panel);
18417
18418 panel.$el.trigger('panel:close', panel);
18419 panel.emit('local::close panelClose', panel);
18420 };
18421
18422 Panel.prototype.onClosed = function onClosed () {
18423 var panel = this;
18424 var app = panel.app;
18425 app.panel.allowOpen = true;
18426 panel.$el.removeClass('panel-closing');
18427 panel.$el.trigger('panel:closed', panel);
18428 panel.emit('local::closed panelClosed', panel);
5309fbda
DC
18429 };
18430
18431 Panel.prototype.open = function open (animate) {
18432 if ( animate === void 0 ) animate = true;
18433
18434 var panel = this;
18435 var app = panel.app;
18436 if (!app.panel.allowOpen) { return false; }
18437
18438 var side = panel.side;
18439 var effect = panel.effect;
18440 var $el = panel.$el;
18441 var $backdropEl = panel.$backdropEl;
18442 var opened = panel.opened;
18443
18444 var $panelParentEl = $el.parent();
18445 var wasInDom = $el.parents(document).length > 0;
18446
18447 if (!$panelParentEl.is(app.root) || $el.prevAll('.views, .view').length) {
18448 var $insertBeforeEl = app.root.children('.panel, .views, .view').eq(0);
18449 var $insertAfterEl = app.root.children('.statusbar').eq(0);
18450
18451 if ($insertBeforeEl.length) {
18452 $el.insertBefore($insertBeforeEl);
18453 } else if ($insertAfterEl.length) {
18454 $el.insertAfter($insertBeforeEl);
18455 } else {
18456 app.root.prepend($el);
18457 }
18458
18459 if ($backdropEl
18460 && $backdropEl.length
18461 && (
18462 (
18463 !$backdropEl.parent().is(app.root)
18464 && $backdropEl.nextAll('.panel').length === 0
18465 )
18466 || (
18467 $backdropEl.parent().is(app.root)
18468 && $backdropEl.nextAll('.panel').length === 0
18469 )
18470 )
18471 ) {
18472 $backdropEl.insertBefore($el);
18473 }
18474
18475 panel.once('panelClosed', function () {
18476 if (wasInDom) {
18477 $panelParentEl.append($el);
18478 } else {
18479 $el.remove();
18480 }
18481 });
18482 }
18483
18484 // Ignore if opened
18485 if (opened || $el.hasClass('panel-visible-by-breakpoint') || $el.hasClass('panel-active')) { return false; }
18486
18487 // Close if some panel is opened
18488 app.panel.close(side === 'left' ? 'right' : 'left', animate);
18489
18490 app.panel.allowOpen = false;
18491
18492 $el[animate ? 'removeClass' : 'addClass']('not-animated');
18493 $el
18494 .css({ display: 'block' })
18495 .addClass('panel-active');
18496
18497 $backdropEl[animate ? 'removeClass' : 'addClass']('not-animated');
5d51ea26 18498 $backdropEl.css({ display: 'block' });
5309fbda
DC
18499
18500 /* eslint no-underscore-dangle: ["error", { "allow": ["_clientLeft"] }] */
5d51ea26 18501 // panel._clientLeft = $el[0].clientLeft;
5309fbda
DC
18502
18503 // Transition End;
18504 var transitionEndTarget = effect === 'reveal' ? $el.nextAll('.view, .views').eq(0) : $el;
18505
18506 function panelTransitionEnd() {
18507 transitionEndTarget.transitionEnd(function (e) {
18508 if ($(e.target).is(transitionEndTarget)) {
18509 if ($el.hasClass('panel-active')) {
18510 panel.onOpened();
18511 $backdropEl.css({ display: '' });
18512 } else {
18513 panel.onClosed();
18514 $backdropEl.css({ display: '' });
18515 }
18516 } else { panelTransitionEnd(); }
18517 });
18518 }
5d51ea26 18519
5309fbda 18520 if (animate) {
5d51ea26
DC
18521 Utils.nextFrame(function () {
18522 $('html').addClass(("with-panel with-panel-" + side + "-" + effect));
18523 panel.onOpen();
18524 panelTransitionEnd();
18525 });
5309fbda 18526 } else {
5d51ea26
DC
18527 $('html').addClass(("with-panel with-panel-" + side + "-" + effect));
18528 panel.onOpen();
5309fbda
DC
18529 panel.onOpened();
18530 $backdropEl.css({ display: '' });
18531 }
18532
18533 return true;
18534 };
18535
18536 Panel.prototype.close = function close (animate) {
18537 if ( animate === void 0 ) animate = true;
18538
18539 var panel = this;
18540 var app = panel.app;
18541
18542 var side = panel.side;
18543 var effect = panel.effect;
18544 var $el = panel.$el;
18545 var $backdropEl = panel.$backdropEl;
18546 var opened = panel.opened;
5309fbda
DC
18547 if (!opened || $el.hasClass('panel-visible-by-breakpoint') || !$el.hasClass('panel-active')) { return false; }
18548
18549 $el[animate ? 'removeClass' : 'addClass']('not-animated');
18550 $el.removeClass('panel-active');
18551
18552 $backdropEl[animate ? 'removeClass' : 'addClass']('not-animated');
18553
18554 var transitionEndTarget = effect === 'reveal' ? $el.nextAll('.view, .views').eq(0) : $el;
18555
18556 panel.onClose();
18557 app.panel.allowOpen = false;
18558
18559 if (animate) {
18560 transitionEndTarget.transitionEnd(function () {
18561 if ($el.hasClass('panel-active')) { return; }
18562 $el.css({ display: '' });
18563 $('html').removeClass('with-panel-transitioning');
18564 panel.onClosed();
18565 });
18566 $('html')
18567 .removeClass(("with-panel with-panel-" + side + "-" + effect))
18568 .addClass('with-panel-transitioning');
18569 } else {
18570 $el.css({ display: '' });
18571 $el.removeClass('not-animated');
18572 $('html').removeClass(("with-panel with-panel-transitioning with-panel-" + side + "-" + effect));
18573 panel.onClosed();
18574 }
18575 return true;
18576 };
18577
5d51ea26 18578 Panel.prototype.init = function init () {
5309fbda 18579 var panel = this;
5d51ea26
DC
18580 var app = panel.app;
18581 if (app.params.panel[((panel.side) + "Breakpoint")]) {
18582 panel.initBreakpoints();
18583 }
18584 {
18585 if (
18586 (app.params.panel.swipe === panel.side)
18587 || (app.params.panel.swipe === 'both')
18588 || (app.params.panel.swipe && app.params.panel.swipe !== panel.side && app.params.panel.swipeCloseOpposite)
18589 ) {
18590 panel.initSwipePanel();
18591 }
18592 }
18593 if (panel.params.resizable || panel.$el.hasClass('panel-resizable')) {
18594 panel.initResizablePanel();
18595 }
5309fbda
DC
18596 };
18597
5d51ea26
DC
18598 Panel.prototype.destroy = function destroy () {
18599 var obj;
18600
5309fbda
DC
18601 var panel = this;
18602 var app = panel.app;
5309fbda 18603
5d51ea26
DC
18604 if (!panel.$el) {
18605 // Panel already destroyed
18606 return;
18607 }
5309fbda 18608
5d51ea26
DC
18609 panel.emit('local::beforeDestroy panelBeforeDestroy', panel);
18610 panel.$el.trigger('panel:beforedestroy', panel);
5309fbda 18611
5d51ea26
DC
18612 if (panel.resizeHandler) {
18613 app.off('resize', panel.resizeHandler);
18614 }
18615
18616 if (panel.$el.hasClass('panel-visible-by-breakpoint')) {
18617 var $viewEl = $(panel.getViewEl());
18618 panel.$el.css('display', '').removeClass('panel-visible-by-breakpoint panel-active');
18619 $viewEl.css(( obj = {}, obj[("margin-" + (panel.side))] = '', obj ));
18620 app.emit('local::breakpoint panelBreakpoint');
18621 panel.$el.trigger('panel:breakpoint', panel);
18622 }
18623
18624 panel.$el.trigger('panel:destroy', panel);
18625 panel.emit('local::destroy panelDestroy');
18626 delete app.panel[panel.side];
18627 if (panel.el) {
18628 panel.el.f7Panel = null;
18629 delete panel.el.f7Panel;
18630 }
18631 Utils.deleteProps(panel);
18632
18633 panel = null;
5309fbda
DC
18634 };
18635
18636 return Panel;
18637 }(Framework7Class));
18638
18639 var Panel$1 = {
18640 name: 'panel',
18641 params: {
18642 panel: {
18643 leftBreakpoint: 0,
18644 rightBreakpoint: 0,
18645 swipe: undefined, // or 'left' or 'right' or 'both'
18646 swipeActiveArea: 0,
18647 swipeCloseActiveAreaSide: 0,
18648 swipeCloseOpposite: true,
18649 swipeOnlyClose: false,
18650 swipeNoFollow: false,
18651 swipeThreshold: 0,
18652 closeByBackdropClick: true,
18653 },
18654 },
18655 static: {
18656 Panel: Panel,
18657 },
18658 instance: {
18659 panel: {
18660 allowOpen: true,
18661 },
18662 },
18663 create: function create() {
18664 var app = this;
18665 Utils.extend(app.panel, {
5d51ea26
DC
18666 disableResizable: function disableResizable(panel) {
18667 if ( panel === void 0 ) panel = 'both';
18668
18669 var side;
18670 var panels = [];
18671 if (typeof panel === 'string') {
18672 if (panel === 'both') {
18673 side = 'both';
18674 panels = [app.panel.left, app.panel.right];
18675 } else {
18676 side = panel;
18677 panels.push(app.panel[side]);
18678 }
18679 } else {
18680 panels = [panel];
18681 }
18682 panels.forEach(function (panelInstance) {
18683 panelInstance.resizable = false;
18684 panelInstance.$el.removeClass('panel-resizable');
18685 });
18686 },
18687 enableResizable: function enableResizable(panel) {
18688 if ( panel === void 0 ) panel = 'both';
18689
18690 var side;
18691 var panels = [];
18692 if (typeof panel === 'string') {
18693 if (panel === 'both') {
18694 side = 'both';
18695 panels = [app.panel.left, app.panel.right];
18696 } else {
18697 side = panel;
18698 panels.push(app.panel[side]);
18699 }
18700 } else {
18701 panels = [panel];
18702 }
18703 panels.forEach(function (panelInstance) {
18704 if (!panelInstance) { return; }
18705 if (!panelInstance.resizableInitialized) {
18706 panelInstance.initResizablePanel();
18707 } else {
18708 panelInstance.resizable = true;
18709 panelInstance.$el.addClass('panel-resizable');
18710 }
18711 });
18712 },
5309fbda
DC
18713 disableSwipe: function disableSwipe(panel) {
18714 if ( panel === void 0 ) panel = 'both';
18715
18716 var side;
18717 var panels = [];
18718 if (typeof panel === 'string') {
18719 if (panel === 'both') {
18720 side = 'both';
18721 panels = [app.panel.left, app.panel.right];
18722 } else {
18723 side = panel;
18724 panels.push(app.panel[side]);
18725 }
18726 } else {
18727 panels = [panel];
18728 }
18729 panels.forEach(function (panelInstance) {
5d51ea26 18730 panelInstance.swipeable = false;
5309fbda
DC
18731 });
18732 },
18733 enableSwipe: function enableSwipe(panel) {
18734 if ( panel === void 0 ) panel = 'both';
18735
18736 var panels = [];
18737 var side;
18738 if (typeof panel === 'string') {
18739 side = panel;
18740 if (
18741 (app.params.panel.swipe === 'left' && side === 'right')
18742 || (app.params.panel.swipe === 'right' && side === 'left')
18743 || side === 'both'
18744 ) {
18745 side = 'both';
18746 app.params.panel.swipe = side;
18747 panels = [app.panel.left, app.panel.right];
18748 } else {
18749 app.params.panel.swipe = side;
18750 panels.push(app.panel[side]);
18751 }
18752 } else if (panel) {
18753 panels.push(panel);
18754 }
5d51ea26
DC
18755 panels.forEach(function (panelInstance) {
18756 if (!panelInstance) { return; }
18757 if (!panelInstance.swipeInitialized) {
18758 panelInstance.initSwipePanel();
18759 } else {
18760 panelInstance.swipeable = true;
18761 }
18762 });
5309fbda
DC
18763 },
18764 create: function create(params) {
18765 return new Panel(app, params);
18766 },
18767 open: function open(side, animate) {
18768 var panelSide = side;
18769 if (!panelSide) {
18770 if ($('.panel').length > 1) {
18771 return false;
18772 }
18773 panelSide = $('.panel').hasClass('panel-left') ? 'left' : 'right';
18774 }
18775 if (!panelSide) { return false; }
18776 if (app.panel[panelSide]) {
18777 return app.panel[panelSide].open(animate);
18778 }
18779 var $panelEl = $((".panel-" + panelSide));
18780 if ($panelEl.length > 0) {
18781 return app.panel.create({ el: $panelEl }).open(animate);
18782 }
18783 return false;
18784 },
18785 close: function close(side, animate) {
18786 var $panelEl;
18787 var panelSide;
18788 if (panelSide) {
18789 panelSide = side;
18790 $panelEl = $((".panel-" + panelSide));
18791 } else {
18792 $panelEl = $('.panel.panel-active');
18793 panelSide = $panelEl.hasClass('panel-left') ? 'left' : 'right';
18794 }
18795 if (!panelSide) { return false; }
18796 if (app.panel[panelSide]) {
18797 return app.panel[panelSide].close(animate);
18798 }
18799 if ($panelEl.length > 0) {
18800 return app.panel.create({ el: $panelEl }).close(animate);
18801 }
18802 return false;
18803 },
5d51ea26
DC
18804 toggle: function toggle(side, animate) {
18805 var $panelEl;
18806 var panelSide = side;
18807 if (side) {
18808 panelSide = side;
18809 $panelEl = $((".panel-" + panelSide));
18810 } else if ($('.panel.panel-active').length) {
18811 $panelEl = $('.panel.panel-active');
18812 panelSide = $panelEl.hasClass('panel-left') ? 'left' : 'right';
18813 } else {
18814 if ($('.panel').length > 1) {
18815 return false;
18816 }
18817 panelSide = $('.panel').hasClass('panel-left') ? 'left' : 'right';
18818 $panelEl = $((".panel-" + panelSide));
18819 }
18820 if (!panelSide) { return false; }
18821 if (app.panel[panelSide]) {
18822 return app.panel[panelSide].toggle(animate);
18823 }
18824 if ($panelEl.length > 0) {
18825 return app.panel.create({ el: $panelEl }).toggle(animate);
18826 }
18827 return false;
18828 },
5309fbda
DC
18829 get: function get(side) {
18830 var panelSide = side;
18831 if (!panelSide) {
18832 if ($('.panel').length > 1) {
18833 return undefined;
18834 }
18835 panelSide = $('.panel').hasClass('panel-left') ? 'left' : 'right';
18836 }
18837 if (!panelSide) { return undefined; }
18838 if (app.panel[panelSide]) {
18839 return app.panel[panelSide];
18840 }
18841 var $panelEl = $((".panel-" + panelSide));
18842 if ($panelEl.length > 0) {
18843 return app.panel.create({ el: $panelEl });
18844 }
18845 return undefined;
18846 },
18847 });
18848 },
18849 on: {
18850 init: function init() {
18851 var app = this;
18852
18853 // Create Panels
18854 $('.panel').each(function (index, panelEl) {
18855 var side = $(panelEl).hasClass('panel-left') ? 'left' : 'right';
18856 app.panel[side] = app.panel.create({ el: panelEl, side: side });
18857 });
18858 },
18859 },
18860 clicks: {
18861 '.panel-open': function open(clickedEl, data) {
18862 if ( data === void 0 ) data = {};
18863
18864 var app = this;
18865 var side = 'left';
18866 if (data.panel === 'right' || ($('.panel').length === 1 && $('.panel').hasClass('panel-right'))) {
18867 side = 'right';
18868 }
18869 app.panel.open(side, data.animate);
18870 },
18871 '.panel-close': function close(clickedEl, data) {
18872 if ( data === void 0 ) data = {};
18873
18874 var app = this;
18875 var side = data.panel;
18876 app.panel.close(side, data.animate);
18877 },
5d51ea26
DC
18878 '.panel-toggle': function close(clickedEl, data) {
18879 if ( data === void 0 ) data = {};
18880
18881 var app = this;
18882 var side = data.panel;
18883 app.panel.toggle(side, data.animate);
18884 },
5309fbda
DC
18885 '.panel-backdrop': function close() {
18886 var app = this;
18887 var $panelEl = $('.panel-active');
18888 var instance = $panelEl[0] && $panelEl[0].f7Panel;
18889 $panelEl.trigger('panel:backdrop-click');
18890 if (instance) {
18891 instance.emit('backdropClick', instance);
18892 }
18893 app.emit('panelBackdropClick', instance || $panelEl[0]);
18894 if (app.params.panel.closeByBackdropClick) { app.panel.close(); }
18895 },
18896 },
18897 };
18898
5d51ea26
DC
18899 /* eslint no-param-reassign: "off" */
18900
5309fbda
DC
18901 var CardExpandable = {
18902 open: function open(cardEl, animate) {
18903 var assign;
18904
18905 if ( cardEl === void 0 ) cardEl = '.card-expandable';
18906 if ( animate === void 0 ) animate = true;
18907 var app = this;
5d51ea26 18908
5309fbda
DC
18909 if ($('.card-opened').length) { return; }
18910 var $cardEl = $(cardEl).eq(0);
18911
18912 if (!$cardEl || !$cardEl.length) { return; }
18913 if ($cardEl.hasClass('card-opened') || $cardEl.hasClass('card-opening') || $cardEl.hasClass('card-closing')) { return; }
18914
18915 var $pageEl = $cardEl.parents('.page').eq(0);
18916 if (!$pageEl.length) { return; }
18917
18918 var prevented;
18919
18920 function prevent() {
18921 prevented = true;
18922 }
18923
18924 $cardEl.trigger('card:beforeopen', { prevent: prevent });
18925 app.emit('cardBeforeOpen', $cardEl[0], prevent);
18926
18927 if (prevented) { return; }
18928
5d51ea26
DC
18929 var cardParams = Object.assign({ animate: animate }, app.params.card, $cardEl.dataset());
18930
18931 var $pageContentEl = $cardEl.parents('.page-content');
18932
18933 var $backdropEl;
18934 if ($cardEl.attr('data-backdrop-el')) {
18935 $backdropEl = $($cardEl.attr('data-backdrop-el'));
18936 }
18937 if (!$backdropEl && cardParams.backdrop) {
18938 $backdropEl = $pageContentEl.find('.card-backdrop');
18939 if (!$backdropEl.length) {
18940 $backdropEl = $('<div class="card-backdrop"></div>');
18941 $pageContentEl.append($backdropEl);
5309fbda
DC
18942 }
18943 }
18944
18945 var $navbarEl;
18946 var $toolbarEl;
5d51ea26 18947 if (cardParams.hideNavbarOnOpen) {
5309fbda
DC
18948 $navbarEl = $pageEl.children('.navbar');
18949 if (!$navbarEl.length) {
18950 if ($pageEl[0].f7Page) { $navbarEl = $pageEl[0].f7Page.$navbarEl; }
18951 }
18952 }
5d51ea26 18953 if (cardParams.hideToolbarOnOpen) {
5309fbda
DC
18954 $toolbarEl = $pageEl.children('.toolbar');
18955 if (!$toolbarEl.length) {
18956 $toolbarEl = $pageEl.parents('.view').children('.toolbar');
18957 }
18958 if (!$toolbarEl.length) {
18959 $toolbarEl = $pageEl.parents('.views').children('.toolbar');
18960 }
18961 }
18962
18963 var currTransform = $cardEl.css('transform');
18964 var hasTransform;
18965 if (currTransform && currTransform.match(/[2-9]/)) {
18966 hasTransform = true;
18967 }
18968 var $cardContentEl = $cardEl.children('.card-content');
18969
18970 var $cardSizeEl = $(document.createElement('div')).addClass('card-expandable-size');
18971 $cardEl.append($cardSizeEl);
18972
18973 var cardWidth = $cardEl[0].offsetWidth;
18974 var cardHeight = $cardEl[0].offsetHeight;
18975 var pageWidth = $pageEl[0].offsetWidth;
18976 var pageHeight = $pageEl[0].offsetHeight;
18977
18978 var maxWidth = $cardSizeEl[0].offsetWidth || pageWidth;
18979 var maxHeight = $cardSizeEl[0].offsetHeight || pageHeight;
18980
18981 var scaleX = maxWidth / cardWidth;
18982 var scaleY = maxHeight / cardHeight;
18983
18984 var offset = $cardEl.offset();
5d51ea26
DC
18985 var pageOffset = $pageEl.offset();
18986 offset.left -= pageOffset.left;
5309fbda
DC
18987
18988 var cardLeftOffset;
18989 var cardTopOffset;
18990
18991 if (hasTransform) {
5d51ea26
DC
18992 var transformValues = currTransform
18993 .replace(/matrix\(|\)/g, '')
18994 .split(',')
18995 .map(function (el) { return el.trim(); });
18996 if (transformValues && transformValues.length > 1) {
18997 var scale = parseFloat(transformValues[0]);
18998 cardLeftOffset = offset.left - cardWidth * (1 - scale) / 2;
18999 cardTopOffset = offset.top - pageOffset.top - cardHeight * (1 - scale) / 2;
19000 if (app.rtl) { cardLeftOffset -= $cardEl[0].scrollLeft; }
19001 } else {
19002 cardLeftOffset = $cardEl[0].offsetLeft;
19003 cardTopOffset = $cardEl[0].offsetTop - ($pageContentEl.length ? $pageContentEl[0].scrollTop : 0);
19004 }
5309fbda
DC
19005 } else {
19006 cardLeftOffset = offset.left;
5d51ea26 19007 cardTopOffset = offset.top - pageOffset.top;
5309fbda
DC
19008 if (app.rtl) { cardLeftOffset -= $cardEl[0].scrollLeft; }
19009 }
19010
19011 cardLeftOffset -= (pageWidth - maxWidth) / 2;
19012 cardTopOffset -= (pageHeight - maxHeight) / 2;
19013
19014 var cardRightOffset = maxWidth - cardWidth - cardLeftOffset;
19015 if (app.rtl) {
19016 (assign = [cardRightOffset, cardLeftOffset], cardLeftOffset = assign[0], cardRightOffset = assign[1]);
19017 }
19018 var cardBottomOffset = maxHeight - cardHeight - cardTopOffset;
19019 var translateX = (cardRightOffset - cardLeftOffset) / 2;
19020 var translateY = (cardBottomOffset - cardTopOffset) / 2;
5d51ea26
DC
19021 if (cardParams.hideNavbarOnOpen && $navbarEl && $navbarEl.length) {
19022 app.navbar.hide($navbarEl, cardParams.animate);
5309fbda 19023 }
5d51ea26
DC
19024 if (cardParams.hideToolbarOnOpen && $toolbarEl && $toolbarEl.length) {
19025 app.toolbar.hide($toolbarEl, cardParams.animate);
5309fbda 19026 }
5d51ea26
DC
19027 if ($backdropEl) {
19028 $backdropEl.removeClass('card-backdrop-out').addClass('card-backdrop-in');
5309fbda
DC
19029 }
19030 $cardEl.removeClass('card-transitioning');
5d51ea26 19031 if (cardParams.animate) {
5309fbda
DC
19032 $cardEl.addClass('card-opening');
19033 }
19034 $cardEl.trigger('card:open');
19035 app.emit('cardOpen', $cardEl[0]);
19036 function transitionEnd() {
5d51ea26
DC
19037 $pageEl.addClass('page-with-card-opened');
19038 if (app.device.ios && $pageContentEl.length) {
19039 $pageContentEl.css('height', (($pageContentEl[0].offsetHeight + 1) + "px"));
19040 setTimeout(function () {
19041 $pageContentEl.css('height', '');
19042 });
19043 }
5309fbda
DC
19044 $cardEl.addClass('card-opened');
19045 $cardEl.removeClass('card-opening');
19046 $cardEl.trigger('card:opened');
5d51ea26 19047 app.emit('cardOpened', $cardEl[0], $pageEl[0]);
5309fbda
DC
19048 }
19049 $cardContentEl
19050 .css({
19051 width: (maxWidth + "px"),
19052 height: (maxHeight + "px"),
19053 })
19054 .transform(("translate3d(" + (app.rtl ? (cardLeftOffset + translateX) : (-cardLeftOffset - translateX)) + "px, 0px, 0) scale(" + (1 / scaleX) + ", " + (1 / scaleY) + ")"));
19055
19056 $cardEl
19057 .transform(("translate3d(" + translateX + "px, " + translateY + "px, 0) scale(" + scaleX + ", " + scaleY + ")"));
5d51ea26 19058 if (cardParams.animate) {
5309fbda
DC
19059 $cardEl.transitionEnd(function () {
19060 transitionEnd();
19061 });
19062 } else {
19063 transitionEnd();
19064 }
19065
5309fbda
DC
19066 function onResize() {
19067 var assign;
19068
19069 $cardEl.removeClass('card-transitioning');
19070 cardWidth = $cardEl[0].offsetWidth;
19071 cardHeight = $cardEl[0].offsetHeight;
19072 pageWidth = $pageEl[0].offsetWidth;
19073 pageHeight = $pageEl[0].offsetHeight;
19074 maxWidth = $cardSizeEl[0].offsetWidth || pageWidth;
19075 maxHeight = $cardSizeEl[0].offsetHeight || pageHeight;
19076
19077 scaleX = maxWidth / cardWidth;
19078 scaleY = maxHeight / cardHeight;
19079
19080 $cardEl.transform('translate3d(0px, 0px, 0) scale(1)');
19081 offset = $cardEl.offset();
5d51ea26
DC
19082 pageOffset = $pageEl.offset();
19083 offset.left -= pageOffset.left;
19084 offset.top -= pageOffset.top;
5309fbda
DC
19085
19086 cardLeftOffset = offset.left - (pageWidth - maxWidth) / 2;
19087 if (app.rtl) { cardLeftOffset -= $cardEl[0].scrollLeft; }
19088 cardTopOffset = offset.top - (pageHeight - maxHeight) / 2;
19089
19090 cardRightOffset = maxWidth - cardWidth - cardLeftOffset;
19091 cardBottomOffset = maxHeight - cardHeight - cardTopOffset;
19092 if (app.rtl) {
19093 (assign = [cardRightOffset, cardLeftOffset], cardLeftOffset = assign[0], cardRightOffset = assign[1]);
19094 }
19095 translateX = (cardRightOffset - cardLeftOffset) / 2;
19096 translateY = (cardBottomOffset - cardTopOffset) / 2;
19097
19098 $cardEl.transform(("translate3d(" + translateX + "px, " + translateY + "px, 0) scale(" + scaleX + ", " + scaleY + ")"));
19099 $cardContentEl
19100 .css({
19101 width: (maxWidth + "px"),
19102 height: (maxHeight + "px"),
19103 })
19104 .transform(("translate3d(" + (app.rtl ? (cardLeftOffset + translateX) : (-cardLeftOffset - translateX)) + "px, 0px, 0) scale(" + (1 / scaleX) + ", " + (1 / scaleY) + ")"));
19105 }
19106
19107 var cardScrollTop;
19108 var isTouched;
19109 var isMoved;
19110 var touchStartX;
19111 var touchStartY;
19112 var touchEndX;
19113 var touchEndY;
19114 var isScrolling;
19115 var progress;
19116 var isV;
19117 var isH;
19118 function onTouchStart(e) {
19119 if (!$(e.target).closest($cardEl).length) { return; }
19120 if (!$cardEl.hasClass('card-opened')) { return; }
19121 cardScrollTop = $cardContentEl.scrollTop();
19122 isTouched = true;
19123 touchStartX = e.targetTouches[0].pageX;
19124 touchStartY = e.targetTouches[0].pageY;
19125 isScrolling = undefined;
19126 isV = false;
19127 isH = false;
19128 }
19129 function onTouchMove(e) {
19130 if (!isTouched) { return; }
19131 touchEndX = e.targetTouches[0].pageX;
19132 touchEndY = e.targetTouches[0].pageY;
19133 if (typeof isScrolling === 'undefined') {
19134 isScrolling = !!(isScrolling || Math.abs(touchEndY - touchStartY) > Math.abs(touchEndX - touchStartX));
19135 }
19136 if (!isH && !isV) {
19137 if (!isScrolling && e.targetTouches[0].clientX <= 50) {
19138 isH = true;
19139 } else {
19140 isV = true;
19141 }
19142 }
19143
19144 if (!(isH || isV) || (isV && cardScrollTop !== 0)) {
19145 isTouched = true;
19146 isMoved = true;
19147 return;
19148 }
19149 if (!isMoved) {
19150 $cardEl.removeClass('card-transitioning');
19151 }
19152
19153 isMoved = true;
19154 progress = isV ? Math.max((touchEndY - touchStartY) / 150, 0) : Math.max((touchEndX - touchStartX) / (cardWidth / 2), 0);
19155 if ((progress > 0 && isV) || isH) {
19156 if (isV && app.device.ios) {
19157 $cardContentEl.css('-webkit-overflow-scrolling', 'auto');
19158 $cardContentEl.scrollTop(0);
19159 }
19160 e.preventDefault();
19161 }
19162
19163 if (progress > 1) { progress = Math.pow( progress, 0.3 ); }
19164 if (progress > (isV ? 1.3 : 1.1)) {
19165 isTouched = false;
19166 isMoved = false;
19167 app.card.close($cardEl);
19168 } else {
19169 $cardEl.transform(("translate3d(" + translateX + "px, " + translateY + "px, 0) scale(" + (scaleX * (1 - progress * 0.2)) + ", " + (scaleY * (1 - progress * 0.2)) + ")"));
19170 }
19171 }
19172 function onTouchEnd() {
19173 if (!isTouched || !isMoved) { return; }
19174 isTouched = false;
19175 isMoved = false;
19176 if (app.device.ios) {
19177 $cardContentEl.css('-webkit-overflow-scrolling', '');
19178 }
19179 if (progress >= 0.8) {
19180 app.card.close($cardEl);
19181 } else {
19182 $cardEl
19183 .addClass('card-transitioning')
19184 .transform(("translate3d(" + translateX + "px, " + translateY + "px, 0) scale(" + scaleX + ", " + scaleY + ")"));
19185 }
19186 }
19187
19188 $cardEl[0].detachEventHandlers = function detachEventHandlers() {
19189 app.off('resize', onResize);
5d51ea26 19190 if (Support.touch && cardParams.swipeToClose) {
5309fbda
DC
19191 app.off('touchstart:passive', onTouchStart);
19192 app.off('touchmove:active', onTouchMove);
19193 app.off('touchend:passive', onTouchEnd);
19194 }
19195 };
19196
19197 app.on('resize', onResize);
5d51ea26 19198 if (Support.touch && cardParams.swipeToClose) {
5309fbda
DC
19199 app.on('touchstart:passive', onTouchStart);
19200 app.on('touchmove:active', onTouchMove);
19201 app.on('touchend:passive', onTouchEnd);
19202 }
19203 },
19204 close: function close(cardEl, animate) {
19205 if ( cardEl === void 0 ) cardEl = '.card-expandable.card-opened';
19206 if ( animate === void 0 ) animate = true;
19207
19208 var app = this;
19209 var $cardEl = $(cardEl).eq(0);
19210 if (!$cardEl || !$cardEl.length) { return; }
19211 if (!$cardEl.hasClass('card-opened') || $cardEl.hasClass('card-opening') || $cardEl.hasClass('card-closing')) { return; }
19212
19213 var $cardContentEl = $cardEl.children('.card-content');
5d51ea26 19214 var $pageContentEl = $cardEl.parents('.page-content');
5309fbda
DC
19215
19216 var $pageEl = $cardEl.parents('.page').eq(0);
19217 if (!$pageEl.length) { return; }
5d51ea26
DC
19218
19219 var cardParams = Object.assign({ animate: animate }, app.params.card, $cardEl.dataset());
19220
5309fbda
DC
19221 var $navbarEl;
19222 var $toolbarEl;
19223
5d51ea26
DC
19224 var $backdropEl;
19225 if ($cardEl.attr('data-backdrop-el')) {
19226 $backdropEl = $($cardEl.attr('data-backdrop-el'));
19227 }
19228 if (cardParams.backdrop) {
19229 $backdropEl = $cardEl.parents('.page-content').find('.card-backdrop');
5309fbda
DC
19230 }
19231
5d51ea26 19232 if (cardParams.hideNavbarOnOpen) {
5309fbda
DC
19233 $navbarEl = $pageEl.children('.navbar');
19234 if (!$navbarEl.length) {
19235 if ($pageEl[0].f7Page) { $navbarEl = $pageEl[0].f7Page.$navbarEl; }
19236 }
19237 if ($navbarEl && $navbarEl.length) {
5d51ea26 19238 app.navbar.show($navbarEl, cardParams.animate);
5309fbda
DC
19239 }
19240 }
5d51ea26 19241 if (cardParams.hideToolbarOnOpen) {
5309fbda
DC
19242 $toolbarEl = $pageEl.children('.toolbar');
19243 if (!$toolbarEl.length) {
19244 $toolbarEl = $pageEl.parents('.view').children('.toolbar');
19245 }
19246 if (!$toolbarEl.length) {
19247 $toolbarEl = $pageEl.parents('.views').children('.toolbar');
19248 }
19249 if ($toolbarEl && $toolbarEl.length) {
5d51ea26 19250 app.toolbar.show($toolbarEl, cardParams.animate);
5309fbda
DC
19251 }
19252 }
5d51ea26 19253
5309fbda
DC
19254 $pageEl.removeClass('page-with-card-opened');
19255
5d51ea26
DC
19256 if (app.device.ios && $pageContentEl.length) {
19257 $pageContentEl.css('height', (($pageContentEl[0].offsetHeight + 1) + "px"));
19258 setTimeout(function () {
19259 $pageContentEl.css('height', '');
19260 });
19261 }
5309fbda 19262
5d51ea26
DC
19263 if ($backdropEl && $backdropEl.length) {
19264 $backdropEl.removeClass('card-backdrop-in').addClass('card-backdrop-out');
5309fbda
DC
19265 }
19266
19267 $cardEl.removeClass('card-opened card-transitioning');
5d51ea26 19268 if (cardParams.animate) {
5309fbda
DC
19269 $cardEl.addClass('card-closing');
19270 } else {
19271 $cardEl.addClass('card-no-transition');
19272 }
19273 $cardEl.transform('');
19274 $cardEl.trigger('card:close');
19275 app.emit('cardClose', $cardEl[0]);
19276
19277 function transitionEnd() {
19278 $cardEl.removeClass('card-closing card-no-transition');
19279 $cardEl.trigger('card:closed');
19280 $cardEl.find('.card-expandable-size').remove();
5d51ea26 19281 app.emit('cardClosed', $cardEl[0], $pageEl[0]);
5309fbda
DC
19282 }
19283 $cardContentEl
19284 .css({
19285 width: '',
19286 height: '',
19287 })
19288 .transform('')
19289 .scrollTop(0, animate ? 300 : 0);
19290 if (animate) {
19291 $cardContentEl.transitionEnd(function () {
19292 transitionEnd();
19293 });
19294 } else {
19295 transitionEnd();
19296 }
19297
19298 if ($cardEl[0].detachEventHandlers) {
19299 $cardEl[0].detachEventHandlers();
19300 delete $cardEl[0].detachEventHandlers;
19301 }
19302 },
19303 toggle: function toggle(cardEl, animate) {
19304 if ( cardEl === void 0 ) cardEl = '.card-expandable';
19305
19306 var app = this;
19307 var $cardEl = $(cardEl).eq(0);
19308 if (!$cardEl.length) { return; }
19309 if ($cardEl.hasClass('card-opened')) {
19310 app.card.close($cardEl, animate);
19311 } else {
19312 app.card.open($cardEl, animate);
19313 }
19314 },
19315 };
19316
19317 var Card = {
19318 name: 'card',
19319 params: {
19320 card: {
19321 hideNavbarOnOpen: true,
19322 hideToolbarOnOpen: true,
19323 swipeToClose: true,
19324 closeByBackdropClick: true,
5d51ea26 19325 backdrop: true,
5309fbda
DC
19326 },
19327 },
19328 create: function create() {
19329 var app = this;
19330 Utils.extend(app, {
19331 card: {
19332 open: CardExpandable.open.bind(app),
19333 close: CardExpandable.close.bind(app),
19334 toggle: CardExpandable.toggle.bind(app),
19335 },
19336 });
19337 },
5d51ea26
DC
19338 on: {
19339 pageBeforeIn: function pageBeforeIn(page) {
19340 var app = this;
19341 if (app.params.card.hideNavbarOnOpen && page.navbarEl && page.$el.find('.card-opened.card-expandable').length) {
19342 app.navbar.hide(page.navbarEl);
19343 }
19344
19345 if (app.params.card.hideToolbarOnOpen && page.$el.find('.card-opened.card-expandable').length) {
19346 var $toolbarEl = page.$el.children('.toolbar');
19347 if (!$toolbarEl.length) {
19348 $toolbarEl = page.$el.parents('.view').children('.toolbar');
19349 }
19350 if (!$toolbarEl.length) {
19351 $toolbarEl = page.$el.parents('.views').children('.toolbar');
19352 }
19353 if ($toolbarEl && $toolbarEl.length) {
19354 app.toolbar.hide($toolbarEl);
19355 }
19356 }
19357 },
19358 },
5309fbda
DC
19359 clicks: {
19360 '.card-close': function closeCard($clickedEl, data) {
19361 var app = this;
5d51ea26 19362 app.card.close(data.card, data.animate);
5309fbda
DC
19363 },
19364 '.card-open': function closeCard($clickedEl, data) {
19365 var app = this;
5d51ea26 19366 app.card.open(data.card, data.animate);
5309fbda
DC
19367 },
19368 '.card-expandable': function toggleExpandableCard($clickedEl, data, e) {
19369 var app = this;
19370 if ($clickedEl.hasClass('card-opened') || $clickedEl.hasClass('card-opening') || $clickedEl.hasClass('card-closing')) { return; }
5d51ea26 19371 if ($(e.target).closest('.card-prevent-open, .card-close').length) { return; }
5309fbda
DC
19372 app.card.open($clickedEl);
19373 },
19374 '.card-backdrop-in': function onBackdropClick() {
19375 var app = this;
19376 var needToClose = false;
19377 if (app.params.card.closeByBackdropClick) { needToClose = true; }
19378 var $openedCardEl = $('.card-opened');
19379 if (!$openedCardEl.length) { return; }
5d51ea26 19380 if ($openedCardEl.attr('data-close-by-backdrop-click') === 'true') {
5309fbda 19381 needToClose = true;
5d51ea26 19382 } else if ($openedCardEl.attr('data-close-by-backdrop-click') === 'false') {
5309fbda
DC
19383 needToClose = false;
19384 }
19385 if (needToClose) { app.card.close($openedCardEl); }
19386 },
19387 },
19388 };
19389
19390 var Chip = {
19391 name: 'chip',
19392 };
19393
19394 // Form Data
19395 var FormData$1 = {
19396 store: function store(form, data) {
19397 var app = this;
19398 var formId = form;
19399
19400 var $formEl = $(form);
19401 if ($formEl.length && $formEl.is('form') && $formEl.attr('id')) {
19402 formId = $formEl.attr('id');
19403 }
19404 // Store form data in app.formsData
19405 app.form.data[("form-" + formId)] = data;
19406
19407 // Store form data in local storage also
19408 try {
19409 win.localStorage[("f7form-" + formId)] = JSON.stringify(data);
19410 } catch (e) {
19411 throw e;
19412 }
19413 },
19414 get: function get(form) {
19415 var app = this;
19416 var formId = form;
19417
19418 var $formEl = $(form);
19419 if ($formEl.length && $formEl.is('form') && $formEl.attr('id')) {
19420 formId = $formEl.attr('id');
19421 }
19422
19423 try {
19424 if (win.localStorage[("f7form-" + formId)]) {
19425 return JSON.parse(win.localStorage[("f7form-" + formId)]);
19426 }
19427 } catch (e) {
19428 throw e;
19429 }
19430 if (app.form.data[("form-" + formId)]) {
19431 return app.form.data[("form-" + formId)];
19432 }
19433 return undefined;
19434 },
19435 remove: function remove(form) {
19436 var app = this;
19437 var formId = form;
19438
19439 var $formEl = $(form);
19440 if ($formEl.length && $formEl.is('form') && $formEl.attr('id')) {
19441 formId = $formEl.attr('id');
19442 }
19443
19444 // Delete form data from app.formsData
19445 if (app.form.data[("form-" + formId)]) {
19446 app.form.data[("form-" + formId)] = '';
19447 delete app.form.data[("form-" + formId)];
19448 }
19449
19450 // Delete form data from local storage also
19451 try {
19452 if (win.localStorage[("f7form-" + formId)]) {
19453 win.localStorage[("f7form-" + formId)] = '';
19454 win.localStorage.removeItem(("f7form-" + formId));
19455 }
19456 } catch (e) {
19457 throw e;
19458 }
19459 },
19460 };
19461
19462 // Form Storage
19463 var FormStorage = {
19464 init: function init(formEl) {
19465 var app = this;
19466 var $formEl = $(formEl);
19467 var formId = $formEl.attr('id');
19468 if (!formId) { return; }
19469 var initialData = app.form.getFormData(formId);
19470 if (initialData) {
19471 app.form.fillFromData($formEl, initialData);
19472 }
19473 function store() {
19474 var data = app.form.convertToData($formEl);
19475 if (!data) { return; }
19476 app.form.storeFormData(formId, data);
19477 $formEl.trigger('form:storedata', data);
19478 app.emit('formStoreData', $formEl[0], data);
19479 }
19480 $formEl.on('change submit', store);
19481 },
19482 destroy: function destroy(formEl) {
19483 var $formEl = $(formEl);
19484 $formEl.off('change submit');
19485 },
19486 };
19487
19488 // Form To/From Data
19489 function formToData(formEl) {
19490 var app = this;
19491 var $formEl = $(formEl).eq(0);
19492 if ($formEl.length === 0) { return undefined; }
19493
19494 // Form data
19495 var data = {};
19496
19497 // Skip input types
19498 var skipTypes = ['submit', 'image', 'button', 'file'];
19499 var skipNames = [];
19500 $formEl.find('input, select, textarea').each(function (inputIndex, inputEl) {
19501 var $inputEl = $(inputEl);
19502 if ($inputEl.hasClass('ignore-store-data') || $inputEl.hasClass('no-store-data')) {
19503 return;
19504 }
19505 var name = $inputEl.attr('name');
19506 var type = $inputEl.attr('type');
19507 var tag = inputEl.nodeName.toLowerCase();
19508 if (skipTypes.indexOf(type) >= 0) { return; }
19509 if (skipNames.indexOf(name) >= 0 || !name) { return; }
19510 if (tag === 'select' && $inputEl.prop('multiple')) {
19511 skipNames.push(name);
19512 data[name] = [];
19513 $formEl.find(("select[name=\"" + name + "\"] option")).each(function (index, el) {
19514 if (el.selected) { data[name].push(el.value); }
19515 });
19516 } else {
19517 switch (type) {
19518 case 'checkbox':
19519 skipNames.push(name);
19520 data[name] = [];
19521 $formEl.find(("input[name=\"" + name + "\"]")).each(function (index, el) {
19522 if (el.checked) { data[name].push(el.value); }
19523 });
19524 break;
19525 case 'radio':
19526 skipNames.push(name);
19527 $formEl.find(("input[name=\"" + name + "\"]")).each(function (index, el) {
19528 if (el.checked) { data[name] = el.value; }
19529 });
19530 break;
19531 default:
19532 data[name] = $inputEl.val();
19533 break;
19534 }
19535 }
19536 });
19537 $formEl.trigger('form:todata', data);
19538 app.emit('formToData', $formEl[0], data);
19539
19540 return data;
19541 }
19542 function formFromData(formEl, formData) {
19543 var app = this;
19544 var $formEl = $(formEl).eq(0);
19545 if (!$formEl.length) { return; }
19546
19547 var data = formData;
19548 var formId = $formEl.attr('id');
19549
19550 if (!data && formId) {
19551 data = app.form.getFormData(formId);
19552 }
19553
19554 if (!data) { return; }
19555
19556 // Skip input types
19557 var skipTypes = ['submit', 'image', 'button', 'file'];
19558 var skipNames = [];
19559
19560 $formEl.find('input, select, textarea').each(function (inputIndex, inputEl) {
19561 var $inputEl = $(inputEl);
19562 if ($inputEl.hasClass('ignore-store-data') || $inputEl.hasClass('no-store-data')) {
19563 return;
19564 }
19565 var name = $inputEl.attr('name');
19566 var type = $inputEl.attr('type');
19567 var tag = inputEl.nodeName.toLowerCase();
19568 if (typeof data[name] === 'undefined' || data[name] === null) { return; }
19569 if (skipTypes.indexOf(type) >= 0) { return; }
19570 if (skipNames.indexOf(name) >= 0 || !name) { return; }
19571 if (tag === 'select' && $inputEl.prop('multiple')) {
19572 skipNames.push(name);
19573 $formEl.find(("select[name=\"" + name + "\"] option")).each(function (index, el) {
19574 var selectEl = el;
19575 if (data[name].indexOf(el.value) >= 0) { selectEl.selected = true; }
19576 else { selectEl.selected = false; }
19577 });
19578 } else {
19579 switch (type) {
19580 case 'checkbox':
19581 skipNames.push(name);
19582 $formEl.find(("input[name=\"" + name + "\"]")).each(function (index, el) {
19583 var checkboxEl = el;
19584 if (data[name].indexOf(el.value) >= 0) { checkboxEl.checked = true; }
19585 else { checkboxEl.checked = false; }
19586 });
19587 break;
19588 case 'radio':
19589 skipNames.push(name);
19590 $formEl.find(("input[name=\"" + name + "\"]")).each(function (index, el) {
19591 var radioEl = el;
19592 if (data[name] === el.value) { radioEl.checked = true; }
19593 else { radioEl.checked = false; }
19594 });
19595 break;
19596 default:
19597 $inputEl.val(data[name]);
19598 break;
19599 }
19600 }
19601 if (tag === 'select' || tag === 'input' || tag === 'textarea') {
19602 $inputEl.trigger('change', 'fromdata');
19603 }
19604 });
19605 $formEl.trigger('form:fromdata', data);
19606 app.emit('formFromData', $formEl[0], data);
19607 }
19608
19609 function initAjaxForm() {
19610 var app = this;
19611
19612 function onSubmitChange(e, fromData) {
19613 var $formEl = $(this);
19614 if (e.type === 'change' && !$formEl.hasClass('form-ajax-submit-onchange')) { return; }
19615 if (e.type === 'submit') { e.preventDefault(); }
19616
19617 if (e.type === 'change' && fromData === 'fromdata') { return; }
19618
19619 var method = ($formEl.attr('method') || 'GET').toUpperCase();
19620 var contentType = $formEl.prop('enctype') || $formEl.attr('enctype');
19621
19622 var url = $formEl.attr('action');
19623 if (!url) { return; }
19624
19625 var data;
19626 if (method === 'POST') {
19627 if (contentType === 'application/x-www-form-urlencoded') {
19628 data = app.form.convertToData($formEl[0]);
19629 } else {
19630 data = new win.FormData($formEl[0]);
19631 }
19632 } else {
19633 data = Utils.serializeObject(app.form.convertToData($formEl[0]));
19634 }
19635
19636 app.request({
19637 method: method,
19638 url: url,
19639 contentType: contentType,
19640 data: data,
19641 beforeSend: function beforeSend(xhr) {
5d51ea26 19642 $formEl.trigger('formajax:beforesend', { data: data, xhr: xhr });
5309fbda
DC
19643 app.emit('formAjaxBeforeSend', $formEl[0], data, xhr);
19644 },
19645 error: function error(xhr) {
5d51ea26 19646 $formEl.trigger('formajax:error', { data: data, xhr: xhr });
5309fbda
DC
19647 app.emit('formAjaxError', $formEl[0], data, xhr);
19648 },
19649 complete: function complete(xhr) {
5d51ea26 19650 $formEl.trigger('formajax:complete', { data: data, xhr: xhr });
5309fbda
DC
19651 app.emit('formAjaxComplete', $formEl[0], data, xhr);
19652 },
19653 success: function success(response, status, xhr) {
5d51ea26 19654 $formEl.trigger('formajax:success', { data: data, xhr: xhr });
5309fbda
DC
19655 app.emit('formAjaxSuccess', $formEl[0], data, xhr);
19656 },
19657 });
19658 }
19659 $(doc).on('submit change', 'form.form-ajax-submit, form.form-ajax-submit-onchange', onSubmitChange);
19660 }
19661
19662 var Form = {
19663 name: 'form',
19664 create: function create() {
19665 var app = this;
19666 Utils.extend(app, {
19667 form: {
19668 data: {},
19669 storeFormData: FormData$1.store.bind(app),
19670 getFormData: FormData$1.get.bind(app),
19671 removeFormData: FormData$1.remove.bind(app),
19672 convertToData: formToData.bind(app),
19673 fillFromData: formFromData.bind(app),
19674 storage: {
19675 init: FormStorage.init.bind(app),
19676 destroy: FormStorage.destroy.bind(app),
19677 },
19678 },
19679 });
19680 },
19681 on: {
19682 init: function init() {
19683 var app = this;
19684 initAjaxForm.call(app);
19685 },
19686 tabBeforeRemove: function tabBeforeRemove(tabEl) {
19687 var app = this;
19688 $(tabEl).find('.form-store-data').each(function (index, formEl) {
19689 app.form.storage.destroy(formEl);
19690 });
19691 },
19692 tabMounted: function tabMounted(tabEl) {
19693 var app = this;
19694 $(tabEl).find('.form-store-data').each(function (index, formEl) {
19695 app.form.storage.init(formEl);
19696 });
19697 },
19698 pageBeforeRemove: function pageBeforeRemove(page) {
19699 var app = this;
19700 page.$el.find('.form-store-data').each(function (index, formEl) {
19701 app.form.storage.destroy(formEl);
19702 });
19703 },
19704 pageInit: function pageInit(page) {
19705 var app = this;
19706 page.$el.find('.form-store-data').each(function (index, formEl) {
19707 app.form.storage.init(formEl);
19708 });
19709 },
19710 },
19711 };
19712
19713 var Input = {
19714 ignoreTypes: ['checkbox', 'button', 'submit', 'range', 'radio', 'image'],
19715 createTextareaResizableShadow: function createTextareaResizableShadow() {
19716 var $shadowEl = $(doc.createElement('textarea'));
19717 $shadowEl.addClass('textarea-resizable-shadow');
19718 $shadowEl.prop({
19719 disabled: true,
19720 readonly: true,
19721 });
19722 Input.textareaResizableShadow = $shadowEl;
19723 },
19724 textareaResizableShadow: undefined,
19725 resizeTextarea: function resizeTextarea(textareaEl) {
19726 var app = this;
19727 var $textareaEl = $(textareaEl);
19728 if (!Input.textareaResizableShadow) {
19729 Input.createTextareaResizableShadow();
19730 }
19731 var $shadowEl = Input.textareaResizableShadow;
19732 if (!$textareaEl.length) { return; }
19733 if (!$textareaEl.hasClass('resizable')) { return; }
19734 if (Input.textareaResizableShadow.parents().length === 0) {
19735 app.root.append($shadowEl);
19736 }
19737
19738 var styles = win.getComputedStyle($textareaEl[0]);
19739 ('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) {
19740 var styleValue = styles[style];
19741 if (('font-size line-height letter-spacing width').split(' ').indexOf(style) >= 0) {
19742 styleValue = styleValue.replace(',', '.');
19743 }
19744 $shadowEl.css(style, styleValue);
19745 });
19746 var currentHeight = $textareaEl[0].clientHeight;
19747
19748 $shadowEl.val('');
19749 var initialHeight = $shadowEl[0].scrollHeight;
19750
19751 $shadowEl.val($textareaEl.val());
19752 $shadowEl.css('height', 0);
19753 var scrollHeight = $shadowEl[0].scrollHeight;
19754
19755 if (currentHeight !== scrollHeight) {
19756 if (scrollHeight > initialHeight) {
19757 $textareaEl.css('height', (scrollHeight + "px"));
19758 $textareaEl.trigger('textarea:resize', { initialHeight: initialHeight, currentHeight: currentHeight, scrollHeight: scrollHeight });
19759 } else if (scrollHeight < currentHeight) {
19760 $textareaEl.css('height', '');
19761 $textareaEl.trigger('textarea:resize', { initialHeight: initialHeight, currentHeight: currentHeight, scrollHeight: scrollHeight });
19762 }
19763 }
19764 },
19765 validate: function validate(inputEl) {
19766 var $inputEl = $(inputEl);
19767 if (!$inputEl.length) { return; }
19768 var $itemInputEl = $inputEl.parents('.item-input');
19769 var $inputWrapEl = $inputEl.parents('.input');
19770 var validity = $inputEl[0].validity;
19771 var validationMessage = $inputEl.dataset().errorMessage || $inputEl[0].validationMessage || '';
19772 if (!validity) { return; }
19773 if (!validity.valid) {
19774 var $errorEl = $inputEl.nextAll('.item-input-error-message, .input-error-message');
19775 if (validationMessage) {
19776 if ($errorEl.length === 0) {
19777 $errorEl = $(("<div class=\"" + ($inputWrapEl.length ? 'input-error-message' : 'item-input-error-message') + "\"></div>"));
19778 $errorEl.insertAfter($inputEl);
19779 }
19780 $errorEl.text(validationMessage);
19781 }
19782 if ($errorEl.length > 0) {
19783 $itemInputEl.addClass('item-input-with-error-message');
5d51ea26 19784 $inputWrapEl.addClass('input-with-error-message');
5309fbda
DC
19785 }
19786 $itemInputEl.addClass('item-input-invalid');
19787 $inputWrapEl.addClass('input-invalid');
19788 $inputEl.addClass('input-invalid');
19789 } else {
19790 $itemInputEl.removeClass('item-input-invalid item-input-with-error-message');
19791 $inputWrapEl.removeClass('input-invalid input-with-error-message');
19792 $inputEl.removeClass('input-invalid');
19793 }
19794 },
19795 validateInputs: function validateInputs(el) {
19796 var app = this;
19797 $(el).find('input, textarea, select').each(function (index, inputEl) {
19798 app.input.validate(inputEl);
19799 });
19800 },
19801 focus: function focus(inputEl) {
19802 var $inputEl = $(inputEl);
19803 var type = $inputEl.attr('type');
19804 if (Input.ignoreTypes.indexOf(type) >= 0) { return; }
19805 $inputEl.parents('.item-input').addClass('item-input-focused');
19806 $inputEl.parents('.input').addClass('input-focused');
19807 $inputEl.addClass('input-focused');
19808 },
19809 blur: function blur(inputEl) {
19810 var $inputEl = $(inputEl);
19811 $inputEl.parents('.item-input').removeClass('item-input-focused');
19812 $inputEl.parents('.input').removeClass('input-focused');
19813 $inputEl.removeClass('input-focused');
19814 },
19815 checkEmptyState: function checkEmptyState(inputEl) {
19816 var $inputEl = $(inputEl);
19817 if (!$inputEl.is('input, select, textarea')) {
19818 $inputEl = $inputEl.find('input, select, textarea').eq(0);
19819 }
19820 if (!$inputEl.length) { return; }
19821
19822 var value = $inputEl.val();
19823 var $itemInputEl = $inputEl.parents('.item-input');
19824 var $inputWrapEl = $inputEl.parents('.input');
19825 if ((value && (typeof value === 'string' && value.trim() !== '')) || (Array.isArray(value) && value.length > 0)) {
19826 $itemInputEl.addClass('item-input-with-value');
19827 $inputWrapEl.addClass('input-with-value');
19828 $inputEl.addClass('input-with-value');
19829 $inputEl.trigger('input:notempty');
19830 } else {
19831 $itemInputEl.removeClass('item-input-with-value');
19832 $inputWrapEl.removeClass('input-with-value');
19833 $inputEl.removeClass('input-with-value');
19834 $inputEl.trigger('input:empty');
19835 }
19836 },
19837 scrollIntoView: function scrollIntoView(inputEl, duration, centered, force) {
19838 if ( duration === void 0 ) duration = 0;
19839
19840 var $inputEl = $(inputEl);
19841 var $scrollableEl = $inputEl.parents('.page-content, .panel').eq(0);
19842 if (!$scrollableEl.length) {
19843 return false;
19844 }
19845 var contentHeight = $scrollableEl[0].offsetHeight;
19846 var contentScrollTop = $scrollableEl[0].scrollTop;
19847 var contentPaddingTop = parseInt($scrollableEl.css('padding-top'), 10);
19848 var contentPaddingBottom = parseInt($scrollableEl.css('padding-bottom'), 10);
19849 var contentOffsetTop = $scrollableEl.offset().top - contentScrollTop;
19850
19851 var inputOffsetTop = $inputEl.offset().top - contentOffsetTop;
19852 var inputHeight = $inputEl[0].offsetHeight;
19853
19854 var min = (inputOffsetTop + contentScrollTop) - contentPaddingTop;
19855 var max = ((inputOffsetTop + contentScrollTop) - contentHeight) + contentPaddingBottom + inputHeight;
19856 var centeredPosition = min + ((max - min) / 2);
19857
19858 if (contentScrollTop > min) {
19859 $scrollableEl.scrollTop(centered ? centeredPosition : min, duration);
19860 return true;
19861 }
19862 if (contentScrollTop < max) {
19863 $scrollableEl.scrollTop(centered ? centeredPosition : max, duration);
19864 return true;
19865 }
19866 if (force) {
19867 $scrollableEl.scrollTop(centered ? centeredPosition : max, duration);
19868 }
19869 return false;
19870 },
19871 init: function init() {
19872 var app = this;
19873 Input.createTextareaResizableShadow();
19874 function onFocus() {
19875 var inputEl = this;
19876 if (app.params.input.scrollIntoViewOnFocus) {
19877 if (Device.android) {
19878 $(win).once('resize', function () {
19879 if (doc && doc.activeElement === inputEl) {
19880 app.input.scrollIntoView(inputEl, app.params.input.scrollIntoViewDuration, app.params.input.scrollIntoViewCentered, app.params.input.scrollIntoViewAlways);
19881 }
19882 });
19883 } else {
19884 app.input.scrollIntoView(inputEl, app.params.input.scrollIntoViewDuration, app.params.input.scrollIntoViewCentered, app.params.input.scrollIntoViewAlways);
19885 }
19886 }
19887 app.input.focus(inputEl);
19888 }
19889 function onBlur() {
19890 var $inputEl = $(this);
19891 var tag = $inputEl[0].nodeName.toLowerCase();
19892 app.input.blur($inputEl);
19893 if ($inputEl.dataset().validate || $inputEl.attr('validate') !== null || $inputEl.attr('data-validate-on-blur') !== null) {
19894 app.input.validate($inputEl);
19895 }
19896 // Resize textarea
19897 if (tag === 'textarea' && $inputEl.hasClass('resizable')) {
19898 if (Input.textareaResizableShadow) { Input.textareaResizableShadow.remove(); }
19899 }
19900 }
19901 function onChange() {
19902 var $inputEl = $(this);
19903 var type = $inputEl.attr('type');
19904 var tag = $inputEl[0].nodeName.toLowerCase();
19905 if (Input.ignoreTypes.indexOf(type) >= 0) { return; }
19906
19907 // Check Empty State
19908 app.input.checkEmptyState($inputEl);
19909
19910 // Check validation
19911 if ($inputEl.attr('data-validate-on-blur') === null && ($inputEl.dataset().validate || $inputEl.attr('validate') !== null)) {
19912 app.input.validate($inputEl);
19913 }
19914
19915 // Resize textarea
19916 if (tag === 'textarea' && $inputEl.hasClass('resizable')) {
19917 app.input.resizeTextarea($inputEl);
19918 }
19919 }
19920 function onInvalid(e) {
19921 var $inputEl = $(this);
19922 if ($inputEl.attr('data-validate-on-blur') === null && ($inputEl.dataset().validate || $inputEl.attr('validate') !== null)) {
19923 e.preventDefault();
19924 app.input.validate($inputEl);
19925 }
19926 }
19927 function clearInput() {
19928 var $clicked = $(this);
19929 var $inputEl = $clicked.siblings('input, textarea').eq(0);
19930 var previousValue = $inputEl.val();
19931 $inputEl
19932 .val('')
19933 .trigger('input change')
19934 .focus()
19935 .trigger('input:clear', previousValue);
19936 }
19937 $(doc).on('click', '.input-clear-button', clearInput);
19938 $(doc).on('change input', 'input, textarea, select', onChange, true);
19939 $(doc).on('focus', 'input, textarea, select', onFocus, true);
19940 $(doc).on('blur', 'input, textarea, select', onBlur, true);
19941 $(doc).on('invalid', 'input, textarea, select', onInvalid, true);
19942 },
19943 };
19944
19945 var Input$1 = {
19946 name: 'input',
19947 params: {
19948 input: {
19949 scrollIntoViewOnFocus: Device.android,
19950 scrollIntoViewCentered: false,
19951 scrollIntoViewDuration: 0,
19952 scrollIntoViewAlways: false,
19953 },
19954 },
19955 create: function create() {
19956 var app = this;
19957 Utils.extend(app, {
19958 input: {
19959 scrollIntoView: Input.scrollIntoView.bind(app),
19960 focus: Input.focus.bind(app),
19961 blur: Input.blur.bind(app),
19962 validate: Input.validate.bind(app),
19963 validateInputs: Input.validateInputs.bind(app),
19964 checkEmptyState: Input.checkEmptyState.bind(app),
19965 resizeTextarea: Input.resizeTextarea.bind(app),
19966 init: Input.init.bind(app),
19967 },
19968 });
19969 },
19970 on: {
19971 init: function init() {
19972 var app = this;
19973 app.input.init();
19974 },
19975 tabMounted: function tabMounted(tabEl) {
19976 var app = this;
19977 var $tabEl = $(tabEl);
19978 $tabEl.find('.item-input, .input').each(function (itemInputIndex, itemInputEl) {
19979 var $itemInputEl = $(itemInputEl);
19980 $itemInputEl.find('input, select, textarea').each(function (inputIndex, inputEl) {
19981 var $inputEl = $(inputEl);
19982 if (Input.ignoreTypes.indexOf($inputEl.attr('type')) >= 0) { return; }
19983 app.input.checkEmptyState($inputEl);
19984 });
19985 });
19986 $tabEl.find('textarea.resizable').each(function (textareaIndex, textareaEl) {
19987 app.input.resizeTextarea(textareaEl);
19988 });
19989 },
19990 pageInit: function pageInit(page) {
19991 var app = this;
19992 var $pageEl = page.$el;
19993 $pageEl.find('.item-input, .input').each(function (itemInputIndex, itemInputEl) {
19994 var $itemInputEl = $(itemInputEl);
19995 $itemInputEl.find('input, select, textarea').each(function (inputIndex, inputEl) {
19996 var $inputEl = $(inputEl);
19997 if (Input.ignoreTypes.indexOf($inputEl.attr('type')) >= 0) { return; }
19998 app.input.checkEmptyState($inputEl);
19999 });
20000 });
20001 $pageEl.find('textarea.resizable').each(function (textareaIndex, textareaEl) {
20002 app.input.resizeTextarea(textareaEl);
20003 });
20004 },
20005 },
20006 };
20007
20008 var Checkbox = {
20009 name: 'checkbox',
20010 };
20011
20012 var Radio = {
20013 name: 'radio',
20014 };
20015
5d51ea26 20016 var Toggle = /*@__PURE__*/(function (Framework7Class) {
5309fbda
DC
20017 function Toggle(app, params) {
20018 if ( params === void 0 ) params = {};
20019
5d51ea26 20020 Framework7Class.call(this, params, [app]);
5309fbda
DC
20021 var toggle = this;
20022
20023 var defaults = {};
20024
20025 // Extend defaults with modules params
20026 toggle.useModulesParams(defaults);
20027
20028 toggle.params = Utils.extend(defaults, params);
20029
20030 var el = toggle.params.el;
20031 if (!el) { return toggle; }
20032
20033 var $el = $(el);
20034 if ($el.length === 0) { return toggle; }
20035
20036 if ($el[0].f7Toggle) { return $el[0].f7Toggle; }
20037
20038 var $inputEl = $el.children('input[type="checkbox"]');
20039
20040 Utils.extend(toggle, {
20041 app: app,
20042 $el: $el,
20043 el: $el[0],
20044 $inputEl: $inputEl,
20045 inputEl: $inputEl[0],
20046 disabled: $el.hasClass('disabled') || $inputEl.hasClass('disabled') || $inputEl.attr('disabled') || $inputEl[0].disabled,
20047 });
20048
20049 Object.defineProperty(toggle, 'checked', {
20050 enumerable: true,
20051 configurable: true,
20052 set: function set(checked) {
20053 if (!toggle || typeof toggle.$inputEl === 'undefined') { return; }
20054 if (toggle.checked === checked) { return; }
20055 $inputEl[0].checked = checked;
20056 toggle.$inputEl.trigger('change');
20057 },
20058 get: function get() {
20059 return $inputEl[0].checked;
20060 },
20061 });
20062
20063 $el[0].f7Toggle = toggle;
20064
20065 var isTouched;
20066 var touchesStart = {};
20067 var isScrolling;
20068 var touchesDiff;
20069 var toggleWidth;
20070 var touchStartTime;
20071 var touchStartChecked;
20072 function handleTouchStart(e) {
20073 if (isTouched || toggle.disabled) { return; }
20074 touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
20075 touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
20076 touchesDiff = 0;
20077
20078 isTouched = true;
20079 isScrolling = undefined;
20080 touchStartTime = Utils.now();
20081 touchStartChecked = toggle.checked;
20082
20083 toggleWidth = $el[0].offsetWidth;
20084 Utils.nextTick(function () {
20085 if (isTouched) {
20086 $el.addClass('toggle-active-state');
20087 }
20088 });
20089 }
20090 function handleTouchMove(e) {
20091 if (!isTouched || toggle.disabled) { return; }
20092 var pageX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;
20093 var pageY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
20094 var inverter = app.rtl ? -1 : 1;
20095
20096 if (typeof isScrolling === 'undefined') {
20097 isScrolling = !!(isScrolling || Math.abs(pageY - touchesStart.y) > Math.abs(pageX - touchesStart.x));
20098 }
20099 if (isScrolling) {
20100 isTouched = false;
20101 return;
20102 }
20103 e.preventDefault();
20104
20105 touchesDiff = pageX - touchesStart.x;
20106
20107
20108 var changed;
20109 if (touchesDiff * inverter < 0 && Math.abs(touchesDiff) > toggleWidth / 3 && touchStartChecked) {
20110 changed = true;
20111 }
20112 if (touchesDiff * inverter > 0 && Math.abs(touchesDiff) > toggleWidth / 3 && !touchStartChecked) {
20113 changed = true;
20114 }
20115 if (changed) {
20116 touchesStart.x = pageX;
20117 toggle.checked = !touchStartChecked;
20118 touchStartChecked = !touchStartChecked;
20119 }
20120 }
20121 function handleTouchEnd() {
20122 if (!isTouched || toggle.disabled) {
20123 if (isScrolling) { $el.removeClass('toggle-active-state'); }
20124 isTouched = false;
20125 return;
20126 }
20127 var inverter = app.rtl ? -1 : 1;
20128 isTouched = false;
20129
20130 $el.removeClass('toggle-active-state');
20131
20132 var changed;
20133 if ((Utils.now() - touchStartTime) < 300) {
20134 if (touchesDiff * inverter < 0 && touchStartChecked) {
20135 changed = true;
20136 }
20137 if (touchesDiff * inverter > 0 && !touchStartChecked) {
20138 changed = true;
20139 }
20140 if (changed) {
20141 toggle.checked = !touchStartChecked;
20142 }
20143 }
20144 }
20145 function handleInputChange() {
20146 toggle.$el.trigger('toggle:change', toggle);
20147 toggle.emit('local::change toggleChange', toggle);
20148 }
20149 toggle.attachEvents = function attachEvents() {
5d51ea26 20150 if ( Support.touch) {
5309fbda
DC
20151 var passive = Support.passiveListener ? { passive: true } : false;
20152 $el.on(app.touchEvents.start, handleTouchStart, passive);
20153 app.on('touchmove', handleTouchMove);
20154 app.on('touchend:passive', handleTouchEnd);
20155 }
20156 toggle.$inputEl.on('change', handleInputChange);
20157 };
20158 toggle.detachEvents = function detachEvents() {
5d51ea26 20159 if ( Support.touch) {
5309fbda
DC
20160 var passive = Support.passiveListener ? { passive: true } : false;
20161 $el.off(app.touchEvents.start, handleTouchStart, passive);
20162 app.off('touchmove', handleTouchMove);
20163 app.off('touchend:passive', handleTouchEnd);
20164 }
20165 toggle.$inputEl.off('change', handleInputChange);
20166 };
20167
20168 // Install Modules
20169 toggle.useModules();
20170
20171 // Init
20172 toggle.init();
20173 }
20174
5d51ea26
DC
20175 if ( Framework7Class ) Toggle.__proto__ = Framework7Class;
20176 Toggle.prototype = Object.create( Framework7Class && Framework7Class.prototype );
5309fbda
DC
20177 Toggle.prototype.constructor = Toggle;
20178
20179 Toggle.prototype.toggle = function toggle () {
20180 var toggle = this;
20181 toggle.checked = !toggle.checked;
20182 };
20183
20184 Toggle.prototype.init = function init () {
20185 var toggle = this;
20186 toggle.attachEvents();
20187 };
20188
20189 Toggle.prototype.destroy = function destroy () {
20190 var toggle = this;
20191 toggle.$el.trigger('toggle:beforedestroy', toggle);
20192 toggle.emit('local::beforeDestroy toggleBeforeDestroy', toggle);
20193 delete toggle.$el[0].f7Toggle;
20194 toggle.detachEvents();
20195 Utils.deleteProps(toggle);
20196 toggle = null;
20197 };
20198
20199 return Toggle;
20200 }(Framework7Class));
20201
20202 var Toggle$1 = {
20203 name: 'toggle',
20204 create: function create() {
20205 var app = this;
20206 app.toggle = ConstructorMethods({
20207 defaultSelector: '.toggle',
20208 constructor: Toggle,
20209 app: app,
20210 domProp: 'f7Toggle',
20211 });
20212 },
20213 static: {
20214 Toggle: Toggle,
20215 },
20216 on: {
20217 tabMounted: function tabMounted(tabEl) {
20218 var app = this;
20219 $(tabEl).find('.toggle-init').each(function (index, toggleEl) { return app.toggle.create({ el: toggleEl }); });
20220 },
20221 tabBeforeRemove: function tabBeforeRemove(tabEl) {
20222 $(tabEl).find('.toggle-init').each(function (index, toggleEl) {
20223 if (toggleEl.f7Toggle) { toggleEl.f7Toggle.destroy(); }
20224 });
20225 },
20226 pageInit: function pageInit(page) {
20227 var app = this;
20228 page.$el.find('.toggle-init').each(function (index, toggleEl) { return app.toggle.create({ el: toggleEl }); });
20229 },
20230 pageBeforeRemove: function pageBeforeRemove(page) {
20231 page.$el.find('.toggle-init').each(function (index, toggleEl) {
20232 if (toggleEl.f7Toggle) { toggleEl.f7Toggle.destroy(); }
20233 });
20234 },
20235 },
20236 vnode: {
20237 'toggle-init': {
20238 insert: function insert(vnode) {
20239 var app = this;
20240 var toggleEl = vnode.elm;
20241 app.toggle.create({ el: toggleEl });
20242 },
20243 destroy: function destroy(vnode) {
20244 var toggleEl = vnode.elm;
20245 if (toggleEl.f7Toggle) { toggleEl.f7Toggle.destroy(); }
20246 },
20247 },
20248 },
20249 };
20250
5d51ea26 20251 var Range = /*@__PURE__*/(function (Framework7Class) {
5309fbda 20252 function Range(app, params) {
5d51ea26 20253 Framework7Class.call(this, params, [app]);
5309fbda
DC
20254
20255 var range = this;
20256
20257 var defaults = {
20258 el: null,
20259 inputEl: null,
20260 dual: false,
20261 step: 1,
20262 label: false,
20263 min: 0,
20264 max: 100,
20265 value: 0,
20266 draggableBar: true,
20267 vertical: false,
20268 verticalReversed: false,
20269 formatLabel: null,
20270 scale: false,
20271 scaleSteps: 5,
20272 scaleSubSteps: 0,
20273 formatScaleLabel: null,
5d51ea26 20274 limitKnobPosition: app.theme === 'ios',
5309fbda
DC
20275 };
20276
20277 // Extend defaults with modules params
20278 range.useModulesParams(defaults);
20279
20280 range.params = Utils.extend(defaults, params);
20281
20282 var el = range.params.el;
20283 if (!el) { return range; }
20284
20285 var $el = $(el);
20286 if ($el.length === 0) { return range; }
20287
20288 if ($el[0].f7Range) { return $el[0].f7Range; }
20289
20290 var dataset = $el.dataset();
20291
20292 ('step min max value scaleSteps scaleSubSteps').split(' ').forEach(function (paramName) {
20293 if (typeof params[paramName] === 'undefined' && typeof dataset[paramName] !== 'undefined') {
20294 range.params[paramName] = parseFloat(dataset[paramName]);
20295 }
20296 });
20297 ('dual label vertical verticalReversed scale').split(' ').forEach(function (paramName) {
20298 if (typeof params[paramName] === 'undefined' && typeof dataset[paramName] !== 'undefined') {
20299 range.params[paramName] = dataset[paramName];
20300 }
20301 });
20302
20303 if (!range.params.value) {
20304 if (typeof dataset.value !== 'undefined') { range.params.value = dataset.value; }
20305 if (typeof dataset.valueLeft !== 'undefined' && typeof dataset.valueRight !== 'undefined') {
20306 range.params.value = [parseFloat(dataset.valueLeft), parseFloat(dataset.valueRight)];
20307 }
20308 }
20309
20310 var $inputEl;
20311 if (!range.params.dual) {
20312 if (range.params.inputEl) {
20313 $inputEl = $(range.params.inputEl);
20314 } else if ($el.find('input[type="range"]').length) {
20315 $inputEl = $el.find('input[type="range"]').eq(0);
20316 }
20317 }
20318
20319 var ref = range.params;
20320 var dual = ref.dual;
20321 var step = ref.step;
20322 var label = ref.label;
20323 var min = ref.min;
20324 var max = ref.max;
20325 var value = ref.value;
20326 var vertical = ref.vertical;
20327 var verticalReversed = ref.verticalReversed;
20328 var scale = ref.scale;
20329 var scaleSteps = ref.scaleSteps;
20330 var scaleSubSteps = ref.scaleSubSteps;
5d51ea26 20331 var limitKnobPosition = ref.limitKnobPosition;
5309fbda
DC
20332
20333 Utils.extend(range, {
20334 app: app,
20335 $el: $el,
20336 el: $el[0],
20337 $inputEl: $inputEl,
20338 inputEl: $inputEl ? $inputEl[0] : undefined,
20339 dual: dual,
20340 step: step,
20341 label: label,
20342 min: min,
20343 max: max,
20344 value: value,
20345 previousValue: value,
20346 vertical: vertical,
20347 verticalReversed: verticalReversed,
20348 scale: scale,
20349 scaleSteps: scaleSteps,
20350 scaleSubSteps: scaleSubSteps,
5d51ea26 20351 limitKnobPosition: limitKnobPosition,
5309fbda
DC
20352 });
20353
20354 if ($inputEl) {
20355 ('step min max').split(' ').forEach(function (paramName) {
20356 if (!params[paramName] && $inputEl.attr(paramName)) {
20357 range.params[paramName] = parseFloat($inputEl.attr(paramName));
20358 range[paramName] = parseFloat($inputEl.attr(paramName));
20359 }
20360 });
20361 if (typeof $inputEl.val() !== 'undefined') {
20362 range.params.value = parseFloat($inputEl.val());
20363 range.value = parseFloat($inputEl.val());
20364 }
20365 }
20366
20367 // Dual
20368 if (range.dual) {
20369 $el.addClass('range-slider-dual');
20370 }
20371 if (range.label) {
20372 $el.addClass('range-slider-label');
20373 }
20374
20375 // Vertical
20376 if (range.vertical) {
20377 $el.addClass('range-slider-vertical');
20378 if (range.verticalReversed) {
20379 $el.addClass('range-slider-vertical-reversed');
20380 }
20381 } else {
20382 $el.addClass('range-slider-horizontal');
20383 }
20384
20385 // Check for layout
20386 var $barEl = $('<div class="range-bar"></div>');
20387 var $barActiveEl = $('<div class="range-bar-active"></div>');
20388 $barEl.append($barActiveEl);
20389
20390 // Create Knobs
20391 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 ";
20392 var knobs = [$(knobHTML)];
20393
20394 if (range.dual) {
20395 knobs.push($(knobHTML));
20396 }
20397
20398 $el.append($barEl);
20399 knobs.forEach(function ($knobEl) {
20400 $el.append($knobEl);
20401 });
20402
20403 // Labels
20404 var labels = [];
20405 if (range.label) {
20406 labels.push(knobs[0].find('.range-knob-label'));
20407 if (range.dual) {
20408 labels.push(knobs[1].find('.range-knob-label'));
20409 }
20410 }
20411
20412 // Scale
20413 var $scaleEl;
20414 if (range.scale && range.scaleSteps > 1) {
20415 $scaleEl = $(("\n <div class=\"range-scale\">\n " + (range.renderScale()) + "\n </div>\n "));
20416 $el.append($scaleEl);
20417 }
20418
20419 Utils.extend(range, {
20420 knobs: knobs,
20421 labels: labels,
20422 $barEl: $barEl,
20423 $barActiveEl: $barActiveEl,
20424 $scaleEl: $scaleEl,
20425 });
20426
20427 $el[0].f7Range = range;
20428
20429 // Touch Events
20430 var isTouched;
20431 var touchesStart = {};
20432 var isScrolling;
20433 var rangeOffset;
20434 var rangeOffsetLeft;
20435 var rangeOffsetTop;
20436 var $touchedKnobEl;
20437 var dualValueIndex;
20438 var valueChangedByTouch;
5d51ea26 20439 var targetTouchIdentifier;
5309fbda
DC
20440 function onTouchChange() {
20441 valueChangedByTouch = true;
20442 }
20443 function handleTouchStart(e) {
20444 if (isTouched) { return; }
20445 if (!range.params.draggableBar) {
20446 if ($(e.target).closest('.range-knob').length === 0) {
20447 return;
20448 }
20449 }
20450 valueChangedByTouch = false;
20451 touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
20452 touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
5d51ea26
DC
20453 if (e.type === 'touchstart') {
20454 targetTouchIdentifier = e.targetTouches[0].identifier;
20455 }
5309fbda
DC
20456
20457 isTouched = true;
20458 isScrolling = undefined;
20459 rangeOffset = $el.offset();
20460 rangeOffsetLeft = rangeOffset.left;
20461 rangeOffsetTop = rangeOffset.top;
20462
20463 var progress;
20464 if (range.vertical) {
20465 progress = (touchesStart.y - rangeOffsetTop) / range.rangeHeight;
20466 if (!range.verticalReversed) { progress = 1 - progress; }
20467 } else if (range.app.rtl) {
20468 progress = ((rangeOffsetLeft + range.rangeWidth) - touchesStart.x) / range.rangeWidth;
20469 } else {
20470 progress = (touchesStart.x - rangeOffsetLeft) / range.rangeWidth;
20471 }
20472
20473 var newValue = (progress * (range.max - range.min)) + range.min;
20474 if (range.dual) {
20475 if (Math.abs(range.value[0] - newValue) < Math.abs(range.value[1] - newValue)) {
20476 dualValueIndex = 0;
20477 $touchedKnobEl = range.knobs[0];
20478 newValue = [newValue, range.value[1]];
20479 } else {
20480 dualValueIndex = 1;
20481 $touchedKnobEl = range.knobs[1];
20482 newValue = [range.value[0], newValue];
20483 }
20484 } else {
20485 $touchedKnobEl = range.knobs[0];
20486 newValue = (progress * (range.max - range.min)) + range.min;
20487 }
20488 Utils.nextTick(function () {
20489 if (isTouched) { $touchedKnobEl.addClass('range-knob-active-state'); }
20490 }, 70);
20491 range.on('change', onTouchChange);
20492 range.setValue(newValue, true);
20493 }
20494 function handleTouchMove(e) {
20495 if (!isTouched) { return; }
5d51ea26
DC
20496 var pageX;
20497 var pageY;
20498 if (e.type === 'touchmove') {
20499 for (var i = 0; i < e.targetTouches.length; i += 1) {
20500 if (e.targetTouches[i].identifier === targetTouchIdentifier) {
20501 pageX = e.targetTouches[i].pageX;
20502 pageY = e.targetTouches[i].pageY;
20503 }
5309fbda 20504 }
5d51ea26
DC
20505 } else {
20506 pageX = e.pageX;
20507 pageY = e.pageY;
20508 }
20509 if (typeof pageX === 'undefined' && typeof pageY === 'undefined') { return; }
20510
20511 if (typeof isScrolling === 'undefined' && !range.vertical) {
20512 isScrolling = !!(isScrolling || Math.abs(pageY - touchesStart.y) > Math.abs(pageX - touchesStart.x));
5309fbda
DC
20513 }
20514 if (isScrolling) {
20515 isTouched = false;
20516 return;
20517 }
20518 e.preventDefault();
20519
20520 var progress;
20521 if (range.vertical) {
20522 progress = (pageY - rangeOffsetTop) / range.rangeHeight;
20523 if (!range.verticalReversed) { progress = 1 - progress; }
20524 } else if (range.app.rtl) {
20525 progress = ((rangeOffsetLeft + range.rangeWidth) - pageX) / range.rangeWidth;
20526 } else {
20527 progress = (pageX - rangeOffsetLeft) / range.rangeWidth;
20528 }
20529
20530 var newValue = (progress * (range.max - range.min)) + range.min;
20531 if (range.dual) {
20532 var leftValue;
20533 var rightValue;
20534 if (dualValueIndex === 0) {
20535 leftValue = newValue;
20536 rightValue = range.value[1];
20537 if (leftValue > rightValue) {
20538 rightValue = leftValue;
20539 }
20540 } else {
20541 leftValue = range.value[0];
20542 rightValue = newValue;
20543 if (rightValue < leftValue) {
20544 leftValue = rightValue;
20545 }
20546 }
20547 newValue = [leftValue, rightValue];
20548 }
20549 range.setValue(newValue, true);
20550 }
5d51ea26
DC
20551 function handleTouchEnd(e) {
20552 if (e.type === 'touchend') {
20553 var touchEnded;
20554 for (var i = 0; i < e.changedTouches.length; i += 1) {
20555 if (e.changedTouches[i].identifier === targetTouchIdentifier) { touchEnded = true; }
20556 }
20557 if (!touchEnded) { return; }
20558 }
5309fbda
DC
20559 if (!isTouched) {
20560 if (isScrolling) { $touchedKnobEl.removeClass('range-knob-active-state'); }
20561 isTouched = false;
20562 return;
20563 }
20564 range.off('change', onTouchChange);
20565 isTouched = false;
20566 $touchedKnobEl.removeClass('range-knob-active-state');
20567 if (valueChangedByTouch && range.$inputEl && !range.dual) {
20568 range.$inputEl.trigger('change');
20569 }
20570 valueChangedByTouch = false;
20571 if (typeof range.previousValue !== 'undefined') {
20572 if (
20573 (
20574 range.dual
20575 && (
20576 range.previousValue[0] !== range.value[0]
20577 || range.previousValue[1] !== range.value[1]
20578 )
20579 )
20580 || (
20581 !range.dual
20582 && range.previousValue !== range.value
20583 )
20584 ) {
20585 range.$el.trigger('range:changed', range, range.value);
20586 range.emit('local::changed rangeChanged', range, range.value);
20587 }
20588 }
20589 }
20590
20591 function handleResize() {
20592 range.calcSize();
20593 range.layout();
20594 }
20595 var parentModals;
20596 var parentPanel;
20597 var parentPage;
20598 range.attachEvents = function attachEvents() {
20599 var passive = Support.passiveListener ? { passive: true } : false;
20600 range.$el.on(app.touchEvents.start, handleTouchStart, passive);
20601 app.on('touchmove', handleTouchMove);
20602 app.on('touchend:passive', handleTouchEnd);
20603 app.on('tabShow', handleResize);
20604 app.on('resize', handleResize);
20605 parentModals = range.$el.parents('.sheet-modal, .actions-modal, .popup, .popover, .login-screen, .dialog, .toast');
20606 parentModals.on('modal:open', handleResize);
20607 parentPanel = range.$el.parents('.panel');
20608 parentPanel.on('panel:open', handleResize);
20609 parentPage = range.$el.parents('.page').eq(0);
20610 parentPage.on('page:reinit', handleResize);
20611 };
20612 range.detachEvents = function detachEvents() {
20613 var passive = Support.passiveListener ? { passive: true } : false;
20614 range.$el.off(app.touchEvents.start, handleTouchStart, passive);
20615 app.off('touchmove', handleTouchMove);
20616 app.off('touchend:passive', handleTouchEnd);
20617 app.off('tabShow', handleResize);
20618 app.off('resize', handleResize);
20619 if (parentModals) {
20620 parentModals.off('modal:open', handleResize);
20621 }
20622 if (parentPanel) {
20623 parentPanel.off('panel:open', handleResize);
20624 }
20625 if (parentPage) {
20626 parentPage.off('page:reinit', handleResize);
20627 }
20628 parentModals = null;
20629 parentPanel = null;
20630 parentPage = null;
20631 };
20632
20633 // Install Modules
20634 range.useModules();
20635
20636 // Init
20637 range.init();
20638
20639 return range;
20640 }
20641
5d51ea26
DC
20642 if ( Framework7Class ) Range.__proto__ = Framework7Class;
20643 Range.prototype = Object.create( Framework7Class && Framework7Class.prototype );
5309fbda
DC
20644 Range.prototype.constructor = Range;
20645
20646 Range.prototype.calcSize = function calcSize () {
20647 var range = this;
20648 if (range.vertical) {
20649 var height = range.$el.outerHeight();
20650 if (height === 0) { return; }
20651 range.rangeHeight = height;
20652 range.knobHeight = range.knobs[0].outerHeight();
20653 } else {
20654 var width = range.$el.outerWidth();
20655 if (width === 0) { return; }
20656 range.rangeWidth = width;
20657 range.knobWidth = range.knobs[0].outerWidth();
20658 }
20659 };
20660
20661 Range.prototype.layout = function layout () {
20662 var obj;
20663
20664 var range = this;
20665 var app = range.app;
20666 var knobWidth = range.knobWidth;
20667 var knobHeight = range.knobHeight;
20668 var rangeWidth = range.rangeWidth;
20669 var rangeHeight = range.rangeHeight;
20670 var min = range.min;
20671 var max = range.max;
20672 var knobs = range.knobs;
20673 var $barActiveEl = range.$barActiveEl;
20674 var value = range.value;
20675 var label = range.label;
20676 var labels = range.labels;
20677 var vertical = range.vertical;
20678 var verticalReversed = range.verticalReversed;
5d51ea26 20679 var limitKnobPosition = range.limitKnobPosition;
5309fbda
DC
20680 var knobSize = vertical ? knobHeight : knobWidth;
20681 var rangeSize = vertical ? rangeHeight : rangeWidth;
20682 // eslint-disable-next-line
20683 var positionProperty = vertical
20684 ? (verticalReversed ? 'top' : 'bottom')
20685 : (app.rtl ? 'right' : 'left');
20686 if (range.dual) {
20687 var progress = [((value[0] - min) / (max - min)), ((value[1] - min) / (max - min))];
20688 $barActiveEl.css(( obj = {}, obj[positionProperty] = ((progress[0] * 100) + "%"), obj[vertical ? 'height' : 'width'] = (((progress[1] - progress[0]) * 100) + "%"), obj ));
20689 knobs.forEach(function ($knobEl, knobIndex) {
20690 var startPos = rangeSize * progress[knobIndex];
5d51ea26 20691 if (limitKnobPosition) {
5309fbda
DC
20692 var realStartPos = (rangeSize * progress[knobIndex]) - (knobSize / 2);
20693 if (realStartPos < 0) { startPos = knobSize / 2; }
20694 if ((realStartPos + knobSize) > rangeSize) { startPos = rangeSize - (knobSize / 2); }
20695 }
20696 $knobEl.css(positionProperty, (startPos + "px"));
20697 if (label) { labels[knobIndex].text(range.formatLabel(value[knobIndex], labels[knobIndex][0])); }
20698 });
20699 } else {
20700 var progress$1 = ((value - min) / (max - min));
20701 $barActiveEl.css(vertical ? 'height' : 'width', ((progress$1 * 100) + "%"));
20702
20703 var startPos = rangeSize * progress$1;
5d51ea26 20704 if (limitKnobPosition) {
5309fbda
DC
20705 var realStartPos = (rangeSize * progress$1) - (knobSize / 2);
20706 if (realStartPos < 0) { startPos = knobSize / 2; }
20707 if ((realStartPos + knobSize) > rangeSize) { startPos = rangeSize - (knobSize / 2); }
20708 }
20709 knobs[0].css(positionProperty, (startPos + "px"));
20710 if (label) { labels[0].text(range.formatLabel(value, labels[0][0])); }
20711 }
20712 if ((range.dual && value.indexOf(min) >= 0) || (!range.dual && value === min)) {
20713 range.$el.addClass('range-slider-min');
20714 } else {
20715 range.$el.removeClass('range-slider-min');
20716 }
20717 if ((range.dual && value.indexOf(max) >= 0) || (!range.dual && value === max)) {
20718 range.$el.addClass('range-slider-max');
20719 } else {
20720 range.$el.removeClass('range-slider-max');
20721 }
20722 };
20723
20724 Range.prototype.setValue = function setValue (newValue, byTouchMove) {
20725 var range = this;
20726 var step = range.step;
20727 var min = range.min;
20728 var max = range.max;
20729 var valueChanged;
20730 var oldValue;
20731 if (range.dual) {
20732 oldValue = [range.value[0], range.value[1]];
20733 var newValues = newValue;
20734 if (!Array.isArray(newValues)) { newValues = [newValue, newValue]; }
20735 if (newValue[0] > newValue[1]) {
20736 newValues = [newValues[0], newValues[0]];
20737 }
20738 newValues = newValues.map(function (value) { return Math.max(Math.min(Math.round(value / step) * step, max), min); });
20739 if (newValues[0] === range.value[0] && newValues[1] === range.value[1]) {
20740 return range;
20741 }
20742 newValues.forEach(function (value, valueIndex) {
20743 range.value[valueIndex] = value;
20744 });
20745 valueChanged = oldValue[0] !== newValues[0] || oldValue[1] !== newValues[1];
20746 range.layout();
20747 } else {
20748 oldValue = range.value;
20749 var value = Math.max(Math.min(Math.round(newValue / step) * step, max), min);
20750 range.value = value;
20751 range.layout();
20752 valueChanged = oldValue !== value;
20753 }
20754
20755 if (valueChanged) {
20756 range.previousValue = oldValue;
20757 }
20758 // Events
20759 if (!valueChanged) { return range; }
20760 range.$el.trigger('range:change', range, range.value);
20761 if (range.$inputEl && !range.dual) {
20762 range.$inputEl.val(range.value);
20763 if (!byTouchMove) {
20764 range.$inputEl.trigger('input change');
20765 } else {
20766 range.$inputEl.trigger('input');
20767 }
20768 }
20769 if (!byTouchMove) {
20770 range.$el.trigger('range:changed', range, range.value);
20771 range.emit('local::changed rangeChanged', range, range.value);
20772 }
20773 range.emit('local::change rangeChange', range, range.value);
20774 return range;
20775 };
20776
20777 Range.prototype.getValue = function getValue () {
20778 return this.value;
20779 };
20780
20781 Range.prototype.formatLabel = function formatLabel (value, labelEl) {
20782 var range = this;
20783 if (range.params.formatLabel) { return range.params.formatLabel.call(range, value, labelEl); }
20784 return value;
20785 };
20786
20787 Range.prototype.formatScaleLabel = function formatScaleLabel (value) {
20788 var range = this;
20789 if (range.params.formatScaleLabel) { return range.params.formatScaleLabel.call(range, value); }
20790 return value;
20791 };
20792
20793 Range.prototype.renderScale = function renderScale () {
20794 var range = this;
20795 var app = range.app;
20796 var verticalReversed = range.verticalReversed;
20797 var vertical = range.vertical;
20798
20799 // eslint-disable-next-line
20800 var positionProperty = vertical
20801 ? (verticalReversed ? 'top' : 'bottom')
20802 : (app.rtl ? 'right' : 'left');
20803
20804 var html = '';
20805
20806 Array
20807 .from({ length: range.scaleSteps + 1 })
20808 .forEach(function (scaleEl, index) {
20809 var scaleStepValue = (range.max - range.min) / range.scaleSteps;
20810 var scaleValue = range.min + scaleStepValue * index;
20811 var progress = ((scaleValue - range.min) / (range.max - range.min));
20812 html += "<div class=\"range-scale-step\" style=\"" + positionProperty + ": " + (progress * 100) + "%\">" + (range.formatScaleLabel(scaleValue)) + "</div>";
20813
20814 if (range.scaleSubSteps && range.scaleSubSteps > 1 && index < range.scaleSteps) {
20815 Array
20816 .from({ length: range.scaleSubSteps - 1 })
20817 .forEach(function (subStepEl, subIndex) {
20818 var subStep = scaleStepValue / range.scaleSubSteps;
20819 var scaleSubValue = scaleValue + subStep * (subIndex + 1);
20820 var subProgress = ((scaleSubValue - range.min) / (range.max - range.min));
20821 html += "<div class=\"range-scale-step range-scale-substep\" style=\"" + positionProperty + ": " + (subProgress * 100) + "%\"></div>";
20822 });
20823 }
20824 });
20825
20826 return html;
20827 };
20828
20829 Range.prototype.updateScale = function updateScale () {
20830 var range = this;
20831 if (!range.scale || range.scaleSteps < 2) {
20832 if (range.$scaleEl) { range.$scaleEl.remove(); }
20833 delete range.$scaleEl;
20834 return;
20835 }
20836 if (!range.$scaleEl) {
20837 range.$scaleEl = $('<div class="range-scale"></div>');
20838 range.$el.append(range.$scaleEl);
20839 }
20840
20841 range.$scaleEl.html(range.renderScale());
20842 };
20843
20844 Range.prototype.init = function init () {
20845 var range = this;
20846 range.calcSize();
20847 range.layout();
20848 range.attachEvents();
20849 return range;
20850 };
20851
20852 Range.prototype.destroy = function destroy () {
20853 var range = this;
20854 range.$el.trigger('range:beforedestroy', range);
20855 range.emit('local::beforeDestroy rangeBeforeDestroy', range);
20856 delete range.$el[0].f7Range;
20857 range.detachEvents();
20858 Utils.deleteProps(range);
20859 range = null;
20860 };
20861
20862 return Range;
20863 }(Framework7Class));
20864
20865 var Range$1 = {
20866 name: 'range',
20867 create: function create() {
20868 var app = this;
20869 app.range = Utils.extend(
20870 ConstructorMethods({
20871 defaultSelector: '.range-slider',
20872 constructor: Range,
20873 app: app,
20874 domProp: 'f7Range',
20875 }),
20876 {
20877 getValue: function getValue(el) {
20878 if ( el === void 0 ) el = '.range-slider';
20879
20880 var range = app.range.get(el);
20881 if (range) { return range.getValue(); }
20882 return undefined;
20883 },
20884 setValue: function setValue(el, value) {
20885 if ( el === void 0 ) el = '.range-slider';
20886
20887 var range = app.range.get(el);
20888 if (range) { return range.setValue(value); }
20889 return undefined;
20890 },
20891 }
20892 );
20893 },
20894 static: {
20895 Range: Range,
20896 },
20897 on: {
20898 tabMounted: function tabMounted(tabEl) {
20899 var app = this;
20900 $(tabEl).find('.range-slider-init').each(function (index, rangeEl) { return new Range(app, {
20901 el: rangeEl,
20902 }); });
20903 },
20904 tabBeforeRemove: function tabBeforeRemove(tabEl) {
20905 $(tabEl).find('.range-slider-init').each(function (index, rangeEl) {
20906 if (rangeEl.f7Range) { rangeEl.f7Range.destroy(); }
20907 });
20908 },
20909 pageInit: function pageInit(page) {
20910 var app = this;
20911 page.$el.find('.range-slider-init').each(function (index, rangeEl) { return new Range(app, {
20912 el: rangeEl,
20913 }); });
20914 },
20915 pageBeforeRemove: function pageBeforeRemove(page) {
20916 page.$el.find('.range-slider-init').each(function (index, rangeEl) {
20917 if (rangeEl.f7Range) { rangeEl.f7Range.destroy(); }
20918 });
20919 },
20920 },
20921 vnode: {
20922 'range-slider-init': {
20923 insert: function insert(vnode) {
20924 var rangeEl = vnode.elm;
20925 var app = this;
20926 app.range.create({ el: rangeEl });
20927 },
20928 destroy: function destroy(vnode) {
20929 var rangeEl = vnode.elm;
20930 if (rangeEl.f7Range) { rangeEl.f7Range.destroy(); }
20931 },
20932 },
20933 },
20934 };
20935
5d51ea26 20936 var Stepper = /*@__PURE__*/(function (Framework7Class) {
5309fbda 20937 function Stepper(app, params) {
5d51ea26 20938 Framework7Class.call(this, params, [app]);
5309fbda
DC
20939 var stepper = this;
20940
20941 var defaults = {
20942 el: null,
20943 inputEl: null,
20944 valueEl: null,
20945 value: 0,
20946 formatValue: null,
20947 step: 1,
20948 min: 0,
20949 max: 100,
20950 watchInput: true,
20951 autorepeat: false,
20952 autorepeatDynamic: false,
20953 wraps: false,
20954 manualInputMode: false,
20955 decimalPoint: 4,
20956 buttonsEndInputMode: true,
20957 };
20958
20959 // Extend defaults with modules params
20960 stepper.useModulesParams(defaults);
20961
20962 stepper.params = Utils.extend(defaults, params);
20963 if (stepper.params.value < stepper.params.min) {
20964 stepper.params.value = stepper.params.min;
20965 }
20966 if (stepper.params.value > stepper.params.max) {
20967 stepper.params.value = stepper.params.max;
20968 }
20969
20970 var el = stepper.params.el;
20971 if (!el) { return stepper; }
20972
20973 var $el = $(el);
20974 if ($el.length === 0) { return stepper; }
20975
20976 if ($el[0].f7Stepper) { return $el[0].f7Stepper; }
20977
20978 var $inputEl;
20979 if (stepper.params.inputEl) {
20980 $inputEl = $(stepper.params.inputEl);
20981 } else if ($el.find('.stepper-input-wrap').find('input, textarea').length) {
20982 $inputEl = $el.find('.stepper-input-wrap').find('input, textarea').eq(0);
20983 }
20984
20985 if ($inputEl && $inputEl.length) {
20986 ('step min max').split(' ').forEach(function (paramName) {
20987 if (!params[paramName] && $inputEl.attr(paramName)) {
20988 stepper.params[paramName] = parseFloat($inputEl.attr(paramName));
20989 }
20990 });
20991
20992 var decimalPoint$1 = parseInt(stepper.params.decimalPoint, 10);
20993 if (Number.isNaN(decimalPoint$1)) {
20994 stepper.params.decimalPoint = 0;
20995 } else {
20996 stepper.params.decimalPoint = decimalPoint$1;
20997 }
20998
20999 var inputValue = parseFloat($inputEl.val());
21000 if (typeof params.value === 'undefined' && !Number.isNaN(inputValue) && (inputValue || inputValue === 0)) {
21001 stepper.params.value = inputValue;
21002 }
21003 }
21004
21005 var $valueEl;
21006 if (stepper.params.valueEl) {
21007 $valueEl = $(stepper.params.valueEl);
21008 } else if ($el.find('.stepper-value').length) {
21009 $valueEl = $el.find('.stepper-value').eq(0);
21010 }
21011
21012 var $buttonPlusEl = $el.find('.stepper-button-plus');
21013 var $buttonMinusEl = $el.find('.stepper-button-minus');
21014
21015 var ref = stepper.params;
21016 var step = ref.step;
21017 var min = ref.min;
21018 var max = ref.max;
21019 var value = ref.value;
21020 var decimalPoint = ref.decimalPoint;
21021
21022 Utils.extend(stepper, {
21023 app: app,
21024 $el: $el,
21025 el: $el[0],
21026 $buttonPlusEl: $buttonPlusEl,
21027 buttonPlusEl: $buttonPlusEl[0],
21028 $buttonMinusEl: $buttonMinusEl,
21029 buttonMinusEl: $buttonMinusEl[0],
21030 $inputEl: $inputEl,
21031 inputEl: $inputEl ? $inputEl[0] : undefined,
21032 $valueEl: $valueEl,
21033 valueEl: $valueEl ? $valueEl[0] : undefined,
21034 step: step,
21035 min: min,
21036 max: max,
21037 value: value,
21038 decimalPoint: decimalPoint,
21039 typeModeChanged: false,
21040 });
21041
21042 $el[0].f7Stepper = stepper;
21043
21044 // Handle Events
21045 var touchesStart = {};
21046 var isTouched;
21047 var isScrolling;
21048 var preventButtonClick;
21049 var intervalId;
21050 var timeoutId;
21051 var autorepeatAction = null;
21052 var autorepeatInAction = false;
21053 var manualInput = false;
21054
21055 function dynamicRepeat(current, progressions, startsIn, progressionStep, repeatEvery, action) {
21056 clearTimeout(timeoutId);
21057 timeoutId = setTimeout(function () {
21058 if (current === 1) {
21059 preventButtonClick = true;
21060 autorepeatInAction = true;
21061 }
21062 clearInterval(intervalId);
21063 action();
21064 intervalId = setInterval(function () {
21065 action();
21066 }, repeatEvery);
21067 if (current < progressions) {
21068 dynamicRepeat(current + 1, progressions, startsIn, progressionStep, repeatEvery / 2, action);
21069 }
21070 }, current === 1 ? startsIn : progressionStep);
21071 }
21072
21073 function onTouchStart(e) {
21074 if (isTouched) { return; }
21075 if (manualInput) { return; }
21076 if ($(e.target).closest($buttonPlusEl).length) {
21077 autorepeatAction = 'increment';
21078 } else if ($(e.target).closest($buttonMinusEl).length) {
21079 autorepeatAction = 'decrement';
21080 }
21081 if (!autorepeatAction) { return; }
21082
21083 touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
21084 touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
21085 isTouched = true;
21086 isScrolling = undefined;
21087
21088 var progressions = stepper.params.autorepeatDynamic ? 4 : 1;
21089 dynamicRepeat(1, progressions, 500, 1000, 300, function () {
21090 stepper[autorepeatAction]();
21091 });
21092 }
21093 function onTouchMove(e) {
21094 if (!isTouched) { return; }
21095 if (manualInput) { return; }
21096 var pageX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;
21097 var pageY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
21098
21099 if (typeof isScrolling === 'undefined' && !autorepeatInAction) {
21100 isScrolling = !!(isScrolling || Math.abs(pageY - touchesStart.y) > Math.abs(pageX - touchesStart.x));
21101 }
21102 var distance = Math.pow( ((Math.pow( (pageX - touchesStart.x), 2 )) + (Math.pow( (pageY - touchesStart.y), 2 ))), 0.5 );
21103
21104 if (isScrolling || distance > 20) {
21105 isTouched = false;
21106 clearTimeout(timeoutId);
21107 clearInterval(intervalId);
21108 }
21109 }
21110 function onTouchEnd() {
21111 clearTimeout(timeoutId);
21112 clearInterval(intervalId);
21113 autorepeatAction = null;
21114 autorepeatInAction = false;
21115 isTouched = false;
21116 }
21117
21118 function onMinusClick() {
21119 if (manualInput) {
21120 if (stepper.params.buttonsEndInputMode) {
21121 manualInput = false;
21122 stepper.endTypeMode(true);
21123 }
21124 return;
21125 }
21126 if (preventButtonClick) {
21127 preventButtonClick = false;
21128 return;
21129 }
21130 stepper.decrement(true);
21131 }
21132 function onPlusClick() {
21133 if (manualInput) {
21134 if (stepper.params.buttonsEndInputMode) {
21135 manualInput = false;
21136 stepper.endTypeMode(true);
21137 }
21138 return;
21139 }
21140 if (preventButtonClick) {
21141 preventButtonClick = false;
21142 return;
21143 }
21144 stepper.increment(true);
21145 }
21146 function onInputClick(e) {
21147 if (!e.target.readOnly && stepper.params.manualInputMode) {
21148 manualInput = true;
21149 if (typeof e.target.selectionStart === 'number') {
21150 e.target.selectionStart = e.target.value.length;
21151 e.target.selectionEnd = e.target.value.length;
21152 }
21153 }
21154 }
21155 function onInputKey(e) {
21156 if (e.keyCode === 13 || e.which === 13) {
21157 e.preventDefault();
21158 manualInput = false;
21159 stepper.endTypeMode();
21160 }
21161 }
21162 function onInputBlur() {
21163 manualInput = false;
21164 stepper.endTypeMode(true);
21165 }
21166 function onInput(e) {
21167 if (manualInput) {
21168 stepper.typeValue(e.target.value);
21169 return;
21170 }
21171 if (e.detail && e.detail.sentByF7Stepper) { return; }
21172 stepper.setValue(e.target.value, true);
21173 }
21174 stepper.attachEvents = function attachEvents() {
21175 $buttonMinusEl.on('click', onMinusClick);
21176 $buttonPlusEl.on('click', onPlusClick);
21177 if (stepper.params.watchInput && $inputEl && $inputEl.length) {
21178 $inputEl.on('input', onInput);
21179 $inputEl.on('click', onInputClick);
21180 $inputEl.on('blur', onInputBlur);
21181 $inputEl.on('keyup', onInputKey);
21182 }
21183 if (stepper.params.autorepeat) {
21184 app.on('touchstart:passive', onTouchStart);
21185 app.on('touchmove:active', onTouchMove);
21186 app.on('touchend:passive', onTouchEnd);
21187 }
21188 };
21189 stepper.detachEvents = function detachEvents() {
21190 $buttonMinusEl.off('click', onMinusClick);
21191 $buttonPlusEl.off('click', onPlusClick);
21192 if (stepper.params.watchInput && $inputEl && $inputEl.length) {
21193 $inputEl.off('input', onInput);
21194 $inputEl.off('click', onInputClick);
21195 $inputEl.off('blur', onInputBlur);
21196 $inputEl.off('keyup', onInputKey);
21197 }
21198 };
21199
21200 // Install Modules
21201 stepper.useModules();
21202
21203 // Init
21204 stepper.init();
21205
21206 return stepper;
21207 }
21208
5d51ea26
DC
21209 if ( Framework7Class ) Stepper.__proto__ = Framework7Class;
21210 Stepper.prototype = Object.create( Framework7Class && Framework7Class.prototype );
5309fbda
DC
21211 Stepper.prototype.constructor = Stepper;
21212
21213 Stepper.prototype.minus = function minus () {
21214 return this.decrement();
21215 };
21216
21217 Stepper.prototype.plus = function plus () {
21218 return this.increment();
21219 };
21220
21221 Stepper.prototype.decrement = function decrement () {
21222 var stepper = this;
21223 return stepper.setValue(stepper.value - stepper.step, false, true);
21224 };
21225
21226 Stepper.prototype.increment = function increment () {
21227 var stepper = this;
21228 return stepper.setValue(stepper.value + stepper.step, false, true);
21229 };
21230
21231 Stepper.prototype.setValue = function setValue (newValue, forceUpdate, withWraps) {
21232 var stepper = this;
21233 var step = stepper.step;
21234 var min = stepper.min;
21235 var max = stepper.max;
21236
21237 var oldValue = stepper.value;
21238
21239 var value = Math.round(newValue / step) * step;
21240 if (stepper.params.wraps && withWraps) {
21241 if (value > max) { value = min; }
21242 if (value < min) { value = max; }
21243 } else {
21244 value = Math.max(Math.min(value, max), min);
21245 }
21246
21247 if (Number.isNaN(value)) {
21248 value = oldValue;
21249 }
21250 stepper.value = value;
21251
21252 var valueChanged = oldValue !== value;
21253
21254 // Events
21255 if (!valueChanged && !forceUpdate) { return stepper; }
21256
21257 stepper.$el.trigger('stepper:change', stepper, stepper.value);
21258 var formattedValue = stepper.formatValue(stepper.value);
21259 if (stepper.$inputEl && stepper.$inputEl.length) {
21260 stepper.$inputEl.val(formattedValue);
21261 stepper.$inputEl.trigger('input change', { sentByF7Stepper: true });
21262 }
21263 if (stepper.$valueEl && stepper.$valueEl.length) {
21264 stepper.$valueEl.html(formattedValue);
21265 }
21266 stepper.emit('local::change stepperChange', stepper, stepper.value);
21267 return stepper;
21268 };
21269
21270 Stepper.prototype.endTypeMode = function endTypeMode (noBlur) {
21271 var stepper = this;
21272 var min = stepper.min;
21273 var max = stepper.max;
21274 var value = parseFloat(stepper.value);
21275
21276 if (Number.isNaN(value)) { value = 0; }
21277
21278 value = Math.max(Math.min(value, max), min);
21279
21280 stepper.value = value;
21281 if (!stepper.typeModeChanged) {
21282 if (stepper.$inputEl && stepper.$inputEl.length && !noBlur) {
21283 stepper.$inputEl.blur();
21284 }
21285 return stepper;
21286 }
21287 stepper.typeModeChanged = false;
21288
21289 stepper.$el.trigger('stepper:change', stepper, stepper.value);
21290 var formattedValue = stepper.formatValue(stepper.value);
21291 if (stepper.$inputEl && stepper.$inputEl.length) {
21292 stepper.$inputEl.val(formattedValue);
21293 stepper.$inputEl.trigger('input change', { sentByF7Stepper: true });
21294 if (!noBlur) { stepper.$inputEl.blur(); }
21295 }
21296 if (stepper.$valueEl && stepper.$valueEl.length) {
21297 stepper.$valueEl.html(formattedValue);
21298 }
21299 stepper.emit('local::change stepperChange', stepper, stepper.value);
21300 return stepper;
21301 };
21302
21303 Stepper.prototype.typeValue = function typeValue (value) {
21304 var stepper = this;
21305 stepper.typeModeChanged = true;
21306 var inputTxt = String(value);
21307 if (inputTxt.lastIndexOf('.') + 1 === inputTxt.length || inputTxt.lastIndexOf(',') + 1 === inputTxt.length) {
21308 if (inputTxt.lastIndexOf('.') !== inputTxt.indexOf('.') || inputTxt.lastIndexOf(',') !== inputTxt.indexOf(',')) {
21309 inputTxt = inputTxt.slice(0, -1);
21310 stepper.value = inputTxt;
21311 stepper.$inputEl.val(stepper.value);
21312 return stepper;
21313 }
21314 } else {
21315 var newValue = parseFloat(inputTxt.replace(',', '.'));
21316 if (newValue === 0) {
21317 stepper.value = inputTxt.replace(',', '.');
21318 stepper.$inputEl.val(stepper.value);
21319 return stepper;
21320 }
21321 if (Number.isNaN(newValue)) {
21322 stepper.value = 0;
21323 stepper.$inputEl.val(stepper.value);
21324 return stepper;
21325 }
21326 var powVal = Math.pow( 10, stepper.params.decimalPoint );
21327 newValue = (Math.round((newValue) * powVal)).toFixed(stepper.params.decimalPoint + 1) / powVal;
21328 stepper.value = parseFloat(String(newValue).replace(',', '.'));
21329 stepper.$inputEl.val(stepper.value);
21330 return stepper;
21331 }
21332 stepper.value = inputTxt;
21333 stepper.$inputEl.val(inputTxt);
21334 return stepper;
21335 };
21336
21337 Stepper.prototype.getValue = function getValue () {
21338 return this.value;
21339 };
21340
21341 Stepper.prototype.formatValue = function formatValue (value) {
21342 var stepper = this;
21343 if (!stepper.params.formatValue) { return value; }
21344 return stepper.params.formatValue.call(stepper, value);
21345 };
21346
21347 Stepper.prototype.init = function init () {
21348 var stepper = this;
21349 stepper.attachEvents();
21350 if (stepper.$valueEl && stepper.$valueEl.length) {
21351 var formattedValue = stepper.formatValue(stepper.value);
21352 stepper.$valueEl.html(formattedValue);
21353 }
21354 return stepper;
21355 };
21356
21357 Stepper.prototype.destroy = function destroy () {
21358 var stepper = this;
21359 stepper.$el.trigger('stepper:beforedestroy', stepper);
21360 stepper.emit('local::beforeDestroy stepperBeforeDestroy', stepper);
21361 delete stepper.$el[0].f7Stepper;
21362 stepper.detachEvents();
21363 Utils.deleteProps(stepper);
21364 stepper = null;
21365 };
21366
21367 return Stepper;
21368 }(Framework7Class));
21369
21370 var Stepper$1 = {
21371 name: 'stepper',
21372 create: function create() {
21373 var app = this;
21374 app.stepper = Utils.extend(
21375 ConstructorMethods({
21376 defaultSelector: '.stepper',
21377 constructor: Stepper,
21378 app: app,
21379 domProp: 'f7Stepper',
21380 }),
21381 {
21382 getValue: function getValue(el) {
21383 if ( el === void 0 ) el = '.stepper';
21384
21385 var stepper = app.stepper.get(el);
21386 if (stepper) { return stepper.getValue(); }
21387 return undefined;
21388 },
21389 setValue: function setValue(el, value) {
21390 if ( el === void 0 ) el = '.stepper';
21391
21392 var stepper = app.stepper.get(el);
21393 if (stepper) { return stepper.setValue(value); }
21394 return undefined;
21395 },
21396 }
21397 );
21398 },
21399 static: {
21400 Stepper: Stepper,
21401 },
21402 on: {
21403 tabMounted: function tabMounted(tabEl) {
21404 var app = this;
21405 $(tabEl).find('.stepper-init').each(function (index, stepperEl) {
21406 var dataset = $(stepperEl).dataset();
21407 app.stepper.create(Utils.extend({ el: stepperEl }, dataset || {}));
21408 });
21409 },
21410 tabBeforeRemove: function tabBeforeRemove(tabEl) {
21411 $(tabEl).find('.stepper-init').each(function (index, stepperEl) {
21412 if (stepperEl.f7Stepper) { stepperEl.f7Stepper.destroy(); }
21413 });
21414 },
21415 pageInit: function pageInit(page) {
21416 var app = this;
21417 page.$el.find('.stepper-init').each(function (index, stepperEl) {
21418 var dataset = $(stepperEl).dataset();
21419 app.stepper.create(Utils.extend({ el: stepperEl }, dataset || {}));
21420 });
21421 },
21422 pageBeforeRemove: function pageBeforeRemove(page) {
21423 page.$el.find('.stepper-init').each(function (index, stepperEl) {
21424 if (stepperEl.f7Stepper) { stepperEl.f7Stepper.destroy(); }
21425 });
21426 },
21427 },
21428 vnode: {
21429 'stepper-init': {
21430 insert: function insert(vnode) {
21431 var app = this;
21432 var stepperEl = vnode.elm;
21433 var dataset = $(stepperEl).dataset();
21434 app.stepper.create(Utils.extend({ el: stepperEl }, dataset || {}));
21435 },
21436 destroy: function destroy(vnode) {
21437 var stepperEl = vnode.elm;
21438 if (stepperEl.f7Stepper) { stepperEl.f7Stepper.destroy(); }
21439 },
21440 },
21441 },
21442 };
21443
5d51ea26 21444 var SmartSelect = /*@__PURE__*/(function (Framework7Class) {
5309fbda
DC
21445 function SmartSelect(app, params) {
21446 if ( params === void 0 ) params = {};
21447
5d51ea26 21448 Framework7Class.call(this, params, [app]);
5309fbda
DC
21449 var ss = this;
21450
21451 var defaults = Utils.extend({
21452 on: {},
21453 }, app.params.smartSelect);
21454
5d51ea26
DC
21455 if (typeof defaults.searchbarDisableButton === 'undefined') {
21456 defaults.searchbarDisableButton = app.theme !== 'aurora';
21457 }
21458
5309fbda
DC
21459 // Extend defaults with modules params
21460 ss.useModulesParams(defaults);
21461
21462 ss.params = Utils.extend({}, defaults, params);
21463
21464 ss.app = app;
21465
21466 var $el = $(ss.params.el).eq(0);
21467 if ($el.length === 0) { return ss; }
21468
21469 if ($el[0].f7SmartSelect) { return $el[0].f7SmartSelect; }
21470
21471 var $selectEl = $el.find('select').eq(0);
21472 if ($selectEl.length === 0) { return ss; }
21473
21474 var $valueEl = $(ss.params.valueEl);
21475 if ($valueEl.length === 0) {
21476 $valueEl = $el.find('.item-after');
21477 }
21478 if ($valueEl.length === 0) {
21479 $valueEl = $('<div class="item-after"></div>');
21480 $valueEl.insertAfter($el.find('.item-title'));
21481 }
21482
21483 // View
21484 var view;
21485
21486 // Url
21487 var url = params.url;
21488 if (!url) {
21489 if ($el.attr('href') && $el.attr('href') !== '#') { url = $el.attr('href'); }
21490 else if ($selectEl.attr('name')) { url = ($selectEl.attr('name').toLowerCase()) + "-select/"; }
21491 }
21492 if (!url) { url = ss.params.url; }
21493
21494 var multiple = $selectEl[0].multiple;
21495 var inputType = multiple ? 'checkbox' : 'radio';
21496 var id = Utils.id();
21497
21498 Utils.extend(ss, {
21499 $el: $el,
21500 el: $el[0],
21501 $selectEl: $selectEl,
21502 selectEl: $selectEl[0],
21503 $valueEl: $valueEl,
21504 valueEl: $valueEl[0],
21505 url: url,
21506 multiple: multiple,
21507 inputType: inputType,
21508 id: id,
21509 view: view,
21510 inputName: (inputType + "-" + id),
21511 selectName: $selectEl.attr('name'),
21512 maxLength: $selectEl.attr('maxlength') || params.maxLength,
21513 });
21514
21515 $el[0].f7SmartSelect = ss;
21516
21517 // Events
21518 function onClick() {
21519 ss.open();
21520 }
21521 function onChange() {
21522 var value = ss.$selectEl.val();
21523 ss.$el.trigger('smartselect:change', ss, value);
21524 ss.emit('local::change smartSelectChange', ss, value);
21525 ss.setTextValue();
21526 }
21527 ss.attachEvents = function attachEvents() {
21528 $el.on('click', onClick);
21529 $el.on('change', 'select', onChange);
21530 };
21531 ss.detachEvents = function detachEvents() {
21532 $el.off('click', onClick);
21533 $el.off('change', 'select', onChange);
21534 };
21535
21536 function handleInputChange() {
21537 var optionEl;
21538 var text;
21539 var inputEl = this;
21540 var value = inputEl.value;
21541 var optionText = [];
21542 var displayAs;
21543 if (inputEl.type === 'checkbox') {
21544 for (var i = 0; i < ss.selectEl.options.length; i += 1) {
21545 optionEl = ss.selectEl.options[i];
21546 if (optionEl.value === value) {
21547 optionEl.selected = inputEl.checked;
21548 }
21549 if (optionEl.selected) {
21550 displayAs = optionEl.dataset ? optionEl.dataset.displayAs : $(optionEl).data('display-value-as');
21551 text = displayAs && typeof displayAs !== 'undefined' ? displayAs : optionEl.textContent;
21552 optionText.push(text.trim());
21553 }
21554 }
21555 if (ss.maxLength) {
21556 ss.checkMaxLength();
21557 }
21558 } else {
21559 optionEl = ss.$selectEl.find(("option[value=\"" + value + "\"]"))[0];
21560 displayAs = optionEl.dataset ? optionEl.dataset.displayAs : $(optionEl).data('display-as');
21561 text = displayAs && typeof displayAs !== 'undefined' ? displayAs : optionEl.textContent;
21562 optionText = [text];
21563 ss.selectEl.value = value;
21564 }
21565
21566 ss.$selectEl.trigger('change');
21567 ss.$valueEl.text(optionText.join(', '));
21568 if (ss.params.closeOnSelect && ss.inputType === 'radio') {
21569 ss.close();
21570 }
21571 }
21572
21573 ss.attachInputsEvents = function attachInputsEvents() {
21574 ss.$containerEl.on('change', 'input[type="checkbox"], input[type="radio"]', handleInputChange);
21575 };
21576 ss.detachInputsEvents = function detachInputsEvents() {
21577 ss.$containerEl.off('change', 'input[type="checkbox"], input[type="radio"]', handleInputChange);
21578 };
21579
21580 // Install Modules
21581 ss.useModules();
21582
21583 // Init
21584 ss.init();
21585
21586 return ss;
21587 }
21588
5d51ea26
DC
21589 if ( Framework7Class ) SmartSelect.__proto__ = Framework7Class;
21590 SmartSelect.prototype = Object.create( Framework7Class && Framework7Class.prototype );
5309fbda
DC
21591 SmartSelect.prototype.constructor = SmartSelect;
21592
21593 SmartSelect.prototype.setValue = function setValue (value) {
21594 var ss = this;
21595 var newValue = value;
21596 var optionText = [];
21597 var optionEl;
21598 var displayAs;
21599 var text;
21600 if (ss.multiple) {
21601 if (!Array.isArray(newValue)) { newValue = [newValue]; }
21602 for (var i = 0; i < ss.selectEl.options.length; i += 1) {
21603 optionEl = ss.selectEl.options[i];
21604 if (newValue.indexOf(optionEl.value) >= 0) {
21605 optionEl.selected = true;
21606 } else {
21607 optionEl.selected = false;
21608 }
21609 if (optionEl.selected) {
21610 displayAs = optionEl.dataset ? optionEl.dataset.displayAs : $(optionEl).data('display-value-as');
21611 text = displayAs && typeof displayAs !== 'undefined' ? displayAs : optionEl.textContent;
21612 optionText.push(text.trim());
21613 }
21614 }
21615 } else {
21616 optionEl = ss.$selectEl.find(("option[value=\"" + newValue + "\"]"))[0];
5d51ea26
DC
21617 if (optionEl) {
21618 displayAs = optionEl.dataset ? optionEl.dataset.displayAs : $(optionEl).data('display-as');
21619 text = displayAs && typeof displayAs !== 'undefined' ? displayAs : optionEl.textContent;
21620 optionText = [text];
21621 }
5309fbda
DC
21622 ss.selectEl.value = newValue;
21623 }
21624 ss.$valueEl.text(optionText.join(', '));
5d51ea26 21625 return ss;
5309fbda
DC
21626 };
21627
21628 SmartSelect.prototype.getValue = function getValue () {
21629 var ss = this;
21630 return ss.$selectEl.val();
21631 };
21632
21633 SmartSelect.prototype.getView = function getView () {
21634 var ss = this;
21635 var view = ss.view || ss.params.view;
21636 if (!view) {
21637 view = ss.$el.parents('.view').length && ss.$el.parents('.view')[0].f7View;
21638 }
21639 if (!view) {
21640 throw Error('Smart Select requires initialized View');
21641 }
21642 ss.view = view;
21643 return view;
21644 };
21645
21646 SmartSelect.prototype.checkMaxLength = function checkMaxLength () {
21647 var ss = this;
21648 var $containerEl = ss.$containerEl;
21649 if (ss.selectEl.selectedOptions.length >= ss.maxLength) {
21650 $containerEl.find('input[type="checkbox"]').each(function (index, inputEl) {
21651 if (!inputEl.checked) {
21652 $(inputEl).parents('li').addClass('disabled');
21653 } else {
21654 $(inputEl).parents('li').removeClass('disabled');
21655 }
21656 });
21657 } else {
21658 $containerEl.find('.disabled').removeClass('disabled');
21659 }
21660 };
21661
21662 SmartSelect.prototype.setTextValue = function setTextValue (value) {
21663 var ss = this;
21664 var valueArray = [];
21665 if (typeof value !== 'undefined') {
21666 if (Array.isArray(value)) {
21667 valueArray = value;
21668 } else {
21669 valueArray = [value];
21670 }
21671 } else {
21672 ss.$selectEl.find('option').each(function (optionIndex, optionEl) {
21673 var $optionEl = $(optionEl);
21674 if (optionEl.selected) {
21675 var displayAs = optionEl.dataset ? optionEl.dataset.displayAs : $optionEl.data('display-value-as');
21676 if (displayAs && typeof displayAs !== 'undefined') {
21677 valueArray.push(displayAs);
21678 } else {
21679 valueArray.push(optionEl.textContent.trim());
21680 }
21681 }
21682 });
21683 }
21684 ss.$valueEl.text(valueArray.join(', '));
21685 };
21686
21687 SmartSelect.prototype.getItemsData = function getItemsData () {
21688 var ss = this;
21689 var items = [];
21690 var previousGroupEl;
21691 ss.$selectEl.find('option').each(function (index, optionEl) {
21692 var $optionEl = $(optionEl);
21693 var optionData = $optionEl.dataset();
21694 var optionImage = optionData.optionImage || ss.params.optionImage;
21695 var optionIcon = optionData.optionIcon || ss.params.optionIcon;
21696 var optionHasMedia = optionImage || optionIcon;
21697 // if (material) optionHasMedia = optionImage || optionIcon;
21698 var optionColor = optionData.optionColor;
21699
21700 var optionClassName = optionData.optionClass || '';
21701 if ($optionEl[0].disabled) { optionClassName += ' disabled'; }
21702
21703 var optionGroupEl = $optionEl.parent('optgroup')[0];
21704 var optionGroupLabel = optionGroupEl && optionGroupEl.label;
21705 var optionIsLabel = false;
21706 if (optionGroupEl && optionGroupEl !== previousGroupEl) {
21707 optionIsLabel = true;
21708 previousGroupEl = optionGroupEl;
21709 items.push({
21710 groupLabel: optionGroupLabel,
21711 isLabel: optionIsLabel,
21712 });
21713 }
21714 items.push({
21715 value: $optionEl[0].value,
21716 text: $optionEl[0].textContent.trim(),
21717 selected: $optionEl[0].selected,
21718 groupEl: optionGroupEl,
21719 groupLabel: optionGroupLabel,
21720 image: optionImage,
21721 icon: optionIcon,
21722 color: optionColor,
21723 className: optionClassName,
21724 disabled: $optionEl[0].disabled,
21725 id: ss.id,
21726 hasMedia: optionHasMedia,
21727 checkbox: ss.inputType === 'checkbox',
21728 radio: ss.inputType === 'radio',
21729 inputName: ss.inputName,
21730 inputType: ss.inputType,
21731 });
21732 });
21733 ss.items = items;
21734 return items;
21735 };
21736
21737 SmartSelect.prototype.renderSearchbar = function renderSearchbar () {
21738 var ss = this;
21739 if (ss.params.renderSearchbar) { return ss.params.renderSearchbar.call(ss); }
5d51ea26 21740 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 " + (ss.params.searchbarDisableButton ? ("\n <span class=\"searchbar-disable-button\">" + (ss.params.searchbarDisableText) + "</span>\n ") : '') + "\n </div>\n </form>\n ";
5309fbda
DC
21741 return searchbarHTML;
21742 };
21743
21744 SmartSelect.prototype.renderItem = function renderItem (item, index) {
21745 var ss = this;
21746 if (ss.params.renderItem) { return ss.params.renderItem.call(ss, item, index); }
21747 var itemHtml;
21748 if (item.isLabel) {
21749 itemHtml = "<li class=\"item-divider\">" + (item.groupLabel) + "</li>";
21750 } else {
21751 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 ";
21752 }
21753 return itemHtml;
21754 };
21755
21756 SmartSelect.prototype.renderItems = function renderItems () {
21757 var ss = this;
21758 if (ss.params.renderItems) { return ss.params.renderItems.call(ss, ss.items); }
21759 var itemsHtml = "\n " + (ss.items.map(function (item, index) { return ("" + (ss.renderItem(item, index))); }).join('')) + "\n ";
21760 return itemsHtml;
21761 };
21762
21763 SmartSelect.prototype.renderPage = function renderPage () {
21764 var ss = this;
21765 if (ss.params.renderPage) { return ss.params.renderPage.call(ss, ss.items); }
21766 var pageTitle = ss.params.pageTitle;
21767 if (typeof pageTitle === 'undefined') {
21768 var $itemTitleEl = ss.$el.find('.item-title');
21769 pageTitle = $itemTitleEl.length ? $itemTitleEl.text().trim() : '';
21770 }
21771 var cssClass = ss.params.cssClass;
5d51ea26 21772 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 class=\"link back\">\n <i class=\"icon icon-back\"></i>\n <span class=\"if-not-md\">" + (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 ";
5309fbda
DC
21773 return pageHtml;
21774 };
21775
21776 SmartSelect.prototype.renderPopup = function renderPopup () {
21777 var ss = this;
21778 if (ss.params.renderPopup) { return ss.params.renderPopup.call(ss, ss.items); }
21779 var pageTitle = ss.params.pageTitle;
21780 if (typeof pageTitle === 'undefined') {
21781 var $itemTitleEl = ss.$el.find('.item-title');
21782 pageTitle = $itemTitleEl.length ? $itemTitleEl.text().trim() : '';
21783 }
21784 var cssClass = ss.params.cssClass || '';
5d51ea26 21785 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 " + (pageTitle ? ("<div class=\"title\">" + pageTitle + "</div>") : '') + "\n <div class=\"right\">\n <a class=\"link popup-close\" data-popup=\".smart-select-popup[data-select-name='" + (ss.selectName) + "']\">" + (ss.params.popupCloseLinkText) + "</span></a>\n </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 ";
5309fbda
DC
21786 return popupHtml;
21787 };
21788
21789 SmartSelect.prototype.renderSheet = function renderSheet () {
21790 var ss = this;
21791 if (ss.params.renderSheet) { return ss.params.renderSheet.call(ss, ss.items); }
21792 var cssClass = ss.params.cssClass;
21793 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 ";
21794 return sheetHtml;
21795 };
21796
21797 SmartSelect.prototype.renderPopover = function renderPopover () {
21798 var ss = this;
21799 if (ss.params.renderPopover) { return ss.params.renderPopover.call(ss, ss.items); }
21800 var cssClass = ss.params.cssClass;
21801 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 ";
21802 return popoverHtml;
21803 };
21804
5d51ea26
DC
21805 SmartSelect.prototype.scrollToSelectedItem = function scrollToSelectedItem () {
21806 var ss = this;
21807 var params = ss.params;
21808 var $containerEl = ss.$containerEl;
21809 if (!ss.opened) { return ss; }
21810 if (params.virtualList) {
21811 var selectedIndex;
21812 ss.vl.items.forEach(function (item, index) {
21813 if (typeof selectedIndex === 'undefined' && item.selected) {
21814 selectedIndex = index;
21815 }
21816 });
21817 if (typeof selectedIndex !== 'undefined') {
21818 ss.vl.scrollToItem(selectedIndex);
21819 }
21820 } else {
21821 var $selectedItemEl = $containerEl.find('input:checked').parents('li');
21822 var $pageContentEl = $containerEl.find('.page-content');
21823 $pageContentEl.scrollTop($selectedItemEl.offset().top - $pageContentEl.offset().top - parseInt($pageContentEl.css('padding-top'), 10));
21824 }
21825 return ss;
21826 };
21827
5309fbda
DC
21828 SmartSelect.prototype.onOpen = function onOpen (type, containerEl) {
21829 var ss = this;
21830 var app = ss.app;
21831 var $containerEl = $(containerEl);
21832 ss.$containerEl = $containerEl;
21833 ss.openedIn = type;
21834 ss.opened = true;
21835
21836 // Init VL
21837 if (ss.params.virtualList) {
21838 ss.vl = app.virtualList.create({
21839 el: $containerEl.find('.virtual-list'),
21840 items: ss.items,
21841 renderItem: ss.renderItem.bind(ss),
21842 height: ss.params.virtualListHeight,
21843 searchByItem: function searchByItem(query, item) {
21844 if (item.text && item.text.toLowerCase().indexOf(query.trim().toLowerCase()) >= 0) { return true; }
21845 return false;
21846 },
21847 });
21848 }
5d51ea26
DC
21849 if (ss.params.scrollToSelectedItem) {
21850 ss.scrollToSelectedItem();
21851 }
5309fbda
DC
21852
21853 // Init SB
21854 if (ss.params.searchbar) {
21855 var $searchbarEl = $containerEl.find('.searchbar');
21856 if (type === 'page' && app.theme === 'ios') {
21857 $searchbarEl = $(app.navbar.getElByPage($containerEl)).find('.searchbar');
21858 }
21859
21860 if (ss.params.appendSearchbarNotFound && (type === 'page' || type === 'popup')) {
21861 var $notFoundEl = null;
21862
21863 if (typeof ss.params.appendSearchbarNotFound === 'string') {
21864 $notFoundEl = $(("<div class=\"block searchbar-not-found\">" + (ss.params.appendSearchbarNotFound) + "</div>"));
21865 } else if (typeof ss.params.appendSearchbarNotFound === 'boolean') {
21866 $notFoundEl = $('<div class="block searchbar-not-found">Nothing found</div>');
21867 } else {
21868 $notFoundEl = ss.params.appendSearchbarNotFound;
21869 }
21870
21871 if ($notFoundEl) {
21872 $containerEl.find('.page-content').append($notFoundEl[0]);
21873 }
21874 }
21875
21876 var searchbarParams = Utils.extend({
21877 el: $searchbarEl,
21878 backdropEl: $containerEl.find('.searchbar-backdrop'),
21879 searchContainer: (".smart-select-list-" + (ss.id)),
21880 searchIn: '.item-title',
21881 }, typeof ss.params.searchbar === 'object' ? ss.params.searchbar : {});
21882
21883 ss.searchbar = app.searchbar.create(searchbarParams);
21884 }
21885
21886 // Check for max length
21887 if (ss.maxLength) {
21888 ss.checkMaxLength();
21889 }
21890
21891 // Close on select
21892 if (ss.params.closeOnSelect) {
21893 ss.$containerEl.find(("input[type=\"radio\"][name=\"" + (ss.inputName) + "\"]:checked")).parents('label').once('click', function () {
21894 ss.close();
21895 });
21896 }
21897
21898 // Attach input events
21899 ss.attachInputsEvents();
21900
21901 ss.$el.trigger('smartselect:open', ss);
21902 ss.emit('local::open smartSelectOpen', ss);
21903 };
21904
21905 SmartSelect.prototype.onOpened = function onOpened () {
21906 var ss = this;
21907
21908 ss.$el.trigger('smartselect:opened', ss);
21909 ss.emit('local::opened smartSelectOpened', ss);
21910 };
21911
21912 SmartSelect.prototype.onClose = function onClose () {
21913 var ss = this;
21914 if (ss.destroyed) { return; }
21915
21916 // Destroy VL
21917 if (ss.vl && ss.vl.destroy) {
21918 ss.vl.destroy();
21919 ss.vl = null;
21920 delete ss.vl;
21921 }
21922
21923 // Destroy SB
21924 if (ss.searchbar && ss.searchbar.destroy) {
21925 ss.searchbar.destroy();
21926 ss.searchbar = null;
21927 delete ss.searchbar;
21928 }
21929 // Detach events
21930 ss.detachInputsEvents();
21931
21932 ss.$el.trigger('smartselect:close', ss);
21933 ss.emit('local::close smartSelectClose', ss);
21934 };
21935
21936 SmartSelect.prototype.onClosed = function onClosed () {
21937 var ss = this;
21938 if (ss.destroyed) { return; }
21939 ss.opened = false;
21940 ss.$containerEl = null;
21941 delete ss.$containerEl;
21942
21943 ss.$el.trigger('smartselect:closed', ss);
21944 ss.emit('local::closed smartSelectClosed', ss);
21945 };
21946
21947 SmartSelect.prototype.openPage = function openPage () {
21948 var ss = this;
21949 if (ss.opened) { return ss; }
21950 ss.getItemsData();
21951 var pageHtml = ss.renderPage(ss.items);
21952 var view = ss.getView();
21953
21954 view.router.navigate({
21955 url: ss.url,
21956 route: {
21957 content: pageHtml,
21958 path: ss.url,
21959 on: {
21960 pageBeforeIn: function pageBeforeIn(e, page) {
21961 ss.onOpen('page', page.el);
21962 },
21963 pageAfterIn: function pageAfterIn(e, page) {
21964 ss.onOpened('page', page.el);
21965 },
21966 pageBeforeOut: function pageBeforeOut(e, page) {
21967 ss.onClose('page', page.el);
21968 },
21969 pageAfterOut: function pageAfterOut(e, page) {
21970 ss.onClosed('page', page.el);
21971 },
21972 },
21973 },
21974 });
21975 return ss;
21976 };
21977
21978 SmartSelect.prototype.openPopup = function openPopup () {
21979 var ss = this;
21980 if (ss.opened) { return ss; }
21981 ss.getItemsData();
21982 var popupHtml = ss.renderPopup(ss.items);
21983
21984 var popupParams = {
21985 content: popupHtml,
21986 on: {
21987 popupOpen: function popupOpen(popup) {
21988 ss.onOpen('popup', popup.el);
21989 },
21990 popupOpened: function popupOpened(popup) {
21991 ss.onOpened('popup', popup.el);
21992 },
21993 popupClose: function popupClose(popup) {
21994 ss.onClose('popup', popup.el);
21995 },
21996 popupClosed: function popupClosed(popup) {
21997 ss.onClosed('popup', popup.el);
21998 },
21999 },
22000 };
22001
22002 if (ss.params.routableModals) {
22003 var view = ss.getView();
22004 view.router.navigate({
22005 url: ss.url,
22006 route: {
22007 path: ss.url,
22008 popup: popupParams,
22009 },
22010 });
22011 } else {
22012 ss.modal = ss.app.popup.create(popupParams).open();
22013 }
22014 return ss;
22015 };
22016
22017 SmartSelect.prototype.openSheet = function openSheet () {
22018 var ss = this;
22019 if (ss.opened) { return ss; }
22020 ss.getItemsData();
22021 var sheetHtml = ss.renderSheet(ss.items);
22022
22023 var sheetParams = {
22024 content: sheetHtml,
22025 backdrop: false,
22026 scrollToEl: ss.$el,
22027 closeByOutsideClick: true,
22028 on: {
22029 sheetOpen: function sheetOpen(sheet) {
22030 ss.onOpen('sheet', sheet.el);
22031 },
22032 sheetOpened: function sheetOpened(sheet) {
22033 ss.onOpened('sheet', sheet.el);
22034 },
22035 sheetClose: function sheetClose(sheet) {
22036 ss.onClose('sheet', sheet.el);
22037 },
22038 sheetClosed: function sheetClosed(sheet) {
22039 ss.onClosed('sheet', sheet.el);
22040 },
22041 },
22042 };
22043
22044 if (ss.params.routableModals) {
22045 var view = ss.getView();
22046 view.router.navigate({
22047 url: ss.url,
22048 route: {
22049 path: ss.url,
22050 sheet: sheetParams,
22051 },
22052 });
22053 } else {
22054 ss.modal = ss.app.sheet.create(sheetParams).open();
22055 }
22056 return ss;
22057 };
22058
22059 SmartSelect.prototype.openPopover = function openPopover () {
22060 var ss = this;
22061 if (ss.opened) { return ss; }
22062 ss.getItemsData();
22063 var popoverHtml = ss.renderPopover(ss.items);
22064 var popoverParams = {
22065 content: popoverHtml,
22066 targetEl: ss.$el,
22067 on: {
22068 popoverOpen: function popoverOpen(popover) {
22069 ss.onOpen('popover', popover.el);
22070 },
22071 popoverOpened: function popoverOpened(popover) {
22072 ss.onOpened('popover', popover.el);
22073 },
22074 popoverClose: function popoverClose(popover) {
22075 ss.onClose('popover', popover.el);
22076 },
22077 popoverClosed: function popoverClosed(popover) {
22078 ss.onClosed('popover', popover.el);
22079 },
22080 },
22081 };
22082 if (ss.params.routableModals) {
22083 var view = ss.getView();
22084 view.router.navigate({
22085 url: ss.url,
22086 route: {
22087 path: ss.url,
22088 popover: popoverParams,
22089 },
22090 });
22091 } else {
22092 ss.modal = ss.app.popover.create(popoverParams).open();
22093 }
22094 return ss;
22095 };
22096
22097 SmartSelect.prototype.open = function open (type) {
22098 var ss = this;
22099 if (ss.opened) { return ss; }
22100 var openIn = type || ss.params.openIn;
22101 ss[("open" + (openIn.split('').map(function (el, index) {
22102 if (index === 0) { return el.toUpperCase(); }
22103 return el;
22104 }).join('')))]();
22105 return ss;
22106 };
22107
22108 SmartSelect.prototype.close = function close () {
22109 var ss = this;
22110 if (!ss.opened) { return ss; }
22111 if (ss.params.routableModals || ss.openedIn === 'page') {
22112 var view = ss.getView();
22113 view.router.back();
22114 } else {
22115 ss.modal.once('modalClosed', function () {
22116 Utils.nextTick(function () {
22117 ss.modal.destroy();
22118 delete ss.modal;
22119 });
22120 });
22121 ss.modal.close();
22122 }
22123 return ss;
22124 };
22125
22126 SmartSelect.prototype.init = function init () {
22127 var ss = this;
22128 ss.attachEvents();
22129 ss.setTextValue();
22130 };
22131
22132 SmartSelect.prototype.destroy = function destroy () {
22133 var ss = this;
22134 ss.emit('local::beforeDestroy smartSelectBeforeDestroy', ss);
22135 ss.$el.trigger('smartselect:beforedestroy', ss);
22136 ss.detachEvents();
22137 delete ss.$el[0].f7SmartSelect;
22138 Utils.deleteProps(ss);
22139 ss.destroyed = true;
22140 };
22141
22142 return SmartSelect;
22143 }(Framework7Class));
22144
22145 var SmartSelect$1 = {
22146 name: 'smartSelect',
22147 params: {
22148 smartSelect: {
22149 el: undefined,
22150 valueEl: undefined,
22151 openIn: 'page', // or 'popup' or 'sheet' or 'popover'
22152 pageTitle: undefined,
22153 pageBackLinkText: 'Back',
22154 popupCloseLinkText: 'Close',
22155 popupTabletFullscreen: false,
22156 sheetCloseLinkText: 'Done',
22157 searchbar: false,
22158 searchbarPlaceholder: 'Search',
22159 searchbarDisableText: 'Cancel',
5d51ea26 22160 searchbarDisableButton: undefined,
5309fbda
DC
22161 closeOnSelect: false,
22162 virtualList: false,
22163 virtualListHeight: undefined,
5d51ea26 22164 scrollToSelectedItem: false,
5309fbda
DC
22165 formColorTheme: undefined,
22166 navbarColorTheme: undefined,
22167 routableModals: true,
22168 url: 'select/',
22169 cssClass: '',
22170 /*
22171 Custom render functions
22172 */
22173 renderPage: undefined,
22174 renderPopup: undefined,
22175 renderSheet: undefined,
22176 renderPopover: undefined,
22177 renderItems: undefined,
22178 renderItem: undefined,
22179 renderSearchbar: undefined,
22180 },
22181 },
22182 static: {
22183 SmartSelect: SmartSelect,
22184 },
22185 create: function create() {
22186 var app = this;
22187 app.smartSelect = Utils.extend(
22188 ConstructorMethods({
22189 defaultSelector: '.smart-select',
22190 constructor: SmartSelect,
22191 app: app,
22192 domProp: 'f7SmartSelect',
22193 }),
22194 {
22195 open: function open(smartSelectEl) {
22196 var ss = app.smartSelect.get(smartSelectEl);
22197 if (ss && ss.open) { return ss.open(); }
22198 return undefined;
22199 },
22200 close: function close(smartSelectEl) {
22201 var ss = app.smartSelect.get(smartSelectEl);
22202 if (ss && ss.close) { return ss.close(); }
22203 return undefined;
22204 },
22205 }
22206 );
22207 },
22208
22209 on: {
22210 tabMounted: function tabMounted(tabEl) {
22211 var app = this;
22212 $(tabEl).find('.smart-select-init').each(function (index, smartSelectEl) {
22213 app.smartSelect.create(Utils.extend({ el: smartSelectEl }, $(smartSelectEl).dataset()));
22214 });
22215 },
22216 tabBeforeRemove: function tabBeforeRemove(tabEl) {
22217 $(tabEl).find('.smart-select-init').each(function (index, smartSelectEl) {
22218 if (smartSelectEl.f7SmartSelect && smartSelectEl.f7SmartSelect.destroy) {
22219 smartSelectEl.f7SmartSelect.destroy();
22220 }
22221 });
22222 },
22223 pageInit: function pageInit(page) {
22224 var app = this;
22225 page.$el.find('.smart-select-init').each(function (index, smartSelectEl) {
22226 app.smartSelect.create(Utils.extend({ el: smartSelectEl }, $(smartSelectEl).dataset()));
22227 });
22228 },
22229 pageBeforeRemove: function pageBeforeRemove(page) {
22230 page.$el.find('.smart-select-init').each(function (index, smartSelectEl) {
22231 if (smartSelectEl.f7SmartSelect && smartSelectEl.f7SmartSelect.destroy) {
22232 smartSelectEl.f7SmartSelect.destroy();
22233 }
22234 });
22235 },
22236 },
22237 clicks: {
22238 '.smart-select': function open($clickedEl, data) {
22239 var app = this;
22240 if (!$clickedEl[0].f7SmartSelect) {
22241 var ss = app.smartSelect.create(Utils.extend({ el: $clickedEl }, data));
22242 ss.open();
22243 }
22244 },
22245 },
22246 vnode: {
22247 'smart-select-init': {
22248 insert: function insert(vnode) {
22249 var app = this;
22250 var smartSelectEl = vnode.elm;
22251 app.smartSelect.create(Utils.extend({ el: smartSelectEl }, $(smartSelectEl).dataset()));
22252 },
22253 destroy: function destroy(vnode) {
22254 var smartSelectEl = vnode.elm;
22255 if (smartSelectEl.f7SmartSelect && smartSelectEl.f7SmartSelect.destroy) {
22256 smartSelectEl.f7SmartSelect.destroy();
22257 }
22258 },
22259 },
22260 },
22261 };
22262
22263 var Grid = {
22264 name: 'grid',
22265 };
22266
22267 /*
22268 Converts a Gregorian date to Jalaali.
22269 */
22270 function toJalaali (gy, gm, gd) {
22271 if (Object.prototype.toString.call(gy) === '[object Date]') {
22272 gd = gy.getDate();
22273 gm = gy.getMonth() + 1;
22274 gy = gy.getFullYear();
22275 }
22276 return d2j(g2d(gy, gm, gd))
22277 }
22278
22279 /*
22280 Converts a Jalaali date to Gregorian.
22281 */
22282 function toGregorian (jy, jm, jd) {
22283 return d2g(j2d(jy, jm, jd))
22284 }
22285
22286 // /*
22287 // Checks whether a Jalaali date is valid or not.
22288 // */
22289 // function isValidJalaaliDate (jy, jm, jd) {
22290 // return jy >= -61 && jy <= 3177 &&
22291 // jm >= 1 && jm <= 12 &&
22292 // jd >= 1 && jd <= monthLength(jy, jm)
22293 // }
22294
22295 /*
22296 Is this a leap year or not?
22297 */
22298 function isLeapJalaaliYear (jy) {
22299 return jalCal(jy).leap === 0
22300 }
22301
22302 /*
22303 Number of days in a given month in a Jalaali year.
22304 */
22305 function monthLength (jy, jm) {
22306 if (jm <= 6) { return 31 }
22307 if (jm <= 11) { return 30 }
22308 if (isLeapJalaaliYear(jy)) { return 30 }
22309 return 29
22310 }
22311
22312 /*
22313 This function determines if the Jalaali (Persian) year is
22314 leap (366-day long) or is the common year (365 days), and
22315 finds the day in March (Gregorian calendar) of the first
22316 day of the Jalaali year (jy).
22317 @param jy Jalaali calendar year (-61 to 3177)
22318 @return
22319 leap: number of years since the last leap year (0 to 4)
22320 gy: Gregorian year of the beginning of Jalaali year
22321 march: the March day of Farvardin the 1st (1st day of jy)
22322 @see: http://www.astro.uni.torun.pl/~kb/Papers/EMP/PersianC-EMP.htm
22323 @see: http://www.fourmilab.ch/documents/calendar/
22324 */
22325 function jalCal (jy) {
22326 // Jalaali years starting the 33-year rule.
22327 var breaks = [-61, 9, 38, 199, 426, 686, 756, 818, 1111, 1181, 1210, 1635, 2060, 2097, 2192, 2262, 2324, 2394, 2456, 3178];
22328 var bl = breaks.length;
22329 var gy = jy + 621;
22330 var leapJ = -14;
22331 var jp = breaks[0];
22332 var jm;
22333 var jump;
22334 var leap;
22335 var leapG;
22336 var march;
22337 var n;
22338 var i;
22339
22340 if (jy < jp || jy >= breaks[bl - 1]) { throw new Error('Invalid Jalaali year ' + jy) }
22341
22342 // Find the limiting years for the Jalaali year jy.
22343 for (i = 1; i < bl; i += 1) {
22344 jm = breaks[i];
22345 jump = jm - jp;
22346 if (jy < jm) { break }
22347 leapJ = leapJ + div(jump, 33) * 8 + div(mod(jump, 33), 4);
22348 jp = jm;
22349 }
22350 n = jy - jp;
22351
22352 // Find the number of leap years from AD 621 to the beginning
22353 // of the current Jalaali year in the Persian calendar.
22354 leapJ = leapJ + div(n, 33) * 8 + div(mod(n, 33) + 3, 4);
22355 if (mod(jump, 33) === 4 && jump - n === 4) { leapJ += 1; }
22356
22357 // And the same in the Gregorian calendar (until the year gy).
22358 leapG = div(gy, 4) - div((div(gy, 100) + 1) * 3, 4) - 150;
22359
22360 // Determine the Gregorian date of Farvardin the 1st.
22361 march = 20 + leapJ - leapG;
22362
22363 // Find how many years have passed since the last leap year.
22364 if (jump - n < 6) { n = n - jump + div(jump + 4, 33) * 33; }
22365 leap = mod(mod(n + 1, 33) - 1, 4);
22366 if (leap === -1) {
22367 leap = 4;
22368 }
22369
22370 return { leap: leap,
22371 gy: gy,
22372 march: march
22373 }
22374 }
22375
22376 /*
22377 Converts a date of the Jalaali calendar to the Julian Day number.
22378 @param jy Jalaali year (1 to 3100)
22379 @param jm Jalaali month (1 to 12)
22380 @param jd Jalaali day (1 to 29/31)
22381 @return Julian Day number
22382 */
22383 function j2d (jy, jm, jd) {
22384 var r = jalCal(jy);
22385 return g2d(r.gy, 3, r.march) + (jm - 1) * 31 - div(jm, 7) * (jm - 7) + jd - 1
22386 }
22387
22388 /*
22389 Converts the Julian Day number to a date in the Jalaali calendar.
22390 @param jdn Julian Day number
22391 @return
22392 jy: Jalaali year (1 to 3100)
22393 jm: Jalaali month (1 to 12)
22394 jd: Jalaali day (1 to 29/31)
22395 */
22396 function d2j (jdn) {
22397 var gy = d2g(jdn).gy; // Calculate Gregorian year (gy).
22398 var jy = gy - 621;
22399 var r = jalCal(jy);
22400 var jdn1f = g2d(gy, 3, r.march);
22401 var jd;
22402 var jm;
22403 var k;
22404
22405 // Find number of days that passed since 1 Farvardin.
22406 k = jdn - jdn1f;
22407 if (k >= 0) {
22408 if (k <= 185) {
22409 // The first 6 months.
22410 jm = 1 + div(k, 31);
22411 jd = mod(k, 31) + 1;
22412 return { jy: jy,
22413 jm: jm,
22414 jd: jd
22415 }
22416 } else {
22417 // The remaining months.
22418 k -= 186;
22419 }
22420 } else {
22421 // Previous Jalaali year.
22422 jy -= 1;
22423 k += 179;
22424 if (r.leap === 1) { k += 1; }
22425 }
22426 jm = 7 + div(k, 30);
22427 jd = mod(k, 30) + 1;
22428 return { jy: jy,
22429 jm: jm,
22430 jd: jd
22431 }
22432 }
22433
22434 /*
22435 Calculates the Julian Day number from Gregorian or Julian
22436 calendar dates. This integer number corresponds to the noon of
22437 the date (i.e. 12 hours of Universal Time).
22438 The procedure was tested to be good since 1 March, -100100 (of both
22439 calendars) up to a few million years into the future.
22440 @param gy Calendar year (years BC numbered 0, -1, -2, ...)
22441 @param gm Calendar month (1 to 12)
22442 @param gd Calendar day of the month (1 to 28/29/30/31)
22443 @return Julian Day number
22444 */
22445 function g2d (gy, gm, gd) {
22446 var d = div((gy + div(gm - 8, 6) + 100100) * 1461, 4) +
22447 div(153 * mod(gm + 9, 12) + 2, 5) +
22448 gd - 34840408;
22449 d = d - div(div(gy + 100100 + div(gm - 8, 6), 100) * 3, 4) + 752;
22450 return d
22451 }
22452
22453 /*
22454 Calculates Gregorian and Julian calendar dates from the Julian Day number
22455 (jdn) for the period since jdn=-34839655 (i.e. the year -100100 of both
22456 calendars) to some millions years ahead of the present.
22457 @param jdn Julian Day number
22458 @return
22459 gy: Calendar year (years BC numbered 0, -1, -2, ...)
22460 gm: Calendar month (1 to 12)
22461 gd: Calendar day of the month M (1 to 28/29/30/31)
22462 */
22463 function d2g (jdn) {
22464 var j,
22465 i,
22466 gd,
22467 gm,
22468 gy;
22469 j = 4 * jdn + 139361631;
22470 j = j + div(div(4 * jdn + 183187720, 146097) * 3, 4) * 4 - 3908;
22471 i = div(mod(j, 1461), 4) * 5 + 308;
22472 gd = div(mod(i, 153), 5) + 1;
22473 gm = mod(div(i, 153), 12) + 1;
22474 gy = div(j, 1461) - 100100 + div(8 - gm, 6);
22475 return { gy: gy,
22476 gm: gm,
22477 gd: gd
22478 }
22479 }
22480
22481 /*
22482 Utility helper functions.
22483 */
22484
22485 function div (a, b) {
22486 return ~~(a / b)
22487 }
22488
22489 function mod (a, b) {
22490 return a - ~~(a / b) * b
22491 }
22492
22493 function fixDate (y, m, d) {
22494 if (m > 11) {
22495 y += Math.floor(m / 12);
22496 m = m % 12;
22497 }
22498 while (m < 0) {
22499 y -= 1;
22500 m += 12;
22501 }
22502 while (d > monthLength(y, m + 1)) {
22503 m = m !== 11 ? m + 1 : 0;
22504 y = m === 0 ? y + 1 : y;
22505 d -= monthLength(y, m + 1);
22506 }
22507 while (d <= 0) {
22508 m = m !== 0 ? m - 1 : 11;
22509 y = m === 11 ? y - 1 : y;
22510 d += monthLength(y, m + 1);
22511 }
22512 return [y, m || 0, d || 1]
22513 }
22514
22515 /*
22516 Copyright nainemom <nainemom@gmail.com>
22517 https://github.com/nainemom/idate/blob/dev/package.json
22518 */
22519
22520 var methods = [
22521 'getHours',
22522 'getMilliseconds',
22523 'getMinutes',
22524 'getSeconds',
22525 'getTime',
22526 'getTimezoneOffset',
22527 'getUTCDate',
22528 'getUTCDay',
22529 'getUTCFullYear',
22530 'getUTCHours',
22531 'getUTCMilliseconds',
22532 'getUTCMinutes',
22533 'getUTCMonth',
22534 'getUTCSeconds',
22535 'now',
22536 'parse',
22537 'setHours',
22538 'setMilliseconds',
22539 'setMinutes',
22540 'setSeconds',
22541 'setTime',
22542 'setUTCDate',
22543 'setUTCFullYear',
22544 'setUTCHours',
22545 'setUTCMilliseconds',
22546 'setUTCMinutes',
22547 'setUTCMonth',
22548 'setUTCSeconds',
22549 'toDateString',
22550 'toISOString',
22551 'toJSON',
22552 'toLocaleDateString',
22553 'toLocaleTimeString',
22554 'toLocaleString',
22555 'toTimeString',
22556 'toUTCString',
22557 'UTC',
22558 'valueOf'
22559 ];
22560
22561 var DAY_NAMES = ['Shanbe', 'Yekshanbe', 'Doshanbe', 'Seshanbe', 'Chaharshanbe', 'Panjshanbe', 'Jom\'e'];
22562 var PERSIAN_DAY_NAMES = ['شنبه', 'یکشنبه', 'دوشنبه', 'سه‌شنبه', 'چهارشنبه', 'پنجشنبه', 'جمعه'];
22563 var MONTH_NAMES = ['Farvardin', 'Ordibehesht', 'Khordad', 'Tir', 'Mordad', 'Shahrivar', 'Mehr', 'Aban', 'Azar', 'Dey', 'Bahman', 'Esfand'];
22564 var PERSIAN_MONTH_NAMES = ['فروردین', 'اردیبهشت', 'خرداد', 'تیر', 'مرداد', 'شهریور', 'مهر', 'آبان', 'آذر', 'دی', 'بهمن', 'اسفند'];
22565 var PERSIAN_NUMBERS = ['۰', '۱', '۲', '۳', '۴', '۵', '۶', '۷', '۸', '۹'];
22566
22567 var IDate = /*@__PURE__*/(function (Date) {
22568 function IDate () {
5d51ea26
DC
22569 var args = [], len = arguments.length;
22570 while ( len-- ) args[ len ] = arguments[ len ];
22571
5309fbda
DC
22572 Date.call(this);
22573
22574 var date;
5309fbda
DC
22575 if (args.length === 0) {
22576 date = Date.now();
22577 } else if (args.length === 1) {
22578 date = args[0] instanceof Date ? args[0].getTime() : args[0];
22579 } else {
22580 var fixed = fixDate(
22581 args[0],
22582 args[1] || 0,
22583 typeof args[2] === 'undefined' ? 1 : args[2]);
22584 var converted$1 = toGregorian(fixed[0], fixed[1] + 1, fixed[2]);
22585 date = [converted$1.gy, converted$1.gm - 1, converted$1.gd].concat([args[3] || 0, args[4] || 0, args[5] || 0, args[6] || 0]);
22586 }
22587
22588 if (Array.isArray(date)) {
22589 this.gdate = new (Function.prototype.bind.apply( Date, [ null ].concat( date) ));
22590 } else {
22591 this.gdate = new Date(date);
22592 }
22593
22594 var converted = toJalaali(this.gdate.getFullYear(), this.gdate.getMonth() + 1, this.gdate.getDate());
22595 this.jdate = [converted.jy, converted.jm - 1, converted.jd];
22596
22597 methods.forEach(function (method) {
22598 IDate.prototype[method] = function () {
22599 var ref;
22600
22601 return (ref = this.gdate)[method].apply(ref, arguments)
22602 };
22603 });
22604 }
22605
22606 if ( Date ) IDate.__proto__ = Date;
22607 IDate.prototype = Object.create( Date && Date.prototype );
22608 IDate.prototype.constructor = IDate;
22609
22610 IDate.prototype.getFullYear = function getFullYear () {
22611 return this.jdate[0]
22612 };
22613
22614 IDate.prototype.setFullYear = function setFullYear (value) {
22615 this.jdate = fixDate(value, this.jdate[1], this.jdate[2]);
22616 this.syncDate();
22617 return this.gdate.getTime()
22618 };
22619
22620 IDate.prototype.getMonth = function getMonth () {
22621 return this.jdate[1]
22622 };
22623
22624 IDate.prototype.setMonth = function setMonth (value) {
22625 this.jdate = fixDate(this.jdate[0], value, this.jdate[2]);
22626 this.syncDate();
22627 return this.gdate.getTime()
22628 };
22629
22630 IDate.prototype.getDate = function getDate () {
22631 return this.jdate[2]
22632 };
22633
22634 IDate.prototype.setDate = function setDate (value) {
22635 this.jdate = fixDate(this.jdate[0], this.jdate[1], value);
22636 this.syncDate();
22637 return this.gdate.getTime()
22638 };
22639
22640 IDate.prototype.getDay = function getDay () {
22641 return (this.gdate.getDay() + 1) % 7
22642 };
22643
22644 IDate.prototype.syncDate = function syncDate () {
22645 var converted = toGregorian(this.jdate[0], this.jdate[1] + 1, this.jdate[2]);
22646 this.gdate.setFullYear(converted.gy);
22647 this.gdate.setMonth(converted.gm - 1);
22648 this.gdate.setDate(converted.gd);
22649 };
22650 IDate.prototype.toString = function toString (persianString) {
22651 if ( persianString === void 0 ) persianString = true;
22652
22653 var replaceNums = function (str) {
22654 return str.replace(/./g, function (c) { return PERSIAN_NUMBERS[c] || c; })
22655 };
22656 var padNumber = function (num) { return num.toString().length === 1 ? ("0" + num) : num.toString(); };
22657 var time = (padNumber(this.getHours())) + ":" + (padNumber(this.getMinutes())) + ":" + (padNumber(this.getSeconds()));
22658 if (persianString) {
22659 return replaceNums(((PERSIAN_DAY_NAMES[this.getDay()]) + " " + (this.getDate()) + " " + (PERSIAN_MONTH_NAMES[this.getMonth()]) + " " + (this.getFullYear()) + " ساعت " + time))
22660 }
22661 return ((DAY_NAMES[this.getDay()]) + " " + (this.getDate()) + " " + (MONTH_NAMES[this.getMonth()]) + " " + (this.getFullYear()) + " " + time)
22662 };
22663
22664 return IDate;
22665 }(Date));
22666
5d51ea26 22667 var Calendar = /*@__PURE__*/(function (Framework7Class) {
5309fbda
DC
22668 function Calendar(app, params) {
22669 if ( params === void 0 ) params = {};
22670
5d51ea26 22671 Framework7Class.call(this, params, [app]);
5309fbda
DC
22672 var calendar = this;
22673
22674 calendar.params = Utils.extend({}, app.params.calendar, params);
22675
22676 if (calendar.params.calendarType === 'jalali') {
22677 Object.keys(calendar.params.jalali).forEach(function (param) {
22678 if (!params[param]) {
22679 calendar.params[param] = calendar.params.jalali[param];
22680 }
22681 });
22682 }
22683
22684 if (calendar.params.calendarType === 'jalali') {
22685 calendar.DateHandleClass = IDate;
22686 } else {
22687 calendar.DateHandleClass = Date;
22688 }
22689
22690 var $containerEl;
22691 if (calendar.params.containerEl) {
22692 $containerEl = $(calendar.params.containerEl);
22693 if ($containerEl.length === 0) { return calendar; }
22694 }
22695
22696 var $inputEl;
22697 if (calendar.params.inputEl) {
22698 $inputEl = $(calendar.params.inputEl);
22699 }
22700
22701 var view;
22702 if ($inputEl) {
22703 view = $inputEl.parents('.view').length && $inputEl.parents('.view')[0].f7View;
22704 }
22705 if (!view) { view = app.views.main; }
22706
22707 var isHorizontal = calendar.params.direction === 'horizontal';
22708
22709 var inverter = 1;
22710 if (isHorizontal) {
22711 inverter = app.rtl ? -1 : 1;
22712 }
22713
22714 Utils.extend(calendar, {
22715 app: app,
22716 $containerEl: $containerEl,
22717 containerEl: $containerEl && $containerEl[0],
22718 inline: $containerEl && $containerEl.length > 0,
22719 $inputEl: $inputEl,
22720 inputEl: $inputEl && $inputEl[0],
22721 initialized: false,
22722 opened: false,
22723 url: calendar.params.url,
22724 isHorizontal: isHorizontal,
22725 inverter: inverter,
22726 view: view,
22727 animating: false,
22728 });
22729
22730 function onInputClick() {
22731 calendar.open();
22732 }
22733 function onInputFocus(e) {
22734 e.preventDefault();
22735 }
22736 function onHtmlClick(e) {
22737 var $targetEl = $(e.target);
22738 if (calendar.isPopover()) { return; }
22739 if (!calendar.opened || calendar.closing) { return; }
22740 if ($targetEl.closest('[class*="backdrop"]').length) { return; }
22741 if ($inputEl && $inputEl.length > 0) {
22742 if ($targetEl[0] !== $inputEl[0] && $targetEl.closest('.sheet-modal, .calendar-modal').length === 0) {
22743 calendar.close();
22744 }
22745 } else if ($(e.target).closest('.sheet-modal, .calendar-modal').length === 0) {
22746 calendar.close();
22747 }
22748 }
22749
22750 // Events
22751 Utils.extend(calendar, {
22752 attachInputEvents: function attachInputEvents() {
22753 calendar.$inputEl.on('click', onInputClick);
22754 if (calendar.params.inputReadOnly) {
22755 calendar.$inputEl.on('focus mousedown', onInputFocus);
22756 }
22757 },
22758 detachInputEvents: function detachInputEvents() {
22759 calendar.$inputEl.off('click', onInputClick);
22760 if (calendar.params.inputReadOnly) {
22761 calendar.$inputEl.off('focus mousedown', onInputFocus);
22762 }
22763 },
22764 attachHtmlEvents: function attachHtmlEvents() {
22765 app.on('click', onHtmlClick);
22766 },
22767 detachHtmlEvents: function detachHtmlEvents() {
22768 app.off('click', onHtmlClick);
22769 },
22770 });
22771 calendar.attachCalendarEvents = function attachCalendarEvents() {
22772 var allowItemClick = true;
22773 var isTouched;
22774 var isMoved;
22775 var touchStartX;
22776 var touchStartY;
22777 var touchCurrentX;
22778 var touchCurrentY;
22779 var touchStartTime;
22780 var touchEndTime;
22781 var currentTranslate;
22782 var wrapperWidth;
22783 var wrapperHeight;
22784 var percentage;
22785 var touchesDiff;
22786 var isScrolling;
22787
22788 var $el = calendar.$el;
22789 var $wrapperEl = calendar.$wrapperEl;
22790
22791 function handleTouchStart(e) {
22792 if (isMoved || isTouched) { return; }
22793 isTouched = true;
22794 touchStartX = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
22795 touchCurrentX = touchStartX;
22796 touchStartY = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
22797 touchCurrentY = touchStartY;
22798 touchStartTime = (new calendar.DateHandleClass()).getTime();
22799 percentage = 0;
22800 allowItemClick = true;
22801 isScrolling = undefined;
22802 currentTranslate = calendar.monthsTranslate;
22803 }
22804 function handleTouchMove(e) {
22805 if (!isTouched) { return; }
22806 var isH = calendar.isHorizontal;
22807
22808 touchCurrentX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;
22809 touchCurrentY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
22810 if (typeof isScrolling === 'undefined') {
22811 isScrolling = !!(isScrolling || Math.abs(touchCurrentY - touchStartY) > Math.abs(touchCurrentX - touchStartX));
22812 }
22813 if (isH && isScrolling) {
22814 isTouched = false;
22815 return;
22816 }
22817 e.preventDefault();
22818 if (calendar.animating) {
22819 isTouched = false;
22820 return;
22821 }
22822 allowItemClick = false;
22823 if (!isMoved) {
22824 // First move
22825 isMoved = true;
22826 wrapperWidth = $wrapperEl[0].offsetWidth;
22827 wrapperHeight = $wrapperEl[0].offsetHeight;
22828 $wrapperEl.transition(0);
22829 }
22830
22831 touchesDiff = isH ? touchCurrentX - touchStartX : touchCurrentY - touchStartY;
22832 percentage = touchesDiff / (isH ? wrapperWidth : wrapperHeight);
22833 currentTranslate = ((calendar.monthsTranslate * calendar.inverter) + percentage) * 100;
22834
22835 // Transform wrapper
22836 $wrapperEl.transform(("translate3d(" + (isH ? currentTranslate : 0) + "%, " + (isH ? 0 : currentTranslate) + "%, 0)"));
22837 }
22838 function handleTouchEnd() {
22839 if (!isTouched || !isMoved) {
22840 isTouched = false;
22841 isMoved = false;
22842 return;
22843 }
22844 isTouched = false;
22845 isMoved = false;
22846
22847 touchEndTime = new calendar.DateHandleClass().getTime();
22848 if (touchEndTime - touchStartTime < 300) {
22849 if (Math.abs(touchesDiff) < 10) {
22850 calendar.resetMonth();
22851 } else if (touchesDiff >= 10) {
22852 if (app.rtl) { calendar.nextMonth(); }
22853 else { calendar.prevMonth(); }
22854 } else if (app.rtl) { calendar.prevMonth(); }
22855 else { calendar.nextMonth(); }
22856 } else if (percentage <= -0.5) {
22857 if (app.rtl) { calendar.prevMonth(); }
22858 else { calendar.nextMonth(); }
22859 } else if (percentage >= 0.5) {
22860 if (app.rtl) { calendar.nextMonth(); }
22861 else { calendar.prevMonth(); }
22862 } else {
22863 calendar.resetMonth();
22864 }
22865
22866 // Allow click
22867 setTimeout(function () {
22868 allowItemClick = true;
22869 }, 100);
22870 }
22871
22872 function handleDayClick(e) {
22873 if (!allowItemClick) { return; }
22874 var $dayEl = $(e.target).parents('.calendar-day');
22875 if ($dayEl.length === 0 && $(e.target).hasClass('calendar-day')) {
22876 $dayEl = $(e.target);
22877 }
22878 if ($dayEl.length === 0) { return; }
22879 if ($dayEl.hasClass('calendar-day-disabled')) { return; }
22880 if (!calendar.params.rangePicker) {
22881 if ($dayEl.hasClass('calendar-day-next')) { calendar.nextMonth(); }
22882 if ($dayEl.hasClass('calendar-day-prev')) { calendar.prevMonth(); }
22883 }
22884 var dateYear = parseInt($dayEl.attr('data-year'), 10);
22885 var dateMonth = parseInt($dayEl.attr('data-month'), 10);
22886 var dateDay = parseInt($dayEl.attr('data-day'), 10);
22887 calendar.emit(
22888 'local::dayClick calendarDayClick',
22889 calendar,
22890 $dayEl[0],
22891 dateYear,
22892 dateMonth,
22893 dateDay
22894 );
22895 if (!$dayEl.hasClass('calendar-day-selected') || calendar.params.multiple || calendar.params.rangePicker) {
22896 calendar.addValue(new calendar.DateHandleClass(dateYear, dateMonth, dateDay, 0, 0, 0));
22897 }
22898 if (calendar.params.closeOnSelect) {
22899 if (
22900 (calendar.params.rangePicker && calendar.value.length === 2)
22901 || !calendar.params.rangePicker
22902 ) {
22903 calendar.close();
22904 }
22905 }
22906 }
22907
22908 function onNextMonthClick() {
22909 calendar.nextMonth();
22910 }
22911
22912 function onPrevMonthClick() {
22913 calendar.prevMonth();
22914 }
22915
22916 function onNextYearClick() {
22917 calendar.nextYear();
22918 }
22919
22920 function onPrevYearClick() {
22921 calendar.prevYear();
22922 }
22923
22924 var passiveListener = app.touchEvents.start === 'touchstart' && app.support.passiveListener ? { passive: true, capture: false } : false;
22925 // Selectors clicks
22926 $el.find('.calendar-prev-month-button').on('click', onPrevMonthClick);
22927 $el.find('.calendar-next-month-button').on('click', onNextMonthClick);
22928 $el.find('.calendar-prev-year-button').on('click', onPrevYearClick);
22929 $el.find('.calendar-next-year-button').on('click', onNextYearClick);
22930 // Day clicks
22931 $wrapperEl.on('click', handleDayClick);
22932 // Touch events
22933 {
22934 if (calendar.params.touchMove) {
22935 $wrapperEl.on(app.touchEvents.start, handleTouchStart, passiveListener);
22936 app.on('touchmove:active', handleTouchMove);
22937 app.on('touchend:passive', handleTouchEnd);
22938 }
22939 }
22940
22941 calendar.detachCalendarEvents = function detachCalendarEvents() {
22942 $el.find('.calendar-prev-month-button').off('click', onPrevMonthClick);
22943 $el.find('.calendar-next-month-button').off('click', onNextMonthClick);
22944 $el.find('.calendar-prev-year-button').off('click', onPrevYearClick);
22945 $el.find('.calendar-next-year-button').off('click', onNextYearClick);
22946 $wrapperEl.off('click', handleDayClick);
22947 {
22948 if (calendar.params.touchMove) {
22949 $wrapperEl.off(app.touchEvents.start, handleTouchStart, passiveListener);
22950 app.off('touchmove:active', handleTouchMove);
22951 app.off('touchend:passive', handleTouchEnd);
22952 }
22953 }
22954 };
22955 };
22956
22957 calendar.init();
22958
22959 return calendar;
22960 }
22961
5d51ea26
DC
22962 if ( Framework7Class ) Calendar.__proto__ = Framework7Class;
22963 Calendar.prototype = Object.create( Framework7Class && Framework7Class.prototype );
5309fbda
DC
22964 Calendar.prototype.constructor = Calendar;
22965 // eslint-disable-next-line
22966 Calendar.prototype.normalizeDate = function normalizeDate (date) {
22967 var calendar = this;
22968 var d = new calendar.DateHandleClass(date);
22969 return new calendar.DateHandleClass(d.getFullYear(), d.getMonth(), d.getDate());
22970 };
22971
22972 Calendar.prototype.normalizeValues = function normalizeValues (values) {
22973 var calendar = this;
22974 var newValues = [];
22975 if (values && Array.isArray(values)) {
22976 newValues = values.map(function (val) { return calendar.normalizeDate(val); });
22977 }
22978 return newValues;
22979 };
22980
22981 Calendar.prototype.initInput = function initInput () {
22982 var calendar = this;
22983 if (!calendar.$inputEl) { return; }
22984 if (calendar.params.inputReadOnly) { calendar.$inputEl.prop('readOnly', true); }
22985 };
22986
22987 Calendar.prototype.isPopover = function isPopover () {
22988 var calendar = this;
22989 var app = calendar.app;
22990 var modal = calendar.modal;
22991 var params = calendar.params;
22992 if (params.openIn === 'sheet') { return false; }
22993 if (modal && modal.type !== 'popover') { return false; }
22994
22995 if (!calendar.inline && calendar.inputEl) {
22996 if (params.openIn === 'popover') { return true; }
22997 if (app.device.ios) {
22998 return !!app.device.ipad;
22999 }
23000 if (app.width >= 768) {
23001 return true;
23002 }
5d51ea26
DC
23003 if (app.device.desktop && app.theme === 'aurora') {
23004 return true;
23005 }
5309fbda
DC
23006 }
23007 return false;
23008 };
23009
23010 Calendar.prototype.formatDate = function formatDate (d) {
23011 var calendar = this;
23012 var date = new calendar.DateHandleClass(d);
23013 var year = date.getFullYear();
23014 var month = date.getMonth();
23015 var month1 = month + 1;
23016 var day = date.getDate();
23017 var weekDay = date.getDay();
23018 var ref = calendar.params;
23019 var dateFormat = ref.dateFormat;
23020 var monthNames = ref.monthNames;
23021 var monthNamesShort = ref.monthNamesShort;
23022 var dayNames = ref.dayNames;
23023 var dayNamesShort = ref.dayNamesShort;
23024
23025 return dateFormat
23026 .replace(/yyyy/g, year)
23027 .replace(/yy/g, String(year).substring(2))
23028 .replace(/mm/g, month1 < 10 ? ("0" + month1) : month1)
23029 .replace(/m(\W+)/g, (month1 + "$1"))
23030 .replace(/MM/g, monthNames[month])
23031 .replace(/M(\W+)/g, ((monthNamesShort[month]) + "$1"))
23032 .replace(/dd/g, day < 10 ? ("0" + day) : day)
23033 .replace(/d(\W+)/g, (day + "$1"))
23034 .replace(/DD/g, dayNames[weekDay])
23035 .replace(/D(\W+)/g, ((dayNamesShort[weekDay]) + "$1"));
23036 };
23037
23038 Calendar.prototype.formatValue = function formatValue () {
23039 var calendar = this;
23040 var value = calendar.value;
23041 if (calendar.params.formatValue) {
23042 return calendar.params.formatValue.call(calendar, value);
23043 }
23044 return value
23045 .map(function (v) { return calendar.formatDate(v); })
23046 .join(calendar.params.rangePicker ? ' - ' : ', ');
23047 };
23048
23049 Calendar.prototype.addValue = function addValue (newValue) {
23050 var calendar = this;
23051 var ref = calendar.params;
23052 var multiple = ref.multiple;
23053 var rangePicker = ref.rangePicker;
23054 var rangePickerMinDays = ref.rangePickerMinDays;
23055 var rangePickerMaxDays = ref.rangePickerMaxDays;
23056 if (multiple) {
23057 if (!calendar.value) { calendar.value = []; }
23058 var inValuesIndex;
23059 for (var i = 0; i < calendar.value.length; i += 1) {
23060 if (new calendar.DateHandleClass(newValue).getTime() === new calendar.DateHandleClass(calendar.value[i]).getTime()) {
23061 inValuesIndex = i;
23062 }
23063 }
23064 if (typeof inValuesIndex === 'undefined') {
23065 calendar.value.push(newValue);
23066 } else {
23067 calendar.value.splice(inValuesIndex, 1);
23068 }
23069 calendar.updateValue();
23070 } else if (rangePicker) {
23071 if (!calendar.value) { calendar.value = []; }
23072 if (calendar.value.length === 2 || calendar.value.length === 0) {
23073 calendar.value = [];
23074 }
23075
23076 if ((calendar.value.length === 0
23077 || ((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); }
23078 else { calendar.value = []; }
23079
23080 calendar.value.sort(function (a, b) { return a - b; });
23081 calendar.updateValue();
23082 } else {
23083 calendar.value = [newValue];
23084 calendar.updateValue();
23085 }
23086 };
23087
23088 Calendar.prototype.setValue = function setValue (values) {
23089 var calendar = this;
5d51ea26
DC
23090 var currentValue = calendar.value;
23091 if (Array.isArray(currentValue) && Array.isArray(values) && currentValue.length === values.length) {
23092 var equal = true;
23093 currentValue.forEach(function (v, index) {
23094 if (v !== values[index]) { equal = false; }
23095 });
23096 if (equal) { return; }
23097 }
5309fbda
DC
23098 calendar.value = values;
23099 calendar.updateValue();
23100 };
23101
23102 Calendar.prototype.getValue = function getValue () {
23103 var calendar = this;
23104 return calendar.value;
23105 };
23106
23107 Calendar.prototype.updateValue = function updateValue (onlyHeader) {
23108 var calendar = this;
23109 var $el = calendar.$el;
23110 var $wrapperEl = calendar.$wrapperEl;
23111 var $inputEl = calendar.$inputEl;
23112 var value = calendar.value;
23113 var params = calendar.params;
23114 var i;
23115 if ($el && $el.length > 0) {
23116 $wrapperEl.find('.calendar-day-selected').removeClass('calendar-day-selected');
23117 var valueDate;
23118 if (params.rangePicker && value.length === 2) {
23119 for (i = new calendar.DateHandleClass(value[0]).getTime(); i <= new calendar.DateHandleClass(value[1]).getTime(); i += 24 * 60 * 60 * 1000) {
23120 valueDate = new calendar.DateHandleClass(i);
23121 $wrapperEl.find((".calendar-day[data-date=\"" + (valueDate.getFullYear()) + "-" + (valueDate.getMonth()) + "-" + (valueDate.getDate()) + "\"]")).addClass('calendar-day-selected');
23122 }
23123 } else {
23124 for (i = 0; i < calendar.value.length; i += 1) {
23125 valueDate = new calendar.DateHandleClass(value[i]);
23126 $wrapperEl.find((".calendar-day[data-date=\"" + (valueDate.getFullYear()) + "-" + (valueDate.getMonth()) + "-" + (valueDate.getDate()) + "\"]")).addClass('calendar-day-selected');
23127 }
23128 }
23129 }
23130 if (!onlyHeader) {
23131 calendar.emit('local::change calendarChange', calendar, value);
23132 }
23133
23134
23135 if (($inputEl && $inputEl.length) || params.header) {
23136 var inputValue = calendar.formatValue(value);
23137 if (params.header && $el && $el.length) {
23138 $el.find('.calendar-selected-date').text(inputValue);
23139 }
23140 if ($inputEl && $inputEl.length && !onlyHeader) {
23141 $inputEl.val(inputValue);
23142 $inputEl.trigger('change');
23143 }
23144 }
23145 };
23146
23147 Calendar.prototype.updateCurrentMonthYear = function updateCurrentMonthYear (dir) {
23148 var calendar = this;
23149 var $months = calendar.$months;
23150 var $el = calendar.$el;
23151 var params = calendar.params;
23152 if (typeof dir === 'undefined') {
23153 calendar.currentMonth = parseInt($months.eq(1).attr('data-month'), 10);
23154 calendar.currentYear = parseInt($months.eq(1).attr('data-year'), 10);
23155 } else {
23156 calendar.currentMonth = parseInt($months.eq(dir === 'next' ? ($months.length - 1) : 0).attr('data-month'), 10);
23157 calendar.currentYear = parseInt($months.eq(dir === 'next' ? ($months.length - 1) : 0).attr('data-year'), 10);
23158 }
23159 $el.find('.current-month-value').text(params.monthNames[calendar.currentMonth]);
23160 $el.find('.current-year-value').text(calendar.currentYear);
23161 };
23162
23163 Calendar.prototype.update = function update () {
23164 var calendar = this;
23165 var currentYear = calendar.currentYear;
23166 var currentMonth = calendar.currentMonth;
23167 var $wrapperEl = calendar.$wrapperEl;
23168 var currentDate = new calendar.DateHandleClass(currentYear, currentMonth);
23169 var prevMonthHtml = calendar.renderMonth(currentDate, 'prev');
23170 var currentMonthHtml = calendar.renderMonth(currentDate);
23171 var nextMonthHtml = calendar.renderMonth(currentDate, 'next');
23172
23173 $wrapperEl
23174 .transition(0)
23175 .html(("" + prevMonthHtml + currentMonthHtml + nextMonthHtml))
23176 .transform('translate3d(0,0,0)');
23177 calendar.$months = $wrapperEl.find('.calendar-month');
23178 calendar.monthsTranslate = 0;
23179 calendar.setMonthsTranslate();
23180 calendar.$months.each(function (index, monthEl) {
23181 calendar.emit(
23182 'local::monthAdd calendarMonthAdd',
23183 monthEl
23184 );
23185 });
23186 };
23187
23188 Calendar.prototype.onMonthChangeStart = function onMonthChangeStart (dir) {
23189 var calendar = this;
23190 var $months = calendar.$months;
23191 var currentYear = calendar.currentYear;
23192 var currentMonth = calendar.currentMonth;
23193 calendar.updateCurrentMonthYear(dir);
23194 $months.removeClass('calendar-month-current calendar-month-prev calendar-month-next');
23195 var currentIndex = dir === 'next' ? $months.length - 1 : 0;
23196
23197 $months.eq(currentIndex).addClass('calendar-month-current');
23198 $months.eq(dir === 'next' ? currentIndex - 1 : currentIndex + 1).addClass(dir === 'next' ? 'calendar-month-prev' : 'calendar-month-next');
23199
23200 calendar.emit(
23201 'local::monthYearChangeStart calendarMonthYearChangeStart',
23202 calendar,
23203 currentYear,
23204 currentMonth
23205 );
23206 };
23207
23208 Calendar.prototype.onMonthChangeEnd = function onMonthChangeEnd (dir, rebuildBoth) {
23209 var calendar = this;
23210 var currentYear = calendar.currentYear;
23211 var currentMonth = calendar.currentMonth;
23212 var $wrapperEl = calendar.$wrapperEl;
23213 var monthsTranslate = calendar.monthsTranslate;
23214 calendar.animating = false;
23215 var nextMonthHtml;
23216 var prevMonthHtml;
23217 var currentMonthHtml;
23218 $wrapperEl
23219 .find('.calendar-month:not(.calendar-month-prev):not(.calendar-month-current):not(.calendar-month-next)')
23220 .remove();
23221
23222 if (typeof dir === 'undefined') {
23223 dir = 'next'; // eslint-disable-line
23224 rebuildBoth = true; // eslint-disable-line
23225 }
23226 if (!rebuildBoth) {
23227 currentMonthHtml = calendar.renderMonth(new calendar.DateHandleClass(currentYear, currentMonth), dir);
23228 } else {
23229 $wrapperEl.find('.calendar-month-next, .calendar-month-prev').remove();
23230 prevMonthHtml = calendar.renderMonth(new calendar.DateHandleClass(currentYear, currentMonth), 'prev');
23231 nextMonthHtml = calendar.renderMonth(new calendar.DateHandleClass(currentYear, currentMonth), 'next');
23232 }
23233 if (dir === 'next' || rebuildBoth) {
23234 $wrapperEl.append(currentMonthHtml || nextMonthHtml);
23235 }
23236 if (dir === 'prev' || rebuildBoth) {
23237 $wrapperEl.prepend(currentMonthHtml || prevMonthHtml);
23238 }
23239 var $months = $wrapperEl.find('.calendar-month');
23240 calendar.$months = $months;
23241 calendar.setMonthsTranslate(monthsTranslate);
23242 calendar.emit(
23243 'local::monthAdd calendarMonthAdd',
23244 calendar,
23245 dir === 'next' ? $months.eq($months.length - 1)[0] : $months.eq(0)[0]
23246 );
23247 calendar.emit(
23248 'local::monthYearChangeEnd calendarMonthYearChangeEnd',
23249 calendar,
23250 currentYear,
23251 currentMonth
23252 );
23253 };
23254
23255 Calendar.prototype.setMonthsTranslate = function setMonthsTranslate (translate) {
23256 var calendar = this;
23257 var $months = calendar.$months;
23258 var isH = calendar.isHorizontal;
23259 var inverter = calendar.inverter;
23260 // eslint-disable-next-line
23261 translate = translate || calendar.monthsTranslate || 0;
23262 if (typeof calendar.monthsTranslate === 'undefined') {
23263 calendar.monthsTranslate = translate;
23264 }
23265 $months.removeClass('calendar-month-current calendar-month-prev calendar-month-next');
23266 var prevMonthTranslate = -(translate + 1) * 100 * inverter;
23267 var currentMonthTranslate = -translate * 100 * inverter;
23268 var nextMonthTranslate = -(translate - 1) * 100 * inverter;
23269 $months.eq(0)
23270 .transform(("translate3d(" + (isH ? prevMonthTranslate : 0) + "%, " + (isH ? 0 : prevMonthTranslate) + "%, 0)"))
23271 .addClass('calendar-month-prev');
23272 $months.eq(1)
23273 .transform(("translate3d(" + (isH ? currentMonthTranslate : 0) + "%, " + (isH ? 0 : currentMonthTranslate) + "%, 0)"))
23274 .addClass('calendar-month-current');
23275 $months.eq(2)
23276 .transform(("translate3d(" + (isH ? nextMonthTranslate : 0) + "%, " + (isH ? 0 : nextMonthTranslate) + "%, 0)"))
23277 .addClass('calendar-month-next');
23278 };
23279
23280 Calendar.prototype.nextMonth = function nextMonth (transition) {
23281 var calendar = this;
23282 var params = calendar.params;
23283 var $wrapperEl = calendar.$wrapperEl;
23284 var inverter = calendar.inverter;
23285 var isH = calendar.isHorizontal;
23286 if (typeof transition === 'undefined' || typeof transition === 'object') {
23287 transition = ''; // eslint-disable-line
23288 if (!params.animate) { transition = 0; } // eslint-disable-line
23289 }
23290 var nextMonth = parseInt(calendar.$months.eq(calendar.$months.length - 1).attr('data-month'), 10);
23291 var nextYear = parseInt(calendar.$months.eq(calendar.$months.length - 1).attr('data-year'), 10);
23292 var nextDate = new calendar.DateHandleClass(nextYear, nextMonth);
23293 var nextDateTime = nextDate.getTime();
23294 var transitionEndCallback = !calendar.animating;
23295 if (params.maxDate) {
23296 if (nextDateTime > new calendar.DateHandleClass(params.maxDate).getTime()) {
23297 calendar.resetMonth();
23298 return;
23299 }
23300 }
23301 calendar.monthsTranslate -= 1;
23302 if (nextMonth === calendar.currentMonth) {
23303 var nextMonthTranslate = -(calendar.monthsTranslate) * 100 * inverter;
23304 var nextMonthHtml = $(calendar.renderMonth(nextDateTime, 'next'))
23305 .transform(("translate3d(" + (isH ? nextMonthTranslate : 0) + "%, " + (isH ? 0 : nextMonthTranslate) + "%, 0)"))
23306 .addClass('calendar-month-next');
23307 $wrapperEl.append(nextMonthHtml[0]);
23308 calendar.$months = $wrapperEl.find('.calendar-month');
23309 calendar.emit(
23310 'local::monthAdd calendarMonthAdd',
23311 calendar.$months.eq(calendar.$months.length - 1)[0]
23312 );
23313 }
23314 calendar.animating = true;
23315 calendar.onMonthChangeStart('next');
23316 var translate = (calendar.monthsTranslate * 100) * inverter;
23317
23318 $wrapperEl.transition(transition).transform(("translate3d(" + (isH ? translate : 0) + "%, " + (isH ? 0 : translate) + "%, 0)"));
23319 if (transitionEndCallback) {
23320 $wrapperEl.transitionEnd(function () {
23321 calendar.onMonthChangeEnd('next');
23322 });
23323 }
23324 if (!params.animate) {
23325 calendar.onMonthChangeEnd('next');
23326 }
23327 };
23328
23329 Calendar.prototype.prevMonth = function prevMonth (transition) {
23330 var calendar = this;
23331 var params = calendar.params;
23332 var $wrapperEl = calendar.$wrapperEl;
23333 var inverter = calendar.inverter;
23334 var isH = calendar.isHorizontal;
23335 if (typeof transition === 'undefined' || typeof transition === 'object') {
23336 transition = ''; // eslint-disable-line
23337 if (!params.animate) { transition = 0; } // eslint-disable-line
23338 }
23339 var prevMonth = parseInt(calendar.$months.eq(0).attr('data-month'), 10);
23340 var prevYear = parseInt(calendar.$months.eq(0).attr('data-year'), 10);
23341 var prevDate = new calendar.DateHandleClass(prevYear, prevMonth + 1, -1);
23342 var prevDateTime = prevDate.getTime();
23343 var transitionEndCallback = !calendar.animating;
23344 if (params.minDate) {
23345 var minDate = new calendar.DateHandleClass(params.minDate);
23346 minDate = new calendar.DateHandleClass(minDate.getFullYear(), minDate.getMonth(), 1);
23347 if (prevDateTime < minDate.getTime()) {
23348 calendar.resetMonth();
23349 return;
23350 }
23351 }
23352 calendar.monthsTranslate += 1;
23353 if (prevMonth === calendar.currentMonth) {
23354 var prevMonthTranslate = -(calendar.monthsTranslate) * 100 * inverter;
23355 var prevMonthHtml = $(calendar.renderMonth(prevDateTime, 'prev'))
23356 .transform(("translate3d(" + (isH ? prevMonthTranslate : 0) + "%, " + (isH ? 0 : prevMonthTranslate) + "%, 0)"))
23357 .addClass('calendar-month-prev');
23358 $wrapperEl.prepend(prevMonthHtml[0]);
23359 calendar.$months = $wrapperEl.find('.calendar-month');
23360 calendar.emit(
23361 'local::monthAdd calendarMonthAdd',
23362 calendar.$months.eq(0)[0]
23363 );
23364 }
23365 calendar.animating = true;
23366 calendar.onMonthChangeStart('prev');
23367 var translate = (calendar.monthsTranslate * 100) * inverter;
23368 $wrapperEl
23369 .transition(transition)
23370 .transform(("translate3d(" + (isH ? translate : 0) + "%, " + (isH ? 0 : translate) + "%, 0)"));
23371 if (transitionEndCallback) {
23372 $wrapperEl.transitionEnd(function () {
23373 calendar.onMonthChangeEnd('prev');
23374 });
23375 }
23376 if (!params.animate) {
23377 calendar.onMonthChangeEnd('prev');
23378 }
23379 };
23380
23381 Calendar.prototype.resetMonth = function resetMonth (transition) {
23382 if ( transition === void 0 ) transition = '';
23383
23384 var calendar = this;
23385 var $wrapperEl = calendar.$wrapperEl;
23386 var inverter = calendar.inverter;
23387 var isH = calendar.isHorizontal;
23388 var monthsTranslate = calendar.monthsTranslate;
23389 var translate = (monthsTranslate * 100) * inverter;
23390 $wrapperEl
23391 .transition(transition)
23392 .transform(("translate3d(" + (isH ? translate : 0) + "%, " + (isH ? 0 : translate) + "%, 0)"));
23393 };
23394 // eslint-disable-next-line
23395 Calendar.prototype.setYearMonth = function setYearMonth (year, month, transition) {
23396 var calendar = this;
23397 var params = calendar.params;
23398 var isH = calendar.isHorizontal;
23399 var $wrapperEl = calendar.$wrapperEl;
23400 var inverter = calendar.inverter;
23401 // eslint-disable-next-line
23402 if (typeof year === 'undefined') { year = calendar.currentYear; }
23403 // eslint-disable-next-line
23404 if (typeof month === 'undefined') { month = calendar.currentMonth; }
23405 if (typeof transition === 'undefined' || typeof transition === 'object') {
23406 // eslint-disable-next-line
23407 transition = '';
23408 // eslint-disable-next-line
23409 if (!params.animate) { transition = 0; }
23410 }
23411 var targetDate;
23412 if (year < calendar.currentYear) {
23413 targetDate = new calendar.DateHandleClass(year, month + 1, -1).getTime();
23414 } else {
23415 targetDate = new calendar.DateHandleClass(year, month).getTime();
23416 }
23417 if (params.maxDate && targetDate > new calendar.DateHandleClass(params.maxDate).getTime()) {
23418 return false;
23419 }
23420 if (params.minDate) {
23421 var minDate = new calendar.DateHandleClass(params.minDate);
23422 minDate = new calendar.DateHandleClass(minDate.getFullYear(), minDate.getMonth(), 1);
23423 if (targetDate < minDate.getTime()) {
23424 return false;
23425 }
23426 }
23427 var currentDate = new calendar.DateHandleClass(calendar.currentYear, calendar.currentMonth).getTime();
23428 var dir = targetDate > currentDate ? 'next' : 'prev';
23429 var newMonthHTML = calendar.renderMonth(new calendar.DateHandleClass(year, month));
23430 calendar.monthsTranslate = calendar.monthsTranslate || 0;
23431 var prevTranslate = calendar.monthsTranslate;
23432 var monthTranslate;
23433 var transitionEndCallback = !calendar.animating;
23434 if (targetDate > currentDate) {
23435 // To next
23436 calendar.monthsTranslate -= 1;
23437 if (!calendar.animating) { calendar.$months.eq(calendar.$months.length - 1).remove(); }
23438 $wrapperEl.append(newMonthHTML);
23439 calendar.$months = $wrapperEl.find('.calendar-month');
23440 monthTranslate = -(prevTranslate - 1) * 100 * inverter;
23441 calendar.$months
23442 .eq(calendar.$months.length - 1)
23443 .transform(("translate3d(" + (isH ? monthTranslate : 0) + "%, " + (isH ? 0 : monthTranslate) + "%, 0)"))
23444 .addClass('calendar-month-next');
23445 } else {
23446 // To prev
23447 calendar.monthsTranslate += 1;
23448 if (!calendar.animating) { calendar.$months.eq(0).remove(); }
23449 $wrapperEl.prepend(newMonthHTML);
23450 calendar.$months = $wrapperEl.find('.calendar-month');
23451 monthTranslate = -(prevTranslate + 1) * 100 * inverter;
23452 calendar.$months
23453 .eq(0)
23454 .transform(("translate3d(" + (isH ? monthTranslate : 0) + "%, " + (isH ? 0 : monthTranslate) + "%, 0)"))
23455 .addClass('calendar-month-prev');
23456 }
23457 calendar.emit(
23458 'local::monthAdd calendarMonthAdd',
23459 dir === 'next'
23460 ? calendar.$months.eq(calendar.$months.length - 1)[0]
23461 : calendar.$months.eq(0)[0]
23462 );
23463
23464 calendar.animating = true;
23465 calendar.onMonthChangeStart(dir);
23466 var wrapperTranslate = (calendar.monthsTranslate * 100) * inverter;
23467 $wrapperEl
23468 .transition(transition)
23469 .transform(("translate3d(" + (isH ? wrapperTranslate : 0) + "%, " + (isH ? 0 : wrapperTranslate) + "%, 0)"));
23470 if (transitionEndCallback) {
23471 $wrapperEl.transitionEnd(function () {
23472 calendar.onMonthChangeEnd(dir, true);
23473 });
23474 }
23475 if (!params.animate) {
23476 calendar.onMonthChangeEnd(dir);
23477 }
23478 };
23479
23480 Calendar.prototype.nextYear = function nextYear () {
23481 var calendar = this;
23482 calendar.setYearMonth(calendar.currentYear + 1);
23483 };
23484
23485 Calendar.prototype.prevYear = function prevYear () {
23486 var calendar = this;
23487 calendar.setYearMonth(calendar.currentYear - 1);
23488 };
23489 // eslint-disable-next-line
23490 Calendar.prototype.dateInRange = function dateInRange (dayDate, range) {
23491 var calendar = this;
23492 var match = false;
23493 var i;
23494 if (!range) { return false; }
23495 if (Array.isArray(range)) {
23496 for (i = 0; i < range.length; i += 1) {
23497 if (range[i].from || range[i].to) {
23498 if (range[i].from && range[i].to) {
23499 if ((dayDate <= new calendar.DateHandleClass(range[i].to).getTime()) && (dayDate >= new calendar.DateHandleClass(range[i].from).getTime())) {
23500 match = true;
23501 }
23502 } else if (range[i].from) {
23503 if (dayDate >= new calendar.DateHandleClass(range[i].from).getTime()) {
23504 match = true;
23505 }
23506 } else if (range[i].to) {
23507 if (dayDate <= new calendar.DateHandleClass(range[i].to).getTime()) {
23508 match = true;
23509 }
23510 }
23511 } else if (range[i].date) {
23512 if (dayDate === new calendar.DateHandleClass(range[i].date).getTime()) {
23513 match = true;
23514 }
23515 } else if (dayDate === new calendar.DateHandleClass(range[i]).getTime()) {
23516 match = true;
23517 }
23518 }
23519 } else if (range.from || range.to) {
23520 if (range.from && range.to) {
23521 if ((dayDate <= new calendar.DateHandleClass(range.to).getTime()) && (dayDate >= new calendar.DateHandleClass(range.from).getTime())) {
23522 match = true;
23523 }
23524 } else if (range.from) {
23525 if (dayDate >= new calendar.DateHandleClass(range.from).getTime()) {
23526 match = true;
23527 }
23528 } else if (range.to) {
23529 if (dayDate <= new calendar.DateHandleClass(range.to).getTime()) {
23530 match = true;
23531 }
23532 }
23533 } else if (range.date) {
23534 match = dayDate === new calendar.DateHandleClass(range.date).getTime();
23535 } else if (typeof range === 'function') {
23536 match = range(new calendar.DateHandleClass(dayDate));
23537 }
23538 return match;
23539 };
23540 // eslint-disable-next-line
23541 Calendar.prototype.daysInMonth = function daysInMonth (date) {
23542 var calendar = this;
23543 var d = new calendar.DateHandleClass(date);
23544 return new calendar.DateHandleClass(d.getFullYear(), d.getMonth() + 1, 0).getDate();
23545 };
23546
23547 Calendar.prototype.renderMonths = function renderMonths (date) {
23548 var calendar = this;
23549 if (calendar.params.renderMonths) {
23550 return calendar.params.renderMonths.call(calendar, date);
23551 }
23552 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();
23553 };
23554
23555 Calendar.prototype.renderMonth = function renderMonth (d, offset) {
23556 var calendar = this;
23557 var params = calendar.params;
23558 var value = calendar.value;
23559 if (params.renderMonth) {
23560 return params.renderMonth.call(calendar, d, offset);
23561 }
23562 var date = new calendar.DateHandleClass(d);
23563 var year = date.getFullYear();
23564 var month = date.getMonth();
23565
23566 if (offset === 'next') {
23567 if (month === 11) { date = new calendar.DateHandleClass(year + 1, 0); }
23568 else { date = new calendar.DateHandleClass(year, month + 1, 1); }
23569 }
23570 if (offset === 'prev') {
23571 if (month === 0) { date = new calendar.DateHandleClass(year - 1, 11); }
23572 else { date = new calendar.DateHandleClass(year, month - 1, 1); }
23573 }
23574 if (offset === 'next' || offset === 'prev') {
23575 month = date.getMonth();
23576 year = date.getFullYear();
23577 }
23578
23579 var currentValues = [];
23580 var today = new calendar.DateHandleClass().setHours(0, 0, 0, 0);
23581 var minDate = params.minDate ? new calendar.DateHandleClass(params.minDate).getTime() : null;
23582 var maxDate = params.maxDate ? new calendar.DateHandleClass(params.maxDate).getTime() : null;
23583 var rows = 6;
23584 var cols = 7;
23585 var daysInPrevMonth = calendar.daysInMonth(new calendar.DateHandleClass(date.getFullYear(), date.getMonth()).getTime() - (10 * 24 * 60 * 60 * 1000));
23586 var daysInMonth = calendar.daysInMonth(date);
23587 var minDayNumber = params.firstDay === 6 ? 0 : 1;
23588
23589 var monthHtml = '';
23590 var dayIndex = 0 + (params.firstDay - 1);
23591 var disabled;
23592 var hasEvents;
23593 var firstDayOfMonthIndex = new calendar.DateHandleClass(date.getFullYear(), date.getMonth()).getDay();
23594 if (firstDayOfMonthIndex === 0) { firstDayOfMonthIndex = 7; }
23595
23596 if (value && value.length) {
23597 for (var i = 0; i < value.length; i += 1) {
23598 currentValues.push(new calendar.DateHandleClass(value[i]).setHours(0, 0, 0, 0));
23599 }
23600 }
23601
23602 for (var row = 1; row <= rows; row += 1) {
23603 var rowHtml = '';
23604 var loop = function ( col ) {
23605 dayIndex += 1;
23606 var dayDate = (void 0);
23607 var dayNumber = dayIndex - firstDayOfMonthIndex;
23608 var addClass = '';
23609 if (row === 1 && col === 1 && dayNumber > minDayNumber && params.firstDay !== 1) {
23610 dayIndex -= 7;
23611 dayNumber = dayIndex - firstDayOfMonthIndex;
23612 }
23613
23614 var weekDayIndex = ((col - 1) + params.firstDay > 6)
23615 ? ((col - 1 - 7) + params.firstDay)
23616 : ((col - 1) + params.firstDay);
23617
23618 if (dayNumber < 0) {
23619 dayNumber = daysInPrevMonth + dayNumber + 1;
23620 addClass += ' calendar-day-prev';
23621 dayDate = new calendar.DateHandleClass(month - 1 < 0 ? year - 1 : year, month - 1 < 0 ? 11 : month - 1, dayNumber).getTime();
23622 } else {
23623 dayNumber += 1;
23624 if (dayNumber > daysInMonth) {
23625 dayNumber -= daysInMonth;
23626 addClass += ' calendar-day-next';
23627 dayDate = new calendar.DateHandleClass(month + 1 > 11 ? year + 1 : year, month + 1 > 11 ? 0 : month + 1, dayNumber).getTime();
23628 } else {
23629 dayDate = new calendar.DateHandleClass(year, month, dayNumber).getTime();
23630 }
23631 }
23632 // Today
23633 if (dayDate === today) { addClass += ' calendar-day-today'; }
23634
23635 // Selected
23636 if (params.rangePicker && currentValues.length === 2) {
23637 if (dayDate >= currentValues[0] && dayDate <= currentValues[1]) { addClass += ' calendar-day-selected'; }
23638 } else if (currentValues.indexOf(dayDate) >= 0) { addClass += ' calendar-day-selected'; }
23639 // Weekend
23640 if (params.weekendDays.indexOf(weekDayIndex) >= 0) {
23641 addClass += ' calendar-day-weekend';
23642 }
23643 // Events
23644 var eventsHtml = '';
23645 hasEvents = false;
23646 if (params.events) {
23647 if (calendar.dateInRange(dayDate, params.events)) {
23648 hasEvents = true;
23649 }
23650 }
23651 if (hasEvents) {
23652 addClass += ' calendar-day-has-events';
23653 eventsHtml = "\n <span class=\"calendar-day-events\">\n <span class=\"calendar-day-event\"></span>\n </span>\n ";
23654 if (Array.isArray(params.events)) {
23655 var eventDots = [];
23656 params.events.forEach(function (ev) {
23657 var color = ev.color || '';
23658 if (eventDots.indexOf(color) < 0 && calendar.dateInRange(dayDate, ev)) {
23659 eventDots.push(color);
23660 }
23661 });
23662 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 ";
23663 }
23664 }
23665 // Custom Ranges
23666 if (params.rangesClasses) {
23667 for (var k = 0; k < params.rangesClasses.length; k += 1) {
23668 if (calendar.dateInRange(dayDate, params.rangesClasses[k].range)) {
23669 addClass += " " + (params.rangesClasses[k].cssClass);
23670 }
23671 }
23672 }
23673 // Disabled
23674 disabled = false;
23675 if ((minDate && dayDate < minDate) || (maxDate && dayDate > maxDate)) {
23676 disabled = true;
23677 }
23678 if (params.disabled) {
23679 if (calendar.dateInRange(dayDate, params.disabled)) {
23680 disabled = true;
23681 }
23682 }
23683 if (disabled) {
23684 addClass += ' calendar-day-disabled';
23685 }
23686
23687 dayDate = new calendar.DateHandleClass(dayDate);
23688 var dayYear = dayDate.getFullYear();
23689 var dayMonth = dayDate.getMonth();
23690 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();
23691 };
23692
23693 for (var col = 1; col <= cols; col += 1) loop( col );
23694 monthHtml += "<div class=\"calendar-row\">" + rowHtml + "</div>";
23695 }
23696 monthHtml = "<div class=\"calendar-month\" data-year=\"" + year + "\" data-month=\"" + month + "\">" + monthHtml + "</div>";
23697 return monthHtml;
23698 };
23699
23700 Calendar.prototype.renderWeekHeader = function renderWeekHeader () {
23701 var calendar = this;
23702 if (calendar.params.renderWeekHeader) {
23703 return calendar.params.renderWeekHeader.call(calendar);
23704 }
23705 var params = calendar.params;
23706 var weekDaysHtml = '';
23707 for (var i = 0; i < 7; i += 1) {
23708 var dayIndex = (i + params.firstDay > 6)
23709 ? ((i - 7) + params.firstDay)
23710 : (i + params.firstDay);
23711 var dayName = params.dayNamesShort[dayIndex];
23712 weekDaysHtml += "<div class=\"calendar-week-day\">" + dayName + "</div>";
23713 }
23714 return ("\n <div class=\"calendar-week-header\">\n " + weekDaysHtml + "\n </div>\n ").trim();
23715 };
23716
23717 Calendar.prototype.renderMonthSelector = function renderMonthSelector () {
23718 var calendar = this;
23719 if (calendar.params.renderMonthSelector) {
23720 return calendar.params.renderMonthSelector.call(calendar);
23721 }
23722
5d51ea26 23723 return "\n <div class=\"calendar-month-selector\">\n <a 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 class=\"link icon-only calendar-next-month-button\">\n <i class=\"icon icon-next\"></i>\n </a>\n </div>\n ".trim();
5309fbda
DC
23724 };
23725
23726 Calendar.prototype.renderYearSelector = function renderYearSelector () {
23727 var calendar = this;
23728 if (calendar.params.renderYearSelector) {
23729 return calendar.params.renderYearSelector.call(calendar);
23730 }
5d51ea26 23731 return "\n <div class=\"calendar-year-selector\">\n <a 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 class=\"link icon-only calendar-next-year-button\">\n <i class=\"icon icon-next\"></i>\n </a>\n </div>\n ".trim();
5309fbda
DC
23732 };
23733
23734 Calendar.prototype.renderHeader = function renderHeader () {
23735 var calendar = this;
23736 if (calendar.params.renderHeader) {
23737 return calendar.params.renderHeader.call(calendar);
23738 }
23739 return ("\n <div class=\"calendar-header\">\n <div class=\"calendar-selected-date\">" + (calendar.params.headerPlaceholder) + "</div>\n </div>\n ").trim();
23740 };
23741
23742 Calendar.prototype.renderFooter = function renderFooter () {
23743 var calendar = this;
23744 var app = calendar.app;
23745 if (calendar.params.renderFooter) {
23746 return calendar.params.renderFooter.call(calendar);
23747 }
5d51ea26 23748 return ("\n <div class=\"calendar-footer\">\n <a class=\"" + (app.theme === 'md' ? 'button' : 'link') + " calendar-close sheet-close popover-close\">" + (calendar.params.toolbarCloseText) + "</a>\n </div>\n ").trim();
5309fbda
DC
23749 };
23750
23751 Calendar.prototype.renderToolbar = function renderToolbar () {
23752 var calendar = this;
23753 if (calendar.params.renderToolbar) {
23754 return calendar.params.renderToolbar.call(calendar, calendar);
23755 }
5d51ea26 23756 return ("\n <div class=\"toolbar toolbar-top no-shadow\">\n <div class=\"toolbar-inner\">\n " + (calendar.params.monthSelector ? calendar.renderMonthSelector() : '') + "\n " + (calendar.params.yearSelector ? calendar.renderYearSelector() : '') + "\n </div>\n </div>\n ").trim();
5309fbda
DC
23757 };
23758 // eslint-disable-next-line
23759 Calendar.prototype.renderInline = function renderInline () {
23760 var calendar = this;
23761 var ref = calendar.params;
23762 var cssClass = ref.cssClass;
23763 var toolbar = ref.toolbar;
23764 var header = ref.header;
23765 var footer = ref.footer;
23766 var rangePicker = ref.rangePicker;
23767 var weekHeader = ref.weekHeader;
23768 var value = calendar.value;
23769 var date = value && value.length ? value[0] : new calendar.DateHandleClass().setHours(0, 0, 0);
23770 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();
23771
23772 return inlineHtml;
23773 };
23774
23775 Calendar.prototype.renderCustomModal = function renderCustomModal () {
23776 var calendar = this;
23777 var ref = calendar.params;
23778 var cssClass = ref.cssClass;
23779 var toolbar = ref.toolbar;
23780 var header = ref.header;
23781 var footer = ref.footer;
23782 var rangePicker = ref.rangePicker;
23783 var weekHeader = ref.weekHeader;
23784 var value = calendar.value;
23785 var date = value && value.length ? value[0] : new calendar.DateHandleClass().setHours(0, 0, 0);
23786 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();
23787
23788 return sheetHtml;
23789 };
23790
23791 Calendar.prototype.renderSheet = function renderSheet () {
23792 var calendar = this;
23793 var ref = calendar.params;
23794 var cssClass = ref.cssClass;
23795 var toolbar = ref.toolbar;
23796 var header = ref.header;
23797 var footer = ref.footer;
23798 var rangePicker = ref.rangePicker;
23799 var weekHeader = ref.weekHeader;
23800 var value = calendar.value;
23801 var date = value && value.length ? value[0] : new calendar.DateHandleClass().setHours(0, 0, 0);
23802 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();
23803
23804 return sheetHtml;
23805 };
23806
23807 Calendar.prototype.renderPopover = function renderPopover () {
23808 var calendar = this;
23809 var ref = calendar.params;
23810 var cssClass = ref.cssClass;
23811 var toolbar = ref.toolbar;
23812 var header = ref.header;
23813 var footer = ref.footer;
23814 var rangePicker = ref.rangePicker;
23815 var weekHeader = ref.weekHeader;
23816 var value = calendar.value;
23817 var date = value && value.length ? value[0] : new calendar.DateHandleClass().setHours(0, 0, 0);
23818 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();
23819
23820 return popoverHtml;
23821 };
23822
23823 Calendar.prototype.render = function render () {
23824 var calendar = this;
23825 var params = calendar.params;
23826 if (params.render) { return params.render.call(calendar); }
23827 if (!calendar.inline) {
23828 var modalType = params.openIn;
23829 if (modalType === 'auto') { modalType = calendar.isPopover() ? 'popover' : 'sheet'; }
23830
23831 if (modalType === 'popover') { return calendar.renderPopover(); }
23832 if (modalType === 'sheet') { return calendar.renderSheet(); }
23833 return calendar.renderCustomModal();
23834 }
23835 return calendar.renderInline();
23836 };
23837
23838 Calendar.prototype.onOpen = function onOpen () {
23839 var calendar = this;
23840 var initialized = calendar.initialized;
23841 var $el = calendar.$el;
23842 var app = calendar.app;
23843 var $inputEl = calendar.$inputEl;
23844 var inline = calendar.inline;
23845 var value = calendar.value;
23846 var params = calendar.params;
23847 calendar.closing = false;
23848 calendar.opened = true;
23849 calendar.opening = true;
23850
23851 // Init main events
23852 calendar.attachCalendarEvents();
23853
23854 var updateValue = !value && params.value;
23855
23856 // Set value
23857 if (!initialized) {
23858 if (value) { calendar.setValue(value, 0); }
23859 else if (params.value) {
23860 calendar.setValue(calendar.normalizeValues(params.value), 0);
23861 }
23862 } else if (value) {
23863 calendar.setValue(value, 0);
23864 }
23865
23866 // Update current month and year
23867 calendar.updateCurrentMonthYear();
23868
23869 // Set initial translate
23870 calendar.monthsTranslate = 0;
23871 calendar.setMonthsTranslate();
23872
23873 // Update input value
23874 if (updateValue) { calendar.updateValue(); }
23875 else if (params.header && value) {
23876 calendar.updateValue(true);
23877 }
23878
23879 // Extra focus
23880 if (!inline && $inputEl && $inputEl.length && app.theme === 'md') {
23881 $inputEl.trigger('focus');
23882 }
23883
23884 calendar.initialized = true;
23885
23886 calendar.$months.each(function (index, monthEl) {
23887 calendar.emit('local::monthAdd calendarMonthAdd', monthEl);
23888 });
23889
23890 // Trigger events
23891 if ($el) {
23892 $el.trigger('calendar:open', calendar);
23893 }
23894 if ($inputEl) {
23895 $inputEl.trigger('calendar:open', calendar);
23896 }
23897 calendar.emit('local::open calendarOpen', calendar);
23898 };
23899
23900 Calendar.prototype.onOpened = function onOpened () {
23901 var calendar = this;
23902 calendar.opening = false;
23903 if (calendar.$el) {
23904 calendar.$el.trigger('calendar:opened', calendar);
23905 }
23906 if (calendar.$inputEl) {
23907 calendar.$inputEl.trigger('calendar:opened', calendar);
23908 }
23909 calendar.emit('local::opened calendarOpened', calendar);
23910 };
23911
23912 Calendar.prototype.onClose = function onClose () {
23913 var calendar = this;
23914 var app = calendar.app;
23915 calendar.opening = false;
23916 calendar.closing = true;
23917
23918 if (calendar.$inputEl && app.theme === 'md') {
23919 calendar.$inputEl.trigger('blur');
23920 }
23921 if (calendar.detachCalendarEvents) {
23922 calendar.detachCalendarEvents();
23923 }
23924
23925 if (calendar.$el) {
23926 calendar.$el.trigger('calendar:close', calendar);
23927 }
23928 if (calendar.$inputEl) {
23929 calendar.$inputEl.trigger('calendar:close', calendar);
23930 }
23931 calendar.emit('local::close calendarClose', calendar);
23932 };
23933
23934 Calendar.prototype.onClosed = function onClosed () {
23935 var calendar = this;
23936 calendar.opened = false;
23937 calendar.closing = false;
23938
23939 if (!calendar.inline) {
23940 Utils.nextTick(function () {
23941 if (calendar.modal && calendar.modal.el && calendar.modal.destroy) {
23942 if (!calendar.params.routableModals) {
23943 calendar.modal.destroy();
23944 }
23945 }
23946 delete calendar.modal;
23947 });
23948 }
23949 if (calendar.$el) {
23950 calendar.$el.trigger('calendar:closed', calendar);
23951 }
23952 if (calendar.$inputEl) {
23953 calendar.$inputEl.trigger('calendar:closed', calendar);
23954 }
23955 calendar.emit('local::closed calendarClosed', calendar);
23956 };
23957
23958 Calendar.prototype.open = function open () {
23959 var obj;
23960
23961 var calendar = this;
23962 var app = calendar.app;
23963 var opened = calendar.opened;
23964 var inline = calendar.inline;
23965 var $inputEl = calendar.$inputEl;
23966 var params = calendar.params;
23967 if (opened) { return; }
23968
23969 if (inline) {
23970 calendar.$el = $(calendar.render());
23971 calendar.$el[0].f7Calendar = calendar;
23972 calendar.$wrapperEl = calendar.$el.find('.calendar-months-wrapper');
23973 calendar.$months = calendar.$wrapperEl.find('.calendar-month');
23974 calendar.$containerEl.append(calendar.$el);
23975 calendar.onOpen();
23976 calendar.onOpened();
23977 return;
23978 }
23979 var modalType = params.openIn;
23980 if (modalType === 'auto') {
23981 modalType = calendar.isPopover() ? 'popover' : 'sheet';
23982 }
23983 var modalContent = calendar.render();
23984
23985 var modalParams = {
23986 targetEl: $inputEl,
23987 scrollToEl: calendar.params.scrollToInput ? $inputEl : undefined,
23988 content: modalContent,
23989 backdrop: calendar.params.backdrop === true || (modalType === 'popover' && app.params.popover.backdrop !== false && calendar.params.backdrop !== false),
23990 closeByBackdropClick: calendar.params.closeByBackdropClick,
23991 on: {
23992 open: function open() {
23993 var modal = this;
23994 calendar.modal = modal;
23995 calendar.$el = modalType === 'popover' ? modal.$el.find('.calendar') : modal.$el;
23996 calendar.$wrapperEl = calendar.$el.find('.calendar-months-wrapper');
23997 calendar.$months = calendar.$wrapperEl.find('.calendar-month');
23998 calendar.$el[0].f7Calendar = calendar;
23999 if (modalType === 'customModal') {
24000 $(calendar.$el).find('.calendar-close').once('click', function () {
24001 calendar.close();
24002 });
24003 }
24004 calendar.onOpen();
24005 },
24006 opened: function opened() { calendar.onOpened(); },
24007 close: function close() { calendar.onClose(); },
24008 closed: function closed() { calendar.onClosed(); },
24009 },
24010 };
24011 if (calendar.params.routableModals) {
24012 calendar.view.router.navigate({
24013 url: calendar.url,
24014 route: ( obj = {
24015 path: calendar.url
24016 }, obj[modalType] = modalParams, obj ),
24017 });
24018 } else {
24019 calendar.modal = app[modalType].create(modalParams);
24020 calendar.modal.open();
24021 }
24022 };
24023
24024 Calendar.prototype.close = function close () {
24025 var calendar = this;
24026 var opened = calendar.opened;
24027 var inline = calendar.inline;
24028 if (!opened) { return; }
24029 if (inline) {
24030 calendar.onClose();
24031 calendar.onClosed();
24032 return;
24033 }
24034 if (calendar.params.routableModals) {
24035 calendar.view.router.back();
24036 } else {
24037 calendar.modal.close();
24038 }
24039 };
24040
24041 Calendar.prototype.init = function init () {
24042 var calendar = this;
24043
24044 calendar.initInput();
24045
24046 if (calendar.inline) {
24047 calendar.open();
24048 calendar.emit('local::init calendarInit', calendar);
24049 return;
24050 }
24051
24052 if (!calendar.initialized && calendar.params.value) {
24053 calendar.setValue(calendar.normalizeValues(calendar.params.value));
24054 }
24055
24056 // Attach input Events
24057 if (calendar.$inputEl) {
24058 calendar.attachInputEvents();
24059 }
24060 if (calendar.params.closeByOutsideClick) {
24061 calendar.attachHtmlEvents();
24062 }
24063 calendar.emit('local::init calendarInit', calendar);
24064 };
24065
24066 Calendar.prototype.destroy = function destroy () {
24067 var calendar = this;
24068 if (calendar.destroyed) { return; }
24069 var $el = calendar.$el;
24070 calendar.emit('local::beforeDestroy calendarBeforeDestroy', calendar);
24071 if ($el) { $el.trigger('calendar:beforedestroy', calendar); }
24072
24073 calendar.close();
24074
24075 // Detach Events
24076 if (calendar.$inputEl) {
24077 calendar.detachInputEvents();
24078 }
24079 if (calendar.params.closeByOutsideClick) {
24080 calendar.detachHtmlEvents();
24081 }
24082
24083 if ($el && $el.length) { delete calendar.$el[0].f7Calendar; }
24084 Utils.deleteProps(calendar);
24085 calendar.destroyed = true;
24086 };
24087
24088 return Calendar;
24089 }(Framework7Class));
24090
24091 var Calendar$1 = {
24092 name: 'calendar',
24093 static: {
24094 Calendar: Calendar,
24095 },
24096 create: function create() {
24097 var app = this;
24098 app.calendar = ConstructorMethods({
24099 defaultSelector: '.calendar',
24100 constructor: Calendar,
24101 app: app,
24102 domProp: 'f7Calendar',
24103 });
24104 app.calendar.close = function close(el) {
24105 if ( el === void 0 ) el = '.calendar';
24106
24107 var $el = $(el);
24108 if ($el.length === 0) { return; }
24109 var calendar = $el[0].f7Calendar;
24110 if (!calendar || (calendar && !calendar.opened)) { return; }
24111 calendar.close();
24112 };
24113 },
24114 params: {
24115 calendar: {
24116 // Calendar settings
24117 calendarType: 'gregorian', // or 'jalali'
24118 monthNames: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
24119 monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
24120 dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
24121 dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
24122 firstDay: 1, // First day of the week, Monday
24123 weekendDays: [0, 6], // Sunday and Saturday
24124 jalali: {
24125 monthNames: ['فروردین', 'اردیبهشت', 'خرداد', 'تیر', 'مرداد', 'شهریور', 'مهر', 'آبان', 'آذر', 'دی', 'بهمن', 'اسفند'],
24126 monthNamesShort: ['فَر', 'اُر', 'خُر', 'تیر', 'مُر', 'شَه', 'مهر', 'آب', 'آذر', 'دی', 'بَه', 'اِس'],
24127 dayNames: ['یک‌شنبه', 'دوشنبه', 'سه‌شنبه', 'چهارشنبه', 'پنج‌شنبه', 'جمعه', 'شنبه'],
24128 dayNamesShort: ['1ش', '۲ش', '۳ش', '۴ش', '۵ش', 'ج', 'ش'],
24129 firstDay: 6, // Saturday
24130 weekendDays: [5], // Friday
24131 },
24132 multiple: false,
24133 rangePicker: false,
24134 rangePickerMinDays: 1, // when calendar is used as rangePicker
24135 rangePickerMaxDays: 0, // when calendar is used as rangePicker, 0 means unlimited
24136 dateFormat: 'yyyy-mm-dd',
24137 direction: 'horizontal', // or 'vertical'
24138 minDate: null,
24139 maxDate: null,
24140 disabled: null, // dates range of disabled days
24141 events: null, // dates range of days with events
24142 rangesClasses: null, // array with custom classes date ranges
24143 touchMove: true,
24144 animate: true,
24145 closeOnSelect: false,
24146 monthSelector: true,
24147 yearSelector: true,
24148 weekHeader: true,
24149 value: null,
24150 // Common opener settings
24151 containerEl: null,
24152 openIn: 'auto', // or 'popover' or 'sheet' or 'customModal'
24153 formatValue: null,
24154 inputEl: null,
24155 inputReadOnly: true,
24156 closeByOutsideClick: true,
24157 scrollToInput: true,
24158 header: false,
24159 headerPlaceholder: 'Select date',
24160 footer: false,
24161 toolbar: true,
24162 toolbarCloseText: 'Done',
24163 cssClass: null,
24164 routableModals: true,
24165 view: null,
24166 url: 'date/',
24167 backdrop: null,
24168 closeByBackdropClick: true,
24169 // Render functions
24170 renderWeekHeader: null,
24171 renderMonths: null,
24172 renderMonth: null,
24173 renderMonthSelector: null,
24174 renderYearSelector: null,
24175 renderHeader: null,
24176 renderFooter: null,
24177 renderToolbar: null,
24178 renderInline: null,
24179 renderPopover: null,
24180 renderSheet: null,
24181 render: null,
24182 },
24183 },
24184 };
24185
24186 function pickerColumn (colEl, updateItems) {
24187 var picker = this;
24188 var app = picker.app;
24189 var $colEl = $(colEl);
24190 var colIndex = $colEl.index();
24191 var col = picker.cols[colIndex];
24192 if (col.divider) { return; }
24193
24194 col.$el = $colEl;
24195 col.el = $colEl[0];
24196 col.$itemsEl = col.$el.find('.picker-items');
24197 col.items = col.$itemsEl.find('.picker-item');
24198
24199 var itemHeight;
24200 var itemsHeight;
24201 var minTranslate;
24202 var maxTranslate;
24203 var animationFrameId;
24204
24205 function updateDuringScroll() {
24206 animationFrameId = Utils.requestAnimationFrame(function () {
24207 col.updateItems(undefined, undefined, 0);
24208 updateDuringScroll();
24209 });
24210 }
24211
24212 col.replaceValues = function replaceColValues(values, displayValues) {
24213 col.detachEvents();
24214 col.values = values;
24215 col.displayValues = displayValues;
24216 col.$itemsEl.html(picker.renderColumn(col, true));
24217 col.items = col.$itemsEl.find('.picker-item');
24218 col.calcSize();
24219 col.setValue(col.values[0], 0, true);
24220 col.attachEvents();
24221 };
24222 col.calcSize = function calcColSize() {
24223 if (picker.params.rotateEffect) {
24224 col.$el.removeClass('picker-column-absolute');
24225 if (!col.width) { col.$el.css({ width: '' }); }
24226 }
24227 var colWidth = 0;
24228 var colHeight = col.$el[0].offsetHeight;
24229 itemHeight = col.items[0].offsetHeight;
24230 itemsHeight = itemHeight * col.items.length;
24231 minTranslate = ((colHeight / 2) - itemsHeight) + (itemHeight / 2);
24232 maxTranslate = (colHeight / 2) - (itemHeight / 2);
24233 if (col.width) {
24234 colWidth = col.width;
24235 if (parseInt(colWidth, 10) === colWidth) { colWidth += 'px'; }
24236 col.$el.css({ width: colWidth });
24237 }
24238 if (picker.params.rotateEffect) {
24239 if (!col.width) {
24240 col.items.each(function (index, itemEl) {
24241 var item = $(itemEl).children('span');
24242 colWidth = Math.max(colWidth, item[0].offsetWidth);
24243 });
24244 col.$el.css({ width: ((colWidth + 2) + "px") });
24245 }
24246 col.$el.addClass('picker-column-absolute');
24247 }
24248 };
24249
24250 col.setValue = function setColValue(newValue, transition, valueCallbacks) {
24251 if ( transition === void 0 ) transition = '';
24252
24253 var newActiveIndex = col.$itemsEl.find((".picker-item[data-picker-value=\"" + newValue + "\"]")).index();
24254 if (typeof newActiveIndex === 'undefined' || newActiveIndex === -1) {
24255 return;
24256 }
24257 var newTranslate = (-newActiveIndex * itemHeight) + maxTranslate;
24258 // Update wrapper
24259 col.$itemsEl.transition(transition);
24260 col.$itemsEl.transform(("translate3d(0," + newTranslate + "px,0)"));
24261
24262 // Watch items
24263 if (picker.params.updateValuesOnMomentum && col.activeIndex && col.activeIndex !== newActiveIndex) {
24264 Utils.cancelAnimationFrame(animationFrameId);
24265 col.$itemsEl.transitionEnd(function () {
24266 Utils.cancelAnimationFrame(animationFrameId);
24267 });
24268 updateDuringScroll();
24269 }
24270
24271 // Update items
24272 col.updateItems(newActiveIndex, newTranslate, transition, valueCallbacks);
24273 };
24274
24275 col.updateItems = function updateColItems(activeIndex, translate, transition, valueCallbacks) {
24276 if (typeof translate === 'undefined') {
24277 // eslint-disable-next-line
24278 translate = Utils.getTranslate(col.$itemsEl[0], 'y');
24279 }
24280 // eslint-disable-next-line
24281 if (typeof activeIndex === 'undefined') { activeIndex = -Math.round((translate - maxTranslate) / itemHeight); }
24282 // eslint-disable-next-line
24283 if (activeIndex < 0) { activeIndex = 0; }
24284 // eslint-disable-next-line
24285 if (activeIndex >= col.items.length) { activeIndex = col.items.length - 1; }
24286 var previousActiveIndex = col.activeIndex;
24287 col.activeIndex = activeIndex;
24288 col.$itemsEl.find('.picker-item-selected').removeClass('picker-item-selected');
24289
24290 col.items.transition(transition);
24291
24292 var selectedItem = col.items.eq(activeIndex).addClass('picker-item-selected').transform('');
24293
24294 // Set 3D rotate effect
24295 if (picker.params.rotateEffect) {
24296 col.items.each(function (index, itemEl) {
24297 var $itemEl = $(itemEl);
24298 var itemOffsetTop = $itemEl.index() * itemHeight;
24299 var translateOffset = maxTranslate - translate;
24300 var itemOffset = itemOffsetTop - translateOffset;
24301 var percentage = itemOffset / itemHeight;
24302 var itemsFit = Math.ceil(col.height / itemHeight / 2) + 1;
24303
24304 var angle = (-18 * percentage);
24305 if (angle > 180) { angle = 180; }
24306 if (angle < -180) { angle = -180; }
24307 if (Math.abs(percentage) > itemsFit) {
24308 $itemEl.addClass('picker-item-far');
24309 } else {
24310 $itemEl.removeClass('picker-item-far');
24311 }
24312 $itemEl.transform(("translate3d(0, " + (-translate + maxTranslate) + "px, " + (picker.needsOriginFix ? -110 : 0) + "px) rotateX(" + angle + "deg)"));
24313 });
24314 }
24315
24316 if (valueCallbacks || typeof valueCallbacks === 'undefined') {
24317 // Update values
24318 col.value = selectedItem.attr('data-picker-value');
24319 col.displayValue = col.displayValues ? col.displayValues[activeIndex] : col.value;
24320 // On change callback
24321 if (previousActiveIndex !== activeIndex) {
24322 if (col.onChange) {
24323 col.onChange(picker, col.value, col.displayValue);
24324 }
24325 picker.updateValue();
24326 }
24327 }
24328 };
24329
24330 var allowItemClick = true;
24331 var isTouched;
24332 var isMoved;
24333 var touchStartY;
24334 var touchCurrentY;
24335 var touchStartTime;
24336 var touchEndTime;
24337 var startTranslate;
24338 var returnTo;
24339 var currentTranslate;
24340 var prevTranslate;
24341 var velocityTranslate;
24342 function handleTouchStart(e) {
24343 if (isMoved || isTouched) { return; }
24344 e.preventDefault();
24345 isTouched = true;
24346 touchStartY = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
24347 touchCurrentY = touchStartY;
24348 touchStartTime = (new Date()).getTime();
24349
24350 allowItemClick = true;
24351 startTranslate = Utils.getTranslate(col.$itemsEl[0], 'y');
24352 currentTranslate = startTranslate;
24353 }
24354 function handleTouchMove(e) {
24355 if (!isTouched) { return; }
24356 e.preventDefault();
24357 allowItemClick = false;
24358 touchCurrentY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
24359 if (!isMoved) {
24360 // First move
24361 Utils.cancelAnimationFrame(animationFrameId);
24362 isMoved = true;
24363 startTranslate = Utils.getTranslate(col.$itemsEl[0], 'y');
24364 currentTranslate = startTranslate;
24365 col.$itemsEl.transition(0);
24366 }
24367
24368 var diff = touchCurrentY - touchStartY;
24369 currentTranslate = startTranslate + diff;
24370 returnTo = undefined;
24371
24372 // Normalize translate
24373 if (currentTranslate < minTranslate) {
24374 currentTranslate = minTranslate - (Math.pow( (minTranslate - currentTranslate), 0.8 ));
24375 returnTo = 'min';
24376 }
24377 if (currentTranslate > maxTranslate) {
24378 currentTranslate = maxTranslate + (Math.pow( (currentTranslate - maxTranslate), 0.8 ));
24379 returnTo = 'max';
24380 }
24381 // Transform wrapper
24382 col.$itemsEl.transform(("translate3d(0," + currentTranslate + "px,0)"));
24383
24384 // Update items
24385 col.updateItems(undefined, currentTranslate, 0, picker.params.updateValuesOnTouchmove);
24386
24387 // Calc velocity
24388 velocityTranslate = currentTranslate - prevTranslate || currentTranslate;
24389 prevTranslate = currentTranslate;
24390 }
24391 function handleTouchEnd() {
24392 if (!isTouched || !isMoved) {
24393 isTouched = false;
24394 isMoved = false;
24395 return;
24396 }
24397 isTouched = false;
24398 isMoved = false;
24399 col.$itemsEl.transition('');
24400 if (returnTo) {
24401 if (returnTo === 'min') {
24402 col.$itemsEl.transform(("translate3d(0," + minTranslate + "px,0)"));
5d51ea26
DC
24403 } else {
24404 col.$itemsEl.transform(("translate3d(0," + maxTranslate + "px,0)"));
24405 }
5309fbda
DC
24406 }
24407 touchEndTime = new Date().getTime();
24408 var newTranslate;
24409 if (touchEndTime - touchStartTime > 300) {
24410 newTranslate = currentTranslate;
24411 } else {
24412 newTranslate = currentTranslate + (velocityTranslate * picker.params.momentumRatio);
24413 }
24414
24415 newTranslate = Math.max(Math.min(newTranslate, maxTranslate), minTranslate);
24416
24417 // Active Index
5d51ea26 24418 var activeIndex = Math.round(Math.abs(((newTranslate - maxTranslate) / itemHeight)));
5309fbda
DC
24419
24420 // Normalize translate
24421 if (!picker.params.freeMode) { newTranslate = (-activeIndex * itemHeight) + maxTranslate; }
24422
24423 // Transform wrapper
24424 col.$itemsEl.transform(("translate3d(0," + (parseInt(newTranslate, 10)) + "px,0)"));
24425
24426 // Update items
24427 col.updateItems(activeIndex, newTranslate, '', true);
24428
24429 // Watch items
24430 if (picker.params.updateValuesOnMomentum) {
24431 updateDuringScroll();
24432 col.$itemsEl.transitionEnd(function () {
24433 Utils.cancelAnimationFrame(animationFrameId);
24434 });
24435 }
24436
24437 // Allow click
24438 setTimeout(function () {
24439 allowItemClick = true;
24440 }, 100);
24441 }
24442
5d51ea26
DC
24443 var mousewheelTimeout;
24444 function handleMouseWheel(e) {
24445 var deltaX = e.deltaX;
24446 var deltaY = e.deltaY;
24447 if (Math.abs(deltaX) > Math.abs(deltaY)) { return; }
24448 clearTimeout(mousewheelTimeout);
24449
24450 e.preventDefault();
24451
24452 Utils.cancelAnimationFrame(animationFrameId);
24453 startTranslate = Utils.getTranslate(col.$itemsEl[0], 'y');
24454 col.$itemsEl.transition(0);
24455
24456 currentTranslate = startTranslate - deltaY;
24457 returnTo = undefined;
24458
24459 // Normalize translate
24460 if (currentTranslate < minTranslate) {
24461 currentTranslate = minTranslate;
24462 returnTo = 'min';
24463 }
24464 if (currentTranslate > maxTranslate) {
24465 currentTranslate = maxTranslate;
24466 returnTo = 'max';
24467 }
24468 // Transform wrapper
24469 col.$itemsEl.transform(("translate3d(0," + currentTranslate + "px,0)"));
24470
24471 // Update items
24472 col.updateItems(undefined, currentTranslate, 0, picker.params.updateValuesOnMousewheel);
24473
24474 // On end
24475 mousewheelTimeout = setTimeout(function () {
24476 col.$itemsEl.transition('');
24477 if (returnTo) {
24478 if (returnTo === 'min') {
24479 col.$itemsEl.transform(("translate3d(0," + minTranslate + "px,0)"));
24480 } else {
24481 col.$itemsEl.transform(("translate3d(0," + maxTranslate + "px,0)"));
24482 }
24483 }
24484 touchEndTime = new Date().getTime();
24485 var newTranslate = currentTranslate;
24486 newTranslate = Math.max(Math.min(newTranslate, maxTranslate), minTranslate);
24487
24488 // Active Index
24489 var activeIndex = Math.round(Math.abs(((newTranslate - maxTranslate) / itemHeight)));
24490
24491 // Normalize translate
24492 if (!picker.params.freeMode) { newTranslate = (-activeIndex * itemHeight) + maxTranslate; }
24493
24494 // Transform wrapper
24495 col.$itemsEl.transform(("translate3d(0," + (parseInt(newTranslate, 10)) + "px,0)"));
24496
24497 // Update items
24498 col.updateItems(activeIndex, newTranslate, '', true);
24499 }, 200);
24500 }
24501
5309fbda
DC
24502 function handleClick() {
24503 if (!allowItemClick) { return; }
24504 Utils.cancelAnimationFrame(animationFrameId);
24505 var value = $(this).attr('data-picker-value');
24506 col.setValue(value);
24507 }
24508
24509 var activeListener = app.support.passiveListener ? { passive: false, capture: false } : false;
24510 col.attachEvents = function attachColEvents() {
24511 col.$el.on(app.touchEvents.start, handleTouchStart, activeListener);
24512 app.on('touchmove:active', handleTouchMove);
24513 app.on('touchend:passive', handleTouchEnd);
5d51ea26
DC
24514 if (picker.params.mousewheel) {
24515 col.$el.on('wheel', handleMouseWheel);
24516 }
5309fbda
DC
24517 col.items.on('click', handleClick);
24518 };
24519 col.detachEvents = function detachColEvents() {
24520 col.$el.off(app.touchEvents.start, handleTouchStart, activeListener);
24521 app.off('touchmove:active', handleTouchMove);
24522 app.off('touchend:passive', handleTouchEnd);
5d51ea26
DC
24523 if (picker.params.mousewheel) {
24524 col.$el.off('wheel', handleMouseWheel);
24525 }
5309fbda
DC
24526 col.items.off('click', handleClick);
24527 };
24528
24529 col.init = function initCol() {
24530 col.calcSize();
24531 col.$itemsEl.transform(("translate3d(0," + maxTranslate + "px,0)")).transition(0);
24532 if (colIndex === 0) { col.$el.addClass('picker-column-first'); }
24533 if (colIndex === picker.cols.length - 1) { col.$el.addClass('picker-column-last'); }
24534 // Update items on init
24535 if (updateItems) { col.updateItems(0, maxTranslate, 0); }
24536
24537 col.attachEvents();
24538 };
24539
24540 col.destroy = function destroyCol() {
24541 col.detachEvents();
24542 };
24543
24544 col.init();
24545 }
24546
5d51ea26 24547 var Picker = /*@__PURE__*/(function (Framework7Class) {
5309fbda
DC
24548 function Picker(app, params) {
24549 if ( params === void 0 ) params = {};
24550
5d51ea26 24551 Framework7Class.call(this, params, [app]);
5309fbda
DC
24552 var picker = this;
24553 picker.params = Utils.extend({}, app.params.picker, params);
24554
24555 var $containerEl;
24556 if (picker.params.containerEl) {
24557 $containerEl = $(picker.params.containerEl);
24558 if ($containerEl.length === 0) { return picker; }
24559 }
24560
24561 var $inputEl;
24562 if (picker.params.inputEl) {
24563 $inputEl = $(picker.params.inputEl);
24564 }
24565
24566 var view;
24567 if ($inputEl) {
24568 view = $inputEl.parents('.view').length && $inputEl.parents('.view')[0].f7View;
24569 }
24570 if (!view) { view = app.views.main; }
24571
24572 Utils.extend(picker, {
24573 app: app,
24574 $containerEl: $containerEl,
24575 containerEl: $containerEl && $containerEl[0],
24576 inline: $containerEl && $containerEl.length > 0,
24577 needsOriginFix: app.device.ios || ((win.navigator.userAgent.toLowerCase().indexOf('safari') >= 0 && win.navigator.userAgent.toLowerCase().indexOf('chrome') < 0) && !app.device.android),
24578 cols: [],
24579 $inputEl: $inputEl,
24580 inputEl: $inputEl && $inputEl[0],
24581 initialized: false,
24582 opened: false,
24583 url: picker.params.url,
24584 view: view,
24585 });
24586
24587 function onResize() {
24588 picker.resizeCols();
24589 }
24590 function onInputClick() {
24591 picker.open();
24592 }
24593 function onInputFocus(e) {
24594 e.preventDefault();
24595 }
24596 function onHtmlClick(e) {
24597 var $targetEl = $(e.target);
24598 if (picker.isPopover()) { return; }
24599 if (!picker.opened || picker.closing) { return; }
24600 if ($targetEl.closest('[class*="backdrop"]').length) { return; }
24601 if ($inputEl && $inputEl.length > 0) {
24602 if ($targetEl[0] !== $inputEl[0] && $targetEl.closest('.sheet-modal').length === 0) {
24603 picker.close();
24604 }
24605 } else if ($(e.target).closest('.sheet-modal').length === 0) {
24606 picker.close();
24607 }
24608 }
24609
24610 // Events
24611 Utils.extend(picker, {
24612 attachResizeEvent: function attachResizeEvent() {
24613 app.on('resize', onResize);
24614 },
24615 detachResizeEvent: function detachResizeEvent() {
24616 app.off('resize', onResize);
24617 },
24618 attachInputEvents: function attachInputEvents() {
24619 picker.$inputEl.on('click', onInputClick);
24620 if (picker.params.inputReadOnly) {
24621 picker.$inputEl.on('focus mousedown', onInputFocus);
24622 }
24623 },
24624 detachInputEvents: function detachInputEvents() {
24625 picker.$inputEl.off('click', onInputClick);
24626 if (picker.params.inputReadOnly) {
24627 picker.$inputEl.off('focus mousedown', onInputFocus);
24628 }
24629 },
24630 attachHtmlEvents: function attachHtmlEvents() {
24631 app.on('click', onHtmlClick);
24632 },
24633 detachHtmlEvents: function detachHtmlEvents() {
24634 app.off('click', onHtmlClick);
24635 },
24636 });
24637
24638 picker.init();
24639
24640 return picker;
24641 }
24642
5d51ea26
DC
24643 if ( Framework7Class ) Picker.__proto__ = Framework7Class;
24644 Picker.prototype = Object.create( Framework7Class && Framework7Class.prototype );
5309fbda
DC
24645 Picker.prototype.constructor = Picker;
24646
24647 Picker.prototype.initInput = function initInput () {
24648 var picker = this;
24649 if (!picker.$inputEl) { return; }
24650 if (picker.params.inputReadOnly) { picker.$inputEl.prop('readOnly', true); }
24651 };
24652
24653 Picker.prototype.resizeCols = function resizeCols () {
24654 var picker = this;
24655 if (!picker.opened) { return; }
24656 for (var i = 0; i < picker.cols.length; i += 1) {
24657 if (!picker.cols[i].divider) {
24658 picker.cols[i].calcSize();
24659 picker.cols[i].setValue(picker.cols[i].value, 0, false);
24660 }
24661 }
24662 };
24663
24664 Picker.prototype.isPopover = function isPopover () {
24665 var picker = this;
24666 var app = picker.app;
24667 var modal = picker.modal;
24668 var params = picker.params;
24669 if (params.openIn === 'sheet') { return false; }
24670 if (modal && modal.type !== 'popover') { return false; }
24671
24672 if (!picker.inline && picker.inputEl) {
24673 if (params.openIn === 'popover') { return true; }
24674 if (app.device.ios) {
24675 return !!app.device.ipad;
5d51ea26
DC
24676 }
24677 if (app.width >= 768) {
24678 return true;
24679 }
24680 if (app.device.desktop && app.theme === 'aurora') {
5309fbda
DC
24681 return true;
24682 }
24683 }
24684 return false;
24685 };
24686
24687 Picker.prototype.formatValue = function formatValue () {
24688 var picker = this;
24689 var value = picker.value;
24690 var displayValue = picker.displayValue;
24691 if (picker.params.formatValue) {
24692 return picker.params.formatValue.call(picker, value, displayValue);
24693 }
24694 return value.join(' ');
24695 };
24696
24697 Picker.prototype.setValue = function setValue (values, transition) {
24698 var picker = this;
24699 var valueIndex = 0;
24700 if (picker.cols.length === 0) {
24701 picker.value = values;
24702 picker.updateValue(values);
24703 return;
24704 }
24705 for (var i = 0; i < picker.cols.length; i += 1) {
24706 if (picker.cols[i] && !picker.cols[i].divider) {
24707 picker.cols[i].setValue(values[valueIndex], transition);
24708 valueIndex += 1;
24709 }
24710 }
24711 };
24712
24713 Picker.prototype.getValue = function getValue () {
24714 var picker = this;
24715 return picker.value;
24716 };
24717
24718 Picker.prototype.updateValue = function updateValue (forceValues) {
24719 var picker = this;
24720 var newValue = forceValues || [];
24721 var newDisplayValue = [];
24722 var column;
24723 if (picker.cols.length === 0) {
24724 var noDividerColumns = picker.params.cols.filter(function (c) { return !c.divider; });
24725 for (var i = 0; i < noDividerColumns.length; i += 1) {
24726 column = noDividerColumns[i];
24727 if (column.displayValues !== undefined && column.values !== undefined && column.values.indexOf(newValue[i]) !== -1) {
24728 newDisplayValue.push(column.displayValues[column.values.indexOf(newValue[i])]);
24729 } else {
24730 newDisplayValue.push(newValue[i]);
24731 }
24732 }
24733 } else {
24734 for (var i$1 = 0; i$1 < picker.cols.length; i$1 += 1) {
24735 if (!picker.cols[i$1].divider) {
24736 newValue.push(picker.cols[i$1].value);
24737 newDisplayValue.push(picker.cols[i$1].displayValue);
24738 }
24739 }
24740 }
24741
24742 if (newValue.indexOf(undefined) >= 0) {
24743 return;
24744 }
24745 picker.value = newValue;
24746 picker.displayValue = newDisplayValue;
24747 picker.emit('local::change pickerChange', picker, picker.value, picker.displayValue);
24748 if (picker.inputEl) {
24749 picker.$inputEl.val(picker.formatValue());
24750 picker.$inputEl.trigger('change');
24751 }
24752 };
24753
24754 Picker.prototype.initColumn = function initColumn (colEl, updateItems) {
24755 var picker = this;
24756 pickerColumn.call(picker, colEl, updateItems);
24757 };
24758 // eslint-disable-next-line
24759 Picker.prototype.destroyColumn = function destroyColumn (colEl) {
24760 var picker = this;
24761 var $colEl = $(colEl);
24762 var index = $colEl.index();
24763 if (picker.cols[index] && picker.cols[index].destroy) {
24764 picker.cols[index].destroy();
24765 }
24766 };
24767
24768 Picker.prototype.renderToolbar = function renderToolbar () {
24769 var picker = this;
24770 if (picker.params.renderToolbar) { return picker.params.renderToolbar.call(picker, picker); }
5d51ea26 24771 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 class=\"link sheet-close popover-close\">" + (picker.params.toolbarCloseText) + "</a>\n </div>\n </div>\n </div>\n ").trim();
5309fbda
DC
24772 };
24773 // eslint-disable-next-line
24774 Picker.prototype.renderColumn = function renderColumn (col, onlyItems) {
24775 var colClasses = "picker-column " + (col.textAlign ? ("picker-column-" + (col.textAlign)) : '') + " " + (col.cssClass || '');
24776 var columnHtml;
24777 var columnItemsHtml;
24778
24779 if (col.divider) {
24780 columnHtml = "\n <div class=\"" + colClasses + " picker-column-divider\">" + (col.content) + "</div>\n ";
24781 } else {
24782 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('');
24783 columnHtml = "\n <div class=\"" + colClasses + "\">\n <div class=\"picker-items\">" + columnItemsHtml + "</div>\n </div>\n ";
24784 }
24785
24786 return onlyItems ? columnItemsHtml.trim() : columnHtml.trim();
24787 };
24788
24789 Picker.prototype.renderInline = function renderInline () {
24790 var picker = this;
24791 var ref = picker.params;
24792 var rotateEffect = ref.rotateEffect;
24793 var cssClass = ref.cssClass;
24794 var toolbar = ref.toolbar;
24795 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();
24796
24797 return inlineHtml;
24798 };
24799
24800 Picker.prototype.renderSheet = function renderSheet () {
24801 var picker = this;
24802 var ref = picker.params;
24803 var rotateEffect = ref.rotateEffect;
24804 var cssClass = ref.cssClass;
24805 var toolbar = ref.toolbar;
24806 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();
24807
24808 return sheetHtml;
24809 };
24810
24811 Picker.prototype.renderPopover = function renderPopover () {
24812 var picker = this;
24813 var ref = picker.params;
24814 var rotateEffect = ref.rotateEffect;
24815 var cssClass = ref.cssClass;
24816 var toolbar = ref.toolbar;
24817 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();
24818
24819 return popoverHtml;
24820 };
24821
24822 Picker.prototype.render = function render () {
24823 var picker = this;
24824 if (picker.params.render) { return picker.params.render.call(picker); }
24825 if (!picker.inline) {
24826 if (picker.isPopover()) { return picker.renderPopover(); }
24827 return picker.renderSheet();
24828 }
24829 return picker.renderInline();
24830 };
24831
24832 Picker.prototype.onOpen = function onOpen () {
24833 var picker = this;
24834 var initialized = picker.initialized;
24835 var $el = picker.$el;
24836 var app = picker.app;
24837 var $inputEl = picker.$inputEl;
24838 var inline = picker.inline;
24839 var value = picker.value;
24840 var params = picker.params;
24841 picker.opened = true;
24842 picker.closing = false;
24843 picker.opening = true;
24844
24845 // Init main events
24846 picker.attachResizeEvent();
24847
24848 // Init cols
24849 $el.find('.picker-column').each(function (index, colEl) {
24850 var updateItems = true;
24851 if (
24852 (!initialized && params.value)
24853 || (initialized && value)
24854 ) {
24855 updateItems = false;
24856 }
24857 picker.initColumn(colEl, updateItems);
24858 });
24859
24860 // Set value
24861 if (!initialized) {
24862 if (value) { picker.setValue(value, 0); }
24863 else if (params.value) {
24864 picker.setValue(params.value, 0);
24865 }
24866 } else if (value) {
24867 picker.setValue(value, 0);
24868 }
24869
24870 // Extra focus
24871 if (!inline && $inputEl && $inputEl.length && app.theme === 'md') {
24872 $inputEl.trigger('focus');
24873 }
24874
24875 picker.initialized = true;
24876
24877 // Trigger events
24878 if ($el) {
24879 $el.trigger('picker:open', picker);
24880 }
24881 if ($inputEl) {
24882 $inputEl.trigger('picker:open', picker);
24883 }
24884 picker.emit('local::open pickerOpen', picker);
24885 };
24886
24887 Picker.prototype.onOpened = function onOpened () {
24888 var picker = this;
24889 picker.opening = false;
24890
24891 if (picker.$el) {
24892 picker.$el.trigger('picker:opened', picker);
24893 }
24894 if (picker.$inputEl) {
24895 picker.$inputEl.trigger('picker:opened', picker);
24896 }
24897 picker.emit('local::opened pickerOpened', picker);
24898 };
24899
24900 Picker.prototype.onClose = function onClose () {
24901 var picker = this;
24902 var app = picker.app;
24903 picker.opening = false;
24904 picker.closing = true;
24905
24906 // Detach events
24907 picker.detachResizeEvent();
24908
24909 picker.cols.forEach(function (col) {
24910 if (col.destroy) { col.destroy(); }
24911 });
24912 if (picker.$inputEl && app.theme === 'md') {
24913 picker.$inputEl.trigger('blur');
24914 }
24915
24916 if (picker.$el) {
24917 picker.$el.trigger('picker:close', picker);
24918 }
24919 if (picker.$inputEl) {
24920 picker.$inputEl.trigger('picker:close', picker);
24921 }
24922 picker.emit('local::close pickerClose', picker);
24923 };
24924
24925 Picker.prototype.onClosed = function onClosed () {
24926 var picker = this;
24927 picker.opened = false;
24928 picker.closing = false;
24929
24930 if (!picker.inline) {
24931 Utils.nextTick(function () {
24932 if (picker.modal && picker.modal.el && picker.modal.destroy) {
24933 if (!picker.params.routableModals) {
24934 picker.modal.destroy();
24935 }
24936 }
24937 delete picker.modal;
24938 });
24939 }
24940
24941 if (picker.$el) {
24942 picker.$el.trigger('picker:closed', picker);
24943 }
24944 if (picker.$inputEl) {
24945 picker.$inputEl.trigger('picker:closed', picker);
24946 }
24947 picker.emit('local::closed pickerClosed', picker);
24948 };
24949
24950 Picker.prototype.open = function open () {
24951 var obj;
24952
24953 var picker = this;
24954 var app = picker.app;
24955 var opened = picker.opened;
24956 var inline = picker.inline;
24957 var $inputEl = picker.$inputEl;
24958 if (opened) { return; }
24959 if (picker.cols.length === 0 && picker.params.cols.length) {
24960 picker.params.cols.forEach(function (col) {
24961 picker.cols.push(col);
24962 });
24963 }
24964 if (inline) {
24965 picker.$el = $(picker.render());
24966 picker.$el[0].f7Picker = picker;
24967 picker.$containerEl.append(picker.$el);
24968 picker.onOpen();
24969 picker.onOpened();
24970 return;
24971 }
24972 var isPopover = picker.isPopover();
24973 var modalType = isPopover ? 'popover' : 'sheet';
24974 var modalParams = {
24975 targetEl: $inputEl,
24976 scrollToEl: picker.params.scrollToInput ? $inputEl : undefined,
24977 content: picker.render(),
24978 backdrop: isPopover,
24979 on: {
24980 open: function open() {
24981 var modal = this;
24982 picker.modal = modal;
24983 picker.$el = isPopover ? modal.$el.find('.picker') : modal.$el;
24984 picker.$el[0].f7Picker = picker;
24985 picker.onOpen();
24986 },
24987 opened: function opened() { picker.onOpened(); },
24988 close: function close() { picker.onClose(); },
24989 closed: function closed() { picker.onClosed(); },
24990 },
24991 };
24992 if (picker.params.routableModals) {
24993 picker.view.router.navigate({
24994 url: picker.url,
24995 route: ( obj = {
24996 path: picker.url
24997 }, obj[modalType] = modalParams, obj ),
24998 });
24999 } else {
25000 picker.modal = app[modalType].create(modalParams);
25001 picker.modal.open();
25002 }
25003 };
25004
25005 Picker.prototype.close = function close () {
25006 var picker = this;
25007 var opened = picker.opened;
25008 var inline = picker.inline;
25009 if (!opened) { return; }
25010 if (inline) {
25011 picker.onClose();
25012 picker.onClosed();
25013 return;
25014 }
25015 if (picker.params.routableModals) {
25016 picker.view.router.back();
25017 } else {
25018 picker.modal.close();
25019 }
25020 };
25021
25022 Picker.prototype.init = function init () {
25023 var picker = this;
25024
25025 picker.initInput();
25026
25027 if (picker.inline) {
25028 picker.open();
25029 picker.emit('local::init pickerInit', picker);
25030 return;
25031 }
25032
25033 if (!picker.initialized && picker.params.value) {
25034 picker.setValue(picker.params.value);
25035 }
25036
25037 // Attach input Events
25038 if (picker.$inputEl) {
25039 picker.attachInputEvents();
25040 }
25041 if (picker.params.closeByOutsideClick) {
25042 picker.attachHtmlEvents();
25043 }
25044 picker.emit('local::init pickerInit', picker);
25045 };
25046
25047 Picker.prototype.destroy = function destroy () {
25048 var picker = this;
25049 if (picker.destroyed) { return; }
25050 var $el = picker.$el;
25051 picker.emit('local::beforeDestroy pickerBeforeDestroy', picker);
25052 if ($el) { $el.trigger('picker:beforedestroy', picker); }
25053
25054 picker.close();
25055
25056 // Detach Events
25057 if (picker.$inputEl) {
25058 picker.detachInputEvents();
25059 }
25060 if (picker.params.closeByOutsideClick) {
25061 picker.detachHtmlEvents();
25062 }
25063
25064 if ($el && $el.length) { delete picker.$el[0].f7Picker; }
25065 Utils.deleteProps(picker);
25066 picker.destroyed = true;
25067 };
25068
25069 return Picker;
25070 }(Framework7Class));
25071
25072 var Picker$1 = {
25073 name: 'picker',
25074 static: {
25075 Picker: Picker,
25076 },
25077 create: function create() {
25078 var app = this;
25079 app.picker = ConstructorMethods({
25080 defaultSelector: '.picker',
25081 constructor: Picker,
25082 app: app,
25083 domProp: 'f7Picker',
25084 });
25085 app.picker.close = function close(el) {
25086 if ( el === void 0 ) el = '.picker';
25087
25088 var $el = $(el);
25089 if ($el.length === 0) { return; }
25090 var picker = $el[0].f7Picker;
25091 if (!picker || (picker && !picker.opened)) { return; }
25092 picker.close();
25093 };
25094 },
25095 params: {
25096 picker: {
25097 // Picker settings
25098 updateValuesOnMomentum: false,
25099 updateValuesOnTouchmove: true,
5d51ea26
DC
25100 updateValuesOnMousewheel: true,
25101 mousewheel: true,
5309fbda
DC
25102 rotateEffect: false,
25103 momentumRatio: 7,
25104 freeMode: false,
25105 cols: [],
25106 // Common opener settings
25107 containerEl: null,
25108 openIn: 'auto', // or 'popover' or 'sheet'
25109 formatValue: null,
25110 inputEl: null,
25111 inputReadOnly: true,
25112 closeByOutsideClick: true,
25113 scrollToInput: true,
25114 toolbar: true,
25115 toolbarCloseText: 'Done',
25116 cssClass: null,
25117 routableModals: true,
25118 view: null,
25119 url: 'select/',
25120 // Render functions
25121 renderToolbar: null,
25122 render: null,
25123 },
25124 },
25125 };
25126
25127 var InfiniteScroll = {
25128 handleScroll: function handleScroll(el, e) {
25129 var app = this;
25130 var $el = $(el);
25131 var scrollTop = $el[0].scrollTop;
25132 var scrollHeight = $el[0].scrollHeight;
25133 var height = $el[0].offsetHeight;
25134 var distance = $el[0].getAttribute('data-infinite-distance');
25135
25136 var virtualListContainer = $el.find('.virtual-list');
25137 var virtualList;
25138
25139 var onTop = $el.hasClass('infinite-scroll-top');
25140 if (!distance) { distance = 50; }
25141 if (typeof distance === 'string' && distance.indexOf('%') >= 0) {
25142 distance = (parseInt(distance, 10) / 100) * height;
25143 }
25144 if (distance > height) { distance = height; }
25145 if (onTop) {
25146 if (scrollTop < distance) {
25147 $el.trigger('infinite', e);
25148 app.emit('infinite', $el[0], e);
25149 }
25150 } else if (scrollTop + height >= scrollHeight - distance) {
25151 if (virtualListContainer.length > 0) {
25152 virtualList = virtualListContainer.eq(-1)[0].f7VirtualList;
25153 if (virtualList && !virtualList.reachEnd && !virtualList.params.updatableScroll) {
25154 return;
25155 }
25156 }
25157 $el.trigger('infinite', e);
25158 app.emit('infinite', $el[0], e);
25159 }
25160 },
25161 create: function create(el) {
25162 var $el = $(el);
25163 var app = this;
25164 $el.on('scroll', function handle(e) {
25165 app.infiniteScroll.handle(this, e);
25166 });
25167 },
25168 destroy: function destroy(el) {
25169 var $el = $(el);
25170 $el.off('scroll');
25171 },
25172 };
25173 var InfiniteScroll$1 = {
25174 name: 'infiniteScroll',
25175 create: function create() {
25176 var app = this;
25177 Utils.extend(app, {
25178 infiniteScroll: {
25179 handle: InfiniteScroll.handleScroll.bind(app),
25180 create: InfiniteScroll.create.bind(app),
25181 destroy: InfiniteScroll.destroy.bind(app),
25182 },
25183 });
25184 },
25185 on: {
25186 tabMounted: function tabMounted(tabEl) {
25187 var app = this;
25188 var $tabEl = $(tabEl);
25189 $tabEl.find('.infinite-scroll-content').each(function (index, el) {
25190 app.infiniteScroll.create(el);
25191 });
25192 },
25193 tabBeforeRemove: function tabBeforeRemove(tabEl) {
25194 var $tabEl = $(tabEl);
25195 var app = this;
25196 $tabEl.find('.infinite-scroll-content').each(function (index, el) {
25197 app.infiniteScroll.destroy(el);
25198 });
25199 },
25200 pageInit: function pageInit(page) {
25201 var app = this;
25202 page.$el.find('.infinite-scroll-content').each(function (index, el) {
25203 app.infiniteScroll.create(el);
25204 });
25205 },
25206 pageBeforeRemove: function pageBeforeRemove(page) {
25207 var app = this;
25208 page.$el.find('.infinite-scroll-content').each(function (index, el) {
25209 app.infiniteScroll.destroy(el);
25210 });
25211 },
25212 },
25213 };
25214
5d51ea26 25215 var PullToRefresh = /*@__PURE__*/(function (Framework7Class) {
5309fbda 25216 function PullToRefresh(app, el) {
5d51ea26 25217 Framework7Class.call(this, {}, [app]);
5309fbda
DC
25218 var ptr = this;
25219 var $el = $(el);
25220 var $preloaderEl = $el.find('.ptr-preloader');
25221
25222 ptr.$el = $el;
25223 ptr.el = $el[0];
25224 ptr.app = app;
25225
25226 ptr.bottom = ptr.$el.hasClass('ptr-bottom');
25227
25228 // Extend defaults with modules params
25229 ptr.useModulesParams({});
25230
25231 var isMaterial = app.theme === 'md';
5d51ea26
DC
25232 var isIos = app.theme === 'ios';
25233 var isAurora = app.theme === 'aurora';
5309fbda
DC
25234
25235 // Done
25236 ptr.done = function done() {
25237 var $transitionTarget = isMaterial ? $preloaderEl : $el;
25238 $transitionTarget.transitionEnd(function () {
25239 $el.removeClass('ptr-transitioning ptr-pull-up ptr-pull-down');
25240 $el.trigger('ptr:done');
25241 ptr.emit('local::done ptrDone', $el[0]);
25242 });
25243 $el.removeClass('ptr-refreshing').addClass('ptr-transitioning');
25244 return ptr;
25245 };
25246
25247 ptr.refresh = function refresh() {
25248 if ($el.hasClass('ptr-refreshing')) { return ptr; }
25249 $el.addClass('ptr-transitioning ptr-refreshing');
25250 $el.trigger('ptr:refresh', ptr.done);
25251 ptr.emit('local::refresh ptrRefresh', $el[0], ptr.done);
25252 return ptr;
25253 };
25254
5d51ea26
DC
25255 // Mousewheel
25256 ptr.mousewheel = $el.attr('data-ptr-mousewheel') === 'true';
25257
5309fbda
DC
25258 // Events handling
25259 var touchId;
25260 var isTouched;
25261 var isMoved;
25262 var touchesStart = {};
25263 var isScrolling;
25264 var touchesDiff;
25265 var refresh = false;
25266 var useTranslate = false;
25267 var forceUseTranslate = false;
25268 var startTranslate = 0;
25269 var translate;
25270 var scrollTop;
25271 var wasScrolled;
25272 var triggerDistance;
25273 var dynamicTriggerDistance;
25274 var pullStarted;
25275 var hasNavbar = false;
25276 var scrollHeight;
25277 var offsetHeight;
25278 var maxScrollTop;
25279 var $pageEl = $el.parents('.page');
25280
25281 if ($pageEl.find('.navbar').length > 0 || $pageEl.parents('.view').children('.navbar').length > 0) { hasNavbar = true; }
25282 if ($pageEl.hasClass('no-navbar')) { hasNavbar = false; }
25283 if (!hasNavbar && !ptr.bottom) { $el.addClass('ptr-no-navbar'); }
25284
25285 // Define trigger distance
25286 if ($el.attr('data-ptr-distance')) {
25287 dynamicTriggerDistance = true;
5d51ea26
DC
25288 } else if (isMaterial) {
25289 triggerDistance = 66;
25290 } else if (isIos) {
25291 triggerDistance = 44;
25292 } else if (isAurora) {
25293 triggerDistance = 38;
5309fbda
DC
25294 }
25295
25296 function handleTouchStart(e) {
25297 if (isTouched) {
25298 if (Device.os === 'android') {
25299 if ('targetTouches' in e && e.targetTouches.length > 1) { return; }
25300 } else { return; }
25301 }
25302
25303 if ($el.hasClass('ptr-refreshing')) {
25304 return;
25305 }
5d51ea26 25306 if ($(e.target).closest('.sortable-handler, .ptr-ignore, .card-expandable.card-opened').length) { return; }
5309fbda
DC
25307
25308 isMoved = false;
25309 pullStarted = false;
25310 isTouched = true;
25311 isScrolling = undefined;
25312 wasScrolled = undefined;
25313 if (e.type === 'touchstart') { touchId = e.targetTouches[0].identifier; }
25314 touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
25315 touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
25316 }
25317
25318 function handleTouchMove(e) {
25319 if (!isTouched) { return; }
25320 var pageX;
25321 var pageY;
25322 var touch;
25323 if (e.type === 'touchmove') {
25324 if (touchId && e.touches) {
25325 for (var i = 0; i < e.touches.length; i += 1) {
25326 if (e.touches[i].identifier === touchId) {
25327 touch = e.touches[i];
25328 }
25329 }
25330 }
25331 if (!touch) { touch = e.targetTouches[0]; }
25332 pageX = touch.pageX;
25333 pageY = touch.pageY;
25334 } else {
25335 pageX = e.pageX;
25336 pageY = e.pageY;
25337 }
25338 if (!pageX || !pageY) { return; }
25339
25340
25341 if (typeof isScrolling === 'undefined') {
25342 isScrolling = !!(isScrolling || Math.abs(pageY - touchesStart.y) > Math.abs(pageX - touchesStart.x));
25343 }
25344 if (!isScrolling) {
25345 isTouched = false;
25346 return;
25347 }
25348
25349 scrollTop = $el[0].scrollTop;
25350
25351 if (!isMoved) {
25352 $el.removeClass('ptr-transitioning');
25353 var targetIsScrollable;
25354 scrollHeight = $el[0].scrollHeight;
25355 offsetHeight = $el[0].offsetHeight;
25356 if (ptr.bottom) {
25357 maxScrollTop = scrollHeight - offsetHeight;
25358 }
25359 if (scrollTop > scrollHeight) {
25360 isTouched = false;
25361 return;
25362 }
25363 var $ptrWatchScrollable = $(e.target).closest('.ptr-watch-scroll');
25364 if ($ptrWatchScrollable.length) {
25365 $ptrWatchScrollable.each(function (ptrScrollableIndex, ptrScrollableEl) {
25366 if (ptrScrollableEl === el) { return; }
25367 if (
25368 (ptrScrollableEl.scrollHeight > ptrScrollableEl.offsetHeight)
25369 && $(ptrScrollableEl).css('overflow') === 'auto'
25370 && (
25371 (!ptr.bottom && ptrScrollableEl.scrollTop > 0)
25372 || (ptr.bottom && ptrScrollableEl.scrollTop < ptrScrollableEl.scrollHeight - ptrScrollableEl.offsetHeight)
25373 )
25374 ) {
25375 targetIsScrollable = true;
25376 }
25377 });
25378 }
25379 if (targetIsScrollable) {
25380 isTouched = false;
25381 return;
25382 }
25383 if (dynamicTriggerDistance) {
25384 triggerDistance = $el.attr('data-ptr-distance');
25385 if (triggerDistance.indexOf('%') >= 0) { triggerDistance = (scrollHeight * parseInt(triggerDistance, 10)) / 100; }
25386 }
25387 startTranslate = $el.hasClass('ptr-refreshing') ? triggerDistance : 0;
25388 if (scrollHeight === offsetHeight || Device.os !== 'ios' || isMaterial) {
25389 useTranslate = true;
25390 } else {
25391 useTranslate = false;
25392 }
25393 forceUseTranslate = false;
25394 }
25395 isMoved = true;
25396 touchesDiff = pageY - touchesStart.y;
25397
25398 if (typeof wasScrolled === 'undefined' && (ptr.bottom ? scrollTop !== maxScrollTop : scrollTop !== 0)) { wasScrolled = true; }
25399
25400 var ptrStarted = ptr.bottom
25401 ? (touchesDiff < 0 && scrollTop >= maxScrollTop) || scrollTop > maxScrollTop
25402 : (touchesDiff > 0 && scrollTop <= 0) || scrollTop < 0;
25403
25404 if (ptrStarted) {
25405 // iOS 8 fix
25406 if (Device.os === 'ios' && parseInt(Device.osVersion.split('.')[0], 10) > 7) {
25407 if (!ptr.bottom && scrollTop === 0 && !wasScrolled) { useTranslate = true; }
25408 if (ptr.bottom && scrollTop === maxScrollTop && !wasScrolled) { useTranslate = true; }
25409 }
25410
25411 if (!useTranslate && ptr.bottom && !isMaterial) {
25412 $el.css('-webkit-overflow-scrolling', 'auto');
25413 $el.scrollTop(maxScrollTop);
25414 forceUseTranslate = true;
25415 }
25416
25417 if (useTranslate || forceUseTranslate) {
25418 if (e.cancelable) {
25419 e.preventDefault();
25420 }
25421 translate = (ptr.bottom ? -1 * (Math.pow( Math.abs(touchesDiff), 0.85 )) : Math.pow( touchesDiff, 0.85 )) + startTranslate;
25422 if (isMaterial) {
25423 $preloaderEl.transform(("translate3d(0," + translate + "px,0)"))
25424 .find('.ptr-arrow').transform(("rotate(" + ((180 * (Math.abs(touchesDiff) / 66)) + 100) + "deg)"));
25425 } else {
25426 // eslint-disable-next-line
25427 if (ptr.bottom) {
25428 $el.children().transform(("translate3d(0," + translate + "px,0)"));
25429 } else {
25430 $el.transform(("translate3d(0," + translate + "px,0)"));
25431 }
25432 }
25433 }
25434
25435 if (((useTranslate || forceUseTranslate) && (Math.pow( Math.abs(touchesDiff), 0.85 )) > triggerDistance) || (!useTranslate && Math.abs(touchesDiff) >= triggerDistance * 2)) {
25436 refresh = true;
25437 $el.addClass('ptr-pull-up').removeClass('ptr-pull-down');
25438 } else {
25439 refresh = false;
25440 $el.removeClass('ptr-pull-up').addClass('ptr-pull-down');
25441 }
25442 if (!pullStarted) {
25443 $el.trigger('ptr:pullstart');
25444 ptr.emit('local::pullStart ptrPullStart', $el[0]);
25445 pullStarted = true;
25446 }
25447 $el.trigger('ptr:pullmove', {
25448 event: e,
25449 scrollTop: scrollTop,
25450 translate: translate,
25451 touchesDiff: touchesDiff,
25452 });
25453 ptr.emit('local::pullMove ptrPullMove', $el[0], {
25454 event: e,
25455 scrollTop: scrollTop,
25456 translate: translate,
25457 touchesDiff: touchesDiff,
25458 });
25459 } else {
25460 pullStarted = false;
25461 $el.removeClass('ptr-pull-up ptr-pull-down');
25462 refresh = false;
25463 }
25464 }
25465 function handleTouchEnd(e) {
25466 if (e.type === 'touchend' && e.changedTouches && e.changedTouches.length > 0 && touchId) {
25467 if (e.changedTouches[0].identifier !== touchId) {
25468 isTouched = false;
25469 isScrolling = false;
25470 isMoved = false;
25471 touchId = null;
25472 return;
25473 }
25474 }
25475 if (!isTouched || !isMoved) {
25476 isTouched = false;
25477 isMoved = false;
25478 return;
25479 }
25480 if (translate) {
25481 $el.addClass('ptr-transitioning');
25482 translate = 0;
25483 }
25484 if (isMaterial) {
25485 $preloaderEl.transform('')
25486 .find('.ptr-arrow').transform('');
25487 } else {
25488 // eslint-disable-next-line
25489 if (ptr.bottom) {
25490 $el.children().transform('');
25491 } else {
25492 $el.transform('');
25493 }
25494 }
25495
25496 if (!useTranslate && ptr.bottom && !isMaterial) {
25497 $el.css('-webkit-overflow-scrolling', '');
25498 }
25499
25500 if (refresh) {
25501 $el.addClass('ptr-refreshing');
25502 $el.trigger('ptr:refresh', ptr.done);
25503 ptr.emit('local::refresh ptrRefresh', $el[0], ptr.done);
25504 } else {
25505 $el.removeClass('ptr-pull-down');
25506 }
25507 isTouched = false;
25508 isMoved = false;
25509 if (pullStarted) {
25510 $el.trigger('ptr:pullend');
25511 ptr.emit('local::pullEnd ptrPullEnd', $el[0]);
25512 }
25513 }
25514
5d51ea26
DC
25515 var mousewheelTimeout;
25516 var mousewheelMoved;
25517 var mousewheelAllow = true;
25518 var mousewheelTranslate = 0;
25519
25520 function handleMouseWheelRelease() {
25521 mousewheelAllow = true;
25522 mousewheelMoved = false;
25523 mousewheelTranslate = 0;
25524 if (translate) {
25525 $el.addClass('ptr-transitioning');
25526 translate = 0;
25527 }
25528 if (isMaterial) {
25529 $preloaderEl.transform('')
25530 .find('.ptr-arrow').transform('');
25531 } else {
25532 // eslint-disable-next-line
25533 if (ptr.bottom) {
25534 $el.children().transform('');
25535 } else {
25536 $el.transform('');
25537 }
25538 }
25539
25540 if (refresh) {
25541 $el.addClass('ptr-refreshing');
25542 $el.trigger('ptr:refresh', ptr.done);
25543 ptr.emit('local::refresh ptrRefresh', $el[0], ptr.done);
25544 } else {
25545 $el.removeClass('ptr-pull-down');
25546 }
25547 if (pullStarted) {
25548 $el.trigger('ptr:pullend');
25549 ptr.emit('local::pullEnd ptrPullEnd', $el[0]);
25550 }
25551 }
25552 function handleMouseWheel(e) {
25553 if (!mousewheelAllow) { return; }
25554 var deltaX = e.deltaX;
25555 var deltaY = e.deltaY;
25556 if (Math.abs(deltaX) > Math.abs(deltaY)) { return; }
25557 if ($el.hasClass('ptr-refreshing')) {
25558 return;
25559 }
25560 if ($(e.target).closest('.sortable-handler, .ptr-ignore, .card-expandable.card-opened').length) { return; }
25561
25562 clearTimeout(mousewheelTimeout);
25563
25564 scrollTop = $el[0].scrollTop;
25565
25566 if (!mousewheelMoved) {
25567 $el.removeClass('ptr-transitioning');
25568 var targetIsScrollable;
25569 scrollHeight = $el[0].scrollHeight;
25570 offsetHeight = $el[0].offsetHeight;
25571 if (ptr.bottom) {
25572 maxScrollTop = scrollHeight - offsetHeight;
25573 }
25574 if (scrollTop > scrollHeight) {
25575 mousewheelAllow = false;
25576 return;
25577 }
25578 var $ptrWatchScrollable = $(e.target).closest('.ptr-watch-scroll');
25579 if ($ptrWatchScrollable.length) {
25580 $ptrWatchScrollable.each(function (ptrScrollableIndex, ptrScrollableEl) {
25581 if (ptrScrollableEl === el) { return; }
25582 if (
25583 (ptrScrollableEl.scrollHeight > ptrScrollableEl.offsetHeight)
25584 && $(ptrScrollableEl).css('overflow') === 'auto'
25585 && (
25586 (!ptr.bottom && ptrScrollableEl.scrollTop > 0)
25587 || (ptr.bottom && ptrScrollableEl.scrollTop < ptrScrollableEl.scrollHeight - ptrScrollableEl.offsetHeight)
25588 )
25589 ) {
25590 targetIsScrollable = true;
25591 }
25592 });
25593 }
25594 if (targetIsScrollable) {
25595 mousewheelAllow = false;
25596 return;
25597 }
25598 if (dynamicTriggerDistance) {
25599 triggerDistance = $el.attr('data-ptr-distance');
25600 if (triggerDistance.indexOf('%') >= 0) { triggerDistance = (scrollHeight * parseInt(triggerDistance, 10)) / 100; }
25601 }
25602 }
25603 isMoved = true;
25604 mousewheelTranslate -= deltaY;
25605 touchesDiff = mousewheelTranslate; // pageY - touchesStart.y;
25606
25607 if (typeof wasScrolled === 'undefined' && (ptr.bottom ? scrollTop !== maxScrollTop : scrollTop !== 0)) { wasScrolled = true; }
25608
25609 var ptrStarted = ptr.bottom
25610 ? (touchesDiff < 0 && scrollTop >= maxScrollTop) || scrollTop > maxScrollTop
25611 : (touchesDiff > 0 && scrollTop <= 0) || scrollTop < 0;
25612
25613 if (ptrStarted) {
25614 if (e.cancelable) {
25615 e.preventDefault();
25616 }
25617
25618 translate = touchesDiff;
25619 if (Math.abs(translate) > triggerDistance) {
25620 translate = triggerDistance + (Math.pow( (Math.abs(translate) - triggerDistance), 0.7 ));
25621 if (ptr.bottom) { translate = -translate; }
25622 }
25623
25624 if (isMaterial) {
25625 $preloaderEl.transform(("translate3d(0," + translate + "px,0)"))
25626 .find('.ptr-arrow').transform(("rotate(" + ((180 * (Math.abs(touchesDiff) / 66)) + 100) + "deg)"));
25627 } else {
25628 // eslint-disable-next-line
25629 if (ptr.bottom) {
25630 $el.children().transform(("translate3d(0," + translate + "px,0)"));
25631 } else {
25632 $el.transform(("translate3d(0," + translate + "px,0)"));
25633 }
25634 }
25635
25636 if (Math.abs(translate) > triggerDistance) {
25637 refresh = true;
25638 $el.addClass('ptr-pull-up').removeClass('ptr-pull-down');
25639 } else {
25640 refresh = false;
25641 $el.removeClass('ptr-pull-up').addClass('ptr-pull-down');
25642 }
25643 if (!pullStarted) {
25644 $el.trigger('ptr:pullstart');
25645 ptr.emit('local::pullStart ptrPullStart', $el[0]);
25646 pullStarted = true;
25647 }
25648 $el.trigger('ptr:pullmove', {
25649 event: e,
25650 scrollTop: scrollTop,
25651 translate: translate,
25652 touchesDiff: touchesDiff,
25653 });
25654 ptr.emit('local::pullMove ptrPullMove', $el[0], {
25655 event: e,
25656 scrollTop: scrollTop,
25657 translate: translate,
25658 touchesDiff: touchesDiff,
25659 });
25660 } else {
25661 pullStarted = false;
25662 $el.removeClass('ptr-pull-up ptr-pull-down');
25663 refresh = false;
25664 }
25665
25666 mousewheelTimeout = setTimeout(handleMouseWheelRelease, 300);
25667 }
25668
5309fbda
DC
25669 if (!$pageEl.length || !$el.length) { return ptr; }
25670
25671 $el[0].f7PullToRefresh = ptr;
25672
25673 // Events
25674 ptr.attachEvents = function attachEvents() {
25675 var passive = Support.passiveListener ? { passive: true } : false;
25676 $el.on(app.touchEvents.start, handleTouchStart, passive);
25677 app.on('touchmove:active', handleTouchMove);
25678 app.on('touchend:passive', handleTouchEnd);
5d51ea26
DC
25679 if (ptr.mousewheel && !ptr.bottom) {
25680 $el.on('wheel', handleMouseWheel);
25681 }
5309fbda
DC
25682 };
25683 ptr.detachEvents = function detachEvents() {
25684 var passive = Support.passiveListener ? { passive: true } : false;
25685 $el.off(app.touchEvents.start, handleTouchStart, passive);
25686 app.off('touchmove:active', handleTouchMove);
25687 app.off('touchend:passive', handleTouchEnd);
5d51ea26
DC
25688 if (ptr.mousewheel && !ptr.bottom) {
25689 $el.off('wheel', handleMouseWheel);
25690 }
5309fbda
DC
25691 };
25692
25693 // Install Modules
25694 ptr.useModules();
25695
25696 // Init
25697 ptr.init();
25698
25699 return ptr;
25700 }
25701
5d51ea26
DC
25702 if ( Framework7Class ) PullToRefresh.__proto__ = Framework7Class;
25703 PullToRefresh.prototype = Object.create( Framework7Class && Framework7Class.prototype );
5309fbda
DC
25704 PullToRefresh.prototype.constructor = PullToRefresh;
25705
25706 PullToRefresh.prototype.init = function init () {
25707 var ptr = this;
25708 ptr.attachEvents();
25709 };
25710
25711 PullToRefresh.prototype.destroy = function destroy () {
25712 var ptr = this;
25713 ptr.emit('local::beforeDestroy ptrBeforeDestroy', ptr);
25714 ptr.$el.trigger('ptr:beforedestroy', ptr);
25715 delete ptr.el.f7PullToRefresh;
25716 ptr.detachEvents();
25717 Utils.deleteProps(ptr);
25718 ptr = null;
25719 };
25720
25721 return PullToRefresh;
25722 }(Framework7Class));
25723
25724 var PullToRefresh$1 = {
25725 name: 'pullToRefresh',
25726 create: function create() {
25727 var app = this;
25728 app.ptr = Utils.extend(
25729 ConstructorMethods({
25730 defaultSelector: '.ptr-content',
25731 constructor: PullToRefresh,
25732 app: app,
25733 domProp: 'f7PullToRefresh',
25734 }),
25735 {
25736 done: function done(el) {
25737 var ptr = app.ptr.get(el);
25738 if (ptr) { return ptr.done(); }
25739 return undefined;
25740 },
25741 refresh: function refresh(el) {
25742 var ptr = app.ptr.get(el);
25743 if (ptr) { return ptr.refresh(); }
25744 return undefined;
25745 },
25746 }
25747 );
25748 },
25749 static: {
25750 PullToRefresh: PullToRefresh,
25751 },
25752 on: {
25753 tabMounted: function tabMounted(tabEl) {
25754 var app = this;
25755 var $tabEl = $(tabEl);
25756 $tabEl.find('.ptr-content').each(function (index, el) {
25757 app.ptr.create(el);
25758 });
25759 },
25760 tabBeforeRemove: function tabBeforeRemove(tabEl) {
25761 var $tabEl = $(tabEl);
25762 var app = this;
25763 $tabEl.find('.ptr-content').each(function (index, el) {
25764 app.ptr.destroy(el);
25765 });
25766 },
25767 pageInit: function pageInit(page) {
25768 var app = this;
25769 page.$el.find('.ptr-content').each(function (index, el) {
25770 app.ptr.create(el);
25771 });
25772 },
25773 pageBeforeRemove: function pageBeforeRemove(page) {
25774 var app = this;
25775 page.$el.find('.ptr-content').each(function (index, el) {
25776 app.ptr.destroy(el);
25777 });
25778 },
25779 },
25780 };
25781
25782 var Lazy = {
25783 destroy: function destroy(pageEl) {
25784 var $pageEl = $(pageEl).closest('.page');
25785 if (!$pageEl.length) { return; }
25786 if ($pageEl[0].f7LazyDestroy) {
25787 $pageEl[0].f7LazyDestroy();
25788 }
25789 },
25790 create: function create(pageEl) {
25791 var app = this;
25792 var $pageEl = $(pageEl).closest('.page').eq(0);
25793
25794 // Lazy images
25795 var $lazyLoadImages = $pageEl.find('.lazy');
25796 if ($lazyLoadImages.length === 0 && !$pageEl.hasClass('lazy')) { return; }
25797
25798 // Placeholder
25799 var placeholderSrc = app.params.lazy.placeholder;
25800
25801 if (placeholderSrc !== false) {
25802 $lazyLoadImages.each(function (index, lazyEl) {
25803 if ($(lazyEl).attr('data-src') && !$(lazyEl).attr('src')) { $(lazyEl).attr('src', placeholderSrc); }
25804 });
25805 }
25806
25807 // load image
25808 var imagesSequence = [];
25809 var imageIsLoading = false;
25810
25811 function onImageComplete(lazyEl) {
25812 if (imagesSequence.indexOf(lazyEl) >= 0) {
25813 imagesSequence.splice(imagesSequence.indexOf(lazyEl), 1);
25814 }
25815 imageIsLoading = false;
25816 if (app.params.lazy.sequential && imagesSequence.length > 0) {
25817 imageIsLoading = true;
25818 app.lazy.loadImage(imagesSequence[0], onImageComplete);
25819 }
25820 }
25821
25822 function observerCallback(entries, observer) {
25823 entries.forEach(function (entry) {
25824 if (entry.isIntersecting) {
25825 if (app.params.lazy.sequential && imageIsLoading) {
25826 if (imagesSequence.indexOf(entry.target) < 0) { imagesSequence.push(entry.target); }
25827 return;
25828 }
25829 // Load image
25830 imageIsLoading = true;
25831 app.lazy.loadImage(entry.target, onImageComplete);
25832 // Detach
25833 observer.unobserve(entry.target);
25834 }
25835 });
25836 }
25837 if (app.params.lazy.observer && Support.intersectionObserver) {
25838 var observer = $pageEl[0].f7LazyObserver;
25839 if (!observer) {
25840 observer = new win.IntersectionObserver(observerCallback, {
25841 root: $pageEl[0],
25842 });
25843 }
25844 $lazyLoadImages.each(function (index, el) {
25845 if (el.f7LazyObserverAdded) { return; }
25846 el.f7LazyObserverAdded = true;
25847 observer.observe(el);
25848 });
25849 if (!$pageEl[0].f7LazyDestroy) {
25850 $pageEl[0].f7LazyDestroy = function () {
25851 observer.disconnect();
25852 delete $pageEl[0].f7LazyDestroy;
25853 delete $pageEl[0].f7LazyObserver;
25854 };
25855 }
25856 return;
25857 }
25858
25859 function lazyHandler() {
25860 app.lazy.load($pageEl, function (lazyEl) {
25861 if (app.params.lazy.sequential && imageIsLoading) {
25862 if (imagesSequence.indexOf(lazyEl) < 0) { imagesSequence.push(lazyEl); }
25863 return;
25864 }
25865 imageIsLoading = true;
25866 app.lazy.loadImage(lazyEl, onImageComplete);
25867 });
25868 }
25869
25870 function attachEvents() {
25871 $pageEl[0].f7LazyAttached = true;
25872 $pageEl.on('lazy', lazyHandler);
25873 $pageEl.on('scroll', lazyHandler, true);
25874 $pageEl.find('.tab').on('tab:mounted tab:show', lazyHandler);
25875 app.on('resize', lazyHandler);
25876 }
25877 function detachEvents() {
25878 $pageEl[0].f7LazyAttached = false;
25879 delete $pageEl[0].f7LazyAttached;
25880 $pageEl.off('lazy', lazyHandler);
25881 $pageEl.off('scroll', lazyHandler, true);
25882 $pageEl.find('.tab').off('tab:mounted tab:show', lazyHandler);
25883 app.off('resize', lazyHandler);
25884 }
25885
25886 // Store detach function
25887 if (!$pageEl[0].f7LazyDestroy) {
25888 $pageEl[0].f7LazyDestroy = detachEvents;
25889 }
25890
25891 // Attach events
25892 if (!$pageEl[0].f7LazyAttached) {
25893 attachEvents();
25894 }
25895
25896 // Run loader on page load/init
25897 lazyHandler();
25898 },
25899 isInViewport: function isInViewport(lazyEl) {
25900 var app = this;
25901 var rect = lazyEl.getBoundingClientRect();
25902 var threshold = app.params.lazy.threshold || 0;
25903
25904 return (
25905 rect.top >= (0 - threshold)
25906 && rect.left >= (0 - threshold)
25907 && rect.top <= (app.height + threshold)
25908 && rect.left <= (app.width + threshold)
25909 );
25910 },
25911 loadImage: function loadImage(imageEl, callback) {
25912 var app = this;
25913 var $imageEl = $(imageEl);
25914
25915 var bg = $imageEl.attr('data-background');
25916 var src = bg || $imageEl.attr('data-src');
25917 if (!src) { return; }
25918 function onLoad() {
25919 $imageEl.removeClass('lazy').addClass('lazy-loaded');
25920 if (bg) {
25921 $imageEl.css('background-image', ("url(" + src + ")"));
25922 } else {
25923 $imageEl.attr('src', src);
25924 }
25925 if (callback) { callback(imageEl); }
25926 $imageEl.trigger('lazy:loaded');
25927 app.emit('lazyLoaded', $imageEl[0]);
25928 }
25929
25930 function onError() {
25931 $imageEl.removeClass('lazy').addClass('lazy-loaded');
25932 if (bg) {
25933 $imageEl.css('background-image', ("url(" + (app.params.lazy.placeholder || '') + ")"));
25934 } else {
25935 $imageEl.attr('src', app.params.lazy.placeholder || '');
25936 }
25937 if (callback) { callback(imageEl); }
25938 $imageEl.trigger('lazy:error');
25939 app.emit('lazyError', $imageEl[0]);
25940 }
25941 var image = new win.Image();
25942 image.onload = onLoad;
25943 image.onerror = onError;
25944 image.src = src;
25945
25946 $imageEl.removeAttr('data-src').removeAttr('data-background');
25947
25948 // Add loaded callback and events
25949 $imageEl.trigger('lazy:load');
25950 app.emit('lazyLoad', $imageEl[0]);
25951 },
25952 load: function load(pageEl, callback) {
25953 var app = this;
25954 var $pageEl = $(pageEl);
25955 if (!$pageEl.hasClass('page')) { $pageEl = $pageEl.parents('.page').eq(0); }
25956 if ($pageEl.length === 0) {
25957 return;
25958 }
25959 $pageEl.find('.lazy').each(function (index, lazyEl) {
25960 var $lazyEl = $(lazyEl);
25961 if ($lazyEl.parents('.tab:not(.tab-active)').length > 0) {
25962 return;
25963 }
25964 if (app.lazy.isInViewport(lazyEl)) {
25965 if (callback) { callback(lazyEl); }
25966 else { app.lazy.loadImage(lazyEl); }
25967 }
25968 });
25969 },
25970
25971 };
25972 var Lazy$1 = {
25973 name: 'lazy',
25974 params: {
25975 lazy: {
25976 placeholder: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAAl21bKAAAAA1BMVEXCwsK592mkAAAACklEQVQI12NgAAAAAgAB4iG8MwAAAABJRU5ErkJggg==',
25977 threshold: 0,
25978 sequential: true,
25979 observer: true,
25980 },
25981 },
25982 create: function create() {
25983 var app = this;
25984 Utils.extend(app, {
25985 lazy: {
25986 create: Lazy.create.bind(app),
25987 destroy: Lazy.destroy.bind(app),
25988 loadImage: Lazy.loadImage.bind(app),
25989 load: Lazy.load.bind(app),
25990 isInViewport: Lazy.isInViewport.bind(app),
25991 },
25992 });
25993 },
25994 on: {
25995 pageInit: function pageInit(page) {
25996 var app = this;
25997 if (page.$el.find('.lazy').length > 0 || page.$el.hasClass('lazy')) {
25998 app.lazy.create(page.$el);
25999 }
26000 },
26001 pageAfterIn: function pageAfterIn(page) {
26002 var app = this;
26003 if (app.params.lazy.observer && Support.intersectionObserver) { return; }
26004 if (page.$el.find('.lazy').length > 0 || page.$el.hasClass('lazy')) {
26005 app.lazy.create(page.$el);
26006 }
26007 },
26008 pageBeforeRemove: function pageBeforeRemove(page) {
26009 var app = this;
26010 if (page.$el.find('.lazy').length > 0 || page.$el.hasClass('lazy')) {
26011 app.lazy.destroy(page.$el);
26012 }
26013 },
26014 tabMounted: function tabMounted(tabEl) {
26015 var app = this;
26016 var $tabEl = $(tabEl);
26017 if ($tabEl.find('.lazy').length > 0 || $tabEl.hasClass('lazy')) {
26018 app.lazy.create($tabEl);
26019 }
26020 },
26021 tabBeforeRemove: function tabBeforeRemove(tabEl) {
26022 var app = this;
26023 if (app.params.lazy.observer && Support.intersectionObserver) { return; }
26024 var $tabEl = $(tabEl);
26025 if ($tabEl.find('.lazy').length > 0 || $tabEl.hasClass('lazy')) {
26026 app.lazy.destroy($tabEl);
26027 }
26028 },
26029 },
26030 };
26031
5d51ea26 26032 var DataTable = /*@__PURE__*/(function (Framework7Class) {
5309fbda
DC
26033 function DataTable(app, params) {
26034 if ( params === void 0 ) params = {};
26035
5d51ea26 26036 Framework7Class.call(this, params, [app]);
5309fbda
DC
26037
26038 var table = this;
26039
26040 var defaults = {
26041
26042 };
26043
26044 // Extend defaults with modules params
26045 table.useModulesParams(defaults);
26046
26047 table.params = Utils.extend(defaults, params);
26048
26049 // El
26050 var $el = $(table.params.el);
26051 if ($el.length === 0) { return undefined; }
26052
26053 table.$el = $el;
26054 table.el = $el[0];
26055
26056 if (table.$el[0].f7DataTable) {
26057 var instance = table.$el[0].f7DataTable;
26058 table.destroy();
26059 return instance;
26060 }
26061
26062 table.$el[0].f7DataTable = table;
26063
26064 Utils.extend(table, {
26065 collapsible: $el.hasClass('data-table-collapsible'),
26066 // Headers
26067 $headerEl: $el.find('.data-table-header'),
26068 $headerSelectedEl: $el.find('.data-table-header-selected'),
26069 });
26070
26071 // Events
26072 function handleChange(e) {
26073 if (e.detail && e.detail.sentByF7DataTable) {
26074 // Scripted event, don't do anything
26075 return;
26076 }
26077 var $inputEl = $(this);
26078 var checked = $inputEl[0].checked;
26079 var columnIndex = $inputEl.parents('td,th').index();
26080
26081 if ($inputEl.parents('thead').length > 0) {
26082 if (columnIndex === 0) {
26083 $el
26084 .find('tbody tr')[checked ? 'addClass' : 'removeClass']('data-table-row-selected');
26085 }
26086 $el
26087 .find(("tbody tr td:nth-child(" + (columnIndex + 1) + ") input"))
26088 .prop('checked', checked)
26089 .trigger('change', { sentByF7DataTable: true });
5d51ea26 26090 $inputEl.prop('indeterminate', false);
5309fbda
DC
26091 } else {
26092 if (columnIndex === 0) {
26093 $inputEl.parents('tr')[checked ? 'addClass' : 'removeClass']('data-table-row-selected');
26094 }
5d51ea26
DC
26095 var checkedRows = $el.find(("tbody .checkbox-cell:nth-child(" + (columnIndex + 1) + ") input[type=\"checkbox\"]:checked")).length;
26096 var totalRows = $el.find('tbody tr').length;
26097 var $headCheckboxEl = $el.find(("thead .checkbox-cell:nth-child(" + (columnIndex + 1) + ") input[type=\"checkbox\"]"));
5309fbda 26098 if (!checked) {
5d51ea26
DC
26099 $headCheckboxEl.prop('checked', false);
26100 } else if (checkedRows === totalRows) {
26101 $headCheckboxEl.prop('checked', true).trigger('change', { sentByF7DataTable: true });
5309fbda 26102 }
5d51ea26 26103 $headCheckboxEl.prop('indeterminate', checkedRows > 0 && checkedRows < totalRows);
5309fbda
DC
26104 }
26105 table.checkSelectedHeader();
26106 }
26107 function handleSortableClick() {
26108 var $cellEl = $(this);
26109 var isActive = $cellEl.hasClass('sortable-cell-active');
26110 var currentSort = $cellEl.hasClass('sortable-desc') ? 'desc' : 'asc';
26111 var newSort;
26112 if (isActive) {
26113 newSort = currentSort === 'desc' ? 'asc' : 'desc';
26114 $cellEl.removeClass('sortable-desc sortable-asc').addClass(("sortable-" + newSort));
26115 } else {
26116 $el.find('thead .sortable-cell-active').removeClass('sortable-cell-active');
26117 $cellEl.addClass('sortable-cell-active');
26118 newSort = currentSort;
26119 }
26120 $cellEl.trigger('datatable:sort', newSort);
26121 table.emit('local::sort dataTableSort', table, newSort);
26122 }
26123 table.attachEvents = function attachEvents() {
26124 table.$el.on('change', '.checkbox-cell input[type="checkbox"]', handleChange);
26125 table.$el.find('thead .sortable-cell').on('click', handleSortableClick);
26126 };
26127 table.detachEvents = function detachEvents() {
26128 table.$el.off('change', '.checkbox-cell input[type="checkbox"]', handleChange);
26129 table.$el.find('thead .sortable-cell').off('click', handleSortableClick);
26130 };
26131
26132 // Install Modules
26133 table.useModules();
26134
26135 // Init
26136 table.init();
26137
26138 return table;
26139 }
26140
5d51ea26
DC
26141 if ( Framework7Class ) DataTable.__proto__ = Framework7Class;
26142 DataTable.prototype = Object.create( Framework7Class && Framework7Class.prototype );
5309fbda
DC
26143 DataTable.prototype.constructor = DataTable;
26144
26145 DataTable.prototype.setCollapsibleLabels = function setCollapsibleLabels () {
26146 var table = this;
26147 if (!table.collapsible) { return; }
26148 table.$el.find('tbody td:not(.checkbox-cell)').each(function (index, el) {
26149 var $el = $(el);
26150 var elIndex = $el.index();
26151 var collpsibleTitle = $el.attr('data-collapsible-title');
26152 if (!collpsibleTitle && collpsibleTitle !== '') {
26153 $el.attr('data-collapsible-title', table.$el.find('thead th').eq(elIndex).text());
26154 }
26155 });
26156 };
26157
26158 DataTable.prototype.checkSelectedHeader = function checkSelectedHeader () {
26159 var table = this;
26160 if (table.$headerEl.length > 0 && table.$headerSelectedEl.length > 0) {
26161 var checkedItems = table.$el.find('tbody .checkbox-cell input:checked').length;
26162 table.$el[checkedItems > 0 ? 'addClass' : 'removeClass']('data-table-has-checked');
26163 table.$headerSelectedEl.find('.data-table-selected-count').text(checkedItems);
26164 }
26165 };
26166
26167 DataTable.prototype.init = function init () {
26168 var table = this;
26169 table.attachEvents();
26170 table.setCollapsibleLabels();
26171 table.checkSelectedHeader();
26172 };
26173
26174 DataTable.prototype.destroy = function destroy () {
26175 var table = this;
26176
26177 table.$el.trigger('datatable:beforedestroy', table);
26178 table.emit('local::beforeDestroy dataTableBeforeDestroy', table);
26179
26180 table.attachEvents();
26181
26182 if (table.$el[0]) {
26183 table.$el[0].f7DataTable = null;
26184 delete table.$el[0].f7DataTable;
26185 }
26186 Utils.deleteProps(table);
26187 table = null;
26188 };
26189
26190 return DataTable;
26191 }(Framework7Class));
26192
26193 var DataTable$1 = {
26194 name: 'dataTable',
26195 static: {
26196 DataTable: DataTable,
26197 },
26198 create: function create() {
26199 var app = this;
26200 app.dataTable = ConstructorMethods({
26201 defaultSelector: '.data-table',
26202 constructor: DataTable,
26203 app: app,
26204 domProp: 'f7DataTable',
26205 });
26206 },
26207 on: {
26208 tabBeforeRemove: function tabBeforeRemove(tabEl) {
26209 var app = this;
26210 $(tabEl).find('.data-table-init').each(function (index, tableEl) {
26211 app.dataTable.destroy(tableEl);
26212 });
26213 },
26214 tabMounted: function tabMounted(tabEl) {
26215 var app = this;
26216 $(tabEl).find('.data-table-init').each(function (index, tableEl) {
26217 app.dataTable.create({ el: tableEl });
26218 });
26219 },
26220 pageBeforeRemove: function pageBeforeRemove(page) {
26221 var app = this;
26222 page.$el.find('.data-table-init').each(function (index, tableEl) {
26223 app.dataTable.destroy(tableEl);
26224 });
26225 },
26226 pageInit: function pageInit(page) {
26227 var app = this;
26228 page.$el.find('.data-table-init').each(function (index, tableEl) {
26229 app.dataTable.create({ el: tableEl });
26230 });
26231 },
26232 },
26233 vnode: {
26234 'data-table-init': {
26235 insert: function insert(vnode) {
26236 var app = this;
26237 var tableEl = vnode.elm;
26238 app.dataTable.create({ el: tableEl });
26239 },
26240 destroy: function destroy(vnode) {
26241 var app = this;
26242 var tableEl = vnode.elm;
26243 app.dataTable.destroy(tableEl);
26244 },
26245 },
26246 },
26247 };
26248
26249 var Fab = {
26250 morphOpen: function morphOpen(fabEl, targetEl) {
26251 var app = this;
26252 var $fabEl = $(fabEl);
26253 var $targetEl = $(targetEl);
26254 if ($targetEl.length === 0) { return; }
26255
26256 $targetEl.transition(0).addClass('fab-morph-target-visible');
26257 var target = {
26258 width: $targetEl[0].offsetWidth,
26259 height: $targetEl[0].offsetHeight,
26260 offset: $targetEl.offset(),
26261 borderRadius: $targetEl.css('border-radius'),
26262 zIndex: $targetEl.css('z-index'),
26263 };
26264 var fab = {
26265 width: $fabEl[0].offsetWidth,
26266 height: $fabEl[0].offsetHeight,
26267 offset: $fabEl.offset(),
26268 translateX: Utils.getTranslate($fabEl[0], 'x'),
26269 translateY: Utils.getTranslate($fabEl[0], 'y'),
26270 };
26271
26272 $fabEl[0].f7FabMorphData = {
26273 $targetEl: $targetEl,
26274 target: target,
26275 fab: fab,
26276 };
26277
26278 var diffX = (fab.offset.left + (fab.width / 2))
26279 - (target.offset.left + (target.width / 2))
26280 - fab.translateX;
26281 var diffY = (fab.offset.top + (fab.height / 2))
26282 - (target.offset.top + (target.height / 2))
26283 - fab.translateY;
26284 var scaleX = target.width / fab.width;
26285 var scaleY = target.height / fab.height;
26286
26287 var borderRadius = Math.ceil(parseInt(target.borderRadius, 10) / Math.max(scaleX, scaleY));
26288 if (borderRadius > 0) { borderRadius += 2; }
26289
26290 $fabEl[0].f7FabMorphResizeHandler = function resizeHandler() {
26291 $fabEl.transition(0).transform('');
26292 $targetEl.transition(0);
26293 target.width = $targetEl[0].offsetWidth;
26294 target.height = $targetEl[0].offsetHeight;
26295 target.offset = $targetEl.offset();
26296 fab.offset = $fabEl.offset();
26297
26298 var diffXNew = (fab.offset.left + (fab.width / 2))
26299 - (target.offset.left + (target.width / 2))
26300 - fab.translateX;
26301 var diffYNew = (fab.offset.top + (fab.height / 2))
26302 - (target.offset.top + (target.height / 2))
26303 - fab.translateY;
26304 var scaleXNew = target.width / fab.width;
26305 var scaleYNew = target.height / fab.height;
26306
26307 $fabEl.transform(("translate3d(" + (-diffXNew) + "px, " + (-diffYNew) + "px, 0) scale(" + scaleXNew + ", " + scaleYNew + ")"));
26308 };
26309
26310 $targetEl
26311 .css('opacity', 0)
26312 .transform(("scale(" + (1 / scaleX) + ", " + (1 / scaleY) + ")"));
26313 $fabEl
26314 .addClass('fab-opened')
26315 .css('z-index', target.zIndex - 1)
26316 .transform(("translate3d(" + (-diffX) + "px, " + (-diffY) + "px, 0)"));
26317 $fabEl.transitionEnd(function () {
26318 $targetEl.transition('');
26319 Utils.nextFrame(function () {
26320 $targetEl.css('opacity', 1).transform('scale(1,1)');
26321 $fabEl
26322 .transform(("translate3d(" + (-diffX) + "px, " + (-diffY) + "px, 0) scale(" + scaleX + ", " + scaleY + ")"))
26323 .css('border-radius', (borderRadius + "px"))
26324 .css('box-shadow', 'none');
26325 });
26326 app.on('resize', $fabEl[0].f7FabMorphResizeHandler);
26327 if ($targetEl.parents('.page-content').length > 0) {
26328 $targetEl.parents('.page-content').on('scroll', $fabEl[0].f7FabMorphResizeHandler);
26329 }
26330 });
26331 },
26332 morphClose: function morphClose(fabEl) {
26333 var app = this;
26334 var $fabEl = $(fabEl);
26335 var morphData = $fabEl[0].f7FabMorphData;
26336 if (!morphData) { return; }
26337 var $targetEl = morphData.$targetEl;
26338 var target = morphData.target;
26339 var fab = morphData.fab;
26340 if ($targetEl.length === 0) { return; }
26341
26342 var diffX = (fab.offset.left + (fab.width / 2))
26343 - (target.offset.left + (target.width / 2))
26344 - fab.translateX;
26345 var diffY = (fab.offset.top + (fab.height / 2))
26346 - (target.offset.top + (target.height / 2))
26347 - fab.translateY;
26348 var scaleX = target.width / fab.width;
26349 var scaleY = target.height / fab.height;
26350
26351 app.off('resize', $fabEl[0].f7FabMorphResizeHandler);
26352 if ($targetEl.parents('.page-content').length > 0) {
26353 $targetEl.parents('.page-content').off('scroll', $fabEl[0].f7FabMorphResizeHandler);
26354 }
26355
26356 $targetEl
26357 .css('opacity', 0)
26358 .transform(("scale(" + (1 / scaleX) + ", " + (1 / scaleY) + ")"));
26359 $fabEl
26360 .transition('')
26361 .css('box-shadow', '')
26362 .css('border-radius', '')
26363 .transform(("translate3d(" + (-diffX) + "px, " + (-diffY) + "px, 0)"));
26364 $fabEl.transitionEnd(function () {
26365 $fabEl
26366 .css('z-index', '')
26367 .removeClass('fab-opened')
26368 .transform('');
26369 Utils.nextFrame(function () {
26370 $fabEl.transitionEnd(function () {
26371 $targetEl
26372 .removeClass('fab-morph-target-visible')
26373 .css('opacity', '')
26374 .transform('')
26375 .transition('');
26376 });
26377 });
26378 });
26379 },
26380 open: function open(fabEl, targetEl) {
26381 var app = this;
26382 var $fabEl = $(fabEl).eq(0);
26383 var $buttonsEl = $fabEl.find('.fab-buttons');
26384 if (!$fabEl.length) { return; }
26385 if ($fabEl.hasClass('fab-opened')) { return; }
26386 if (!$buttonsEl.length && !$fabEl.hasClass('fab-morph')) { return; }
26387
26388 if (app.fab.openedEl) {
26389 if (app.fab.openedEl === $fabEl[0]) { return; }
26390 app.fab.close(app.fab.openedEl);
26391 }
26392 app.fab.openedEl = $fabEl[0];
26393 if ($fabEl.hasClass('fab-morph')) {
26394 app.fab.morphOpen($fabEl, targetEl || $fabEl.attr('data-morph-to'));
26395 } else {
26396 $fabEl.addClass('fab-opened');
26397 }
26398 $fabEl.trigger('fab:open');
26399 },
26400 close: function close(fabEl) {
26401 if ( fabEl === void 0 ) fabEl = '.fab-opened';
26402
26403 var app = this;
26404 var $fabEl = $(fabEl).eq(0);
26405 var $buttonsEl = $fabEl.find('.fab-buttons');
26406 if (!$fabEl.length) { return; }
26407 if (!$fabEl.hasClass('fab-opened')) { return; }
26408 if (!$buttonsEl.length && !$fabEl.hasClass('fab-morph')) { return; }
26409 app.fab.openedEl = null;
26410 if ($fabEl.hasClass('fab-morph')) {
26411 app.fab.morphClose($fabEl);
26412 } else {
26413 $fabEl.removeClass('fab-opened');
26414 }
26415 $fabEl.trigger('fab:close');
26416 },
26417 toggle: function toggle(fabEl) {
26418 var app = this;
26419 var $fabEl = $(fabEl);
26420 if (!$fabEl.hasClass('fab-opened')) { app.fab.open(fabEl); }
26421 else { app.fab.close(fabEl); }
26422 },
26423 };
26424
26425 var Fab$1 = {
26426 name: 'fab',
26427 create: function create() {
26428 var app = this;
26429 Utils.extend(app, {
26430 fab: {
26431 openedEl: null,
26432 morphOpen: Fab.morphOpen.bind(app),
26433 morphClose: Fab.morphClose.bind(app),
26434 open: Fab.open.bind(app),
26435 close: Fab.close.bind(app),
26436 toggle: Fab.toggle.bind(app),
26437 },
26438 });
26439 },
26440 clicks: {
26441 '.fab > a': function open($clickedEl) {
26442 var app = this;
26443 app.fab.toggle($clickedEl.parents('.fab'));
26444 },
26445 '.fab-open': function open($clickedEl, data) {
26446 if ( data === void 0 ) data = {};
26447
26448 var app = this;
26449 app.fab.open(data.fab);
26450 },
26451 '.fab-close': function close($clickedEl, data) {
26452 if ( data === void 0 ) data = {};
26453
26454 var app = this;
26455 app.fab.close(data.fab);
26456 },
26457 },
26458 };
26459
26460 var Searchbar = /*@__PURE__*/(function (FrameworkClass) {
26461 function Searchbar(app, params) {
26462 if ( params === void 0 ) params = {};
26463
26464 FrameworkClass.call(this, params, [app]);
26465
26466 var sb = this;
26467
26468 var defaults = {
26469 el: undefined,
26470 inputEl: undefined,
26471 inputEvents: 'change input compositionend',
26472 disableButton: true,
26473 disableButtonEl: undefined,
26474 backdropEl: undefined,
26475 searchContainer: undefined, // container to search, HTMLElement or CSS selector
26476 searchItem: 'li', // single item selector, CSS selector
26477 searchIn: undefined, // where to search in item, CSS selector
26478 searchGroup: '.list-group',
26479 searchGroupTitle: '.item-divider, .list-group-title',
26480 ignore: '.searchbar-ignore',
26481 foundEl: '.searchbar-found',
26482 notFoundEl: '.searchbar-not-found',
26483 hideOnEnableEl: '.searchbar-hide-on-enable',
26484 hideOnSearchEl: '.searchbar-hide-on-search',
5d51ea26 26485 backdrop: undefined,
5309fbda
DC
26486 removeDiacritics: true,
26487 customSearch: false,
26488 hideDividers: true,
26489 hideGroups: true,
26490 disableOnBackdropClick: true,
26491 expandable: false,
5d51ea26 26492 inline: false,
5309fbda
DC
26493 };
26494
26495 // Extend defaults with modules params
26496 sb.useModulesParams(defaults);
26497
26498 sb.params = Utils.extend(defaults, params);
26499
26500 var $el = $(sb.params.el);
26501 if ($el.length === 0) { return sb; }
26502
26503 if ($el[0].f7Searchbar) { return $el[0].f7Searchbar; }
26504
26505 $el[0].f7Searchbar = sb;
26506
26507 var $pageEl;
26508 var $navbarEl = $el.parents('.navbar-inner');
26509 if ($el.parents('.page').length > 0) {
26510 $pageEl = $el.parents('.page');
26511 } else if ($navbarEl.length > 0) {
26512 $pageEl = $(app.navbar.getPageByEl($navbarEl[0]));
26513 if (!$pageEl.length) {
26514 var $currentPageEl = $el.parents('.view').find('.page-current');
26515 if ($currentPageEl[0] && $currentPageEl[0].f7Page && $currentPageEl[0].f7Page.navbarEl === $navbarEl[0]) {
26516 $pageEl = $currentPageEl;
26517 }
26518 }
26519 }
26520
26521 var $foundEl;
26522 if (params.foundEl) {
26523 $foundEl = $(params.foundEl);
26524 } else if (typeof sb.params.foundEl === 'string' && $pageEl) {
26525 $foundEl = $pageEl.find(sb.params.foundEl);
26526 }
26527
26528 var $notFoundEl;
26529 if (params.notFoundEl) {
26530 $notFoundEl = $(params.notFoundEl);
26531 } else if (typeof sb.params.notFoundEl === 'string' && $pageEl) {
26532 $notFoundEl = $pageEl.find(sb.params.notFoundEl);
26533 }
26534
26535 var $hideOnEnableEl;
26536 if (params.hideOnEnableEl) {
26537 $hideOnEnableEl = $(params.hideOnEnableEl);
26538 } else if (typeof sb.params.hideOnEnableEl === 'string' && $pageEl) {
26539 $hideOnEnableEl = $pageEl.find(sb.params.hideOnEnableEl);
26540 }
26541
26542 var $hideOnSearchEl;
26543 if (params.hideOnSearchEl) {
26544 $hideOnSearchEl = $(params.hideOnSearchEl);
26545 } else if (typeof sb.params.hideOnSearchEl === 'string' && $pageEl) {
26546 $hideOnSearchEl = $pageEl.find(sb.params.hideOnSearchEl);
26547 }
26548
5d51ea26
DC
26549
26550 var expandable = sb.params.expandable || $el.hasClass('searchbar-expandable');
26551 var inline = sb.params.inline || $el.hasClass('searchbar-inline');
26552
26553 if (typeof sb.params.backdrop === 'undefined') {
26554 if (!inline) { sb.params.backdrop = app.theme !== 'aurora'; }
26555 else { sb.params.backdrop = false; }
26556 }
26557
5309fbda
DC
26558 var $backdropEl;
26559 if (sb.params.backdrop) {
26560 if (sb.params.backdropEl) {
26561 $backdropEl = $(sb.params.backdropEl);
26562 } else if ($pageEl && $pageEl.length > 0) {
26563 $backdropEl = $pageEl.find('.searchbar-backdrop');
26564 } else {
26565 $backdropEl = $el.siblings('.searchbar-backdrop');
26566 }
26567 if ($backdropEl.length === 0) {
26568 $backdropEl = $('<div class="searchbar-backdrop"></div>');
26569 if ($pageEl && $pageEl.length) {
26570 if ($el.parents($pageEl).length > 0 && $navbarEl && $el.parents($navbarEl).length === 0) {
26571 $backdropEl.insertBefore($el);
26572 } else {
26573 $backdropEl.insertBefore($pageEl.find('.page-content').eq(0));
26574 }
26575 } else {
26576 $backdropEl.insertBefore($el);
26577 }
26578 }
26579 }
26580
26581 var $searchContainer;
26582 if (sb.params.searchContainer) {
26583 $searchContainer = $(sb.params.searchContainer);
26584 }
26585
26586 var $inputEl;
26587 if (sb.params.inputEl) {
26588 $inputEl = $(sb.params.inputEl);
26589 } else {
26590 $inputEl = $el.find('input[type="search"]').eq(0);
26591 }
26592
26593 var $disableButtonEl;
26594 if (sb.params.disableButton) {
26595 if (sb.params.disableButtonEl) {
26596 $disableButtonEl = $(sb.params.disableButtonEl);
26597 } else {
26598 $disableButtonEl = $el.find('.searchbar-disable-button');
26599 }
26600 }
26601
26602 Utils.extend(sb, {
26603 app: app,
26604 view: app.views.get($el.parents('.view')),
26605 $el: $el,
26606 el: $el[0],
26607 $backdropEl: $backdropEl,
26608 backdropEl: $backdropEl && $backdropEl[0],
26609 $searchContainer: $searchContainer,
26610 searchContainer: $searchContainer && $searchContainer[0],
26611 $inputEl: $inputEl,
26612 inputEl: $inputEl[0],
26613 $disableButtonEl: $disableButtonEl,
26614 disableButtonEl: $disableButtonEl && $disableButtonEl[0],
26615 disableButtonHasMargin: false,
26616 $pageEl: $pageEl,
26617 pageEl: $pageEl && $pageEl[0],
26618 $navbarEl: $navbarEl,
26619 navbarEl: $navbarEl && $navbarEl[0],
26620 $foundEl: $foundEl,
26621 foundEl: $foundEl && $foundEl[0],
26622 $notFoundEl: $notFoundEl,
26623 notFoundEl: $notFoundEl && $notFoundEl[0],
26624 $hideOnEnableEl: $hideOnEnableEl,
26625 hideOnEnableEl: $hideOnEnableEl && $hideOnEnableEl[0],
26626 $hideOnSearchEl: $hideOnSearchEl,
26627 hideOnSearchEl: $hideOnSearchEl && $hideOnSearchEl[0],
26628 previousQuery: '',
26629 query: '',
26630 isVirtualList: $searchContainer && $searchContainer.hasClass('virtual-list'),
26631 virtualList: undefined,
26632 enabled: false,
5d51ea26
DC
26633 expandable: expandable,
26634 inline: inline,
5309fbda
DC
26635 });
26636
26637 // Events
26638 function preventSubmit(e) {
26639 e.preventDefault();
26640 }
26641 function onInputFocus(e) {
26642 sb.enable(e);
26643 sb.$el.addClass('searchbar-focused');
26644 }
26645 function onInputBlur() {
26646 sb.$el.removeClass('searchbar-focused');
5d51ea26
DC
26647 if (app.theme === 'aurora' && (!$disableButtonEl || !$disableButtonEl.length || !sb.params.disableButton) && !sb.query) {
26648 sb.disable();
26649 }
5309fbda
DC
26650 }
26651 function onInputChange() {
26652 var value = sb.$inputEl.val().trim();
26653 if (
26654 (
26655 (sb.$searchContainer && sb.$searchContainer.length > 0)
26656 && (sb.params.searchIn || sb.isVirtualList || sb.params.searchIn === sb.params.searchItem)
26657 )
26658 || sb.params.customSearch
26659 ) {
26660 sb.search(value, true);
26661 }
26662 }
26663 function onInputClear(e, previousValue) {
26664 sb.$el.trigger('searchbar:clear', previousValue);
26665 sb.emit('local::clear searchbarClear', sb, previousValue);
26666 }
26667 function disableOnClick(e) {
26668 sb.disable(e);
26669 }
26670 function onPageBeforeOut() {
26671 if (!sb || (sb && !sb.$el)) { return; }
26672 if (sb.enabled) {
26673 sb.$el.removeClass('searchbar-enabled');
26674 if (sb.expandable) {
26675 sb.$el.parents('.navbar-inner').removeClass('with-searchbar-expandable-enabled');
26676 }
26677 }
26678 }
26679 function onPageBeforeIn() {
26680 if (!sb || (sb && !sb.$el)) { return; }
26681 if (sb.enabled) {
26682 sb.$el.addClass('searchbar-enabled');
26683 if (sb.expandable) {
26684 sb.$el.parents('.navbar-inner').addClass('with-searchbar-expandable-enabled');
26685 }
26686 }
26687 }
26688 sb.attachEvents = function attachEvents() {
26689 $el.on('submit', preventSubmit);
26690 if (sb.params.disableButton) {
26691 sb.$disableButtonEl.on('click', disableOnClick);
26692 }
26693 if (sb.params.disableOnBackdropClick && sb.$backdropEl) {
26694 sb.$backdropEl.on('click', disableOnClick);
26695 }
26696 if (sb.expandable && app.theme === 'ios' && sb.view && $navbarEl.length && sb.$pageEl) {
26697 sb.$pageEl.on('page:beforeout', onPageBeforeOut);
26698 sb.$pageEl.on('page:beforein', onPageBeforeIn);
26699 }
26700 sb.$inputEl.on('focus', onInputFocus);
26701 sb.$inputEl.on('blur', onInputBlur);
26702 sb.$inputEl.on(sb.params.inputEvents, onInputChange);
26703 sb.$inputEl.on('input:clear', onInputClear);
26704 };
26705 sb.detachEvents = function detachEvents() {
26706 $el.off('submit', preventSubmit);
26707 if (sb.params.disableButton) {
26708 sb.$disableButtonEl.off('click', disableOnClick);
26709 }
26710 if (sb.params.disableOnBackdropClick && sb.$backdropEl) {
26711 sb.$backdropEl.off('click', disableOnClick);
26712 }
26713 if (sb.expandable && app.theme === 'ios' && sb.view && $navbarEl.length && sb.$pageEl) {
26714 sb.$pageEl.off('page:beforeout', onPageBeforeOut);
26715 sb.$pageEl.off('page:beforein', onPageBeforeIn);
26716 }
26717 sb.$inputEl.off('focus', onInputFocus);
26718 sb.$inputEl.off('blur', onInputBlur);
26719 sb.$inputEl.off(sb.params.inputEvents, onInputChange);
26720 sb.$inputEl.off('input:clear', onInputClear);
26721 };
26722
26723 // Install Modules
26724 sb.useModules();
26725
26726 // Init
26727 sb.init();
26728
26729 return sb;
26730 }
26731
26732 if ( FrameworkClass ) Searchbar.__proto__ = FrameworkClass;
26733 Searchbar.prototype = Object.create( FrameworkClass && FrameworkClass.prototype );
26734 Searchbar.prototype.constructor = Searchbar;
26735
26736 Searchbar.prototype.clear = function clear (e) {
26737 var sb = this;
26738 if (!sb.query && e && $(e.target).hasClass('searchbar-clear')) {
26739 sb.disable();
26740 return sb;
26741 }
26742 var previousQuery = sb.value;
26743 sb.$inputEl.val('').trigger('change').focus();
26744 sb.$el.trigger('searchbar:clear', previousQuery);
26745 sb.emit('local::clear searchbarClear', sb, previousQuery);
26746 return sb;
26747 };
26748
26749 Searchbar.prototype.setDisableButtonMargin = function setDisableButtonMargin () {
26750 var sb = this;
26751 if (sb.expandable) { return; }
26752 var app = sb.app;
26753 sb.$disableButtonEl.transition(0).show();
26754 sb.$disableButtonEl.css(("margin-" + (app.rtl ? 'left' : 'right')), ((-sb.disableButtonEl.offsetWidth) + "px"));
26755 /* eslint no-underscore-dangle: ["error", { "allow": ["_clientLeft"] }] */
26756 sb._clientLeft = sb.$disableButtonEl[0].clientLeft;
26757 sb.$disableButtonEl.transition('');
26758 sb.disableButtonHasMargin = true;
26759 };
26760
26761 Searchbar.prototype.enable = function enable (setFocus) {
26762 var sb = this;
26763 if (sb.enabled) { return sb; }
26764 var app = sb.app;
26765 sb.enabled = true;
26766 function enable() {
26767 if (sb.$backdropEl && ((sb.$searchContainer && sb.$searchContainer.length) || sb.params.customSearch) && !sb.$el.hasClass('searchbar-enabled') && !sb.query) {
26768 sb.backdropShow();
26769 }
26770 sb.$el.addClass('searchbar-enabled');
26771 if (!sb.$disableButtonEl || (sb.$disableButtonEl && sb.$disableButtonEl.length === 0)) {
26772 sb.$el.addClass('searchbar-enabled-no-disable-button');
26773 }
5d51ea26 26774 if (!sb.expandable && sb.$disableButtonEl && sb.$disableButtonEl.length > 0 && app.theme !== 'md') {
5309fbda
DC
26775 if (!sb.disableButtonHasMargin) {
26776 sb.setDisableButtonMargin();
26777 }
26778 sb.$disableButtonEl.css(("margin-" + (app.rtl ? 'left' : 'right')), '0px');
26779 }
26780 if (sb.expandable) {
26781 if (sb.$el.parents('.navbar-inner').hasClass('navbar-inner-large') && sb.$pageEl) {
26782 sb.$pageEl.find('.page-content').addClass('with-searchbar-expandable-enabled');
26783 }
26784 if (app.theme === 'md' && sb.$el.parent('.navbar-inner').parent('.navbar').length) {
26785 sb.$el.parent('.navbar-inner').parent('.navbar').addClass('with-searchbar-expandable-enabled');
26786 } else {
26787 sb.$el.parent('.navbar-inner').addClass('with-searchbar-expandable-enabled');
26788 sb.$el.parent('.navbar-inner-large').addClass('navbar-inner-large-collapsed');
26789 }
26790 }
26791 if (sb.$hideOnEnableEl) { sb.$hideOnEnableEl.addClass('hidden-by-searchbar'); }
26792 sb.$el.trigger('searchbar:enable');
26793 sb.emit('local::enable searchbarEnable', sb);
26794 }
26795 var needsFocus = false;
26796 if (setFocus === true) {
26797 if (doc.activeElement !== sb.inputEl) {
26798 needsFocus = true;
26799 }
26800 }
26801 var isIos = app.device.ios && app.theme === 'ios';
26802 if (isIos) {
26803 if (sb.expandable) {
26804 if (needsFocus) { sb.$inputEl.focus(); }
26805 enable();
26806 } else {
26807 if (needsFocus) { sb.$inputEl.focus(); }
26808 if (setFocus && (setFocus.type === 'focus' || setFocus === true)) {
26809 Utils.nextTick(function () {
26810 enable();
26811 }, 400);
26812 } else {
26813 enable();
26814 }
26815 }
26816 } else {
26817 if (needsFocus) { sb.$inputEl.focus(); }
26818 if (app.theme === 'md' && sb.expandable) {
26819 sb.$el.parents('.page, .view, .navbar-inner').scrollLeft(0);
26820 }
26821 enable();
26822 }
26823 return sb;
26824 };
26825
26826 Searchbar.prototype.disable = function disable () {
26827 var sb = this;
26828 if (!sb.enabled) { return sb; }
26829 var app = sb.app;
26830 sb.$inputEl.val('').trigger('change');
26831 sb.$el.removeClass('searchbar-enabled searchbar-focused searchbar-enabled-no-disable-button');
26832 if (sb.expandable) {
26833 if (sb.$el.parents('.navbar-inner').hasClass('navbar-inner-large') && sb.$pageEl) {
26834 sb.$pageEl.find('.page-content').removeClass('with-searchbar-expandable-enabled');
26835 }
26836 if (app.theme === 'md' && sb.$el.parent('.navbar-inner').parent('.navbar').length) {
26837 sb.$el.parent('.navbar-inner').parent('.navbar').removeClass('with-searchbar-expandable-enabled');
26838 } else {
26839 sb.$el.parent('.navbar-inner').removeClass('with-searchbar-expandable-enabled');
26840 if (sb.$pageEl) {
26841 sb.$pageEl.find('.page-content').trigger('scroll');
26842 }
26843 }
26844 }
5d51ea26 26845 if (!sb.expandable && sb.$disableButtonEl && sb.$disableButtonEl.length > 0 && app.theme !== 'md') {
5309fbda
DC
26846 sb.$disableButtonEl.css(("margin-" + (app.rtl ? 'left' : 'right')), ((-sb.disableButtonEl.offsetWidth) + "px"));
26847 }
26848 if (sb.$backdropEl && ((sb.$searchContainer && sb.$searchContainer.length) || sb.params.customSearch)) {
26849 sb.backdropHide();
26850 }
26851
26852 sb.enabled = false;
26853
26854 sb.$inputEl.blur();
26855
26856 if (sb.$hideOnEnableEl) { sb.$hideOnEnableEl.removeClass('hidden-by-searchbar'); }
26857
26858 sb.$el.trigger('searchbar:disable');
26859 sb.emit('local::disable searchbarDisable', sb);
26860 return sb;
26861 };
26862
26863 Searchbar.prototype.toggle = function toggle () {
26864 var sb = this;
26865 if (sb.enabled) { sb.disable(); }
26866 else { sb.enable(true); }
26867 return sb;
26868 };
26869
26870 Searchbar.prototype.backdropShow = function backdropShow () {
26871 var sb = this;
26872 if (sb.$backdropEl) {
26873 sb.$backdropEl.addClass('searchbar-backdrop-in');
26874 }
26875 return sb;
26876 };
26877
26878 Searchbar.prototype.backdropHide = function backdropHide () {
26879 var sb = this;
26880 if (sb.$backdropEl) {
26881 sb.$backdropEl.removeClass('searchbar-backdrop-in');
26882 }
26883 return sb;
26884 };
26885
26886 Searchbar.prototype.search = function search (query, internal) {
26887 var sb = this;
26888 sb.previousQuery = sb.query || '';
26889 if (query === sb.previousQuery) { return sb; }
26890
26891 if (!internal) {
26892 if (!sb.enabled) {
26893 sb.enable();
26894 }
26895 sb.$inputEl.val(query);
26896 sb.$inputEl.trigger('input');
26897 }
26898 sb.query = query;
26899 sb.value = query;
26900
26901 var $searchContainer = sb.$searchContainer;
26902 var $el = sb.$el;
26903 var $foundEl = sb.$foundEl;
26904 var $notFoundEl = sb.$notFoundEl;
26905 var $hideOnSearchEl = sb.$hideOnSearchEl;
26906 var isVirtualList = sb.isVirtualList;
26907
26908 // Hide on search element
26909 if (query.length > 0 && $hideOnSearchEl) {
26910 $hideOnSearchEl.addClass('hidden-by-searchbar');
26911 } else if ($hideOnSearchEl) {
26912 $hideOnSearchEl.removeClass('hidden-by-searchbar');
26913 }
26914 // Add active/inactive classes on overlay
26915 if (
26916 ($searchContainer && $searchContainer.length && $el.hasClass('searchbar-enabled'))
26917 || (sb.params.customSearch && $el.hasClass('searchbar-enabled'))
26918 ) {
26919 if (query.length === 0) {
26920 sb.backdropShow();
26921 } else {
26922 sb.backdropHide();
26923 }
26924 }
26925
26926 if (sb.params.customSearch) {
26927 $el.trigger('searchbar:search', query, sb.previousQuery);
26928 sb.emit('local::search searchbarSearch', sb, query, sb.previousQuery);
26929 return sb;
26930 }
26931
26932 var foundItems = [];
26933 var vlQuery;
26934 if (isVirtualList) {
26935 sb.virtualList = $searchContainer[0].f7VirtualList;
26936 if (query.trim() === '') {
26937 sb.virtualList.resetFilter();
26938 if ($notFoundEl) { $notFoundEl.hide(); }
26939 if ($foundEl) { $foundEl.show(); }
26940 $el.trigger('searchbar:search', query, sb.previousQuery);
26941 sb.emit('local::search searchbarSearch', sb, query, sb.previousQuery);
26942 return sb;
26943 }
26944 vlQuery = sb.params.removeDiacritics ? Utils.removeDiacritics(query) : query;
26945 if (sb.virtualList.params.searchAll) {
26946 foundItems = sb.virtualList.params.searchAll(vlQuery, sb.virtualList.items) || [];
26947 } else if (sb.virtualList.params.searchByItem) {
26948 for (var i = 0; i < sb.virtualList.items.length; i += 1) {
26949 if (sb.virtualList.params.searchByItem(vlQuery, sb.virtualList.params.items[i], i)) {
26950 foundItems.push(i);
26951 }
26952 }
26953 }
26954 } else {
26955 var values;
26956 if (sb.params.removeDiacritics) { values = Utils.removeDiacritics(query.trim().toLowerCase()).split(' '); }
26957 else {
26958 values = query.trim().toLowerCase().split(' ');
26959 }
26960 $searchContainer.find(sb.params.searchItem).removeClass('hidden-by-searchbar').each(function (itemIndex, itemEl) {
26961 var $itemEl = $(itemEl);
26962 var compareWithText = [];
26963 var $searchIn = sb.params.searchIn ? $itemEl.find(sb.params.searchIn) : $itemEl;
26964 if (sb.params.searchIn === sb.params.searchItem) {
26965 $searchIn = $itemEl;
26966 }
26967 $searchIn.each(function (searchInIndex, searchInEl) {
26968 var itemText = $(searchInEl).text().trim().toLowerCase();
26969 if (sb.params.removeDiacritics) { itemText = Utils.removeDiacritics(itemText); }
26970 compareWithText.push(itemText);
26971 });
26972 compareWithText = compareWithText.join(' ');
26973 var wordsMatch = 0;
26974 for (var i = 0; i < values.length; i += 1) {
26975 if (compareWithText.indexOf(values[i]) >= 0) { wordsMatch += 1; }
26976 }
26977 if (wordsMatch !== values.length && !(sb.params.ignore && $itemEl.is(sb.params.ignore))) {
26978 $itemEl.addClass('hidden-by-searchbar');
26979 } else {
26980 foundItems.push($itemEl[0]);
26981 }
26982 });
26983
26984 if (sb.params.hideDividers) {
26985 $searchContainer.find(sb.params.searchGroupTitle).each(function (titleIndex, titleEl) {
26986 var $titleEl = $(titleEl);
26987 var $nextElements = $titleEl.nextAll(sb.params.searchItem);
26988 var hide = true;
26989 for (var i = 0; i < $nextElements.length; i += 1) {
26990 var $nextEl = $nextElements.eq(i);
26991 if ($nextEl.is(sb.params.searchGroupTitle)) { break; }
26992 if (!$nextEl.hasClass('hidden-by-searchbar')) {
26993 hide = false;
26994 }
26995 }
26996 var ignore = sb.params.ignore && $titleEl.is(sb.params.ignore);
26997 if (hide && !ignore) { $titleEl.addClass('hidden-by-searchbar'); }
26998 else { $titleEl.removeClass('hidden-by-searchbar'); }
26999 });
27000 }
27001 if (sb.params.hideGroups) {
27002 $searchContainer.find(sb.params.searchGroup).each(function (groupIndex, groupEl) {
27003 var $groupEl = $(groupEl);
27004 var ignore = sb.params.ignore && $groupEl.is(sb.params.ignore);
27005 // eslint-disable-next-line
27006 var notHidden = $groupEl.find(sb.params.searchItem).filter(function (index, el) {
27007 return !$(el).hasClass('hidden-by-searchbar');
27008 });
27009 if (notHidden.length === 0 && !ignore) {
27010 $groupEl.addClass('hidden-by-searchbar');
27011 } else {
27012 $groupEl.removeClass('hidden-by-searchbar');
27013 }
27014 });
27015 }
27016 }
27017
27018 if (foundItems.length === 0) {
27019 if ($notFoundEl) { $notFoundEl.show(); }
27020 if ($foundEl) { $foundEl.hide(); }
27021 } else {
27022 if ($notFoundEl) { $notFoundEl.hide(); }
27023 if ($foundEl) { $foundEl.show(); }
27024 }
27025 if (isVirtualList && sb.virtualList) {
27026 sb.virtualList.filterItems(foundItems);
27027 }
27028
27029 $el.trigger('searchbar:search', query, sb.previousQuery, foundItems);
27030 sb.emit('local::search searchbarSearch', sb, query, sb.previousQuery, foundItems);
27031
27032 return sb;
27033 };
27034
27035 Searchbar.prototype.init = function init () {
27036 var sb = this;
5d51ea26
DC
27037 if (sb.expandable && sb.$el) { sb.$el.addClass('searchbar-expandable'); }
27038 if (sb.inline && sb.$el) { sb.$el.addClass('searchbar-inline'); }
5309fbda
DC
27039 sb.attachEvents();
27040 };
27041
27042 Searchbar.prototype.destroy = function destroy () {
27043 var sb = this;
27044 sb.emit('local::beforeDestroy searchbarBeforeDestroy', sb);
27045 sb.$el.trigger('searchbar:beforedestroy', sb);
27046 sb.detachEvents();
27047 if (sb.$el[0]) {
27048 sb.$el[0].f7Searchbar = null;
27049 delete sb.$el[0].f7Searchbar;
27050 }
27051 Utils.deleteProps(sb);
27052 };
27053
27054 return Searchbar;
27055 }(Framework7Class));
27056
27057 var Searchbar$1 = {
27058 name: 'searchbar',
27059 static: {
27060 Searchbar: Searchbar,
27061 },
27062 create: function create() {
27063 var app = this;
27064 app.searchbar = ConstructorMethods({
27065 defaultSelector: '.searchbar',
27066 constructor: Searchbar,
27067 app: app,
27068 domProp: 'f7Searchbar',
27069 addMethods: 'clear enable disable toggle search'.split(' '),
27070 });
27071 },
27072 on: {
27073 tabMounted: function tabMounted(tabEl) {
27074 var app = this;
27075 $(tabEl).find('.searchbar-init').each(function (index, searchbarEl) {
27076 var $searchbarEl = $(searchbarEl);
27077 app.searchbar.create(Utils.extend($searchbarEl.dataset(), { el: searchbarEl }));
27078 });
27079 },
27080 tabBeforeRemove: function tabBeforeRemove(tabEl) {
27081 $(tabEl).find('.searchbar-init').each(function (index, searchbarEl) {
27082 if (searchbarEl.f7Searchbar && searchbarEl.f7Searchbar.destroy) {
27083 searchbarEl.f7Searchbar.destroy();
27084 }
27085 });
27086 },
27087 pageInit: function pageInit(page) {
27088 var app = this;
27089 page.$el.find('.searchbar-init').each(function (index, searchbarEl) {
27090 var $searchbarEl = $(searchbarEl);
27091 app.searchbar.create(Utils.extend($searchbarEl.dataset(), { el: searchbarEl }));
27092 });
27093 if (app.theme === 'ios' && page.view && page.view.router.separateNavbar && page.$navbarEl && page.$navbarEl.length > 0) {
27094 page.$navbarEl.find('.searchbar-init').each(function (index, searchbarEl) {
27095 var $searchbarEl = $(searchbarEl);
27096 app.searchbar.create(Utils.extend($searchbarEl.dataset(), { el: searchbarEl }));
27097 });
27098 }
27099 },
27100 pageBeforeRemove: function pageBeforeRemove(page) {
27101 var app = this;
27102 page.$el.find('.searchbar-init').each(function (index, searchbarEl) {
27103 if (searchbarEl.f7Searchbar && searchbarEl.f7Searchbar.destroy) {
27104 searchbarEl.f7Searchbar.destroy();
27105 }
27106 });
27107 if (app.theme === 'ios' && page.view && page.view.router.separateNavbar && page.$navbarEl && page.$navbarEl.length > 0) {
27108 page.$navbarEl.find('.searchbar-init').each(function (index, searchbarEl) {
27109 if (searchbarEl.f7Searchbar && searchbarEl.f7Searchbar.destroy) {
27110 searchbarEl.f7Searchbar.destroy();
27111 }
27112 });
27113 }
27114 },
27115 },
27116 clicks: {
27117 '.searchbar-clear': function clear($clickedEl, data) {
27118 if ( data === void 0 ) data = {};
27119
27120 var app = this;
27121 var sb = app.searchbar.get(data.searchbar);
27122 if (sb) { sb.clear(); }
27123 },
27124 '.searchbar-enable': function enable($clickedEl, data) {
27125 if ( data === void 0 ) data = {};
27126
27127 var app = this;
27128 var sb = app.searchbar.get(data.searchbar);
27129 if (sb) { sb.enable(true); }
27130 },
27131 '.searchbar-disable': function disable($clickedEl, data) {
27132 if ( data === void 0 ) data = {};
27133
27134 var app = this;
27135 var sb = app.searchbar.get(data.searchbar);
27136 if (sb) { sb.disable(); }
27137 },
27138 '.searchbar-toggle': function toggle($clickedEl, data) {
27139 if ( data === void 0 ) data = {};
27140
27141 var app = this;
27142 var sb = app.searchbar.get(data.searchbar);
27143 if (sb) { sb.toggle(); }
27144 },
27145 },
27146 vnode: {
27147 'searchbar-init': {
27148 insert: function insert(vnode) {
27149 var app = this;
27150 var searchbarEl = vnode.elm;
27151 var $searchbarEl = $(searchbarEl);
27152 app.searchbar.create(Utils.extend($searchbarEl.dataset(), { el: searchbarEl }));
27153 },
27154 destroy: function destroy(vnode) {
27155 var searchbarEl = vnode.elm;
27156 if (searchbarEl.f7Searchbar && searchbarEl.f7Searchbar.destroy) {
27157 searchbarEl.f7Searchbar.destroy();
27158 }
27159 },
27160 },
27161 },
27162 };
27163
5d51ea26 27164 var Messages = /*@__PURE__*/(function (Framework7Class) {
5309fbda
DC
27165 function Messages(app, params) {
27166 if ( params === void 0 ) params = {};
27167
5d51ea26 27168 Framework7Class.call(this, params, [app]);
5309fbda
DC
27169
27170 var m = this;
27171
27172 var defaults = {
27173 autoLayout: true,
27174 messages: [],
27175 newMessagesFirst: false,
27176 scrollMessages: true,
27177 scrollMessagesOnEdge: true,
27178 firstMessageRule: undefined,
27179 lastMessageRule: undefined,
27180 tailMessageRule: undefined,
27181 sameNameMessageRule: undefined,
27182 sameHeaderMessageRule: undefined,
27183 sameFooterMessageRule: undefined,
27184 sameAvatarMessageRule: undefined,
27185 customClassMessageRule: undefined,
27186 renderMessage: undefined,
27187 };
27188
27189 // Extend defaults with modules params
27190 m.useModulesParams(defaults);
27191
27192 m.params = Utils.extend(defaults, params);
27193
27194 var $el = $(params.el).eq(0);
27195 if ($el.length === 0) { return m; }
27196
27197 if ($el[0].f7Messages) { return $el[0].f7Messages; }
27198
27199 $el[0].f7Messages = m;
27200
27201 var $pageContentEl = $el.closest('.page-content').eq(0);
27202
27203 Utils.extend(m, {
27204 messages: m.params.messages,
27205 $el: $el,
27206 el: $el[0],
27207 $pageContentEl: $pageContentEl,
27208 pageContentEl: $pageContentEl[0],
27209
27210 });
27211 // Install Modules
27212 m.useModules();
27213
27214 // Init
27215 m.init();
27216
27217 return m;
27218 }
27219
5d51ea26
DC
27220 if ( Framework7Class ) Messages.__proto__ = Framework7Class;
27221 Messages.prototype = Object.create( Framework7Class && Framework7Class.prototype );
5309fbda
DC
27222 Messages.prototype.constructor = Messages;
27223 // eslint-disable-next-line
27224 Messages.prototype.getMessageData = function getMessageData (messageEl) {
27225 var $messageEl = $(messageEl);
27226 var data = {
27227 name: $messageEl.find('.message-name').html(),
27228 header: $messageEl.find('.message-header').html(),
27229 textHeader: $messageEl.find('.message-text-header').html(),
27230 textFooter: $messageEl.find('.message-text-footer').html(),
27231 footer: $messageEl.find('.message-footer').html(),
27232 isTitle: $messageEl.hasClass('messages-title'),
27233 type: $messageEl.hasClass('message-sent') ? 'sent' : 'received',
27234 text: $messageEl.find('.message-text').html(),
27235 image: $messageEl.find('.message-image').html(),
27236 imageSrc: $messageEl.find('.message-image img').attr('src'),
27237 typing: $messageEl.hasClass('message-typing'),
27238 };
27239 if (data.isTitle) {
27240 data.text = $messageEl.html();
27241 }
27242 if (data.text && data.textHeader) {
27243 data.text = data.text.replace(("<div class=\"message-text-header\">" + (data.textHeader) + "</div>"), '');
27244 }
27245 if (data.text && data.textFooter) {
27246 data.text = data.text.replace(("<div class=\"message-text-footer\">" + (data.textFooter) + "</div>"), '');
27247 }
27248 var avatar = $messageEl.find('.message-avatar').css('background-image');
27249 if (avatar === 'none' || avatar === '') { avatar = undefined; }
27250 if (avatar && typeof avatar === 'string') {
27251 avatar = avatar.replace('url(', '').replace(')', '').replace(/"/g, '').replace(/'/g, '');
27252 } else {
27253 avatar = undefined;
27254 }
27255 data.avatar = avatar;
27256
27257 return data;
27258 };
27259
27260 Messages.prototype.getMessagesData = function getMessagesData () {
27261 var m = this;
27262 var data = [];
27263 m.$el.find('.message, .messages-title').each(function (index, messageEl) {
27264 data.push(m.getMessageData(messageEl));
27265 });
27266 return data;
27267 };
27268
27269 Messages.prototype.renderMessage = function renderMessage (messageToRender) {
27270 var m = this;
27271 var message = Utils.extend({
27272 type: 'sent',
27273 attrs: {},
27274 }, messageToRender);
27275 if (m.params.renderMessage) {
27276 return m.params.renderMessage.call(m, message);
27277 }
27278 if (message.isTitle) {
27279 return ("<div class=\"messages-title\">" + (message.text) + "</div>");
27280 }
27281 var attrs = Object.keys(message.attrs).map(function (attr) { return (attr + "=\"" + (message.attrs[attr]) + "\""); }).join(' ');
27282 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 ");
27283 };
27284
27285 Messages.prototype.renderMessages = function renderMessages (messagesToRender, method) {
27286 if ( messagesToRender === void 0 ) messagesToRender = this.messages;
27287 if ( method === void 0 ) method = this.params.newMessagesFirst ? 'prepend' : 'append';
27288
27289 var m = this;
27290 var html = messagesToRender.map(function (message) { return m.renderMessage(message); }).join('');
27291 m.$el[method](html);
27292 };
27293
27294 Messages.prototype.isFirstMessage = function isFirstMessage () {
27295 var ref;
27296
27297 var args = [], len = arguments.length;
27298 while ( len-- ) args[ len ] = arguments[ len ];
27299 var m = this;
27300 if (m.params.firstMessageRule) { return (ref = m.params).firstMessageRule.apply(ref, args); }
27301 return false;
27302 };
27303
27304 Messages.prototype.isLastMessage = function isLastMessage () {
27305 var ref;
27306
27307 var args = [], len = arguments.length;
27308 while ( len-- ) args[ len ] = arguments[ len ];
27309 var m = this;
27310 if (m.params.lastMessageRule) { return (ref = m.params).lastMessageRule.apply(ref, args); }
27311 return false;
27312 };
27313
27314 Messages.prototype.isTailMessage = function isTailMessage () {
27315 var ref;
27316
27317 var args = [], len = arguments.length;
27318 while ( len-- ) args[ len ] = arguments[ len ];
27319 var m = this;
27320 if (m.params.tailMessageRule) { return (ref = m.params).tailMessageRule.apply(ref, args); }
27321 return false;
27322 };
27323
27324 Messages.prototype.isSameNameMessage = function isSameNameMessage () {
27325 var ref;
27326
27327 var args = [], len = arguments.length;
27328 while ( len-- ) args[ len ] = arguments[ len ];
27329 var m = this;
27330 if (m.params.sameNameMessageRule) { return (ref = m.params).sameNameMessageRule.apply(ref, args); }
27331 return false;
27332 };
27333
27334 Messages.prototype.isSameHeaderMessage = function isSameHeaderMessage () {
27335 var ref;
27336
27337 var args = [], len = arguments.length;
27338 while ( len-- ) args[ len ] = arguments[ len ];
27339 var m = this;
27340 if (m.params.sameHeaderMessageRule) { return (ref = m.params).sameHeaderMessageRule.apply(ref, args); }
27341 return false;
27342 };
27343
27344 Messages.prototype.isSameFooterMessage = function isSameFooterMessage () {
27345 var ref;
27346
27347 var args = [], len = arguments.length;
27348 while ( len-- ) args[ len ] = arguments[ len ];
27349 var m = this;
27350 if (m.params.sameFooterMessageRule) { return (ref = m.params).sameFooterMessageRule.apply(ref, args); }
27351 return false;
27352 };
27353
27354 Messages.prototype.isSameAvatarMessage = function isSameAvatarMessage () {
27355 var ref;
27356
27357 var args = [], len = arguments.length;
27358 while ( len-- ) args[ len ] = arguments[ len ];
27359 var m = this;
27360 if (m.params.sameAvatarMessageRule) { return (ref = m.params).sameAvatarMessageRule.apply(ref, args); }
27361 return false;
27362 };
27363
27364 Messages.prototype.isCustomClassMessage = function isCustomClassMessage () {
27365 var ref;
27366
27367 var args = [], len = arguments.length;
27368 while ( len-- ) args[ len ] = arguments[ len ];
27369 var m = this;
27370 if (m.params.customClassMessageRule) { return (ref = m.params).customClassMessageRule.apply(ref, args); }
27371 return undefined;
27372 };
27373
27374 Messages.prototype.layout = function layout () {
27375 var m = this;
27376 m.$el.find('.message, .messages-title').each(function (index, messageEl) {
27377 var $messageEl = $(messageEl);
27378 if (!m.messages) {
27379 m.messages = m.getMessagesData();
27380 }
27381 var classes = [];
27382 var message = m.messages[index];
27383 var previousMessage = m.messages[index - 1];
27384 var nextMessage = m.messages[index + 1];
27385 if (m.isFirstMessage(message, previousMessage, nextMessage)) {
27386 classes.push('message-first');
27387 }
27388 if (m.isLastMessage(message, previousMessage, nextMessage)) {
27389 classes.push('message-last');
27390 }
27391 if (m.isTailMessage(message, previousMessage, nextMessage)) {
27392 classes.push('message-tail');
27393 }
27394 if (m.isSameNameMessage(message, previousMessage, nextMessage)) {
27395 classes.push('message-same-name');
27396 }
27397 if (m.isSameHeaderMessage(message, previousMessage, nextMessage)) {
27398 classes.push('message-same-header');
27399 }
27400 if (m.isSameFooterMessage(message, previousMessage, nextMessage)) {
27401 classes.push('message-same-footer');
27402 }
27403 if (m.isSameAvatarMessage(message, previousMessage, nextMessage)) {
27404 classes.push('message-same-avatar');
27405 }
27406 var customMessageClasses = m.isCustomClassMessage(message, previousMessage, nextMessage);
27407 if (customMessageClasses && customMessageClasses.length) {
27408 if (typeof customMessageClasses === 'string') {
27409 customMessageClasses = customMessageClasses.split(' ');
27410 }
27411 customMessageClasses.forEach(function (customClass) {
27412 classes.push(customClass);
27413 });
27414 }
27415 $messageEl.removeClass('message-first message-last message-tail message-same-name message-same-header message-same-footer message-same-avatar');
27416 classes.forEach(function (className) {
27417 $messageEl.addClass(className);
27418 });
27419 });
27420 };
27421
27422 Messages.prototype.clear = function clear () {
27423 var m = this;
27424 m.messages = [];
27425 m.$el.html('');
27426 };
27427
27428 Messages.prototype.removeMessage = function removeMessage (messageToRemove, layout) {
27429 if ( layout === void 0 ) layout = true;
27430
27431 var m = this;
27432 // Index or El
27433 var index;
27434 var $el;
27435 if (typeof messageToRemove === 'number') {
27436 index = messageToRemove;
27437 $el = m.$el.find('.message, .messages-title').eq(index);
27438 } else if (m.messages && m.messages.indexOf(messageToRemove) >= 0) {
27439 index = m.messages.indexOf(messageToRemove);
27440 $el = m.$el.children().eq(index);
27441 } else {
27442 $el = $(messageToRemove);
27443 index = $el.index();
27444 }
27445 if ($el.length === 0) {
27446 return m;
27447 }
27448 $el.remove();
27449 m.messages.splice(index, 1);
27450 if (m.params.autoLayout && layout) { m.layout(); }
27451 return m;
27452 };
27453
27454 Messages.prototype.removeMessages = function removeMessages (messagesToRemove, layout) {
27455 if ( layout === void 0 ) layout = true;
27456
27457 var m = this;
27458 if (Array.isArray(messagesToRemove)) {
27459 var messagesToRemoveEls = [];
27460 messagesToRemove.forEach(function (messageToRemoveIndex) {
27461 messagesToRemoveEls.push(m.$el.find('.message, .messages-title').eq(messageToRemoveIndex));
27462 });
27463 messagesToRemoveEls.forEach(function (messageToRemove) {
27464 m.removeMessage(messageToRemove, false);
27465 });
27466 } else {
27467 $(messagesToRemove).each(function (index, messageToRemove) {
27468 m.removeMessage(messageToRemove, false);
27469 });
27470 }
27471 if (m.params.autoLayout && layout) { m.layout(); }
27472 return m;
27473 };
27474
27475 Messages.prototype.addMessage = function addMessage () {
27476 var assign, assign$1;
27477
27478 var args = [], len = arguments.length;
27479 while ( len-- ) args[ len ] = arguments[ len ];
27480 var m = this;
27481 var messageToAdd;
27482 var animate;
27483 var method;
27484 if (typeof args[1] === 'boolean') {
27485 (assign = args, messageToAdd = assign[0], animate = assign[1], method = assign[2]);
27486 } else {
27487 (assign$1 = args, messageToAdd = assign$1[0], method = assign$1[1], animate = assign$1[2]);
27488 }
27489 if (typeof animate === 'undefined') {
27490 animate = true;
27491 }
27492 if (typeof method === 'undefined') {
27493 method = m.params.newMessagesFirst ? 'prepend' : 'append';
27494 }
27495
27496 return m.addMessages([messageToAdd], animate, method);
27497 };
27498
27499 Messages.prototype.addMessages = function addMessages () {
27500 var assign, assign$1;
27501
27502 var args = [], len = arguments.length;
27503 while ( len-- ) args[ len ] = arguments[ len ];
27504 var m = this;
27505 var messagesToAdd;
27506 var animate;
27507 var method;
27508 if (typeof args[1] === 'boolean') {
27509 (assign = args, messagesToAdd = assign[0], animate = assign[1], method = assign[2]);
27510 } else {
27511 (assign$1 = args, messagesToAdd = assign$1[0], method = assign$1[1], animate = assign$1[2]);
27512 }
27513 if (typeof animate === 'undefined') {
27514 animate = true;
27515 }
27516 if (typeof method === 'undefined') {
27517 method = m.params.newMessagesFirst ? 'prepend' : 'append';
27518 }
27519
27520 // Define scroll positions before new messages added
27521 var scrollHeightBefore = m.pageContentEl.scrollHeight;
27522 var heightBefore = m.pageContentEl.offsetHeight;
27523 var scrollBefore = m.pageContentEl.scrollTop;
27524
27525 // Add message to DOM and data
27526 var messagesHTML = '';
27527 var typingMessage = m.messages.filter(function (el) { return el.isTyping; })[0];
27528 messagesToAdd.forEach(function (messageToAdd) {
27529 if (typingMessage) {
27530 if (method === 'append') {
27531 m.messages.splice(m.messages.indexOf(typingMessage), 0, messageToAdd);
27532 } else {
27533 m.messages.splice(m.messages.indexOf(typingMessage) + 1, 0, messageToAdd);
27534 }
27535 } else {
27536 m.messages[method === 'append' ? 'push' : 'unshift'](messageToAdd);
27537 }
27538 messagesHTML += m.renderMessage(messageToAdd);
27539 });
27540 var $messagesEls = $(messagesHTML);
27541 if (animate) {
27542 if (method === 'append' && !m.params.newMessagesFirst) {
27543 $messagesEls.addClass('message-appear-from-bottom');
27544 }
27545 if (method === 'prepend' && m.params.newMessagesFirst) {
27546 $messagesEls.addClass('message-appear-from-top');
27547 }
27548 }
27549 if (typingMessage) {
27550 if (method === 'append') {
27551 $messagesEls.insertBefore(m.$el.find('.message-typing'));
27552 } else {
27553 $messagesEls.insertAfter(m.$el.find('.message-typing'));
27554 }
27555 } else {
27556 m.$el[method]($messagesEls);
27557 }
27558
27559 // Layout
27560 if (m.params.autoLayout) { m.layout(); }
27561
27562 if (method === 'prepend' && !typingMessage) {
27563 m.pageContentEl.scrollTop = scrollBefore + (m.pageContentEl.scrollHeight - scrollHeightBefore);
27564 }
27565
27566 if (m.params.scrollMessages && ((method === 'append' && !m.params.newMessagesFirst) || (method === 'prepend' && m.params.newMessagesFirst && !typingMessage))) {
27567 if (m.params.scrollMessagesOnEdge) {
27568 var onEdge = false;
27569 if (m.params.newMessagesFirst && scrollBefore === 0) {
27570 onEdge = true;
27571 }
27572 if (!m.params.newMessagesFirst && (scrollBefore - (scrollHeightBefore - heightBefore) >= -10)) {
27573 onEdge = true;
27574 }
27575 if (onEdge) { m.scroll(animate ? undefined : 0); }
27576 } else {
27577 m.scroll(animate ? undefined : 0);
27578 }
27579 }
27580
27581 return m;
27582 };
27583
27584 Messages.prototype.showTyping = function showTyping (message) {
27585 if ( message === void 0 ) message = {};
27586
27587 var m = this;
27588 var typingMessage = m.messages.filter(function (el) { return el.isTyping; })[0];
27589 if (typingMessage) {
27590 m.removeMessage(m.messages.indexOf(typingMessage));
27591 }
27592 m.addMessage(Utils.extend({
27593 type: 'received',
27594 isTyping: true,
27595 }, message));
27596 return m;
27597 };
27598
27599 Messages.prototype.hideTyping = function hideTyping () {
27600 var m = this;
27601 var typingMessageIndex;
27602 var typingFound;
27603 m.messages.forEach(function (message, index) {
27604 if (message.isTyping) { typingMessageIndex = index; }
27605 });
27606 if (typeof typingMessageIndex !== 'undefined') {
27607 if (m.$el.find('.message').eq(typingMessageIndex).hasClass('message-typing')) {
27608 typingFound = true;
27609 m.removeMessage(typingMessageIndex);
27610 }
27611 }
27612 if (!typingFound) {
27613 var $typingMessageEl = m.$el.find('.message-typing');
27614 if ($typingMessageEl.length) {
27615 m.removeMessage($typingMessageEl);
27616 }
27617 }
27618 return m;
27619 };
27620
27621 Messages.prototype.scroll = function scroll (duration, scrollTop) {
27622 if ( duration === void 0 ) duration = 300;
27623
27624 var m = this;
27625 var currentScroll = m.pageContentEl.scrollTop;
27626 var newScrollTop;
27627 if (typeof scrollTop !== 'undefined') { newScrollTop = scrollTop; }
27628 else {
27629 newScrollTop = m.params.newMessagesFirst ? 0 : m.pageContentEl.scrollHeight - m.pageContentEl.offsetHeight;
27630 if (newScrollTop === currentScroll) { return m; }
27631 }
27632 m.$pageContentEl.scrollTop(newScrollTop, duration);
27633 return m;
27634 };
27635
27636 Messages.prototype.init = function init () {
27637 var m = this;
27638 if (!m.messages || m.messages.length === 0) {
27639 m.messages = m.getMessagesData();
27640 }
27641 if (m.params.messages && m.params.messages.length) {
27642 m.renderMessages();
27643 }
27644 if (m.params.autoLayout) { m.layout(); }
27645 if (m.params.scrollMessages) { m.scroll(0); }
27646 };
27647
27648 Messages.prototype.destroy = function destroy () {
27649 var m = this;
27650 m.emit('local::beforeDestroy messagesBeforeDestroy', m);
27651 m.$el.trigger('messages:beforedestroy', m);
27652 if (m.$el[0]) {
27653 m.$el[0].f7Messages = null;
27654 delete m.$el[0].f7Messages;
27655 }
27656 Utils.deleteProps(m);
27657 };
27658
27659 return Messages;
27660 }(Framework7Class));
27661
27662 var Messages$1 = {
27663 name: 'messages',
27664 static: {
27665 Messages: Messages,
27666 },
27667 create: function create() {
27668 var app = this;
27669 app.messages = ConstructorMethods({
27670 defaultSelector: '.messages',
27671 constructor: Messages,
27672 app: app,
27673 domProp: 'f7Messages',
27674 addMethods: 'renderMessages layout scroll clear removeMessage removeMessages addMessage addMessages'.split(' '),
27675 });
27676 },
27677 on: {
27678 tabBeforeRemove: function tabBeforeRemove(tabEl) {
27679 var app = this;
27680 $(tabEl).find('.messages-init').each(function (index, messagesEl) {
27681 app.messages.destroy(messagesEl);
27682 });
27683 },
27684 tabMounted: function tabMounted(tabEl) {
27685 var app = this;
27686 $(tabEl).find('.messages-init').each(function (index, messagesEl) {
27687 app.messages.create({ el: messagesEl });
27688 });
27689 },
27690 pageBeforeRemove: function pageBeforeRemove(page) {
27691 var app = this;
27692 page.$el.find('.messages-init').each(function (index, messagesEl) {
27693 app.messages.destroy(messagesEl);
27694 });
27695 },
27696 pageInit: function pageInit(page) {
27697 var app = this;
27698 page.$el.find('.messages-init').each(function (index, messagesEl) {
27699 app.messages.create({ el: messagesEl });
27700 });
27701 },
27702 },
27703 vnode: {
27704 'messages-init': {
27705 insert: function insert(vnode) {
27706 var app = this;
27707 var messagesEl = vnode.elm;
27708 app.messages.create({ el: messagesEl });
27709 },
27710 destroy: function destroy(vnode) {
27711 var app = this;
27712 var messagesEl = vnode.elm;
27713 app.messages.destroy(messagesEl);
27714 },
27715 },
27716 },
27717 };
27718
5d51ea26 27719 var Messagebar = /*@__PURE__*/(function (Framework7Class) {
5309fbda
DC
27720 function Messagebar(app, params) {
27721 if ( params === void 0 ) params = {};
27722
5d51ea26 27723 Framework7Class.call(this, params, [app]);
5309fbda
DC
27724
27725 var messagebar = this;
27726
27727 var defaults = {
27728 top: false,
27729 topOffset: 0,
27730 bottomOffset: 0,
27731 attachments: [],
27732 renderAttachments: undefined,
27733 renderAttachment: undefined,
27734 maxHeight: null,
27735 resizePage: true,
27736 };
27737
27738 // Extend defaults with modules params
27739 messagebar.useModulesParams(defaults);
27740
27741 messagebar.params = Utils.extend(defaults, params);
27742
27743 // El
27744 var $el = $(messagebar.params.el);
27745 if ($el.length === 0) { return messagebar; }
27746
27747 if ($el[0].f7Messagebar) { return $el[0].f7Messagebar; }
27748
27749 $el[0].f7Messagebar = messagebar;
27750
27751 // Page and PageContent
27752 var $pageEl = $el.parents('.page').eq(0);
27753 var $pageContentEl = $pageEl.find('.page-content').eq(0);
27754
27755 // Area
27756 var $areaEl = $el.find('.messagebar-area');
27757
27758 // Textarea
27759 var $textareaEl;
27760 if (messagebar.params.textareaEl) {
27761 $textareaEl = $(messagebar.params.textareaEl);
27762 } else {
27763 $textareaEl = $el.find('textarea');
27764 }
27765
27766 // Attachments & Library
27767 var $attachmentsEl = $el.find('.messagebar-attachments');
27768 var $sheetEl = $el.find('.messagebar-sheet');
27769
27770 if (messagebar.params.top) {
27771 $el.addClass('messagebar-top');
27772 }
27773
27774 Utils.extend(messagebar, {
27775 $el: $el,
27776 el: $el[0],
27777 $areaEl: $areaEl,
27778 areaEl: $areaEl[0],
27779 $textareaEl: $textareaEl,
27780 textareaEl: $textareaEl[0],
27781 $attachmentsEl: $attachmentsEl,
27782 attachmentsEl: $attachmentsEl[0],
27783 attachmentsVisible: $attachmentsEl.hasClass('messagebar-attachments-visible'),
27784 $sheetEl: $sheetEl,
27785 sheetEl: $sheetEl[0],
27786 sheetVisible: $sheetEl.hasClass('messagebar-sheet-visible'),
27787 $pageEl: $pageEl,
27788 pageEl: $pageEl[0],
27789 $pageContentEl: $pageContentEl,
27790 pageContentEl: $pageContentEl,
27791 top: $el.hasClass('messagebar-top') || messagebar.params.top,
27792 attachments: [],
27793 });
27794
27795 // Events
27796 function onAppResize() {
27797 if (messagebar.params.resizePage) {
27798 messagebar.resizePage();
27799 }
27800 }
27801 function onSubmit(e) {
27802 e.preventDefault();
27803 }
27804 function onAttachmentClick(e) {
27805 var index = $(this).index();
27806 if ($(e.target).closest('.messagebar-attachment-delete').length) {
27807 $(this).trigger('messagebar:attachmentdelete', index);
27808 messagebar.emit('local::attachmentDelete messagebarAttachmentDelete', messagebar, this, index);
27809 } else {
27810 $(this).trigger('messagebar:attachmentclick', index);
27811 messagebar.emit('local::attachmentClick messagebarAttachmentClick', messagebar, this, index);
27812 }
27813 }
27814 function onTextareaChange() {
27815 messagebar.checkEmptyState();
27816 messagebar.$el.trigger('messagebar:change');
27817 messagebar.emit('local::change messagebarChange', messagebar);
27818 }
27819 function onTextareaFocus() {
27820 messagebar.sheetHide();
27821 messagebar.$el.addClass('messagebar-focused');
27822 messagebar.$el.trigger('messagebar:focus');
27823 messagebar.emit('local::focus messagebarFocus', messagebar);
27824 }
27825 function onTextareaBlur() {
27826 messagebar.$el.removeClass('messagebar-focused');
27827 messagebar.$el.trigger('messagebar:blur');
27828 messagebar.emit('local::blur messagebarBlur', messagebar);
27829 }
27830
27831 messagebar.attachEvents = function attachEvents() {
27832 $el.on('textarea:resize', onAppResize);
27833 $el.on('submit', onSubmit);
27834 $el.on('click', '.messagebar-attachment', onAttachmentClick);
27835 $textareaEl.on('change input', onTextareaChange);
27836 $textareaEl.on('focus', onTextareaFocus);
27837 $textareaEl.on('blur', onTextareaBlur);
27838 app.on('resize', onAppResize);
27839 };
27840 messagebar.detachEvents = function detachEvents() {
27841 $el.off('textarea:resize', onAppResize);
27842 $el.off('submit', onSubmit);
27843 $el.off('click', '.messagebar-attachment', onAttachmentClick);
27844 $textareaEl.off('change input', onTextareaChange);
27845 $textareaEl.off('focus', onTextareaFocus);
27846 $textareaEl.off('blur', onTextareaBlur);
27847 app.off('resize', onAppResize);
27848 };
27849
27850
27851 // Install Modules
27852 messagebar.useModules();
27853
27854 // Init
27855 messagebar.init();
27856
27857 return messagebar;
27858 }
27859
5d51ea26
DC
27860 if ( Framework7Class ) Messagebar.__proto__ = Framework7Class;
27861 Messagebar.prototype = Object.create( Framework7Class && Framework7Class.prototype );
5309fbda
DC
27862 Messagebar.prototype.constructor = Messagebar;
27863
27864 Messagebar.prototype.focus = function focus () {
27865 var messagebar = this;
27866 messagebar.$textareaEl.focus();
27867 return messagebar;
27868 };
27869
27870 Messagebar.prototype.blur = function blur () {
27871 var messagebar = this;
27872 messagebar.$textareaEl.blur();
27873 return messagebar;
27874 };
27875
27876 Messagebar.prototype.clear = function clear () {
27877 var messagebar = this;
27878 messagebar.$textareaEl.val('').trigger('change');
27879 return messagebar;
27880 };
27881
27882 Messagebar.prototype.getValue = function getValue () {
27883 var messagebar = this;
27884 return messagebar.$textareaEl.val().trim();
27885 };
27886
27887 Messagebar.prototype.setValue = function setValue (value) {
27888 var messagebar = this;
27889 messagebar.$textareaEl.val(value).trigger('change');
27890 return messagebar;
27891 };
27892
27893 Messagebar.prototype.setPlaceholder = function setPlaceholder (placeholder) {
27894 var messagebar = this;
27895 messagebar.$textareaEl.attr('placeholder', placeholder);
27896 return messagebar;
27897 };
27898
27899 Messagebar.prototype.resizePage = function resizePage () {
27900 var messagebar = this;
27901 var params = messagebar.params;
27902 var $el = messagebar.$el;
27903 var top = messagebar.top;
27904 var $pageEl = messagebar.$pageEl;
27905 var $pageContentEl = messagebar.$pageContentEl;
27906 var $areaEl = messagebar.$areaEl;
27907 var $textareaEl = messagebar.$textareaEl;
27908 var $sheetEl = messagebar.$sheetEl;
27909 var $attachmentsEl = messagebar.$attachmentsEl;
27910 var elHeight = $el[0].offsetHeight;
27911 var maxHeight = params.maxHeight;
27912 if (top) ; else {
27913 var currentPaddingBottom = parseInt($pageContentEl.css('padding-bottom'), 10);
27914 var requiredPaddingBottom = elHeight + params.bottomOffset;
27915 if (requiredPaddingBottom !== currentPaddingBottom && $pageContentEl.length) {
27916 var currentPaddingTop = parseInt($pageContentEl.css('padding-top'), 10);
27917 var pageScrollHeight = $pageContentEl[0].scrollHeight;
27918 var pageOffsetHeight = $pageContentEl[0].offsetHeight;
27919 var pageScrollTop = $pageContentEl[0].scrollTop;
27920 var scrollOnBottom = (pageScrollTop === pageScrollHeight - pageOffsetHeight);
27921 if (!maxHeight) {
27922 maxHeight = $pageEl[0].offsetHeight - currentPaddingTop - $sheetEl.outerHeight() - $attachmentsEl.outerHeight() - parseInt($areaEl.css('margin-top'), 10) - parseInt($areaEl.css('margin-bottom'), 10);
27923 }
27924 $textareaEl.css('max-height', (maxHeight + "px"));
27925 $pageContentEl.css('padding-bottom', (requiredPaddingBottom + "px"));
27926 if (scrollOnBottom) {
27927 $pageContentEl.scrollTop($pageContentEl[0].scrollHeight - pageOffsetHeight);
27928 }
27929 $el.trigger('messagebar:resizepage');
27930 messagebar.emit('local::resizePage messagebarResizePage', messagebar);
27931 }
27932 }
27933 };
27934
27935 Messagebar.prototype.checkEmptyState = function checkEmptyState () {
27936 var messagebar = this;
27937 var $el = messagebar.$el;
27938 var $textareaEl = messagebar.$textareaEl;
27939 var value = $textareaEl.val().trim();
27940 if (value && value.length) {
27941 $el.addClass('messagebar-with-value');
27942 } else {
27943 $el.removeClass('messagebar-with-value');
27944 }
27945 };
27946
27947 Messagebar.prototype.attachmentsCreate = function attachmentsCreate (innerHTML) {
27948 if ( innerHTML === void 0 ) innerHTML = '';
27949
27950 var messagebar = this;
27951 var $attachmentsEl = $(("<div class=\"messagebar-attachments\">" + innerHTML + "</div>"));
27952 $attachmentsEl.insertBefore(messagebar.$textareaEl);
27953 Utils.extend(messagebar, {
27954 $attachmentsEl: $attachmentsEl,
27955 attachmentsEl: $attachmentsEl[0],
27956 });
27957 return messagebar;
27958 };
27959
27960 Messagebar.prototype.attachmentsShow = function attachmentsShow (innerHTML) {
27961 if ( innerHTML === void 0 ) innerHTML = '';
27962
27963 var messagebar = this;
27964 messagebar.$attachmentsEl = messagebar.$el.find('.messagebar-attachments');
27965 if (messagebar.$attachmentsEl.length === 0) {
27966 messagebar.attachmentsCreate(innerHTML);
27967 }
27968 messagebar.$el.addClass('messagebar-attachments-visible');
27969 messagebar.attachmentsVisible = true;
27970 if (messagebar.params.resizePage) {
27971 messagebar.resizePage();
27972 }
27973 return messagebar;
27974 };
27975
27976 Messagebar.prototype.attachmentsHide = function attachmentsHide () {
27977 var messagebar = this;
27978 messagebar.$el.removeClass('messagebar-attachments-visible');
27979 messagebar.attachmentsVisible = false;
27980 if (messagebar.params.resizePage) {
27981 messagebar.resizePage();
27982 }
27983 return messagebar;
27984 };
27985
27986 Messagebar.prototype.attachmentsToggle = function attachmentsToggle () {
27987 var messagebar = this;
27988 if (messagebar.attachmentsVisible) {
27989 messagebar.attachmentsHide();
27990 } else {
27991 messagebar.attachmentsShow();
27992 }
27993 return messagebar;
27994 };
27995
27996 Messagebar.prototype.renderAttachment = function renderAttachment (attachment) {
27997 var messagebar = this;
27998 if (messagebar.params.renderAttachment) {
27999 return messagebar.params.renderAttachment.call(messagebar, attachment);
28000 }
28001 return ("\n <div class=\"messagebar-attachment\">\n <img src=\"" + attachment + "\">\n <span class=\"messagebar-attachment-delete\"></span>\n </div>\n ");
28002 };
28003
28004 Messagebar.prototype.renderAttachments = function renderAttachments () {
28005 var messagebar = this;
28006 var html;
28007 if (messagebar.params.renderAttachments) {
28008 html = messagebar.params.renderAttachments.call(messagebar, messagebar.attachments);
28009 } else {
28010 html = "" + (messagebar.attachments.map(function (attachment) { return messagebar.renderAttachment(attachment); }).join(''));
28011 }
28012 if (messagebar.$attachmentsEl.length === 0) {
28013 messagebar.attachmentsCreate(html);
28014 } else {
28015 messagebar.$attachmentsEl.html(html);
28016 }
28017 };
28018
28019 Messagebar.prototype.sheetCreate = function sheetCreate (innerHTML) {
28020 if ( innerHTML === void 0 ) innerHTML = '';
28021
28022 var messagebar = this;
28023 var $sheetEl = $(("<div class=\"messagebar-sheet\">" + innerHTML + "</div>"));
28024 messagebar.$el.append($sheetEl);
28025 Utils.extend(messagebar, {
28026 $sheetEl: $sheetEl,
28027 sheetEl: $sheetEl[0],
28028 });
28029 return messagebar;
28030 };
28031
28032 Messagebar.prototype.sheetShow = function sheetShow (innerHTML) {
28033 if ( innerHTML === void 0 ) innerHTML = '';
28034
28035 var messagebar = this;
28036 messagebar.$sheetEl = messagebar.$el.find('.messagebar-sheet');
28037 if (messagebar.$sheetEl.length === 0) {
28038 messagebar.sheetCreate(innerHTML);
28039 }
28040 messagebar.$el.addClass('messagebar-sheet-visible');
28041 messagebar.sheetVisible = true;
28042 if (messagebar.params.resizePage) {
28043 messagebar.resizePage();
28044 }
28045 return messagebar;
28046 };
28047
28048 Messagebar.prototype.sheetHide = function sheetHide () {
28049 var messagebar = this;
28050 messagebar.$el.removeClass('messagebar-sheet-visible');
28051 messagebar.sheetVisible = false;
28052 if (messagebar.params.resizePage) {
28053 messagebar.resizePage();
28054 }
28055 return messagebar;
28056 };
28057
28058 Messagebar.prototype.sheetToggle = function sheetToggle () {
28059 var messagebar = this;
28060 if (messagebar.sheetVisible) {
28061 messagebar.sheetHide();
28062 } else {
28063 messagebar.sheetShow();
28064 }
28065 return messagebar;
28066 };
28067
28068 Messagebar.prototype.init = function init () {
28069 var messagebar = this;
28070 messagebar.attachEvents();
28071 messagebar.checkEmptyState();
28072 return messagebar;
28073 };
28074
28075 Messagebar.prototype.destroy = function destroy () {
28076 var messagebar = this;
28077 messagebar.emit('local::beforeDestroy messagebarBeforeDestroy', messagebar);
28078 messagebar.$el.trigger('messagebar:beforedestroy', messagebar);
28079 messagebar.detachEvents();
28080 if (messagebar.$el[0]) {
28081 messagebar.$el[0].f7Messagebar = null;
28082 delete messagebar.$el[0].f7Messagebar;
28083 }
28084 Utils.deleteProps(messagebar);
28085 };
28086
28087 return Messagebar;
28088 }(Framework7Class));
28089
28090 var Messagebar$1 = {
28091 name: 'messagebar',
28092 static: {
28093 Messagebar: Messagebar,
28094 },
28095 create: function create() {
28096 var app = this;
28097 app.messagebar = ConstructorMethods({
28098 defaultSelector: '.messagebar',
28099 constructor: Messagebar,
28100 app: app,
28101 domProp: 'f7Messagebar',
28102 addMethods: 'clear getValue setValue setPlaceholder resizePage focus blur attachmentsCreate attachmentsShow attachmentsHide attachmentsToggle renderAttachments sheetCreate sheetShow sheetHide sheetToggle'.split(' '),
28103 });
28104 },
28105 on: {
28106 tabBeforeRemove: function tabBeforeRemove(tabEl) {
28107 var app = this;
28108 $(tabEl).find('.messagebar-init').each(function (index, messagebarEl) {
28109 app.messagebar.destroy(messagebarEl);
28110 });
28111 },
28112 tabMounted: function tabMounted(tabEl) {
28113 var app = this;
28114 $(tabEl).find('.messagebar-init').each(function (index, messagebarEl) {
28115 app.messagebar.create(Utils.extend({ el: messagebarEl }, $(messagebarEl).dataset()));
28116 });
28117 },
28118 pageBeforeRemove: function pageBeforeRemove(page) {
28119 var app = this;
28120 page.$el.find('.messagebar-init').each(function (index, messagebarEl) {
28121 app.messagebar.destroy(messagebarEl);
28122 });
28123 },
28124 pageInit: function pageInit(page) {
28125 var app = this;
28126 page.$el.find('.messagebar-init').each(function (index, messagebarEl) {
28127 app.messagebar.create(Utils.extend({ el: messagebarEl }, $(messagebarEl).dataset()));
28128 });
28129 },
28130 },
28131 vnode: {
28132 'messagebar-init': {
28133 insert: function insert(vnode) {
28134 var app = this;
28135 var messagebarEl = vnode.elm;
28136 app.messagebar.create(Utils.extend({ el: messagebarEl }, $(messagebarEl).dataset()));
28137 },
28138 destroy: function destroy(vnode) {
28139 var app = this;
28140 var messagebarEl = vnode.elm;
28141 app.messagebar.destroy(messagebarEl);
28142 },
28143 },
28144 },
28145 };
28146
5d51ea26
DC
28147 var Browser = (function Browser() {
28148 function isSafari() {
28149 var ua = win.navigator.userAgent.toLowerCase();
28150 return (ua.indexOf('safari') >= 0 && ua.indexOf('chrome') < 0 && ua.indexOf('android') < 0);
28151 }
28152 return {
28153 isIE: !!win.navigator.userAgent.match(/Trident/g) || !!win.navigator.userAgent.match(/MSIE/g),
28154 isSafari: isSafari(),
28155 isUiWebView: /(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/i.test(win.navigator.userAgent),
28156 };
28157 }());
28158
5309fbda
DC
28159 function updateSize () {
28160 var swiper = this;
28161 var width;
28162 var height;
28163 var $el = swiper.$el;
28164 if (typeof swiper.params.width !== 'undefined') {
28165 width = swiper.params.width;
28166 } else {
28167 width = $el[0].clientWidth;
28168 }
28169 if (typeof swiper.params.height !== 'undefined') {
28170 height = swiper.params.height;
28171 } else {
28172 height = $el[0].clientHeight;
28173 }
28174 if ((width === 0 && swiper.isHorizontal()) || (height === 0 && swiper.isVertical())) {
28175 return;
28176 }
28177
28178 // Subtract paddings
28179 width = width - parseInt($el.css('padding-left'), 10) - parseInt($el.css('padding-right'), 10);
28180 height = height - parseInt($el.css('padding-top'), 10) - parseInt($el.css('padding-bottom'), 10);
28181
28182 Utils.extend(swiper, {
28183 width: width,
28184 height: height,
28185 size: swiper.isHorizontal() ? width : height,
28186 });
28187 }
28188
28189 function updateSlides () {
28190 var swiper = this;
28191 var params = swiper.params;
28192
28193 var $wrapperEl = swiper.$wrapperEl;
28194 var swiperSize = swiper.size;
28195 var rtl = swiper.rtlTranslate;
28196 var wrongRTL = swiper.wrongRTL;
28197 var isVirtual = swiper.virtual && params.virtual.enabled;
28198 var previousSlidesLength = isVirtual ? swiper.virtual.slides.length : swiper.slides.length;
28199 var slides = $wrapperEl.children(("." + (swiper.params.slideClass)));
28200 var slidesLength = isVirtual ? swiper.virtual.slides.length : slides.length;
28201 var snapGrid = [];
28202 var slidesGrid = [];
28203 var slidesSizesGrid = [];
28204
28205 var offsetBefore = params.slidesOffsetBefore;
28206 if (typeof offsetBefore === 'function') {
28207 offsetBefore = params.slidesOffsetBefore.call(swiper);
28208 }
28209
28210 var offsetAfter = params.slidesOffsetAfter;
28211 if (typeof offsetAfter === 'function') {
28212 offsetAfter = params.slidesOffsetAfter.call(swiper);
28213 }
28214
28215 var previousSnapGridLength = swiper.snapGrid.length;
28216 var previousSlidesGridLength = swiper.snapGrid.length;
28217
28218 var spaceBetween = params.spaceBetween;
28219 var slidePosition = -offsetBefore;
28220 var prevSlideSize = 0;
28221 var index = 0;
28222 if (typeof swiperSize === 'undefined') {
28223 return;
28224 }
28225 if (typeof spaceBetween === 'string' && spaceBetween.indexOf('%') >= 0) {
28226 spaceBetween = (parseFloat(spaceBetween.replace('%', '')) / 100) * swiperSize;
28227 }
28228
28229 swiper.virtualSize = -spaceBetween;
28230
28231 // reset margins
28232 if (rtl) { slides.css({ marginLeft: '', marginTop: '' }); }
28233 else { slides.css({ marginRight: '', marginBottom: '' }); }
28234
28235 var slidesNumberEvenToRows;
28236 if (params.slidesPerColumn > 1) {
28237 if (Math.floor(slidesLength / params.slidesPerColumn) === slidesLength / swiper.params.slidesPerColumn) {
28238 slidesNumberEvenToRows = slidesLength;
28239 } else {
28240 slidesNumberEvenToRows = Math.ceil(slidesLength / params.slidesPerColumn) * params.slidesPerColumn;
28241 }
28242 if (params.slidesPerView !== 'auto' && params.slidesPerColumnFill === 'row') {
28243 slidesNumberEvenToRows = Math.max(slidesNumberEvenToRows, params.slidesPerView * params.slidesPerColumn);
28244 }
28245 }
28246
28247 // Calc slides
28248 var slideSize;
28249 var slidesPerColumn = params.slidesPerColumn;
28250 var slidesPerRow = slidesNumberEvenToRows / slidesPerColumn;
28251 var numFullColumns = Math.floor(slidesLength / params.slidesPerColumn);
28252 for (var i = 0; i < slidesLength; i += 1) {
28253 slideSize = 0;
28254 var slide = slides.eq(i);
28255 if (params.slidesPerColumn > 1) {
28256 // Set slides order
28257 var newSlideOrderIndex = (void 0);
28258 var column = (void 0);
28259 var row = (void 0);
28260 if (params.slidesPerColumnFill === 'column') {
28261 column = Math.floor(i / slidesPerColumn);
28262 row = i - (column * slidesPerColumn);
28263 if (column > numFullColumns || (column === numFullColumns && row === slidesPerColumn - 1)) {
28264 row += 1;
28265 if (row >= slidesPerColumn) {
28266 row = 0;
28267 column += 1;
28268 }
28269 }
28270 newSlideOrderIndex = column + ((row * slidesNumberEvenToRows) / slidesPerColumn);
28271 slide
28272 .css({
28273 '-webkit-box-ordinal-group': newSlideOrderIndex,
28274 '-moz-box-ordinal-group': newSlideOrderIndex,
28275 '-ms-flex-order': newSlideOrderIndex,
28276 '-webkit-order': newSlideOrderIndex,
28277 order: newSlideOrderIndex,
28278 });
28279 } else {
28280 row = Math.floor(i / slidesPerRow);
28281 column = i - (row * slidesPerRow);
28282 }
28283 slide
28284 .css(
28285 ("margin-" + (swiper.isHorizontal() ? 'top' : 'left')),
28286 (row !== 0 && params.spaceBetween) && (((params.spaceBetween) + "px"))
28287 )
28288 .attr('data-swiper-column', column)
28289 .attr('data-swiper-row', row);
28290 }
28291 if (slide.css('display') === 'none') { continue; } // eslint-disable-line
28292
28293 if (params.slidesPerView === 'auto') {
28294 var slideStyles = win.getComputedStyle(slide[0], null);
28295 var currentTransform = slide[0].style.transform;
28296 var currentWebKitTransform = slide[0].style.webkitTransform;
28297 if (currentTransform) {
28298 slide[0].style.transform = 'none';
28299 }
28300 if (currentWebKitTransform) {
28301 slide[0].style.webkitTransform = 'none';
28302 }
28303 if (params.roundLengths) {
28304 slideSize = swiper.isHorizontal()
28305 ? slide.outerWidth(true)
28306 : slide.outerHeight(true);
28307 } else {
28308 // eslint-disable-next-line
28309 if (swiper.isHorizontal()) {
28310 var width = parseFloat(slideStyles.getPropertyValue('width'));
28311 var paddingLeft = parseFloat(slideStyles.getPropertyValue('padding-left'));
28312 var paddingRight = parseFloat(slideStyles.getPropertyValue('padding-right'));
28313 var marginLeft = parseFloat(slideStyles.getPropertyValue('margin-left'));
28314 var marginRight = parseFloat(slideStyles.getPropertyValue('margin-right'));
28315 var boxSizing = slideStyles.getPropertyValue('box-sizing');
28316 if (boxSizing && boxSizing === 'border-box') {
28317 slideSize = width + marginLeft + marginRight;
28318 } else {
28319 slideSize = width + paddingLeft + paddingRight + marginLeft + marginRight;
28320 }
28321 } else {
28322 var height = parseFloat(slideStyles.getPropertyValue('height'));
28323 var paddingTop = parseFloat(slideStyles.getPropertyValue('padding-top'));
28324 var paddingBottom = parseFloat(slideStyles.getPropertyValue('padding-bottom'));
28325 var marginTop = parseFloat(slideStyles.getPropertyValue('margin-top'));
28326 var marginBottom = parseFloat(slideStyles.getPropertyValue('margin-bottom'));
28327 var boxSizing$1 = slideStyles.getPropertyValue('box-sizing');
28328 if (boxSizing$1 && boxSizing$1 === 'border-box') {
28329 slideSize = height + marginTop + marginBottom;
28330 } else {
28331 slideSize = height + paddingTop + paddingBottom + marginTop + marginBottom;
28332 }
28333 }
28334 }
28335 if (currentTransform) {
28336 slide[0].style.transform = currentTransform;
28337 }
28338 if (currentWebKitTransform) {
28339 slide[0].style.webkitTransform = currentWebKitTransform;
28340 }
28341 if (params.roundLengths) { slideSize = Math.floor(slideSize); }
28342 } else {
28343 slideSize = (swiperSize - ((params.slidesPerView - 1) * spaceBetween)) / params.slidesPerView;
28344 if (params.roundLengths) { slideSize = Math.floor(slideSize); }
28345
28346 if (slides[i]) {
28347 if (swiper.isHorizontal()) {
28348 slides[i].style.width = slideSize + "px";
28349 } else {
28350 slides[i].style.height = slideSize + "px";
28351 }
28352 }
28353 }
28354 if (slides[i]) {
28355 slides[i].swiperSlideSize = slideSize;
28356 }
28357 slidesSizesGrid.push(slideSize);
28358
28359
28360 if (params.centeredSlides) {
28361 slidePosition = slidePosition + (slideSize / 2) + (prevSlideSize / 2) + spaceBetween;
28362 if (prevSlideSize === 0 && i !== 0) { slidePosition = slidePosition - (swiperSize / 2) - spaceBetween; }
28363 if (i === 0) { slidePosition = slidePosition - (swiperSize / 2) - spaceBetween; }
28364 if (Math.abs(slidePosition) < 1 / 1000) { slidePosition = 0; }
28365 if (params.roundLengths) { slidePosition = Math.floor(slidePosition); }
28366 if ((index) % params.slidesPerGroup === 0) { snapGrid.push(slidePosition); }
28367 slidesGrid.push(slidePosition);
28368 } else {
28369 if (params.roundLengths) { slidePosition = Math.floor(slidePosition); }
28370 if ((index) % params.slidesPerGroup === 0) { snapGrid.push(slidePosition); }
28371 slidesGrid.push(slidePosition);
28372 slidePosition = slidePosition + slideSize + spaceBetween;
28373 }
28374
28375 swiper.virtualSize += slideSize + spaceBetween;
28376
28377 prevSlideSize = slideSize;
28378
28379 index += 1;
28380 }
28381 swiper.virtualSize = Math.max(swiper.virtualSize, swiperSize) + offsetAfter;
28382 var newSlidesGrid;
28383
28384 if (
28385 rtl && wrongRTL && (params.effect === 'slide' || params.effect === 'coverflow')) {
28386 $wrapperEl.css({ width: ((swiper.virtualSize + params.spaceBetween) + "px") });
28387 }
28388 if (!Support.flexbox || params.setWrapperSize) {
28389 if (swiper.isHorizontal()) { $wrapperEl.css({ width: ((swiper.virtualSize + params.spaceBetween) + "px") }); }
28390 else { $wrapperEl.css({ height: ((swiper.virtualSize + params.spaceBetween) + "px") }); }
28391 }
28392
28393 if (params.slidesPerColumn > 1) {
28394 swiper.virtualSize = (slideSize + params.spaceBetween) * slidesNumberEvenToRows;
28395 swiper.virtualSize = Math.ceil(swiper.virtualSize / params.slidesPerColumn) - params.spaceBetween;
28396 if (swiper.isHorizontal()) { $wrapperEl.css({ width: ((swiper.virtualSize + params.spaceBetween) + "px") }); }
28397 else { $wrapperEl.css({ height: ((swiper.virtualSize + params.spaceBetween) + "px") }); }
28398 if (params.centeredSlides) {
28399 newSlidesGrid = [];
28400 for (var i$1 = 0; i$1 < snapGrid.length; i$1 += 1) {
28401 var slidesGridItem = snapGrid[i$1];
28402 if (params.roundLengths) { slidesGridItem = Math.floor(slidesGridItem); }
28403 if (snapGrid[i$1] < swiper.virtualSize + snapGrid[0]) { newSlidesGrid.push(slidesGridItem); }
28404 }
28405 snapGrid = newSlidesGrid;
28406 }
28407 }
28408
28409 // Remove last grid elements depending on width
28410 if (!params.centeredSlides) {
28411 newSlidesGrid = [];
28412 for (var i$2 = 0; i$2 < snapGrid.length; i$2 += 1) {
28413 var slidesGridItem$1 = snapGrid[i$2];
28414 if (params.roundLengths) { slidesGridItem$1 = Math.floor(slidesGridItem$1); }
28415 if (snapGrid[i$2] <= swiper.virtualSize - swiperSize) {
28416 newSlidesGrid.push(slidesGridItem$1);
28417 }
28418 }
28419 snapGrid = newSlidesGrid;
28420 if (Math.floor(swiper.virtualSize - swiperSize) - Math.floor(snapGrid[snapGrid.length - 1]) > 1) {
28421 snapGrid.push(swiper.virtualSize - swiperSize);
28422 }
28423 }
28424 if (snapGrid.length === 0) { snapGrid = [0]; }
28425
28426 if (params.spaceBetween !== 0) {
28427 if (swiper.isHorizontal()) {
28428 if (rtl) { slides.css({ marginLeft: (spaceBetween + "px") }); }
28429 else { slides.css({ marginRight: (spaceBetween + "px") }); }
28430 } else { slides.css({ marginBottom: (spaceBetween + "px") }); }
28431 }
28432
28433 if (params.centerInsufficientSlides) {
28434 var allSlidesSize = 0;
28435 slidesSizesGrid.forEach(function (slideSizeValue) {
28436 allSlidesSize += slideSizeValue + (params.spaceBetween ? params.spaceBetween : 0);
28437 });
28438 allSlidesSize -= params.spaceBetween;
28439 if (allSlidesSize < swiperSize) {
28440 var allSlidesOffset = (swiperSize - allSlidesSize) / 2;
28441 snapGrid.forEach(function (snap, snapIndex) {
28442 snapGrid[snapIndex] = snap - allSlidesOffset;
28443 });
28444 slidesGrid.forEach(function (snap, snapIndex) {
28445 slidesGrid[snapIndex] = snap + allSlidesOffset;
28446 });
28447 }
28448 }
28449
28450 Utils.extend(swiper, {
28451 slides: slides,
28452 snapGrid: snapGrid,
28453 slidesGrid: slidesGrid,
28454 slidesSizesGrid: slidesSizesGrid,
28455 });
28456
28457 if (slidesLength !== previousSlidesLength) {
28458 swiper.emit('slidesLengthChange');
28459 }
28460 if (snapGrid.length !== previousSnapGridLength) {
28461 if (swiper.params.watchOverflow) { swiper.checkOverflow(); }
28462 swiper.emit('snapGridLengthChange');
28463 }
28464 if (slidesGrid.length !== previousSlidesGridLength) {
28465 swiper.emit('slidesGridLengthChange');
28466 }
28467
28468 if (params.watchSlidesProgress || params.watchSlidesVisibility) {
28469 swiper.updateSlidesOffset();
28470 }
28471 }
28472
28473 function updateAutoHeight (speed) {
28474 var swiper = this;
28475 var activeSlides = [];
28476 var newHeight = 0;
28477 var i;
28478 if (typeof speed === 'number') {
28479 swiper.setTransition(speed);
28480 } else if (speed === true) {
28481 swiper.setTransition(swiper.params.speed);
28482 }
28483 // Find slides currently in view
28484 if (swiper.params.slidesPerView !== 'auto' && swiper.params.slidesPerView > 1) {
28485 for (i = 0; i < Math.ceil(swiper.params.slidesPerView); i += 1) {
28486 var index = swiper.activeIndex + i;
28487 if (index > swiper.slides.length) { break; }
28488 activeSlides.push(swiper.slides.eq(index)[0]);
28489 }
28490 } else {
28491 activeSlides.push(swiper.slides.eq(swiper.activeIndex)[0]);
28492 }
28493
28494 // Find new height from highest slide in view
28495 for (i = 0; i < activeSlides.length; i += 1) {
28496 if (typeof activeSlides[i] !== 'undefined') {
28497 var height = activeSlides[i].offsetHeight;
28498 newHeight = height > newHeight ? height : newHeight;
28499 }
28500 }
28501
28502 // Update Height
28503 if (newHeight) { swiper.$wrapperEl.css('height', (newHeight + "px")); }
28504 }
28505
28506 function updateSlidesOffset () {
28507 var swiper = this;
28508 var slides = swiper.slides;
28509 for (var i = 0; i < slides.length; i += 1) {
28510 slides[i].swiperSlideOffset = swiper.isHorizontal() ? slides[i].offsetLeft : slides[i].offsetTop;
28511 }
28512 }
28513
28514 function updateSlidesProgress (translate) {
28515 if ( translate === void 0 ) translate = (this && this.translate) || 0;
28516
28517 var swiper = this;
28518 var params = swiper.params;
28519
28520 var slides = swiper.slides;
28521 var rtl = swiper.rtlTranslate;
28522
28523 if (slides.length === 0) { return; }
28524 if (typeof slides[0].swiperSlideOffset === 'undefined') { swiper.updateSlidesOffset(); }
28525
28526 var offsetCenter = -translate;
28527 if (rtl) { offsetCenter = translate; }
28528
28529 // Visible Slides
28530 slides.removeClass(params.slideVisibleClass);
28531
28532 swiper.visibleSlidesIndexes = [];
28533 swiper.visibleSlides = [];
28534
28535 for (var i = 0; i < slides.length; i += 1) {
28536 var slide = slides[i];
28537 var slideProgress = (
28538 (offsetCenter + (params.centeredSlides ? swiper.minTranslate() : 0)) - slide.swiperSlideOffset
28539 ) / (slide.swiperSlideSize + params.spaceBetween);
28540 if (params.watchSlidesVisibility) {
28541 var slideBefore = -(offsetCenter - slide.swiperSlideOffset);
28542 var slideAfter = slideBefore + swiper.slidesSizesGrid[i];
28543 var isVisible = (slideBefore >= 0 && slideBefore < swiper.size)
28544 || (slideAfter > 0 && slideAfter <= swiper.size)
28545 || (slideBefore <= 0 && slideAfter >= swiper.size);
28546 if (isVisible) {
28547 swiper.visibleSlides.push(slide);
28548 swiper.visibleSlidesIndexes.push(i);
28549 slides.eq(i).addClass(params.slideVisibleClass);
28550 }
28551 }
28552 slide.progress = rtl ? -slideProgress : slideProgress;
28553 }
28554 swiper.visibleSlides = $(swiper.visibleSlides);
28555 }
28556
28557 function updateProgress (translate) {
28558 if ( translate === void 0 ) translate = (this && this.translate) || 0;
28559
28560 var swiper = this;
28561 var params = swiper.params;
28562
28563 var translatesDiff = swiper.maxTranslate() - swiper.minTranslate();
28564 var progress = swiper.progress;
28565 var isBeginning = swiper.isBeginning;
28566 var isEnd = swiper.isEnd;
28567 var wasBeginning = isBeginning;
28568 var wasEnd = isEnd;
28569 if (translatesDiff === 0) {
28570 progress = 0;
28571 isBeginning = true;
28572 isEnd = true;
28573 } else {
28574 progress = (translate - swiper.minTranslate()) / (translatesDiff);
28575 isBeginning = progress <= 0;
28576 isEnd = progress >= 1;
28577 }
28578 Utils.extend(swiper, {
28579 progress: progress,
28580 isBeginning: isBeginning,
28581 isEnd: isEnd,
28582 });
28583
28584 if (params.watchSlidesProgress || params.watchSlidesVisibility) { swiper.updateSlidesProgress(translate); }
28585
28586 if (isBeginning && !wasBeginning) {
28587 swiper.emit('reachBeginning toEdge');
28588 }
28589 if (isEnd && !wasEnd) {
28590 swiper.emit('reachEnd toEdge');
28591 }
28592 if ((wasBeginning && !isBeginning) || (wasEnd && !isEnd)) {
28593 swiper.emit('fromEdge');
28594 }
28595
28596 swiper.emit('progress', progress);
28597 }
28598
28599 function updateSlidesClasses () {
28600 var swiper = this;
28601
28602 var slides = swiper.slides;
28603 var params = swiper.params;
28604 var $wrapperEl = swiper.$wrapperEl;
28605 var activeIndex = swiper.activeIndex;
28606 var realIndex = swiper.realIndex;
28607 var isVirtual = swiper.virtual && params.virtual.enabled;
28608
28609 slides.removeClass(((params.slideActiveClass) + " " + (params.slideNextClass) + " " + (params.slidePrevClass) + " " + (params.slideDuplicateActiveClass) + " " + (params.slideDuplicateNextClass) + " " + (params.slideDuplicatePrevClass)));
28610
28611 var activeSlide;
28612 if (isVirtual) {
28613 activeSlide = swiper.$wrapperEl.find(("." + (params.slideClass) + "[data-swiper-slide-index=\"" + activeIndex + "\"]"));
28614 } else {
28615 activeSlide = slides.eq(activeIndex);
28616 }
28617
28618 // Active classes
28619 activeSlide.addClass(params.slideActiveClass);
28620
28621 if (params.loop) {
28622 // Duplicate to all looped slides
28623 if (activeSlide.hasClass(params.slideDuplicateClass)) {
28624 $wrapperEl
28625 .children(("." + (params.slideClass) + ":not(." + (params.slideDuplicateClass) + ")[data-swiper-slide-index=\"" + realIndex + "\"]"))
28626 .addClass(params.slideDuplicateActiveClass);
28627 } else {
28628 $wrapperEl
28629 .children(("." + (params.slideClass) + "." + (params.slideDuplicateClass) + "[data-swiper-slide-index=\"" + realIndex + "\"]"))
28630 .addClass(params.slideDuplicateActiveClass);
28631 }
28632 }
28633 // Next Slide
28634 var nextSlide = activeSlide.nextAll(("." + (params.slideClass))).eq(0).addClass(params.slideNextClass);
28635 if (params.loop && nextSlide.length === 0) {
28636 nextSlide = slides.eq(0);
28637 nextSlide.addClass(params.slideNextClass);
28638 }
28639 // Prev Slide
28640 var prevSlide = activeSlide.prevAll(("." + (params.slideClass))).eq(0).addClass(params.slidePrevClass);
28641 if (params.loop && prevSlide.length === 0) {
28642 prevSlide = slides.eq(-1);
28643 prevSlide.addClass(params.slidePrevClass);
28644 }
28645 if (params.loop) {
28646 // Duplicate to all looped slides
28647 if (nextSlide.hasClass(params.slideDuplicateClass)) {
28648 $wrapperEl
28649 .children(("." + (params.slideClass) + ":not(." + (params.slideDuplicateClass) + ")[data-swiper-slide-index=\"" + (nextSlide.attr('data-swiper-slide-index')) + "\"]"))
28650 .addClass(params.slideDuplicateNextClass);
28651 } else {
28652 $wrapperEl
28653 .children(("." + (params.slideClass) + "." + (params.slideDuplicateClass) + "[data-swiper-slide-index=\"" + (nextSlide.attr('data-swiper-slide-index')) + "\"]"))
28654 .addClass(params.slideDuplicateNextClass);
28655 }
28656 if (prevSlide.hasClass(params.slideDuplicateClass)) {
28657 $wrapperEl
28658 .children(("." + (params.slideClass) + ":not(." + (params.slideDuplicateClass) + ")[data-swiper-slide-index=\"" + (prevSlide.attr('data-swiper-slide-index')) + "\"]"))
28659 .addClass(params.slideDuplicatePrevClass);
28660 } else {
28661 $wrapperEl
28662 .children(("." + (params.slideClass) + "." + (params.slideDuplicateClass) + "[data-swiper-slide-index=\"" + (prevSlide.attr('data-swiper-slide-index')) + "\"]"))
28663 .addClass(params.slideDuplicatePrevClass);
28664 }
28665 }
28666 }
28667
28668 function updateActiveIndex (newActiveIndex) {
28669 var swiper = this;
28670 var translate = swiper.rtlTranslate ? swiper.translate : -swiper.translate;
28671 var slidesGrid = swiper.slidesGrid;
28672 var snapGrid = swiper.snapGrid;
28673 var params = swiper.params;
28674 var previousIndex = swiper.activeIndex;
28675 var previousRealIndex = swiper.realIndex;
28676 var previousSnapIndex = swiper.snapIndex;
28677 var activeIndex = newActiveIndex;
28678 var snapIndex;
28679 if (typeof activeIndex === 'undefined') {
28680 for (var i = 0; i < slidesGrid.length; i += 1) {
28681 if (typeof slidesGrid[i + 1] !== 'undefined') {
28682 if (translate >= slidesGrid[i] && translate < slidesGrid[i + 1] - ((slidesGrid[i + 1] - slidesGrid[i]) / 2)) {
28683 activeIndex = i;
28684 } else if (translate >= slidesGrid[i] && translate < slidesGrid[i + 1]) {
28685 activeIndex = i + 1;
28686 }
28687 } else if (translate >= slidesGrid[i]) {
28688 activeIndex = i;
28689 }
28690 }
28691 // Normalize slideIndex
28692 if (params.normalizeSlideIndex) {
28693 if (activeIndex < 0 || typeof activeIndex === 'undefined') { activeIndex = 0; }
28694 }
28695 }
28696 if (snapGrid.indexOf(translate) >= 0) {
28697 snapIndex = snapGrid.indexOf(translate);
28698 } else {
28699 snapIndex = Math.floor(activeIndex / params.slidesPerGroup);
28700 }
28701 if (snapIndex >= snapGrid.length) { snapIndex = snapGrid.length - 1; }
28702 if (activeIndex === previousIndex) {
28703 if (snapIndex !== previousSnapIndex) {
28704 swiper.snapIndex = snapIndex;
28705 swiper.emit('snapIndexChange');
28706 }
28707 return;
28708 }
28709
28710 // Get real index
28711 var realIndex = parseInt(swiper.slides.eq(activeIndex).attr('data-swiper-slide-index') || activeIndex, 10);
28712
28713 Utils.extend(swiper, {
28714 snapIndex: snapIndex,
28715 realIndex: realIndex,
28716 previousIndex: previousIndex,
28717 activeIndex: activeIndex,
28718 });
28719 swiper.emit('activeIndexChange');
28720 swiper.emit('snapIndexChange');
28721 if (previousRealIndex !== realIndex) {
28722 swiper.emit('realIndexChange');
28723 }
28724 swiper.emit('slideChange');
28725 }
28726
28727 function updateClickedSlide (e) {
28728 var swiper = this;
28729 var params = swiper.params;
28730 var slide = $(e.target).closest(("." + (params.slideClass)))[0];
28731 var slideFound = false;
28732 if (slide) {
28733 for (var i = 0; i < swiper.slides.length; i += 1) {
28734 if (swiper.slides[i] === slide) { slideFound = true; }
28735 }
28736 }
28737
28738 if (slide && slideFound) {
28739 swiper.clickedSlide = slide;
28740 if (swiper.virtual && swiper.params.virtual.enabled) {
28741 swiper.clickedIndex = parseInt($(slide).attr('data-swiper-slide-index'), 10);
28742 } else {
28743 swiper.clickedIndex = $(slide).index();
28744 }
28745 } else {
28746 swiper.clickedSlide = undefined;
28747 swiper.clickedIndex = undefined;
28748 return;
28749 }
28750 if (params.slideToClickedSlide && swiper.clickedIndex !== undefined && swiper.clickedIndex !== swiper.activeIndex) {
28751 swiper.slideToClickedSlide();
28752 }
28753 }
28754
28755 var update = {
28756 updateSize: updateSize,
28757 updateSlides: updateSlides,
28758 updateAutoHeight: updateAutoHeight,
28759 updateSlidesOffset: updateSlidesOffset,
28760 updateSlidesProgress: updateSlidesProgress,
28761 updateProgress: updateProgress,
28762 updateSlidesClasses: updateSlidesClasses,
28763 updateActiveIndex: updateActiveIndex,
28764 updateClickedSlide: updateClickedSlide,
28765 };
28766
28767 function getTranslate (axis) {
28768 if ( axis === void 0 ) axis = this.isHorizontal() ? 'x' : 'y';
28769
28770 var swiper = this;
28771
28772 var params = swiper.params;
28773 var rtl = swiper.rtlTranslate;
28774 var translate = swiper.translate;
28775 var $wrapperEl = swiper.$wrapperEl;
28776
28777 if (params.virtualTranslate) {
28778 return rtl ? -translate : translate;
28779 }
28780
28781 var currentTranslate = Utils.getTranslate($wrapperEl[0], axis);
28782 if (rtl) { currentTranslate = -currentTranslate; }
28783
28784 return currentTranslate || 0;
28785 }
28786
28787 function setTranslate (translate, byController) {
28788 var swiper = this;
28789 var rtl = swiper.rtlTranslate;
28790 var params = swiper.params;
28791 var $wrapperEl = swiper.$wrapperEl;
28792 var progress = swiper.progress;
28793 var x = 0;
28794 var y = 0;
28795 var z = 0;
28796
28797 if (swiper.isHorizontal()) {
28798 x = rtl ? -translate : translate;
28799 } else {
28800 y = translate;
28801 }
28802
28803 if (params.roundLengths) {
28804 x = Math.floor(x);
28805 y = Math.floor(y);
28806 }
28807
28808 if (!params.virtualTranslate) {
28809 if (Support.transforms3d) { $wrapperEl.transform(("translate3d(" + x + "px, " + y + "px, " + z + "px)")); }
28810 else { $wrapperEl.transform(("translate(" + x + "px, " + y + "px)")); }
28811 }
28812 swiper.previousTranslate = swiper.translate;
28813 swiper.translate = swiper.isHorizontal() ? x : y;
28814
28815 // Check if we need to update progress
28816 var newProgress;
28817 var translatesDiff = swiper.maxTranslate() - swiper.minTranslate();
28818 if (translatesDiff === 0) {
28819 newProgress = 0;
28820 } else {
28821 newProgress = (translate - swiper.minTranslate()) / (translatesDiff);
28822 }
28823 if (newProgress !== progress) {
28824 swiper.updateProgress(translate);
28825 }
28826
28827 swiper.emit('setTranslate', swiper.translate, byController);
28828 }
28829
28830 function minTranslate () {
28831 return (-this.snapGrid[0]);
28832 }
28833
28834 function maxTranslate () {
28835 return (-this.snapGrid[this.snapGrid.length - 1]);
28836 }
28837
28838 var translate = {
28839 getTranslate: getTranslate,
28840 setTranslate: setTranslate,
28841 minTranslate: minTranslate,
28842 maxTranslate: maxTranslate,
28843 };
28844
28845 function setTransition (duration, byController) {
28846 var swiper = this;
28847
28848 swiper.$wrapperEl.transition(duration);
28849
28850 swiper.emit('setTransition', duration, byController);
28851 }
28852
28853 function transitionStart (runCallbacks, direction) {
28854 if ( runCallbacks === void 0 ) runCallbacks = true;
28855
28856 var swiper = this;
28857 var activeIndex = swiper.activeIndex;
28858 var params = swiper.params;
28859 var previousIndex = swiper.previousIndex;
28860 if (params.autoHeight) {
28861 swiper.updateAutoHeight();
28862 }
28863
28864 var dir = direction;
28865 if (!dir) {
28866 if (activeIndex > previousIndex) { dir = 'next'; }
28867 else if (activeIndex < previousIndex) { dir = 'prev'; }
28868 else { dir = 'reset'; }
28869 }
28870
28871 swiper.emit('transitionStart');
28872
28873 if (runCallbacks && activeIndex !== previousIndex) {
28874 if (dir === 'reset') {
28875 swiper.emit('slideResetTransitionStart');
28876 return;
28877 }
28878 swiper.emit('slideChangeTransitionStart');
28879 if (dir === 'next') {
28880 swiper.emit('slideNextTransitionStart');
28881 } else {
28882 swiper.emit('slidePrevTransitionStart');
28883 }
28884 }
28885 }
28886
28887 function transitionEnd$1 (runCallbacks, direction) {
28888 if ( runCallbacks === void 0 ) runCallbacks = true;
28889
28890 var swiper = this;
28891 var activeIndex = swiper.activeIndex;
28892 var previousIndex = swiper.previousIndex;
28893 swiper.animating = false;
28894 swiper.setTransition(0);
28895
28896 var dir = direction;
28897 if (!dir) {
28898 if (activeIndex > previousIndex) { dir = 'next'; }
28899 else if (activeIndex < previousIndex) { dir = 'prev'; }
28900 else { dir = 'reset'; }
28901 }
28902
28903 swiper.emit('transitionEnd');
28904
28905 if (runCallbacks && activeIndex !== previousIndex) {
28906 if (dir === 'reset') {
28907 swiper.emit('slideResetTransitionEnd');
28908 return;
28909 }
28910 swiper.emit('slideChangeTransitionEnd');
28911 if (dir === 'next') {
28912 swiper.emit('slideNextTransitionEnd');
28913 } else {
28914 swiper.emit('slidePrevTransitionEnd');
28915 }
28916 }
28917 }
28918
28919 var transition$1 = {
28920 setTransition: setTransition,
28921 transitionStart: transitionStart,
28922 transitionEnd: transitionEnd$1,
28923 };
28924
28925 function slideTo (index, speed, runCallbacks, internal) {
28926 if ( index === void 0 ) index = 0;
28927 if ( speed === void 0 ) speed = this.params.speed;
28928 if ( runCallbacks === void 0 ) runCallbacks = true;
28929
28930 var swiper = this;
28931 var slideIndex = index;
28932 if (slideIndex < 0) { slideIndex = 0; }
28933
28934 var params = swiper.params;
28935 var snapGrid = swiper.snapGrid;
28936 var slidesGrid = swiper.slidesGrid;
28937 var previousIndex = swiper.previousIndex;
28938 var activeIndex = swiper.activeIndex;
28939 var rtl = swiper.rtlTranslate;
28940 if (swiper.animating && params.preventInteractionOnTransition) {
28941 return false;
28942 }
28943
28944 var snapIndex = Math.floor(slideIndex / params.slidesPerGroup);
28945 if (snapIndex >= snapGrid.length) { snapIndex = snapGrid.length - 1; }
28946
28947 if ((activeIndex || params.initialSlide || 0) === (previousIndex || 0) && runCallbacks) {
28948 swiper.emit('beforeSlideChangeStart');
28949 }
28950
28951 var translate = -snapGrid[snapIndex];
28952
28953 // Update progress
28954 swiper.updateProgress(translate);
28955
28956 // Normalize slideIndex
28957 if (params.normalizeSlideIndex) {
28958 for (var i = 0; i < slidesGrid.length; i += 1) {
28959 if (-Math.floor(translate * 100) >= Math.floor(slidesGrid[i] * 100)) {
28960 slideIndex = i;
28961 }
28962 }
28963 }
28964 // Directions locks
28965 if (swiper.initialized && slideIndex !== activeIndex) {
28966 if (!swiper.allowSlideNext && translate < swiper.translate && translate < swiper.minTranslate()) {
28967 return false;
28968 }
28969 if (!swiper.allowSlidePrev && translate > swiper.translate && translate > swiper.maxTranslate()) {
28970 if ((activeIndex || 0) !== slideIndex) { return false; }
28971 }
28972 }
28973
28974 var direction;
28975 if (slideIndex > activeIndex) { direction = 'next'; }
28976 else if (slideIndex < activeIndex) { direction = 'prev'; }
28977 else { direction = 'reset'; }
28978
28979
28980 // Update Index
28981 if ((rtl && -translate === swiper.translate) || (!rtl && translate === swiper.translate)) {
28982 swiper.updateActiveIndex(slideIndex);
28983 // Update Height
28984 if (params.autoHeight) {
28985 swiper.updateAutoHeight();
28986 }
28987 swiper.updateSlidesClasses();
28988 if (params.effect !== 'slide') {
28989 swiper.setTranslate(translate);
28990 }
28991 if (direction !== 'reset') {
28992 swiper.transitionStart(runCallbacks, direction);
28993 swiper.transitionEnd(runCallbacks, direction);
28994 }
28995 return false;
28996 }
28997
28998 if (speed === 0 || !Support.transition) {
28999 swiper.setTransition(0);
29000 swiper.setTranslate(translate);
29001 swiper.updateActiveIndex(slideIndex);
29002 swiper.updateSlidesClasses();
29003 swiper.emit('beforeTransitionStart', speed, internal);
29004 swiper.transitionStart(runCallbacks, direction);
29005 swiper.transitionEnd(runCallbacks, direction);
29006 } else {
29007 swiper.setTransition(speed);
29008 swiper.setTranslate(translate);
29009 swiper.updateActiveIndex(slideIndex);
29010 swiper.updateSlidesClasses();
29011 swiper.emit('beforeTransitionStart', speed, internal);
29012 swiper.transitionStart(runCallbacks, direction);
29013 if (!swiper.animating) {
29014 swiper.animating = true;
29015 if (!swiper.onSlideToWrapperTransitionEnd) {
29016 swiper.onSlideToWrapperTransitionEnd = function transitionEnd(e) {
29017 if (!swiper || swiper.destroyed) { return; }
29018 if (e.target !== this) { return; }
29019 swiper.$wrapperEl[0].removeEventListener('transitionend', swiper.onSlideToWrapperTransitionEnd);
29020 swiper.$wrapperEl[0].removeEventListener('webkitTransitionEnd', swiper.onSlideToWrapperTransitionEnd);
29021 swiper.onSlideToWrapperTransitionEnd = null;
29022 delete swiper.onSlideToWrapperTransitionEnd;
29023 swiper.transitionEnd(runCallbacks, direction);
29024 };
29025 }
29026 swiper.$wrapperEl[0].addEventListener('transitionend', swiper.onSlideToWrapperTransitionEnd);
29027 swiper.$wrapperEl[0].addEventListener('webkitTransitionEnd', swiper.onSlideToWrapperTransitionEnd);
29028 }
29029 }
29030
29031 return true;
29032 }
29033
29034 function slideToLoop (index, speed, runCallbacks, internal) {
29035 if ( index === void 0 ) index = 0;
29036 if ( speed === void 0 ) speed = this.params.speed;
29037 if ( runCallbacks === void 0 ) runCallbacks = true;
29038
29039 var swiper = this;
29040 var newIndex = index;
29041 if (swiper.params.loop) {
29042 newIndex += swiper.loopedSlides;
29043 }
29044
29045 return swiper.slideTo(newIndex, speed, runCallbacks, internal);
29046 }
29047
29048 /* eslint no-unused-vars: "off" */
29049 function slideNext (speed, runCallbacks, internal) {
29050 if ( speed === void 0 ) speed = this.params.speed;
29051 if ( runCallbacks === void 0 ) runCallbacks = true;
29052
29053 var swiper = this;
29054 var params = swiper.params;
29055 var animating = swiper.animating;
29056 if (params.loop) {
29057 if (animating) { return false; }
29058 swiper.loopFix();
29059 // eslint-disable-next-line
29060 swiper._clientLeft = swiper.$wrapperEl[0].clientLeft;
29061 return swiper.slideTo(swiper.activeIndex + params.slidesPerGroup, speed, runCallbacks, internal);
29062 }
29063 return swiper.slideTo(swiper.activeIndex + params.slidesPerGroup, speed, runCallbacks, internal);
29064 }
29065
29066 /* eslint no-unused-vars: "off" */
29067 function slidePrev (speed, runCallbacks, internal) {
29068 if ( speed === void 0 ) speed = this.params.speed;
29069 if ( runCallbacks === void 0 ) runCallbacks = true;
29070
29071 var swiper = this;
29072 var params = swiper.params;
29073 var animating = swiper.animating;
29074 var snapGrid = swiper.snapGrid;
29075 var slidesGrid = swiper.slidesGrid;
29076 var rtlTranslate = swiper.rtlTranslate;
29077
29078 if (params.loop) {
29079 if (animating) { return false; }
29080 swiper.loopFix();
29081 // eslint-disable-next-line
29082 swiper._clientLeft = swiper.$wrapperEl[0].clientLeft;
29083 }
29084 var translate = rtlTranslate ? swiper.translate : -swiper.translate;
29085 function normalize(val) {
29086 if (val < 0) { return -Math.floor(Math.abs(val)); }
29087 return Math.floor(val);
29088 }
29089 var normalizedTranslate = normalize(translate);
29090 var normalizedSnapGrid = snapGrid.map(function (val) { return normalize(val); });
29091 var normalizedSlidesGrid = slidesGrid.map(function (val) { return normalize(val); });
29092
29093 var currentSnap = snapGrid[normalizedSnapGrid.indexOf(normalizedTranslate)];
29094 var prevSnap = snapGrid[normalizedSnapGrid.indexOf(normalizedTranslate) - 1];
29095 var prevIndex;
29096 if (typeof prevSnap !== 'undefined') {
29097 prevIndex = slidesGrid.indexOf(prevSnap);
29098 if (prevIndex < 0) { prevIndex = swiper.activeIndex - 1; }
29099 }
29100 return swiper.slideTo(prevIndex, speed, runCallbacks, internal);
29101 }
29102
29103 /* eslint no-unused-vars: "off" */
29104 function slideReset (speed, runCallbacks, internal) {
29105 if ( speed === void 0 ) speed = this.params.speed;
29106 if ( runCallbacks === void 0 ) runCallbacks = true;
29107
29108 var swiper = this;
29109 return swiper.slideTo(swiper.activeIndex, speed, runCallbacks, internal);
29110 }
29111
29112 /* eslint no-unused-vars: "off" */
29113 function slideToClosest (speed, runCallbacks, internal) {
29114 if ( speed === void 0 ) speed = this.params.speed;
29115 if ( runCallbacks === void 0 ) runCallbacks = true;
29116
29117 var swiper = this;
29118 var index = swiper.activeIndex;
29119 var snapIndex = Math.floor(index / swiper.params.slidesPerGroup);
29120
29121 if (snapIndex < swiper.snapGrid.length - 1) {
29122 var translate = swiper.rtlTranslate ? swiper.translate : -swiper.translate;
29123
29124 var currentSnap = swiper.snapGrid[snapIndex];
29125 var nextSnap = swiper.snapGrid[snapIndex + 1];
29126
29127 if ((translate - currentSnap) > (nextSnap - currentSnap) / 2) {
29128 index = swiper.params.slidesPerGroup;
29129 }
29130 }
29131
29132 return swiper.slideTo(index, speed, runCallbacks, internal);
29133 }
29134
29135 function slideToClickedSlide () {
29136 var swiper = this;
29137 var params = swiper.params;
29138 var $wrapperEl = swiper.$wrapperEl;
29139
29140 var slidesPerView = params.slidesPerView === 'auto' ? swiper.slidesPerViewDynamic() : params.slidesPerView;
29141 var slideToIndex = swiper.clickedIndex;
29142 var realIndex;
29143 if (params.loop) {
29144 if (swiper.animating) { return; }
29145 realIndex = parseInt($(swiper.clickedSlide).attr('data-swiper-slide-index'), 10);
29146 if (params.centeredSlides) {
29147 if (
29148 (slideToIndex < swiper.loopedSlides - (slidesPerView / 2))
29149 || (slideToIndex > (swiper.slides.length - swiper.loopedSlides) + (slidesPerView / 2))
29150 ) {
29151 swiper.loopFix();
29152 slideToIndex = $wrapperEl
29153 .children(("." + (params.slideClass) + "[data-swiper-slide-index=\"" + realIndex + "\"]:not(." + (params.slideDuplicateClass) + ")"))
29154 .eq(0)
29155 .index();
29156
29157 Utils.nextTick(function () {
29158 swiper.slideTo(slideToIndex);
29159 });
29160 } else {
29161 swiper.slideTo(slideToIndex);
29162 }
29163 } else if (slideToIndex > swiper.slides.length - slidesPerView) {
29164 swiper.loopFix();
29165 slideToIndex = $wrapperEl
29166 .children(("." + (params.slideClass) + "[data-swiper-slide-index=\"" + realIndex + "\"]:not(." + (params.slideDuplicateClass) + ")"))
29167 .eq(0)
29168 .index();
29169
29170 Utils.nextTick(function () {
29171 swiper.slideTo(slideToIndex);
29172 });
29173 } else {
29174 swiper.slideTo(slideToIndex);
29175 }
29176 } else {
29177 swiper.slideTo(slideToIndex);
29178 }
29179 }
29180
29181 var slide = {
29182 slideTo: slideTo,
29183 slideToLoop: slideToLoop,
29184 slideNext: slideNext,
29185 slidePrev: slidePrev,
29186 slideReset: slideReset,
29187 slideToClosest: slideToClosest,
29188 slideToClickedSlide: slideToClickedSlide,
29189 };
29190
29191 function loopCreate () {
29192 var swiper = this;
29193 var params = swiper.params;
29194 var $wrapperEl = swiper.$wrapperEl;
29195 // Remove duplicated slides
29196 $wrapperEl.children(("." + (params.slideClass) + "." + (params.slideDuplicateClass))).remove();
29197
29198 var slides = $wrapperEl.children(("." + (params.slideClass)));
29199
29200 if (params.loopFillGroupWithBlank) {
29201 var blankSlidesNum = params.slidesPerGroup - (slides.length % params.slidesPerGroup);
29202 if (blankSlidesNum !== params.slidesPerGroup) {
29203 for (var i = 0; i < blankSlidesNum; i += 1) {
29204 var blankNode = $(doc.createElement('div')).addClass(((params.slideClass) + " " + (params.slideBlankClass)));
29205 $wrapperEl.append(blankNode);
29206 }
29207 slides = $wrapperEl.children(("." + (params.slideClass)));
29208 }
29209 }
29210
29211 if (params.slidesPerView === 'auto' && !params.loopedSlides) { params.loopedSlides = slides.length; }
29212
29213 swiper.loopedSlides = parseInt(params.loopedSlides || params.slidesPerView, 10);
29214 swiper.loopedSlides += params.loopAdditionalSlides;
29215 if (swiper.loopedSlides > slides.length) {
29216 swiper.loopedSlides = slides.length;
29217 }
29218
29219 var prependSlides = [];
29220 var appendSlides = [];
29221 slides.each(function (index, el) {
29222 var slide = $(el);
29223 if (index < swiper.loopedSlides) { appendSlides.push(el); }
29224 if (index < slides.length && index >= slides.length - swiper.loopedSlides) { prependSlides.push(el); }
29225 slide.attr('data-swiper-slide-index', index);
29226 });
29227 for (var i$1 = 0; i$1 < appendSlides.length; i$1 += 1) {
29228 $wrapperEl.append($(appendSlides[i$1].cloneNode(true)).addClass(params.slideDuplicateClass));
29229 }
29230 for (var i$2 = prependSlides.length - 1; i$2 >= 0; i$2 -= 1) {
29231 $wrapperEl.prepend($(prependSlides[i$2].cloneNode(true)).addClass(params.slideDuplicateClass));
29232 }
29233 }
29234
29235 function loopFix () {
29236 var swiper = this;
29237 var params = swiper.params;
29238 var activeIndex = swiper.activeIndex;
29239 var slides = swiper.slides;
29240 var loopedSlides = swiper.loopedSlides;
29241 var allowSlidePrev = swiper.allowSlidePrev;
29242 var allowSlideNext = swiper.allowSlideNext;
29243 var snapGrid = swiper.snapGrid;
29244 var rtl = swiper.rtlTranslate;
29245 var newIndex;
29246 swiper.allowSlidePrev = true;
29247 swiper.allowSlideNext = true;
29248
29249 var snapTranslate = -snapGrid[activeIndex];
29250 var diff = snapTranslate - swiper.getTranslate();
29251
29252
29253 // Fix For Negative Oversliding
29254 if (activeIndex < loopedSlides) {
29255 newIndex = (slides.length - (loopedSlides * 3)) + activeIndex;
29256 newIndex += loopedSlides;
29257 var slideChanged = swiper.slideTo(newIndex, 0, false, true);
29258 if (slideChanged && diff !== 0) {
29259 swiper.setTranslate((rtl ? -swiper.translate : swiper.translate) - diff);
29260 }
29261 } else if ((params.slidesPerView === 'auto' && activeIndex >= loopedSlides * 2) || (activeIndex >= slides.length - loopedSlides)) {
29262 // Fix For Positive Oversliding
29263 newIndex = -slides.length + activeIndex + loopedSlides;
29264 newIndex += loopedSlides;
29265 var slideChanged$1 = swiper.slideTo(newIndex, 0, false, true);
29266 if (slideChanged$1 && diff !== 0) {
29267 swiper.setTranslate((rtl ? -swiper.translate : swiper.translate) - diff);
29268 }
29269 }
29270 swiper.allowSlidePrev = allowSlidePrev;
29271 swiper.allowSlideNext = allowSlideNext;
29272 }
29273
29274 function loopDestroy () {
29275 var swiper = this;
29276 var $wrapperEl = swiper.$wrapperEl;
29277 var params = swiper.params;
29278 var slides = swiper.slides;
29279 $wrapperEl.children(("." + (params.slideClass) + "." + (params.slideDuplicateClass) + ",." + (params.slideClass) + "." + (params.slideBlankClass))).remove();
29280 slides.removeAttr('data-swiper-slide-index');
29281 }
29282
29283 var loop = {
29284 loopCreate: loopCreate,
29285 loopFix: loopFix,
29286 loopDestroy: loopDestroy,
29287 };
29288
29289 function setGrabCursor (moving) {
29290 var swiper = this;
29291 if (Support.touch || !swiper.params.simulateTouch || (swiper.params.watchOverflow && swiper.isLocked)) { return; }
29292 var el = swiper.el;
29293 el.style.cursor = 'move';
29294 el.style.cursor = moving ? '-webkit-grabbing' : '-webkit-grab';
29295 el.style.cursor = moving ? '-moz-grabbin' : '-moz-grab';
29296 el.style.cursor = moving ? 'grabbing' : 'grab';
29297 }
29298
29299 function unsetGrabCursor () {
29300 var swiper = this;
29301 if (Support.touch || (swiper.params.watchOverflow && swiper.isLocked)) { return; }
29302 swiper.el.style.cursor = '';
29303 }
29304
29305 var grabCursor = {
29306 setGrabCursor: setGrabCursor,
29307 unsetGrabCursor: unsetGrabCursor,
29308 };
29309
29310 function appendSlide (slides) {
29311 var swiper = this;
29312 var $wrapperEl = swiper.$wrapperEl;
29313 var params = swiper.params;
29314 if (params.loop) {
29315 swiper.loopDestroy();
29316 }
29317 if (typeof slides === 'object' && 'length' in slides) {
29318 for (var i = 0; i < slides.length; i += 1) {
29319 if (slides[i]) { $wrapperEl.append(slides[i]); }
29320 }
29321 } else {
29322 $wrapperEl.append(slides);
29323 }
29324 if (params.loop) {
29325 swiper.loopCreate();
29326 }
29327 if (!(params.observer && Support.observer)) {
29328 swiper.update();
29329 }
29330 }
29331
29332 function prependSlide (slides) {
29333 var swiper = this;
29334 var params = swiper.params;
29335 var $wrapperEl = swiper.$wrapperEl;
29336 var activeIndex = swiper.activeIndex;
29337
29338 if (params.loop) {
29339 swiper.loopDestroy();
29340 }
29341 var newActiveIndex = activeIndex + 1;
29342 if (typeof slides === 'object' && 'length' in slides) {
29343 for (var i = 0; i < slides.length; i += 1) {
29344 if (slides[i]) { $wrapperEl.prepend(slides[i]); }
29345 }
29346 newActiveIndex = activeIndex + slides.length;
29347 } else {
29348 $wrapperEl.prepend(slides);
29349 }
29350 if (params.loop) {
29351 swiper.loopCreate();
29352 }
29353 if (!(params.observer && Support.observer)) {
29354 swiper.update();
29355 }
29356 swiper.slideTo(newActiveIndex, 0, false);
29357 }
29358
29359 function addSlide (index, slides) {
29360 var swiper = this;
29361 var $wrapperEl = swiper.$wrapperEl;
29362 var params = swiper.params;
29363 var activeIndex = swiper.activeIndex;
29364 var activeIndexBuffer = activeIndex;
29365 if (params.loop) {
29366 activeIndexBuffer -= swiper.loopedSlides;
29367 swiper.loopDestroy();
29368 swiper.slides = $wrapperEl.children(("." + (params.slideClass)));
29369 }
29370 var baseLength = swiper.slides.length;
29371 if (index <= 0) {
29372 swiper.prependSlide(slides);
29373 return;
29374 }
29375 if (index >= baseLength) {
29376 swiper.appendSlide(slides);
29377 return;
29378 }
29379 var newActiveIndex = activeIndexBuffer > index ? activeIndexBuffer + 1 : activeIndexBuffer;
29380
29381 var slidesBuffer = [];
29382 for (var i = baseLength - 1; i >= index; i -= 1) {
29383 var currentSlide = swiper.slides.eq(i);
29384 currentSlide.remove();
29385 slidesBuffer.unshift(currentSlide);
29386 }
29387
29388 if (typeof slides === 'object' && 'length' in slides) {
29389 for (var i$1 = 0; i$1 < slides.length; i$1 += 1) {
29390 if (slides[i$1]) { $wrapperEl.append(slides[i$1]); }
29391 }
29392 newActiveIndex = activeIndexBuffer > index ? activeIndexBuffer + slides.length : activeIndexBuffer;
29393 } else {
29394 $wrapperEl.append(slides);
29395 }
29396
29397 for (var i$2 = 0; i$2 < slidesBuffer.length; i$2 += 1) {
29398 $wrapperEl.append(slidesBuffer[i$2]);
29399 }
29400
29401 if (params.loop) {
29402 swiper.loopCreate();
29403 }
29404 if (!(params.observer && Support.observer)) {
29405 swiper.update();
29406 }
29407 if (params.loop) {
29408 swiper.slideTo(newActiveIndex + swiper.loopedSlides, 0, false);
29409 } else {
29410 swiper.slideTo(newActiveIndex, 0, false);
29411 }
29412 }
29413
29414 function removeSlide (slidesIndexes) {
29415 var swiper = this;
29416 var params = swiper.params;
29417 var $wrapperEl = swiper.$wrapperEl;
29418 var activeIndex = swiper.activeIndex;
29419
29420 var activeIndexBuffer = activeIndex;
29421 if (params.loop) {
29422 activeIndexBuffer -= swiper.loopedSlides;
29423 swiper.loopDestroy();
29424 swiper.slides = $wrapperEl.children(("." + (params.slideClass)));
29425 }
29426 var newActiveIndex = activeIndexBuffer;
29427 var indexToRemove;
29428
29429 if (typeof slidesIndexes === 'object' && 'length' in slidesIndexes) {
29430 for (var i = 0; i < slidesIndexes.length; i += 1) {
29431 indexToRemove = slidesIndexes[i];
29432 if (swiper.slides[indexToRemove]) { swiper.slides.eq(indexToRemove).remove(); }
29433 if (indexToRemove < newActiveIndex) { newActiveIndex -= 1; }
29434 }
29435 newActiveIndex = Math.max(newActiveIndex, 0);
29436 } else {
29437 indexToRemove = slidesIndexes;
29438 if (swiper.slides[indexToRemove]) { swiper.slides.eq(indexToRemove).remove(); }
29439 if (indexToRemove < newActiveIndex) { newActiveIndex -= 1; }
29440 newActiveIndex = Math.max(newActiveIndex, 0);
29441 }
29442
29443 if (params.loop) {
29444 swiper.loopCreate();
29445 }
29446
29447 if (!(params.observer && Support.observer)) {
29448 swiper.update();
29449 }
29450 if (params.loop) {
29451 swiper.slideTo(newActiveIndex + swiper.loopedSlides, 0, false);
29452 } else {
29453 swiper.slideTo(newActiveIndex, 0, false);
29454 }
29455 }
29456
29457 function removeAllSlides () {
29458 var swiper = this;
29459
29460 var slidesIndexes = [];
29461 for (var i = 0; i < swiper.slides.length; i += 1) {
29462 slidesIndexes.push(i);
29463 }
29464 swiper.removeSlide(slidesIndexes);
29465 }
29466
29467 var manipulation = {
29468 appendSlide: appendSlide,
29469 prependSlide: prependSlide,
29470 addSlide: addSlide,
29471 removeSlide: removeSlide,
29472 removeAllSlides: removeAllSlides,
29473 };
29474
29475 function onTouchStart (event) {
29476 var swiper = this;
29477 var data = swiper.touchEventsData;
29478 var params = swiper.params;
29479 var touches = swiper.touches;
29480 if (swiper.animating && params.preventInteractionOnTransition) {
29481 return;
29482 }
29483 var e = event;
29484 if (e.originalEvent) { e = e.originalEvent; }
29485 data.isTouchEvent = e.type === 'touchstart';
29486 if (!data.isTouchEvent && 'which' in e && e.which === 3) { return; }
29487 if (!data.isTouchEvent && 'button' in e && e.button > 0) { return; }
29488 if (data.isTouched && data.isMoved) { return; }
29489 if (params.noSwiping && $(e.target).closest(params.noSwipingSelector ? params.noSwipingSelector : ("." + (params.noSwipingClass)))[0]) {
29490 swiper.allowClick = true;
29491 return;
29492 }
29493 if (params.swipeHandler) {
29494 if (!$(e).closest(params.swipeHandler)[0]) { return; }
29495 }
29496
29497 touches.currentX = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
29498 touches.currentY = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
29499 var startX = touches.currentX;
29500 var startY = touches.currentY;
29501
29502 // Do NOT start if iOS edge swipe is detected. Otherwise iOS app (UIWebView) cannot swipe-to-go-back anymore
29503
29504 var edgeSwipeDetection = params.edgeSwipeDetection || params.iOSEdgeSwipeDetection;
29505 var edgeSwipeThreshold = params.edgeSwipeThreshold || params.iOSEdgeSwipeThreshold;
29506 if (
29507 edgeSwipeDetection
29508 && ((startX <= edgeSwipeThreshold)
29509 || (startX >= win.screen.width - edgeSwipeThreshold))
29510 ) {
29511 return;
29512 }
29513
29514 Utils.extend(data, {
29515 isTouched: true,
29516 isMoved: false,
29517 allowTouchCallbacks: true,
29518 isScrolling: undefined,
29519 startMoving: undefined,
29520 });
29521
29522 touches.startX = startX;
29523 touches.startY = startY;
29524 data.touchStartTime = Utils.now();
29525 swiper.allowClick = true;
29526 swiper.updateSize();
29527 swiper.swipeDirection = undefined;
29528 if (params.threshold > 0) { data.allowThresholdMove = false; }
29529 if (e.type !== 'touchstart') {
29530 var preventDefault = true;
29531 if ($(e.target).is(data.formElements)) { preventDefault = false; }
29532 if (
29533 doc.activeElement
29534 && $(doc.activeElement).is(data.formElements)
29535 && doc.activeElement !== e.target
29536 ) {
29537 doc.activeElement.blur();
29538 }
29539
29540 var shouldPreventDefault = preventDefault && swiper.allowTouchMove && params.touchStartPreventDefault;
29541 if (params.touchStartForcePreventDefault || shouldPreventDefault) {
29542 e.preventDefault();
29543 }
29544 }
29545 swiper.emit('touchStart', e);
29546 }
29547
29548 function onTouchMove (event) {
29549 var swiper = this;
29550 var data = swiper.touchEventsData;
29551 var params = swiper.params;
29552 var touches = swiper.touches;
29553 var rtl = swiper.rtlTranslate;
29554 var e = event;
29555 if (e.originalEvent) { e = e.originalEvent; }
29556 if (!data.isTouched) {
29557 if (data.startMoving && data.isScrolling) {
29558 swiper.emit('touchMoveOpposite', e);
29559 }
29560 return;
29561 }
29562 if (data.isTouchEvent && e.type === 'mousemove') { return; }
29563 var pageX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;
29564 var pageY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
29565 if (e.preventedByNestedSwiper) {
29566 touches.startX = pageX;
29567 touches.startY = pageY;
29568 return;
29569 }
29570 if (!swiper.allowTouchMove) {
29571 // isMoved = true;
29572 swiper.allowClick = false;
29573 if (data.isTouched) {
29574 Utils.extend(touches, {
29575 startX: pageX,
29576 startY: pageY,
29577 currentX: pageX,
29578 currentY: pageY,
29579 });
29580 data.touchStartTime = Utils.now();
29581 }
29582 return;
29583 }
29584 if (data.isTouchEvent && params.touchReleaseOnEdges && !params.loop) {
29585 if (swiper.isVertical()) {
29586 // Vertical
29587 if (
29588 (pageY < touches.startY && swiper.translate <= swiper.maxTranslate())
29589 || (pageY > touches.startY && swiper.translate >= swiper.minTranslate())
29590 ) {
29591 data.isTouched = false;
29592 data.isMoved = false;
29593 return;
29594 }
29595 } else if (
29596 (pageX < touches.startX && swiper.translate <= swiper.maxTranslate())
29597 || (pageX > touches.startX && swiper.translate >= swiper.minTranslate())
29598 ) {
29599 return;
29600 }
29601 }
29602 if (data.isTouchEvent && doc.activeElement) {
29603 if (e.target === doc.activeElement && $(e.target).is(data.formElements)) {
29604 data.isMoved = true;
29605 swiper.allowClick = false;
29606 return;
29607 }
29608 }
29609 if (data.allowTouchCallbacks) {
29610 swiper.emit('touchMove', e);
29611 }
29612 if (e.targetTouches && e.targetTouches.length > 1) { return; }
29613
29614 touches.currentX = pageX;
29615 touches.currentY = pageY;
29616
29617 var diffX = touches.currentX - touches.startX;
29618 var diffY = touches.currentY - touches.startY;
29619 if (swiper.params.threshold && Math.sqrt((Math.pow( diffX, 2 )) + (Math.pow( diffY, 2 ))) < swiper.params.threshold) { return; }
29620
29621 if (typeof data.isScrolling === 'undefined') {
29622 var touchAngle;
29623 if ((swiper.isHorizontal() && touches.currentY === touches.startY) || (swiper.isVertical() && touches.currentX === touches.startX)) {
29624 data.isScrolling = false;
29625 } else {
29626 // eslint-disable-next-line
29627 if ((diffX * diffX) + (diffY * diffY) >= 25) {
29628 touchAngle = (Math.atan2(Math.abs(diffY), Math.abs(diffX)) * 180) / Math.PI;
29629 data.isScrolling = swiper.isHorizontal() ? touchAngle > params.touchAngle : (90 - touchAngle > params.touchAngle);
29630 }
29631 }
29632 }
29633 if (data.isScrolling) {
29634 swiper.emit('touchMoveOpposite', e);
29635 }
29636 if (typeof data.startMoving === 'undefined') {
29637 if (touches.currentX !== touches.startX || touches.currentY !== touches.startY) {
29638 data.startMoving = true;
29639 }
29640 }
29641 if (data.isScrolling) {
29642 data.isTouched = false;
29643 return;
29644 }
29645 if (!data.startMoving) {
29646 return;
29647 }
29648 swiper.allowClick = false;
29649 e.preventDefault();
29650 if (params.touchMoveStopPropagation && !params.nested) {
29651 e.stopPropagation();
29652 }
29653
29654 if (!data.isMoved) {
29655 if (params.loop) {
29656 swiper.loopFix();
29657 }
29658 data.startTranslate = swiper.getTranslate();
29659 swiper.setTransition(0);
29660 if (swiper.animating) {
29661 swiper.$wrapperEl.trigger('webkitTransitionEnd transitionend');
29662 }
29663 data.allowMomentumBounce = false;
29664 // Grab Cursor
29665 if (params.grabCursor && (swiper.allowSlideNext === true || swiper.allowSlidePrev === true)) {
29666 swiper.setGrabCursor(true);
29667 }
29668 swiper.emit('sliderFirstMove', e);
29669 }
29670 swiper.emit('sliderMove', e);
29671 data.isMoved = true;
29672
29673 var diff = swiper.isHorizontal() ? diffX : diffY;
29674 touches.diff = diff;
29675
29676 diff *= params.touchRatio;
29677 if (rtl) { diff = -diff; }
29678
29679 swiper.swipeDirection = diff > 0 ? 'prev' : 'next';
29680 data.currentTranslate = diff + data.startTranslate;
29681
29682 var disableParentSwiper = true;
29683 var resistanceRatio = params.resistanceRatio;
29684 if (params.touchReleaseOnEdges) {
29685 resistanceRatio = 0;
29686 }
29687 if ((diff > 0 && data.currentTranslate > swiper.minTranslate())) {
29688 disableParentSwiper = false;
29689 if (params.resistance) { data.currentTranslate = (swiper.minTranslate() - 1) + (Math.pow( (-swiper.minTranslate() + data.startTranslate + diff), resistanceRatio )); }
29690 } else if (diff < 0 && data.currentTranslate < swiper.maxTranslate()) {
29691 disableParentSwiper = false;
29692 if (params.resistance) { data.currentTranslate = (swiper.maxTranslate() + 1) - (Math.pow( (swiper.maxTranslate() - data.startTranslate - diff), resistanceRatio )); }
29693 }
29694
29695 if (disableParentSwiper) {
29696 e.preventedByNestedSwiper = true;
29697 }
29698
29699 // Directions locks
29700 if (!swiper.allowSlideNext && swiper.swipeDirection === 'next' && data.currentTranslate < data.startTranslate) {
29701 data.currentTranslate = data.startTranslate;
29702 }
29703 if (!swiper.allowSlidePrev && swiper.swipeDirection === 'prev' && data.currentTranslate > data.startTranslate) {
29704 data.currentTranslate = data.startTranslate;
29705 }
29706
29707
29708 // Threshold
29709 if (params.threshold > 0) {
29710 if (Math.abs(diff) > params.threshold || data.allowThresholdMove) {
29711 if (!data.allowThresholdMove) {
29712 data.allowThresholdMove = true;
29713 touches.startX = touches.currentX;
29714 touches.startY = touches.currentY;
29715 data.currentTranslate = data.startTranslate;
29716 touches.diff = swiper.isHorizontal() ? touches.currentX - touches.startX : touches.currentY - touches.startY;
29717 return;
29718 }
29719 } else {
29720 data.currentTranslate = data.startTranslate;
29721 return;
29722 }
29723 }
29724
29725 if (!params.followFinger) { return; }
29726
29727 // Update active index in free mode
29728 if (params.freeMode || params.watchSlidesProgress || params.watchSlidesVisibility) {
29729 swiper.updateActiveIndex();
29730 swiper.updateSlidesClasses();
29731 }
29732 if (params.freeMode) {
29733 // Velocity
29734 if (data.velocities.length === 0) {
29735 data.velocities.push({
29736 position: touches[swiper.isHorizontal() ? 'startX' : 'startY'],
29737 time: data.touchStartTime,
29738 });
29739 }
29740 data.velocities.push({
29741 position: touches[swiper.isHorizontal() ? 'currentX' : 'currentY'],
29742 time: Utils.now(),
29743 });
29744 }
29745 // Update progress
29746 swiper.updateProgress(data.currentTranslate);
29747 // Update translate
29748 swiper.setTranslate(data.currentTranslate);
29749 }
29750
29751 function onTouchEnd (event) {
29752 var swiper = this;
29753 var data = swiper.touchEventsData;
29754
29755 var params = swiper.params;
29756 var touches = swiper.touches;
29757 var rtl = swiper.rtlTranslate;
29758 var $wrapperEl = swiper.$wrapperEl;
29759 var slidesGrid = swiper.slidesGrid;
29760 var snapGrid = swiper.snapGrid;
29761 var e = event;
29762 if (e.originalEvent) { e = e.originalEvent; }
29763 if (data.allowTouchCallbacks) {
29764 swiper.emit('touchEnd', e);
29765 }
29766 data.allowTouchCallbacks = false;
29767 if (!data.isTouched) {
29768 if (data.isMoved && params.grabCursor) {
29769 swiper.setGrabCursor(false);
29770 }
29771 data.isMoved = false;
29772 data.startMoving = false;
29773 return;
29774 }
29775 // Return Grab Cursor
29776 if (params.grabCursor && data.isMoved && data.isTouched && (swiper.allowSlideNext === true || swiper.allowSlidePrev === true)) {
29777 swiper.setGrabCursor(false);
29778 }
29779
29780 // Time diff
29781 var touchEndTime = Utils.now();
29782 var timeDiff = touchEndTime - data.touchStartTime;
29783
29784 // Tap, doubleTap, Click
29785 if (swiper.allowClick) {
29786 swiper.updateClickedSlide(e);
29787 swiper.emit('tap', e);
29788 if (timeDiff < 300 && (touchEndTime - data.lastClickTime) > 300) {
29789 if (data.clickTimeout) { clearTimeout(data.clickTimeout); }
29790 data.clickTimeout = Utils.nextTick(function () {
29791 if (!swiper || swiper.destroyed) { return; }
29792 swiper.emit('click', e);
29793 }, 300);
29794 }
29795 if (timeDiff < 300 && (touchEndTime - data.lastClickTime) < 300) {
29796 if (data.clickTimeout) { clearTimeout(data.clickTimeout); }
29797 swiper.emit('doubleTap', e);
29798 }
29799 }
29800
29801 data.lastClickTime = Utils.now();
29802 Utils.nextTick(function () {
29803 if (!swiper.destroyed) { swiper.allowClick = true; }
29804 });
29805
29806 if (!data.isTouched || !data.isMoved || !swiper.swipeDirection || touches.diff === 0 || data.currentTranslate === data.startTranslate) {
29807 data.isTouched = false;
29808 data.isMoved = false;
29809 data.startMoving = false;
29810 return;
29811 }
29812 data.isTouched = false;
29813 data.isMoved = false;
29814 data.startMoving = false;
29815
29816 var currentPos;
29817 if (params.followFinger) {
29818 currentPos = rtl ? swiper.translate : -swiper.translate;
29819 } else {
29820 currentPos = -data.currentTranslate;
29821 }
29822
29823 if (params.freeMode) {
29824 if (currentPos < -swiper.minTranslate()) {
29825 swiper.slideTo(swiper.activeIndex);
29826 return;
29827 }
29828 if (currentPos > -swiper.maxTranslate()) {
29829 if (swiper.slides.length < snapGrid.length) {
29830 swiper.slideTo(snapGrid.length - 1);
29831 } else {
29832 swiper.slideTo(swiper.slides.length - 1);
29833 }
29834 return;
29835 }
29836
29837 if (params.freeModeMomentum) {
29838 if (data.velocities.length > 1) {
29839 var lastMoveEvent = data.velocities.pop();
29840 var velocityEvent = data.velocities.pop();
29841
29842 var distance = lastMoveEvent.position - velocityEvent.position;
29843 var time = lastMoveEvent.time - velocityEvent.time;
29844 swiper.velocity = distance / time;
29845 swiper.velocity /= 2;
29846 if (Math.abs(swiper.velocity) < params.freeModeMinimumVelocity) {
29847 swiper.velocity = 0;
29848 }
29849 // this implies that the user stopped moving a finger then released.
29850 // There would be no events with distance zero, so the last event is stale.
29851 if (time > 150 || (Utils.now() - lastMoveEvent.time) > 300) {
29852 swiper.velocity = 0;
29853 }
29854 } else {
29855 swiper.velocity = 0;
29856 }
29857 swiper.velocity *= params.freeModeMomentumVelocityRatio;
29858
29859 data.velocities.length = 0;
29860 var momentumDuration = 1000 * params.freeModeMomentumRatio;
29861 var momentumDistance = swiper.velocity * momentumDuration;
29862
29863 var newPosition = swiper.translate + momentumDistance;
29864 if (rtl) { newPosition = -newPosition; }
29865
29866 var doBounce = false;
29867 var afterBouncePosition;
29868 var bounceAmount = Math.abs(swiper.velocity) * 20 * params.freeModeMomentumBounceRatio;
29869 var needsLoopFix;
29870 if (newPosition < swiper.maxTranslate()) {
29871 if (params.freeModeMomentumBounce) {
29872 if (newPosition + swiper.maxTranslate() < -bounceAmount) {
29873 newPosition = swiper.maxTranslate() - bounceAmount;
29874 }
29875 afterBouncePosition = swiper.maxTranslate();
29876 doBounce = true;
29877 data.allowMomentumBounce = true;
29878 } else {
29879 newPosition = swiper.maxTranslate();
29880 }
29881 if (params.loop && params.centeredSlides) { needsLoopFix = true; }
29882 } else if (newPosition > swiper.minTranslate()) {
29883 if (params.freeModeMomentumBounce) {
29884 if (newPosition - swiper.minTranslate() > bounceAmount) {
29885 newPosition = swiper.minTranslate() + bounceAmount;
29886 }
29887 afterBouncePosition = swiper.minTranslate();
29888 doBounce = true;
29889 data.allowMomentumBounce = true;
29890 } else {
29891 newPosition = swiper.minTranslate();
29892 }
29893 if (params.loop && params.centeredSlides) { needsLoopFix = true; }
29894 } else if (params.freeModeSticky) {
29895 var nextSlide;
29896 for (var j = 0; j < snapGrid.length; j += 1) {
29897 if (snapGrid[j] > -newPosition) {
29898 nextSlide = j;
29899 break;
29900 }
29901 }
29902
29903 if (Math.abs(snapGrid[nextSlide] - newPosition) < Math.abs(snapGrid[nextSlide - 1] - newPosition) || swiper.swipeDirection === 'next') {
29904 newPosition = snapGrid[nextSlide];
29905 } else {
29906 newPosition = snapGrid[nextSlide - 1];
29907 }
29908 newPosition = -newPosition;
29909 }
29910 if (needsLoopFix) {
29911 swiper.once('transitionEnd', function () {
29912 swiper.loopFix();
29913 });
29914 }
29915 // Fix duration
29916 if (swiper.velocity !== 0) {
29917 if (rtl) {
29918 momentumDuration = Math.abs((-newPosition - swiper.translate) / swiper.velocity);
29919 } else {
29920 momentumDuration = Math.abs((newPosition - swiper.translate) / swiper.velocity);
29921 }
29922 } else if (params.freeModeSticky) {
29923 swiper.slideToClosest();
29924 return;
29925 }
29926
29927 if (params.freeModeMomentumBounce && doBounce) {
29928 swiper.updateProgress(afterBouncePosition);
29929 swiper.setTransition(momentumDuration);
29930 swiper.setTranslate(newPosition);
29931 swiper.transitionStart(true, swiper.swipeDirection);
29932 swiper.animating = true;
29933 $wrapperEl.transitionEnd(function () {
29934 if (!swiper || swiper.destroyed || !data.allowMomentumBounce) { return; }
29935 swiper.emit('momentumBounce');
29936
29937 swiper.setTransition(params.speed);
29938 swiper.setTranslate(afterBouncePosition);
29939 $wrapperEl.transitionEnd(function () {
29940 if (!swiper || swiper.destroyed) { return; }
29941 swiper.transitionEnd();
29942 });
29943 });
29944 } else if (swiper.velocity) {
29945 swiper.updateProgress(newPosition);
29946 swiper.setTransition(momentumDuration);
29947 swiper.setTranslate(newPosition);
29948 swiper.transitionStart(true, swiper.swipeDirection);
29949 if (!swiper.animating) {
29950 swiper.animating = true;
29951 $wrapperEl.transitionEnd(function () {
29952 if (!swiper || swiper.destroyed) { return; }
29953 swiper.transitionEnd();
29954 });
29955 }
29956 } else {
29957 swiper.updateProgress(newPosition);
29958 }
29959
29960 swiper.updateActiveIndex();
29961 swiper.updateSlidesClasses();
29962 } else if (params.freeModeSticky) {
29963 swiper.slideToClosest();
29964 return;
29965 }
29966
29967 if (!params.freeModeMomentum || timeDiff >= params.longSwipesMs) {
29968 swiper.updateProgress();
29969 swiper.updateActiveIndex();
29970 swiper.updateSlidesClasses();
29971 }
29972 return;
29973 }
29974
29975 // Find current slide
29976 var stopIndex = 0;
29977 var groupSize = swiper.slidesSizesGrid[0];
29978 for (var i = 0; i < slidesGrid.length; i += params.slidesPerGroup) {
29979 if (typeof slidesGrid[i + params.slidesPerGroup] !== 'undefined') {
29980 if (currentPos >= slidesGrid[i] && currentPos < slidesGrid[i + params.slidesPerGroup]) {
29981 stopIndex = i;
29982 groupSize = slidesGrid[i + params.slidesPerGroup] - slidesGrid[i];
29983 }
29984 } else if (currentPos >= slidesGrid[i]) {
29985 stopIndex = i;
29986 groupSize = slidesGrid[slidesGrid.length - 1] - slidesGrid[slidesGrid.length - 2];
29987 }
29988 }
29989
29990 // Find current slide size
29991 var ratio = (currentPos - slidesGrid[stopIndex]) / groupSize;
29992
29993 if (timeDiff > params.longSwipesMs) {
29994 // Long touches
29995 if (!params.longSwipes) {
29996 swiper.slideTo(swiper.activeIndex);
29997 return;
29998 }
29999 if (swiper.swipeDirection === 'next') {
30000 if (ratio >= params.longSwipesRatio) { swiper.slideTo(stopIndex + params.slidesPerGroup); }
30001 else { swiper.slideTo(stopIndex); }
30002 }
30003 if (swiper.swipeDirection === 'prev') {
30004 if (ratio > (1 - params.longSwipesRatio)) { swiper.slideTo(stopIndex + params.slidesPerGroup); }
30005 else { swiper.slideTo(stopIndex); }
30006 }
30007 } else {
30008 // Short swipes
30009 if (!params.shortSwipes) {
30010 swiper.slideTo(swiper.activeIndex);
30011 return;
30012 }
30013 if (swiper.swipeDirection === 'next') {
30014 swiper.slideTo(stopIndex + params.slidesPerGroup);
30015 }
30016 if (swiper.swipeDirection === 'prev') {
30017 swiper.slideTo(stopIndex);
30018 }
30019 }
30020 }
30021
30022 function onResize () {
30023 var swiper = this;
30024
30025 var params = swiper.params;
30026 var el = swiper.el;
30027
30028 if (el && el.offsetWidth === 0) { return; }
30029
30030 // Breakpoints
30031 if (params.breakpoints) {
30032 swiper.setBreakpoint();
30033 }
30034
30035 // Save locks
30036 var allowSlideNext = swiper.allowSlideNext;
30037 var allowSlidePrev = swiper.allowSlidePrev;
30038 var snapGrid = swiper.snapGrid;
30039
30040 // Disable locks on resize
30041 swiper.allowSlideNext = true;
30042 swiper.allowSlidePrev = true;
30043
30044 swiper.updateSize();
30045 swiper.updateSlides();
30046
30047 if (params.freeMode) {
30048 var newTranslate = Math.min(Math.max(swiper.translate, swiper.maxTranslate()), swiper.minTranslate());
30049 swiper.setTranslate(newTranslate);
30050 swiper.updateActiveIndex();
30051 swiper.updateSlidesClasses();
30052
30053 if (params.autoHeight) {
30054 swiper.updateAutoHeight();
30055 }
30056 } else {
30057 swiper.updateSlidesClasses();
30058 if ((params.slidesPerView === 'auto' || params.slidesPerView > 1) && swiper.isEnd && !swiper.params.centeredSlides) {
30059 swiper.slideTo(swiper.slides.length - 1, 0, false, true);
30060 } else {
30061 swiper.slideTo(swiper.activeIndex, 0, false, true);
30062 }
30063 }
30064 // Return locks after resize
30065 swiper.allowSlidePrev = allowSlidePrev;
30066 swiper.allowSlideNext = allowSlideNext;
30067
30068 if (swiper.params.watchOverflow && snapGrid !== swiper.snapGrid) {
30069 swiper.checkOverflow();
30070 }
30071 }
30072
30073 function onClick (e) {
30074 var swiper = this;
30075 if (!swiper.allowClick) {
30076 if (swiper.params.preventClicks) { e.preventDefault(); }
30077 if (swiper.params.preventClicksPropagation && swiper.animating) {
30078 e.stopPropagation();
30079 e.stopImmediatePropagation();
30080 }
30081 }
30082 }
30083
30084 function attachEvents() {
30085 var swiper = this;
30086 var params = swiper.params;
30087 var touchEvents = swiper.touchEvents;
30088 var el = swiper.el;
30089 var wrapperEl = swiper.wrapperEl;
30090
30091 {
30092 swiper.onTouchStart = onTouchStart.bind(swiper);
30093 swiper.onTouchMove = onTouchMove.bind(swiper);
30094 swiper.onTouchEnd = onTouchEnd.bind(swiper);
30095 }
30096
30097 swiper.onClick = onClick.bind(swiper);
30098
30099 var target = params.touchEventsTarget === 'container' ? el : wrapperEl;
30100 var capture = !!params.nested;
30101
30102 // Touch Events
30103 {
30104 if (!Support.touch && (Support.pointerEvents || Support.prefixedPointerEvents)) {
30105 target.addEventListener(touchEvents.start, swiper.onTouchStart, false);
30106 doc.addEventListener(touchEvents.move, swiper.onTouchMove, capture);
30107 doc.addEventListener(touchEvents.end, swiper.onTouchEnd, false);
30108 } else {
30109 if (Support.touch) {
30110 var passiveListener = touchEvents.start === 'touchstart' && Support.passiveListener && params.passiveListeners ? { passive: true, capture: false } : false;
30111 target.addEventListener(touchEvents.start, swiper.onTouchStart, passiveListener);
30112 target.addEventListener(touchEvents.move, swiper.onTouchMove, Support.passiveListener ? { passive: false, capture: capture } : capture);
30113 target.addEventListener(touchEvents.end, swiper.onTouchEnd, passiveListener);
30114 }
30115 if ((params.simulateTouch && !Device.ios && !Device.android) || (params.simulateTouch && !Support.touch && Device.ios)) {
30116 target.addEventListener('mousedown', swiper.onTouchStart, false);
30117 doc.addEventListener('mousemove', swiper.onTouchMove, capture);
30118 doc.addEventListener('mouseup', swiper.onTouchEnd, false);
30119 }
30120 }
30121 // Prevent Links Clicks
30122 if (params.preventClicks || params.preventClicksPropagation) {
30123 target.addEventListener('click', swiper.onClick, true);
30124 }
30125 }
30126
30127 // Resize handler
30128 swiper.on((Device.ios || Device.android ? 'resize orientationchange observerUpdate' : 'resize observerUpdate'), onResize, true);
30129 }
30130
30131 function detachEvents() {
30132 var swiper = this;
30133
30134 var params = swiper.params;
30135 var touchEvents = swiper.touchEvents;
30136 var el = swiper.el;
30137 var wrapperEl = swiper.wrapperEl;
30138
30139 var target = params.touchEventsTarget === 'container' ? el : wrapperEl;
30140 var capture = !!params.nested;
30141
30142 // Touch Events
30143 {
30144 if (!Support.touch && (Support.pointerEvents || Support.prefixedPointerEvents)) {
30145 target.removeEventListener(touchEvents.start, swiper.onTouchStart, false);
30146 doc.removeEventListener(touchEvents.move, swiper.onTouchMove, capture);
30147 doc.removeEventListener(touchEvents.end, swiper.onTouchEnd, false);
30148 } else {
30149 if (Support.touch) {
30150 var passiveListener = touchEvents.start === 'onTouchStart' && Support.passiveListener && params.passiveListeners ? { passive: true, capture: false } : false;
30151 target.removeEventListener(touchEvents.start, swiper.onTouchStart, passiveListener);
30152 target.removeEventListener(touchEvents.move, swiper.onTouchMove, capture);
30153 target.removeEventListener(touchEvents.end, swiper.onTouchEnd, passiveListener);
30154 }
30155 if ((params.simulateTouch && !Device.ios && !Device.android) || (params.simulateTouch && !Support.touch && Device.ios)) {
30156 target.removeEventListener('mousedown', swiper.onTouchStart, false);
30157 doc.removeEventListener('mousemove', swiper.onTouchMove, capture);
30158 doc.removeEventListener('mouseup', swiper.onTouchEnd, false);
30159 }
30160 }
30161 // Prevent Links Clicks
30162 if (params.preventClicks || params.preventClicksPropagation) {
30163 target.removeEventListener('click', swiper.onClick, true);
30164 }
30165 }
30166
30167 // Resize handler
30168 swiper.off((Device.ios || Device.android ? 'resize orientationchange observerUpdate' : 'resize observerUpdate'), onResize);
30169 }
30170
30171 var events = {
30172 attachEvents: attachEvents,
30173 detachEvents: detachEvents,
30174 };
30175
30176 function setBreakpoint () {
30177 var swiper = this;
30178 var activeIndex = swiper.activeIndex;
30179 var initialized = swiper.initialized;
30180 var loopedSlides = swiper.loopedSlides; if ( loopedSlides === void 0 ) loopedSlides = 0;
30181 var params = swiper.params;
30182 var breakpoints = params.breakpoints;
30183 if (!breakpoints || (breakpoints && Object.keys(breakpoints).length === 0)) { return; }
30184
30185 // Set breakpoint for window width and update parameters
30186 var breakpoint = swiper.getBreakpoint(breakpoints);
30187
30188 if (breakpoint && swiper.currentBreakpoint !== breakpoint) {
30189 var breakpointOnlyParams = breakpoint in breakpoints ? breakpoints[breakpoint] : undefined;
30190 if (breakpointOnlyParams) {
30191 ['slidesPerView', 'spaceBetween', 'slidesPerGroup'].forEach(function (param) {
30192 var paramValue = breakpointOnlyParams[param];
30193 if (typeof paramValue === 'undefined') { return; }
30194 if (param === 'slidesPerView' && (paramValue === 'AUTO' || paramValue === 'auto')) {
30195 breakpointOnlyParams[param] = 'auto';
30196 } else if (param === 'slidesPerView') {
30197 breakpointOnlyParams[param] = parseFloat(paramValue);
30198 } else {
30199 breakpointOnlyParams[param] = parseInt(paramValue, 10);
30200 }
30201 });
30202 }
30203
30204 var breakpointParams = breakpointOnlyParams || swiper.originalParams;
5d51ea26
DC
30205 var directionChanged = breakpointParams.direction && breakpointParams.direction !== params.direction;
30206 var needsReLoop = params.loop && (breakpointParams.slidesPerView !== params.slidesPerView || directionChanged);
30207
30208 if (directionChanged && initialized) {
30209 swiper.changeDirection();
30210 }
5309fbda
DC
30211
30212 Utils.extend(swiper.params, breakpointParams);
30213
30214 Utils.extend(swiper, {
30215 allowTouchMove: swiper.params.allowTouchMove,
30216 allowSlideNext: swiper.params.allowSlideNext,
30217 allowSlidePrev: swiper.params.allowSlidePrev,
30218 });
30219
30220 swiper.currentBreakpoint = breakpoint;
30221
30222 if (needsReLoop && initialized) {
30223 swiper.loopDestroy();
30224 swiper.loopCreate();
30225 swiper.updateSlides();
30226 swiper.slideTo((activeIndex - loopedSlides) + swiper.loopedSlides, 0, false);
30227 }
5d51ea26 30228
5309fbda
DC
30229 swiper.emit('breakpoint', breakpointParams);
30230 }
30231 }
30232
30233 function getBreakpoint (breakpoints) {
30234 var swiper = this;
30235 // Get breakpoint for window width
30236 if (!breakpoints) { return undefined; }
30237 var breakpoint = false;
30238 var points = [];
30239 Object.keys(breakpoints).forEach(function (point) {
30240 points.push(point);
30241 });
30242 points.sort(function (a, b) { return parseInt(a, 10) - parseInt(b, 10); });
30243 for (var i = 0; i < points.length; i += 1) {
30244 var point = points[i];
30245 if (swiper.params.breakpointsInverse) {
30246 if (point <= win.innerWidth) {
30247 breakpoint = point;
30248 }
30249 } else if (point >= win.innerWidth && !breakpoint) {
30250 breakpoint = point;
30251 }
30252 }
30253 return breakpoint || 'max';
30254 }
30255
30256 var breakpoints = { setBreakpoint: setBreakpoint, getBreakpoint: getBreakpoint };
30257
5309fbda
DC
30258 function addClasses () {
30259 var swiper = this;
30260 var classNames = swiper.classNames;
30261 var params = swiper.params;
30262 var rtl = swiper.rtl;
30263 var $el = swiper.$el;
30264 var suffixes = [];
30265
5d51ea26 30266 suffixes.push('initialized');
5309fbda
DC
30267 suffixes.push(params.direction);
30268
30269 if (params.freeMode) {
30270 suffixes.push('free-mode');
30271 }
30272 if (!Support.flexbox) {
30273 suffixes.push('no-flexbox');
30274 }
30275 if (params.autoHeight) {
30276 suffixes.push('autoheight');
30277 }
30278 if (rtl) {
30279 suffixes.push('rtl');
30280 }
30281 if (params.slidesPerColumn > 1) {
30282 suffixes.push('multirow');
30283 }
30284 if (Device.android) {
30285 suffixes.push('android');
30286 }
30287 if (Device.ios) {
30288 suffixes.push('ios');
30289 }
30290 // WP8 Touch Events Fix
30291 if ((Browser.isIE || Browser.isEdge) && (Support.pointerEvents || Support.prefixedPointerEvents)) {
30292 suffixes.push(("wp8-" + (params.direction)));
30293 }
30294
30295 suffixes.forEach(function (suffix) {
30296 classNames.push(params.containerModifierClass + suffix);
30297 });
30298
30299 $el.addClass(classNames.join(' '));
30300 }
30301
30302 function removeClasses () {
30303 var swiper = this;
30304 var $el = swiper.$el;
30305 var classNames = swiper.classNames;
30306
30307 $el.removeClass(classNames.join(' '));
30308 }
30309
30310 var classes = { addClasses: addClasses, removeClasses: removeClasses };
30311
30312 function loadImage (imageEl, src, srcset, sizes, checkForComplete, callback) {
30313 var image;
30314 function onReady() {
30315 if (callback) { callback(); }
30316 }
30317 if (!imageEl.complete || !checkForComplete) {
30318 if (src) {
30319 image = new win.Image();
30320 image.onload = onReady;
30321 image.onerror = onReady;
30322 if (sizes) {
30323 image.sizes = sizes;
30324 }
30325 if (srcset) {
30326 image.srcset = srcset;
30327 }
30328 if (src) {
30329 image.src = src;
30330 }
30331 } else {
30332 onReady();
30333 }
30334 } else {
30335 // image already loaded...
30336 onReady();
30337 }
30338 }
30339
30340 function preloadImages () {
30341 var swiper = this;
30342 swiper.imagesToLoad = swiper.$el.find('img');
30343 function onReady() {
30344 if (typeof swiper === 'undefined' || swiper === null || !swiper || swiper.destroyed) { return; }
30345 if (swiper.imagesLoaded !== undefined) { swiper.imagesLoaded += 1; }
30346 if (swiper.imagesLoaded === swiper.imagesToLoad.length) {
30347 if (swiper.params.updateOnImagesReady) { swiper.update(); }
30348 swiper.emit('imagesReady');
30349 }
30350 }
30351 for (var i = 0; i < swiper.imagesToLoad.length; i += 1) {
30352 var imageEl = swiper.imagesToLoad[i];
30353 swiper.loadImage(
30354 imageEl,
30355 imageEl.currentSrc || imageEl.getAttribute('src'),
30356 imageEl.srcset || imageEl.getAttribute('srcset'),
30357 imageEl.sizes || imageEl.getAttribute('sizes'),
30358 true,
30359 onReady
30360 );
30361 }
30362 }
30363
30364 var images = {
30365 loadImage: loadImage,
30366 preloadImages: preloadImages,
30367 };
30368
30369 function checkOverflow() {
30370 var swiper = this;
30371 var wasLocked = swiper.isLocked;
30372
30373 swiper.isLocked = swiper.snapGrid.length === 1;
30374 swiper.allowSlideNext = !swiper.isLocked;
30375 swiper.allowSlidePrev = !swiper.isLocked;
30376
30377 // events
30378 if (wasLocked !== swiper.isLocked) { swiper.emit(swiper.isLocked ? 'lock' : 'unlock'); }
30379
30380 if (wasLocked && wasLocked !== swiper.isLocked) {
30381 swiper.isEnd = false;
30382 swiper.navigation.update();
30383 }
30384 }
30385
30386 var checkOverflow$1 = { checkOverflow: checkOverflow };
30387
30388 var defaults = {
30389 init: true,
30390 direction: 'horizontal',
30391 touchEventsTarget: 'container',
30392 initialSlide: 0,
30393 speed: 300,
30394 //
30395 preventInteractionOnTransition: false,
30396
30397 // To support iOS's swipe-to-go-back gesture (when being used in-app, with UIWebView).
30398 edgeSwipeDetection: false,
30399 edgeSwipeThreshold: 20,
30400
30401 // Free mode
30402 freeMode: false,
30403 freeModeMomentum: true,
30404 freeModeMomentumRatio: 1,
30405 freeModeMomentumBounce: true,
30406 freeModeMomentumBounceRatio: 1,
30407 freeModeMomentumVelocityRatio: 1,
30408 freeModeSticky: false,
30409 freeModeMinimumVelocity: 0.02,
30410
30411 // Autoheight
30412 autoHeight: false,
30413
30414 // Set wrapper width
30415 setWrapperSize: false,
30416
30417 // Virtual Translate
30418 virtualTranslate: false,
30419
30420 // Effects
30421 effect: 'slide', // 'slide' or 'fade' or 'cube' or 'coverflow' or 'flip'
30422
30423 // Breakpoints
30424 breakpoints: undefined,
30425 breakpointsInverse: false,
30426
30427 // Slides grid
30428 spaceBetween: 0,
30429 slidesPerView: 1,
30430 slidesPerColumn: 1,
30431 slidesPerColumnFill: 'column',
30432 slidesPerGroup: 1,
30433 centeredSlides: false,
30434 slidesOffsetBefore: 0, // in px
30435 slidesOffsetAfter: 0, // in px
30436 normalizeSlideIndex: true,
30437 centerInsufficientSlides: false,
30438
30439 // Disable swiper and hide navigation when container not overflow
30440 watchOverflow: false,
30441
30442 // Round length
30443 roundLengths: false,
30444
30445 // Touches
30446 touchRatio: 1,
30447 touchAngle: 45,
30448 simulateTouch: true,
30449 shortSwipes: true,
30450 longSwipes: true,
30451 longSwipesRatio: 0.5,
30452 longSwipesMs: 300,
30453 followFinger: true,
30454 allowTouchMove: true,
30455 threshold: 0,
30456 touchMoveStopPropagation: true,
30457 touchStartPreventDefault: true,
30458 touchStartForcePreventDefault: false,
30459 touchReleaseOnEdges: false,
30460
30461 // Unique Navigation Elements
30462 uniqueNavElements: true,
30463
30464 // Resistance
30465 resistance: true,
30466 resistanceRatio: 0.85,
30467
30468 // Progress
30469 watchSlidesProgress: false,
30470 watchSlidesVisibility: false,
30471
30472 // Cursor
30473 grabCursor: false,
30474
30475 // Clicks
30476 preventClicks: true,
30477 preventClicksPropagation: true,
30478 slideToClickedSlide: false,
30479
30480 // Images
30481 preloadImages: true,
30482 updateOnImagesReady: true,
30483
30484 // loop
30485 loop: false,
30486 loopAdditionalSlides: 0,
30487 loopedSlides: null,
30488 loopFillGroupWithBlank: false,
30489
30490 // Swiping/no swiping
30491 allowSlidePrev: true,
30492 allowSlideNext: true,
30493 swipeHandler: null, // '.swipe-handler',
30494 noSwiping: true,
30495 noSwipingClass: 'swiper-no-swiping',
30496 noSwipingSelector: null,
30497
30498 // Passive Listeners
30499 passiveListeners: true,
30500
30501 // NS
30502 containerModifierClass: 'swiper-container-', // NEW
30503 slideClass: 'swiper-slide',
30504 slideBlankClass: 'swiper-slide-invisible-blank',
30505 slideActiveClass: 'swiper-slide-active',
30506 slideDuplicateActiveClass: 'swiper-slide-duplicate-active',
30507 slideVisibleClass: 'swiper-slide-visible',
30508 slideDuplicateClass: 'swiper-slide-duplicate',
30509 slideNextClass: 'swiper-slide-next',
30510 slideDuplicateNextClass: 'swiper-slide-duplicate-next',
30511 slidePrevClass: 'swiper-slide-prev',
30512 slideDuplicatePrevClass: 'swiper-slide-duplicate-prev',
30513 wrapperClass: 'swiper-wrapper',
30514
30515 // Callbacks
30516 runCallbacksOnInit: true,
30517 };
30518
5d51ea26
DC
30519 /* eslint no-param-reassign: "off" */
30520
5309fbda
DC
30521 var prototypes = {
30522 update: update,
30523 translate: translate,
30524 transition: transition$1,
30525 slide: slide,
30526 loop: loop,
30527 grabCursor: grabCursor,
30528 manipulation: manipulation,
30529 events: events,
30530 breakpoints: breakpoints,
30531 checkOverflow: checkOverflow$1,
30532 classes: classes,
30533 images: images,
30534 };
30535
30536 var extendedDefaults = {};
30537
30538 var Swiper = /*@__PURE__*/(function (SwiperClass) {
30539 function Swiper() {
30540 var assign;
30541
30542 var args = [], len = arguments.length;
30543 while ( len-- ) args[ len ] = arguments[ len ];
30544 var el;
30545 var params;
30546 if (args.length === 1 && args[0].constructor && args[0].constructor === Object) {
30547 params = args[0];
30548 } else {
30549 (assign = args, el = assign[0], params = assign[1]);
30550 }
30551 if (!params) { params = {}; }
30552
30553 params = Utils.extend({}, params);
30554 if (el && !params.el) { params.el = el; }
30555
30556 SwiperClass.call(this, params);
30557
30558 Object.keys(prototypes).forEach(function (prototypeGroup) {
30559 Object.keys(prototypes[prototypeGroup]).forEach(function (protoMethod) {
30560 if (!Swiper.prototype[protoMethod]) {
30561 Swiper.prototype[protoMethod] = prototypes[prototypeGroup][protoMethod];
30562 }
30563 });
30564 });
30565
30566 // Swiper Instance
30567 var swiper = this;
30568 if (typeof swiper.modules === 'undefined') {
30569 swiper.modules = {};
30570 }
30571 Object.keys(swiper.modules).forEach(function (moduleName) {
30572 var module = swiper.modules[moduleName];
30573 if (module.params) {
30574 var moduleParamName = Object.keys(module.params)[0];
30575 var moduleParams = module.params[moduleParamName];
30576 if (typeof moduleParams !== 'object' || moduleParams === null) { return; }
30577 if (!(moduleParamName in params && 'enabled' in moduleParams)) { return; }
30578 if (params[moduleParamName] === true) {
30579 params[moduleParamName] = { enabled: true };
30580 }
30581 if (
30582 typeof params[moduleParamName] === 'object'
30583 && !('enabled' in params[moduleParamName])
30584 ) {
30585 params[moduleParamName].enabled = true;
30586 }
30587 if (!params[moduleParamName]) { params[moduleParamName] = { enabled: false }; }
30588 }
30589 });
30590
30591 // Extend defaults with modules params
30592 var swiperParams = Utils.extend({}, defaults);
30593 swiper.useModulesParams(swiperParams);
30594
30595 // Extend defaults with passed params
30596 swiper.params = Utils.extend({}, swiperParams, extendedDefaults, params);
30597 swiper.originalParams = Utils.extend({}, swiper.params);
30598 swiper.passedParams = Utils.extend({}, params);
30599
30600 // Save Dom lib
30601 swiper.$ = $;
30602
30603 // Find el
30604 var $el = $(swiper.params.el);
30605 el = $el[0];
30606
30607 if (!el) {
30608 return undefined;
30609 }
30610
30611 if ($el.length > 1) {
30612 var swipers = [];
30613 $el.each(function (index, containerEl) {
30614 var newParams = Utils.extend({}, params, { el: containerEl });
30615 swipers.push(new Swiper(newParams));
30616 });
30617 return swipers;
30618 }
30619
30620 el.swiper = swiper;
30621 $el.data('swiper', swiper);
30622
30623 // Find Wrapper
30624 var $wrapperEl = $el.children(("." + (swiper.params.wrapperClass)));
30625
30626 // Extend Swiper
30627 Utils.extend(swiper, {
30628 $el: $el,
30629 el: el,
30630 $wrapperEl: $wrapperEl,
30631 wrapperEl: $wrapperEl[0],
30632
30633 // Classes
30634 classNames: [],
30635
30636 // Slides
30637 slides: $(),
30638 slidesGrid: [],
30639 snapGrid: [],
30640 slidesSizesGrid: [],
30641
30642 // isDirection
30643 isHorizontal: function isHorizontal() {
30644 return swiper.params.direction === 'horizontal';
30645 },
30646 isVertical: function isVertical() {
30647 return swiper.params.direction === 'vertical';
30648 },
30649 // RTL
30650 rtl: (el.dir.toLowerCase() === 'rtl' || $el.css('direction') === 'rtl'),
30651 rtlTranslate: swiper.params.direction === 'horizontal' && (el.dir.toLowerCase() === 'rtl' || $el.css('direction') === 'rtl'),
30652 wrongRTL: $wrapperEl.css('display') === '-webkit-box',
30653
30654 // Indexes
30655 activeIndex: 0,
30656 realIndex: 0,
30657
30658 //
30659 isBeginning: true,
30660 isEnd: false,
30661
30662 // Props
30663 translate: 0,
30664 previousTranslate: 0,
30665 progress: 0,
30666 velocity: 0,
30667 animating: false,
30668
30669 // Locks
30670 allowSlideNext: swiper.params.allowSlideNext,
30671 allowSlidePrev: swiper.params.allowSlidePrev,
30672
30673 // Touch Events
30674 touchEvents: (function touchEvents() {
30675 var touch = ['touchstart', 'touchmove', 'touchend'];
30676 var desktop = ['mousedown', 'mousemove', 'mouseup'];
30677 if (Support.pointerEvents) {
30678 desktop = ['pointerdown', 'pointermove', 'pointerup'];
30679 } else if (Support.prefixedPointerEvents) {
30680 desktop = ['MSPointerDown', 'MSPointerMove', 'MSPointerUp'];
30681 }
30682 swiper.touchEventsTouch = {
30683 start: touch[0],
30684 move: touch[1],
30685 end: touch[2],
30686 };
30687 swiper.touchEventsDesktop = {
30688 start: desktop[0],
30689 move: desktop[1],
30690 end: desktop[2],
30691 };
30692 return Support.touch || !swiper.params.simulateTouch ? swiper.touchEventsTouch : swiper.touchEventsDesktop;
30693 }()),
30694 touchEventsData: {
30695 isTouched: undefined,
30696 isMoved: undefined,
30697 allowTouchCallbacks: undefined,
30698 touchStartTime: undefined,
30699 isScrolling: undefined,
30700 currentTranslate: undefined,
30701 startTranslate: undefined,
30702 allowThresholdMove: undefined,
30703 // Form elements to match
30704 formElements: 'input, select, option, textarea, button, video',
30705 // Last click time
30706 lastClickTime: Utils.now(),
30707 clickTimeout: undefined,
30708 // Velocities
30709 velocities: [],
30710 allowMomentumBounce: undefined,
30711 isTouchEvent: undefined,
30712 startMoving: undefined,
30713 },
30714
30715 // Clicks
30716 allowClick: true,
30717
30718 // Touches
30719 allowTouchMove: swiper.params.allowTouchMove,
30720
30721 touches: {
30722 startX: 0,
30723 startY: 0,
30724 currentX: 0,
30725 currentY: 0,
30726 diff: 0,
30727 },
30728
30729 // Images
30730 imagesToLoad: [],
30731 imagesLoaded: 0,
30732
30733 });
30734
30735 // Install Modules
30736 swiper.useModules();
30737
30738 // Init
30739 if (swiper.params.init) {
30740 swiper.init();
30741 }
30742
30743 // Return app instance
30744 return swiper;
30745 }
30746
30747 if ( SwiperClass ) Swiper.__proto__ = SwiperClass;
30748 Swiper.prototype = Object.create( SwiperClass && SwiperClass.prototype );
30749 Swiper.prototype.constructor = Swiper;
30750
30751 var staticAccessors = { extendedDefaults: { configurable: true },defaults: { configurable: true },Class: { configurable: true },$: { configurable: true } };
30752
30753 Swiper.prototype.slidesPerViewDynamic = function slidesPerViewDynamic () {
30754 var swiper = this;
30755 var params = swiper.params;
30756 var slides = swiper.slides;
30757 var slidesGrid = swiper.slidesGrid;
30758 var swiperSize = swiper.size;
30759 var activeIndex = swiper.activeIndex;
30760 var spv = 1;
30761 if (params.centeredSlides) {
30762 var slideSize = slides[activeIndex].swiperSlideSize;
30763 var breakLoop;
30764 for (var i = activeIndex + 1; i < slides.length; i += 1) {
30765 if (slides[i] && !breakLoop) {
30766 slideSize += slides[i].swiperSlideSize;
30767 spv += 1;
30768 if (slideSize > swiperSize) { breakLoop = true; }
30769 }
30770 }
30771 for (var i$1 = activeIndex - 1; i$1 >= 0; i$1 -= 1) {
30772 if (slides[i$1] && !breakLoop) {
30773 slideSize += slides[i$1].swiperSlideSize;
30774 spv += 1;
30775 if (slideSize > swiperSize) { breakLoop = true; }
30776 }
30777 }
30778 } else {
30779 for (var i$2 = activeIndex + 1; i$2 < slides.length; i$2 += 1) {
30780 if (slidesGrid[i$2] - slidesGrid[activeIndex] < swiperSize) {
30781 spv += 1;
30782 }
30783 }
30784 }
30785 return spv;
30786 };
30787
5d51ea26 30788 Swiper.prototype.update = function update () {
5309fbda
DC
30789 var swiper = this;
30790 if (!swiper || swiper.destroyed) { return; }
30791 var snapGrid = swiper.snapGrid;
30792 var params = swiper.params;
30793 // Breakpoints
30794 if (params.breakpoints) {
30795 swiper.setBreakpoint();
30796 }
30797 swiper.updateSize();
30798 swiper.updateSlides();
30799 swiper.updateProgress();
30800 swiper.updateSlidesClasses();
30801
30802 function setTranslate() {
30803 var translateValue = swiper.rtlTranslate ? swiper.translate * -1 : swiper.translate;
30804 var newTranslate = Math.min(Math.max(translateValue, swiper.maxTranslate()), swiper.minTranslate());
30805 swiper.setTranslate(newTranslate);
30806 swiper.updateActiveIndex();
30807 swiper.updateSlidesClasses();
30808 }
30809 var translated;
30810 if (swiper.params.freeMode) {
30811 setTranslate();
30812 if (swiper.params.autoHeight) {
30813 swiper.updateAutoHeight();
30814 }
30815 } else {
30816 if ((swiper.params.slidesPerView === 'auto' || swiper.params.slidesPerView > 1) && swiper.isEnd && !swiper.params.centeredSlides) {
30817 translated = swiper.slideTo(swiper.slides.length - 1, 0, false, true);
30818 } else {
30819 translated = swiper.slideTo(swiper.activeIndex, 0, false, true);
30820 }
30821 if (!translated) {
30822 setTranslate();
30823 }
30824 }
30825 if (params.watchOverflow && snapGrid !== swiper.snapGrid) {
30826 swiper.checkOverflow();
30827 }
30828 swiper.emit('update');
30829 };
30830
5d51ea26
DC
30831 Swiper.prototype.changeDirection = function changeDirection (newDirection, needUpdate) {
30832 if ( needUpdate === void 0 ) needUpdate = true;
30833
30834 var swiper = this;
30835 var currentDirection = swiper.params.direction;
30836 if (!newDirection) {
30837 // eslint-disable-next-line
30838 newDirection = currentDirection === 'horizontal' ? 'vertical' : 'horizontal';
30839 }
30840 if ((newDirection === currentDirection) || (newDirection !== 'horizontal' && newDirection !== 'vertical')) {
30841 return swiper;
30842 }
30843
30844 if (currentDirection === 'vertical') {
30845 swiper.$el
30846 .removeClass(((swiper.params.containerModifierClass) + "vertical wp8-vertical"))
30847 .addClass(("" + (swiper.params.containerModifierClass) + newDirection));
30848
30849 if ((Browser.isIE || Browser.isEdge) && (Support.pointerEvents || Support.prefixedPointerEvents)) {
30850 swiper.$el.addClass(((swiper.params.containerModifierClass) + "wp8-" + newDirection));
30851 }
30852 }
30853 if (currentDirection === 'horizontal') {
30854 swiper.$el
30855 .removeClass(((swiper.params.containerModifierClass) + "horizontal wp8-horizontal"))
30856 .addClass(("" + (swiper.params.containerModifierClass) + newDirection));
30857
30858 if ((Browser.isIE || Browser.isEdge) && (Support.pointerEvents || Support.prefixedPointerEvents)) {
30859 swiper.$el.addClass(((swiper.params.containerModifierClass) + "wp8-" + newDirection));
30860 }
30861 }
30862
30863 swiper.params.direction = newDirection;
30864
30865 swiper.slides.each(function (slideIndex, slideEl) {
30866 if (newDirection === 'vertical') {
30867 slideEl.style.width = '';
30868 } else {
30869 slideEl.style.height = '';
30870 }
30871 });
30872
30873 swiper.emit('changeDirection');
30874 if (needUpdate) { swiper.update(); }
30875
30876 return swiper;
30877 };
30878
5309fbda
DC
30879 Swiper.prototype.init = function init () {
30880 var swiper = this;
30881 if (swiper.initialized) { return; }
30882
30883 swiper.emit('beforeInit');
30884
30885 // Set breakpoint
30886 if (swiper.params.breakpoints) {
30887 swiper.setBreakpoint();
30888 }
30889
30890 // Add Classes
30891 swiper.addClasses();
30892
30893 // Create loop
30894 if (swiper.params.loop) {
30895 swiper.loopCreate();
30896 }
30897
30898 // Update size
30899 swiper.updateSize();
30900
30901 // Update slides
30902 swiper.updateSlides();
30903
30904 if (swiper.params.watchOverflow) {
30905 swiper.checkOverflow();
30906 }
30907
30908 // Set Grab Cursor
30909 if (swiper.params.grabCursor) {
30910 swiper.setGrabCursor();
30911 }
30912
30913 if (swiper.params.preloadImages) {
30914 swiper.preloadImages();
30915 }
30916
30917 // Slide To Initial Slide
30918 if (swiper.params.loop) {
30919 swiper.slideTo(swiper.params.initialSlide + swiper.loopedSlides, 0, swiper.params.runCallbacksOnInit);
30920 } else {
30921 swiper.slideTo(swiper.params.initialSlide, 0, swiper.params.runCallbacksOnInit);
30922 }
30923
30924 // Attach events
30925 swiper.attachEvents();
30926
30927 // Init Flag
30928 swiper.initialized = true;
30929
30930 // Emit
30931 swiper.emit('init');
30932 };
30933
30934 Swiper.prototype.destroy = function destroy (deleteInstance, cleanStyles) {
30935 if ( deleteInstance === void 0 ) deleteInstance = true;
30936 if ( cleanStyles === void 0 ) cleanStyles = true;
30937
30938 var swiper = this;
30939 var params = swiper.params;
30940 var $el = swiper.$el;
30941 var $wrapperEl = swiper.$wrapperEl;
30942 var slides = swiper.slides;
30943
30944 if (typeof swiper.params === 'undefined' || swiper.destroyed) {
30945 return null;
30946 }
30947
30948 swiper.emit('beforeDestroy');
30949
30950 // Init Flag
30951 swiper.initialized = false;
30952
30953 // Detach events
30954 swiper.detachEvents();
30955
30956 // Destroy loop
30957 if (params.loop) {
30958 swiper.loopDestroy();
30959 }
30960
30961 // Cleanup styles
30962 if (cleanStyles) {
30963 swiper.removeClasses();
30964 $el.removeAttr('style');
30965 $wrapperEl.removeAttr('style');
30966 if (slides && slides.length) {
30967 slides
30968 .removeClass([
30969 params.slideVisibleClass,
30970 params.slideActiveClass,
30971 params.slideNextClass,
30972 params.slidePrevClass ].join(' '))
30973 .removeAttr('style')
30974 .removeAttr('data-swiper-slide-index')
30975 .removeAttr('data-swiper-column')
30976 .removeAttr('data-swiper-row');
30977 }
30978 }
30979
30980 swiper.emit('destroy');
30981
30982 // Detach emitter events
30983 Object.keys(swiper.eventsListeners).forEach(function (eventName) {
30984 swiper.off(eventName);
30985 });
30986
30987 if (deleteInstance !== false) {
30988 swiper.$el[0].swiper = null;
30989 swiper.$el.data('swiper', null);
30990 Utils.deleteProps(swiper);
30991 }
30992 swiper.destroyed = true;
30993
30994 return null;
30995 };
30996
30997 Swiper.extendDefaults = function extendDefaults (newDefaults) {
30998 Utils.extend(extendedDefaults, newDefaults);
30999 };
31000
31001 staticAccessors.extendedDefaults.get = function () {
31002 return extendedDefaults;
31003 };
31004
31005 staticAccessors.defaults.get = function () {
31006 return defaults;
31007 };
31008
31009 staticAccessors.Class.get = function () {
31010 return SwiperClass;
31011 };
31012
31013 staticAccessors.$.get = function () {
31014 return $;
31015 };
31016
31017 Object.defineProperties( Swiper, staticAccessors );
31018
31019 return Swiper;
31020 }(Framework7Class));
31021
31022 var Device$1 = {
31023 name: 'device',
31024 proto: {
31025 device: Device,
31026 },
31027 static: {
31028 device: Device,
31029 },
31030 };
31031
31032 var Support$1 = {
31033 name: 'support',
31034 proto: {
31035 support: Support,
31036 },
31037 static: {
31038 support: Support,
31039 },
31040 };
31041
31042 var Browser$1 = {
31043 name: 'browser',
31044 proto: {
31045 browser: Browser,
31046 },
31047 static: {
31048 browser: Browser,
31049 },
31050 };
31051
31052 var Resize = {
31053 name: 'resize',
31054 create: function create() {
31055 var swiper = this;
31056 Utils.extend(swiper, {
31057 resize: {
31058 resizeHandler: function resizeHandler() {
31059 if (!swiper || swiper.destroyed || !swiper.initialized) { return; }
31060 swiper.emit('beforeResize');
31061 swiper.emit('resize');
31062 },
31063 orientationChangeHandler: function orientationChangeHandler() {
31064 if (!swiper || swiper.destroyed || !swiper.initialized) { return; }
31065 swiper.emit('orientationchange');
31066 },
31067 },
31068 });
31069 },
31070 on: {
31071 init: function init() {
31072 var swiper = this;
31073 // Emit resize
31074 win.addEventListener('resize', swiper.resize.resizeHandler);
31075
31076 // Emit orientationchange
31077 win.addEventListener('orientationchange', swiper.resize.orientationChangeHandler);
31078 },
31079 destroy: function destroy() {
31080 var swiper = this;
31081 win.removeEventListener('resize', swiper.resize.resizeHandler);
31082 win.removeEventListener('orientationchange', swiper.resize.orientationChangeHandler);
31083 },
31084 },
31085 };
31086
31087 var Observer = {
31088 func: win.MutationObserver || win.WebkitMutationObserver,
31089 attach: function attach(target, options) {
31090 if ( options === void 0 ) options = {};
31091
31092 var swiper = this;
31093
31094 var ObserverFunc = Observer.func;
31095 var observer = new ObserverFunc(function (mutations) {
31096 // The observerUpdate event should only be triggered
31097 // once despite the number of mutations. Additional
31098 // triggers are redundant and are very costly
31099 if (mutations.length === 1) {
31100 swiper.emit('observerUpdate', mutations[0]);
31101 return;
31102 }
31103 var observerUpdate = function observerUpdate() {
31104 swiper.emit('observerUpdate', mutations[0]);
31105 };
31106
31107 if (win.requestAnimationFrame) {
31108 win.requestAnimationFrame(observerUpdate);
31109 } else {
31110 win.setTimeout(observerUpdate, 0);
31111 }
31112 });
31113
31114 observer.observe(target, {
31115 attributes: typeof options.attributes === 'undefined' ? true : options.attributes,
31116 childList: typeof options.childList === 'undefined' ? true : options.childList,
31117 characterData: typeof options.characterData === 'undefined' ? true : options.characterData,
31118 });
31119
31120 swiper.observer.observers.push(observer);
31121 },
31122 init: function init() {
31123 var swiper = this;
31124 if (!Support.observer || !swiper.params.observer) { return; }
31125 if (swiper.params.observeParents) {
31126 var containerParents = swiper.$el.parents();
31127 for (var i = 0; i < containerParents.length; i += 1) {
31128 swiper.observer.attach(containerParents[i]);
31129 }
31130 }
31131 // Observe container
31132 swiper.observer.attach(swiper.$el[0], { childList: swiper.params.observeSlideChildren });
31133
31134 // Observe wrapper
31135 swiper.observer.attach(swiper.$wrapperEl[0], { attributes: false });
31136 },
31137 destroy: function destroy() {
31138 var swiper = this;
31139 swiper.observer.observers.forEach(function (observer) {
31140 observer.disconnect();
31141 });
31142 swiper.observer.observers = [];
31143 },
31144 };
31145
31146 var Observer$1 = {
31147 name: 'observer',
31148 params: {
31149 observer: false,
31150 observeParents: false,
31151 observeSlideChildren: false,
31152 },
31153 create: function create() {
31154 var swiper = this;
31155 Utils.extend(swiper, {
31156 observer: {
31157 init: Observer.init.bind(swiper),
31158 attach: Observer.attach.bind(swiper),
31159 destroy: Observer.destroy.bind(swiper),
31160 observers: [],
31161 },
31162 });
31163 },
31164 on: {
31165 init: function init() {
31166 var swiper = this;
31167 swiper.observer.init();
31168 },
31169 destroy: function destroy() {
31170 var swiper = this;
31171 swiper.observer.destroy();
31172 },
31173 },
31174 };
31175
31176 var Virtual = {
31177 update: function update(force) {
31178 var swiper = this;
31179 var ref = swiper.params;
31180 var slidesPerView = ref.slidesPerView;
31181 var slidesPerGroup = ref.slidesPerGroup;
31182 var centeredSlides = ref.centeredSlides;
31183 var ref$1 = swiper.params.virtual;
31184 var addSlidesBefore = ref$1.addSlidesBefore;
31185 var addSlidesAfter = ref$1.addSlidesAfter;
31186 var ref$2 = swiper.virtual;
31187 var previousFrom = ref$2.from;
31188 var previousTo = ref$2.to;
31189 var slides = ref$2.slides;
31190 var previousSlidesGrid = ref$2.slidesGrid;
31191 var renderSlide = ref$2.renderSlide;
31192 var previousOffset = ref$2.offset;
31193 swiper.updateActiveIndex();
31194 var activeIndex = swiper.activeIndex || 0;
31195
31196 var offsetProp;
31197 if (swiper.rtlTranslate) { offsetProp = 'right'; }
31198 else { offsetProp = swiper.isHorizontal() ? 'left' : 'top'; }
31199
31200 var slidesAfter;
31201 var slidesBefore;
31202 if (centeredSlides) {
31203 slidesAfter = Math.floor(slidesPerView / 2) + slidesPerGroup + addSlidesBefore;
31204 slidesBefore = Math.floor(slidesPerView / 2) + slidesPerGroup + addSlidesAfter;
31205 } else {
31206 slidesAfter = slidesPerView + (slidesPerGroup - 1) + addSlidesBefore;
31207 slidesBefore = slidesPerGroup + addSlidesAfter;
31208 }
31209 var from = Math.max((activeIndex || 0) - slidesBefore, 0);
31210 var to = Math.min((activeIndex || 0) + slidesAfter, slides.length - 1);
31211 var offset = (swiper.slidesGrid[from] || 0) - (swiper.slidesGrid[0] || 0);
31212
31213 Utils.extend(swiper.virtual, {
31214 from: from,
31215 to: to,
31216 offset: offset,
31217 slidesGrid: swiper.slidesGrid,
31218 });
31219
31220 function onRendered() {
31221 swiper.updateSlides();
31222 swiper.updateProgress();
31223 swiper.updateSlidesClasses();
31224 if (swiper.lazy && swiper.params.lazy.enabled) {
31225 swiper.lazy.load();
31226 }
31227 }
31228
31229 if (previousFrom === from && previousTo === to && !force) {
31230 if (swiper.slidesGrid !== previousSlidesGrid && offset !== previousOffset) {
31231 swiper.slides.css(offsetProp, (offset + "px"));
31232 }
31233 swiper.updateProgress();
31234 return;
31235 }
31236 if (swiper.params.virtual.renderExternal) {
31237 swiper.params.virtual.renderExternal.call(swiper, {
31238 offset: offset,
31239 from: from,
31240 to: to,
31241 slides: (function getSlides() {
31242 var slidesToRender = [];
31243 for (var i = from; i <= to; i += 1) {
31244 slidesToRender.push(slides[i]);
31245 }
31246 return slidesToRender;
31247 }()),
31248 });
31249 onRendered();
31250 return;
31251 }
31252 var prependIndexes = [];
31253 var appendIndexes = [];
31254 if (force) {
31255 swiper.$wrapperEl.find(("." + (swiper.params.slideClass))).remove();
31256 } else {
31257 for (var i = previousFrom; i <= previousTo; i += 1) {
31258 if (i < from || i > to) {
31259 swiper.$wrapperEl.find(("." + (swiper.params.slideClass) + "[data-swiper-slide-index=\"" + i + "\"]")).remove();
31260 }
31261 }
31262 }
31263 for (var i$1 = 0; i$1 < slides.length; i$1 += 1) {
31264 if (i$1 >= from && i$1 <= to) {
31265 if (typeof previousTo === 'undefined' || force) {
31266 appendIndexes.push(i$1);
31267 } else {
31268 if (i$1 > previousTo) { appendIndexes.push(i$1); }
31269 if (i$1 < previousFrom) { prependIndexes.push(i$1); }
31270 }
31271 }
31272 }
31273 appendIndexes.forEach(function (index) {
31274 swiper.$wrapperEl.append(renderSlide(slides[index], index));
31275 });
31276 prependIndexes.sort(function (a, b) { return b - a; }).forEach(function (index) {
31277 swiper.$wrapperEl.prepend(renderSlide(slides[index], index));
31278 });
31279 swiper.$wrapperEl.children('.swiper-slide').css(offsetProp, (offset + "px"));
31280 onRendered();
31281 },
31282 renderSlide: function renderSlide(slide, index) {
31283 var swiper = this;
31284 var params = swiper.params.virtual;
31285 if (params.cache && swiper.virtual.cache[index]) {
31286 return swiper.virtual.cache[index];
31287 }
31288 var $slideEl = params.renderSlide
31289 ? $(params.renderSlide.call(swiper, slide, index))
31290 : $(("<div class=\"" + (swiper.params.slideClass) + "\" data-swiper-slide-index=\"" + index + "\">" + slide + "</div>"));
31291 if (!$slideEl.attr('data-swiper-slide-index')) { $slideEl.attr('data-swiper-slide-index', index); }
31292 if (params.cache) { swiper.virtual.cache[index] = $slideEl; }
31293 return $slideEl;
31294 },
5d51ea26 31295 appendSlide: function appendSlide(slides) {
5309fbda 31296 var swiper = this;
5d51ea26
DC
31297 if (typeof slides === 'object' && 'length' in slides) {
31298 for (var i = 0; i < slides.length; i += 1) {
31299 if (slides[i]) { swiper.virtual.slides.push(slides[i]); }
31300 }
31301 } else {
31302 swiper.virtual.slides.push(slides);
31303 }
5309fbda
DC
31304 swiper.virtual.update(true);
31305 },
5d51ea26 31306 prependSlide: function prependSlide(slides) {
5309fbda 31307 var swiper = this;
5d51ea26
DC
31308 var activeIndex = swiper.activeIndex;
31309 var newActiveIndex = activeIndex + 1;
31310 var numberOfNewSlides = 1;
31311
31312 if (Array.isArray(slides)) {
31313 for (var i = 0; i < slides.length; i += 1) {
31314 if (slides[i]) { swiper.virtual.slides.unshift(slides[i]); }
31315 }
31316 newActiveIndex = activeIndex + slides.length;
31317 numberOfNewSlides = slides.length;
31318 } else {
31319 swiper.virtual.slides.unshift(slides);
31320 }
5309fbda
DC
31321 if (swiper.params.virtual.cache) {
31322 var cache = swiper.virtual.cache;
31323 var newCache = {};
31324 Object.keys(cache).forEach(function (cachedIndex) {
5d51ea26 31325 newCache[parseInt(cachedIndex, 10) + numberOfNewSlides] = cache[cachedIndex];
5309fbda
DC
31326 });
31327 swiper.virtual.cache = newCache;
31328 }
31329 swiper.virtual.update(true);
5d51ea26
DC
31330 swiper.slideTo(newActiveIndex, 0);
31331 },
31332 removeSlide: function removeSlide(slidesIndexes) {
31333 var swiper = this;
31334 if (typeof slidesIndexes === 'undefined' || slidesIndexes === null) { return; }
31335 var activeIndex = swiper.activeIndex;
31336 if (Array.isArray(slidesIndexes)) {
31337 for (var i = slidesIndexes.length - 1; i >= 0; i -= 1) {
31338 swiper.virtual.slides.splice(slidesIndexes[i], 1);
31339 if (swiper.params.virtual.cache) {
31340 delete swiper.virtual.cache[slidesIndexes[i]];
31341 }
31342 if (slidesIndexes[i] < activeIndex) { activeIndex -= 1; }
31343 activeIndex = Math.max(activeIndex, 0);
31344 }
31345 } else {
31346 swiper.virtual.slides.splice(slidesIndexes, 1);
31347 if (swiper.params.virtual.cache) {
31348 delete swiper.virtual.cache[slidesIndexes];
31349 }
31350 if (slidesIndexes < activeIndex) { activeIndex -= 1; }
31351 activeIndex = Math.max(activeIndex, 0);
31352 }
31353 swiper.virtual.update(true);
31354 swiper.slideTo(activeIndex, 0);
31355 },
31356 removeAllSlides: function removeAllSlides() {
31357 var swiper = this;
31358 swiper.virtual.slides = [];
31359 if (swiper.params.virtual.cache) {
31360 swiper.virtual.cache = {};
31361 }
31362 swiper.virtual.update(true);
31363 swiper.slideTo(0, 0);
5309fbda
DC
31364 },
31365 };
31366
31367 var Virtual$1 = {
31368 name: 'virtual',
31369 params: {
31370 virtual: {
31371 enabled: false,
31372 slides: [],
31373 cache: true,
31374 renderSlide: null,
31375 renderExternal: null,
31376 addSlidesBefore: 0,
31377 addSlidesAfter: 0,
31378 },
31379 },
31380 create: function create() {
31381 var swiper = this;
31382 Utils.extend(swiper, {
31383 virtual: {
31384 update: Virtual.update.bind(swiper),
31385 appendSlide: Virtual.appendSlide.bind(swiper),
31386 prependSlide: Virtual.prependSlide.bind(swiper),
5d51ea26
DC
31387 removeSlide: Virtual.removeSlide.bind(swiper),
31388 removeAllSlides: Virtual.removeAllSlides.bind(swiper),
5309fbda
DC
31389 renderSlide: Virtual.renderSlide.bind(swiper),
31390 slides: swiper.params.virtual.slides,
31391 cache: {},
31392 },
31393 });
31394 },
31395 on: {
31396 beforeInit: function beforeInit() {
31397 var swiper = this;
31398 if (!swiper.params.virtual.enabled) { return; }
31399 swiper.classNames.push(((swiper.params.containerModifierClass) + "virtual"));
31400 var overwriteParams = {
31401 watchSlidesProgress: true,
31402 };
31403 Utils.extend(swiper.params, overwriteParams);
31404 Utils.extend(swiper.originalParams, overwriteParams);
31405
31406 if (!swiper.params.initialSlide) {
31407 swiper.virtual.update();
31408 }
31409 },
31410 setTranslate: function setTranslate() {
31411 var swiper = this;
31412 if (!swiper.params.virtual.enabled) { return; }
31413 swiper.virtual.update();
31414 },
31415 },
31416 };
31417
31418 var Navigation = {
31419 update: function update() {
31420 // Update Navigation Buttons
31421 var swiper = this;
31422 var params = swiper.params.navigation;
31423
31424 if (swiper.params.loop) { return; }
31425 var ref = swiper.navigation;
31426 var $nextEl = ref.$nextEl;
31427 var $prevEl = ref.$prevEl;
31428
31429 if ($prevEl && $prevEl.length > 0) {
31430 if (swiper.isBeginning) {
31431 $prevEl.addClass(params.disabledClass);
31432 } else {
31433 $prevEl.removeClass(params.disabledClass);
31434 }
31435 $prevEl[swiper.params.watchOverflow && swiper.isLocked ? 'addClass' : 'removeClass'](params.lockClass);
31436 }
31437 if ($nextEl && $nextEl.length > 0) {
31438 if (swiper.isEnd) {
31439 $nextEl.addClass(params.disabledClass);
31440 } else {
31441 $nextEl.removeClass(params.disabledClass);
31442 }
31443 $nextEl[swiper.params.watchOverflow && swiper.isLocked ? 'addClass' : 'removeClass'](params.lockClass);
31444 }
31445 },
31446 onPrevClick: function onPrevClick(e) {
31447 var swiper = this;
31448 e.preventDefault();
31449 if (swiper.isBeginning && !swiper.params.loop) { return; }
31450 swiper.slidePrev();
31451 },
31452 onNextClick: function onNextClick(e) {
31453 var swiper = this;
31454 e.preventDefault();
31455 if (swiper.isEnd && !swiper.params.loop) { return; }
31456 swiper.slideNext();
31457 },
31458 init: function init() {
31459 var swiper = this;
31460 var params = swiper.params.navigation;
31461 if (!(params.nextEl || params.prevEl)) { return; }
31462
31463 var $nextEl;
31464 var $prevEl;
31465 if (params.nextEl) {
31466 $nextEl = $(params.nextEl);
31467 if (
31468 swiper.params.uniqueNavElements
31469 && typeof params.nextEl === 'string'
31470 && $nextEl.length > 1
31471 && swiper.$el.find(params.nextEl).length === 1
31472 ) {
31473 $nextEl = swiper.$el.find(params.nextEl);
31474 }
31475 }
31476 if (params.prevEl) {
31477 $prevEl = $(params.prevEl);
31478 if (
31479 swiper.params.uniqueNavElements
31480 && typeof params.prevEl === 'string'
31481 && $prevEl.length > 1
31482 && swiper.$el.find(params.prevEl).length === 1
31483 ) {
31484 $prevEl = swiper.$el.find(params.prevEl);
31485 }
31486 }
31487
31488 if ($nextEl && $nextEl.length > 0) {
31489 $nextEl.on('click', swiper.navigation.onNextClick);
31490 }
31491 if ($prevEl && $prevEl.length > 0) {
31492 $prevEl.on('click', swiper.navigation.onPrevClick);
31493 }
31494
31495 Utils.extend(swiper.navigation, {
31496 $nextEl: $nextEl,
31497 nextEl: $nextEl && $nextEl[0],
31498 $prevEl: $prevEl,
31499 prevEl: $prevEl && $prevEl[0],
31500 });
31501 },
31502 destroy: function destroy() {
31503 var swiper = this;
31504 var ref = swiper.navigation;
31505 var $nextEl = ref.$nextEl;
31506 var $prevEl = ref.$prevEl;
31507 if ($nextEl && $nextEl.length) {
31508 $nextEl.off('click', swiper.navigation.onNextClick);
31509 $nextEl.removeClass(swiper.params.navigation.disabledClass);
31510 }
31511 if ($prevEl && $prevEl.length) {
31512 $prevEl.off('click', swiper.navigation.onPrevClick);
31513 $prevEl.removeClass(swiper.params.navigation.disabledClass);
31514 }
31515 },
31516 };
31517
31518 var Navigation$1 = {
31519 name: 'navigation',
31520 params: {
31521 navigation: {
31522 nextEl: null,
31523 prevEl: null,
31524
31525 hideOnClick: false,
31526 disabledClass: 'swiper-button-disabled',
31527 hiddenClass: 'swiper-button-hidden',
31528 lockClass: 'swiper-button-lock',
31529 },
31530 },
31531 create: function create() {
31532 var swiper = this;
31533 Utils.extend(swiper, {
31534 navigation: {
31535 init: Navigation.init.bind(swiper),
31536 update: Navigation.update.bind(swiper),
31537 destroy: Navigation.destroy.bind(swiper),
31538 onNextClick: Navigation.onNextClick.bind(swiper),
31539 onPrevClick: Navigation.onPrevClick.bind(swiper),
31540 },
31541 });
31542 },
31543 on: {
31544 init: function init() {
31545 var swiper = this;
31546 swiper.navigation.init();
31547 swiper.navigation.update();
31548 },
31549 toEdge: function toEdge() {
31550 var swiper = this;
31551 swiper.navigation.update();
31552 },
31553 fromEdge: function fromEdge() {
31554 var swiper = this;
31555 swiper.navigation.update();
31556 },
31557 destroy: function destroy() {
31558 var swiper = this;
31559 swiper.navigation.destroy();
31560 },
31561 click: function click(e) {
31562 var swiper = this;
31563 var ref = swiper.navigation;
31564 var $nextEl = ref.$nextEl;
31565 var $prevEl = ref.$prevEl;
31566 if (
31567 swiper.params.navigation.hideOnClick
31568 && !$(e.target).is($prevEl)
31569 && !$(e.target).is($nextEl)
31570 ) {
5d51ea26
DC
31571 var isHidden;
31572 if ($nextEl) {
31573 isHidden = $nextEl.hasClass(swiper.params.navigation.hiddenClass);
31574 } else if ($prevEl) {
31575 isHidden = $prevEl.hasClass(swiper.params.navigation.hiddenClass);
31576 }
31577 if (isHidden === true) {
31578 swiper.emit('navigationShow', swiper);
31579 } else {
31580 swiper.emit('navigationHide', swiper);
31581 }
31582 if ($nextEl) {
31583 $nextEl.toggleClass(swiper.params.navigation.hiddenClass);
31584 }
31585 if ($prevEl) {
31586 $prevEl.toggleClass(swiper.params.navigation.hiddenClass);
31587 }
5309fbda
DC
31588 }
31589 },
31590 },
31591 };
31592
31593 var Pagination = {
31594 update: function update() {
31595 // Render || Update Pagination bullets/items
31596 var swiper = this;
31597 var rtl = swiper.rtl;
31598 var params = swiper.params.pagination;
31599 if (!params.el || !swiper.pagination.el || !swiper.pagination.$el || swiper.pagination.$el.length === 0) { return; }
31600 var slidesLength = swiper.virtual && swiper.params.virtual.enabled ? swiper.virtual.slides.length : swiper.slides.length;
31601 var $el = swiper.pagination.$el;
31602 // Current/Total
31603 var current;
31604 var total = swiper.params.loop ? Math.ceil((slidesLength - (swiper.loopedSlides * 2)) / swiper.params.slidesPerGroup) : swiper.snapGrid.length;
31605 if (swiper.params.loop) {
31606 current = Math.ceil((swiper.activeIndex - swiper.loopedSlides) / swiper.params.slidesPerGroup);
31607 if (current > slidesLength - 1 - (swiper.loopedSlides * 2)) {
31608 current -= (slidesLength - (swiper.loopedSlides * 2));
31609 }
31610 if (current > total - 1) { current -= total; }
31611 if (current < 0 && swiper.params.paginationType !== 'bullets') { current = total + current; }
31612 } else if (typeof swiper.snapIndex !== 'undefined') {
31613 current = swiper.snapIndex;
31614 } else {
31615 current = swiper.activeIndex || 0;
31616 }
31617 // Types
31618 if (params.type === 'bullets' && swiper.pagination.bullets && swiper.pagination.bullets.length > 0) {
31619 var bullets = swiper.pagination.bullets;
31620 var firstIndex;
31621 var lastIndex;
31622 var midIndex;
31623 if (params.dynamicBullets) {
31624 swiper.pagination.bulletSize = bullets.eq(0)[swiper.isHorizontal() ? 'outerWidth' : 'outerHeight'](true);
31625 $el.css(swiper.isHorizontal() ? 'width' : 'height', ((swiper.pagination.bulletSize * (params.dynamicMainBullets + 4)) + "px"));
31626 if (params.dynamicMainBullets > 1 && swiper.previousIndex !== undefined) {
31627 swiper.pagination.dynamicBulletIndex += (current - swiper.previousIndex);
31628 if (swiper.pagination.dynamicBulletIndex > (params.dynamicMainBullets - 1)) {
31629 swiper.pagination.dynamicBulletIndex = params.dynamicMainBullets - 1;
31630 } else if (swiper.pagination.dynamicBulletIndex < 0) {
31631 swiper.pagination.dynamicBulletIndex = 0;
31632 }
31633 }
31634 firstIndex = current - swiper.pagination.dynamicBulletIndex;
31635 lastIndex = firstIndex + (Math.min(bullets.length, params.dynamicMainBullets) - 1);
31636 midIndex = (lastIndex + firstIndex) / 2;
31637 }
31638 bullets.removeClass(((params.bulletActiveClass) + " " + (params.bulletActiveClass) + "-next " + (params.bulletActiveClass) + "-next-next " + (params.bulletActiveClass) + "-prev " + (params.bulletActiveClass) + "-prev-prev " + (params.bulletActiveClass) + "-main"));
31639 if ($el.length > 1) {
31640 bullets.each(function (index, bullet) {
31641 var $bullet = $(bullet);
31642 var bulletIndex = $bullet.index();
31643 if (bulletIndex === current) {
31644 $bullet.addClass(params.bulletActiveClass);
31645 }
31646 if (params.dynamicBullets) {
31647 if (bulletIndex >= firstIndex && bulletIndex <= lastIndex) {
31648 $bullet.addClass(((params.bulletActiveClass) + "-main"));
31649 }
31650 if (bulletIndex === firstIndex) {
31651 $bullet
31652 .prev()
31653 .addClass(((params.bulletActiveClass) + "-prev"))
31654 .prev()
31655 .addClass(((params.bulletActiveClass) + "-prev-prev"));
31656 }
31657 if (bulletIndex === lastIndex) {
31658 $bullet
31659 .next()
31660 .addClass(((params.bulletActiveClass) + "-next"))
31661 .next()
31662 .addClass(((params.bulletActiveClass) + "-next-next"));
31663 }
31664 }
31665 });
31666 } else {
31667 var $bullet = bullets.eq(current);
31668 $bullet.addClass(params.bulletActiveClass);
31669 if (params.dynamicBullets) {
31670 var $firstDisplayedBullet = bullets.eq(firstIndex);
31671 var $lastDisplayedBullet = bullets.eq(lastIndex);
31672 for (var i = firstIndex; i <= lastIndex; i += 1) {
31673 bullets.eq(i).addClass(((params.bulletActiveClass) + "-main"));
31674 }
31675 $firstDisplayedBullet
31676 .prev()
31677 .addClass(((params.bulletActiveClass) + "-prev"))
31678 .prev()
31679 .addClass(((params.bulletActiveClass) + "-prev-prev"));
31680 $lastDisplayedBullet
31681 .next()
31682 .addClass(((params.bulletActiveClass) + "-next"))
31683 .next()
31684 .addClass(((params.bulletActiveClass) + "-next-next"));
31685 }
31686 }
31687 if (params.dynamicBullets) {
31688 var dynamicBulletsLength = Math.min(bullets.length, params.dynamicMainBullets + 4);
31689 var bulletsOffset = (((swiper.pagination.bulletSize * dynamicBulletsLength) - (swiper.pagination.bulletSize)) / 2) - (midIndex * swiper.pagination.bulletSize);
31690 var offsetProp = rtl ? 'right' : 'left';
31691 bullets.css(swiper.isHorizontal() ? offsetProp : 'top', (bulletsOffset + "px"));
31692 }
31693 }
31694 if (params.type === 'fraction') {
31695 $el.find(("." + (params.currentClass))).text(params.formatFractionCurrent(current + 1));
31696 $el.find(("." + (params.totalClass))).text(params.formatFractionTotal(total));
31697 }
31698 if (params.type === 'progressbar') {
31699 var progressbarDirection;
31700 if (params.progressbarOpposite) {
31701 progressbarDirection = swiper.isHorizontal() ? 'vertical' : 'horizontal';
31702 } else {
31703 progressbarDirection = swiper.isHorizontal() ? 'horizontal' : 'vertical';
31704 }
31705 var scale = (current + 1) / total;
31706 var scaleX = 1;
31707 var scaleY = 1;
31708 if (progressbarDirection === 'horizontal') {
31709 scaleX = scale;
31710 } else {
31711 scaleY = scale;
31712 }
31713 $el.find(("." + (params.progressbarFillClass))).transform(("translate3d(0,0,0) scaleX(" + scaleX + ") scaleY(" + scaleY + ")")).transition(swiper.params.speed);
31714 }
31715 if (params.type === 'custom' && params.renderCustom) {
31716 $el.html(params.renderCustom(swiper, current + 1, total));
31717 swiper.emit('paginationRender', swiper, $el[0]);
31718 } else {
31719 swiper.emit('paginationUpdate', swiper, $el[0]);
31720 }
31721 $el[swiper.params.watchOverflow && swiper.isLocked ? 'addClass' : 'removeClass'](params.lockClass);
31722 },
31723 render: function render() {
31724 // Render Container
31725 var swiper = this;
31726 var params = swiper.params.pagination;
31727 if (!params.el || !swiper.pagination.el || !swiper.pagination.$el || swiper.pagination.$el.length === 0) { return; }
31728 var slidesLength = swiper.virtual && swiper.params.virtual.enabled ? swiper.virtual.slides.length : swiper.slides.length;
31729
31730 var $el = swiper.pagination.$el;
31731 var paginationHTML = '';
31732 if (params.type === 'bullets') {
31733 var numberOfBullets = swiper.params.loop ? Math.ceil((slidesLength - (swiper.loopedSlides * 2)) / swiper.params.slidesPerGroup) : swiper.snapGrid.length;
31734 for (var i = 0; i < numberOfBullets; i += 1) {
31735 if (params.renderBullet) {
31736 paginationHTML += params.renderBullet.call(swiper, i, params.bulletClass);
31737 } else {
31738 paginationHTML += "<" + (params.bulletElement) + " class=\"" + (params.bulletClass) + "\"></" + (params.bulletElement) + ">";
31739 }
31740 }
31741 $el.html(paginationHTML);
31742 swiper.pagination.bullets = $el.find(("." + (params.bulletClass)));
31743 }
31744 if (params.type === 'fraction') {
31745 if (params.renderFraction) {
31746 paginationHTML = params.renderFraction.call(swiper, params.currentClass, params.totalClass);
31747 } else {
31748 paginationHTML = "<span class=\"" + (params.currentClass) + "\"></span>"
31749 + ' / '
31750 + "<span class=\"" + (params.totalClass) + "\"></span>";
31751 }
31752 $el.html(paginationHTML);
31753 }
31754 if (params.type === 'progressbar') {
31755 if (params.renderProgressbar) {
31756 paginationHTML = params.renderProgressbar.call(swiper, params.progressbarFillClass);
31757 } else {
31758 paginationHTML = "<span class=\"" + (params.progressbarFillClass) + "\"></span>";
31759 }
31760 $el.html(paginationHTML);
31761 }
31762 if (params.type !== 'custom') {
31763 swiper.emit('paginationRender', swiper.pagination.$el[0]);
31764 }
31765 },
31766 init: function init() {
31767 var swiper = this;
31768 var params = swiper.params.pagination;
31769 if (!params.el) { return; }
31770
31771 var $el = $(params.el);
31772 if ($el.length === 0) { return; }
31773
31774 if (
31775 swiper.params.uniqueNavElements
31776 && typeof params.el === 'string'
31777 && $el.length > 1
31778 && swiper.$el.find(params.el).length === 1
31779 ) {
31780 $el = swiper.$el.find(params.el);
31781 }
31782
31783 if (params.type === 'bullets' && params.clickable) {
31784 $el.addClass(params.clickableClass);
31785 }
31786
31787 $el.addClass(params.modifierClass + params.type);
31788
31789 if (params.type === 'bullets' && params.dynamicBullets) {
31790 $el.addClass(("" + (params.modifierClass) + (params.type) + "-dynamic"));
31791 swiper.pagination.dynamicBulletIndex = 0;
31792 if (params.dynamicMainBullets < 1) {
31793 params.dynamicMainBullets = 1;
31794 }
31795 }
31796 if (params.type === 'progressbar' && params.progressbarOpposite) {
31797 $el.addClass(params.progressbarOppositeClass);
31798 }
31799
31800 if (params.clickable) {
31801 $el.on('click', ("." + (params.bulletClass)), function onClick(e) {
31802 e.preventDefault();
31803 var index = $(this).index() * swiper.params.slidesPerGroup;
31804 if (swiper.params.loop) { index += swiper.loopedSlides; }
31805 swiper.slideTo(index);
31806 });
31807 }
31808
31809 Utils.extend(swiper.pagination, {
31810 $el: $el,
31811 el: $el[0],
31812 });
31813 },
31814 destroy: function destroy() {
31815 var swiper = this;
31816 var params = swiper.params.pagination;
31817 if (!params.el || !swiper.pagination.el || !swiper.pagination.$el || swiper.pagination.$el.length === 0) { return; }
31818 var $el = swiper.pagination.$el;
31819
31820 $el.removeClass(params.hiddenClass);
31821 $el.removeClass(params.modifierClass + params.type);
31822 if (swiper.pagination.bullets) { swiper.pagination.bullets.removeClass(params.bulletActiveClass); }
31823 if (params.clickable) {
31824 $el.off('click', ("." + (params.bulletClass)));
31825 }
31826 },
31827 };
31828
31829 var Pagination$1 = {
31830 name: 'pagination',
31831 params: {
31832 pagination: {
31833 el: null,
31834 bulletElement: 'span',
31835 clickable: false,
31836 hideOnClick: false,
31837 renderBullet: null,
31838 renderProgressbar: null,
31839 renderFraction: null,
31840 renderCustom: null,
31841 progressbarOpposite: false,
31842 type: 'bullets', // 'bullets' or 'progressbar' or 'fraction' or 'custom'
31843 dynamicBullets: false,
31844 dynamicMainBullets: 1,
31845 formatFractionCurrent: function (number) { return number; },
31846 formatFractionTotal: function (number) { return number; },
31847 bulletClass: 'swiper-pagination-bullet',
31848 bulletActiveClass: 'swiper-pagination-bullet-active',
31849 modifierClass: 'swiper-pagination-', // NEW
31850 currentClass: 'swiper-pagination-current',
31851 totalClass: 'swiper-pagination-total',
31852 hiddenClass: 'swiper-pagination-hidden',
31853 progressbarFillClass: 'swiper-pagination-progressbar-fill',
31854 progressbarOppositeClass: 'swiper-pagination-progressbar-opposite',
31855 clickableClass: 'swiper-pagination-clickable', // NEW
31856 lockClass: 'swiper-pagination-lock',
31857 },
31858 },
31859 create: function create() {
31860 var swiper = this;
31861 Utils.extend(swiper, {
31862 pagination: {
31863 init: Pagination.init.bind(swiper),
31864 render: Pagination.render.bind(swiper),
31865 update: Pagination.update.bind(swiper),
31866 destroy: Pagination.destroy.bind(swiper),
31867 dynamicBulletIndex: 0,
31868 },
31869 });
31870 },
31871 on: {
31872 init: function init() {
31873 var swiper = this;
31874 swiper.pagination.init();
31875 swiper.pagination.render();
31876 swiper.pagination.update();
31877 },
31878 activeIndexChange: function activeIndexChange() {
31879 var swiper = this;
31880 if (swiper.params.loop) {
31881 swiper.pagination.update();
31882 } else if (typeof swiper.snapIndex === 'undefined') {
31883 swiper.pagination.update();
31884 }
31885 },
31886 snapIndexChange: function snapIndexChange() {
31887 var swiper = this;
31888 if (!swiper.params.loop) {
31889 swiper.pagination.update();
31890 }
31891 },
31892 slidesLengthChange: function slidesLengthChange() {
31893 var swiper = this;
31894 if (swiper.params.loop) {
31895 swiper.pagination.render();
31896 swiper.pagination.update();
31897 }
31898 },
31899 snapGridLengthChange: function snapGridLengthChange() {
31900 var swiper = this;
31901 if (!swiper.params.loop) {
31902 swiper.pagination.render();
31903 swiper.pagination.update();
31904 }
31905 },
31906 destroy: function destroy() {
31907 var swiper = this;
31908 swiper.pagination.destroy();
31909 },
31910 click: function click(e) {
31911 var swiper = this;
31912 if (
31913 swiper.params.pagination.el
31914 && swiper.params.pagination.hideOnClick
31915 && swiper.pagination.$el.length > 0
31916 && !$(e.target).hasClass(swiper.params.pagination.bulletClass)
31917 ) {
5d51ea26
DC
31918 var isHidden = swiper.pagination.$el.hasClass(swiper.params.pagination.hiddenClass);
31919 if (isHidden === true) {
31920 swiper.emit('paginationShow', swiper);
31921 } else {
31922 swiper.emit('paginationHide', swiper);
31923 }
5309fbda
DC
31924 swiper.pagination.$el.toggleClass(swiper.params.pagination.hiddenClass);
31925 }
31926 },
31927 },
31928 };
31929
31930 var Scrollbar = {
31931 setTranslate: function setTranslate() {
31932 var swiper = this;
31933 if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) { return; }
31934 var scrollbar = swiper.scrollbar;
31935 var rtl = swiper.rtlTranslate;
31936 var progress = swiper.progress;
31937 var dragSize = scrollbar.dragSize;
31938 var trackSize = scrollbar.trackSize;
31939 var $dragEl = scrollbar.$dragEl;
31940 var $el = scrollbar.$el;
31941 var params = swiper.params.scrollbar;
31942
31943 var newSize = dragSize;
31944 var newPos = (trackSize - dragSize) * progress;
31945 if (rtl) {
31946 newPos = -newPos;
31947 if (newPos > 0) {
31948 newSize = dragSize - newPos;
31949 newPos = 0;
31950 } else if (-newPos + dragSize > trackSize) {
31951 newSize = trackSize + newPos;
31952 }
31953 } else if (newPos < 0) {
31954 newSize = dragSize + newPos;
31955 newPos = 0;
31956 } else if (newPos + dragSize > trackSize) {
31957 newSize = trackSize - newPos;
31958 }
31959 if (swiper.isHorizontal()) {
31960 if (Support.transforms3d) {
31961 $dragEl.transform(("translate3d(" + newPos + "px, 0, 0)"));
31962 } else {
31963 $dragEl.transform(("translateX(" + newPos + "px)"));
31964 }
31965 $dragEl[0].style.width = newSize + "px";
31966 } else {
31967 if (Support.transforms3d) {
31968 $dragEl.transform(("translate3d(0px, " + newPos + "px, 0)"));
31969 } else {
31970 $dragEl.transform(("translateY(" + newPos + "px)"));
31971 }
31972 $dragEl[0].style.height = newSize + "px";
31973 }
31974 if (params.hide) {
31975 clearTimeout(swiper.scrollbar.timeout);
31976 $el[0].style.opacity = 1;
31977 swiper.scrollbar.timeout = setTimeout(function () {
31978 $el[0].style.opacity = 0;
31979 $el.transition(400);
31980 }, 1000);
31981 }
31982 },
31983 setTransition: function setTransition(duration) {
31984 var swiper = this;
31985 if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) { return; }
31986 swiper.scrollbar.$dragEl.transition(duration);
31987 },
31988 updateSize: function updateSize() {
31989 var swiper = this;
31990 if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) { return; }
31991
31992 var scrollbar = swiper.scrollbar;
31993 var $dragEl = scrollbar.$dragEl;
31994 var $el = scrollbar.$el;
31995
31996 $dragEl[0].style.width = '';
31997 $dragEl[0].style.height = '';
31998 var trackSize = swiper.isHorizontal() ? $el[0].offsetWidth : $el[0].offsetHeight;
31999
32000 var divider = swiper.size / swiper.virtualSize;
32001 var moveDivider = divider * (trackSize / swiper.size);
32002 var dragSize;
32003 if (swiper.params.scrollbar.dragSize === 'auto') {
32004 dragSize = trackSize * divider;
32005 } else {
32006 dragSize = parseInt(swiper.params.scrollbar.dragSize, 10);
32007 }
32008
32009 if (swiper.isHorizontal()) {
32010 $dragEl[0].style.width = dragSize + "px";
32011 } else {
32012 $dragEl[0].style.height = dragSize + "px";
32013 }
32014
32015 if (divider >= 1) {
32016 $el[0].style.display = 'none';
32017 } else {
32018 $el[0].style.display = '';
32019 }
5d51ea26 32020 if (swiper.params.scrollbar.hide) {
5309fbda
DC
32021 $el[0].style.opacity = 0;
32022 }
32023 Utils.extend(scrollbar, {
32024 trackSize: trackSize,
32025 divider: divider,
32026 moveDivider: moveDivider,
32027 dragSize: dragSize,
32028 });
32029 scrollbar.$el[swiper.params.watchOverflow && swiper.isLocked ? 'addClass' : 'removeClass'](swiper.params.scrollbar.lockClass);
32030 },
32031 setDragPosition: function setDragPosition(e) {
32032 var swiper = this;
32033 var scrollbar = swiper.scrollbar;
32034 var rtl = swiper.rtlTranslate;
32035 var $el = scrollbar.$el;
32036 var dragSize = scrollbar.dragSize;
32037 var trackSize = scrollbar.trackSize;
32038
32039 var pointerPosition;
32040 if (swiper.isHorizontal()) {
32041 pointerPosition = ((e.type === 'touchstart' || e.type === 'touchmove') ? e.targetTouches[0].pageX : e.pageX || e.clientX);
32042 } else {
32043 pointerPosition = ((e.type === 'touchstart' || e.type === 'touchmove') ? e.targetTouches[0].pageY : e.pageY || e.clientY);
32044 }
32045 var positionRatio;
32046 positionRatio = ((pointerPosition) - $el.offset()[swiper.isHorizontal() ? 'left' : 'top'] - (dragSize / 2)) / (trackSize - dragSize);
32047 positionRatio = Math.max(Math.min(positionRatio, 1), 0);
32048 if (rtl) {
32049 positionRatio = 1 - positionRatio;
32050 }
32051
32052 var position = swiper.minTranslate() + ((swiper.maxTranslate() - swiper.minTranslate()) * positionRatio);
32053
32054 swiper.updateProgress(position);
32055 swiper.setTranslate(position);
32056 swiper.updateActiveIndex();
32057 swiper.updateSlidesClasses();
32058 },
32059 onDragStart: function onDragStart(e) {
32060 var swiper = this;
32061 var params = swiper.params.scrollbar;
32062 var scrollbar = swiper.scrollbar;
32063 var $wrapperEl = swiper.$wrapperEl;
32064 var $el = scrollbar.$el;
32065 var $dragEl = scrollbar.$dragEl;
32066 swiper.scrollbar.isTouched = true;
32067 e.preventDefault();
32068 e.stopPropagation();
32069
32070 $wrapperEl.transition(100);
32071 $dragEl.transition(100);
32072 scrollbar.setDragPosition(e);
32073
32074 clearTimeout(swiper.scrollbar.dragTimeout);
32075
32076 $el.transition(0);
32077 if (params.hide) {
32078 $el.css('opacity', 1);
32079 }
32080 swiper.emit('scrollbarDragStart', e);
32081 },
32082 onDragMove: function onDragMove(e) {
32083 var swiper = this;
32084 var scrollbar = swiper.scrollbar;
32085 var $wrapperEl = swiper.$wrapperEl;
32086 var $el = scrollbar.$el;
32087 var $dragEl = scrollbar.$dragEl;
32088
32089 if (!swiper.scrollbar.isTouched) { return; }
32090 if (e.preventDefault) { e.preventDefault(); }
32091 else { e.returnValue = false; }
32092 scrollbar.setDragPosition(e);
32093 $wrapperEl.transition(0);
32094 $el.transition(0);
32095 $dragEl.transition(0);
32096 swiper.emit('scrollbarDragMove', e);
32097 },
32098 onDragEnd: function onDragEnd(e) {
32099 var swiper = this;
32100
32101 var params = swiper.params.scrollbar;
32102 var scrollbar = swiper.scrollbar;
32103 var $el = scrollbar.$el;
32104
32105 if (!swiper.scrollbar.isTouched) { return; }
32106 swiper.scrollbar.isTouched = false;
32107 if (params.hide) {
32108 clearTimeout(swiper.scrollbar.dragTimeout);
32109 swiper.scrollbar.dragTimeout = Utils.nextTick(function () {
32110 $el.css('opacity', 0);
32111 $el.transition(400);
32112 }, 1000);
32113 }
32114 swiper.emit('scrollbarDragEnd', e);
32115 if (params.snapOnRelease) {
32116 swiper.slideToClosest();
32117 }
32118 },
32119 enableDraggable: function enableDraggable() {
32120 var swiper = this;
32121 if (!swiper.params.scrollbar.el) { return; }
32122 var scrollbar = swiper.scrollbar;
32123 var touchEventsTouch = swiper.touchEventsTouch;
32124 var touchEventsDesktop = swiper.touchEventsDesktop;
32125 var params = swiper.params;
32126 var $el = scrollbar.$el;
32127 var target = $el[0];
32128 var activeListener = Support.passiveListener && params.passiveListeners ? { passive: false, capture: false } : false;
32129 var passiveListener = Support.passiveListener && params.passiveListeners ? { passive: true, capture: false } : false;
32130 if (!Support.touch) {
32131 target.addEventListener(touchEventsDesktop.start, swiper.scrollbar.onDragStart, activeListener);
32132 doc.addEventListener(touchEventsDesktop.move, swiper.scrollbar.onDragMove, activeListener);
32133 doc.addEventListener(touchEventsDesktop.end, swiper.scrollbar.onDragEnd, passiveListener);
32134 } else {
32135 target.addEventListener(touchEventsTouch.start, swiper.scrollbar.onDragStart, activeListener);
32136 target.addEventListener(touchEventsTouch.move, swiper.scrollbar.onDragMove, activeListener);
32137 target.addEventListener(touchEventsTouch.end, swiper.scrollbar.onDragEnd, passiveListener);
32138 }
32139 },
32140 disableDraggable: function disableDraggable() {
32141 var swiper = this;
32142 if (!swiper.params.scrollbar.el) { return; }
32143 var scrollbar = swiper.scrollbar;
32144 var touchEventsTouch = swiper.touchEventsTouch;
32145 var touchEventsDesktop = swiper.touchEventsDesktop;
32146 var params = swiper.params;
32147 var $el = scrollbar.$el;
32148 var target = $el[0];
32149 var activeListener = Support.passiveListener && params.passiveListeners ? { passive: false, capture: false } : false;
32150 var passiveListener = Support.passiveListener && params.passiveListeners ? { passive: true, capture: false } : false;
32151 if (!Support.touch) {
32152 target.removeEventListener(touchEventsDesktop.start, swiper.scrollbar.onDragStart, activeListener);
32153 doc.removeEventListener(touchEventsDesktop.move, swiper.scrollbar.onDragMove, activeListener);
32154 doc.removeEventListener(touchEventsDesktop.end, swiper.scrollbar.onDragEnd, passiveListener);
32155 } else {
32156 target.removeEventListener(touchEventsTouch.start, swiper.scrollbar.onDragStart, activeListener);
32157 target.removeEventListener(touchEventsTouch.move, swiper.scrollbar.onDragMove, activeListener);
32158 target.removeEventListener(touchEventsTouch.end, swiper.scrollbar.onDragEnd, passiveListener);
32159 }
32160 },
32161 init: function init() {
32162 var swiper = this;
32163 if (!swiper.params.scrollbar.el) { return; }
32164 var scrollbar = swiper.scrollbar;
32165 var $swiperEl = swiper.$el;
32166 var params = swiper.params.scrollbar;
32167
32168 var $el = $(params.el);
32169 if (swiper.params.uniqueNavElements && typeof params.el === 'string' && $el.length > 1 && $swiperEl.find(params.el).length === 1) {
32170 $el = $swiperEl.find(params.el);
32171 }
32172
32173 var $dragEl = $el.find(("." + (swiper.params.scrollbar.dragClass)));
32174 if ($dragEl.length === 0) {
32175 $dragEl = $(("<div class=\"" + (swiper.params.scrollbar.dragClass) + "\"></div>"));
32176 $el.append($dragEl);
32177 }
32178
32179 Utils.extend(scrollbar, {
32180 $el: $el,
32181 el: $el[0],
32182 $dragEl: $dragEl,
32183 dragEl: $dragEl[0],
32184 });
32185
32186 if (params.draggable) {
32187 scrollbar.enableDraggable();
32188 }
32189 },
32190 destroy: function destroy() {
32191 var swiper = this;
32192 swiper.scrollbar.disableDraggable();
32193 },
32194 };
32195
32196 var Scrollbar$1 = {
32197 name: 'scrollbar',
32198 params: {
32199 scrollbar: {
32200 el: null,
32201 dragSize: 'auto',
32202 hide: false,
32203 draggable: false,
32204 snapOnRelease: true,
32205 lockClass: 'swiper-scrollbar-lock',
32206 dragClass: 'swiper-scrollbar-drag',
32207 },
32208 },
32209 create: function create() {
32210 var swiper = this;
32211 Utils.extend(swiper, {
32212 scrollbar: {
32213 init: Scrollbar.init.bind(swiper),
32214 destroy: Scrollbar.destroy.bind(swiper),
32215 updateSize: Scrollbar.updateSize.bind(swiper),
32216 setTranslate: Scrollbar.setTranslate.bind(swiper),
32217 setTransition: Scrollbar.setTransition.bind(swiper),
32218 enableDraggable: Scrollbar.enableDraggable.bind(swiper),
32219 disableDraggable: Scrollbar.disableDraggable.bind(swiper),
32220 setDragPosition: Scrollbar.setDragPosition.bind(swiper),
32221 onDragStart: Scrollbar.onDragStart.bind(swiper),
32222 onDragMove: Scrollbar.onDragMove.bind(swiper),
32223 onDragEnd: Scrollbar.onDragEnd.bind(swiper),
32224 isTouched: false,
32225 timeout: null,
32226 dragTimeout: null,
32227 },
32228 });
32229 },
32230 on: {
32231 init: function init() {
32232 var swiper = this;
32233 swiper.scrollbar.init();
32234 swiper.scrollbar.updateSize();
32235 swiper.scrollbar.setTranslate();
32236 },
32237 update: function update() {
32238 var swiper = this;
32239 swiper.scrollbar.updateSize();
32240 },
32241 resize: function resize() {
32242 var swiper = this;
32243 swiper.scrollbar.updateSize();
32244 },
32245 observerUpdate: function observerUpdate() {
32246 var swiper = this;
32247 swiper.scrollbar.updateSize();
32248 },
32249 setTranslate: function setTranslate() {
32250 var swiper = this;
32251 swiper.scrollbar.setTranslate();
32252 },
32253 setTransition: function setTransition(duration) {
32254 var swiper = this;
32255 swiper.scrollbar.setTransition(duration);
32256 },
32257 destroy: function destroy() {
32258 var swiper = this;
32259 swiper.scrollbar.destroy();
32260 },
32261 },
32262 };
32263
32264 var Parallax = {
32265 setTransform: function setTransform(el, progress) {
32266 var swiper = this;
32267 var rtl = swiper.rtl;
32268
32269 var $el = $(el);
32270 var rtlFactor = rtl ? -1 : 1;
32271
32272 var p = $el.attr('data-swiper-parallax') || '0';
32273 var x = $el.attr('data-swiper-parallax-x');
32274 var y = $el.attr('data-swiper-parallax-y');
32275 var scale = $el.attr('data-swiper-parallax-scale');
32276 var opacity = $el.attr('data-swiper-parallax-opacity');
32277
32278 if (x || y) {
32279 x = x || '0';
32280 y = y || '0';
32281 } else if (swiper.isHorizontal()) {
32282 x = p;
32283 y = '0';
32284 } else {
32285 y = p;
32286 x = '0';
32287 }
32288
32289 if ((x).indexOf('%') >= 0) {
32290 x = (parseInt(x, 10) * progress * rtlFactor) + "%";
32291 } else {
32292 x = (x * progress * rtlFactor) + "px";
32293 }
32294 if ((y).indexOf('%') >= 0) {
32295 y = (parseInt(y, 10) * progress) + "%";
32296 } else {
32297 y = (y * progress) + "px";
32298 }
32299
32300 if (typeof opacity !== 'undefined' && opacity !== null) {
32301 var currentOpacity = opacity - ((opacity - 1) * (1 - Math.abs(progress)));
32302 $el[0].style.opacity = currentOpacity;
32303 }
32304 if (typeof scale === 'undefined' || scale === null) {
32305 $el.transform(("translate3d(" + x + ", " + y + ", 0px)"));
32306 } else {
32307 var currentScale = scale - ((scale - 1) * (1 - Math.abs(progress)));
32308 $el.transform(("translate3d(" + x + ", " + y + ", 0px) scale(" + currentScale + ")"));
32309 }
32310 },
32311 setTranslate: function setTranslate() {
32312 var swiper = this;
32313 var $el = swiper.$el;
32314 var slides = swiper.slides;
32315 var progress = swiper.progress;
32316 var snapGrid = swiper.snapGrid;
32317 $el.children('[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y]')
32318 .each(function (index, el) {
32319 swiper.parallax.setTransform(el, progress);
32320 });
32321 slides.each(function (slideIndex, slideEl) {
32322 var slideProgress = slideEl.progress;
32323 if (swiper.params.slidesPerGroup > 1 && swiper.params.slidesPerView !== 'auto') {
32324 slideProgress += Math.ceil(slideIndex / 2) - (progress * (snapGrid.length - 1));
32325 }
32326 slideProgress = Math.min(Math.max(slideProgress, -1), 1);
32327 $(slideEl).find('[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y]')
32328 .each(function (index, el) {
32329 swiper.parallax.setTransform(el, slideProgress);
32330 });
32331 });
32332 },
32333 setTransition: function setTransition(duration) {
32334 if ( duration === void 0 ) duration = this.params.speed;
32335
32336 var swiper = this;
32337 var $el = swiper.$el;
32338 $el.find('[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y]')
32339 .each(function (index, parallaxEl) {
32340 var $parallaxEl = $(parallaxEl);
32341 var parallaxDuration = parseInt($parallaxEl.attr('data-swiper-parallax-duration'), 10) || duration;
32342 if (duration === 0) { parallaxDuration = 0; }
32343 $parallaxEl.transition(parallaxDuration);
32344 });
32345 },
32346 };
32347
32348 var Parallax$1 = {
32349 name: 'parallax',
32350 params: {
32351 parallax: {
32352 enabled: false,
32353 },
32354 },
32355 create: function create() {
32356 var swiper = this;
32357 Utils.extend(swiper, {
32358 parallax: {
32359 setTransform: Parallax.setTransform.bind(swiper),
32360 setTranslate: Parallax.setTranslate.bind(swiper),
32361 setTransition: Parallax.setTransition.bind(swiper),
32362 },
32363 });
32364 },
32365 on: {
32366 beforeInit: function beforeInit() {
32367 var swiper = this;
32368 if (!swiper.params.parallax.enabled) { return; }
32369 swiper.params.watchSlidesProgress = true;
32370 swiper.originalParams.watchSlidesProgress = true;
32371 },
32372 init: function init() {
32373 var swiper = this;
5d51ea26 32374 if (!swiper.params.parallax.enabled) { return; }
5309fbda
DC
32375 swiper.parallax.setTranslate();
32376 },
32377 setTranslate: function setTranslate() {
32378 var swiper = this;
5d51ea26 32379 if (!swiper.params.parallax.enabled) { return; }
5309fbda
DC
32380 swiper.parallax.setTranslate();
32381 },
32382 setTransition: function setTransition(duration) {
32383 var swiper = this;
5d51ea26 32384 if (!swiper.params.parallax.enabled) { return; }
5309fbda
DC
32385 swiper.parallax.setTransition(duration);
32386 },
32387 },
32388 };
32389
32390 var Zoom = {
32391 // Calc Scale From Multi-touches
32392 getDistanceBetweenTouches: function getDistanceBetweenTouches(e) {
32393 if (e.targetTouches.length < 2) { return 1; }
32394 var x1 = e.targetTouches[0].pageX;
32395 var y1 = e.targetTouches[0].pageY;
32396 var x2 = e.targetTouches[1].pageX;
32397 var y2 = e.targetTouches[1].pageY;
32398 var distance = Math.sqrt((Math.pow( (x2 - x1), 2 )) + (Math.pow( (y2 - y1), 2 )));
32399 return distance;
32400 },
32401 // Events
32402 onGestureStart: function onGestureStart(e) {
32403 var swiper = this;
32404 var params = swiper.params.zoom;
32405 var zoom = swiper.zoom;
32406 var gesture = zoom.gesture;
32407 zoom.fakeGestureTouched = false;
32408 zoom.fakeGestureMoved = false;
32409 if (!Support.gestures) {
32410 if (e.type !== 'touchstart' || (e.type === 'touchstart' && e.targetTouches.length < 2)) {
32411 return;
32412 }
32413 zoom.fakeGestureTouched = true;
32414 gesture.scaleStart = Zoom.getDistanceBetweenTouches(e);
32415 }
32416 if (!gesture.$slideEl || !gesture.$slideEl.length) {
32417 gesture.$slideEl = $(e.target).closest('.swiper-slide');
32418 if (gesture.$slideEl.length === 0) { gesture.$slideEl = swiper.slides.eq(swiper.activeIndex); }
32419 gesture.$imageEl = gesture.$slideEl.find('img, svg, canvas');
32420 gesture.$imageWrapEl = gesture.$imageEl.parent(("." + (params.containerClass)));
32421 gesture.maxRatio = gesture.$imageWrapEl.attr('data-swiper-zoom') || params.maxRatio;
32422 if (gesture.$imageWrapEl.length === 0) {
32423 gesture.$imageEl = undefined;
32424 return;
32425 }
32426 }
32427 gesture.$imageEl.transition(0);
32428 swiper.zoom.isScaling = true;
32429 },
32430 onGestureChange: function onGestureChange(e) {
32431 var swiper = this;
32432 var params = swiper.params.zoom;
32433 var zoom = swiper.zoom;
32434 var gesture = zoom.gesture;
32435 if (!Support.gestures) {
32436 if (e.type !== 'touchmove' || (e.type === 'touchmove' && e.targetTouches.length < 2)) {
32437 return;
32438 }
32439 zoom.fakeGestureMoved = true;
32440 gesture.scaleMove = Zoom.getDistanceBetweenTouches(e);
32441 }
32442 if (!gesture.$imageEl || gesture.$imageEl.length === 0) { return; }
32443 if (Support.gestures) {
32444 zoom.scale = e.scale * zoom.currentScale;
32445 } else {
32446 zoom.scale = (gesture.scaleMove / gesture.scaleStart) * zoom.currentScale;
32447 }
32448 if (zoom.scale > gesture.maxRatio) {
32449 zoom.scale = (gesture.maxRatio - 1) + (Math.pow( ((zoom.scale - gesture.maxRatio) + 1), 0.5 ));
32450 }
32451 if (zoom.scale < params.minRatio) {
32452 zoom.scale = (params.minRatio + 1) - (Math.pow( ((params.minRatio - zoom.scale) + 1), 0.5 ));
32453 }
32454 gesture.$imageEl.transform(("translate3d(0,0,0) scale(" + (zoom.scale) + ")"));
32455 },
32456 onGestureEnd: function onGestureEnd(e) {
32457 var swiper = this;
32458 var params = swiper.params.zoom;
32459 var zoom = swiper.zoom;
32460 var gesture = zoom.gesture;
32461 if (!Support.gestures) {
32462 if (!zoom.fakeGestureTouched || !zoom.fakeGestureMoved) {
32463 return;
32464 }
32465 if (e.type !== 'touchend' || (e.type === 'touchend' && e.changedTouches.length < 2 && !Device.android)) {
32466 return;
32467 }
32468 zoom.fakeGestureTouched = false;
32469 zoom.fakeGestureMoved = false;
32470 }
32471 if (!gesture.$imageEl || gesture.$imageEl.length === 0) { return; }
32472 zoom.scale = Math.max(Math.min(zoom.scale, gesture.maxRatio), params.minRatio);
32473 gesture.$imageEl.transition(swiper.params.speed).transform(("translate3d(0,0,0) scale(" + (zoom.scale) + ")"));
32474 zoom.currentScale = zoom.scale;
32475 zoom.isScaling = false;
32476 if (zoom.scale === 1) { gesture.$slideEl = undefined; }
32477 },
32478 onTouchStart: function onTouchStart(e) {
32479 var swiper = this;
32480 var zoom = swiper.zoom;
32481 var gesture = zoom.gesture;
32482 var image = zoom.image;
32483 if (!gesture.$imageEl || gesture.$imageEl.length === 0) { return; }
32484 if (image.isTouched) { return; }
32485 if (Device.android) { e.preventDefault(); }
32486 image.isTouched = true;
32487 image.touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
32488 image.touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
32489 },
32490 onTouchMove: function onTouchMove(e) {
32491 var swiper = this;
32492 var zoom = swiper.zoom;
32493 var gesture = zoom.gesture;
32494 var image = zoom.image;
32495 var velocity = zoom.velocity;
32496 if (!gesture.$imageEl || gesture.$imageEl.length === 0) { return; }
32497 swiper.allowClick = false;
32498 if (!image.isTouched || !gesture.$slideEl) { return; }
32499
32500 if (!image.isMoved) {
32501 image.width = gesture.$imageEl[0].offsetWidth;
32502 image.height = gesture.$imageEl[0].offsetHeight;
32503 image.startX = Utils.getTranslate(gesture.$imageWrapEl[0], 'x') || 0;
32504 image.startY = Utils.getTranslate(gesture.$imageWrapEl[0], 'y') || 0;
32505 gesture.slideWidth = gesture.$slideEl[0].offsetWidth;
32506 gesture.slideHeight = gesture.$slideEl[0].offsetHeight;
32507 gesture.$imageWrapEl.transition(0);
32508 if (swiper.rtl) {
32509 image.startX = -image.startX;
32510 image.startY = -image.startY;
32511 }
32512 }
32513 // Define if we need image drag
32514 var scaledWidth = image.width * zoom.scale;
32515 var scaledHeight = image.height * zoom.scale;
32516
32517 if (scaledWidth < gesture.slideWidth && scaledHeight < gesture.slideHeight) { return; }
32518
32519 image.minX = Math.min(((gesture.slideWidth / 2) - (scaledWidth / 2)), 0);
32520 image.maxX = -image.minX;
32521 image.minY = Math.min(((gesture.slideHeight / 2) - (scaledHeight / 2)), 0);
32522 image.maxY = -image.minY;
32523
32524 image.touchesCurrent.x = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;
32525 image.touchesCurrent.y = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
32526
32527 if (!image.isMoved && !zoom.isScaling) {
32528 if (
32529 swiper.isHorizontal()
32530 && (
32531 (Math.floor(image.minX) === Math.floor(image.startX) && image.touchesCurrent.x < image.touchesStart.x)
32532 || (Math.floor(image.maxX) === Math.floor(image.startX) && image.touchesCurrent.x > image.touchesStart.x)
32533 )
32534 ) {
32535 image.isTouched = false;
32536 return;
32537 } if (
32538 !swiper.isHorizontal()
32539 && (
32540 (Math.floor(image.minY) === Math.floor(image.startY) && image.touchesCurrent.y < image.touchesStart.y)
32541 || (Math.floor(image.maxY) === Math.floor(image.startY) && image.touchesCurrent.y > image.touchesStart.y)
32542 )
32543 ) {
32544 image.isTouched = false;
32545 return;
32546 }
32547 }
32548 e.preventDefault();
32549 e.stopPropagation();
32550
32551 image.isMoved = true;
32552 image.currentX = (image.touchesCurrent.x - image.touchesStart.x) + image.startX;
32553 image.currentY = (image.touchesCurrent.y - image.touchesStart.y) + image.startY;
32554
32555 if (image.currentX < image.minX) {
32556 image.currentX = (image.minX + 1) - (Math.pow( ((image.minX - image.currentX) + 1), 0.8 ));
32557 }
32558 if (image.currentX > image.maxX) {
32559 image.currentX = (image.maxX - 1) + (Math.pow( ((image.currentX - image.maxX) + 1), 0.8 ));
32560 }
32561
32562 if (image.currentY < image.minY) {
32563 image.currentY = (image.minY + 1) - (Math.pow( ((image.minY - image.currentY) + 1), 0.8 ));
32564 }
32565 if (image.currentY > image.maxY) {
32566 image.currentY = (image.maxY - 1) + (Math.pow( ((image.currentY - image.maxY) + 1), 0.8 ));
32567 }
32568
32569 // Velocity
32570 if (!velocity.prevPositionX) { velocity.prevPositionX = image.touchesCurrent.x; }
32571 if (!velocity.prevPositionY) { velocity.prevPositionY = image.touchesCurrent.y; }
32572 if (!velocity.prevTime) { velocity.prevTime = Date.now(); }
32573 velocity.x = (image.touchesCurrent.x - velocity.prevPositionX) / (Date.now() - velocity.prevTime) / 2;
32574 velocity.y = (image.touchesCurrent.y - velocity.prevPositionY) / (Date.now() - velocity.prevTime) / 2;
32575 if (Math.abs(image.touchesCurrent.x - velocity.prevPositionX) < 2) { velocity.x = 0; }
32576 if (Math.abs(image.touchesCurrent.y - velocity.prevPositionY) < 2) { velocity.y = 0; }
32577 velocity.prevPositionX = image.touchesCurrent.x;
32578 velocity.prevPositionY = image.touchesCurrent.y;
32579 velocity.prevTime = Date.now();
32580
32581 gesture.$imageWrapEl.transform(("translate3d(" + (image.currentX) + "px, " + (image.currentY) + "px,0)"));
32582 },
32583 onTouchEnd: function onTouchEnd() {
32584 var swiper = this;
32585 var zoom = swiper.zoom;
32586 var gesture = zoom.gesture;
32587 var image = zoom.image;
32588 var velocity = zoom.velocity;
32589 if (!gesture.$imageEl || gesture.$imageEl.length === 0) { return; }
32590 if (!image.isTouched || !image.isMoved) {
32591 image.isTouched = false;
32592 image.isMoved = false;
32593 return;
32594 }
32595 image.isTouched = false;
32596 image.isMoved = false;
32597 var momentumDurationX = 300;
32598 var momentumDurationY = 300;
32599 var momentumDistanceX = velocity.x * momentumDurationX;
32600 var newPositionX = image.currentX + momentumDistanceX;
32601 var momentumDistanceY = velocity.y * momentumDurationY;
32602 var newPositionY = image.currentY + momentumDistanceY;
32603
32604 // Fix duration
32605 if (velocity.x !== 0) { momentumDurationX = Math.abs((newPositionX - image.currentX) / velocity.x); }
32606 if (velocity.y !== 0) { momentumDurationY = Math.abs((newPositionY - image.currentY) / velocity.y); }
32607 var momentumDuration = Math.max(momentumDurationX, momentumDurationY);
32608
32609 image.currentX = newPositionX;
32610 image.currentY = newPositionY;
32611
32612 // Define if we need image drag
32613 var scaledWidth = image.width * zoom.scale;
32614 var scaledHeight = image.height * zoom.scale;
32615 image.minX = Math.min(((gesture.slideWidth / 2) - (scaledWidth / 2)), 0);
32616 image.maxX = -image.minX;
32617 image.minY = Math.min(((gesture.slideHeight / 2) - (scaledHeight / 2)), 0);
32618 image.maxY = -image.minY;
32619 image.currentX = Math.max(Math.min(image.currentX, image.maxX), image.minX);
32620 image.currentY = Math.max(Math.min(image.currentY, image.maxY), image.minY);
32621
32622 gesture.$imageWrapEl.transition(momentumDuration).transform(("translate3d(" + (image.currentX) + "px, " + (image.currentY) + "px,0)"));
32623 },
32624 onTransitionEnd: function onTransitionEnd() {
32625 var swiper = this;
32626 var zoom = swiper.zoom;
32627 var gesture = zoom.gesture;
32628 if (gesture.$slideEl && swiper.previousIndex !== swiper.activeIndex) {
32629 gesture.$imageEl.transform('translate3d(0,0,0) scale(1)');
32630 gesture.$imageWrapEl.transform('translate3d(0,0,0)');
32631
32632 zoom.scale = 1;
32633 zoom.currentScale = 1;
32634
32635 gesture.$slideEl = undefined;
32636 gesture.$imageEl = undefined;
32637 gesture.$imageWrapEl = undefined;
32638 }
32639 },
32640 // Toggle Zoom
32641 toggle: function toggle(e) {
32642 var swiper = this;
32643 var zoom = swiper.zoom;
32644
32645 if (zoom.scale && zoom.scale !== 1) {
32646 // Zoom Out
32647 zoom.out();
32648 } else {
32649 // Zoom In
32650 zoom.in(e);
32651 }
32652 },
32653 in: function in$1(e) {
32654 var swiper = this;
32655
32656 var zoom = swiper.zoom;
32657 var params = swiper.params.zoom;
32658 var gesture = zoom.gesture;
32659 var image = zoom.image;
32660
32661 if (!gesture.$slideEl) {
32662 gesture.$slideEl = swiper.clickedSlide ? $(swiper.clickedSlide) : swiper.slides.eq(swiper.activeIndex);
32663 gesture.$imageEl = gesture.$slideEl.find('img, svg, canvas');
32664 gesture.$imageWrapEl = gesture.$imageEl.parent(("." + (params.containerClass)));
32665 }
32666 if (!gesture.$imageEl || gesture.$imageEl.length === 0) { return; }
32667
32668 gesture.$slideEl.addClass(("" + (params.zoomedSlideClass)));
32669
32670 var touchX;
32671 var touchY;
32672 var offsetX;
32673 var offsetY;
32674 var diffX;
32675 var diffY;
32676 var translateX;
32677 var translateY;
32678 var imageWidth;
32679 var imageHeight;
32680 var scaledWidth;
32681 var scaledHeight;
32682 var translateMinX;
32683 var translateMinY;
32684 var translateMaxX;
32685 var translateMaxY;
32686 var slideWidth;
32687 var slideHeight;
32688
32689 if (typeof image.touchesStart.x === 'undefined' && e) {
32690 touchX = e.type === 'touchend' ? e.changedTouches[0].pageX : e.pageX;
32691 touchY = e.type === 'touchend' ? e.changedTouches[0].pageY : e.pageY;
32692 } else {
32693 touchX = image.touchesStart.x;
32694 touchY = image.touchesStart.y;
32695 }
32696
32697 zoom.scale = gesture.$imageWrapEl.attr('data-swiper-zoom') || params.maxRatio;
32698 zoom.currentScale = gesture.$imageWrapEl.attr('data-swiper-zoom') || params.maxRatio;
32699 if (e) {
32700 slideWidth = gesture.$slideEl[0].offsetWidth;
32701 slideHeight = gesture.$slideEl[0].offsetHeight;
32702 offsetX = gesture.$slideEl.offset().left;
32703 offsetY = gesture.$slideEl.offset().top;
32704 diffX = (offsetX + (slideWidth / 2)) - touchX;
32705 diffY = (offsetY + (slideHeight / 2)) - touchY;
32706
32707 imageWidth = gesture.$imageEl[0].offsetWidth;
32708 imageHeight = gesture.$imageEl[0].offsetHeight;
32709 scaledWidth = imageWidth * zoom.scale;
32710 scaledHeight = imageHeight * zoom.scale;
32711
32712 translateMinX = Math.min(((slideWidth / 2) - (scaledWidth / 2)), 0);
32713 translateMinY = Math.min(((slideHeight / 2) - (scaledHeight / 2)), 0);
32714 translateMaxX = -translateMinX;
32715 translateMaxY = -translateMinY;
32716
32717 translateX = diffX * zoom.scale;
32718 translateY = diffY * zoom.scale;
32719
32720 if (translateX < translateMinX) {
32721 translateX = translateMinX;
32722 }
32723 if (translateX > translateMaxX) {
32724 translateX = translateMaxX;
32725 }
32726
32727 if (translateY < translateMinY) {
32728 translateY = translateMinY;
32729 }
32730 if (translateY > translateMaxY) {
32731 translateY = translateMaxY;
32732 }
32733 } else {
32734 translateX = 0;
32735 translateY = 0;
32736 }
32737 gesture.$imageWrapEl.transition(300).transform(("translate3d(" + translateX + "px, " + translateY + "px,0)"));
32738 gesture.$imageEl.transition(300).transform(("translate3d(0,0,0) scale(" + (zoom.scale) + ")"));
32739 },
32740 out: function out() {
32741 var swiper = this;
32742
32743 var zoom = swiper.zoom;
32744 var params = swiper.params.zoom;
32745 var gesture = zoom.gesture;
32746
32747 if (!gesture.$slideEl) {
32748 gesture.$slideEl = swiper.clickedSlide ? $(swiper.clickedSlide) : swiper.slides.eq(swiper.activeIndex);
32749 gesture.$imageEl = gesture.$slideEl.find('img, svg, canvas');
32750 gesture.$imageWrapEl = gesture.$imageEl.parent(("." + (params.containerClass)));
32751 }
32752 if (!gesture.$imageEl || gesture.$imageEl.length === 0) { return; }
32753
32754 zoom.scale = 1;
32755 zoom.currentScale = 1;
32756 gesture.$imageWrapEl.transition(300).transform('translate3d(0,0,0)');
32757 gesture.$imageEl.transition(300).transform('translate3d(0,0,0) scale(1)');
32758 gesture.$slideEl.removeClass(("" + (params.zoomedSlideClass)));
32759 gesture.$slideEl = undefined;
32760 },
32761 // Attach/Detach Events
32762 enable: function enable() {
32763 var swiper = this;
32764 var zoom = swiper.zoom;
32765 if (zoom.enabled) { return; }
32766 zoom.enabled = true;
32767
32768 var passiveListener = swiper.touchEvents.start === 'touchstart' && Support.passiveListener && swiper.params.passiveListeners ? { passive: true, capture: false } : false;
32769
32770 // Scale image
32771 if (Support.gestures) {
32772 swiper.$wrapperEl.on('gesturestart', '.swiper-slide', zoom.onGestureStart, passiveListener);
32773 swiper.$wrapperEl.on('gesturechange', '.swiper-slide', zoom.onGestureChange, passiveListener);
32774 swiper.$wrapperEl.on('gestureend', '.swiper-slide', zoom.onGestureEnd, passiveListener);
32775 } else if (swiper.touchEvents.start === 'touchstart') {
32776 swiper.$wrapperEl.on(swiper.touchEvents.start, '.swiper-slide', zoom.onGestureStart, passiveListener);
32777 swiper.$wrapperEl.on(swiper.touchEvents.move, '.swiper-slide', zoom.onGestureChange, passiveListener);
32778 swiper.$wrapperEl.on(swiper.touchEvents.end, '.swiper-slide', zoom.onGestureEnd, passiveListener);
32779 }
32780
32781 // Move image
32782 swiper.$wrapperEl.on(swiper.touchEvents.move, ("." + (swiper.params.zoom.containerClass)), zoom.onTouchMove);
32783 },
32784 disable: function disable() {
32785 var swiper = this;
32786 var zoom = swiper.zoom;
32787 if (!zoom.enabled) { return; }
32788
32789 swiper.zoom.enabled = false;
32790
32791 var passiveListener = swiper.touchEvents.start === 'touchstart' && Support.passiveListener && swiper.params.passiveListeners ? { passive: true, capture: false } : false;
32792
32793 // Scale image
32794 if (Support.gestures) {
32795 swiper.$wrapperEl.off('gesturestart', '.swiper-slide', zoom.onGestureStart, passiveListener);
32796 swiper.$wrapperEl.off('gesturechange', '.swiper-slide', zoom.onGestureChange, passiveListener);
32797 swiper.$wrapperEl.off('gestureend', '.swiper-slide', zoom.onGestureEnd, passiveListener);
32798 } else if (swiper.touchEvents.start === 'touchstart') {
32799 swiper.$wrapperEl.off(swiper.touchEvents.start, '.swiper-slide', zoom.onGestureStart, passiveListener);
32800 swiper.$wrapperEl.off(swiper.touchEvents.move, '.swiper-slide', zoom.onGestureChange, passiveListener);
32801 swiper.$wrapperEl.off(swiper.touchEvents.end, '.swiper-slide', zoom.onGestureEnd, passiveListener);
32802 }
32803
32804 // Move image
32805 swiper.$wrapperEl.off(swiper.touchEvents.move, ("." + (swiper.params.zoom.containerClass)), zoom.onTouchMove);
32806 },
32807 };
32808
32809 var Zoom$1 = {
32810 name: 'zoom',
32811 params: {
32812 zoom: {
32813 enabled: false,
32814 maxRatio: 3,
32815 minRatio: 1,
32816 toggle: true,
32817 containerClass: 'swiper-zoom-container',
32818 zoomedSlideClass: 'swiper-slide-zoomed',
32819 },
32820 },
32821 create: function create() {
32822 var swiper = this;
32823 var zoom = {
32824 enabled: false,
32825 scale: 1,
32826 currentScale: 1,
32827 isScaling: false,
32828 gesture: {
32829 $slideEl: undefined,
32830 slideWidth: undefined,
32831 slideHeight: undefined,
32832 $imageEl: undefined,
32833 $imageWrapEl: undefined,
32834 maxRatio: 3,
32835 },
32836 image: {
32837 isTouched: undefined,
32838 isMoved: undefined,
32839 currentX: undefined,
32840 currentY: undefined,
32841 minX: undefined,
32842 minY: undefined,
32843 maxX: undefined,
32844 maxY: undefined,
32845 width: undefined,
32846 height: undefined,
32847 startX: undefined,
32848 startY: undefined,
32849 touchesStart: {},
32850 touchesCurrent: {},
32851 },
32852 velocity: {
32853 x: undefined,
32854 y: undefined,
32855 prevPositionX: undefined,
32856 prevPositionY: undefined,
32857 prevTime: undefined,
32858 },
32859 };
32860
32861 ('onGestureStart onGestureChange onGestureEnd onTouchStart onTouchMove onTouchEnd onTransitionEnd toggle enable disable in out').split(' ').forEach(function (methodName) {
32862 zoom[methodName] = Zoom[methodName].bind(swiper);
32863 });
32864 Utils.extend(swiper, {
32865 zoom: zoom,
32866 });
32867
32868 var scale = 1;
32869 Object.defineProperty(swiper.zoom, 'scale', {
32870 get: function get() {
32871 return scale;
32872 },
32873 set: function set(value) {
32874 if (scale !== value) {
32875 var imageEl = swiper.zoom.gesture.$imageEl ? swiper.zoom.gesture.$imageEl[0] : undefined;
32876 var slideEl = swiper.zoom.gesture.$slideEl ? swiper.zoom.gesture.$slideEl[0] : undefined;
32877 swiper.emit('zoomChange', value, imageEl, slideEl);
32878 }
32879 scale = value;
32880 },
32881 });
32882 },
32883 on: {
32884 init: function init() {
32885 var swiper = this;
32886 if (swiper.params.zoom.enabled) {
32887 swiper.zoom.enable();
32888 }
32889 },
32890 destroy: function destroy() {
32891 var swiper = this;
32892 swiper.zoom.disable();
32893 },
32894 touchStart: function touchStart(e) {
32895 var swiper = this;
32896 if (!swiper.zoom.enabled) { return; }
32897 swiper.zoom.onTouchStart(e);
32898 },
32899 touchEnd: function touchEnd(e) {
32900 var swiper = this;
32901 if (!swiper.zoom.enabled) { return; }
32902 swiper.zoom.onTouchEnd(e);
32903 },
32904 doubleTap: function doubleTap(e) {
32905 var swiper = this;
32906 if (swiper.params.zoom.enabled && swiper.zoom.enabled && swiper.params.zoom.toggle) {
32907 swiper.zoom.toggle(e);
32908 }
32909 },
32910 transitionEnd: function transitionEnd() {
32911 var swiper = this;
32912 if (swiper.zoom.enabled && swiper.params.zoom.enabled) {
32913 swiper.zoom.onTransitionEnd();
32914 }
32915 },
32916 },
32917 };
32918
32919 var Lazy$2 = {
32920 loadInSlide: function loadInSlide(index, loadInDuplicate) {
32921 if ( loadInDuplicate === void 0 ) loadInDuplicate = true;
32922
32923 var swiper = this;
32924 var params = swiper.params.lazy;
32925 if (typeof index === 'undefined') { return; }
32926 if (swiper.slides.length === 0) { return; }
32927 var isVirtual = swiper.virtual && swiper.params.virtual.enabled;
32928
32929 var $slideEl = isVirtual
32930 ? swiper.$wrapperEl.children(("." + (swiper.params.slideClass) + "[data-swiper-slide-index=\"" + index + "\"]"))
32931 : swiper.slides.eq(index);
32932
32933 var $images = $slideEl.find(("." + (params.elementClass) + ":not(." + (params.loadedClass) + "):not(." + (params.loadingClass) + ")"));
32934 if ($slideEl.hasClass(params.elementClass) && !$slideEl.hasClass(params.loadedClass) && !$slideEl.hasClass(params.loadingClass)) {
32935 $images = $images.add($slideEl[0]);
32936 }
32937 if ($images.length === 0) { return; }
32938
32939 $images.each(function (imageIndex, imageEl) {
32940 var $imageEl = $(imageEl);
32941 $imageEl.addClass(params.loadingClass);
32942
32943 var background = $imageEl.attr('data-background');
32944 var src = $imageEl.attr('data-src');
32945 var srcset = $imageEl.attr('data-srcset');
32946 var sizes = $imageEl.attr('data-sizes');
32947
32948 swiper.loadImage($imageEl[0], (src || background), srcset, sizes, false, function () {
32949 if (typeof swiper === 'undefined' || swiper === null || !swiper || (swiper && !swiper.params) || swiper.destroyed) { return; }
32950 if (background) {
32951 $imageEl.css('background-image', ("url(\"" + background + "\")"));
32952 $imageEl.removeAttr('data-background');
32953 } else {
32954 if (srcset) {
32955 $imageEl.attr('srcset', srcset);
32956 $imageEl.removeAttr('data-srcset');
32957 }
32958 if (sizes) {
32959 $imageEl.attr('sizes', sizes);
32960 $imageEl.removeAttr('data-sizes');
32961 }
32962 if (src) {
32963 $imageEl.attr('src', src);
32964 $imageEl.removeAttr('data-src');
32965 }
32966 }
32967
32968 $imageEl.addClass(params.loadedClass).removeClass(params.loadingClass);
32969 $slideEl.find(("." + (params.preloaderClass))).remove();
32970 if (swiper.params.loop && loadInDuplicate) {
32971 var slideOriginalIndex = $slideEl.attr('data-swiper-slide-index');
32972 if ($slideEl.hasClass(swiper.params.slideDuplicateClass)) {
32973 var originalSlide = swiper.$wrapperEl.children(("[data-swiper-slide-index=\"" + slideOriginalIndex + "\"]:not(." + (swiper.params.slideDuplicateClass) + ")"));
32974 swiper.lazy.loadInSlide(originalSlide.index(), false);
32975 } else {
32976 var duplicatedSlide = swiper.$wrapperEl.children(("." + (swiper.params.slideDuplicateClass) + "[data-swiper-slide-index=\"" + slideOriginalIndex + "\"]"));
32977 swiper.lazy.loadInSlide(duplicatedSlide.index(), false);
32978 }
32979 }
32980 swiper.emit('lazyImageReady', $slideEl[0], $imageEl[0]);
32981 });
32982
32983 swiper.emit('lazyImageLoad', $slideEl[0], $imageEl[0]);
32984 });
32985 },
32986 load: function load() {
32987 var swiper = this;
32988 var $wrapperEl = swiper.$wrapperEl;
32989 var swiperParams = swiper.params;
32990 var slides = swiper.slides;
32991 var activeIndex = swiper.activeIndex;
32992 var isVirtual = swiper.virtual && swiperParams.virtual.enabled;
32993 var params = swiperParams.lazy;
32994
32995 var slidesPerView = swiperParams.slidesPerView;
32996 if (slidesPerView === 'auto') {
32997 slidesPerView = 0;
32998 }
32999
33000 function slideExist(index) {
33001 if (isVirtual) {
33002 if ($wrapperEl.children(("." + (swiperParams.slideClass) + "[data-swiper-slide-index=\"" + index + "\"]")).length) {
33003 return true;
33004 }
33005 } else if (slides[index]) { return true; }
33006 return false;
33007 }
33008 function slideIndex(slideEl) {
33009 if (isVirtual) {
33010 return $(slideEl).attr('data-swiper-slide-index');
33011 }
33012 return $(slideEl).index();
33013 }
33014
33015 if (!swiper.lazy.initialImageLoaded) { swiper.lazy.initialImageLoaded = true; }
33016 if (swiper.params.watchSlidesVisibility) {
33017 $wrapperEl.children(("." + (swiperParams.slideVisibleClass))).each(function (elIndex, slideEl) {
33018 var index = isVirtual ? $(slideEl).attr('data-swiper-slide-index') : $(slideEl).index();
33019 swiper.lazy.loadInSlide(index);
33020 });
33021 } else if (slidesPerView > 1) {
33022 for (var i = activeIndex; i < activeIndex + slidesPerView; i += 1) {
33023 if (slideExist(i)) { swiper.lazy.loadInSlide(i); }
33024 }
33025 } else {
33026 swiper.lazy.loadInSlide(activeIndex);
33027 }
33028 if (params.loadPrevNext) {
33029 if (slidesPerView > 1 || (params.loadPrevNextAmount && params.loadPrevNextAmount > 1)) {
33030 var amount = params.loadPrevNextAmount;
33031 var spv = slidesPerView;
33032 var maxIndex = Math.min(activeIndex + spv + Math.max(amount, spv), slides.length);
33033 var minIndex = Math.max(activeIndex - Math.max(spv, amount), 0);
33034 // Next Slides
33035 for (var i$1 = activeIndex + slidesPerView; i$1 < maxIndex; i$1 += 1) {
33036 if (slideExist(i$1)) { swiper.lazy.loadInSlide(i$1); }
33037 }
33038 // Prev Slides
33039 for (var i$2 = minIndex; i$2 < activeIndex; i$2 += 1) {
33040 if (slideExist(i$2)) { swiper.lazy.loadInSlide(i$2); }
33041 }
33042 } else {
33043 var nextSlide = $wrapperEl.children(("." + (swiperParams.slideNextClass)));
33044 if (nextSlide.length > 0) { swiper.lazy.loadInSlide(slideIndex(nextSlide)); }
33045
33046 var prevSlide = $wrapperEl.children(("." + (swiperParams.slidePrevClass)));
33047 if (prevSlide.length > 0) { swiper.lazy.loadInSlide(slideIndex(prevSlide)); }
33048 }
33049 }
33050 },
33051 };
33052
33053 var Lazy$3 = {
33054 name: 'lazy',
33055 params: {
33056 lazy: {
33057 enabled: false,
33058 loadPrevNext: false,
33059 loadPrevNextAmount: 1,
33060 loadOnTransitionStart: false,
33061
33062 elementClass: 'swiper-lazy',
33063 loadingClass: 'swiper-lazy-loading',
33064 loadedClass: 'swiper-lazy-loaded',
33065 preloaderClass: 'swiper-lazy-preloader',
33066 },
33067 },
33068 create: function create() {
33069 var swiper = this;
33070 Utils.extend(swiper, {
33071 lazy: {
33072 initialImageLoaded: false,
33073 load: Lazy$2.load.bind(swiper),
33074 loadInSlide: Lazy$2.loadInSlide.bind(swiper),
33075 },
33076 });
33077 },
33078 on: {
33079 beforeInit: function beforeInit() {
33080 var swiper = this;
33081 if (swiper.params.lazy.enabled && swiper.params.preloadImages) {
33082 swiper.params.preloadImages = false;
33083 }
33084 },
33085 init: function init() {
33086 var swiper = this;
33087 if (swiper.params.lazy.enabled && !swiper.params.loop && swiper.params.initialSlide === 0) {
33088 swiper.lazy.load();
33089 }
33090 },
33091 scroll: function scroll() {
33092 var swiper = this;
33093 if (swiper.params.freeMode && !swiper.params.freeModeSticky) {
33094 swiper.lazy.load();
33095 }
33096 },
33097 resize: function resize() {
33098 var swiper = this;
33099 if (swiper.params.lazy.enabled) {
33100 swiper.lazy.load();
33101 }
33102 },
33103 scrollbarDragMove: function scrollbarDragMove() {
33104 var swiper = this;
33105 if (swiper.params.lazy.enabled) {
33106 swiper.lazy.load();
33107 }
33108 },
33109 transitionStart: function transitionStart() {
33110 var swiper = this;
33111 if (swiper.params.lazy.enabled) {
33112 if (swiper.params.lazy.loadOnTransitionStart || (!swiper.params.lazy.loadOnTransitionStart && !swiper.lazy.initialImageLoaded)) {
33113 swiper.lazy.load();
33114 }
33115 }
33116 },
33117 transitionEnd: function transitionEnd() {
33118 var swiper = this;
33119 if (swiper.params.lazy.enabled && !swiper.params.lazy.loadOnTransitionStart) {
33120 swiper.lazy.load();
33121 }
33122 },
33123 },
33124 };
33125
33126 /* eslint no-bitwise: ["error", { "allow": [">>"] }] */
33127
33128 var Controller = {
33129 LinearSpline: function LinearSpline(x, y) {
33130 var binarySearch = (function search() {
33131 var maxIndex;
33132 var minIndex;
33133 var guess;
33134 return function (array, val) {
33135 minIndex = -1;
33136 maxIndex = array.length;
33137 while (maxIndex - minIndex > 1) {
33138 guess = maxIndex + minIndex >> 1;
33139 if (array[guess] <= val) {
33140 minIndex = guess;
33141 } else {
33142 maxIndex = guess;
33143 }
33144 }
33145 return maxIndex;
33146 };
33147 }());
33148 this.x = x;
33149 this.y = y;
33150 this.lastIndex = x.length - 1;
33151 // Given an x value (x2), return the expected y2 value:
33152 // (x1,y1) is the known point before given value,
33153 // (x3,y3) is the known point after given value.
33154 var i1;
33155 var i3;
33156
33157 this.interpolate = function interpolate(x2) {
33158 if (!x2) { return 0; }
33159
33160 // Get the indexes of x1 and x3 (the array indexes before and after given x2):
33161 i3 = binarySearch(this.x, x2);
33162 i1 = i3 - 1;
33163
33164 // We have our indexes i1 & i3, so we can calculate already:
33165 // y2 := ((x2−x1) × (y3−y1)) ÷ (x3−x1) + y1
33166 return (((x2 - this.x[i1]) * (this.y[i3] - this.y[i1])) / (this.x[i3] - this.x[i1])) + this.y[i1];
33167 };
33168 return this;
33169 },
33170 // xxx: for now i will just save one spline function to to
33171 getInterpolateFunction: function getInterpolateFunction(c) {
33172 var swiper = this;
33173 if (!swiper.controller.spline) {
33174 swiper.controller.spline = swiper.params.loop
33175 ? new Controller.LinearSpline(swiper.slidesGrid, c.slidesGrid)
33176 : new Controller.LinearSpline(swiper.snapGrid, c.snapGrid);
33177 }
33178 },
33179 setTranslate: function setTranslate(setTranslate$1, byController) {
33180 var swiper = this;
33181 var controlled = swiper.controller.control;
33182 var multiplier;
33183 var controlledTranslate;
33184 function setControlledTranslate(c) {
33185 // this will create an Interpolate function based on the snapGrids
33186 // x is the Grid of the scrolled scroller and y will be the controlled scroller
33187 // it makes sense to create this only once and recall it for the interpolation
33188 // the function does a lot of value caching for performance
33189 var translate = swiper.rtlTranslate ? -swiper.translate : swiper.translate;
33190 if (swiper.params.controller.by === 'slide') {
33191 swiper.controller.getInterpolateFunction(c);
33192 // i am not sure why the values have to be multiplicated this way, tried to invert the snapGrid
33193 // but it did not work out
33194 controlledTranslate = -swiper.controller.spline.interpolate(-translate);
33195 }
33196
33197 if (!controlledTranslate || swiper.params.controller.by === 'container') {
33198 multiplier = (c.maxTranslate() - c.minTranslate()) / (swiper.maxTranslate() - swiper.minTranslate());
33199 controlledTranslate = ((translate - swiper.minTranslate()) * multiplier) + c.minTranslate();
33200 }
33201
33202 if (swiper.params.controller.inverse) {
33203 controlledTranslate = c.maxTranslate() - controlledTranslate;
33204 }
33205 c.updateProgress(controlledTranslate);
33206 c.setTranslate(controlledTranslate, swiper);
33207 c.updateActiveIndex();
33208 c.updateSlidesClasses();
33209 }
33210 if (Array.isArray(controlled)) {
33211 for (var i = 0; i < controlled.length; i += 1) {
33212 if (controlled[i] !== byController && controlled[i] instanceof Swiper) {
33213 setControlledTranslate(controlled[i]);
33214 }
33215 }
33216 } else if (controlled instanceof Swiper && byController !== controlled) {
33217 setControlledTranslate(controlled);
33218 }
33219 },
33220 setTransition: function setTransition(duration, byController) {
33221 var swiper = this;
33222 var controlled = swiper.controller.control;
33223 var i;
33224 function setControlledTransition(c) {
33225 c.setTransition(duration, swiper);
33226 if (duration !== 0) {
33227 c.transitionStart();
33228 if (c.params.autoHeight) {
33229 Utils.nextTick(function () {
33230 c.updateAutoHeight();
33231 });
33232 }
33233 c.$wrapperEl.transitionEnd(function () {
33234 if (!controlled) { return; }
33235 if (c.params.loop && swiper.params.controller.by === 'slide') {
33236 c.loopFix();
33237 }
33238 c.transitionEnd();
33239 });
33240 }
33241 }
33242 if (Array.isArray(controlled)) {
33243 for (i = 0; i < controlled.length; i += 1) {
33244 if (controlled[i] !== byController && controlled[i] instanceof Swiper) {
33245 setControlledTransition(controlled[i]);
33246 }
33247 }
33248 } else if (controlled instanceof Swiper && byController !== controlled) {
33249 setControlledTransition(controlled);
33250 }
33251 },
33252 };
33253 var Controller$1 = {
33254 name: 'controller',
33255 params: {
33256 controller: {
33257 control: undefined,
33258 inverse: false,
33259 by: 'slide', // or 'container'
33260 },
33261 },
33262 create: function create() {
33263 var swiper = this;
33264 Utils.extend(swiper, {
33265 controller: {
33266 control: swiper.params.controller.control,
33267 getInterpolateFunction: Controller.getInterpolateFunction.bind(swiper),
33268 setTranslate: Controller.setTranslate.bind(swiper),
33269 setTransition: Controller.setTransition.bind(swiper),
33270 },
33271 });
33272 },
33273 on: {
33274 update: function update() {
33275 var swiper = this;
33276 if (!swiper.controller.control) { return; }
33277 if (swiper.controller.spline) {
33278 swiper.controller.spline = undefined;
33279 delete swiper.controller.spline;
33280 }
33281 },
33282 resize: function resize() {
33283 var swiper = this;
33284 if (!swiper.controller.control) { return; }
33285 if (swiper.controller.spline) {
33286 swiper.controller.spline = undefined;
33287 delete swiper.controller.spline;
33288 }
33289 },
33290 observerUpdate: function observerUpdate() {
33291 var swiper = this;
33292 if (!swiper.controller.control) { return; }
33293 if (swiper.controller.spline) {
33294 swiper.controller.spline = undefined;
33295 delete swiper.controller.spline;
33296 }
33297 },
33298 setTranslate: function setTranslate(translate, byController) {
33299 var swiper = this;
33300 if (!swiper.controller.control) { return; }
33301 swiper.controller.setTranslate(translate, byController);
33302 },
33303 setTransition: function setTransition(duration, byController) {
33304 var swiper = this;
33305 if (!swiper.controller.control) { return; }
33306 swiper.controller.setTransition(duration, byController);
33307 },
33308 },
33309 };
33310
33311 var a11y = {
33312 makeElFocusable: function makeElFocusable($el) {
33313 $el.attr('tabIndex', '0');
33314 return $el;
33315 },
33316 addElRole: function addElRole($el, role) {
33317 $el.attr('role', role);
33318 return $el;
33319 },
33320 addElLabel: function addElLabel($el, label) {
33321 $el.attr('aria-label', label);
33322 return $el;
33323 },
33324 disableEl: function disableEl($el) {
33325 $el.attr('aria-disabled', true);
33326 return $el;
33327 },
33328 enableEl: function enableEl($el) {
33329 $el.attr('aria-disabled', false);
33330 return $el;
33331 },
33332 onEnterKey: function onEnterKey(e) {
33333 var swiper = this;
33334 var params = swiper.params.a11y;
33335 if (e.keyCode !== 13) { return; }
33336 var $targetEl = $(e.target);
33337 if (swiper.navigation && swiper.navigation.$nextEl && $targetEl.is(swiper.navigation.$nextEl)) {
33338 if (!(swiper.isEnd && !swiper.params.loop)) {
33339 swiper.slideNext();
33340 }
33341 if (swiper.isEnd) {
33342 swiper.a11y.notify(params.lastSlideMessage);
33343 } else {
33344 swiper.a11y.notify(params.nextSlideMessage);
33345 }
33346 }
33347 if (swiper.navigation && swiper.navigation.$prevEl && $targetEl.is(swiper.navigation.$prevEl)) {
33348 if (!(swiper.isBeginning && !swiper.params.loop)) {
33349 swiper.slidePrev();
33350 }
33351 if (swiper.isBeginning) {
33352 swiper.a11y.notify(params.firstSlideMessage);
33353 } else {
33354 swiper.a11y.notify(params.prevSlideMessage);
33355 }
33356 }
33357 if (swiper.pagination && $targetEl.is(("." + (swiper.params.pagination.bulletClass)))) {
33358 $targetEl[0].click();
33359 }
33360 },
33361 notify: function notify(message) {
33362 var swiper = this;
33363 var notification = swiper.a11y.liveRegion;
33364 if (notification.length === 0) { return; }
33365 notification.html('');
33366 notification.html(message);
33367 },
33368 updateNavigation: function updateNavigation() {
33369 var swiper = this;
33370
33371 if (swiper.params.loop) { return; }
33372 var ref = swiper.navigation;
33373 var $nextEl = ref.$nextEl;
33374 var $prevEl = ref.$prevEl;
33375
33376 if ($prevEl && $prevEl.length > 0) {
33377 if (swiper.isBeginning) {
33378 swiper.a11y.disableEl($prevEl);
33379 } else {
33380 swiper.a11y.enableEl($prevEl);
33381 }
33382 }
33383 if ($nextEl && $nextEl.length > 0) {
33384 if (swiper.isEnd) {
33385 swiper.a11y.disableEl($nextEl);
33386 } else {
33387 swiper.a11y.enableEl($nextEl);
33388 }
33389 }
33390 },
33391 updatePagination: function updatePagination() {
33392 var swiper = this;
33393 var params = swiper.params.a11y;
33394 if (swiper.pagination && swiper.params.pagination.clickable && swiper.pagination.bullets && swiper.pagination.bullets.length) {
33395 swiper.pagination.bullets.each(function (bulletIndex, bulletEl) {
33396 var $bulletEl = $(bulletEl);
33397 swiper.a11y.makeElFocusable($bulletEl);
33398 swiper.a11y.addElRole($bulletEl, 'button');
33399 swiper.a11y.addElLabel($bulletEl, params.paginationBulletMessage.replace(/{{index}}/, $bulletEl.index() + 1));
33400 });
33401 }
33402 },
33403 init: function init() {
33404 var swiper = this;
33405
33406 swiper.$el.append(swiper.a11y.liveRegion);
33407
33408 // Navigation
33409 var params = swiper.params.a11y;
33410 var $nextEl;
33411 var $prevEl;
33412 if (swiper.navigation && swiper.navigation.$nextEl) {
33413 $nextEl = swiper.navigation.$nextEl;
33414 }
33415 if (swiper.navigation && swiper.navigation.$prevEl) {
33416 $prevEl = swiper.navigation.$prevEl;
33417 }
33418 if ($nextEl) {
33419 swiper.a11y.makeElFocusable($nextEl);
33420 swiper.a11y.addElRole($nextEl, 'button');
33421 swiper.a11y.addElLabel($nextEl, params.nextSlideMessage);
33422 $nextEl.on('keydown', swiper.a11y.onEnterKey);
33423 }
33424 if ($prevEl) {
33425 swiper.a11y.makeElFocusable($prevEl);
33426 swiper.a11y.addElRole($prevEl, 'button');
33427 swiper.a11y.addElLabel($prevEl, params.prevSlideMessage);
33428 $prevEl.on('keydown', swiper.a11y.onEnterKey);
33429 }
33430
33431 // Pagination
33432 if (swiper.pagination && swiper.params.pagination.clickable && swiper.pagination.bullets && swiper.pagination.bullets.length) {
33433 swiper.pagination.$el.on('keydown', ("." + (swiper.params.pagination.bulletClass)), swiper.a11y.onEnterKey);
33434 }
33435 },
33436 destroy: function destroy() {
33437 var swiper = this;
33438 if (swiper.a11y.liveRegion && swiper.a11y.liveRegion.length > 0) { swiper.a11y.liveRegion.remove(); }
33439
33440 var $nextEl;
33441 var $prevEl;
33442 if (swiper.navigation && swiper.navigation.$nextEl) {
33443 $nextEl = swiper.navigation.$nextEl;
33444 }
33445 if (swiper.navigation && swiper.navigation.$prevEl) {
33446 $prevEl = swiper.navigation.$prevEl;
33447 }
33448 if ($nextEl) {
33449 $nextEl.off('keydown', swiper.a11y.onEnterKey);
33450 }
33451 if ($prevEl) {
33452 $prevEl.off('keydown', swiper.a11y.onEnterKey);
33453 }
33454
33455 // Pagination
33456 if (swiper.pagination && swiper.params.pagination.clickable && swiper.pagination.bullets && swiper.pagination.bullets.length) {
33457 swiper.pagination.$el.off('keydown', ("." + (swiper.params.pagination.bulletClass)), swiper.a11y.onEnterKey);
33458 }
33459 },
33460 };
33461 var A11y = {
33462 name: 'a11y',
33463 params: {
33464 a11y: {
33465 enabled: true,
33466 notificationClass: 'swiper-notification',
33467 prevSlideMessage: 'Previous slide',
33468 nextSlideMessage: 'Next slide',
33469 firstSlideMessage: 'This is the first slide',
33470 lastSlideMessage: 'This is the last slide',
33471 paginationBulletMessage: 'Go to slide {{index}}',
33472 },
33473 },
33474 create: function create() {
33475 var swiper = this;
33476 Utils.extend(swiper, {
33477 a11y: {
33478 liveRegion: $(("<span class=\"" + (swiper.params.a11y.notificationClass) + "\" aria-live=\"assertive\" aria-atomic=\"true\"></span>")),
33479 },
33480 });
33481 Object.keys(a11y).forEach(function (methodName) {
33482 swiper.a11y[methodName] = a11y[methodName].bind(swiper);
33483 });
33484 },
33485 on: {
33486 init: function init() {
33487 var swiper = this;
33488 if (!swiper.params.a11y.enabled) { return; }
33489 swiper.a11y.init();
33490 swiper.a11y.updateNavigation();
33491 },
33492 toEdge: function toEdge() {
33493 var swiper = this;
33494 if (!swiper.params.a11y.enabled) { return; }
33495 swiper.a11y.updateNavigation();
33496 },
33497 fromEdge: function fromEdge() {
33498 var swiper = this;
33499 if (!swiper.params.a11y.enabled) { return; }
33500 swiper.a11y.updateNavigation();
33501 },
33502 paginationUpdate: function paginationUpdate() {
33503 var swiper = this;
33504 if (!swiper.params.a11y.enabled) { return; }
33505 swiper.a11y.updatePagination();
33506 },
33507 destroy: function destroy() {
33508 var swiper = this;
33509 if (!swiper.params.a11y.enabled) { return; }
33510 swiper.a11y.destroy();
33511 },
33512 },
33513 };
33514
33515 /* eslint no-underscore-dangle: "off" */
33516
33517 var Autoplay = {
33518 run: function run() {
33519 var swiper = this;
33520 var $activeSlideEl = swiper.slides.eq(swiper.activeIndex);
33521 var delay = swiper.params.autoplay.delay;
33522 if ($activeSlideEl.attr('data-swiper-autoplay')) {
33523 delay = $activeSlideEl.attr('data-swiper-autoplay') || swiper.params.autoplay.delay;
33524 }
33525 swiper.autoplay.timeout = Utils.nextTick(function () {
33526 if (swiper.params.autoplay.reverseDirection) {
33527 if (swiper.params.loop) {
33528 swiper.loopFix();
33529 swiper.slidePrev(swiper.params.speed, true, true);
33530 swiper.emit('autoplay');
33531 } else if (!swiper.isBeginning) {
33532 swiper.slidePrev(swiper.params.speed, true, true);
33533 swiper.emit('autoplay');
33534 } else if (!swiper.params.autoplay.stopOnLastSlide) {
33535 swiper.slideTo(swiper.slides.length - 1, swiper.params.speed, true, true);
33536 swiper.emit('autoplay');
33537 } else {
33538 swiper.autoplay.stop();
33539 }
33540 } else if (swiper.params.loop) {
33541 swiper.loopFix();
33542 swiper.slideNext(swiper.params.speed, true, true);
33543 swiper.emit('autoplay');
33544 } else if (!swiper.isEnd) {
33545 swiper.slideNext(swiper.params.speed, true, true);
33546 swiper.emit('autoplay');
33547 } else if (!swiper.params.autoplay.stopOnLastSlide) {
33548 swiper.slideTo(0, swiper.params.speed, true, true);
33549 swiper.emit('autoplay');
33550 } else {
33551 swiper.autoplay.stop();
33552 }
33553 }, delay);
33554 },
33555 start: function start() {
33556 var swiper = this;
33557 if (typeof swiper.autoplay.timeout !== 'undefined') { return false; }
33558 if (swiper.autoplay.running) { return false; }
33559 swiper.autoplay.running = true;
33560 swiper.emit('autoplayStart');
33561 swiper.autoplay.run();
33562 return true;
33563 },
33564 stop: function stop() {
33565 var swiper = this;
33566 if (!swiper.autoplay.running) { return false; }
33567 if (typeof swiper.autoplay.timeout === 'undefined') { return false; }
33568
33569 if (swiper.autoplay.timeout) {
33570 clearTimeout(swiper.autoplay.timeout);
33571 swiper.autoplay.timeout = undefined;
33572 }
33573 swiper.autoplay.running = false;
33574 swiper.emit('autoplayStop');
33575 return true;
33576 },
33577 pause: function pause(speed) {
33578 var swiper = this;
33579 if (!swiper.autoplay.running) { return; }
33580 if (swiper.autoplay.paused) { return; }
33581 if (swiper.autoplay.timeout) { clearTimeout(swiper.autoplay.timeout); }
33582 swiper.autoplay.paused = true;
33583 if (speed === 0 || !swiper.params.autoplay.waitForTransition) {
33584 swiper.autoplay.paused = false;
33585 swiper.autoplay.run();
33586 } else {
33587 swiper.$wrapperEl[0].addEventListener('transitionend', swiper.autoplay.onTransitionEnd);
33588 swiper.$wrapperEl[0].addEventListener('webkitTransitionEnd', swiper.autoplay.onTransitionEnd);
33589 }
33590 },
33591 };
33592
33593 var Autoplay$1 = {
33594 name: 'autoplay',
33595 params: {
33596 autoplay: {
33597 enabled: false,
33598 delay: 3000,
33599 waitForTransition: true,
33600 disableOnInteraction: true,
33601 stopOnLastSlide: false,
33602 reverseDirection: false,
33603 },
33604 },
33605 create: function create() {
33606 var swiper = this;
33607 Utils.extend(swiper, {
33608 autoplay: {
33609 running: false,
33610 paused: false,
33611 run: Autoplay.run.bind(swiper),
33612 start: Autoplay.start.bind(swiper),
33613 stop: Autoplay.stop.bind(swiper),
33614 pause: Autoplay.pause.bind(swiper),
33615 onTransitionEnd: function onTransitionEnd(e) {
33616 if (!swiper || swiper.destroyed || !swiper.$wrapperEl) { return; }
33617 if (e.target !== this) { return; }
33618 swiper.$wrapperEl[0].removeEventListener('transitionend', swiper.autoplay.onTransitionEnd);
33619 swiper.$wrapperEl[0].removeEventListener('webkitTransitionEnd', swiper.autoplay.onTransitionEnd);
33620 swiper.autoplay.paused = false;
33621 if (!swiper.autoplay.running) {
33622 swiper.autoplay.stop();
33623 } else {
33624 swiper.autoplay.run();
33625 }
33626 },
33627 },
33628 });
33629 },
33630 on: {
33631 init: function init() {
33632 var swiper = this;
33633 if (swiper.params.autoplay.enabled) {
33634 swiper.autoplay.start();
33635 }
33636 },
33637 beforeTransitionStart: function beforeTransitionStart(speed, internal) {
33638 var swiper = this;
33639 if (swiper.autoplay.running) {
33640 if (internal || !swiper.params.autoplay.disableOnInteraction) {
33641 swiper.autoplay.pause(speed);
33642 } else {
33643 swiper.autoplay.stop();
33644 }
33645 }
33646 },
33647 sliderFirstMove: function sliderFirstMove() {
33648 var swiper = this;
33649 if (swiper.autoplay.running) {
33650 if (swiper.params.autoplay.disableOnInteraction) {
33651 swiper.autoplay.stop();
33652 } else {
33653 swiper.autoplay.pause();
33654 }
33655 }
33656 },
33657 destroy: function destroy() {
33658 var swiper = this;
33659 if (swiper.autoplay.running) {
33660 swiper.autoplay.stop();
33661 }
33662 },
33663 },
33664 };
33665
33666 var Fade = {
33667 setTranslate: function setTranslate() {
33668 var swiper = this;
33669 var slides = swiper.slides;
33670 for (var i = 0; i < slides.length; i += 1) {
33671 var $slideEl = swiper.slides.eq(i);
33672 var offset = $slideEl[0].swiperSlideOffset;
33673 var tx = -offset;
33674 if (!swiper.params.virtualTranslate) { tx -= swiper.translate; }
33675 var ty = 0;
33676 if (!swiper.isHorizontal()) {
33677 ty = tx;
33678 tx = 0;
33679 }
33680 var slideOpacity = swiper.params.fadeEffect.crossFade
33681 ? Math.max(1 - Math.abs($slideEl[0].progress), 0)
33682 : 1 + Math.min(Math.max($slideEl[0].progress, -1), 0);
33683 $slideEl
33684 .css({
33685 opacity: slideOpacity,
33686 })
33687 .transform(("translate3d(" + tx + "px, " + ty + "px, 0px)"));
33688 }
33689 },
33690 setTransition: function setTransition(duration) {
33691 var swiper = this;
33692 var slides = swiper.slides;
33693 var $wrapperEl = swiper.$wrapperEl;
33694 slides.transition(duration);
33695 if (swiper.params.virtualTranslate && duration !== 0) {
33696 var eventTriggered = false;
33697 slides.transitionEnd(function () {
33698 if (eventTriggered) { return; }
33699 if (!swiper || swiper.destroyed) { return; }
33700 eventTriggered = true;
33701 swiper.animating = false;
33702 var triggerEvents = ['webkitTransitionEnd', 'transitionend'];
33703 for (var i = 0; i < triggerEvents.length; i += 1) {
33704 $wrapperEl.trigger(triggerEvents[i]);
33705 }
33706 });
33707 }
33708 },
33709 };
33710
33711 var EffectFade = {
33712 name: 'effect-fade',
33713 params: {
33714 fadeEffect: {
33715 crossFade: false,
33716 },
33717 },
33718 create: function create() {
33719 var swiper = this;
33720 Utils.extend(swiper, {
33721 fadeEffect: {
33722 setTranslate: Fade.setTranslate.bind(swiper),
33723 setTransition: Fade.setTransition.bind(swiper),
33724 },
33725 });
33726 },
33727 on: {
33728 beforeInit: function beforeInit() {
33729 var swiper = this;
33730 if (swiper.params.effect !== 'fade') { return; }
33731 swiper.classNames.push(((swiper.params.containerModifierClass) + "fade"));
33732 var overwriteParams = {
33733 slidesPerView: 1,
33734 slidesPerColumn: 1,
33735 slidesPerGroup: 1,
33736 watchSlidesProgress: true,
33737 spaceBetween: 0,
33738 virtualTranslate: true,
33739 };
33740 Utils.extend(swiper.params, overwriteParams);
33741 Utils.extend(swiper.originalParams, overwriteParams);
33742 },
33743 setTranslate: function setTranslate() {
33744 var swiper = this;
33745 if (swiper.params.effect !== 'fade') { return; }
33746 swiper.fadeEffect.setTranslate();
33747 },
33748 setTransition: function setTransition(duration) {
33749 var swiper = this;
33750 if (swiper.params.effect !== 'fade') { return; }
33751 swiper.fadeEffect.setTransition(duration);
33752 },
33753 },
33754 };
33755
33756 var Cube = {
33757 setTranslate: function setTranslate() {
33758 var swiper = this;
33759 var $el = swiper.$el;
33760 var $wrapperEl = swiper.$wrapperEl;
33761 var slides = swiper.slides;
33762 var swiperWidth = swiper.width;
33763 var swiperHeight = swiper.height;
33764 var rtl = swiper.rtlTranslate;
33765 var swiperSize = swiper.size;
33766 var params = swiper.params.cubeEffect;
33767 var isHorizontal = swiper.isHorizontal();
33768 var isVirtual = swiper.virtual && swiper.params.virtual.enabled;
33769 var wrapperRotate = 0;
33770 var $cubeShadowEl;
33771 if (params.shadow) {
33772 if (isHorizontal) {
33773 $cubeShadowEl = $wrapperEl.find('.swiper-cube-shadow');
33774 if ($cubeShadowEl.length === 0) {
33775 $cubeShadowEl = $('<div class="swiper-cube-shadow"></div>');
33776 $wrapperEl.append($cubeShadowEl);
33777 }
33778 $cubeShadowEl.css({ height: (swiperWidth + "px") });
33779 } else {
33780 $cubeShadowEl = $el.find('.swiper-cube-shadow');
33781 if ($cubeShadowEl.length === 0) {
33782 $cubeShadowEl = $('<div class="swiper-cube-shadow"></div>');
33783 $el.append($cubeShadowEl);
33784 }
33785 }
33786 }
33787 for (var i = 0; i < slides.length; i += 1) {
33788 var $slideEl = slides.eq(i);
33789 var slideIndex = i;
33790 if (isVirtual) {
33791 slideIndex = parseInt($slideEl.attr('data-swiper-slide-index'), 10);
33792 }
33793 var slideAngle = slideIndex * 90;
33794 var round = Math.floor(slideAngle / 360);
33795 if (rtl) {
33796 slideAngle = -slideAngle;
33797 round = Math.floor(-slideAngle / 360);
33798 }
33799 var progress = Math.max(Math.min($slideEl[0].progress, 1), -1);
33800 var tx = 0;
33801 var ty = 0;
33802 var tz = 0;
33803 if (slideIndex % 4 === 0) {
33804 tx = -round * 4 * swiperSize;
33805 tz = 0;
33806 } else if ((slideIndex - 1) % 4 === 0) {
33807 tx = 0;
33808 tz = -round * 4 * swiperSize;
33809 } else if ((slideIndex - 2) % 4 === 0) {
33810 tx = swiperSize + (round * 4 * swiperSize);
33811 tz = swiperSize;
33812 } else if ((slideIndex - 3) % 4 === 0) {
33813 tx = -swiperSize;
33814 tz = (3 * swiperSize) + (swiperSize * 4 * round);
33815 }
33816 if (rtl) {
33817 tx = -tx;
33818 }
33819
33820 if (!isHorizontal) {
33821 ty = tx;
33822 tx = 0;
33823 }
33824
33825 var transform = "rotateX(" + (isHorizontal ? 0 : -slideAngle) + "deg) rotateY(" + (isHorizontal ? slideAngle : 0) + "deg) translate3d(" + tx + "px, " + ty + "px, " + tz + "px)";
33826 if (progress <= 1 && progress > -1) {
33827 wrapperRotate = (slideIndex * 90) + (progress * 90);
33828 if (rtl) { wrapperRotate = (-slideIndex * 90) - (progress * 90); }
33829 }
33830 $slideEl.transform(transform);
33831 if (params.slideShadows) {
33832 // Set shadows
33833 var shadowBefore = isHorizontal ? $slideEl.find('.swiper-slide-shadow-left') : $slideEl.find('.swiper-slide-shadow-top');
33834 var shadowAfter = isHorizontal ? $slideEl.find('.swiper-slide-shadow-right') : $slideEl.find('.swiper-slide-shadow-bottom');
33835 if (shadowBefore.length === 0) {
33836 shadowBefore = $(("<div class=\"swiper-slide-shadow-" + (isHorizontal ? 'left' : 'top') + "\"></div>"));
33837 $slideEl.append(shadowBefore);
33838 }
33839 if (shadowAfter.length === 0) {
33840 shadowAfter = $(("<div class=\"swiper-slide-shadow-" + (isHorizontal ? 'right' : 'bottom') + "\"></div>"));
33841 $slideEl.append(shadowAfter);
33842 }
33843 if (shadowBefore.length) { shadowBefore[0].style.opacity = Math.max(-progress, 0); }
33844 if (shadowAfter.length) { shadowAfter[0].style.opacity = Math.max(progress, 0); }
33845 }
33846 }
33847 $wrapperEl.css({
33848 '-webkit-transform-origin': ("50% 50% -" + (swiperSize / 2) + "px"),
33849 '-moz-transform-origin': ("50% 50% -" + (swiperSize / 2) + "px"),
33850 '-ms-transform-origin': ("50% 50% -" + (swiperSize / 2) + "px"),
33851 'transform-origin': ("50% 50% -" + (swiperSize / 2) + "px"),
33852 });
33853
33854 if (params.shadow) {
33855 if (isHorizontal) {
33856 $cubeShadowEl.transform(("translate3d(0px, " + ((swiperWidth / 2) + params.shadowOffset) + "px, " + (-swiperWidth / 2) + "px) rotateX(90deg) rotateZ(0deg) scale(" + (params.shadowScale) + ")"));
33857 } else {
33858 var shadowAngle = Math.abs(wrapperRotate) - (Math.floor(Math.abs(wrapperRotate) / 90) * 90);
33859 var multiplier = 1.5 - (
33860 (Math.sin((shadowAngle * 2 * Math.PI) / 360) / 2)
33861 + (Math.cos((shadowAngle * 2 * Math.PI) / 360) / 2)
33862 );
33863 var scale1 = params.shadowScale;
33864 var scale2 = params.shadowScale / multiplier;
33865 var offset = params.shadowOffset;
33866 $cubeShadowEl.transform(("scale3d(" + scale1 + ", 1, " + scale2 + ") translate3d(0px, " + ((swiperHeight / 2) + offset) + "px, " + (-swiperHeight / 2 / scale2) + "px) rotateX(-90deg)"));
33867 }
33868 }
33869 var zFactor = (Browser.isSafari || Browser.isUiWebView) ? (-swiperSize / 2) : 0;
33870 $wrapperEl
33871 .transform(("translate3d(0px,0," + zFactor + "px) rotateX(" + (swiper.isHorizontal() ? 0 : wrapperRotate) + "deg) rotateY(" + (swiper.isHorizontal() ? -wrapperRotate : 0) + "deg)"));
33872 },
33873 setTransition: function setTransition(duration) {
33874 var swiper = this;
33875 var $el = swiper.$el;
33876 var slides = swiper.slides;
33877 slides
33878 .transition(duration)
33879 .find('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left')
33880 .transition(duration);
33881 if (swiper.params.cubeEffect.shadow && !swiper.isHorizontal()) {
33882 $el.find('.swiper-cube-shadow').transition(duration);
33883 }
33884 },
33885 };
33886
33887 var EffectCube = {
33888 name: 'effect-cube',
33889 params: {
33890 cubeEffect: {
33891 slideShadows: true,
33892 shadow: true,
33893 shadowOffset: 20,
33894 shadowScale: 0.94,
33895 },
33896 },
33897 create: function create() {
33898 var swiper = this;
33899 Utils.extend(swiper, {
33900 cubeEffect: {
33901 setTranslate: Cube.setTranslate.bind(swiper),
33902 setTransition: Cube.setTransition.bind(swiper),
33903 },
33904 });
33905 },
33906 on: {
33907 beforeInit: function beforeInit() {
33908 var swiper = this;
33909 if (swiper.params.effect !== 'cube') { return; }
33910 swiper.classNames.push(((swiper.params.containerModifierClass) + "cube"));
33911 swiper.classNames.push(((swiper.params.containerModifierClass) + "3d"));
33912 var overwriteParams = {
33913 slidesPerView: 1,
33914 slidesPerColumn: 1,
33915 slidesPerGroup: 1,
33916 watchSlidesProgress: true,
33917 resistanceRatio: 0,
33918 spaceBetween: 0,
33919 centeredSlides: false,
33920 virtualTranslate: true,
33921 };
33922 Utils.extend(swiper.params, overwriteParams);
33923 Utils.extend(swiper.originalParams, overwriteParams);
33924 },
33925 setTranslate: function setTranslate() {
33926 var swiper = this;
33927 if (swiper.params.effect !== 'cube') { return; }
33928 swiper.cubeEffect.setTranslate();
33929 },
33930 setTransition: function setTransition(duration) {
33931 var swiper = this;
33932 if (swiper.params.effect !== 'cube') { return; }
33933 swiper.cubeEffect.setTransition(duration);
33934 },
33935 },
33936 };
33937
33938 var Flip = {
33939 setTranslate: function setTranslate() {
33940 var swiper = this;
33941 var slides = swiper.slides;
33942 var rtl = swiper.rtlTranslate;
33943 for (var i = 0; i < slides.length; i += 1) {
33944 var $slideEl = slides.eq(i);
33945 var progress = $slideEl[0].progress;
33946 if (swiper.params.flipEffect.limitRotation) {
33947 progress = Math.max(Math.min($slideEl[0].progress, 1), -1);
33948 }
33949 var offset = $slideEl[0].swiperSlideOffset;
33950 var rotate = -180 * progress;
33951 var rotateY = rotate;
33952 var rotateX = 0;
33953 var tx = -offset;
33954 var ty = 0;
33955 if (!swiper.isHorizontal()) {
33956 ty = tx;
33957 tx = 0;
33958 rotateX = -rotateY;
33959 rotateY = 0;
33960 } else if (rtl) {
33961 rotateY = -rotateY;
33962 }
33963
33964 $slideEl[0].style.zIndex = -Math.abs(Math.round(progress)) + slides.length;
33965
33966 if (swiper.params.flipEffect.slideShadows) {
33967 // Set shadows
33968 var shadowBefore = swiper.isHorizontal() ? $slideEl.find('.swiper-slide-shadow-left') : $slideEl.find('.swiper-slide-shadow-top');
33969 var shadowAfter = swiper.isHorizontal() ? $slideEl.find('.swiper-slide-shadow-right') : $slideEl.find('.swiper-slide-shadow-bottom');
33970 if (shadowBefore.length === 0) {
33971 shadowBefore = $(("<div class=\"swiper-slide-shadow-" + (swiper.isHorizontal() ? 'left' : 'top') + "\"></div>"));
33972 $slideEl.append(shadowBefore);
33973 }
33974 if (shadowAfter.length === 0) {
33975 shadowAfter = $(("<div class=\"swiper-slide-shadow-" + (swiper.isHorizontal() ? 'right' : 'bottom') + "\"></div>"));
33976 $slideEl.append(shadowAfter);
33977 }
33978 if (shadowBefore.length) { shadowBefore[0].style.opacity = Math.max(-progress, 0); }
33979 if (shadowAfter.length) { shadowAfter[0].style.opacity = Math.max(progress, 0); }
33980 }
33981 $slideEl
33982 .transform(("translate3d(" + tx + "px, " + ty + "px, 0px) rotateX(" + rotateX + "deg) rotateY(" + rotateY + "deg)"));
33983 }
33984 },
33985 setTransition: function setTransition(duration) {
33986 var swiper = this;
33987 var slides = swiper.slides;
33988 var activeIndex = swiper.activeIndex;
33989 var $wrapperEl = swiper.$wrapperEl;
33990 slides
33991 .transition(duration)
33992 .find('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left')
33993 .transition(duration);
33994 if (swiper.params.virtualTranslate && duration !== 0) {
33995 var eventTriggered = false;
33996 // eslint-disable-next-line
33997 slides.eq(activeIndex).transitionEnd(function onTransitionEnd() {
33998 if (eventTriggered) { return; }
33999 if (!swiper || swiper.destroyed) { return; }
34000 // if (!$(this).hasClass(swiper.params.slideActiveClass)) return;
34001 eventTriggered = true;
34002 swiper.animating = false;
34003 var triggerEvents = ['webkitTransitionEnd', 'transitionend'];
34004 for (var i = 0; i < triggerEvents.length; i += 1) {
34005 $wrapperEl.trigger(triggerEvents[i]);
34006 }
34007 });
34008 }
34009 },
34010 };
34011
34012 var EffectFlip = {
34013 name: 'effect-flip',
34014 params: {
34015 flipEffect: {
34016 slideShadows: true,
34017 limitRotation: true,
34018 },
34019 },
34020 create: function create() {
34021 var swiper = this;
34022 Utils.extend(swiper, {
34023 flipEffect: {
34024 setTranslate: Flip.setTranslate.bind(swiper),
34025 setTransition: Flip.setTransition.bind(swiper),
34026 },
34027 });
34028 },
34029 on: {
34030 beforeInit: function beforeInit() {
34031 var swiper = this;
34032 if (swiper.params.effect !== 'flip') { return; }
34033 swiper.classNames.push(((swiper.params.containerModifierClass) + "flip"));
34034 swiper.classNames.push(((swiper.params.containerModifierClass) + "3d"));
34035 var overwriteParams = {
34036 slidesPerView: 1,
34037 slidesPerColumn: 1,
34038 slidesPerGroup: 1,
34039 watchSlidesProgress: true,
34040 spaceBetween: 0,
34041 virtualTranslate: true,
34042 };
34043 Utils.extend(swiper.params, overwriteParams);
34044 Utils.extend(swiper.originalParams, overwriteParams);
34045 },
34046 setTranslate: function setTranslate() {
34047 var swiper = this;
34048 if (swiper.params.effect !== 'flip') { return; }
34049 swiper.flipEffect.setTranslate();
34050 },
34051 setTransition: function setTransition(duration) {
34052 var swiper = this;
34053 if (swiper.params.effect !== 'flip') { return; }
34054 swiper.flipEffect.setTransition(duration);
34055 },
34056 },
34057 };
34058
34059 var Coverflow = {
34060 setTranslate: function setTranslate() {
34061 var swiper = this;
34062 var swiperWidth = swiper.width;
34063 var swiperHeight = swiper.height;
34064 var slides = swiper.slides;
34065 var $wrapperEl = swiper.$wrapperEl;
34066 var slidesSizesGrid = swiper.slidesSizesGrid;
34067 var params = swiper.params.coverflowEffect;
34068 var isHorizontal = swiper.isHorizontal();
34069 var transform = swiper.translate;
34070 var center = isHorizontal ? -transform + (swiperWidth / 2) : -transform + (swiperHeight / 2);
34071 var rotate = isHorizontal ? params.rotate : -params.rotate;
34072 var translate = params.depth;
34073 // Each slide offset from center
34074 for (var i = 0, length = slides.length; i < length; i += 1) {
34075 var $slideEl = slides.eq(i);
34076 var slideSize = slidesSizesGrid[i];
34077 var slideOffset = $slideEl[0].swiperSlideOffset;
34078 var offsetMultiplier = ((center - slideOffset - (slideSize / 2)) / slideSize) * params.modifier;
34079
34080 var rotateY = isHorizontal ? rotate * offsetMultiplier : 0;
34081 var rotateX = isHorizontal ? 0 : rotate * offsetMultiplier;
34082 // var rotateZ = 0
34083 var translateZ = -translate * Math.abs(offsetMultiplier);
34084
34085 var translateY = isHorizontal ? 0 : params.stretch * (offsetMultiplier);
34086 var translateX = isHorizontal ? params.stretch * (offsetMultiplier) : 0;
34087
34088 // Fix for ultra small values
34089 if (Math.abs(translateX) < 0.001) { translateX = 0; }
34090 if (Math.abs(translateY) < 0.001) { translateY = 0; }
34091 if (Math.abs(translateZ) < 0.001) { translateZ = 0; }
34092 if (Math.abs(rotateY) < 0.001) { rotateY = 0; }
34093 if (Math.abs(rotateX) < 0.001) { rotateX = 0; }
34094
34095 var slideTransform = "translate3d(" + translateX + "px," + translateY + "px," + translateZ + "px) rotateX(" + rotateX + "deg) rotateY(" + rotateY + "deg)";
34096
34097 $slideEl.transform(slideTransform);
34098 $slideEl[0].style.zIndex = -Math.abs(Math.round(offsetMultiplier)) + 1;
34099 if (params.slideShadows) {
34100 // Set shadows
34101 var $shadowBeforeEl = isHorizontal ? $slideEl.find('.swiper-slide-shadow-left') : $slideEl.find('.swiper-slide-shadow-top');
34102 var $shadowAfterEl = isHorizontal ? $slideEl.find('.swiper-slide-shadow-right') : $slideEl.find('.swiper-slide-shadow-bottom');
34103 if ($shadowBeforeEl.length === 0) {
34104 $shadowBeforeEl = $(("<div class=\"swiper-slide-shadow-" + (isHorizontal ? 'left' : 'top') + "\"></div>"));
34105 $slideEl.append($shadowBeforeEl);
34106 }
34107 if ($shadowAfterEl.length === 0) {
34108 $shadowAfterEl = $(("<div class=\"swiper-slide-shadow-" + (isHorizontal ? 'right' : 'bottom') + "\"></div>"));
34109 $slideEl.append($shadowAfterEl);
34110 }
34111 if ($shadowBeforeEl.length) { $shadowBeforeEl[0].style.opacity = offsetMultiplier > 0 ? offsetMultiplier : 0; }
34112 if ($shadowAfterEl.length) { $shadowAfterEl[0].style.opacity = (-offsetMultiplier) > 0 ? -offsetMultiplier : 0; }
34113 }
34114 }
34115
34116 // Set correct perspective for IE10
34117 if (Support.pointerEvents || Support.prefixedPointerEvents) {
34118 var ws = $wrapperEl[0].style;
34119 ws.perspectiveOrigin = center + "px 50%";
34120 }
34121 },
34122 setTransition: function setTransition(duration) {
34123 var swiper = this;
34124 swiper.slides
34125 .transition(duration)
34126 .find('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left')
34127 .transition(duration);
34128 },
34129 };
34130
34131 var EffectCoverflow = {
34132 name: 'effect-coverflow',
34133 params: {
34134 coverflowEffect: {
34135 rotate: 50,
34136 stretch: 0,
34137 depth: 100,
34138 modifier: 1,
34139 slideShadows: true,
34140 },
34141 },
34142 create: function create() {
34143 var swiper = this;
34144 Utils.extend(swiper, {
34145 coverflowEffect: {
34146 setTranslate: Coverflow.setTranslate.bind(swiper),
34147 setTransition: Coverflow.setTransition.bind(swiper),
34148 },
34149 });
34150 },
34151 on: {
34152 beforeInit: function beforeInit() {
34153 var swiper = this;
34154 if (swiper.params.effect !== 'coverflow') { return; }
34155
34156 swiper.classNames.push(((swiper.params.containerModifierClass) + "coverflow"));
34157 swiper.classNames.push(((swiper.params.containerModifierClass) + "3d"));
34158
34159 swiper.params.watchSlidesProgress = true;
34160 swiper.originalParams.watchSlidesProgress = true;
34161 },
34162 setTranslate: function setTranslate() {
34163 var swiper = this;
34164 if (swiper.params.effect !== 'coverflow') { return; }
34165 swiper.coverflowEffect.setTranslate();
34166 },
34167 setTransition: function setTransition(duration) {
34168 var swiper = this;
34169 if (swiper.params.effect !== 'coverflow') { return; }
34170 swiper.coverflowEffect.setTransition(duration);
34171 },
34172 },
34173 };
34174
34175 var Thumbs = {
34176 init: function init() {
34177 var swiper = this;
34178 var ref = swiper.params;
34179 var thumbsParams = ref.thumbs;
34180 var SwiperClass = swiper.constructor;
34181 if (thumbsParams.swiper instanceof SwiperClass) {
34182 swiper.thumbs.swiper = thumbsParams.swiper;
34183 Utils.extend(swiper.thumbs.swiper.originalParams, {
34184 watchSlidesProgress: true,
34185 slideToClickedSlide: false,
34186 });
34187 Utils.extend(swiper.thumbs.swiper.params, {
34188 watchSlidesProgress: true,
34189 slideToClickedSlide: false,
34190 });
34191 } else if (Utils.isObject(thumbsParams.swiper)) {
34192 swiper.thumbs.swiper = new SwiperClass(Utils.extend({}, thumbsParams.swiper, {
34193 watchSlidesVisibility: true,
34194 watchSlidesProgress: true,
34195 slideToClickedSlide: false,
34196 }));
34197 swiper.thumbs.swiperCreated = true;
34198 }
34199 swiper.thumbs.swiper.$el.addClass(swiper.params.thumbs.thumbsContainerClass);
34200 swiper.thumbs.swiper.on('tap', swiper.thumbs.onThumbClick);
34201 },
34202 onThumbClick: function onThumbClick() {
34203 var swiper = this;
34204 var thumbsSwiper = swiper.thumbs.swiper;
34205 if (!thumbsSwiper) { return; }
34206 var clickedIndex = thumbsSwiper.clickedIndex;
34207 var clickedSlide = thumbsSwiper.clickedSlide;
34208 if (clickedSlide && $(clickedSlide).hasClass(swiper.params.thumbs.slideThumbActiveClass)) { return; }
34209 if (typeof clickedIndex === 'undefined' || clickedIndex === null) { return; }
34210 var slideToIndex;
34211 if (thumbsSwiper.params.loop) {
34212 slideToIndex = parseInt($(thumbsSwiper.clickedSlide).attr('data-swiper-slide-index'), 10);
34213 } else {
34214 slideToIndex = clickedIndex;
34215 }
34216 if (swiper.params.loop) {
34217 var currentIndex = swiper.activeIndex;
34218 if (swiper.slides.eq(currentIndex).hasClass(swiper.params.slideDuplicateClass)) {
34219 swiper.loopFix();
34220 // eslint-disable-next-line
34221 swiper._clientLeft = swiper.$wrapperEl[0].clientLeft;
34222 currentIndex = swiper.activeIndex;
34223 }
34224 var prevIndex = swiper.slides.eq(currentIndex).prevAll(("[data-swiper-slide-index=\"" + slideToIndex + "\"]")).eq(0).index();
34225 var nextIndex = swiper.slides.eq(currentIndex).nextAll(("[data-swiper-slide-index=\"" + slideToIndex + "\"]")).eq(0).index();
34226 if (typeof prevIndex === 'undefined') { slideToIndex = nextIndex; }
34227 else if (typeof nextIndex === 'undefined') { slideToIndex = prevIndex; }
34228 else if (nextIndex - currentIndex < currentIndex - prevIndex) { slideToIndex = nextIndex; }
34229 else { slideToIndex = prevIndex; }
34230 }
34231 swiper.slideTo(slideToIndex);
34232 },
34233 update: function update(initial) {
34234 var swiper = this;
34235 var thumbsSwiper = swiper.thumbs.swiper;
34236 if (!thumbsSwiper) { return; }
34237
34238 var slidesPerView = thumbsSwiper.params.slidesPerView === 'auto'
34239 ? thumbsSwiper.slidesPerViewDynamic()
34240 : thumbsSwiper.params.slidesPerView;
34241
34242 if (swiper.realIndex !== thumbsSwiper.realIndex) {
34243 var currentThumbsIndex = thumbsSwiper.activeIndex;
34244 var newThumbsIndex;
34245 if (thumbsSwiper.params.loop) {
34246 if (thumbsSwiper.slides.eq(currentThumbsIndex).hasClass(thumbsSwiper.params.slideDuplicateClass)) {
34247 thumbsSwiper.loopFix();
34248 // eslint-disable-next-line
34249 thumbsSwiper._clientLeft = thumbsSwiper.$wrapperEl[0].clientLeft;
34250 currentThumbsIndex = thumbsSwiper.activeIndex;
34251 }
34252 // Find actual thumbs index to slide to
34253 var prevThumbsIndex = thumbsSwiper.slides.eq(currentThumbsIndex).prevAll(("[data-swiper-slide-index=\"" + (swiper.realIndex) + "\"]")).eq(0).index();
34254 var nextThumbsIndex = thumbsSwiper.slides.eq(currentThumbsIndex).nextAll(("[data-swiper-slide-index=\"" + (swiper.realIndex) + "\"]")).eq(0).index();
34255 if (typeof prevThumbsIndex === 'undefined') { newThumbsIndex = nextThumbsIndex; }
34256 else if (typeof nextThumbsIndex === 'undefined') { newThumbsIndex = prevThumbsIndex; }
34257 else if (nextThumbsIndex - currentThumbsIndex === currentThumbsIndex - prevThumbsIndex) { newThumbsIndex = currentThumbsIndex; }
34258 else if (nextThumbsIndex - currentThumbsIndex < currentThumbsIndex - prevThumbsIndex) { newThumbsIndex = nextThumbsIndex; }
34259 else { newThumbsIndex = prevThumbsIndex; }
34260 } else {
34261 newThumbsIndex = swiper.realIndex;
34262 }
34263 if (thumbsSwiper.visibleSlidesIndexes.indexOf(newThumbsIndex) < 0) {
34264 if (thumbsSwiper.params.centeredSlides) {
34265 if (newThumbsIndex > currentThumbsIndex) {
34266 newThumbsIndex = newThumbsIndex - Math.floor(slidesPerView / 2) + 1;
34267 } else {
34268 newThumbsIndex = newThumbsIndex + Math.floor(slidesPerView / 2) - 1;
34269 }
34270 } else if (newThumbsIndex > currentThumbsIndex) {
34271 newThumbsIndex = newThumbsIndex - slidesPerView + 1;
34272 }
34273 thumbsSwiper.slideTo(newThumbsIndex, initial ? 0 : undefined);
34274 }
34275 }
34276
34277 // Activate thumbs
34278 var thumbsToActivate = 1;
34279 var thumbActiveClass = swiper.params.thumbs.slideThumbActiveClass;
34280
34281 if (swiper.params.slidesPerView > 1 && !swiper.params.centeredSlides) {
34282 thumbsToActivate = swiper.params.slidesPerView;
34283 }
34284
34285 thumbsSwiper.slides.removeClass(thumbActiveClass);
34286 if (thumbsSwiper.params.loop) {
34287 for (var i = 0; i < thumbsToActivate; i += 1) {
34288 thumbsSwiper.$wrapperEl.children(("[data-swiper-slide-index=\"" + (swiper.realIndex + i) + "\"]")).addClass(thumbActiveClass);
34289 }
34290 } else {
34291 for (var i$1 = 0; i$1 < thumbsToActivate; i$1 += 1) {
34292 thumbsSwiper.slides.eq(swiper.realIndex + i$1).addClass(thumbActiveClass);
34293 }
34294 }
34295 },
34296 };
34297 var Thumbs$1 = {
34298 name: 'thumbs',
34299 params: {
34300 thumbs: {
34301 swiper: null,
34302 slideThumbActiveClass: 'swiper-slide-thumb-active',
34303 thumbsContainerClass: 'swiper-container-thumbs',
34304 },
34305 },
34306 create: function create() {
34307 var swiper = this;
34308 Utils.extend(swiper, {
34309 thumbs: {
34310 swiper: null,
34311 init: Thumbs.init.bind(swiper),
34312 update: Thumbs.update.bind(swiper),
34313 onThumbClick: Thumbs.onThumbClick.bind(swiper),
34314 },
34315 });
34316 },
34317 on: {
34318 beforeInit: function beforeInit() {
34319 var swiper = this;
34320 var ref = swiper.params;
34321 var thumbs = ref.thumbs;
34322 if (!thumbs || !thumbs.swiper) { return; }
34323 swiper.thumbs.init();
34324 swiper.thumbs.update(true);
34325 },
34326 slideChange: function slideChange() {
34327 var swiper = this;
34328 if (!swiper.thumbs.swiper) { return; }
34329 swiper.thumbs.update();
34330 },
34331 update: function update() {
34332 var swiper = this;
34333 if (!swiper.thumbs.swiper) { return; }
34334 swiper.thumbs.update();
34335 },
34336 resize: function resize() {
34337 var swiper = this;
34338 if (!swiper.thumbs.swiper) { return; }
34339 swiper.thumbs.update();
34340 },
34341 observerUpdate: function observerUpdate() {
34342 var swiper = this;
34343 if (!swiper.thumbs.swiper) { return; }
34344 swiper.thumbs.update();
34345 },
34346 setTransition: function setTransition(duration) {
34347 var swiper = this;
34348 var thumbsSwiper = swiper.thumbs.swiper;
34349 if (!thumbsSwiper) { return; }
34350 thumbsSwiper.setTransition(duration);
34351 },
34352 beforeDestroy: function beforeDestroy() {
34353 var swiper = this;
34354 var thumbsSwiper = swiper.thumbs.swiper;
34355 if (!thumbsSwiper) { return; }
34356 if (swiper.thumbs.swiperCreated && thumbsSwiper) {
34357 thumbsSwiper.destroy();
34358 }
34359 },
34360 },
34361 };
34362
34363 // Swiper Class
34364
34365 Swiper.use([
34366 Device$1,
34367 Browser$1,
34368 Support$1,
34369 Resize,
34370 Observer$1,
34371 Virtual$1,
34372 Navigation$1,
34373 Pagination$1,
34374 Scrollbar$1,
34375 Parallax$1,
34376 Zoom$1,
34377 Lazy$3,
34378 Controller$1,
34379 A11y,
34380 Autoplay$1,
34381 EffectFade,
34382 EffectCube,
34383 EffectFlip,
34384 EffectCoverflow,
34385 Thumbs$1 ]);
34386
34387 {
34388 if (!window.Swiper) {
34389 window.Swiper = Swiper;
34390 }
34391 }
34392
34393 function initSwiper(swiperEl) {
34394 var app = this;
34395 var $swiperEl = $(swiperEl);
34396 if ($swiperEl.length === 0) { return; }
34397 if ($swiperEl[0].swiper) { return; }
34398 var initialSlide;
34399 var params = {};
34400 var isTabs;
34401 var isRoutableTabs;
34402 if ($swiperEl.hasClass('tabs-swipeable-wrap')) {
34403 $swiperEl
34404 .addClass('swiper-container')
34405 .children('.tabs')
34406 .addClass('swiper-wrapper')
34407 .children('.tab')
34408 .addClass('swiper-slide');
34409 initialSlide = $swiperEl.children('.tabs').children('.tab-active').index();
34410 isTabs = true;
34411 isRoutableTabs = $swiperEl.find('.tabs-routable').length > 0;
34412 }
34413 if ($swiperEl.attr('data-swiper')) {
34414 params = JSON.parse($swiperEl.attr('data-swiper'));
34415 } else {
34416 params = $swiperEl.dataset();
34417 Object.keys(params).forEach(function (key) {
34418 var value = params[key];
34419 if (typeof value === 'string' && value.indexOf('{') === 0 && value.indexOf('}') > 0) {
34420 try {
34421 params[key] = JSON.parse(value);
34422 } catch (e) {
34423 // not JSON
34424 }
34425 }
34426 });
34427 }
34428 if (typeof params.initialSlide === 'undefined' && typeof initialSlide !== 'undefined') {
34429 params.initialSlide = initialSlide;
34430 }
34431
34432 var swiper = app.swiper.create($swiperEl[0], params);
34433 if (isTabs) {
34434 swiper.on('slideChange', function () {
34435 if (isRoutableTabs) {
34436 var view = app.views.get($swiperEl.parents('.view'));
34437 if (!view) { view = app.views.main; }
34438 var router = view.router;
34439 var tabRoute = router.findTabRoute(swiper.slides.eq(swiper.activeIndex)[0]);
34440 if (tabRoute) {
34441 setTimeout(function () {
34442 router.navigate(tabRoute.path);
34443 }, 0);
34444 }
34445 } else {
34446 app.tab.show({
34447 tabEl: swiper.slides.eq(swiper.activeIndex),
34448 });
34449 }
34450 });
34451 }
34452 }
34453
34454 var Swiper$1 = {
34455 name: 'swiper',
34456 static: {
34457 Swiper: Swiper,
34458 },
34459 create: function create() {
34460 var app = this;
34461 app.swiper = ConstructorMethods({
34462 defaultSelector: '.swiper-container',
34463 constructor: Swiper,
34464 domProp: 'swiper',
34465 });
34466 },
34467 on: {
34468 pageBeforeRemove: function pageBeforeRemove(page) {
34469 var app = this;
34470 page.$el.find('.swiper-init, .tabs-swipeable-wrap').each(function (index, swiperEl) {
34471 app.swiper.destroy(swiperEl);
34472 });
34473 },
34474 pageMounted: function pageMounted(page) {
34475 var app = this;
34476 page.$el.find('.tabs-swipeable-wrap').each(function (index, swiperEl) {
34477 initSwiper.call(app, swiperEl);
34478 });
34479 },
34480 pageInit: function pageInit(page) {
34481 var app = this;
34482 page.$el.find('.swiper-init, .tabs-swipeable-wrap').each(function (index, swiperEl) {
34483 initSwiper.call(app, swiperEl);
34484 });
34485 },
34486 pageReinit: function pageReinit(page) {
34487 var app = this;
34488 page.$el.find('.swiper-init, .tabs-swipeable-wrap').each(function (index, swiperEl) {
34489 var swiper = app.swiper.get(swiperEl);
34490 if (swiper && swiper.update) { swiper.update(); }
34491 });
34492 },
34493 tabMounted: function tabMounted(tabEl) {
34494 var app = this;
34495 $(tabEl).find('.swiper-init, .tabs-swipeable-wrap').each(function (index, swiperEl) {
34496 initSwiper.call(app, swiperEl);
34497 });
34498 },
34499 tabShow: function tabShow(tabEl) {
34500 var app = this;
34501 $(tabEl).find('.swiper-init, .tabs-swipeable-wrap').each(function (index, swiperEl) {
34502 var swiper = app.swiper.get(swiperEl);
34503 if (swiper && swiper.update) { swiper.update(); }
34504 });
34505 },
34506 tabBeforeRemove: function tabBeforeRemove(tabEl) {
34507 var app = this;
34508 $(tabEl).find('.swiper-init, .tabs-swipeable-wrap').each(function (index, swiperEl) {
34509 app.swiper.destroy(swiperEl);
34510 });
34511 },
34512 },
34513 vnode: {
34514 'swiper-init': {
34515 insert: function insert(vnode) {
34516 var app = this;
34517 var swiperEl = vnode.elm;
34518 initSwiper.call(app, swiperEl);
34519 },
34520 destroy: function destroy(vnode) {
34521 var app = this;
34522 var swiperEl = vnode.elm;
34523 app.swiper.destroy(swiperEl);
34524 },
34525 },
34526 'tabs-swipeable-wrap': {
34527 insert: function insert(vnode) {
34528 var app = this;
34529 var swiperEl = vnode.elm;
34530 initSwiper.call(app, swiperEl);
34531 },
34532 destroy: function destroy(vnode) {
34533 var app = this;
34534 var swiperEl = vnode.elm;
34535 app.swiper.destroy(swiperEl);
34536 },
34537 },
34538 },
34539 };
34540
34541 /* eslint indent: ["off"] */
34542
5d51ea26 34543 var PhotoBrowser = /*@__PURE__*/(function (Framework7Class) {
5309fbda
DC
34544 function PhotoBrowser(app, params) {
34545 if ( params === void 0 ) params = {};
34546
5d51ea26 34547 Framework7Class.call(this, params, [app]);
5309fbda
DC
34548
34549 var pb = this;
34550 pb.app = app;
34551
34552 var defaults = Utils.extend({
34553 on: {},
34554 }, app.params.photoBrowser);
34555
34556 // Extend defaults with modules params
34557 pb.useModulesParams(defaults);
34558
34559 pb.params = Utils.extend(defaults, params);
34560
34561 Utils.extend(pb, {
34562 exposed: false,
34563 opened: false,
34564 activeIndex: pb.params.swiper.initialSlide,
34565 url: pb.params.url,
34566 view: pb.params.view || app.views.main,
34567 swipeToClose: {
34568 allow: true,
34569 isTouched: false,
34570 diff: undefined,
34571 start: undefined,
34572 current: undefined,
34573 started: false,
34574 activeSlide: undefined,
34575 timeStart: undefined,
34576 },
34577 });
34578
34579 // Install Modules
34580 pb.useModules();
34581
34582 // Init
34583 pb.init();
34584 }
34585
5d51ea26
DC
34586 if ( Framework7Class ) PhotoBrowser.__proto__ = Framework7Class;
34587 PhotoBrowser.prototype = Object.create( Framework7Class && Framework7Class.prototype );
5309fbda
DC
34588 PhotoBrowser.prototype.constructor = PhotoBrowser;
34589
34590 PhotoBrowser.prototype.onSlideChange = function onSlideChange (swiper) {
34591 var pb = this;
34592 pb.activeIndex = swiper.activeIndex;
34593
34594 var current = swiper.activeIndex + 1;
34595 var total = pb.params.virtualSlides ? pb.params.photos.length : swiper.slides.length;
34596 if (swiper.params.loop) {
34597 total -= 2;
34598 current -= swiper.loopedSlides;
34599 if (current < 1) { current = total + current; }
34600 if (current > total) { current -= total; }
34601 }
34602
34603 var $activeSlideEl = pb.params.virtualSlides
34604 ? swiper.$wrapperEl.find((".swiper-slide[data-swiper-slide-index=\"" + (swiper.activeIndex) + "\"]"))
34605 : swiper.slides.eq(swiper.activeIndex);
34606 var $previousSlideEl = pb.params.virtualSlides
34607 ? swiper.$wrapperEl.find((".swiper-slide[data-swiper-slide-index=\"" + (swiper.previousIndex) + "\"]"))
34608 : swiper.slides.eq(swiper.previousIndex);
34609
34610 var $currentEl = pb.$el.find('.photo-browser-current');
34611 var $totalEl = pb.$el.find('.photo-browser-total');
34612 if (pb.params.type === 'page' && pb.params.navbar && $currentEl.length === 0 && pb.app.theme === 'ios') {
34613 var navbarEl = pb.app.navbar.getElByPage(pb.$el);
34614 if (navbarEl) {
34615 $currentEl = $(navbarEl).find('.photo-browser-current');
34616 $totalEl = $(navbarEl).find('.photo-browser-total');
34617 }
34618 }
34619 $currentEl.text(current);
34620 $totalEl.text(total);
34621
34622 // Update captions
34623 if (pb.captions.length > 0) {
34624 var captionIndex = swiper.params.loop ? $activeSlideEl.attr('data-swiper-slide-index') : pb.activeIndex;
34625 pb.$captionsContainerEl.find('.photo-browser-caption-active').removeClass('photo-browser-caption-active');
34626 pb.$captionsContainerEl.find(("[data-caption-index=\"" + captionIndex + "\"]")).addClass('photo-browser-caption-active');
34627 }
34628
34629 // Stop Video
34630 var previousSlideVideo = $previousSlideEl.find('video');
34631 if (previousSlideVideo.length > 0) {
34632 if ('pause' in previousSlideVideo[0]) { previousSlideVideo[0].pause(); }
34633 }
34634 };
34635
34636 PhotoBrowser.prototype.onTouchStart = function onTouchStart () {
34637 var pb = this;
34638 var swipeToClose = pb.swipeToClose;
34639 if (!swipeToClose.allow) { return; }
34640 swipeToClose.isTouched = true;
34641 };
34642
34643 PhotoBrowser.prototype.onTouchMove = function onTouchMove (e) {
34644 var pb = this;
34645 var swipeToClose = pb.swipeToClose;
34646
34647 if (!swipeToClose.isTouched) { return; }
34648 if (!swipeToClose.started) {
34649 swipeToClose.started = true;
34650 swipeToClose.start = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
34651 if (pb.params.virtualSlides) {
34652 swipeToClose.activeSlide = pb.swiper.$wrapperEl.children('.swiper-slide-active');
34653 } else {
34654 swipeToClose.activeSlide = pb.swiper.slides.eq(pb.swiper.activeIndex);
34655 }
34656 swipeToClose.timeStart = Utils.now();
34657 }
34658 e.preventDefault();
34659 swipeToClose.current = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
34660 swipeToClose.diff = swipeToClose.start - swipeToClose.current;
34661 var opacity = 1 - (Math.abs(swipeToClose.diff) / 300);
34662 var color = pb.exposed || pb.params.theme === 'dark' ? 0 : 255;
34663 swipeToClose.activeSlide.transform(("translate3d(0," + (-swipeToClose.diff) + "px,0)"));
34664 pb.swiper.$el.css('background-color', ("rgba(" + color + ", " + color + ", " + color + ", " + opacity + ")")).transition(0);
34665 };
34666
34667 PhotoBrowser.prototype.onTouchEnd = function onTouchEnd () {
34668 var pb = this;
34669 var swipeToClose = pb.swipeToClose;
34670 swipeToClose.isTouched = false;
34671 if (!swipeToClose.started) {
34672 swipeToClose.started = false;
34673 return;
34674 }
34675 swipeToClose.started = false;
34676 swipeToClose.allow = false;
34677 var diff = Math.abs(swipeToClose.diff);
34678 var timeDiff = (new Date()).getTime() - swipeToClose.timeStart;
34679 if ((timeDiff < 300 && diff > 20) || (timeDiff >= 300 && diff > 100)) {
34680 Utils.nextTick(function () {
34681 if (pb.$el) {
34682 if (swipeToClose.diff < 0) { pb.$el.addClass('swipe-close-to-bottom'); }
34683 else { pb.$el.addClass('swipe-close-to-top'); }
34684 }
34685 pb.emit('local::swipeToClose', pb);
34686 pb.close();
34687 swipeToClose.allow = true;
34688 });
34689 return;
34690 }
34691 if (diff !== 0) {
34692 swipeToClose.activeSlide.addClass('photo-browser-transitioning').transitionEnd(function () {
34693 swipeToClose.allow = true;
34694 swipeToClose.activeSlide.removeClass('photo-browser-transitioning');
34695 });
34696 } else {
34697 swipeToClose.allow = true;
34698 }
34699 pb.swiper.$el.transition('').css('background-color', '');
34700 swipeToClose.activeSlide.transform('');
34701 };
34702
34703 // Render Functions
34704 PhotoBrowser.prototype.renderNavbar = function renderNavbar () {
34705 var pb = this;
34706 if (pb.params.renderNavbar) { return pb.params.renderNavbar.call(pb); }
34707
34708 var iconsColor = pb.params.iconsColor;
34709 if (!pb.params.iconsColor && pb.params.theme === 'dark') { iconsColor = 'white'; }
34710
5d51ea26 34711 var backLinkText = (pb.app.theme === 'ios' || pb.app.theme === 'aurora') && pb.params.backLinkText ? pb.params.backLinkText : '';
5309fbda
DC
34712
34713 var isPopup = pb.params.type !== 'page';
5d51ea26 34714 var navbarHtml = ("\n <div class=\"navbar\">\n <div class=\"navbar-inner sliding\">\n <div class=\"left\">\n <a 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();
5309fbda
DC
34715 return navbarHtml;
34716 };
34717
34718 PhotoBrowser.prototype.renderToolbar = function renderToolbar () {
34719 var pb = this;
34720 if (pb.params.renderToolbar) { return pb.params.renderToolbar.call(pb); }
34721
34722 var iconsColor = pb.params.iconsColor;
34723 if (!pb.params.iconsColor && pb.params.theme === 'dark') { iconsColor = 'white'; }
34724
5d51ea26 34725 var toolbarHtml = ("\n <div class=\"toolbar toolbar-bottom tabbar\">\n <div class=\"toolbar-inner\">\n <a class=\"link photo-browser-prev\">\n <i class=\"icon icon-back " + (iconsColor ? ("color-" + iconsColor) : '') + "\"></i>\n </a>\n <a class=\"link photo-browser-next\">\n <i class=\"icon icon-forward " + (iconsColor ? ("color-" + iconsColor) : '') + "\"></i>\n </a>\n </div>\n </div>\n ").trim();
5309fbda
DC
34726 return toolbarHtml;
34727 };
34728
34729 PhotoBrowser.prototype.renderCaption = function renderCaption (caption, index) {
34730 var pb = this;
34731 if (pb.params.renderCaption) { return pb.params.renderCaption.call(pb, caption, index); }
34732 var captionHtml = ("\n <div class=\"photo-browser-caption\" data-caption-index=\"" + index + "\">\n " + caption + "\n </div>\n ").trim();
34733 return captionHtml;
34734 };
34735
34736 PhotoBrowser.prototype.renderObject = function renderObject (photo, index) {
34737 var pb = this;
34738 if (pb.params.renderObject) { return pb.params.renderObject.call(pb, photo, index); }
34739 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 ";
34740 return objHtml;
34741 };
34742
34743 PhotoBrowser.prototype.renderLazyPhoto = function renderLazyPhoto (photo, index) {
34744 var pb = this;
34745 if (pb.params.renderLazyPhoto) { return pb.params.renderLazyPhoto.call(pb, photo, index); }
34746 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();
34747 return photoHtml;
34748 };
34749
34750 PhotoBrowser.prototype.renderPhoto = function renderPhoto (photo, index) {
34751 var pb = this;
34752 if (pb.params.renderPhoto) { return pb.params.renderPhoto.call(pb, photo, index); }
34753 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();
34754 return photoHtml;
34755 };
34756
34757 PhotoBrowser.prototype.render = function render () {
34758 var pb = this;
34759 if (pb.params.render) { return pb.params.render.call(pb, pb.params); }
34760 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) {
34761 if (photo.caption) { return pb.renderCaption(photo.caption, index); }
34762 return '';
34763 }).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) {
34764 if (photo.html || ((typeof photo === 'string' || photo instanceof String) && photo.indexOf('<') >= 0 && photo.indexOf('>') >= 0)) {
34765 return pb.renderObject(photo, index);
34766 }
34767 if (pb.params.swiper.lazy === true || (pb.params.swiper.lazy && pb.params.swiper.lazy.enabled)) {
34768 return pb.renderLazyPhoto(photo, index);
34769 }
34770 return pb.renderPhoto(photo, index);
34771 }).join(' ')) + "\n </div>\n </div>\n </div>\n </div>\n </div>\n ").trim();
34772 return html;
34773 };
34774
34775 PhotoBrowser.prototype.renderStandalone = function renderStandalone () {
34776 var pb = this;
34777 if (pb.params.renderStandalone) { return pb.params.renderStandalone.call(pb); }
34778 var standaloneHtml = "<div class=\"popup photo-browser-popup photo-browser-standalone popup-tablet-fullscreen\">" + (pb.render()) + "</div>";
34779 return standaloneHtml;
34780 };
34781
34782 PhotoBrowser.prototype.renderPage = function renderPage () {
34783 var pb = this;
34784 if (pb.params.renderPage) { return pb.params.renderPage.call(pb); }
34785 var pageHtml = pb.render();
34786
34787 return pageHtml;
34788 };
34789
34790 PhotoBrowser.prototype.renderPopup = function renderPopup () {
34791 var pb = this;
34792 if (pb.params.renderPopup) { return pb.params.renderPopup.call(pb); }
34793 var popupHtml = "<div class=\"popup photo-browser-popup\">" + (pb.render()) + "</div>";
34794
34795 return popupHtml;
34796 };
34797
34798 // Callbacks
34799 PhotoBrowser.prototype.onOpen = function onOpen (type, el) {
34800 var pb = this;
34801 var app = pb.app;
34802 var $el = $(el);
34803
34804 $el[0].f7PhotoBrowser = pb;
34805
34806 pb.$el = $el;
34807 pb.el = $el[0];
34808 pb.openedIn = type;
34809 pb.opened = true;
34810
34811 pb.$swiperContainerEl = pb.$el.find('.photo-browser-swiper-container');
34812 pb.$swiperWrapperEl = pb.$el.find('.photo-browser-swiper-wrapper');
34813 pb.slides = pb.$el.find('.photo-browser-slide');
34814 pb.$captionsContainerEl = pb.$el.find('.photo-browser-captions');
34815 pb.captions = pb.$el.find('.photo-browser-caption');
34816
34817 // Init Swiper
34818 var swiperParams = Utils.extend({}, pb.params.swiper, {
34819 initialSlide: pb.activeIndex,
34820 on: {
34821 tap: function tap(e) {
34822 pb.emit('local::tap', e);
34823 },
34824 click: function click(e) {
34825 if (pb.params.exposition) {
34826 pb.expositionToggle();
34827 }
34828 pb.emit('local::click', e);
34829 },
34830 doubleTap: function doubleTap(e) {
34831 pb.emit('local::doubleTap', e);
34832 },
34833 slideChange: function slideChange() {
34834 var args = [], len = arguments.length;
34835 while ( len-- ) args[ len ] = arguments[ len ];
34836
34837 var swiper = this;
34838 pb.onSlideChange(swiper);
34839 pb.emit.apply(pb, [ 'local::slideChange' ].concat( args ));
34840 },
34841 transitionStart: function transitionStart() {
34842 var args = [], len = arguments.length;
34843 while ( len-- ) args[ len ] = arguments[ len ];
34844
34845 pb.emit.apply(pb, [ 'local::transitionStart' ].concat( args ));
34846 },
34847 transitionEnd: function transitionEnd() {
34848 var args = [], len = arguments.length;
34849 while ( len-- ) args[ len ] = arguments[ len ];
34850
34851 pb.emit.apply(pb, [ 'local::transitionEnd' ].concat( args ));
34852 },
34853 slideChangeTransitionStart: function slideChangeTransitionStart() {
34854 var args = [], len = arguments.length;
34855 while ( len-- ) args[ len ] = arguments[ len ];
34856
34857 pb.emit.apply(pb, [ 'local::slideChangeTransitionStart' ].concat( args ));
34858 },
34859 slideChangeTransitionEnd: function slideChangeTransitionEnd() {
34860 var args = [], len = arguments.length;
34861 while ( len-- ) args[ len ] = arguments[ len ];
34862
34863 pb.emit.apply(pb, [ 'local::slideChangeTransitionEnd' ].concat( args ));
34864 },
34865 lazyImageLoad: function lazyImageLoad() {
34866 var args = [], len = arguments.length;
34867 while ( len-- ) args[ len ] = arguments[ len ];
34868
34869 pb.emit.apply(pb, [ 'local::lazyImageLoad' ].concat( args ));
34870 },
34871 lazyImageReady: function lazyImageReady() {
34872 var args = [], len = arguments.length;
34873 while ( len-- ) args[ len ] = arguments[ len ];
34874
34875 var slideEl = args[0];
34876 $(slideEl).removeClass('photo-browser-slide-lazy');
34877 pb.emit.apply(pb, [ 'local::lazyImageReady' ].concat( args ));
34878 },
34879 },
34880 });
34881 if (pb.params.swipeToClose && pb.params.type !== 'page') {
34882 Utils.extend(swiperParams.on, {
34883 touchStart: function touchStart(e) {
34884 pb.onTouchStart(e);
34885 pb.emit('local::touchStart', e);
34886 },
34887 touchMoveOpposite: function touchMoveOpposite(e) {
34888 pb.onTouchMove(e);
34889 pb.emit('local::touchMoveOpposite', e);
34890 },
34891 touchEnd: function touchEnd(e) {
34892 pb.onTouchEnd(e);
34893 pb.emit('local::touchEnd', e);
34894 },
34895 });
34896 }
34897 if (pb.params.virtualSlides) {
34898 Utils.extend(swiperParams, {
34899 virtual: {
34900 slides: pb.params.photos,
34901 renderSlide: function renderSlide(photo, index) {
34902 if (photo.html || ((typeof photo === 'string' || photo instanceof String) && photo.indexOf('<') >= 0 && photo.indexOf('>') >= 0)) {
34903 return pb.renderObject(photo, index);
34904 }
34905 if (pb.params.swiper.lazy === true || (pb.params.swiper.lazy && pb.params.swiper.lazy.enabled)) {
34906 return pb.renderLazyPhoto(photo, index);
34907 }
34908 return pb.renderPhoto(photo, index);
34909 },
34910 },
34911 });
34912 }
34913
34914 pb.swiper = app.swiper.create(pb.$swiperContainerEl, swiperParams);
34915
34916 if (pb.activeIndex === 0) {
34917 pb.onSlideChange(pb.swiper);
34918 }
34919 if (pb.$el) {
34920 pb.$el.trigger('photobrowser:open');
34921 }
34922 pb.emit('local::open photoBrowserOpen', pb);
34923 };
34924
34925 PhotoBrowser.prototype.onOpened = function onOpened () {
34926 var pb = this;
34927
34928 if (pb.$el) {
34929 pb.$el.trigger('photobrowser:opened');
34930 }
34931 pb.emit('local::opened photoBrowserOpened', pb);
34932 };
34933
34934 PhotoBrowser.prototype.onClose = function onClose () {
34935 var pb = this;
34936 if (pb.destroyed) { return; }
34937
34938 // Destroy Swiper
34939 if (pb.swiper && pb.swiper.destroy) {
34940 pb.swiper.destroy(true, false);
34941 pb.swiper = null;
34942 delete pb.swiper;
34943 }
34944 if (pb.$el) {
34945 pb.$el.trigger('photobrowser:close');
34946 }
34947 pb.emit('local::close photoBrowserClose', pb);
34948 };
34949
34950 PhotoBrowser.prototype.onClosed = function onClosed () {
34951 var pb = this;
34952 if (pb.destroyed) { return; }
34953 pb.opened = false;
34954 pb.$el = null;
34955 pb.el = null;
34956 delete pb.$el;
34957 delete pb.el;
34958 if (pb.$el) {
34959 pb.$el.trigger('photobrowser:closed');
34960 }
34961 pb.emit('local::closed photoBrowserClosed', pb);
34962 };
34963
34964 // Open
34965 PhotoBrowser.prototype.openPage = function openPage () {
34966 var pb = this;
34967 if (pb.opened) { return pb; }
34968
34969 var pageHtml = pb.renderPage();
34970
34971 pb.view.router.navigate({
34972 url: pb.url,
34973 route: {
34974 content: pageHtml,
34975 path: pb.url,
34976 on: {
34977 pageBeforeIn: function pageBeforeIn(e, page) {
34978 pb.view.$el.addClass(("with-photo-browser-page with-photo-browser-page-" + (pb.params.theme)));
34979 pb.onOpen('page', page.el);
34980 },
34981 pageAfterIn: function pageAfterIn(e, page) {
34982 pb.onOpened('page', page.el);
34983 },
34984 pageBeforeOut: function pageBeforeOut(e, page) {
34985 pb.view.$el.removeClass(("with-photo-browser-page with-photo-browser-page-exposed with-photo-browser-page-" + (pb.params.theme)));
34986 pb.onClose('page', page.el);
34987 },
34988 pageAfterOut: function pageAfterOut(e, page) {
34989 pb.onClosed('page', page.el);
34990 },
34991 },
34992 },
34993 });
34994 return pb;
34995 };
34996
34997 PhotoBrowser.prototype.openStandalone = function openStandalone () {
34998 var pb = this;
34999 if (pb.opened) { return pb; }
35000
35001 var standaloneHtml = pb.renderStandalone();
35002
35003 var popupParams = {
35004 backdrop: false,
35005 content: standaloneHtml,
35006 on: {
35007 popupOpen: function popupOpen(popup) {
35008 pb.onOpen('popup', popup.el);
35009 },
35010 popupOpened: function popupOpened(popup) {
35011 pb.onOpened('popup', popup.el);
35012 },
35013 popupClose: function popupClose(popup) {
35014 pb.onClose('popup', popup.el);
35015 },
35016 popupClosed: function popupClosed(popup) {
35017 pb.onClosed('popup', popup.el);
35018 },
35019 },
35020 };
35021
35022 if (pb.params.routableModals) {
35023 pb.view.router.navigate({
35024 url: pb.url,
35025 route: {
35026 path: pb.url,
35027 popup: popupParams,
35028 },
35029 });
35030 } else {
35031 pb.modal = pb.app.popup.create(popupParams).open();
35032 }
35033 return pb;
35034 };
35035
35036 PhotoBrowser.prototype.openPopup = function openPopup () {
35037 var pb = this;
35038 if (pb.opened) { return pb; }
35039
35040 var popupHtml = pb.renderPopup();
35041
35042 var popupParams = {
35043 content: popupHtml,
35044 on: {
35045 popupOpen: function popupOpen(popup) {
35046 pb.onOpen('popup', popup.el);
35047 },
35048 popupOpened: function popupOpened(popup) {
35049 pb.onOpened('popup', popup.el);
35050 },
35051 popupClose: function popupClose(popup) {
35052 pb.onClose('popup', popup.el);
35053 },
35054 popupClosed: function popupClosed(popup) {
35055 pb.onClosed('popup', popup.el);
35056 },
35057 },
35058 };
35059
35060 if (pb.params.routableModals) {
35061 pb.view.router.navigate({
35062 url: pb.url,
35063 route: {
35064 path: pb.url,
35065 popup: popupParams,
35066 },
35067 });
35068 } else {
35069 pb.modal = pb.app.popup.create(popupParams).open();
35070 }
35071 return pb;
35072 };
35073
35074 // Exposition
35075 PhotoBrowser.prototype.expositionEnable = function expositionEnable () {
35076 var pb = this;
35077 if (pb.params.type === 'page') {
35078 pb.view.$el.addClass('with-photo-browser-page-exposed');
35079 }
35080 if (pb.$el) { pb.$el.addClass('photo-browser-exposed'); }
35081 if (pb.params.expositionHideCaptions) { pb.$captionsContainerEl.addClass('photo-browser-captions-exposed'); }
35082 pb.exposed = true;
35083 return pb;
35084 };
35085
35086 PhotoBrowser.prototype.expositionDisable = function expositionDisable () {
35087 var pb = this;
35088 if (pb.params.type === 'page') {
35089 pb.view.$el.removeClass('with-photo-browser-page-exposed');
35090 }
35091 if (pb.$el) { pb.$el.removeClass('photo-browser-exposed'); }
35092 if (pb.params.expositionHideCaptions) { pb.$captionsContainerEl.removeClass('photo-browser-captions-exposed'); }
35093 pb.exposed = false;
35094 return pb;
35095 };
35096
35097 PhotoBrowser.prototype.expositionToggle = function expositionToggle () {
35098 var pb = this;
35099 if (pb.params.type === 'page') {
35100 pb.view.$el.toggleClass('with-photo-browser-page-exposed');
35101 }
35102 if (pb.$el) { pb.$el.toggleClass('photo-browser-exposed'); }
35103 if (pb.params.expositionHideCaptions) { pb.$captionsContainerEl.toggleClass('photo-browser-captions-exposed'); }
35104 pb.exposed = !pb.exposed;
35105 return pb;
35106 };
35107
35108 PhotoBrowser.prototype.open = function open (index) {
35109 var pb = this;
35110 var type = pb.params.type;
35111 if (pb.opened) {
35112 if (pb.swiper && typeof index !== 'undefined') {
35113 pb.swiper.slideTo(parseInt(index, 10));
35114 }
35115 return pb;
35116 }
35117 if (typeof index !== 'undefined') {
35118 pb.activeIndex = index;
35119 }
35120 if (type === 'standalone') {
35121 pb.openStandalone();
35122 }
35123 if (type === 'page') {
35124 pb.openPage();
35125 }
35126 if (type === 'popup') {
35127 pb.openPopup();
35128 }
35129 return pb;
35130 };
35131
35132 PhotoBrowser.prototype.close = function close () {
35133 var pb = this;
35134 if (!pb.opened) { return pb; }
35135 if (pb.params.routableModals || pb.openedIn === 'page') {
35136 if (pb.view) { pb.view.router.back(); }
35137 } else {
35138 pb.modal.once('modalClosed', function () {
35139 Utils.nextTick(function () {
35140 pb.modal.destroy();
35141 delete pb.modal;
35142 });
35143 });
35144 pb.modal.close();
35145 }
35146 return pb;
35147 };
35148 // eslint-disable-next-line
35149 PhotoBrowser.prototype.init = function init () {};
35150
35151 PhotoBrowser.prototype.destroy = function destroy () {
35152 var pb = this;
35153 pb.emit('local::beforeDestroy photoBrowserBeforeDestroy', pb);
35154 if (pb.$el) {
35155 pb.$el.trigger('photobrowser:beforedestroy');
35156 pb.$el[0].f7PhotoBrowser = null;
35157 delete pb.$el[0].f7PhotoBrowser;
35158 }
35159 Utils.deleteProps(pb);
35160 pb = null;
35161 };
35162
35163 return PhotoBrowser;
35164 }(Framework7Class));
35165
35166 var PhotoBrowser$1 = {
35167 name: 'photoBrowser',
35168 params: {
35169 photoBrowser: {
35170 photos: [],
35171 exposition: true,
35172 expositionHideCaptions: false,
35173 type: 'standalone',
35174 navbar: true,
35175 toolbar: true,
35176 theme: 'light',
35177 captionsTheme: undefined,
35178 iconsColor: undefined,
35179 swipeToClose: true,
35180 backLinkText: 'Close',
35181 navbarOfText: 'of',
35182 view: undefined,
35183 url: 'photos/',
35184 routableModals: true,
35185 virtualSlides: true,
35186
35187 renderNavbar: undefined,
35188 renderToolbar: undefined,
35189 renderCaption: undefined,
35190 renderObject: undefined,
35191 renderLazyPhoto: undefined,
35192 renderPhoto: undefined,
35193 renderPage: undefined,
35194 renderPopup: undefined,
35195 renderStandalone: undefined,
35196
35197 swiper: {
35198 initialSlide: 0,
35199 spaceBetween: 20,
35200 speed: 300,
35201 loop: false,
35202 preloadImages: true,
35203 navigation: {
35204 nextEl: '.photo-browser-next',
35205 prevEl: '.photo-browser-prev',
35206 },
35207 zoom: {
35208 enabled: true,
35209 maxRatio: 3,
35210 minRatio: 1,
35211 },
35212 lazy: {
35213 enabled: true,
35214 },
35215 },
35216 },
35217 },
35218 create: function create() {
35219 var app = this;
35220 app.photoBrowser = ConstructorMethods({
35221 defaultSelector: '.photo-browser',
35222 constructor: PhotoBrowser,
35223 app: app,
35224 domProp: 'f7PhotoBrowser',
35225 });
35226 },
35227 static: {
35228 PhotoBrowser: PhotoBrowser,
35229 },
35230 };
35231
5d51ea26 35232 var Notification = /*@__PURE__*/(function (Modal) {
5309fbda
DC
35233 function Notification(app, params) {
35234 var extendedParams = Utils.extend({
35235 on: {},
35236 }, app.params.notification, params);
35237
35238 // Extends with open/close Modal methods;
5d51ea26 35239 Modal.call(this, app, extendedParams);
5309fbda
DC
35240
35241 var notification = this;
35242
35243 notification.app = app;
35244
35245 notification.params = extendedParams;
35246
35247 var ref = notification.params;
35248 var icon = ref.icon;
35249 var title = ref.title;
35250 var titleRightText = ref.titleRightText;
35251 var subtitle = ref.subtitle;
35252 var text = ref.text;
35253 var closeButton = ref.closeButton;
35254 var closeTimeout = ref.closeTimeout;
35255 var cssClass = ref.cssClass;
35256 var closeOnClick = ref.closeOnClick;
35257
35258 var $el;
35259 if (!notification.params.el) {
35260 // Find Element
35261 var notificationHtml = notification.render({
35262 icon: icon,
35263 title: title,
35264 titleRightText: titleRightText,
35265 subtitle: subtitle,
35266 text: text,
35267 closeButton: closeButton,
35268 cssClass: cssClass,
35269 });
35270
35271 $el = $(notificationHtml);
35272 } else {
35273 $el = $(notification.params.el);
35274 }
35275
35276 if ($el && $el.length > 0 && $el[0].f7Modal) {
35277 return $el[0].f7Modal;
35278 }
35279
35280 if ($el.length === 0) {
35281 return notification.destroy();
35282 }
35283
35284 Utils.extend(notification, {
35285 $el: $el,
35286 el: $el[0],
35287 type: 'notification',
35288 });
35289
35290 $el[0].f7Modal = notification;
35291
35292 if (closeButton) {
35293 $el.find('.notification-close-button').on('click', function () {
35294 notification.close();
35295 });
35296 }
35297 $el.on('click', function (e) {
35298 if (closeButton && $(e.target).closest('.notification-close-button').length) {
35299 return;
35300 }
35301 notification.emit('local::click notificationClick', notification);
35302 if (closeOnClick) { notification.close(); }
35303 });
35304
35305 notification.on('beforeDestroy', function () {
35306 $el.off('click');
35307 });
35308
35309 /* Touch Events */
35310 var isTouched;
35311 var isMoved;
35312 var isScrolling;
35313 var touchesDiff;
35314 var touchStartTime;
35315 var notificationHeight;
35316 var touchesStart = {};
35317 function handleTouchStart(e) {
35318 if (isTouched) { return; }
35319 isTouched = true;
35320 isMoved = false;
35321 isScrolling = undefined;
35322 touchStartTime = Utils.now();
35323 touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
35324 touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
35325 }
35326 function handleTouchMove(e) {
35327 if (!isTouched) { return; }
35328 var pageX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;
35329 var pageY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
35330 if (typeof isScrolling === 'undefined') {
35331 isScrolling = !!(isScrolling || Math.abs(pageY - touchesStart.y) < Math.abs(pageX - touchesStart.x));
35332 }
35333 if (isScrolling) {
35334 isTouched = false;
35335 return;
35336 }
35337 e.preventDefault();
35338 if (!isMoved) {
35339 notification.$el.removeClass('notification-transitioning');
35340 notification.$el.transition(0);
35341 notificationHeight = notification.$el[0].offsetHeight / 2;
35342 }
35343 isMoved = true;
35344 touchesDiff = (pageY - touchesStart.y);
35345 var newTranslate = touchesDiff;
35346 if (touchesDiff > 0) {
35347 newTranslate = Math.pow( touchesDiff, 0.8 );
35348 }
35349 notification.$el.transform(("translate3d(0, " + newTranslate + "px, 0)"));
35350 }
35351 function handleTouchEnd() {
35352 if (!isTouched || !isMoved) {
35353 isTouched = false;
35354 isMoved = false;
35355 return;
35356 }
35357 isTouched = false;
35358 isMoved = false;
35359 if (touchesDiff === 0) {
35360 return;
35361 }
35362
35363 var timeDiff = Utils.now() - touchStartTime;
35364 notification.$el.transition('');
35365 notification.$el.addClass('notification-transitioning');
35366 notification.$el.transform('');
35367
35368 if (
35369 (touchesDiff < -10 && timeDiff < 300)
35370 || (-touchesDiff >= notificationHeight / 1)
35371 ) {
35372 notification.close();
35373 }
35374 }
35375
35376 function attachTouchEvents() {
35377 {
35378 notification.$el.on(app.touchEvents.start, handleTouchStart, { passive: true });
35379 app.on('touchmove:active', handleTouchMove);
35380 app.on('touchend:passive', handleTouchEnd);
35381 }
35382 }
35383 function detachTouchEvents() {
35384 {
35385 notification.$el.off(app.touchEvents.start, handleTouchStart, { passive: true });
35386 app.off('touchmove:active', handleTouchMove);
35387 app.off('touchend:passive', handleTouchEnd);
35388 }
35389 }
35390
35391 var timeoutId;
35392 function closeOnTimeout() {
35393 timeoutId = Utils.nextTick(function () {
35394 if (isTouched && isMoved) {
35395 closeOnTimeout();
35396 return;
35397 }
35398 notification.close();
35399 }, closeTimeout);
35400 }
35401 notification.on('open', function () {
35402 if (notification.params.swipeToClose) {
35403 attachTouchEvents();
35404 }
35405 $('.notification.modal-in').each(function (index, openedEl) {
35406 var notificationInstance = app.notification.get(openedEl);
35407 if (openedEl !== notification.el && notificationInstance) {
35408 notificationInstance.close();
35409 }
35410 });
35411 if (closeTimeout) {
35412 closeOnTimeout();
35413 }
35414 });
35415 notification.on('close beforeDestroy', function () {
35416 if (notification.params.swipeToClose) {
35417 detachTouchEvents();
35418 }
35419 win.clearTimeout(timeoutId);
35420 });
35421
35422 return notification;
35423 }
35424
5d51ea26
DC
35425 if ( Modal ) Notification.__proto__ = Modal;
35426 Notification.prototype = Object.create( Modal && Modal.prototype );
5309fbda
DC
35427 Notification.prototype.constructor = Notification;
35428
35429 Notification.prototype.render = function render () {
35430 var notification = this;
35431 if (notification.params.render) { return notification.params.render.call(notification, notification); }
35432 var ref = notification.params;
35433 var icon = ref.icon;
35434 var title = ref.title;
35435 var titleRightText = ref.titleRightText;
35436 var subtitle = ref.subtitle;
35437 var text = ref.text;
35438 var closeButton = ref.closeButton;
35439 var cssClass = ref.cssClass;
35440 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();
35441 };
35442
35443 return Notification;
35444 }(Modal));
35445
35446 var Notification$1 = {
35447 name: 'notification',
35448 static: {
35449 Notification: Notification,
35450 },
35451 create: function create() {
35452 var app = this;
35453 app.notification = Utils.extend(
35454 {},
35455 ModalMethods({
35456 app: app,
35457 constructor: Notification,
35458 defaultSelector: '.notification.modal-in',
35459 })
35460 );
35461 },
35462 params: {
35463 notification: {
35464 icon: null,
35465 title: null,
35466 titleRightText: null,
35467 subtitle: null,
35468 text: null,
35469 closeButton: false,
35470 closeTimeout: null,
35471 closeOnClick: false,
35472 swipeToClose: true,
35473 cssClass: null,
35474 render: null,
35475 },
35476 },
35477 };
35478
35479 /* eslint "no-useless-escape": "off" */
35480
5d51ea26 35481 var Autocomplete = /*@__PURE__*/(function (Framework7Class) {
5309fbda
DC
35482 function Autocomplete(app, params) {
35483 if ( params === void 0 ) params = {};
35484
5d51ea26 35485 Framework7Class.call(this, params, [app]);
5309fbda
DC
35486
35487 var ac = this;
35488 ac.app = app;
35489
35490 var defaults = Utils.extend({
35491 on: {},
35492 }, app.params.autocomplete);
35493
5d51ea26
DC
35494 if (typeof defaults.searchbarDisableButton === 'undefined') {
35495 defaults.searchbarDisableButton = app.theme !== 'aurora';
35496 }
5309fbda
DC
35497
35498 // Extend defaults with modules params
35499 ac.useModulesParams(defaults);
35500
35501 ac.params = Utils.extend(defaults, params);
35502
35503 var $openerEl;
35504 if (ac.params.openerEl) {
35505 $openerEl = $(ac.params.openerEl);
35506 if ($openerEl.length) { $openerEl[0].f7Autocomplete = ac; }
35507 }
35508
35509 var $inputEl;
35510 if (ac.params.inputEl) {
35511 $inputEl = $(ac.params.inputEl);
35512 if ($inputEl.length) { $inputEl[0].f7Autocomplete = ac; }
35513 }
35514
35515 var view;
35516 if (ac.params.view) {
35517 view = ac.params.view;
35518 } else if ($openerEl || $inputEl) {
5d51ea26
DC
35519 var $el = $openerEl || $inputEl;
35520 view = $el.closest('.view').length && $el.closest('.view')[0].f7View;
5309fbda
DC
35521 }
35522 if (!view) { view = app.views.main; }
35523
35524 var id = Utils.id();
35525
35526 var url = params.url;
35527 if (!url && $openerEl && $openerEl.length) {
35528 if ($openerEl.attr('href')) { url = $openerEl.attr('href'); }
35529 else if ($openerEl.find('a').length > 0) {
35530 url = $openerEl.find('a').attr('href');
35531 }
35532 }
35533 if (!url || url === '#' || url === '') { url = ac.params.url; }
35534
35535 var inputType = ac.params.multiple ? 'checkbox' : 'radio';
35536
35537 Utils.extend(ac, {
35538 $openerEl: $openerEl,
35539 openerEl: $openerEl && $openerEl[0],
35540 $inputEl: $inputEl,
35541 inputEl: $inputEl && $inputEl[0],
35542 id: id,
35543 view: view,
35544 url: url,
35545 value: ac.params.value || [],
35546 inputType: inputType,
35547 inputName: (inputType + "-" + id),
35548 $modalEl: undefined,
35549 $dropdownEl: undefined,
35550 });
35551
35552 var previousQuery = '';
35553 function onInputChange() {
35554 var query = ac.$inputEl.val().trim();
35555
35556 if (!ac.params.source) { return; }
35557 ac.params.source.call(ac, query, function (items) {
35558 var itemsHTML = '';
35559 var limit = ac.params.limit ? Math.min(ac.params.limit, items.length) : items.length;
35560 ac.items = items;
35561 var regExp;
35562 if (ac.params.highlightMatches) {
35563 query = query.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, '\\$&');
35564 regExp = new RegExp(("(" + query + ")"), 'i');
35565 }
35566
35567 var firstValue;
35568 var firstItem;
35569 for (var i = 0; i < limit; i += 1) {
35570 var itemValue = typeof items[i] === 'object' ? items[i][ac.params.valueProperty] : items[i];
35571 var itemText = typeof items[i] === 'object' ? items[i][ac.params.textProperty] : items[i];
35572 if (i === 0) {
35573 firstValue = itemValue;
35574 firstItem = ac.items[i];
35575 }
35576 itemsHTML += ac.renderItem({
35577 value: itemValue,
35578 text: ac.params.highlightMatches ? itemText.replace(regExp, '<b>$1</b>') : itemText,
35579 }, i);
35580 }
35581 if (itemsHTML === '' && query === '' && ac.params.dropdownPlaceholderText) {
35582 itemsHTML += ac.renderItem({
35583 placeholder: true,
35584 text: ac.params.dropdownPlaceholderText,
35585 });
35586 }
35587 ac.$dropdownEl.find('ul').html(itemsHTML);
35588 if (ac.params.typeahead) {
35589 if (!firstValue || !firstItem) {
35590 return;
35591 }
35592 if (firstValue.toLowerCase().indexOf(query.toLowerCase()) !== 0) {
35593 return;
35594 }
35595 if (previousQuery.toLowerCase() === query.toLowerCase()) {
35596 ac.value = [];
35597 return;
35598 }
35599
35600 if (previousQuery.toLowerCase().indexOf(query.toLowerCase()) === 0) {
35601 previousQuery = query;
35602 ac.value = [];
35603 return;
35604 }
35605 $inputEl.val(firstValue);
35606 $inputEl[0].setSelectionRange(query.length, firstValue.length);
35607
35608 var previousValue = typeof ac.value[0] === 'object' ? ac.value[0][ac.params.valueProperty] : ac.value[0];
35609 if (!previousValue || firstValue.toLowerCase() !== previousValue.toLowerCase()) {
35610 ac.value = [firstItem];
35611 ac.emit('local::change autocompleteChange', [firstItem]);
35612 }
35613 }
35614
35615 previousQuery = query;
35616 });
35617 }
35618 function onPageInputChange() {
35619 var input = this;
35620 var value = input.value;
35621 var isValues = $(input).parents('.autocomplete-values').length > 0;
35622 var item;
35623 var itemValue;
35624 var aValue;
35625 if (isValues) {
35626 if (ac.inputType === 'checkbox' && !input.checked) {
35627 for (var i = 0; i < ac.value.length; i += 1) {
35628 aValue = typeof ac.value[i] === 'string' ? ac.value[i] : ac.value[i][ac.params.valueProperty];
35629 if (aValue === value || aValue * 1 === value * 1) {
35630 ac.value.splice(i, 1);
35631 }
35632 }
35633 ac.updateValues();
35634 ac.emit('local::change autocompleteChange', ac.value);
35635 }
35636 return;
35637 }
35638
35639 // Find Related Item
35640 for (var i$1 = 0; i$1 < ac.items.length; i$1 += 1) {
35641 itemValue = typeof ac.items[i$1] === 'object' ? ac.items[i$1][ac.params.valueProperty] : ac.items[i$1];
35642 if (itemValue === value || itemValue * 1 === value * 1) { item = ac.items[i$1]; }
35643 }
35644 if (ac.inputType === 'radio') {
35645 ac.value = [item];
35646 } else if (input.checked) {
35647 ac.value.push(item);
35648 } else {
35649 for (var i$2 = 0; i$2 < ac.value.length; i$2 += 1) {
35650 aValue = typeof ac.value[i$2] === 'object' ? ac.value[i$2][ac.params.valueProperty] : ac.value[i$2];
35651 if (aValue === value || aValue * 1 === value * 1) {
35652 ac.value.splice(i$2, 1);
35653 }
35654 }
35655 }
35656
35657 // Update Values Block
35658 ac.updateValues();
35659
35660 // On Select Callback
35661 if (((ac.inputType === 'radio' && input.checked) || ac.inputType === 'checkbox')) {
35662 ac.emit('local::change autocompleteChange', ac.value);
35663 }
35664 }
35665 function onHtmlClick(e) {
35666 var $targetEl = $(e.target);
35667 if ($targetEl.is(ac.$inputEl[0]) || (ac.$dropdownEl && $targetEl.closest(ac.$dropdownEl[0]).length)) { return; }
35668 ac.close();
35669 }
35670 function onOpenerClick() {
35671 ac.open();
35672 }
35673 function onInputFocus() {
35674 ac.open();
35675 }
35676 function onInputBlur() {
35677 if (ac.$dropdownEl.find('label.active-state').length > 0) { return; }
5d51ea26
DC
35678 setTimeout(function () {
35679 ac.close();
35680 }, 0);
5309fbda
DC
35681 }
35682 function onResize() {
35683 ac.positionDropdown();
35684 }
35685
35686 function onKeyDown(e) {
5d51ea26
DC
35687 if (!ac.opened) { return; }
35688 if (e.keyCode === 27) {
35689 // ESC
5309fbda
DC
35690 e.preventDefault();
35691 ac.$inputEl.blur();
5d51ea26 35692 return;
5309fbda 35693 }
5d51ea26
DC
35694 if (e.keyCode === 13) {
35695 // Enter
35696 var $selectedItemLabel = ac.$dropdownEl.find('.autocomplete-dropdown-selected label');
35697 if ($selectedItemLabel.length) {
35698 e.preventDefault();
35699 $selectedItemLabel.trigger('click');
35700 ac.$inputEl.blur();
35701 return;
35702 }
35703 if (ac.params.typeahead) {
35704 e.preventDefault();
35705 ac.$inputEl.blur();
35706 }
35707 return;
35708 }
35709 if (e.keyCode !== 40 && e.keyCode !== 38) { return; }
35710 e.preventDefault();
35711 var $selectedItem = ac.$dropdownEl.find('.autocomplete-dropdown-selected');
35712 var $newItem;
35713 if ($selectedItem.length) {
35714 $newItem = $selectedItem[e.keyCode === 40 ? 'next' : 'prev']('li');
35715 if (!$newItem.length) {
35716 $newItem = ac.$dropdownEl.find('li').eq(e.keyCode === 40 ? 0 : ac.$dropdownEl.find('li').length - 1);
35717 }
35718 } else {
35719 $newItem = ac.$dropdownEl.find('li').eq(e.keyCode === 40 ? 0 : ac.$dropdownEl.find('li').length - 1);
35720 }
35721 if ($newItem.hasClass('autocomplete-dropdown-placeholder')) { return; }
35722 $selectedItem.removeClass('autocomplete-dropdown-selected');
35723 $newItem.addClass('autocomplete-dropdown-selected');
5309fbda 35724 }
5d51ea26 35725 function onDropdownClick() {
5309fbda
DC
35726 var $clickedEl = $(this);
35727 var clickedItem;
35728 for (var i = 0; i < ac.items.length; i += 1) {
35729 var itemValue = typeof ac.items[i] === 'object' ? ac.items[i][ac.params.valueProperty] : ac.items[i];
35730 var value = $clickedEl.attr('data-value');
35731 if (itemValue === value || itemValue * 1 === value * 1) {
35732 clickedItem = ac.items[i];
35733 }
35734 }
35735 if (ac.params.updateInputValueOnSelect) {
35736 ac.$inputEl.val(typeof clickedItem === 'object' ? clickedItem[ac.params.valueProperty] : clickedItem);
35737 ac.$inputEl.trigger('input change');
35738 }
35739 ac.value = [clickedItem];
35740 ac.emit('local::change autocompleteChange', [clickedItem]);
5309fbda
DC
35741 ac.close();
35742 }
35743
35744 ac.attachEvents = function attachEvents() {
35745 if (ac.params.openIn !== 'dropdown' && ac.$openerEl) {
35746 ac.$openerEl.on('click', onOpenerClick);
35747 }
35748 if (ac.params.openIn === 'dropdown' && ac.$inputEl) {
35749 ac.$inputEl.on('focus', onInputFocus);
35750 ac.$inputEl.on(ac.params.inputEvents, onInputChange);
35751 if (app.device.android) {
35752 $('html').on('click', onHtmlClick);
35753 } else {
35754 ac.$inputEl.on('blur', onInputBlur);
35755 }
5d51ea26 35756 ac.$inputEl.on('keydown', onKeyDown);
5309fbda
DC
35757 }
35758 };
35759 ac.detachEvents = function attachEvents() {
35760 if (ac.params.openIn !== 'dropdown' && ac.$openerEl) {
35761 ac.$openerEl.off('click', onOpenerClick);
35762 }
35763 if (ac.params.openIn === 'dropdown' && ac.$inputEl) {
35764 ac.$inputEl.off('focus', onInputFocus);
35765 ac.$inputEl.off(ac.params.inputEvents, onInputChange);
35766 if (app.device.android) {
35767 $('html').off('click', onHtmlClick);
35768 } else {
35769 ac.$inputEl.off('blur', onInputBlur);
35770 }
5d51ea26 35771 ac.$inputEl.off('keydown', onKeyDown);
5309fbda
DC
35772 }
35773 };
35774 ac.attachDropdownEvents = function attachDropdownEvents() {
5d51ea26 35775 ac.$dropdownEl.on('click', 'label', onDropdownClick);
5309fbda
DC
35776 app.on('resize', onResize);
35777 };
35778 ac.detachDropdownEvents = function detachDropdownEvents() {
5d51ea26 35779 ac.$dropdownEl.off('click', 'label', onDropdownClick);
5309fbda
DC
35780 app.off('resize', onResize);
35781 };
35782
35783 ac.attachPageEvents = function attachPageEvents() {
35784 ac.$el.on('change', 'input[type="radio"], input[type="checkbox"]', onPageInputChange);
35785 if (ac.params.closeOnSelect && !ac.params.multiple) {
35786 ac.$el.once('click', '.list label', function () {
35787 Utils.nextTick(function () {
35788 ac.close();
35789 });
35790 });
35791 }
35792 };
35793 ac.detachPageEvents = function detachPageEvents() {
35794 ac.$el.off('change', 'input[type="radio"], input[type="checkbox"]', onPageInputChange);
35795 };
35796
35797 // Install Modules
35798 ac.useModules();
35799
35800 // Init
35801 ac.init();
35802
35803 return ac;
35804 }
35805
5d51ea26
DC
35806 if ( Framework7Class ) Autocomplete.__proto__ = Framework7Class;
35807 Autocomplete.prototype = Object.create( Framework7Class && Framework7Class.prototype );
5309fbda
DC
35808 Autocomplete.prototype.constructor = Autocomplete;
35809
35810 Autocomplete.prototype.positionDropdown = function positionDropdown () {
35811 var obj;
35812
35813 var ac = this;
35814 var $inputEl = ac.$inputEl;
35815 var app = ac.app;
35816 var $dropdownEl = ac.$dropdownEl;
35817
35818 var $pageContentEl = $inputEl.parents('.page-content');
35819 if ($pageContentEl.length === 0) { return; }
35820 var inputOffset = $inputEl.offset();
35821 var inputOffsetWidth = $inputEl[0].offsetWidth;
35822 var inputOffsetHeight = $inputEl[0].offsetHeight;
35823 var $listEl = $inputEl.parents('.list');
35824
35825 var $listParent;
35826 $listEl.parents().each(function (index, parentEl) {
35827 if ($listParent) { return; }
35828 var $parentEl = $(parentEl);
35829 if ($parentEl.parent($pageContentEl).length) { $listParent = $parentEl; }
35830 });
35831
35832 var listOffset = $listEl.offset();
35833 var paddingBottom = parseInt($pageContentEl.css('padding-bottom'), 10);
35834 var listOffsetLeft = $listEl.length > 0 ? listOffset.left - $pageContentEl.offset().left : 0;
35835 var inputOffsetLeft = inputOffset.left - ($listEl.length > 0 ? listOffset.left : 0) - (app.rtl ? 0 : 0);
35836 var inputOffsetTop = inputOffset.top - ($pageContentEl.offset().top - $pageContentEl[0].scrollTop);
35837
35838 var maxHeight = $pageContentEl[0].scrollHeight - paddingBottom - (inputOffsetTop + $pageContentEl[0].scrollTop) - $inputEl[0].offsetHeight;
35839
35840 var paddingProp = app.rtl ? 'padding-right' : 'padding-left';
35841 var paddingValue;
35842 if ($listEl.length && !ac.params.expandInput) {
35843 paddingValue = (app.rtl ? $listEl[0].offsetWidth - inputOffsetLeft - inputOffsetWidth : inputOffsetLeft) - (app.theme === 'md' ? 16 : 15);
35844 }
35845
35846 $dropdownEl.css({
35847 left: (($listEl.length > 0 ? listOffsetLeft : inputOffsetLeft) + "px"),
35848 top: ((inputOffsetTop + $pageContentEl[0].scrollTop + inputOffsetHeight) + "px"),
35849 width: (($listEl.length > 0 ? $listEl[0].offsetWidth : inputOffsetWidth) + "px"),
35850 });
35851 $dropdownEl.children('.autocomplete-dropdown-inner').css(( obj = {
35852 maxHeight: (maxHeight + "px")
35853 }, obj[paddingProp] = $listEl.length > 0 && !ac.params.expandInput ? (paddingValue + "px") : '', obj ));
35854 };
35855
35856 Autocomplete.prototype.focus = function focus () {
35857 var ac = this;
35858 ac.$el.find('input[type=search]').focus();
35859 };
35860
35861 Autocomplete.prototype.source = function source (query) {
35862 var ac = this;
35863 if (!ac.params.source) { return; }
35864
35865 var $el = ac.$el;
35866
35867 ac.params.source.call(ac, query, function (items) {
35868 var itemsHTML = '';
35869 var limit = ac.params.limit ? Math.min(ac.params.limit, items.length) : items.length;
35870 ac.items = items;
35871 for (var i = 0; i < limit; i += 1) {
35872 var selected = false;
35873 var itemValue = typeof items[i] === 'object' ? items[i][ac.params.valueProperty] : items[i];
35874 for (var j = 0; j < ac.value.length; j += 1) {
35875 var aValue = typeof ac.value[j] === 'object' ? ac.value[j][ac.params.valueProperty] : ac.value[j];
35876 if (aValue === itemValue || aValue * 1 === itemValue * 1) { selected = true; }
35877 }
35878 itemsHTML += ac.renderItem({
35879 value: itemValue,
35880 text: typeof items[i] === 'object' ? items[i][ac.params.textProperty] : items[i],
35881 inputType: ac.inputType,
35882 id: ac.id,
35883 inputName: ac.inputName,
35884 selected: selected,
35885 }, i);
35886 }
35887 $el.find('.autocomplete-found ul').html(itemsHTML);
35888 if (items.length === 0) {
35889 if (query.length !== 0) {
35890 $el.find('.autocomplete-not-found').show();
35891 $el.find('.autocomplete-found, .autocomplete-values').hide();
35892 } else {
35893 $el.find('.autocomplete-values').show();
35894 $el.find('.autocomplete-found, .autocomplete-not-found').hide();
35895 }
35896 } else {
35897 $el.find('.autocomplete-found').show();
35898 $el.find('.autocomplete-not-found, .autocomplete-values').hide();
35899 }
35900 });
35901 };
35902
35903 Autocomplete.prototype.updateValues = function updateValues () {
35904 var ac = this;
35905 var valuesHTML = '';
35906 for (var i = 0; i < ac.value.length; i += 1) {
35907 valuesHTML += ac.renderItem({
35908 value: typeof ac.value[i] === 'object' ? ac.value[i][ac.params.valueProperty] : ac.value[i],
35909 text: typeof ac.value[i] === 'object' ? ac.value[i][ac.params.textProperty] : ac.value[i],
35910 inputType: ac.inputType,
35911 id: ac.id,
35912 inputName: ((ac.inputName) + "-checked}"),
35913 selected: true,
35914 }, i);
35915 }
35916 ac.$el.find('.autocomplete-values ul').html(valuesHTML);
35917 };
35918
35919 Autocomplete.prototype.preloaderHide = function preloaderHide () {
35920 var ac = this;
35921 if (ac.params.openIn === 'dropdown' && ac.$dropdownEl) {
35922 ac.$dropdownEl.find('.autocomplete-preloader').removeClass('autocomplete-preloader-visible');
35923 } else {
35924 $('.autocomplete-preloader').removeClass('autocomplete-preloader-visible');
35925 }
35926 };
35927
35928 Autocomplete.prototype.preloaderShow = function preloaderShow () {
35929 var ac = this;
35930 if (ac.params.openIn === 'dropdown' && ac.$dropdownEl) {
35931 ac.$dropdownEl.find('.autocomplete-preloader').addClass('autocomplete-preloader-visible');
35932 } else {
35933 $('.autocomplete-preloader').addClass('autocomplete-preloader-visible');
35934 }
35935 };
35936
35937 Autocomplete.prototype.renderPreloader = function renderPreloader () {
35938 var ac = this;
35939 return ("\n <div class=\"autocomplete-preloader preloader " + (ac.params.preloaderColor ? ("color-" + (ac.params.preloaderColor)) : '') + "\">" + (Utils[((ac.app.theme) + "PreloaderContent")] || '') + "</div>\n ").trim();
35940 };
35941
35942 Autocomplete.prototype.renderSearchbar = function renderSearchbar () {
35943 var ac = this;
35944 if (ac.params.renderSearchbar) { return ac.params.renderSearchbar.call(ac); }
5d51ea26 35945 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 " + (ac.params.searchbarDisableButton ? ("\n <span class=\"searchbar-disable-button\">" + (ac.params.searchbarDisableText) + "</span>\n ") : '') + "\n </div>\n </form>\n ").trim();
5309fbda
DC
35946 return searchbarHTML;
35947 };
35948
35949 Autocomplete.prototype.renderItem = function renderItem (item, index) {
35950 var ac = this;
35951 if (ac.params.renderItem) { return ac.params.renderItem.call(ac, item, index); }
35952 var itemHtml;
35953 var itemValue = item.value && typeof item.value === 'string' ? item.value.replace(/"/g, '&quot;') : item.value;
35954 if (ac.params.openIn !== 'dropdown') {
35955 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 ";
35956 } else if (!item.placeholder) {
35957 // Dropdown
35958 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 ";
35959 } else {
35960 // Dropwdown placeholder
35961 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 ";
35962 }
35963 return itemHtml.trim();
35964 };
35965
35966 Autocomplete.prototype.renderNavbar = function renderNavbar () {
35967 var ac = this;
35968 if (ac.params.renderNavbar) { return ac.params.renderNavbar.call(ac); }
35969 var pageTitle = ac.params.pageTitle;
35970 if (typeof pageTitle === 'undefined' && ac.$openerEl && ac.$openerEl.length) {
35971 pageTitle = ac.$openerEl.find('.item-title').text().trim();
35972 }
5d51ea26
DC
35973 var inPopup = ac.params.openIn === 'popup';
35974 var navbarLeft = inPopup
35975 ? ("\n " + (ac.params.preloader ? ("\n <div class=\"left\">\n " + (ac.renderPreloader()) + "\n </div>\n ") : '') + "\n ")
35976 : ("\n <div class=\"left sliding\">\n <a class=\"link back\">\n <i class=\"icon icon-back\"></i>\n <span class=\"if-not-md\">" + (ac.params.pageBackLinkText) + "</span>\n </a>\n </div>\n ");
35977 var navbarRight = inPopup
35978 ? ("\n <div class=\"right\">\n <a class=\"link popup-close\" data-popup=\".autocomplete-popup\">\n " + (ac.params.popupCloseLinkText) + "\n </a>\n </div>\n ")
35979 : ("\n " + (ac.params.preloader ? ("\n <div class=\"right\">\n " + (ac.renderPreloader()) + "\n </div>\n ") : '') + "\n ");
35980 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 " + navbarLeft + "\n " + (pageTitle ? ("<div class=\"title sliding\">" + pageTitle + "</div>") : '') + "\n " + navbarRight + "\n <div class=\"subnavbar sliding\">" + (ac.renderSearchbar()) + "</div>\n </div>\n </div>\n ").trim();
5309fbda
DC
35981 return navbarHtml;
35982 };
35983
35984 Autocomplete.prototype.renderDropdown = function renderDropdown () {
35985 var ac = this;
35986 if (ac.params.renderDropdown) { return ac.params.renderDropdown.call(ac, ac.items); }
35987 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();
35988 return dropdownHtml;
35989 };
35990
5d51ea26 35991 Autocomplete.prototype.renderPage = function renderPage (inPopup) {
5309fbda
DC
35992 var ac = this;
35993 if (ac.params.renderPage) { return ac.params.renderPage.call(ac, ac.items); }
35994
5d51ea26 35995 var pageHtml = ("\n <div class=\"page page-with-subnavbar autocomplete-page\" data-name=\"autocomplete-page\">\n " + (ac.renderNavbar(inPopup)) + "\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();
5309fbda
DC
35996 return pageHtml;
35997 };
35998
35999 Autocomplete.prototype.renderPopup = function renderPopup () {
36000 var ac = this;
36001 if (ac.params.renderPopup) { return ac.params.renderPopup.call(ac, ac.items); }
5d51ea26 36002 var popupHtml = ("\n <div class=\"popup autocomplete-popup\">\n <div class=\"view\">\n " + (ac.renderPage(true)) + ";\n </div>\n </div>\n ").trim();
5309fbda
DC
36003 return popupHtml;
36004 };
36005
36006 Autocomplete.prototype.onOpen = function onOpen (type, el) {
36007 var ac = this;
36008 var app = ac.app;
36009 var $el = $(el);
36010 ac.$el = $el;
36011 ac.el = $el[0];
36012 ac.openedIn = type;
36013 ac.opened = true;
36014
36015 if (ac.params.openIn === 'dropdown') {
36016 ac.attachDropdownEvents();
36017
36018 ac.$dropdownEl.addClass('autocomplete-dropdown-in');
36019 ac.$inputEl.trigger('input');
36020 } else {
36021 // Init SB
36022 var $searchbarEl = $el.find('.searchbar');
36023 if (ac.params.openIn === 'page' && app.theme === 'ios' && $searchbarEl.length === 0) {
36024 $searchbarEl = $(app.navbar.getElByPage($el)).find('.searchbar');
36025 }
36026 ac.searchbar = app.searchbar.create({
36027 el: $searchbarEl,
36028 backdropEl: $el.find('.searchbar-backdrop'),
36029 customSearch: true,
36030 on: {
36031 search: function search(sb, query) {
36032 if (query.length === 0 && ac.searchbar.enabled) {
36033 ac.searchbar.backdropShow();
36034 } else {
36035 ac.searchbar.backdropHide();
36036 }
36037 ac.source(query);
36038 },
36039 },
36040 });
36041
36042 // Attach page events
36043 ac.attachPageEvents();
36044
36045 // Update Values On Page Init
36046 ac.updateValues();
36047
36048 // Source on load
36049 if (ac.params.requestSourceOnOpen) { ac.source(''); }
36050 }
36051
36052 ac.emit('local::open autocompleteOpen', ac);
36053 };
36054
36055 Autocomplete.prototype.autoFocus = function autoFocus () {
36056 var ac = this;
36057 if (ac.searchbar && ac.searchbar.$inputEl) {
36058 ac.searchbar.$inputEl.focus();
36059 }
36060 return ac;
36061 };
36062
36063 Autocomplete.prototype.onOpened = function onOpened () {
36064 var ac = this;
36065 if (ac.params.openIn !== 'dropdown' && ac.params.autoFocus) {
36066 ac.autoFocus();
36067 }
36068 ac.emit('local::opened autocompleteOpened', ac);
36069 };
36070
36071 Autocomplete.prototype.onClose = function onClose () {
36072 var ac = this;
36073 if (ac.destroyed) { return; }
36074
36075 // Destroy SB
36076 if (ac.searchbar && ac.searchbar.destroy) {
36077 ac.searchbar.destroy();
36078 ac.searchbar = null;
36079 delete ac.searchbar;
36080 }
36081
36082 if (ac.params.openIn === 'dropdown') {
36083 ac.detachDropdownEvents();
36084 ac.$dropdownEl.removeClass('autocomplete-dropdown-in').remove();
36085 ac.$inputEl.parents('.item-content-dropdown-expanded').removeClass('item-content-dropdown-expanded');
36086 } else {
36087 ac.detachPageEvents();
36088 }
36089
36090 ac.emit('local::close autocompleteClose', ac);
36091 };
36092
36093 Autocomplete.prototype.onClosed = function onClosed () {
36094 var ac = this;
36095 if (ac.destroyed) { return; }
36096 ac.opened = false;
36097 ac.$el = null;
36098 ac.el = null;
36099 delete ac.$el;
36100 delete ac.el;
36101
36102 ac.emit('local::closed autocompleteClosed', ac);
36103 };
36104
36105 Autocomplete.prototype.openPage = function openPage () {
36106 var ac = this;
36107 if (ac.opened) { return ac; }
36108 var pageHtml = ac.renderPage();
36109 ac.view.router.navigate({
36110 url: ac.url,
36111 route: {
36112 content: pageHtml,
36113 path: ac.url,
36114 on: {
36115 pageBeforeIn: function pageBeforeIn(e, page) {
36116 ac.onOpen('page', page.el);
36117 },
36118 pageAfterIn: function pageAfterIn(e, page) {
36119 ac.onOpened('page', page.el);
36120 },
36121 pageBeforeOut: function pageBeforeOut(e, page) {
36122 ac.onClose('page', page.el);
36123 },
36124 pageAfterOut: function pageAfterOut(e, page) {
36125 ac.onClosed('page', page.el);
36126 },
36127 },
36128 options: {
36129 animate: ac.params.animate,
36130 },
36131 },
36132 });
36133 return ac;
36134 };
36135
36136 Autocomplete.prototype.openPopup = function openPopup () {
36137 var ac = this;
36138 if (ac.opened) { return ac; }
36139 var popupHtml = ac.renderPopup();
36140
36141 var popupParams = {
36142 content: popupHtml,
36143 animate: ac.params.animate,
36144 on: {
36145 popupOpen: function popupOpen(popup) {
36146 ac.onOpen('popup', popup.el);
36147 },
36148 popupOpened: function popupOpened(popup) {
36149 ac.onOpened('popup', popup.el);
36150 },
36151 popupClose: function popupClose(popup) {
36152 ac.onClose('popup', popup.el);
36153 },
36154 popupClosed: function popupClosed(popup) {
36155 ac.onClosed('popup', popup.el);
36156 },
36157 },
36158 };
36159
36160 if (ac.params.routableModals) {
36161 ac.view.router.navigate({
36162 url: ac.url,
36163 route: {
36164 path: ac.url,
36165 popup: popupParams,
36166 },
36167 });
36168 } else {
36169 ac.modal = ac.app.popup.create(popupParams).open(ac.params.animate);
36170 }
36171 return ac;
36172 };
36173
36174 Autocomplete.prototype.openDropdown = function openDropdown () {
36175 var ac = this;
36176
36177 if (!ac.$dropdownEl) {
36178 ac.$dropdownEl = $(ac.renderDropdown());
36179 }
36180 var $listEl = ac.$inputEl.parents('.list');
36181 if ($listEl.length && ac.$inputEl.parents('.item-content').length > 0 && ac.params.expandInput) {
36182 ac.$inputEl.parents('.item-content').addClass('item-content-dropdown-expanded');
36183 }
36184
36185 var $pageContentEl = ac.$inputEl.parents('.page-content');
36186 if (ac.params.dropdownContainerEl) {
36187 $(ac.params.dropdownContainerEl).append(ac.$dropdownEl);
36188 } else if ($pageContentEl.length === 0) {
36189 ac.$dropdownEl.insertAfter(ac.$inputEl);
36190 } else {
36191 ac.positionDropdown();
36192 $pageContentEl.append(ac.$dropdownEl);
36193 }
36194 ac.onOpen('dropdown', ac.$dropdownEl);
36195 ac.onOpened('dropdown', ac.$dropdownEl);
36196 };
36197
36198 Autocomplete.prototype.open = function open () {
36199 var ac = this;
36200 if (ac.opened) { return ac; }
36201 var openIn = ac.params.openIn;
36202 ac[("open" + (openIn.split('').map(function (el, index) {
36203 if (index === 0) { return el.toUpperCase(); }
36204 return el;
36205 }).join('')))]();
36206 return ac;
36207 };
36208
36209 Autocomplete.prototype.close = function close () {
36210 var ac = this;
36211 if (!ac.opened) { return ac; }
36212 if (ac.params.openIn === 'dropdown') {
36213 ac.onClose();
36214 ac.onClosed();
36215 } else if (ac.params.routableModals || ac.openedIn === 'page') {
36216 ac.view.router.back({ animate: ac.params.animate });
36217 } else {
36218 ac.modal.once('modalClosed', function () {
36219 Utils.nextTick(function () {
36220 ac.modal.destroy();
36221 delete ac.modal;
36222 });
36223 });
36224 ac.modal.close();
36225 }
36226 return ac;
36227 };
36228
36229 Autocomplete.prototype.init = function init () {
36230 var ac = this;
36231 ac.attachEvents();
36232 };
36233
36234 Autocomplete.prototype.destroy = function destroy () {
36235 var ac = this;
36236 ac.emit('local::beforeDestroy autocompleteBeforeDestroy', ac);
36237 ac.detachEvents();
36238 if (ac.$inputEl && ac.$inputEl[0]) {
36239 delete ac.$inputEl[0].f7Autocomplete;
36240 }
36241 if (ac.$openerEl && ac.$openerEl[0]) {
36242 delete ac.$openerEl[0].f7Autocomplete;
36243 }
36244 Utils.deleteProps(ac);
36245 ac.destroyed = true;
36246 };
36247
36248 return Autocomplete;
36249 }(Framework7Class));
36250
36251 var Autocomplete$1 = {
36252 name: 'autocomplete',
36253 params: {
36254 autocomplete: {
36255 openerEl: undefined,
36256 inputEl: undefined,
36257 view: undefined,
36258
36259 // DropDown
36260 dropdownContainerEl: undefined,
36261 dropdownPlaceholderText: undefined,
36262 typeahead: false,
36263 highlightMatches: true,
36264 expandInput: false,
36265 updateInputValueOnSelect: true,
36266 inputEvents: 'input',
36267
36268 value: undefined,
36269 multiple: false,
36270
36271 source: undefined,
36272 limit: undefined,
36273 valueProperty: 'id',
36274 textProperty: 'text',
36275
36276 openIn: 'page', // or 'popup' or 'dropdown'
36277 pageBackLinkText: 'Back',
36278 popupCloseLinkText: 'Close',
36279 pageTitle: undefined,
36280 searchbarPlaceholder: 'Search...',
36281 searchbarDisableText: 'Cancel',
5d51ea26 36282 searchbarDisableButton: undefined,
5309fbda
DC
36283
36284 animate: true,
36285
36286 autoFocus: false,
36287 closeOnSelect: false,
36288 notFoundText: 'Nothing found',
36289 requestSourceOnOpen: false,
36290
36291 // Preloader
36292 preloaderColor: undefined,
36293 preloader: false,
36294
36295 // Colors
36296 formColorTheme: undefined,
36297 navbarColorTheme: undefined,
36298
36299 // Routing
36300 routableModals: true,
36301 url: 'select/',
36302
36303 // Custom render functions
36304 renderDropdown: undefined,
36305 renderPage: undefined,
36306 renderPopup: undefined,
36307 renderItem: undefined,
36308 renderSearchbar: undefined,
36309 renderNavbar: undefined,
36310
36311 },
36312 },
36313 static: {
36314 Autocomplete: Autocomplete,
36315 },
36316 create: function create() {
36317 var app = this;
36318 app.autocomplete = Utils.extend(
36319 ConstructorMethods({
36320 defaultSelector: undefined,
36321 constructor: Autocomplete,
36322 app: app,
36323 domProp: 'f7Autocomplete',
36324 }),
36325 {
36326 open: function open(autocompleteEl) {
36327 var ac = app.autocomplete.get(autocompleteEl);
36328 if (ac && ac.open) { return ac.open(); }
36329 return undefined;
36330 },
36331 close: function close(autocompleteEl) {
36332 var ac = app.autocomplete.get(autocompleteEl);
36333 if (ac && ac.close) { return ac.close(); }
36334 return undefined;
36335 },
36336 }
36337 );
36338 },
36339 };
36340
5d51ea26 36341 var Tooltip = /*@__PURE__*/(function (Framework7Class) {
5309fbda
DC
36342 function Tooltip(app, params) {
36343 if ( params === void 0 ) params = {};
36344
5d51ea26 36345 Framework7Class.call(this, params, [app]);
5309fbda
DC
36346
36347 var tooltip = this;
36348
36349 var defaults = Utils.extend({}, app.params.tooltip);
36350
36351 // Extend defaults with modules params
36352 tooltip.useModulesParams(defaults);
36353
36354 tooltip.params = Utils.extend(defaults, params);
36355
36356 var ref = tooltip.params;
36357 var targetEl = ref.targetEl;
36358 if (!targetEl) { return tooltip; }
36359
36360 var $targetEl = $(targetEl);
36361 if ($targetEl.length === 0) { return tooltip; }
36362
36363 if ($targetEl[0].f7Tooltip) { return $targetEl[0].f7Tooltip; }
36364
36365 var $el = $(tooltip.render()).eq(0);
36366
36367 Utils.extend(tooltip, {
36368 app: app,
36369 $targetEl: $targetEl,
36370 targetEl: $targetEl && $targetEl[0],
36371 $el: $el,
36372 el: $el && $el[0],
36373 text: tooltip.params.text || '',
36374 visible: false,
36375 opened: false,
36376 });
36377
36378 $targetEl[0].f7Tooltip = tooltip;
36379
36380 var touchesStart = {};
36381 var isTouched;
36382 function handleTouchStart(e) {
36383 if (isTouched) { return; }
36384 isTouched = true;
36385 touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
36386 touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
36387 tooltip.show(this);
36388 }
36389 function handleTouchMove(e) {
36390 if (!isTouched) { return; }
36391 var x = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;
36392 var y = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
36393 var distance = Math.pow( (
36394 (Math.pow( (x - touchesStart.x), 2 ))
36395 + (Math.pow( (y - touchesStart.y), 2 ))
36396 ), 0.5 );
36397 if (distance > 50) {
36398 isTouched = false;
36399 tooltip.hide();
36400 }
36401 }
36402 function handleTouchEnd() {
36403 if (!isTouched) { return; }
36404 isTouched = false;
36405 tooltip.hide();
36406 }
36407 function handleMouseEnter() {
36408 tooltip.show(this);
36409 }
36410 function handleMouseLeave() {
36411 tooltip.hide();
36412 }
36413 function handleTransitionEnd() {
36414 if (!$el.hasClass('tooltip-in')) {
36415 $el.removeClass('tooltip-out').remove();
36416 }
36417 }
36418
36419 tooltip.attachEvents = function attachEvents() {
36420 $el.on('transitionend', handleTransitionEnd);
36421 if (Support.touch) {
36422 var passive = Support.passiveListener ? { passive: true } : false;
36423 $targetEl.on(app.touchEvents.start, handleTouchStart, passive);
36424 app.on('touchmove', handleTouchMove);
36425 app.on('touchend:passive', handleTouchEnd);
36426 } else {
36427 $targetEl.on('mouseenter', handleMouseEnter);
36428 $targetEl.on('mouseleave', handleMouseLeave);
36429 }
36430 };
36431 tooltip.detachEvents = function detachEvents() {
36432 $el.off('transitionend', handleTransitionEnd);
36433 if (Support.touch) {
36434 var passive = Support.passiveListener ? { passive: true } : false;
36435 $targetEl.off(app.touchEvents.start, handleTouchStart, passive);
36436 app.off('touchmove', handleTouchMove);
36437 app.off('touchend:passive', handleTouchEnd);
36438 } else {
36439 $targetEl.off('mouseenter', handleMouseEnter);
36440 $targetEl.off('mouseleave', handleMouseLeave);
36441 }
36442 };
36443
36444 // Install Modules
36445 tooltip.useModules();
36446
36447 tooltip.init();
36448
36449 return tooltip;
36450 }
36451
5d51ea26
DC
36452 if ( Framework7Class ) Tooltip.__proto__ = Framework7Class;
36453 Tooltip.prototype = Object.create( Framework7Class && Framework7Class.prototype );
5309fbda
DC
36454 Tooltip.prototype.constructor = Tooltip;
36455
36456 Tooltip.prototype.position = function position (targetEl) {
36457 var tooltip = this;
36458 var $el = tooltip.$el;
36459 var app = tooltip.app;
36460 $el.css({ left: '', top: '' });
36461 var $targetEl = $(targetEl || tooltip.targetEl);
36462 var ref = [$el.width(), $el.height()];
36463 var width = ref[0];
36464 var height = ref[1];
36465
36466 $el.css({ left: '', top: '' });
36467
36468 var targetWidth;
36469 var targetHeight;
36470 var targetOffsetLeft;
36471 var targetOffsetTop;
36472 if ($targetEl && $targetEl.length > 0) {
36473 targetWidth = $targetEl.outerWidth();
36474 targetHeight = $targetEl.outerHeight();
36475
36476 var targetOffset = $targetEl.offset();
36477 targetOffsetLeft = targetOffset.left - app.left;
36478 targetOffsetTop = targetOffset.top - app.top;
36479
36480 var targetParentPage = $targetEl.parents('.page');
36481 if (targetParentPage.length > 0) {
36482 targetOffsetTop -= targetParentPage[0].scrollTop;
36483 }
36484 }
36485 var ref$1 = [0, 0, 0];
36486 var left = ref$1[0];
36487 var top = ref$1[1];
36488
36489 // Top Position
36490 var position = 'top';
36491
36492 if (height < targetOffsetTop) {
36493 // On top
36494 top = targetOffsetTop - height;
36495 } else if (height < app.height - targetOffsetTop - targetHeight) {
36496 // On bottom
36497 position = 'bottom';
36498 top = targetOffsetTop + targetHeight;
36499 } else {
36500 // On middle
36501 position = 'middle';
36502 top = ((targetHeight / 2) + targetOffsetTop) - (height / 2);
36503 if (top <= 0) {
36504 top = 8;
36505 } else if (top + height >= app.height) {
36506 top = app.height - height - 8;
36507 }
36508 }
36509
36510 // Horizontal Position
36511 if (position === 'top' || position === 'bottom') {
36512 left = ((targetWidth / 2) + targetOffsetLeft) - (width / 2);
36513 if (left < 8) { left = 8; }
36514 if (left + width > app.width) { left = app.width - width - 8; }
36515 if (left < 0) { left = 0; }
36516 } else if (position === 'middle') {
36517 left = targetOffsetLeft - width;
36518 if (left < 8 || (left + width > app.width)) {
36519 if (left < 8) { left = targetOffsetLeft + targetWidth; }
36520 if (left + width > app.width) { left = app.width - width - 8; }
36521 }
36522 }
36523
36524 // Apply Styles
36525 $el.css({ top: (top + "px"), left: (left + "px") });
36526 };
36527
36528 Tooltip.prototype.show = function show (aroundEl) {
36529 var tooltip = this;
36530 var app = tooltip.app;
36531 var $el = tooltip.$el;
36532 var $targetEl = tooltip.$targetEl;
36533 app.root.append($el);
36534 tooltip.position(aroundEl);
36535 var $aroundEl = $(aroundEl);
36536 tooltip.visible = true;
36537 tooltip.opened = true;
36538 $targetEl.trigger('tooltip:show', tooltip);
36539 $el.trigger('tooltip:show', tooltip);
36540 if ($aroundEl.length && $aroundEl[0] !== $targetEl[0]) {
36541 $aroundEl.trigger('tooltip:show', tooltip);
36542 }
36543 tooltip.emit('local::show tooltipShow', tooltip);
36544 $el.removeClass('tooltip-out').addClass('tooltip-in');
36545 return tooltip;
36546 };
36547
36548 Tooltip.prototype.hide = function hide () {
36549 var tooltip = this;
36550 var $el = tooltip.$el;
36551 var $targetEl = tooltip.$targetEl;
36552 tooltip.visible = false;
36553 tooltip.opened = false;
36554 $targetEl.trigger('tooltip:hide', tooltip);
36555 $el.trigger('tooltip:hide', tooltip);
36556 tooltip.emit('local::hide tooltipHide', tooltip);
36557 $el.addClass('tooltip-out').removeClass('tooltip-in');
36558 return tooltip;
36559 };
36560
36561 Tooltip.prototype.render = function render () {
36562 var tooltip = this;
36563 if (tooltip.params.render) { return tooltip.params.render.call(tooltip, tooltip); }
36564 var ref = tooltip.params;
36565 var cssClass = ref.cssClass;
36566 var text = ref.text;
36567 return ("\n <div class=\"tooltip " + (cssClass || '') + "\">\n <div class=\"tooltip-content\">" + (text || '') + "</div>\n </div>\n ").trim();
36568 };
36569
36570 Tooltip.prototype.setText = function setText (newText) {
36571 var tooltip = this;
36572 if (typeof newText === 'undefined') {
36573 return tooltip;
36574 }
36575 tooltip.params.text = newText;
36576 tooltip.text = newText;
36577 if (tooltip.$el) {
36578 tooltip.$el.children('.tooltip-content').html(newText);
36579 }
36580 if (tooltip.opened) {
36581 tooltip.position();
36582 }
36583 return tooltip;
36584 };
36585
36586 Tooltip.prototype.init = function init () {
36587 var tooltip = this;
36588 tooltip.attachEvents();
36589 };
36590
36591 Tooltip.prototype.destroy = function destroy () {
36592 var tooltip = this;
36593 if (!tooltip.$targetEl || tooltip.destroyed) { return; }
36594 tooltip.$targetEl.trigger('tooltip:beforedestroy', tooltip);
36595 tooltip.emit('local::beforeDestroy tooltipBeforeDestroy', tooltip);
36596 tooltip.$el.remove();
36597 delete tooltip.$targetEl[0].f7Tooltip;
36598 tooltip.detachEvents();
36599 Utils.deleteProps(tooltip);
36600 tooltip.destroyed = true;
36601 };
36602
36603 return Tooltip;
36604 }(Framework7Class));
36605
36606 var Tooltip$1 = {
36607 name: 'tooltip',
36608 static: {
36609 Tooltip: Tooltip,
36610 },
36611 create: function create() {
36612 var app = this;
36613 app.tooltip = ConstructorMethods({
36614 defaultSelector: '.tooltip',
36615 constructor: Tooltip,
36616 app: app,
36617 domProp: 'f7Tooltip',
36618 });
36619 app.tooltip.show = function show(el) {
36620 var $el = $(el);
36621 if ($el.length === 0) { return undefined; }
36622 var tooltip = $el[0].f7Tooltip;
36623 if (!tooltip) { return undefined; }
36624 tooltip.show($el[0]);
36625 return tooltip;
36626 };
36627 app.tooltip.hide = function hide(el) {
36628 var $el = $(el);
36629 if ($el.length === 0) { return undefined; }
36630 var tooltip = $el[0].f7Tooltip;
36631 if (!tooltip) { return undefined; }
36632 tooltip.hide();
36633 return tooltip;
36634 };
36635 app.tooltip.setText = function text(el, newText) {
36636 var $el = $(el);
36637 if ($el.length === 0) { return undefined; }
36638 var tooltip = $el[0].f7Tooltip;
36639 if (!tooltip) { return undefined; }
36640 tooltip.setText(newText);
36641 return tooltip;
36642 };
36643 },
36644 params: {
36645 tooltip: {
36646 targetEl: null,
36647 text: null,
36648 cssClass: null,
36649 render: null,
36650 },
36651 },
36652 on: {
36653 tabMounted: function tabMounted(tabEl) {
36654 var app = this;
36655 $(tabEl).find('.tooltip-init').each(function (index, el) {
36656 var text = $(el).attr('data-tooltip');
36657 if (!text) { return; }
36658 app.tooltip.create({ targetEl: el, text: text });
36659 });
36660 },
36661 tabBeforeRemove: function tabBeforeRemove(tabEl) {
36662 $(tabEl).find('.tooltip-init').each(function (index, el) {
36663 if (el.f7Tooltip) { el.f7Tooltip.destroy(); }
36664 });
36665 },
36666 pageInit: function pageInit(page) {
36667 var app = this;
36668 page.$el.find('.tooltip-init').each(function (index, el) {
36669 var text = $(el).attr('data-tooltip');
36670 if (!text) { return; }
36671 app.tooltip.create({ targetEl: el, text: text });
36672 });
5d51ea26
DC
36673 if (app.theme === 'ios' && page.view && page.view.router.separateNavbar && page.$navbarEl && page.$navbarEl.length > 0) {
36674 page.$navbarEl.find('.tooltip-init').each(function (index, el) {
36675 var text = $(el).attr('data-tooltip');
36676 if (!text) { return; }
36677 app.tooltip.create({ targetEl: el, text: text });
36678 });
36679 }
5309fbda
DC
36680 },
36681 pageBeforeRemove: function pageBeforeRemove(page) {
5d51ea26 36682 var app = this;
5309fbda
DC
36683 page.$el.find('.tooltip-init').each(function (index, el) {
36684 if (el.f7Tooltip) { el.f7Tooltip.destroy(); }
36685 });
5d51ea26
DC
36686 if (app.theme === 'ios' && page.view && page.view.router.separateNavbar && page.$navbarEl && page.$navbarEl.length > 0) {
36687 page.$navbarEl.find('.tooltip-init').each(function (index, el) {
36688 if (el.f7Tooltip) { el.f7Tooltip.destroy(); }
36689 });
36690 }
5309fbda
DC
36691 },
36692 },
36693 vnode: {
36694 'tooltip-init': {
36695 insert: function insert(vnode) {
36696 var app = this;
36697 var el = vnode.elm;
36698 var text = $(el).attr('data-tooltip');
36699 if (!text) { return; }
36700 app.tooltip.create({ targetEl: el, text: text });
36701 },
5d51ea26
DC
36702 update: function update(vnode) {
36703 var el = vnode.elm;
36704 if (!el.f7Tooltip) { return; }
36705 if (vnode && vnode.data && vnode.data.attrs && vnode.data.attrs['data-tooltip']) {
36706 el.f7Tooltip.setText(vnode.data.attrs['data-tooltip']);
36707 }
36708 },
5309fbda
DC
36709 destroy: function destroy(vnode) {
36710 var el = vnode.elm;
36711 if (el.f7Tooltip) { el.f7Tooltip.destroy(); }
36712 },
36713 },
36714 },
36715 };
36716
36717 /* eslint no-nested-ternary: off */
36718
5d51ea26 36719 var Gauge = /*@__PURE__*/(function (Framework7Class) {
5309fbda
DC
36720 function Gauge(app, params) {
36721 if ( params === void 0 ) params = {};
36722
36723 // Extends with open/close Modal methods;
5d51ea26 36724 Framework7Class.call(this, params, [app]);
5309fbda
DC
36725
36726 var gauge = this;
36727
36728 var defaults = Utils.extend({}, app.params.gauge);
36729
36730 // Extend defaults with modules params
36731 gauge.useModulesParams(defaults);
36732
36733 gauge.params = Utils.extend(defaults, params);
36734
36735 var ref = gauge.params;
36736 var el = ref.el;
36737 if (!el) { return gauge; }
36738
36739 var $el = $(el);
36740 if ($el.length === 0) { return gauge; }
36741
36742 if ($el[0].f7Gauge) { return $el[0].f7Gauge; }
36743
36744 Utils.extend(gauge, {
36745 app: app,
36746 $el: $el,
36747 el: $el && $el[0],
36748 });
36749
36750 $el[0].f7Gauge = gauge;
36751
36752 // Install Modules
36753 gauge.useModules();
36754
36755 gauge.init();
36756
36757 return gauge;
36758 }
36759
5d51ea26
DC
36760 if ( Framework7Class ) Gauge.__proto__ = Framework7Class;
36761 Gauge.prototype = Object.create( Framework7Class && Framework7Class.prototype );
5309fbda
DC
36762 Gauge.prototype.constructor = Gauge;
36763
36764 Gauge.prototype.calcRadius = function calcRadius () {
36765 var gauge = this;
36766 var ref = gauge.params;
36767 var size = ref.size;
36768 var borderWidth = ref.borderWidth;
36769 return (size / 2) - (borderWidth / 2);
36770 };
36771
36772 Gauge.prototype.calcBorderLength = function calcBorderLength () {
36773 var gauge = this;
36774 var radius = gauge.calcRadius();
36775 return 2 * Math.PI * radius;
36776 };
36777
36778 Gauge.prototype.render = function render () {
36779 var gauge = this;
36780 if (gauge.params.render) { return gauge.params.render.call(gauge, gauge); }
36781
36782 var ref = gauge.params;
36783 var type = ref.type;
36784 var value = ref.value;
36785 var size = ref.size;
36786 var bgColor = ref.bgColor;
36787 var borderBgColor = ref.borderBgColor;
36788 var borderColor = ref.borderColor;
36789 var borderWidth = ref.borderWidth;
36790 var valueText = ref.valueText;
36791 var valueTextColor = ref.valueTextColor;
36792 var valueFontSize = ref.valueFontSize;
36793 var valueFontWeight = ref.valueFontWeight;
36794 var labelText = ref.labelText;
36795 var labelTextColor = ref.labelTextColor;
36796 var labelFontSize = ref.labelFontSize;
36797 var labelFontWeight = ref.labelFontWeight;
36798
36799 var semiCircle = type === 'semicircle';
36800 var radius = gauge.calcRadius();
36801 var length = gauge.calcBorderLength();
36802 var progress = Math.max(Math.min(value, 1), 0);
36803
36804 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();
36805 };
36806
36807 Gauge.prototype.update = function update (newParams) {
36808 if ( newParams === void 0 ) newParams = {};
36809
36810 var gauge = this;
36811 var params = gauge.params;
36812 var $gaugeSvgEl = gauge.$gaugeSvgEl;
36813
36814 Object.keys(newParams).forEach(function (param) {
36815 if (typeof newParams[param] !== 'undefined') {
36816 params[param] = newParams[param];
36817 }
36818 });
36819 if ($gaugeSvgEl.length === 0) { return gauge; }
36820
36821 var value = params.value;
36822 var size = params.size;
36823 var bgColor = params.bgColor;
36824 var borderBgColor = params.borderBgColor;
36825 var borderColor = params.borderColor;
36826 var borderWidth = params.borderWidth;
36827 var valueText = params.valueText;
36828 var valueTextColor = params.valueTextColor;
36829 var valueFontSize = params.valueFontSize;
36830 var valueFontWeight = params.valueFontWeight;
36831 var labelText = params.labelText;
36832 var labelTextColor = params.labelTextColor;
36833 var labelFontSize = params.labelFontSize;
36834 var labelFontWeight = params.labelFontWeight;
36835
36836 var length = gauge.calcBorderLength();
36837 var progress = Math.max(Math.min(value, 1), 0);
36838 var radius = gauge.calcRadius();
36839 var semiCircle = params.type === 'semicircle';
36840
36841 var svgAttrs = {
36842 width: (size + "px"),
36843 height: ((semiCircle ? size / 2 : size) + "px"),
36844 viewBox: ("0 0 " + size + " " + (semiCircle ? size / 2 : size)),
36845 };
36846 Object.keys(svgAttrs).forEach(function (attr) {
36847 $gaugeSvgEl.attr(attr, svgAttrs[attr]);
36848 });
36849 if (semiCircle) {
36850 var backAttrs = {
36851 d: ("M" + (size - (borderWidth / 2)) + "," + (size / 2) + " a1,1 0 0,0 -" + (size - borderWidth) + ",0"),
36852 stroke: borderBgColor,
36853 'stroke-width': borderWidth,
36854 fill: bgColor || 'none',
36855 };
36856 var frontAttrs = {
36857 d: ("M" + (size - (borderWidth / 2)) + "," + (size / 2) + " a1,1 0 0,0 -" + (size - borderWidth) + ",0"),
36858 stroke: borderColor,
36859 'stroke-width': borderWidth,
36860 'stroke-dasharray': length / 2,
36861 'stroke-dashoffset': (length / 2) * (progress - 1),
36862 fill: borderBgColor ? 'none' : (bgColor || 'none'),
36863 };
36864 Object.keys(backAttrs).forEach(function (attr) {
36865 $gaugeSvgEl.find('.gauge-back-semi').attr(attr, backAttrs[attr]);
36866 });
36867 Object.keys(frontAttrs).forEach(function (attr) {
36868 $gaugeSvgEl.find('.gauge-front-semi').attr(attr, frontAttrs[attr]);
36869 });
36870 } else {
36871 var backAttrs$1 = {
36872 stroke: borderBgColor,
36873 'stroke-width': borderWidth,
36874 fill: bgColor || 'none',
36875 cx: size / 2,
36876 cy: size / 2,
36877 r: radius,
36878 };
36879 var frontAttrs$1 = {
36880 transform: ("rotate(-90 " + (size / 2) + " " + (size / 2) + ")"),
36881 stroke: borderColor,
36882 'stroke-width': borderWidth,
36883 'stroke-dasharray': length,
36884 'stroke-dashoffset': length * (1 - progress),
36885 fill: borderBgColor ? 'none' : bgColor || 'none',
36886 cx: size / 2,
36887 cy: size / 2,
36888 r: radius,
36889 };
36890 Object.keys(backAttrs$1).forEach(function (attr) {
36891 $gaugeSvgEl.find('.gauge-back-circle').attr(attr, backAttrs$1[attr]);
36892 });
36893 Object.keys(frontAttrs$1).forEach(function (attr) {
36894 $gaugeSvgEl.find('.gauge-front-circle').attr(attr, frontAttrs$1[attr]);
36895 });
36896 }
36897 if (valueText) {
36898 if (!$gaugeSvgEl.find('.gauge-value-text').length) {
36899 $gaugeSvgEl.append('<text class="gauge-value-text"></text>');
36900 }
36901 var textAttrs = {
36902 x: '50%',
36903 y: semiCircle ? '100%' : '50%',
36904 'font-weight': valueFontWeight,
36905 'font-size': valueFontSize,
36906 fill: valueTextColor,
36907 dy: semiCircle ? (labelText ? -labelFontSize - 15 : -5) : 0,
36908 'text-anchor': 'middle',
36909 'dominant-baseline': !semiCircle && 'middle',
36910 };
36911 Object.keys(textAttrs).forEach(function (attr) {
36912 $gaugeSvgEl.find('.gauge-value-text').attr(attr, textAttrs[attr]);
36913 });
36914 $gaugeSvgEl.find('.gauge-value-text').text(valueText);
36915 } else {
36916 $gaugeSvgEl.find('.gauge-value-text').remove();
36917 }
36918 if (labelText) {
36919 if (!$gaugeSvgEl.find('.gauge-label-text').length) {
36920 $gaugeSvgEl.append('<text class="gauge-label-text"></text>');
36921 }
36922 var labelAttrs = {
36923 x: '50%',
36924 y: semiCircle ? '100%' : '50%',
36925 'font-weight': labelFontWeight,
36926 'font-size': labelFontSize,
36927 fill: labelTextColor,
36928 dy: semiCircle ? -5 : (valueText ? ((valueFontSize / 2) + 10) : 0),
36929 'text-anchor': 'middle',
36930 'dominant-baseline': !semiCircle && 'middle',
36931 };
36932 Object.keys(labelAttrs).forEach(function (attr) {
36933 $gaugeSvgEl.find('.gauge-label-text').attr(attr, labelAttrs[attr]);
36934 });
36935 $gaugeSvgEl.find('.gauge-label-text').text(labelText);
36936 } else {
36937 $gaugeSvgEl.find('.gauge-label-text').remove();
36938 }
36939 return gauge;
36940 };
36941
36942 Gauge.prototype.init = function init () {
36943 var gauge = this;
36944 var $gaugeSvgEl = $(gauge.render()).eq(0);
36945 $gaugeSvgEl.f7Gauge = gauge;
36946 Utils.extend(gauge, {
36947 $gaugeSvgEl: $gaugeSvgEl,
36948 gaugeSvgEl: $gaugeSvgEl && $gaugeSvgEl[0],
36949 });
36950 gauge.$el.append($gaugeSvgEl);
36951 return gauge;
36952 };
36953
36954 Gauge.prototype.destroy = function destroy () {
36955 var gauge = this;
36956 if (!gauge.$el || gauge.destroyed) { return; }
36957 gauge.$el.trigger('gauge:beforedestroy', gauge);
36958 gauge.emit('local::beforeDestroy gaugeBeforeDestroy', gauge);
36959 gauge.$gaugeSvgEl.remove();
36960 delete gauge.$el[0].f7Gauge;
36961 Utils.deleteProps(gauge);
36962 gauge.destroyed = true;
36963 };
36964
36965 return Gauge;
36966 }(Framework7Class));
36967
36968 var Gauge$1 = {
36969 name: 'gauge',
36970 static: {
36971 Gauge: Gauge,
36972 },
36973 create: function create() {
36974 var app = this;
36975 app.gauge = ConstructorMethods({
36976 defaultSelector: '.gauge',
36977 constructor: Gauge,
36978 app: app,
36979 domProp: 'f7Gauge',
36980 });
36981 app.gauge.update = function update(el, newParams) {
36982 var $el = $(el);
36983 if ($el.length === 0) { return undefined; }
36984 var gauge = app.gauge.get(el);
36985 if (!gauge) { return undefined; }
36986 gauge.update(newParams);
36987 return gauge;
36988 };
36989 },
36990 params: {
36991 gauge: {
36992 el: null,
36993 type: 'circle',
36994 value: 0,
36995 size: 200,
36996 bgColor: 'transparent',
36997 borderBgColor: '#eeeeee',
36998 borderColor: '#000000',
36999 borderWidth: 10,
37000 valueText: null,
37001 valueTextColor: '#000000',
37002 valueFontSize: 31,
37003 valueFontWeight: 500,
37004 labelText: null,
37005 labelTextColor: '#888888',
37006 labelFontSize: 14,
37007 labelFontWeight: 400,
37008 },
37009 },
37010 on: {
37011 tabMounted: function tabMounted(tabEl) {
37012 var app = this;
37013 $(tabEl).find('.gauge-init').each(function (index, el) {
37014 app.gauge.create(Utils.extend({ el: el }, $(el).dataset() || {}));
37015 });
37016 },
37017 tabBeforeRemove: function tabBeforeRemove(tabEl) {
37018 $(tabEl).find('.gauge-init').each(function (index, el) {
37019 if (el.f7Gauge) { el.f7Gauge.destroy(); }
37020 });
37021 },
37022 pageInit: function pageInit(page) {
37023 var app = this;
37024 page.$el.find('.gauge-init').each(function (index, el) {
37025 app.gauge.create(Utils.extend({ el: el }, $(el).dataset() || {}));
37026 });
37027 },
37028 pageBeforeRemove: function pageBeforeRemove(page) {
37029 page.$el.find('.gauge-init').each(function (index, el) {
37030 if (el.f7Gauge) { el.f7Gauge.destroy(); }
37031 });
37032 },
37033 },
37034 vnode: {
37035 'gauge-init': {
37036 insert: function insert(vnode) {
37037 var app = this;
37038 var el = vnode.elm;
37039 app.gauge.create(Utils.extend({ el: el }, $(el).dataset() || {}));
37040 },
37041 destroy: function destroy(vnode) {
37042 var el = vnode.elm;
37043 if (el.f7Gauge) { el.f7Gauge.destroy(); }
37044 },
37045 },
37046 },
37047 };
37048
37049 var Skeleton = {
37050 name: 'skeleton',
37051 };
37052
37053 var Menu = {
37054 open: function open(el) {
37055 if ( el === void 0 ) el = '.menu-item-dropdown';
37056
37057 var app = this;
37058 if (!el) { return; }
37059 var $el = $(el).closest('.menu-item-dropdown');
37060 if (!$el.length) { return; }
5d51ea26
DC
37061 var $menuEl = $el.closest('.menu').eq(0);
37062 if ($menuEl.length) {
37063 var zIndex = $menuEl.css('z-index');
37064 var originalZIndex = $menuEl[0].style.zIndex;
37065 $menuEl.css('z-index', parseInt(zIndex || 0, 0) + 1);
37066 $menuEl[0].f7MenuZIndex = originalZIndex;
37067 }
5309fbda
DC
37068 $el.eq(0).addClass('menu-item-dropdown-opened').trigger('menu:opened');
37069 app.emit('menuOpened', $el.eq(0)[0]);
37070 },
37071 close: function close(el) {
37072 if ( el === void 0 ) el = '.menu-item-dropdown-opened';
37073
37074 var app = this;
37075 if (!el) { return; }
37076 var $el = $(el).closest('.menu-item-dropdown-opened');
37077 if (!$el.length) { return; }
5d51ea26
DC
37078 var $menuEl = $el.closest('.menu').eq(0);
37079 if ($menuEl.length) {
37080 var zIndex = $menuEl[0].f7MenuZIndex;
37081 $menuEl.css('z-index', zIndex);
37082 delete $menuEl[0].f7MenuZIndex;
37083 }
5309fbda
DC
37084 $el.eq(0).removeClass('menu-item-dropdown-opened').trigger('menu:closed');
37085 app.emit('menuClosed', $el.eq(0)[0]);
37086 },
37087 };
37088
37089 var Menu$1 = {
37090 name: 'menu',
37091 create: function create() {
37092 var app = this;
37093 app.menu = {
37094 open: Menu.open.bind(app),
37095 close: Menu.close.bind(app),
37096 };
37097 },
37098 on: {
37099 click: function click(e) {
37100 var app = this;
37101 var openedMenus = $('.menu-item-dropdown-opened');
37102 if (!openedMenus.length) { return; }
37103 openedMenus.each(function (index, el) {
37104 if (!$(e.target).closest('.menu-item-dropdown-opened').length) {
37105 app.menu.close(el);
37106 }
37107 });
37108 },
37109 },
37110 clicks: {
37111 '.menu-item-dropdown': function onClick($clickedEl, dataset, e) {
37112 var app = this;
37113 if ($clickedEl.hasClass('menu-item-dropdown-opened')) {
37114 if ($(e.target).closest('.menu-dropdown').length) { return; }
37115 app.menu.close($clickedEl);
37116 } else {
37117 app.menu.open($clickedEl);
37118 }
37119 },
37120 '.menu-close': function onClick() {
37121 var app = this;
37122 app.menu.close();
37123 },
37124 },
37125 };
37126
5d51ea26
DC
37127 var moduleAlphaSlider = {
37128 render: function render(self) {
37129 var ref = self.params;
37130 var sliderLabel = ref.sliderLabel;
37131 var sliderValue = ref.sliderValue;
37132 var sliderValueEditable = ref.sliderValueEditable;
37133 var alphaLabelText = ref.alphaLabelText;
37134 return ("\n <div class=\"color-picker-module color-picker-module-alpha-slider\">\n <div class=\"color-picker-slider-wrap\">\n " + (sliderLabel ? ("\n <div class=\"color-picker-slider-label\">" + alphaLabelText + "</div>\n ") : '') + "\n <div class=\"range-slider color-picker-slider color-picker-slider-alpha\"></div>\n " + (sliderValue ? ("\n <div class=\"color-picker-slider-value\">\n " + (sliderValueEditable ? "\n <input type=\"number\" step=\"0.01\" min=\"0\" max=\"1\" class=\"color-picker-value-alpha\">\n " : "\n <span class=\"color-picker-value-alpha\"></span>\n ") + "\n </div>\n ") : '') + "\n </div>\n </div>\n ");
37135 },
37136 init: function init(self) {
37137 self.alphaRangeSlider = self.app.range.create({
37138 el: self.$el.find('.color-picker-slider-alpha'),
37139 min: 0,
37140 max: 1,
37141 step: 0.01,
37142 value: 1,
37143 on: {
37144 change: function change(range, value) {
37145 var alpha = Math.floor(value * 100) / 100;
37146 self.setValue({ alpha: alpha });
37147 },
37148 },
37149 });
37150 function handleInputChange(e) {
37151 var alpha = self.value.alpha;
37152 var value = parseFloat(e.target.value);
37153 if (Number.isNaN(value)) {
37154 e.target.value = alpha;
37155 return;
37156 }
37157 value = Math.max(0, Math.min(1, value));
37158 self.setValue({ alpha: value });
37159 }
37160
37161 self.$el.on('change', '.color-picker-module-alpha-slider input', handleInputChange);
37162
37163 self.destroyAlphaSliderEvents = function destroyAlphaSliderEvents() {
37164 self.$el.off('change', '.color-picker-module-alpha-slider input', handleInputChange);
37165 };
37166 },
37167 update: function update(self) {
37168 var value = self.value;
37169 var ref = self.params;
37170 var sliderValue = ref.sliderValue;
37171 var sliderValueEditable = ref.sliderValueEditable;
37172
37173 var alpha = value.alpha;
37174 self.alphaRangeSlider.value = alpha;
37175 self.alphaRangeSlider.layout();
37176 if (sliderValue && sliderValueEditable) {
37177 self.$el.find('input.color-picker-value-alpha').val(alpha);
37178 } else {
37179 self.$el.find('span.color-picker-value-alpha').text(alpha);
37180 }
37181 },
37182 destroy: function destroy(self) {
37183 if (self.alphaRangeSlider && self.alphaRangeSlider.destroy) {
37184 self.alphaRangeSlider.destroy();
37185 }
37186 delete self.alphaRangeSlider;
37187
37188 if (self.destroyAlphaSliderEvents) { self.destroyAlphaSliderEvents(); }
37189 delete self.destroyAlphaSliderEvents;
37190 },
37191 };
37192
37193 var moduleCurrentColor = {
37194 render: function render() {
37195 return "\n <div class=\"color-picker-module color-picker-module-current-color\">\n <div class=\"color-picker-current-color\"></div>\n </div>\n ";
37196 },
37197 update: function update(self) {
37198 self.$el.find('.color-picker-module-current-color .color-picker-current-color').css(
37199 'background-color',
37200 self.value.hex
37201 );
37202 },
37203 };
37204
37205 var moduleHex = {
37206 render: function render(self) {
37207 var ref = self.params;
37208 var hexLabel = ref.hexLabel;
37209 var hexLabelText = ref.hexLabelText;
37210 var hexValueEditable = ref.hexValueEditable;
37211 return ("\n <div class=\"color-picker-module color-picker-module-hex\">\n <div class=\"color-picker-hex-wrap\">\n " + (hexLabel ? ("\n <div class=\"color-picker-hex-label\">" + hexLabelText + "</div>\n ") : '') + "\n <div class=\"color-picker-hex-value\">\n " + (hexValueEditable ? "\n <input type=\"text\" class=\"color-picker-value-hex\">\n " : "\n <span class=\"color-picker-value-hex\"></span>\n ") + "\n </div>\n </div>\n </div>\n ");
37212 },
37213 init: function init(self) {
37214 function handleInputChange(e) {
37215 var hex = self.value.hex;
37216 var value = e.target.value.replace(/#/g, '');
37217 if (Number.isNaN(value) || !value || (value.length !== 3 && value.length !== 6)) {
37218 e.target.value = hex;
37219 return;
37220 }
37221 var min = 0;
37222 var current = parseInt(value, 16);
37223 var max = parseInt('ffffff', 16); // eslint-disable-line
37224 if (current > max) {
37225 value = 'fff';
37226 }
37227 if (current < min) {
37228 value = '000';
37229 }
37230 self.setValue({ hex: value });
37231 }
37232
37233 self.$el.on('change', '.color-picker-module-hex input', handleInputChange);
37234
37235 self.destroyHexEvents = function destroyHexEvents() {
37236 self.$el.off('change', '.color-picker-module-hex input', handleInputChange);
37237 };
37238 },
37239 update: function update(self) {
37240 var value = self.value;
37241
37242 var ref = self.params;
37243 var hexValueEditable = ref.hexValueEditable;
37244
37245 var hex = value.hex;
37246 if (hexValueEditable) {
37247 self.$el.find('input.color-picker-value-hex').val(hex);
37248 } else {
37249 self.$el.find('span.color-picker-value-hex').text(hex);
37250 }
37251 },
37252 destroy: function destroy(self) {
37253 if (self.destroyHexEvents) { self.destroyHexEvents(); }
37254 delete self.destroyHexEvents;
37255 },
37256 };
37257
37258 var moduleHsbSliders = {
37259 render: function render(self) {
37260 var ref = self.params;
37261 var sliderLabel = ref.sliderLabel;
37262 var sliderValue = ref.sliderValue;
37263 var sliderValueEditable = ref.sliderValueEditable;
37264 var hueLabelText = ref.hueLabelText;
37265 var saturationLabelText = ref.saturationLabelText;
37266 var brightnessLabelText = ref.brightnessLabelText;
37267 return ("\n <div class=\"color-picker-module color-picker-module-hsb-sliders\">\n <div class=\"color-picker-slider-wrap\">\n " + (sliderLabel ? ("\n <div class=\"color-picker-slider-label\">" + hueLabelText + "</div>\n ") : '') + "\n <div class=\"range-slider color-picker-slider color-picker-slider-hue\"></div>\n " + (sliderValue ? ("\n <div class=\"color-picker-slider-value\">\n " + (sliderValueEditable ? "\n <input type=\"number\" step=\"0.1\" min=\"0\" max=\"360\" class=\"color-picker-value-hue\" data-color-index=\"0\">\n " : "\n <span class=\"color-picker-value-hue\"></span>\n ") + "\n </div>\n ") : '') + "\n </div>\n <div class=\"color-picker-slider-wrap\">\n " + (sliderLabel ? ("\n <div class=\"color-picker-slider-label\">" + saturationLabelText + "</div>\n ") : '') + "\n <div class=\"range-slider color-picker-slider color-picker-slider-saturation\"></div>\n " + (sliderValue ? ("\n <div class=\"color-picker-slider-value\">\n " + (sliderValueEditable ? "\n <input type=\"number\" step=\"0.1\" min=\"0\" max=\"100\" class=\"color-picker-value-saturation\" data-color-index=\"1\">\n " : "\n <span class=\"color-picker-value-saturation\"></span>\n ") + "\n </div>\n ") : '') + "\n </div>\n <div class=\"color-picker-slider-wrap\">\n " + (sliderLabel ? ("\n <div class=\"color-picker-slider-label\">" + brightnessLabelText + "</div>\n ") : '') + "\n <div class=\"range-slider color-picker-slider color-picker-slider-brightness\"></div>\n " + (sliderValue ? ("\n <div class=\"color-picker-slider-value\">\n " + (sliderValueEditable ? "\n <input type=\"number\" step=\"0.1\" min=\"0\" max=\"100\" class=\"color-picker-value-brightness\" data-color-index=\"2\">\n " : "\n <span class=\"color-picker-value-brightness\"></span>\n ") + "\n </div>\n ") : '') + "\n </div>\n </div>\n ");
37268 },
37269 init: function init(self) {
37270 self.hueRangeSlider = self.app.range.create({
37271 el: self.$el.find('.color-picker-slider-hue'),
37272 min: 0,
37273 max: 360,
37274 step: 0.1,
37275 value: 0,
37276 on: {
37277 change: function change(range, value) {
37278 self.setValue({ hue: value });
37279 },
37280 },
37281 });
37282 self.saturationRangeSlider = self.app.range.create({
37283 el: self.$el.find('.color-picker-slider-saturation'),
37284 min: 0,
37285 max: 1,
37286 step: 0.001,
37287 value: 0,
37288 on: {
37289 change: function change(range, value) {
37290 var s = Math.floor(value * 1000) / 1000;
37291 self.setValue({ hsb: [self.value.hsb[0], s, self.value.hsb[2]] });
37292 },
37293 },
37294 });
37295 self.brightnessRangeSlider = self.app.range.create({
37296 el: self.$el.find('.color-picker-slider-brightness'),
37297 min: 0,
37298 max: 1,
37299 step: 0.001,
37300 value: 0,
37301 on: {
37302 change: function change(range, value) {
37303 var b = Math.floor(value * 1000) / 1000;
37304 self.setValue({ hsb: [self.value.hsb[0], self.value.hsb[1], b] });
37305 },
37306 },
37307 });
37308
37309 function handleInputChange(e) {
37310 var hsb = [].concat( self.value.hsb );
37311 var index = parseInt($(e.target).attr('data-color-index'), 10);
37312 var value = parseFloat(e.target.value);
37313 if (Number.isNaN(value)) {
37314 e.target.value = hsb[index];
37315 return;
37316 }
37317 if (index === 0) {
37318 value = Math.max(0, Math.min(360, value));
37319 } else {
37320 value = Math.max(0, Math.min(100, value)) / 100;
37321 }
37322
37323 hsb[index] = value;
37324 self.setValue({ hsb: hsb });
37325 }
37326
37327 self.$el.on('change', '.color-picker-module-hsb-sliders input', handleInputChange);
37328
37329 self.destroyHsbSlidersEvents = function destroyHsbSlidersEvents() {
37330 self.$el.off('change', '.color-picker-module-hsb-sliders input', handleInputChange);
37331 };
37332 },
37333 update: function update(self) {
37334 var app = self.app;
37335 var value = self.value;
37336 var ref = self.params;
37337 var sliderValue = ref.sliderValue;
37338 var sliderValueEditable = ref.sliderValueEditable;
37339
37340 var hsb = value.hsb;
37341 var hue = value.hue;
37342
37343 self.hueRangeSlider.value = hue;
37344 self.saturationRangeSlider.value = hsb[1];
37345 self.brightnessRangeSlider.value = hsb[2];
37346
37347 self.hueRangeSlider.layout();
37348 self.saturationRangeSlider.layout();
37349 self.brightnessRangeSlider.layout();
37350
37351 var hslCurrent = Utils.colorHsbToHsl(hsb[0], hsb[1], 1);
37352 var hslLeft = Utils.colorHsbToHsl(hsb[0], 0, 1);
37353 var hslRight = Utils.colorHsbToHsl(hsb[0], 1, 1);
37354 var brightness = hsb[2];
37355
37356 self.hueRangeSlider.$el[0].style.setProperty(
37357 '--f7-range-knob-color',
37358 ("hsl(" + hue + ", 100%, 50%)")
37359 );
37360 self.saturationRangeSlider.$el[0].style.setProperty(
37361 '--f7-range-knob-color',
37362 ("hsl(" + (hslCurrent[0]) + ", " + (hslCurrent[1] * 100) + "%, " + (hslCurrent[2] * 100) + "%)")
37363 );
37364 self.brightnessRangeSlider.$el[0].style.setProperty(
37365 '--f7-range-knob-color',
37366 ("rgb(" + (brightness * 255) + ", " + (brightness * 255) + ", " + (brightness * 255) + ")")
37367 );
37368 self.saturationRangeSlider.$el.find('.range-bar').css(
37369 'background-image',
37370 ("linear-gradient(" + (app.rtl ? 'to left' : 'to right') + ", hsl(" + (hslLeft[0]) + ", " + (hslLeft[1] * 100) + "%, " + (hslLeft[2] * 100) + "%), hsl(" + (hslRight[0]) + ", " + (hslRight[1] * 100) + "%, " + (hslRight[2] * 100) + "%))")
37371 );
37372
37373 if (sliderValue && sliderValueEditable) {
37374 self.$el.find('input.color-picker-value-hue').val(("" + hue));
37375 self.$el.find('input.color-picker-value-saturation').val(("" + (hsb[1] * 1000 / 10)));
37376 self.$el.find('input.color-picker-value-brightness').val(("" + (hsb[2] * 1000 / 10)));
37377 } else if (sliderValue) {
37378 self.$el.find('span.color-picker-value-hue').text(("" + hue));
37379 self.$el.find('span.color-picker-value-saturation').text(("" + (hsb[1] * 1000 / 10)));
37380 self.$el.find('span.color-picker-value-brightness').text(("" + (hsb[2] * 1000 / 10)));
37381 }
37382 },
37383 destroy: function destroy(self) {
37384 if (self.hueRangeSlider && self.hueRangeSlider.destroy) {
37385 self.hueRangeSlider.destroy();
37386 }
37387 if (self.saturationRangeSlider && self.saturationRangeSlider.destroy) {
37388 self.saturationRangeSlider.destroy();
37389 }
37390 if (self.brightnessRangeSlider && self.brightnessRangeSlider.destroy) {
37391 self.brightnessRangeSlider.destroy();
37392 }
37393
37394 delete self.hueRangeSlider;
37395 delete self.saturationRangeSlider;
37396 delete self.brightnessRangeSlider;
37397
37398 if (self.destroyHsbSlidersEvents) { self.destroyHsbSlidersEvents(); }
37399 delete self.destroyHsbSlidersEvents;
37400 },
37401 };
37402
37403 var moduleHueSlider = {
37404 render: function render(self) {
37405 var ref = self.params;
37406 var sliderLabel = ref.sliderLabel;
37407 var sliderValue = ref.sliderValue;
37408 var sliderValueEditable = ref.sliderValueEditable;
37409 var hueLabelText = ref.hueLabelText;
37410 return ("\n <div class=\"color-picker-module color-picker-module-hue-slider\">\n <div class=\"color-picker-slider-wrap\">\n " + (sliderLabel ? ("\n <div class=\"color-picker-slider-label\">" + hueLabelText + "</div>\n ") : '') + "\n <div class=\"range-slider color-picker-slider color-picker-slider-hue\"></div>\n " + (sliderValue ? ("\n <div class=\"color-picker-slider-value\">\n " + (sliderValueEditable ? "\n <input type=\"number\" step=\"0.1\" min=\"0\" max=\"360\" class=\"color-picker-value-hue\">\n " : "\n <span class=\"color-picker-value-hue\"></span>\n ") + "\n </div>\n ") : '') + "\n </div>\n </div>\n ");
37411 },
37412 init: function init(self) {
37413 self.hueRangeSlider = self.app.range.create({
37414 el: self.$el.find('.color-picker-slider-hue'),
37415 min: 0,
37416 max: 360,
37417 step: 0.1,
37418 value: 0,
37419 on: {
37420 change: function change(range, value) {
37421 self.setValue({ hue: value });
37422 },
37423 },
37424 });
37425 },
37426 update: function update(self) {
37427 var value = self.value;
37428 var ref = self.params;
37429 var sliderValue = ref.sliderValue;
37430 var sliderValueEditable = ref.sliderValueEditable;
37431
37432 var hue = value.hue;
37433
37434 self.hueRangeSlider.value = hue;
37435 self.hueRangeSlider.layout();
37436 self.hueRangeSlider.$el[0].style.setProperty(
37437 '--f7-range-knob-color',
37438 ("hsl(" + hue + ", 100%, 50%)")
37439 );
37440 if (sliderValue && sliderValueEditable) {
37441 self.$el.find('input.color-picker-value-hue').val(("" + hue));
37442 } else if (sliderValue) {
37443 self.$el.find('span.color-picker-value-hue').text(("" + hue));
37444 }
37445 },
37446 destroy: function destroy(self) {
37447 if (self.hueRangeSlider && self.hueRangeSlider.destroy) {
37448 self.hueRangeSlider.destroy();
37449 }
37450 delete self.hueRangeSlider;
37451 },
37452 };
37453
37454 var moduleBrightnessSlider = {
37455 render: function render(self) {
37456 var ref = self.params;
37457 var sliderLabel = ref.sliderLabel;
37458 var sliderValue = ref.sliderValue;
37459 var sliderValueEditable = ref.sliderValueEditable;
37460 var brightnessLabelText = ref.brightnessLabelText;
37461 return ("\n <div class=\"color-picker-module color-picker-module-brightness-slider\">\n <div class=\"color-picker-slider-wrap\">\n " + (sliderLabel ? ("\n <div class=\"color-picker-slider-label\">" + brightnessLabelText + "</div>\n ") : '') + "\n <div class=\"range-slider color-picker-slider color-picker-slider-brightness\"></div>\n " + (sliderValue ? ("\n <div class=\"color-picker-slider-value\">\n " + (sliderValueEditable ? "\n <input type=\"number\" step=\"0.1\" min=\"0\" max=\"100\" class=\"color-picker-value-brightness\">\n " : "\n <span class=\"color-picker-value-brightness\"></span>\n ") + "\n </div>\n ") : '') + "\n </div>\n </div>\n ");
37462 },
37463 init: function init(self) {
37464 self.brightnessRangeSlider = self.app.range.create({
37465 el: self.$el.find('.color-picker-slider-brightness'),
37466 min: 0,
37467 max: 1,
37468 step: 0.001,
37469 value: 0,
37470 on: {
37471 change: function change(range, value) {
37472 var b = Math.floor(value * 1000) / 1000;
37473 self.setValue({ hsb: [self.value.hsb[0], self.value.hsb[1], b] });
37474 },
37475 },
37476 });
37477 },
37478 update: function update(self) {
37479 var value = self.value;
37480 var app = self.app;
37481 var ref = self.params;
37482 var sliderValue = ref.sliderValue;
37483 var sliderValueEditable = ref.sliderValueEditable;
37484
37485 var hsb = value.hsb;
37486
37487 self.brightnessRangeSlider.value = hsb[2];
37488 self.brightnessRangeSlider.layout();
37489
37490 var hslCurrent = Utils.colorHsbToHsl(hsb[0], hsb[1], hsb[2]);
37491 var hslLeft = Utils.colorHsbToHsl(hsb[0], hsb[1], 0);
37492 var hslRight = Utils.colorHsbToHsl(hsb[0], hsb[1], 1);
37493
37494 self.brightnessRangeSlider.$el[0].style.setProperty(
37495 '--f7-range-knob-color',
37496 ("hsl(" + (hslCurrent[0]) + ", " + (hslCurrent[1] * 100) + "%, " + (hslCurrent[2] * 100) + "%)")
37497 );
37498 self.brightnessRangeSlider.$el.find('.range-bar').css(
37499 'background-image',
37500 ("linear-gradient(" + (app.rtl ? 'to left' : 'to right') + ", hsl(" + (hslLeft[0]) + ", " + (hslLeft[1] * 100) + "%, " + (hslLeft[2] * 100) + "%), hsl(" + (hslRight[0]) + ", " + (hslRight[1] * 100) + "%, " + (hslRight[2] * 100) + "%))")
37501 );
37502 if (sliderValue && sliderValueEditable) {
37503 self.$el.find('input.color-picker-value-brightness').val(("" + (hsb[2] * 1000 / 10)));
37504 } else if (sliderValue) {
37505 self.$el.find('span.color-picker-value-brightness').text(("" + (hsb[2] * 1000 / 10)));
37506 }
37507 },
37508 destroy: function destroy(self) {
37509 if (self.brightnessRangeSlider && self.brightnessRangeSlider.destroy) {
37510 self.brightnessRangeSlider.destroy();
37511 }
37512 delete self.brightnessRangeSlider;
37513 },
37514 };
37515
37516 /* eslint indent: ["off"] */
37517
37518 var modulePalette = {
37519 render: function render(self) {
37520 return ("\n <div class=\"color-picker-module color-picker-module-palette\">\n <div class=\"color-picker-palette\">\n " + (self.params.palette.map(function (p) {
37521 if (Array.isArray(p)) {
37522 var row = '<div class="color-picker-palette-row">';
37523 row += p.map(function (c) { return ("\n <div class=\"color-picker-palette-value\" data-palette-color=\"" + c + "\" style=\"background-color: " + c + "\"></div>\n "); }).join('');
37524 row += '</div>';
37525 return row;
37526 }
37527 return ("\n <div class=\"color-picker-palette-value\" data-palette-color=\"" + p + "\" style=\"background-color: " + p + "\"></div>\n ");
37528 }).join('')) + "\n </div>\n </div>\n ");
37529 },
37530 init: function init(self) {
37531 function handlePaletteClick(e) {
37532 var hex = $(e.target).attr('data-palette-color');
37533 self.setValue({
37534 hex: hex,
37535 });
37536 }
37537
37538 self.$el.on('click', '.color-picker-module-palette .color-picker-palette-value', handlePaletteClick);
37539
37540 self.destroyPaletteEvents = function destroyPaletteEvents() {
37541 self.$el.off('click', '.color-picker-module-hex input', handlePaletteClick);
37542 };
37543 },
37544 destroy: function destroy(self) {
37545 if (self.destroyPaletteEvents) {
37546 self.destroyPaletteEvents();
37547 }
37548 delete self.destroyPaletteEvents;
37549 },
37550 };
37551
37552 var moduleInitialCurrentColors = {
37553 render: function render() {
37554 return "\n <div class=\"color-picker-module color-picker-module-initial-current-colors\">\n <div class=\"color-picker-initial-current-colors\">\n <div class=\"color-picker-initial-color\"></div>\n <div class=\"color-picker-current-color\"></div>\n </div>\n </div>\n ";
37555 },
37556 init: function init(self) {
37557 function handleInitialColorClick() {
37558 if (self.initialValue) {
37559 var ref = self.initialValue;
37560 var hex = ref.hex;
37561 var alpha = ref.alpha;
37562 self.setValue({
37563 hex: hex,
37564 alpha: alpha,
37565 });
37566 }
37567 }
37568 self.$el.on('click', '.color-picker-initial-color', handleInitialColorClick);
37569 self.destroyInitialCurrentEvents = function destroyInitialCurrentEvents() {
37570 self.$el.off('click', '.color-picker-initial-color', handleInitialColorClick);
37571 };
37572 },
37573 update: function update(self) {
37574 self.$el.find('.color-picker-module-initial-current-colors .color-picker-initial-color').css(
37575 'background-color',
37576 self.initialValue.hex
37577 );
37578 self.$el.find('.color-picker-module-initial-current-colors .color-picker-current-color').css(
37579 'background-color',
37580 self.value.hex
37581 );
37582 },
37583 destroy: function destroy(self) {
37584 if (self.destroyInitialCurrentEvents) {
37585 self.destroyInitialCurrentEvents();
37586 }
37587 delete self.destroyInitialCurrentEvents;
37588 },
37589 };
37590
37591 var moduleRgbBars = {
37592 render: function render(self) {
37593 var ref = self.params;
37594 var barLabel = ref.barLabel;
37595 var barValue = ref.barValue;
37596 var barValueEditable = ref.barValueEditable;
37597 var redLabelText = ref.redLabelText;
37598 var greenLabelText = ref.greenLabelText;
37599 var blueLabelText = ref.blueLabelText;
37600 return ("\n <div class=\"color-picker-module color-picker-module-rgb-bars\">\n <div class=\"color-picker-bar-wrap\">\n " + (barLabel ? ("\n <div class=\"color-picker-bar-label\">" + redLabelText + "</div>\n ") : '') + "\n <div class=\"range-slider color-picker-bar color-picker-bar-red\"></div>\n " + (barValue ? ("\n <div class=\"color-picker-bar-value\">\n " + (barValueEditable ? "\n <input type=\"number\" step=\"1\" min=\"0\" max=\"255\" class=\"color-picker-value-bar-red\" data-color-index=\"0\">\n " : "\n <span class=\"color-picker-value-bar-red\"></span>\n ") + "\n </div>\n ") : '') + "\n </div>\n <div class=\"color-picker-bar-wrap\">\n " + (barLabel ? ("\n <div class=\"color-picker-bar-label\">" + greenLabelText + "</div>\n ") : '') + "\n <div class=\"range-slider color-picker-bar color-picker-bar-green\"></div>\n " + (barValue ? ("\n <div class=\"color-picker-bar-value\">\n " + (barValueEditable ? "\n <input type=\"number\" step=\"1\" min=\"0\" max=\"255\" class=\"color-picker-value-bar-green\" data-color-index=\"1\">\n " : "\n <span class=\"color-picker-value-bar-green\"></span>\n ") + "\n </div>\n ") : '') + "\n </div>\n <div class=\"color-picker-bar-wrap\">\n " + (barLabel ? ("\n <div class=\"color-picker-bar-label\">" + blueLabelText + "</div>\n ") : '') + "\n <div class=\"range-slider color-picker-bar color-picker-bar-blue\"></div>\n " + (barValue ? ("\n <div class=\"color-picker-bar-value\">\n " + (barValueEditable ? "\n <input type=\"number\" step=\"1\" min=\"0\" max=\"255\" class=\"color-picker-value-bar-blue\" data-color-index=\"2\">\n " : "\n <span class=\"color-picker-value-bar-blue\"></span>\n ") + "\n </div>\n ") : '') + "\n </div>\n </div>\n ");
37601 },
37602 init: function init(self) {
37603 self.redBar = self.app.range.create({
37604 el: self.$el.find('.color-picker-bar-red'),
37605 min: 0,
37606 max: 255,
37607 step: 1,
37608 value: 0,
37609 vertical: true,
37610 on: {
37611 change: function change(range, value) {
37612 self.setValue({ rgb: [value, self.value.rgb[1], self.value.rgb[2]] });
37613 },
37614 },
37615 });
37616 self.greenBar = self.app.range.create({
37617 el: self.$el.find('.color-picker-bar-green'),
37618 min: 0,
37619 max: 255,
37620 step: 1,
37621 value: 0,
37622 vertical: true,
37623 on: {
37624 change: function change(range, value) {
37625 self.setValue({ rgb: [self.value.rgb[0], value, self.value.rgb[2]] });
37626 },
37627 },
37628 });
37629 self.blueBar = self.app.range.create({
37630 el: self.$el.find('.color-picker-bar-blue'),
37631 min: 0,
37632 max: 255,
37633 step: 1,
37634 value: 0,
37635 vertical: true,
37636 on: {
37637 change: function change(range, value) {
37638 self.setValue({ rgb: [self.value.rgb[0], self.value.rgb[1], value] });
37639 },
37640 },
37641 });
37642
37643 function handleInputChange(e) {
37644 var rgb = [].concat( self.value.rgb );
37645 var index = parseInt($(e.target).attr('data-color-index'), 10);
37646 var value = parseInt(e.target.value, 10);
37647 if (Number.isNaN(value)) {
37648 e.target.value = rgb[index];
37649 return;
37650 }
37651 value = Math.max(0, Math.min(255, value));
37652 rgb[index] = value;
37653 self.setValue({ rgb: rgb });
37654 }
37655
37656 self.$el.on('change', '.color-picker-module-rgb-bars input', handleInputChange);
37657
37658 self.destroyRgbBarsEvents = function destroyRgbBarsEvents() {
37659 self.$el.off('change', '.color-picker-module-rgb-bars input', handleInputChange);
37660 };
37661 },
37662 update: function update(self) {
37663 var value = self.value;
37664 var redBar = self.redBar;
37665 var greenBar = self.greenBar;
37666 var blueBar = self.blueBar;
37667
37668 var ref = self.params;
37669 var barValue = ref.barValue;
37670 var barValueEditable = ref.barValueEditable;
37671
37672 var rgb = value.rgb;
37673
37674 redBar.value = rgb[0];
37675 greenBar.value = rgb[1];
37676 blueBar.value = rgb[2];
37677
37678 redBar.layout();
37679 greenBar.layout();
37680 blueBar.layout();
37681
37682 redBar.$el.find('.range-bar').css('background-image', ("linear-gradient(to top, rgb(0, " + (rgb[1]) + ", " + (rgb[2]) + "), rgb(255, " + (rgb[1]) + ", " + (rgb[2]) + "))"));
37683 greenBar.$el.find('.range-bar').css('background-image', ("linear-gradient(to top, rgb(" + (rgb[0]) + ", 0, " + (rgb[2]) + "), rgb(" + (rgb[0]) + ", 255, " + (rgb[2]) + "))"));
37684 blueBar.$el.find('.range-bar').css('background-image', ("linear-gradient(to top, rgb(" + (rgb[0]) + ", " + (rgb[1]) + ", 0), rgb(" + (rgb[0]) + ", " + (rgb[1]) + ", 255))"));
37685
37686 if (barValue && barValueEditable) {
37687 self.$el.find('input.color-picker-value-bar-red').val(rgb[0]);
37688 self.$el.find('input.color-picker-value-bar-green').val(rgb[1]);
37689 self.$el.find('input.color-picker-value-bar-blue').val(rgb[2]);
37690 } else if (barValue) {
37691 self.$el.find('span.color-picker-value-bar-red').text(rgb[0]);
37692 self.$el.find('span.color-picker-value-bar-green').text(rgb[1]);
37693 self.$el.find('span.color-picker-value-bar-blue').text(rgb[2]);
37694 }
37695 },
37696 destroy: function destroy(self) {
37697 if (self.redBar && self.redBar.destroy) {
37698 self.redBar.destroy();
37699 }
37700 if (self.greenBar && self.greenBar.destroy) {
37701 self.greenBar.destroy();
37702 }
37703 if (self.blueBar && self.blueBar.destroy) {
37704 self.blueBar.destroy();
37705 }
37706
37707 delete self.redBar;
37708 delete self.greenBar;
37709 delete self.blueBar;
37710
37711 if (self.destroyRgbBarsEvents) { self.destroyRgbBarsEvents(); }
37712 delete self.destroyRgbBarsEvents;
37713 },
37714 };
37715
37716 var moduleRgbSliders = {
37717 render: function render(self) {
37718 var ref = self.params;
37719 var sliderLabel = ref.sliderLabel;
37720 var sliderValue = ref.sliderValue;
37721 var sliderValueEditable = ref.sliderValueEditable;
37722 var redLabelText = ref.redLabelText;
37723 var greenLabelText = ref.greenLabelText;
37724 var blueLabelText = ref.blueLabelText;
37725 return ("\n <div class=\"color-picker-module color-picker-module-rgb-sliders\">\n <div class=\"color-picker-slider-wrap\">\n " + (sliderLabel ? ("\n <div class=\"color-picker-slider-label\">" + redLabelText + "</div>\n ") : '') + "\n <div class=\"range-slider color-picker-slider color-picker-slider-red\"></div>\n " + (sliderValue ? ("\n <div class=\"color-picker-slider-value\">\n " + (sliderValueEditable ? "\n <input type=\"number\" step=\"1\" min=\"0\" max=\"255\" class=\"color-picker-value-red\" data-color-index=\"0\">\n " : "\n <span class=\"color-picker-value-red\"></span>\n ") + "\n </div>\n ") : '') + "\n </div>\n <div class=\"color-picker-slider-wrap\">\n " + (sliderLabel ? ("\n <div class=\"color-picker-slider-label\">" + greenLabelText + "</div>\n ") : '') + "\n <div class=\"range-slider color-picker-slider color-picker-slider-green\"></div>\n " + (sliderValue ? ("\n <div class=\"color-picker-slider-value\">\n " + (sliderValueEditable ? "\n <input type=\"number\" step=\"1\" min=\"0\" max=\"255\" class=\"color-picker-value-green\" data-color-index=\"1\">\n " : "\n <span class=\"color-picker-value-green\"></span>\n ") + "\n </div>\n ") : '') + "\n </div>\n <div class=\"color-picker-slider-wrap\">\n " + (sliderLabel ? ("\n <div class=\"color-picker-slider-label\">" + blueLabelText + "</div>\n ") : '') + "\n <div class=\"range-slider color-picker-slider color-picker-slider-blue\"></div>\n " + (sliderValue ? ("\n <div class=\"color-picker-slider-value\">\n " + (sliderValueEditable ? "\n <input type=\"number\" step=\"1\" min=\"0\" max=\"255\" class=\"color-picker-value-blue\" data-color-index=\"2\">\n " : "\n <span class=\"color-picker-value-blue\"></span>\n ") + "\n </div>\n ") : '') + "\n </div>\n </div>\n ");
37726 },
37727 init: function init(self) {
37728 self.redRangeSlider = self.app.range.create({
37729 el: self.$el.find('.color-picker-slider-red'),
37730 min: 0,
37731 max: 255,
37732 step: 1,
37733 value: 0,
37734 on: {
37735 change: function change(range, value) {
37736 self.setValue({ rgb: [value, self.value.rgb[1], self.value.rgb[2]] });
37737 },
37738 },
37739 });
37740 self.greenRangeSlider = self.app.range.create({
37741 el: self.$el.find('.color-picker-slider-green'),
37742 min: 0,
37743 max: 255,
37744 step: 1,
37745 value: 0,
37746 on: {
37747 change: function change(range, value) {
37748 self.setValue({ rgb: [self.value.rgb[0], value, self.value.rgb[2]] });
37749 },
37750 },
37751 });
37752 self.blueRangeSlider = self.app.range.create({
37753 el: self.$el.find('.color-picker-slider-blue'),
37754 min: 0,
37755 max: 255,
37756 step: 1,
37757 value: 0,
37758 on: {
37759 change: function change(range, value) {
37760 self.setValue({ rgb: [self.value.rgb[0], self.value.rgb[1], value] });
37761 },
37762 },
37763 });
37764
37765 function handleInputChange(e) {
37766 var rgb = [].concat( self.value.rgb );
37767 var index = parseInt($(e.target).attr('data-color-index'), 10);
37768 var value = parseInt(e.target.value, 10);
37769 if (Number.isNaN(value)) {
37770 e.target.value = rgb[index];
37771 return;
37772 }
37773 value = Math.max(0, Math.min(255, value));
37774 rgb[index] = value;
37775 self.setValue({ rgb: rgb });
37776 }
37777
37778 self.$el.on('change', '.color-picker-module-rgb-sliders input', handleInputChange);
37779
37780 self.destroyRgbSlidersEvents = function destroyRgbSlidersEvents() {
37781 self.$el.off('change', '.color-picker-module-rgb-sliders input', handleInputChange);
37782 };
37783 },
37784 update: function update(self) {
37785 var app = self.app;
37786 var value = self.value;
37787 var redRangeSlider = self.redRangeSlider;
37788 var greenRangeSlider = self.greenRangeSlider;
37789 var blueRangeSlider = self.blueRangeSlider;
37790
37791 var ref = self.params;
37792 var sliderValue = ref.sliderValue;
37793 var sliderValueEditable = ref.sliderValueEditable;
37794
37795 var rgb = value.rgb;
37796
37797 redRangeSlider.value = rgb[0];
37798 greenRangeSlider.value = rgb[1];
37799 blueRangeSlider.value = rgb[2];
37800
37801 redRangeSlider.layout();
37802 greenRangeSlider.layout();
37803 blueRangeSlider.layout();
37804
37805 redRangeSlider.$el[0].style.setProperty('--f7-range-knob-color', ("rgb(" + (rgb[0]) + ", " + (rgb[1]) + ", " + (rgb[2]) + ")"));
37806 greenRangeSlider.$el[0].style.setProperty('--f7-range-knob-color', ("rgb(" + (rgb[0]) + ", " + (rgb[1]) + ", " + (rgb[2]) + ")"));
37807 blueRangeSlider.$el[0].style.setProperty('--f7-range-knob-color', ("rgb(" + (rgb[0]) + ", " + (rgb[1]) + ", " + (rgb[2]) + ")"));
37808
37809 var direction = app.rtl ? 'to left' : 'to right';
37810
37811 redRangeSlider.$el.find('.range-bar').css('background-image', ("linear-gradient(" + direction + ", rgb(0, " + (rgb[1]) + ", " + (rgb[2]) + "), rgb(255, " + (rgb[1]) + ", " + (rgb[2]) + "))"));
37812 greenRangeSlider.$el.find('.range-bar').css('background-image', ("linear-gradient(" + direction + ", rgb(" + (rgb[0]) + ", 0, " + (rgb[2]) + "), rgb(" + (rgb[0]) + ", 255, " + (rgb[2]) + "))"));
37813 blueRangeSlider.$el.find('.range-bar').css('background-image', ("linear-gradient(" + direction + ", rgb(" + (rgb[0]) + ", " + (rgb[1]) + ", 0), rgb(" + (rgb[0]) + ", " + (rgb[1]) + ", 255))"));
37814
37815 if (sliderValue && sliderValueEditable) {
37816 self.$el.find('input.color-picker-value-red').val(rgb[0]);
37817 self.$el.find('input.color-picker-value-green').val(rgb[1]);
37818 self.$el.find('input.color-picker-value-blue').val(rgb[2]);
37819 } else if (sliderValue) {
37820 self.$el.find('span.color-picker-value-red').text(rgb[0]);
37821 self.$el.find('span.color-picker-value-green').text(rgb[1]);
37822 self.$el.find('span.color-picker-value-blue').text(rgb[2]);
37823 }
37824 },
37825 destroy: function destroy(self) {
37826 if (self.redRangeSlider && self.redRangeSlider.destroy) {
37827 self.redRangeSlider.destroy();
37828 }
37829 if (self.greenRangeSlider && self.greenRangeSlider.destroy) {
37830 self.greenRangeSlider.destroy();
37831 }
37832 if (self.blueRangeSlider && self.blueRangeSlider.destroy) {
37833 self.blueRangeSlider.destroy();
37834 }
37835
37836 delete self.redRangeSlider;
37837 delete self.greenRangeSlider;
37838 delete self.blueRangeSlider;
37839
37840 if (self.destroyRgbSlidersEvents) { self.destroyRgbSlidersEvents(); }
37841 delete self.destroyRgbSlidersEvents;
37842 },
37843 };
37844
37845 var moduleSbSpectrum = {
37846 render: function render() {
37847 return "\n <div class=\"color-picker-module color-picker-module-sb-spectrum\">\n <div class=\"color-picker-sb-spectrum\" style=\"background-color: hsl(0, 100%, 50%)\">\n <div class=\"color-picker-sb-spectrum-handle\"></div>\n </div>\n </div>\n ";
37848 },
37849 init: function init(self) {
37850 var app = self.app;
37851
37852 var isTouched;
37853 var isMoved;
37854 var touchStartX;
37855 var touchStartY;
37856 var touchCurrentX;
37857 var touchCurrentY;
37858
37859 var specterRect;
37860 var specterIsTouched;
37861 var specterHandleIsTouched;
37862
37863 var $el = self.$el;
37864
37865 function setSBFromSpecterCoords(x, y) {
37866 var s = (x - specterRect.left) / specterRect.width;
37867 var b = (y - specterRect.top) / specterRect.height;
37868 s = Math.max(0, Math.min(1, s));
37869 b = 1 - Math.max(0, Math.min(1, b));
37870
37871 self.setValue({ hsb: [self.value.hue, s, b] });
37872 }
37873
37874 function handleTouchStart(e) {
37875 if (isMoved || isTouched) { return; }
37876 touchStartX = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
37877 touchCurrentX = touchStartX;
37878 touchStartY = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
37879 touchCurrentY = touchStartY;
37880 var $targetEl = $(e.target);
37881 specterHandleIsTouched = $targetEl.closest('.color-picker-sb-spectrum-handle').length > 0;
37882 if (!specterHandleIsTouched) {
37883 specterIsTouched = $targetEl.closest('.color-picker-sb-spectrum').length > 0;
37884 }
37885 if (specterIsTouched) {
37886 specterRect = $el.find('.color-picker-sb-spectrum')[0].getBoundingClientRect();
37887 setSBFromSpecterCoords(touchStartX, touchStartY);
37888 }
37889 if (specterHandleIsTouched || specterIsTouched) {
37890 $el.find('.color-picker-sb-spectrum-handle').addClass('color-picker-sb-spectrum-handle-pressed');
37891 }
37892 }
37893 function handleTouchMove(e) {
37894 if (!(specterIsTouched || specterHandleIsTouched)) { return; }
37895 touchCurrentX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;
37896 touchCurrentY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
37897 e.preventDefault();
37898 if (!isMoved) {
37899 // First move
37900 isMoved = true;
37901 if (specterHandleIsTouched) {
37902 specterRect = $el.find('.color-picker-sb-spectrum')[0].getBoundingClientRect();
37903 }
37904 }
37905 if (specterIsTouched || specterHandleIsTouched) {
37906 setSBFromSpecterCoords(touchCurrentX, touchCurrentY);
37907 }
37908 }
37909 function handleTouchEnd() {
37910 isMoved = false;
37911 if (specterIsTouched || specterHandleIsTouched) {
37912 $el.find('.color-picker-sb-spectrum-handle').removeClass('color-picker-sb-spectrum-handle-pressed');
37913 }
37914 specterIsTouched = false;
37915 specterHandleIsTouched = false;
37916 }
37917
37918 function handleResize() {
37919 self.modules['sb-spectrum'].update(self);
37920 }
37921
37922 var passiveListener = app.touchEvents.start === 'touchstart' && app.support.passiveListener ? { passive: true, capture: false } : false;
37923
37924 self.$el.on(app.touchEvents.start, handleTouchStart, passiveListener);
37925 app.on('touchmove:active', handleTouchMove);
37926 app.on('touchend:passive', handleTouchEnd);
37927 app.on('resize', handleResize);
37928
37929 self.destroySpectrumEvents = function destroySpectrumEvents() {
37930 self.$el.off(app.touchEvents.start, handleTouchStart, passiveListener);
37931 app.off('touchmove:active', handleTouchMove);
37932 app.off('touchend:passive', handleTouchEnd);
37933 app.off('resize', handleResize);
37934 };
37935 },
37936 update: function update(self) {
37937 var value = self.value;
37938
37939 var hsl = value.hsl;
37940 var hsb = value.hsb;
37941
37942 var specterWidth = self.$el.find('.color-picker-sb-spectrum')[0].offsetWidth;
37943 var specterHeight = self.$el.find('.color-picker-sb-spectrum')[0].offsetHeight;
37944
37945 self.$el.find('.color-picker-sb-spectrum')
37946 .css('background-color', ("hsl(" + (hsl[0]) + ", 100%, 50%)"));
37947
37948 self.$el.find('.color-picker-sb-spectrum-handle')
37949 .css('background-color', ("hsl(" + (hsl[0]) + ", " + (hsl[1] * 100) + "%, " + (hsl[2] * 100) + "%)"))
37950 .transform(("translate(" + (specterWidth * hsb[1]) + "px, " + (specterHeight * (1 - hsb[2])) + "px)"));
37951 },
37952 destroy: function destroy(self) {
37953 if (self.destroySpectrumEvents) { self.destroySpectrumEvents(); }
37954 delete self.destroySpectrumEvents;
37955 },
37956 };
37957
37958 var moduleHsSpectrum = {
37959 render: function render() {
37960 return "\n <div class=\"color-picker-module color-picker-module-hs-spectrum\">\n <div class=\"color-picker-hs-spectrum\">\n <div class=\"color-picker-hs-spectrum-handle\"></div>\n </div>\n </div>\n ";
37961 },
37962 init: function init(self) {
37963 var app = self.app;
37964
37965 var isTouched;
37966 var isMoved;
37967 var touchStartX;
37968 var touchStartY;
37969 var touchCurrentX;
37970 var touchCurrentY;
37971
37972 var specterRect;
37973 var specterIsTouched;
37974 var specterHandleIsTouched;
37975
37976 var $el = self.$el;
37977
37978 function setHSFromSpecterCoords(x, y) {
37979 var h = (x - specterRect.left) / specterRect.width * 360;
37980 var s = (y - specterRect.top) / specterRect.height;
37981 h = Math.max(0, Math.min(360, h));
37982 s = 1 - Math.max(0, Math.min(1, s));
37983
37984 self.setValue({ hsb: [h, s, self.value.hsb[2]] });
37985 }
37986
37987 function handleTouchStart(e) {
37988 if (isMoved || isTouched) { return; }
37989 touchStartX = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
37990 touchCurrentX = touchStartX;
37991 touchStartY = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
37992 touchCurrentY = touchStartY;
37993 var $targetEl = $(e.target);
37994 specterHandleIsTouched = $targetEl.closest('.color-picker-hs-spectrum-handle').length > 0;
37995 if (!specterHandleIsTouched) {
37996 specterIsTouched = $targetEl.closest('.color-picker-hs-spectrum').length > 0;
37997 }
37998 if (specterIsTouched) {
37999 specterRect = $el.find('.color-picker-hs-spectrum')[0].getBoundingClientRect();
38000 setHSFromSpecterCoords(touchStartX, touchStartY);
38001 }
38002 if (specterHandleIsTouched || specterIsTouched) {
38003 $el.find('.color-picker-hs-spectrum-handle').addClass('color-picker-hs-spectrum-handle-pressed');
38004 }
38005 }
38006 function handleTouchMove(e) {
38007 if (!(specterIsTouched || specterHandleIsTouched)) { return; }
38008 touchCurrentX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;
38009 touchCurrentY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
38010 e.preventDefault();
38011 if (!isMoved) {
38012 // First move
38013 isMoved = true;
38014 if (specterHandleIsTouched) {
38015 specterRect = $el.find('.color-picker-hs-spectrum')[0].getBoundingClientRect();
38016 }
38017 }
38018 if (specterIsTouched || specterHandleIsTouched) {
38019 setHSFromSpecterCoords(touchCurrentX, touchCurrentY);
38020 }
38021 }
38022 function handleTouchEnd() {
38023 isMoved = false;
38024 if (specterIsTouched || specterHandleIsTouched) {
38025 $el.find('.color-picker-hs-spectrum-handle').removeClass('color-picker-hs-spectrum-handle-pressed');
38026 }
38027 specterIsTouched = false;
38028 specterHandleIsTouched = false;
38029 }
38030
38031 function handleResize() {
38032 self.modules['hs-spectrum'].update(self);
38033 }
38034
38035 var passiveListener = app.touchEvents.start === 'touchstart' && app.support.passiveListener ? { passive: true, capture: false } : false;
38036
38037 self.$el.on(app.touchEvents.start, handleTouchStart, passiveListener);
38038 app.on('touchmove:active', handleTouchMove);
38039 app.on('touchend:passive', handleTouchEnd);
38040 app.on('resize', handleResize);
38041
38042 self.destroySpectrumEvents = function destroySpectrumEvents() {
38043 self.$el.off(app.touchEvents.start, handleTouchStart, passiveListener);
38044 app.off('touchmove:active', handleTouchMove);
38045 app.off('touchend:passive', handleTouchEnd);
38046 app.off('resize', handleResize);
38047 };
38048 },
38049 update: function update(self) {
38050 var value = self.value;
38051
38052 var hsb = value.hsb;
38053
38054 var specterWidth = self.$el.find('.color-picker-hs-spectrum')[0].offsetWidth;
38055 var specterHeight = self.$el.find('.color-picker-hs-spectrum')[0].offsetHeight;
38056
38057 var hslBright = Utils.colorHsbToHsl(hsb[0], hsb[1], 1);
38058
38059 self.$el.find('.color-picker-hs-spectrum-handle')
38060 .css('background-color', ("hsl(" + (hslBright[0]) + ", " + (hslBright[1] * 100) + "%, " + (hslBright[2] * 100) + "%)"))
38061 .transform(("translate(" + (specterWidth * (hsb[0] / 360)) + "px, " + (specterHeight * (1 - hsb[1])) + "px)"));
38062 },
38063 destroy: function destroy(self) {
38064 if (self.destroySpectrumEvents) { self.destroySpectrumEvents(); }
38065 delete self.destroySpectrumEvents;
38066 },
38067 };
38068
38069 function svgWheelCircles() {
38070 var total = 256;
38071 var circles = '';
38072 for (var i = total; i > 0; i -= 1) {
38073 var angle = i * Math.PI / (total / 2);
38074 var hue = 360 / total * i;
38075 circles += "<circle cx=\"" + (150 - Math.sin(angle) * 125) + "\" cy=\"" + (150 - Math.cos(angle) * 125) + "\" r=\"25\" fill=\"hsl(" + hue + ", 100%, 50%)\"></circle>";
38076 }
38077 return circles;
38078 }
38079 var moduleWheel = {
38080 render: function render() {
38081 return ("\n <div class=\"color-picker-module color-picker-module-wheel\">\n <div class=\"color-picker-wheel\">\n <svg viewBox=\"0 0 300 300\" width=\"300\" height=\"300\">" + (svgWheelCircles()) + "</svg>\n <div class=\"color-picker-wheel-handle\"></div>\n <div class=\"color-picker-sb-spectrum\" style=\"background-color: hsl(0, 100%, 50%)\">\n <div class=\"color-picker-sb-spectrum-handle\"></div>\n </div>\n </div>\n </div>\n ");
38082 },
38083 init: function init(self) {
38084 var app = self.app;
38085
38086 var isTouched;
38087 var isMoved;
38088 var touchStartX;
38089 var touchStartY;
38090 var touchCurrentX;
38091 var touchCurrentY;
38092
38093 var wheelRect;
38094 var wheelIsTouched;
38095 var wheelHandleIsTouched;
38096 var specterRect;
38097 var specterIsTouched;
38098 var specterHandleIsTouched;
38099
38100 var $el = self.$el;
38101
38102 function setHueFromWheelCoords(x, y) {
38103 var wheelCenterX = wheelRect.left + wheelRect.width / 2;
38104 var wheelCenterY = wheelRect.top + wheelRect.height / 2;
38105 var angleRad = Math.atan2(y - wheelCenterY, x - wheelCenterX);
38106 var angleDeg = angleRad * 180 / Math.PI + 90;
38107 if (angleDeg < 0) { angleDeg += 360; }
38108 angleDeg = 360 - angleDeg;
38109 self.setValue({ hue: angleDeg });
38110 }
38111 function setSBFromSpecterCoords(x, y) {
38112 var s = (x - specterRect.left) / specterRect.width;
38113 var b = (y - specterRect.top) / specterRect.height;
38114 s = Math.max(0, Math.min(1, s));
38115 b = 1 - Math.max(0, Math.min(1, b));
38116
38117 self.setValue({ hsb: [self.value.hue, s, b] });
38118 }
38119
38120 function handleTouchStart(e) {
38121 if (isMoved || isTouched) { return; }
38122 touchStartX = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
38123 touchCurrentX = touchStartX;
38124 touchStartY = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
38125 touchCurrentY = touchStartY;
38126 var $targetEl = $(e.target);
38127 wheelHandleIsTouched = $targetEl.closest('.color-picker-wheel-handle').length > 0;
38128 wheelIsTouched = $targetEl.closest('circle').length > 0;
38129 specterHandleIsTouched = $targetEl.closest('.color-picker-sb-spectrum-handle').length > 0;
38130 if (!specterHandleIsTouched) {
38131 specterIsTouched = $targetEl.closest('.color-picker-sb-spectrum').length > 0;
38132 }
38133 if (wheelIsTouched) {
38134 wheelRect = $el.find('.color-picker-wheel')[0].getBoundingClientRect();
38135 setHueFromWheelCoords(touchStartX, touchStartY);
38136 }
38137 if (specterIsTouched) {
38138 specterRect = $el.find('.color-picker-sb-spectrum')[0].getBoundingClientRect();
38139 setSBFromSpecterCoords(touchStartX, touchStartY);
38140 }
38141 if (specterHandleIsTouched || specterIsTouched) {
38142 $el.find('.color-picker-sb-spectrum-handle').addClass('color-picker-sb-spectrum-handle-pressed');
38143 }
38144 }
38145 function handleTouchMove(e) {
38146 if (!(wheelIsTouched || wheelHandleIsTouched) && !(specterIsTouched || specterHandleIsTouched)) { return; }
38147 touchCurrentX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;
38148 touchCurrentY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
38149 e.preventDefault();
38150 if (!isMoved) {
38151 // First move
38152 isMoved = true;
38153 if (wheelHandleIsTouched) {
38154 wheelRect = $el.find('.color-picker-wheel')[0].getBoundingClientRect();
38155 }
38156 if (specterHandleIsTouched) {
38157 specterRect = $el.find('.color-picker-sb-spectrum')[0].getBoundingClientRect();
38158 }
38159 }
38160 if (wheelIsTouched || wheelHandleIsTouched) {
38161 setHueFromWheelCoords(touchCurrentX, touchCurrentY);
38162 }
38163 if (specterIsTouched || specterHandleIsTouched) {
38164 setSBFromSpecterCoords(touchCurrentX, touchCurrentY);
38165 }
38166 }
38167 function handleTouchEnd() {
38168 isMoved = false;
38169 if (specterIsTouched || specterHandleIsTouched) {
38170 $el.find('.color-picker-sb-spectrum-handle').removeClass('color-picker-sb-spectrum-handle-pressed');
38171 }
38172 wheelIsTouched = false;
38173 wheelHandleIsTouched = false;
38174 specterIsTouched = false;
38175 specterHandleIsTouched = false;
38176 }
38177
38178 function handleResize() {
38179 self.modules.wheel.update(self);
38180 }
38181
38182 var passiveListener = app.touchEvents.start === 'touchstart' && app.support.passiveListener ? { passive: true, capture: false } : false;
38183
38184 self.$el.on(app.touchEvents.start, handleTouchStart, passiveListener);
38185 app.on('touchmove:active', handleTouchMove);
38186 app.on('touchend:passive', handleTouchEnd);
38187 app.on('resize', handleResize);
38188
38189 self.destroyWheelEvents = function destroyWheelEvents() {
38190 self.$el.off(app.touchEvents.start, handleTouchStart, passiveListener);
38191 app.off('touchmove:active', handleTouchMove);
38192 app.off('touchend:passive', handleTouchEnd);
38193 app.off('resize', handleResize);
38194 };
38195 },
38196 update: function update(self) {
38197 var value = self.value;
38198
38199 var hsl = value.hsl;
38200 var hsb = value.hsb;
38201
38202 var specterWidth = self.$el.find('.color-picker-sb-spectrum')[0].offsetWidth;
38203 var specterHeight = self.$el.find('.color-picker-sb-spectrum')[0].offsetHeight;
38204 var wheelSize = self.$el.find('.color-picker-wheel')[0].offsetWidth;
38205 var wheelHalfSize = wheelSize / 2;
38206 var angleRad = value.hue * Math.PI / 180;
38207 var handleSize = wheelSize / 6;
38208 var handleHalfSize = handleSize / 2;
38209 var tX = wheelHalfSize - Math.sin(angleRad) * (wheelHalfSize - handleHalfSize) - handleHalfSize;
38210 var tY = wheelHalfSize - Math.cos(angleRad) * (wheelHalfSize - handleHalfSize) - handleHalfSize;
38211 self.$el.find('.color-picker-wheel-handle')
38212 .css('background-color', ("hsl(" + (hsl[0]) + ", 100%, 50%)"))
38213 .transform(("translate(" + tX + "px, " + tY + "px)"));
38214
38215 self.$el.find('.color-picker-sb-spectrum')
38216 .css('background-color', ("hsl(" + (hsl[0]) + ", 100%, 50%)"));
38217
38218 self.$el.find('.color-picker-sb-spectrum-handle')
38219 .css('background-color', ("hsl(" + (hsl[0]) + ", " + (hsl[1] * 100) + "%, " + (hsl[2] * 100) + "%)"))
38220 .transform(("translate(" + (specterWidth * hsb[1]) + "px, " + (specterHeight * (1 - hsb[2])) + "px)"));
38221 },
38222 destroy: function destroy(self) {
38223 if (self.destroyWheelEvents) { self.destroyWheelEvents(); }
38224 delete self.destroyWheelEvents;
38225 },
38226 };
38227
38228 var ColorPicker = /*@__PURE__*/(function (Framework7Class) {
38229 function ColorPicker(app, params) {
38230 if ( params === void 0 ) params = {};
38231
38232 Framework7Class.call(this, params, [app]);
38233 var self = this;
38234
38235 self.params = Utils.extend({}, app.params.colorPicker, params);
38236
38237 var $containerEl;
38238 if (self.params.containerEl) {
38239 $containerEl = $(self.params.containerEl);
38240 if ($containerEl.length === 0) { return self; }
38241 }
38242
38243 var $inputEl;
38244 if (self.params.inputEl) {
38245 $inputEl = $(self.params.inputEl);
38246 }
38247
38248 var $targetEl;
38249 if (self.params.targetEl) {
38250 $targetEl = $(self.params.targetEl);
38251 }
38252
38253 var view;
38254 if ($inputEl) {
38255 view = $inputEl.parents('.view').length && $inputEl.parents('.view')[0].f7View;
38256 }
38257 if (!view && $targetEl) {
38258 view = $targetEl.parents('.view').length && $targetEl.parents('.view')[0].f7View;
38259 }
38260 if (!view) { view = app.views.main; }
38261
38262 Utils.extend(self, {
38263 app: app,
38264 $containerEl: $containerEl,
38265 containerEl: $containerEl && $containerEl[0],
38266 inline: $containerEl && $containerEl.length > 0,
38267 $inputEl: $inputEl,
38268 inputEl: $inputEl && $inputEl[0],
38269 $targetEl: $targetEl,
38270 targetEl: $targetEl && $targetEl[0],
38271 initialized: false,
38272 opened: false,
38273 url: self.params.url,
38274 view: view,
38275 modules: {
38276 'alpha-slider': moduleAlphaSlider,
38277 'current-color': moduleCurrentColor,
38278 'hex': moduleHex, // eslint-disable-line
38279 'hsb-sliders': moduleHsbSliders,
38280 'hue-slider': moduleHueSlider,
38281 'brightness-slider': moduleBrightnessSlider,
38282 'palette': modulePalette, // eslint-disable-line
38283 'initial-current-colors': moduleInitialCurrentColors,
38284 'rgb-bars': moduleRgbBars,
38285 'rgb-sliders': moduleRgbSliders,
38286 'sb-spectrum': moduleSbSpectrum,
38287 'hs-spectrum': moduleHsSpectrum,
38288 'wheel': moduleWheel, // eslint-disable-line
38289 },
38290 });
38291
38292 function onInputClick() {
38293 self.open();
38294 }
38295 function onInputFocus(e) {
38296 e.preventDefault();
38297 }
38298 function onTargetClick() {
38299 self.open();
38300 }
38301 function onHtmlClick(e) {
38302 if (self.params.openIn === 'page') { return; }
38303 var $clickTargetEl = $(e.target);
38304 if (!self.opened || self.closing) { return; }
38305 if ($clickTargetEl.closest('[class*="backdrop"]').length) { return; }
38306 if ($clickTargetEl.closest('.color-picker-popup, .color-picker-popover').length) { return; }
38307 if ($inputEl && $inputEl.length > 0) {
38308 if ($clickTargetEl[0] !== $inputEl[0] && $clickTargetEl.closest('.sheet-modal').length === 0) {
38309 self.close();
38310 }
38311 } else if ($(e.target).closest('.sheet-modal').length === 0) {
38312 self.close();
38313 }
38314 }
38315
38316 // Events
38317 Utils.extend(self, {
38318 attachInputEvents: function attachInputEvents() {
38319 self.$inputEl.on('click', onInputClick);
38320 if (self.params.inputReadOnly) {
38321 self.$inputEl.on('focus mousedown', onInputFocus);
38322 }
38323 },
38324 detachInputEvents: function detachInputEvents() {
38325 self.$inputEl.off('click', onInputClick);
38326 if (self.params.inputReadOnly) {
38327 self.$inputEl.off('focus mousedown', onInputFocus);
38328 }
38329 },
38330 attachTargetEvents: function attachTargetEvents() {
38331 self.$targetEl.on('click', onTargetClick);
38332 },
38333 detachTargetEvents: function detachTargetEvents() {
38334 self.$targetEl.off('click', onTargetClick);
38335 },
38336 attachHtmlEvents: function attachHtmlEvents() {
38337 app.on('click', onHtmlClick);
38338 },
38339 detachHtmlEvents: function detachHtmlEvents() {
38340 app.off('click', onHtmlClick);
38341 },
38342 });
38343
38344 self.init();
38345
38346 return self;
38347 }
38348
38349 if ( Framework7Class ) ColorPicker.__proto__ = Framework7Class;
38350 ColorPicker.prototype = Object.create( Framework7Class && Framework7Class.prototype );
38351 ColorPicker.prototype.constructor = ColorPicker;
38352
38353 ColorPicker.prototype.attachEvents = function attachEvents () {
38354 var self = this;
38355 self.centerModules = self.centerModules.bind(self);
38356 if (self.params.centerModules) {
38357 self.app.on('resize', self.centerModules);
38358 }
38359 };
38360
38361 ColorPicker.prototype.detachEvents = function detachEvents () {
38362 var self = this;
38363 if (self.params.centerModules) {
38364 self.app.off('resize', self.centerModules);
38365 }
38366 };
38367
38368 ColorPicker.prototype.centerModules = function centerModules () {
38369 var self = this;
38370 if (!self.opened || !self.$el || self.inline) { return; }
38371 var $pageContentEl = self.$el.find('.page-content');
38372 if (!$pageContentEl.length) { return; }
38373 var ref = $pageContentEl[0];
38374 var scrollHeight = ref.scrollHeight;
38375 var offsetHeight = ref.offsetHeight;
38376 if (scrollHeight <= offsetHeight) {
38377 $pageContentEl.addClass('justify-content-center');
38378 } else {
38379 $pageContentEl.removeClass('justify-content-center');
38380 }
38381 };
38382
38383 ColorPicker.prototype.initInput = function initInput () {
38384 var self = this;
38385 if (!self.$inputEl) { return; }
38386 if (self.params.inputReadOnly) { self.$inputEl.prop('readOnly', true); }
38387 };
38388
38389 ColorPicker.prototype.getModalType = function getModalType () {
38390 var self = this;
38391 var app = self.app;
38392 var modal = self.modal;
38393 var params = self.params;
38394 var openIn = params.openIn;
38395 var openInPhone = params.openInPhone;
38396 if (modal && modal.type) { return modal.type; }
38397 if (openIn !== 'auto') { return openIn; }
38398 if (self.inline) { return null; }
38399 if (app.device.ios) {
38400 return app.device.ipad ? 'popover' : openInPhone;
38401 }
38402 if (app.width >= 768 || (app.device.desktop && app.theme === 'aurora')) {
38403 return 'popover';
38404 }
38405
38406 return openInPhone;
38407 };
38408
38409 ColorPicker.prototype.formatValue = function formatValue () {
38410 var self = this;
38411 var value = self.value;
38412 if (self.params.formatValue) {
38413 return self.params.formatValue.call(self, value);
38414 }
38415 return value.hex;
38416 };
38417
38418 // eslint-disable-next-line
38419 ColorPicker.prototype.normalizeHsValues = function normalizeHsValues (arr) {
38420 return [
38421 Math.floor(arr[0] * 10) / 10,
38422 Math.floor(arr[1] * 1000) / 1000,
38423 Math.floor(arr[2] * 1000) / 1000 ];
38424 };
38425
38426 ColorPicker.prototype.setValue = function setValue (value, updateModules) {
38427 if ( value === void 0 ) value = {};
38428 if ( updateModules === void 0 ) updateModules = true;
38429
38430 var self = this;
38431 if (typeof value === 'undefined') { return; }
38432
38433 var ref = (self.value || {});
38434 var hex = ref.hex;
38435 var rgb = ref.rgb;
38436 var hsl = ref.hsl;
38437 var hsb = ref.hsb;
38438 var alpha = ref.alpha; if ( alpha === void 0 ) alpha = 1;
38439 var hue = ref.hue;
38440 var rgba = ref.rgba;
38441 var hsla = ref.hsla;
38442
38443 var needChangeEvent = self.value || (!self.value && !self.params.value);
38444 var valueChanged;
38445 Object.keys(value).forEach(function (k) {
38446 if (!self.value || typeof self.value[k] === 'undefined') {
38447 valueChanged = true;
38448 return;
38449 }
38450 var v = value[k];
38451 if (Array.isArray(v)) {
38452 v.forEach(function (subV, subIndex) {
38453 if (subV !== self.value[k][subIndex]) {
38454 valueChanged = true;
38455 }
38456 });
38457 } else if (v !== self.value[k]) {
38458 valueChanged = true;
38459 }
38460 });
38461 if (!valueChanged) { return; }
38462
38463 if (value.rgb || value.rgba) {
38464 var ref$1 = (value.rgb || value.rgba);
38465 var r = ref$1[0];
38466 var g = ref$1[1];
38467 var b = ref$1[2];
38468 var a = ref$1[3]; if ( a === void 0 ) a = alpha;
38469 rgb = [r, g, b];
38470 hex = Utils.colorRgbToHex.apply(Utils, rgb);
38471 hsl = Utils.colorRgbToHsl.apply(Utils, rgb);
38472 hsb = Utils.colorHslToHsb.apply(Utils, hsl);
38473 hsl = self.normalizeHsValues(hsl);
38474 hsb = self.normalizeHsValues(hsb);
38475 hue = hsb[0];
38476 alpha = a;
38477 rgba = [rgb[0], rgb[1], rgb[2], a];
38478 hsla = [hsl[0], hsl[1], hsl[2], a];
38479 }
38480
38481 if (value.hsl || value.hsla) {
38482 var ref$2 = (value.hsl || value.hsla);
38483 var h = ref$2[0];
38484 var s = ref$2[1];
38485 var l = ref$2[2];
38486 var a$1 = ref$2[3]; if ( a$1 === void 0 ) a$1 = alpha;
38487 hsl = [h, s, l];
38488 rgb = Utils.colorHslToRgb.apply(Utils, hsl);
38489 hex = Utils.colorRgbToHex.apply(Utils, rgb);
38490 hsb = Utils.colorHslToHsb.apply(Utils, hsl);
38491 hsl = self.normalizeHsValues(hsl);
38492 hsb = self.normalizeHsValues(hsb);
38493 hue = hsb[0];
38494 alpha = a$1;
38495 rgba = [rgb[0], rgb[1], rgb[2], a$1];
38496 hsla = [hsl[0], hsl[1], hsl[2], a$1];
38497 }
38498
38499 if (value.hsb) {
38500 var ref$3 = value.hsb;
38501 var h$1 = ref$3[0];
38502 var s$1 = ref$3[1];
38503 var b$1 = ref$3[2];
38504 var a$2 = ref$3[3]; if ( a$2 === void 0 ) a$2 = alpha;
38505 hsb = [h$1, s$1, b$1];
38506 hsl = Utils.colorHsbToHsl.apply(Utils, hsb);
38507 rgb = Utils.colorHslToRgb.apply(Utils, hsl);
38508 hex = Utils.colorRgbToHex.apply(Utils, rgb);
38509 hsl = self.normalizeHsValues(hsl);
38510 hsb = self.normalizeHsValues(hsb);
38511 hue = hsb[0];
38512 alpha = a$2;
38513 rgba = [rgb[0], rgb[1], rgb[2], a$2];
38514 hsla = [hsl[0], hsl[1], hsl[2], a$2];
38515 }
38516
38517 if (value.hex) {
38518 rgb = Utils.colorHexToRgb(value.hex);
38519 hex = Utils.colorRgbToHex.apply(Utils, rgb);
38520 hsl = Utils.colorRgbToHsl.apply(Utils, rgb);
38521 hsb = Utils.colorHslToHsb.apply(Utils, hsl);
38522 hsl = self.normalizeHsValues(hsl);
38523 hsb = self.normalizeHsValues(hsb);
38524 hue = hsb[0];
38525 rgba = [rgb[0], rgb[1], rgb[2], alpha];
38526 hsla = [hsl[0], hsl[1], hsl[2], alpha];
38527 }
38528
38529 if (typeof value.alpha !== 'undefined') {
38530 alpha = value.alpha;
38531 if (typeof rgb !== 'undefined') {
38532 rgba = [rgb[0], rgb[1], rgb[2], alpha];
38533 }
38534 if (typeof hsl !== 'undefined') {
38535 hsla = [hsl[0], hsl[1], hsl[2], alpha];
38536 }
38537 }
38538
38539 if (typeof value.hue !== 'undefined') {
38540 var h$2 = hsl[0];
38541 var s$2 = hsl[1];
38542 var l$1 = hsl[2]; // eslint-disable-line
38543 hsl = [value.hue, s$2, l$1];
38544 hsb = Utils.colorHslToHsb.apply(Utils, hsl);
38545 rgb = Utils.colorHslToRgb.apply(Utils, hsl);
38546 hex = Utils.colorRgbToHex.apply(Utils, rgb);
38547 hsl = self.normalizeHsValues(hsl);
38548 hsb = self.normalizeHsValues(hsb);
38549 hue = hsb[0];
38550 rgba = [rgb[0], rgb[1], rgb[2], alpha];
38551 hsla = [hsl[0], hsl[1], hsl[2], alpha];
38552 }
38553 self.value = {
38554 hex: hex,
38555 alpha: alpha,
38556 hue: hue,
38557 rgb: rgb,
38558 hsl: hsl,
38559 hsb: hsb,
38560 rgba: rgba,
38561 hsla: hsla,
38562 };
38563 if (!self.initialValue) { self.initialValue = Utils.extend({}, self.value); }
38564 self.updateValue(needChangeEvent);
38565 if (self.opened && updateModules) {
38566 self.updateModules();
38567 }
38568 };
38569
38570 ColorPicker.prototype.getValue = function getValue () {
38571 var self = this;
38572 return self.value;
38573 };
38574
38575 ColorPicker.prototype.updateValue = function updateValue (fireEvents) {
38576 if ( fireEvents === void 0 ) fireEvents = true;
38577
38578 var self = this;
38579 var $inputEl = self.$inputEl;
38580 var value = self.value;
38581 var $targetEl = self.$targetEl;
38582 if ($targetEl && self.params.targetElSetBackgroundColor) {
38583 var rgba = value.rgba;
38584 $targetEl.css('background-color', ("rgba(" + (rgba.join(', ')) + ")"));
38585 }
38586 if (fireEvents) {
38587 self.emit('local::change colorPickerChange', self, value);
38588 }
38589
38590 if ($inputEl && $inputEl.length) {
38591 var inputValue = self.formatValue(value);
38592 if ($inputEl && $inputEl.length) {
38593 $inputEl.val(inputValue);
38594 if (fireEvents) {
38595 $inputEl.trigger('change');
38596 }
38597 }
38598 }
38599 };
38600
38601 ColorPicker.prototype.updateModules = function updateModules () {
38602 var self = this;
38603 var modules = self.modules;
38604 self.params.modules.forEach(function (m) {
38605 if (typeof m === 'string' && modules[m] && modules[m].update) {
38606 modules[m].update(self);
38607 } else if (m && m.update) {
38608 m.update(self);
38609 }
38610 });
38611 };
38612
38613 ColorPicker.prototype.update = function update () {
38614 var self = this;
38615 self.updateModules();
38616 };
38617
38618 ColorPicker.prototype.renderPicker = function renderPicker () {
38619 var self = this;
38620 var params = self.params;
38621 var modules = self.modules;
38622 var html = '';
38623
38624 params.modules.forEach(function (m) {
38625 if (typeof m === 'string' && modules[m] && modules[m].render) {
38626 html += modules[m].render(self);
38627 } else if (m && m.render) {
38628 html += m.render(self);
38629 }
38630 });
38631
38632 return html;
38633 };
38634
38635 ColorPicker.prototype.renderNavbar = function renderNavbar () {
38636 var self = this;
38637 if (self.params.renderNavbar) {
38638 return self.params.renderNavbar.call(self, self);
38639 }
38640 var ref = self.params;
38641 var openIn = ref.openIn;
38642 var navbarTitleText = ref.navbarTitleText;
38643 var navbarBackLinkText = ref.navbarBackLinkText;
38644 var navbarCloseText = ref.navbarCloseText;
38645 return ("\n <div class=\"navbar\">\n <div class=\"navbar-inner sliding\">\n " + (openIn === 'page' ? ("\n <div class=\"left\">\n <a class=\"link back\">\n <i class=\"icon icon-back\"></i>\n <span class=\"if-not-md\">" + navbarBackLinkText + "</span>\n </a>\n </div>\n ") : '') + "\n <div class=\"title\">" + navbarTitleText + "</div>\n " + (openIn !== 'page' ? ("\n <div class=\"right\">\n <a class=\"link popup-close\" data-popup=\".color-picker-popup\">" + navbarCloseText + "</a>\n </div>\n ") : '') + "\n </div>\n </div>\n ").trim();
38646 };
38647
38648 ColorPicker.prototype.renderToolbar = function renderToolbar () {
38649 var self = this;
38650 if (self.params.renderToolbar) {
38651 return self.params.renderToolbar.call(self, self);
38652 }
38653 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 class=\"link sheet-close popover-close\" data-sheet=\".color-picker-sheet-modal\" data-popover=\".color-picker-popover\">" + (self.params.toolbarCloseText) + "</a>\n </div>\n </div>\n </div>\n ").trim();
38654 };
38655
38656 ColorPicker.prototype.renderInline = function renderInline () {
38657 var self = this;
38658 var ref = self.params;
38659 var cssClass = ref.cssClass;
38660 var groupedModules = ref.groupedModules;
38661 var inlineHtml = ("\n <div class=\"color-picker color-picker-inline " + (groupedModules ? 'color-picker-grouped-modules' : '') + " " + (cssClass || '') + "\">\n " + (self.renderPicker()) + "\n </div>\n ").trim();
38662
38663 return inlineHtml;
38664 };
38665
38666 ColorPicker.prototype.renderSheet = function renderSheet () {
38667 var self = this;
38668 var ref = self.params;
38669 var cssClass = ref.cssClass;
38670 var toolbarSheet = ref.toolbarSheet;
38671 var groupedModules = ref.groupedModules;
38672 var sheetHtml = ("\n <div class=\"sheet-modal color-picker color-picker-sheet-modal " + (groupedModules ? 'color-picker-grouped-modules' : '') + " " + (cssClass || '') + "\">\n " + (toolbarSheet ? self.renderToolbar() : '') + "\n <div class=\"sheet-modal-inner\">\n <div class=\"page-content\">\n " + (self.renderPicker()) + "\n </div>\n </div>\n </div>\n ").trim();
38673
38674 return sheetHtml;
38675 };
38676
38677 ColorPicker.prototype.renderPopover = function renderPopover () {
38678 var self = this;
38679 var ref = self.params;
38680 var cssClass = ref.cssClass;
38681 var toolbarPopover = ref.toolbarPopover;
38682 var groupedModules = ref.groupedModules;
38683 var popoverHtml = ("\n <div class=\"popover color-picker-popover " + (cssClass || '') + "\">\n <div class=\"popover-inner\">\n <div class=\"color-picker " + (groupedModules ? 'color-picker-grouped-modules' : '') + "\">\n " + (toolbarPopover ? self.renderToolbar() : '') + "\n <div class=\"page-content\">\n " + (self.renderPicker()) + "\n </div>\n </div>\n </div>\n </div>\n ").trim();
38684
38685 return popoverHtml;
38686 };
38687
38688 ColorPicker.prototype.renderPopup = function renderPopup () {
38689 var self = this;
38690 var ref = self.params;
38691 var cssClass = ref.cssClass;
38692 var navbarPopup = ref.navbarPopup;
38693 var groupedModules = ref.groupedModules;
38694 var popupHtml = ("\n <div class=\"popup color-picker-popup " + (cssClass || '') + "\">\n <div class=\"page\">\n " + (navbarPopup ? self.renderNavbar() : '') + "\n <div class=\"color-picker " + (groupedModules ? 'color-picker-grouped-modules' : '') + "\">\n <div class=\"page-content\">\n " + (self.renderPicker()) + "\n </div>\n </div>\n </div>\n </div>\n ").trim();
38695
38696 return popupHtml;
38697 };
38698
38699 ColorPicker.prototype.renderPage = function renderPage () {
38700 var self = this;
38701 var ref = self.params;
38702 var cssClass = ref.cssClass;
38703 var groupedModules = ref.groupedModules;
38704 var pageHtml = ("\n <div class=\"page color-picker-page " + (cssClass || '') + "\" data-name=\"color-picker-page\">\n " + (self.renderNavbar()) + "\n <div class=\"color-picker " + (groupedModules ? 'color-picker-grouped-modules' : '') + "\">\n <div class=\"page-content\">\n " + (self.renderPicker()) + "\n </div>\n </div>\n </div>\n ").trim();
38705 return pageHtml;
38706 };
38707
38708 // eslint-disable-next-line
38709 ColorPicker.prototype.render = function render () {
38710 var self = this;
38711 var params = self.params;
38712 if (params.render) { return params.render.call(self); }
38713 if (self.inline) { return self.renderInline(); }
38714 if (params.openIn === 'page') {
38715 return self.renderPage();
38716 }
38717
38718 var modalType = self.getModalType();
38719 if (modalType === 'popover') { return self.renderPopover(); }
38720 if (modalType === 'sheet') { return self.renderSheet(); }
38721 if (modalType === 'popup') { return self.renderPopup(); }
38722 };
38723
38724 ColorPicker.prototype.onOpen = function onOpen () {
38725 var self = this;
38726 var initialized = self.initialized;
38727 var $el = self.$el;
38728 var app = self.app;
38729 var $inputEl = self.$inputEl;
38730 var inline = self.inline;
38731 var value = self.value;
38732 var params = self.params;
38733 var modules = self.modules;
38734 self.closing = false;
38735 self.opened = true;
38736 self.opening = true;
38737
38738 // Init main events
38739 self.attachEvents();
38740
38741 params.modules.forEach(function (m) {
38742 if (typeof m === 'string' && modules[m] && modules[m].render) {
38743 modules[m].init(self);
38744 } else if (m && m.init) {
38745 m.init(self);
38746 }
38747 });
38748
38749 var updateValue = !value && params.value;
38750
38751 // Set value
38752 if (!initialized) {
38753 if (value) { self.setValue(value); }
38754 else if (params.value) {
38755 self.setValue(params.value, false);
38756 } else if (!params.value) {
38757 self.setValue({ hex: '#ff0000' }, false);
38758 }
38759 } else if (value) {
38760 self.initialValue = Utils.extend({}, value);
38761 self.setValue(value, false);
38762 }
38763
38764 // Update input value
38765 if (updateValue) { self.updateValue(); }
38766 self.updateModules();
38767
38768 // Center modules
38769 if (params.centerModules) {
38770 self.centerModules();
38771 }
38772
38773 // Extra focus
38774 if (!inline && $inputEl && $inputEl.length && app.theme === 'md') {
38775 $inputEl.trigger('focus');
38776 }
38777
38778 self.initialized = true;
38779
38780 // Trigger events
38781 if ($el) {
38782 $el.trigger('colorpicker:open', self);
38783 }
38784 if ($inputEl) {
38785 $inputEl.trigger('colorpicker:open', self);
38786 }
38787 self.emit('local::open colorPickerOpen', self);
38788 };
38789
38790 ColorPicker.prototype.onOpened = function onOpened () {
38791 var self = this;
38792 self.opening = false;
38793 if (self.$el) {
38794 self.$el.trigger('colorpicker:opened', self);
38795 }
38796 if (self.$inputEl) {
38797 self.$inputEl.trigger('colorpicker:opened', self);
38798 }
38799 self.emit('local::opened colorPickerOpened', self);
38800 };
38801
38802 ColorPicker.prototype.onClose = function onClose () {
38803 var self = this;
38804 var app = self.app;
38805 var params = self.params;
38806 var modules = self.modules;
38807 self.opening = false;
38808 self.closing = true;
38809
38810 // Detach events
38811 self.detachEvents();
38812
38813 if (self.$inputEl && app.theme === 'md') {
38814 self.$inputEl.trigger('blur');
38815 }
38816 params.modules.forEach(function (m) {
38817 if (typeof m === 'string' && modules[m] && modules[m].update) {
38818 modules[m].destroy(self);
38819 } else if (m && m.destroy) {
38820 m.destroy(self);
38821 }
38822 });
38823
38824 if (self.$el) {
38825 self.$el.trigger('colorpicker:close', self);
38826 }
38827 if (self.$inputEl) {
38828 self.$inputEl.trigger('colorpicker:close', self);
38829 }
38830 self.emit('local::close colorPickerClose', self);
38831 };
38832
38833 ColorPicker.prototype.onClosed = function onClosed () {
38834 var self = this;
38835 self.opened = false;
38836 self.closing = false;
38837
38838 if (!self.inline) {
38839 Utils.nextTick(function () {
38840 if (self.modal && self.modal.el && self.modal.destroy) {
38841 if (!self.params.routableModals) {
38842 self.modal.destroy();
38843 }
38844 }
38845 delete self.modal;
38846 });
38847 }
38848 if (self.$el) {
38849 self.$el.trigger('colorpicker:closed', self);
38850 }
38851 if (self.$inputEl) {
38852 self.$inputEl.trigger('colorpicker:closed', self);
38853 }
38854 self.emit('local::closed colorPickerClosed', self);
38855 };
38856
38857 ColorPicker.prototype.open = function open () {
38858 var obj;
38859
38860 var self = this;
38861 var app = self.app;
38862 var opened = self.opened;
38863 var inline = self.inline;
38864 var $inputEl = self.$inputEl;
38865 var $targetEl = self.$targetEl;
38866 var params = self.params;
38867 if (opened) { return; }
38868
38869 if (inline) {
38870 self.$el = $(self.render());
38871 self.$el[0].f7ColorPicker = self;
38872 self.$containerEl.append(self.$el);
38873 self.onOpen();
38874 self.onOpened();
38875 return;
38876 }
38877
38878 var colorPickerContent = self.render();
38879
38880 if (params.openIn === 'page') {
38881 self.view.router.navigate({
38882 url: self.url,
38883 route: {
38884 content: colorPickerContent,
38885 path: self.url,
38886 on: {
38887 pageBeforeIn: function pageBeforeIn(e, page) {
38888 self.$el = page.$el.find('.color-picker');
38889 self.$el[0].f7ColorPicker = self;
38890 self.onOpen();
38891 },
38892 pageAfterIn: function pageAfterIn() {
38893 self.onOpened();
38894 },
38895 pageBeforeOut: function pageBeforeOut() {
38896 self.onClose();
38897 },
38898 pageAfterOut: function pageAfterOut() {
38899 self.onClosed();
38900 if (self.$el && self.$el[0]) {
38901 self.$el[0].f7ColorPicker = null;
38902 delete self.$el[0].f7ColorPicker;
38903 }
38904 },
38905 },
38906 },
38907 });
38908 } else {
38909 var modalType = self.getModalType();
38910 var backdrop = params.backdrop;
38911 if (backdrop === null || typeof backdrop === 'undefined') {
38912 if (modalType === 'popover' && app.params.popover.backdrop !== false) { backdrop = true; }
38913 if (modalType === 'popup') { backdrop = true; }
38914 }
38915 var modalParams = {
38916 targetEl: ($targetEl || $inputEl),
38917 scrollToEl: params.scrollToInput ? ($targetEl || $inputEl) : undefined,
38918 content: colorPickerContent,
38919 backdrop: backdrop,
38920 closeByBackdropClick: params.closeByBackdropClick,
38921 on: {
38922 open: function open() {
38923 var modal = this;
38924 self.modal = modal;
38925 self.$el = modalType === 'popover' || modalType === 'popup' ? modal.$el.find('.color-picker') : modal.$el;
38926 self.$el[0].f7ColorPicker = self;
38927 self.onOpen();
38928 },
38929 opened: function opened() { self.onOpened(); },
38930 close: function close() { self.onClose(); },
38931 closed: function closed() {
38932 self.onClosed();
38933 if (self.$el && self.$el[0]) {
38934 self.$el[0].f7ColorPicker = null;
38935 delete self.$el[0].f7ColorPicker;
38936 }
38937 },
38938 },
38939 };
38940 if (params.routableModals) {
38941 self.view.router.navigate({
38942 url: self.url,
38943 route: ( obj = {
38944 path: self.url
38945 }, obj[modalType] = modalParams, obj ),
38946 });
38947 } else {
38948 self.modal = app[modalType].create(modalParams);
38949 self.modal.open();
38950 }
38951 }
38952 };
38953
38954 ColorPicker.prototype.close = function close () {
38955 var self = this;
38956 var opened = self.opened;
38957 var inline = self.inline;
38958 if (!opened) { return; }
38959 if (inline) {
38960 self.onClose();
38961 self.onClosed();
38962 return;
38963 }
38964 if (self.params.routableModals) {
38965 self.view.router.back();
38966 } else {
38967 self.modal.close();
38968 }
38969 };
38970
38971 ColorPicker.prototype.init = function init () {
38972 var self = this;
38973
38974 self.initInput();
38975
38976 if (self.inline) {
38977 self.open();
38978 self.emit('local::init colorPickerInit', self);
38979 return;
38980 }
38981
38982 if (!self.initialized && self.params.value) {
38983 self.setValue(self.params.value);
38984 }
38985
38986 // Attach input Events
38987 if (self.$inputEl) {
38988 self.attachInputEvents();
38989 }
38990 if (self.$targetEl) {
38991 self.attachTargetEvents();
38992 }
38993 if (self.params.closeByOutsideClick) {
38994 self.attachHtmlEvents();
38995 }
38996 self.emit('local::init colorPickerInit', self);
38997 };
38998
38999 ColorPicker.prototype.destroy = function destroy () {
39000 var self = this;
39001 if (self.destroyed) { return; }
39002 var $el = self.$el;
39003 self.emit('local::beforeDestroy colorPickerBeforeDestroy', self);
39004 if ($el) { $el.trigger('colorpicker:beforedestroy', self); }
39005
39006 self.close();
39007
39008 // Detach Events
39009 self.detachEvents();
39010 if (self.$inputEl) {
39011 self.detachInputEvents();
39012 }
39013 if (self.$targetEl) {
39014 self.detachTargetEvents();
39015 }
39016 if (self.params.closeByOutsideClick) {
39017 self.detachHtmlEvents();
39018 }
39019
39020 if ($el && $el.length) { delete self.$el[0].f7ColorPicker; }
39021 Utils.deleteProps(self);
39022 self.destroyed = true;
39023 };
39024
39025 return ColorPicker;
39026 }(Framework7Class));
39027
39028 var ColorPicker$1 = {
39029 name: 'colorPicker',
39030 static: {
39031 ColorPicker: ColorPicker,
39032 },
39033 create: function create() {
39034 var app = this;
39035 app.colorPicker = ConstructorMethods({
39036 defaultSelector: '.color-picker',
39037 constructor: ColorPicker,
39038 app: app,
39039 domProp: 'f7ColorPicker',
39040 });
39041 app.colorPicker.close = function close(el) {
39042 if ( el === void 0 ) el = '.color-picker';
39043
39044 var $el = $(el);
39045 if ($el.length === 0) { return; }
39046 var colorPicker = $el[0].f7ColorPicker;
39047 if (!colorPicker || (colorPicker && !colorPicker.opened)) { return; }
39048 colorPicker.close();
39049 };
39050 },
39051 params: {
39052 colorPicker: {
39053 // Color picker settings
39054 value: null,
39055 modules: [
39056 'wheel' ],
39057 palette: [
39058 ['#FFEBEE', '#FFCDD2', '#EF9A9A', '#E57373', '#EF5350', '#F44336', '#E53935', '#D32F2F', '#C62828', '#B71C1C'],
39059 ['#F3E5F5', '#E1BEE7', '#CE93D8', '#BA68C8', '#AB47BC', '#9C27B0', '#8E24AA', '#7B1FA2', '#6A1B9A', '#4A148C'],
39060 ['#E8EAF6', '#C5CAE9', '#9FA8DA', '#7986CB', '#5C6BC0', '#3F51B5', '#3949AB', '#303F9F', '#283593', '#1A237E'],
39061 ['#E1F5FE', '#B3E5FC', '#81D4FA', '#4FC3F7', '#29B6F6', '#03A9F4', '#039BE5', '#0288D1', '#0277BD', '#01579B'],
39062 ['#E0F2F1', '#B2DFDB', '#80CBC4', '#4DB6AC', '#26A69A', '#009688', '#00897B', '#00796B', '#00695C', '#004D40'],
39063 ['#F1F8E9', '#DCEDC8', '#C5E1A5', '#AED581', '#9CCC65', '#8BC34A', '#7CB342', '#689F38', '#558B2F', '#33691E'],
39064 ['#FFFDE7', '#FFF9C4', '#FFF59D', '#FFF176', '#FFEE58', '#FFEB3B', '#FDD835', '#FBC02D', '#F9A825', '#F57F17'],
39065 ['#FFF3E0', '#FFE0B2', '#FFCC80', '#FFB74D', '#FFA726', '#FF9800', '#FB8C00', '#F57C00', '#EF6C00', '#E65100'] ],
39066 groupedModules: false,
39067 centerModules: true,
39068
39069 sliderLabel: false,
39070 sliderValue: false,
39071 sliderValueEdiable: false,
39072
39073 barLabel: false,
39074 barValue: false,
39075 barValueEdiable: false,
39076
39077 hexLabel: false,
39078 hexValueEditable: false,
39079
39080 redLabelText: 'R',
39081 greenLabelText: 'G',
39082 blueLabelText: 'B',
39083 hueLabelText: 'H',
39084 saturationLabelText: 'S',
39085 brightnessLabelText: 'B',
39086 hexLabelText: 'HEX',
39087 alphaLabelText: 'A',
39088
39089 // Common opener settings
39090 containerEl: null,
39091 openIn: 'popover', // or 'popover' or 'sheet' or 'popup' or 'page' or 'auto'
39092 openInPhone: 'popup', // or 'popover' or 'sheet' or 'popup' or 'page'
39093 formatValue: null,
39094 targetEl: null,
39095 targetElSetBackgroundColor: false,
39096 inputEl: null,
39097 inputReadOnly: true,
39098 closeByOutsideClick: true,
39099 scrollToInput: true,
39100 toolbarSheet: true,
39101 toolbarPopover: false,
39102 toolbarCloseText: 'Done',
39103 navbarPopup: true,
39104 navbarCloseText: 'Done',
39105 navbarTitleText: 'Color',
39106 navbarBackLinkText: 'Back',
39107 cssClass: null,
39108 routableModals: true,
39109 view: null,
39110 url: 'color/',
39111 backdrop: null,
39112 closeByBackdropClick: true,
39113 // Render functions
39114 renderToolbar: null,
39115 renderNavbar: null,
39116 renderInline: null,
39117 renderPopover: null,
39118 renderSheet: null,
39119 renderPopup: null,
39120 render: null,
39121 },
39122 },
39123 };
39124
39125 var Treeview = {
39126 open: function open(itemEl) {
39127 var app = this;
39128 var $itemEl = $(itemEl).eq(0);
39129 if (!$itemEl.length) { return; }
39130 $itemEl.addClass('treeview-item-opened');
39131 $itemEl.trigger('treeview:open');
39132 app.emit('treeviewOpen', $itemEl[0]);
39133 function done() {
39134 $itemEl[0].f7TreeviewChildrenLoaded = true;
39135 $itemEl.find('.treeview-toggle').removeClass('treeview-toggle-hidden');
39136 $itemEl.find('.treeview-preloader').remove();
39137 }
39138
39139 if ($itemEl.hasClass('treeview-load-children') && !$itemEl[0].f7TreeviewChildrenLoaded) {
39140 $itemEl.trigger('treeview:loadchildren', done);
39141 app.emit('treeviewLoadChildren', $itemEl[0], done);
39142 $itemEl.find('.treeview-toggle').addClass('treeview-toggle-hidden');
39143 $itemEl.find('.treeview-item-root').prepend(("<div class=\"preloader treeview-preloader\">" + (Utils[((app.theme) + "PreloaderContent")]) + "</div>"));
39144 }
39145 },
39146 close: function close(itemEl) {
39147 var app = this;
39148 var $itemEl = $(itemEl).eq(0);
39149 if (!$itemEl.length) { return; }
39150 $itemEl.removeClass('treeview-item-opened');
39151 $itemEl.trigger('treeview:close');
39152 app.emit('treeviewClose', $itemEl[0]);
39153 },
39154 toggle: function toggle(itemEl) {
39155 var app = this;
39156 var $itemEl = $(itemEl).eq(0);
39157 if (!$itemEl.length) { return; }
39158 var wasOpened = $itemEl.hasClass('treeview-item-opened');
39159 app.treeview[wasOpened ? 'close' : 'open']($itemEl);
39160 },
39161 };
39162
39163 var Treeview$1 = {
39164 name: 'treeview',
39165 create: function create() {
39166 var app = this;
39167 Utils.extend(app, {
39168 treeview: {
39169 open: Treeview.open.bind(app),
39170 close: Treeview.close.bind(app),
39171 toggle: Treeview.toggle.bind(app),
39172 },
39173 });
39174 },
39175 clicks: {
39176 '.treeview-toggle': function toggle($clickedEl, clickedData, e) {
39177 var app = this;
39178 if ($clickedEl.parents('.treeview-item-toggle').length) { return; }
39179 var $treeviewItemEl = $clickedEl.parents('.treeview-item').eq(0);
39180 if (!$treeviewItemEl.length) { return; }
39181 e.preventF7Router = true;
39182 app.treeview.toggle($treeviewItemEl[0]);
39183 },
39184 '.treeview-item-toggle': function toggle($clickedEl, clickedData, e) {
39185 var app = this;
39186 var $treeviewItemEl = $clickedEl.closest('.treeview-item').eq(0);
39187 if (!$treeviewItemEl.length) { return; }
39188 e.preventF7Router = true;
39189 app.treeview.toggle($treeviewItemEl[0]);
39190 },
39191 },
39192 };
39193
39194 var ViAd = /*@__PURE__*/(function (Framework7Class) {
5309fbda
DC
39195 function ViAd(app, params) {
39196 if ( params === void 0 ) params = {};
39197
5d51ea26 39198 Framework7Class.call(this, params, [app]);
5309fbda
DC
39199 var vi = this;
39200 if (!win.vi) {
39201 throw new Error('Framework7: vi SDK not found.');
39202 }
39203
39204 var orientation;
39205 if (typeof win.orientation !== 'undefined') {
39206 orientation = win.orientation === -90 || win.orientation === 90 ? 'horizontal' : 'vertical';
39207 }
39208 var defaults = Utils.extend(
39209 {},
39210 app.params.vi,
39211 {
39212 appId: app.id,
39213 appVer: app.version,
39214 language: app.language,
39215 width: app.width,
39216 height: app.height,
39217 os: Device.os,
39218 osVersion: Device.osVersion,
39219 orientation: orientation,
39220 }
39221 );
39222
39223 // Extend defaults with modules params
39224 vi.useModulesParams(defaults);
39225
39226 vi.params = Utils.extend(defaults, params);
39227
39228 var adParams = {};
39229 var skipParams = ('on autoplay fallbackOverlay fallbackOverlayText enabled').split(' ');
39230 Object.keys(vi.params).forEach(function (paramName) {
39231 if (skipParams.indexOf(paramName) >= 0) { return; }
39232 var paramValue = vi.params[paramName];
39233 if ([null, undefined].indexOf(paramValue) >= 0) { return; }
39234 adParams[paramName] = paramValue;
39235 });
39236
39237 if (!vi.params.appId) {
39238 throw new Error('Framework7: "app.id" is required to display an ad. Make sure you have specified it on app initialization.');
39239 }
39240 if (!vi.params.placementId) {
39241 throw new Error('Framework7: "placementId" is required to display an ad.');
39242 }
39243
39244 function onResize() {
39245 var $viFrame = $('iframe#viAd');
39246 if ($viFrame.length === 0) { return; }
39247 $viFrame
39248 .css({
39249 width: ((app.width) + "px"),
39250 height: ((app.height) + "px"),
39251 });
39252 }
39253
39254 function removeOverlay() {
39255 if (!vi.$overlayEl) { return; }
39256 vi.$overlayEl.off('click touchstart');
39257 vi.$overlayEl.remove();
39258 }
39259 function createOverlay(videoEl) {
39260 if (!videoEl) { return; }
39261 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());
39262
39263 var touchStartTime;
39264 vi.$overlayEl.on('touchstart', function () {
39265 touchStartTime = Utils.now();
39266 });
39267 vi.$overlayEl.on('click', function () {
39268 var timeDiff = Utils.now() - touchStartTime;
39269 if (timeDiff > 300) { return; }
39270 if (videoEl) {
39271 videoEl.play();
39272 removeOverlay();
39273 return;
39274 }
39275 vi.start();
39276 removeOverlay();
39277 });
39278 app.root.append(vi.$overlayEl);
39279 }
39280
39281 // Create ad
39282 vi.ad = new win.vi.Ad(adParams);
39283
39284 Utils.extend(vi.ad, {
39285 onAdReady: function onAdReady() {
39286 app.on('resize', onResize);
39287 vi.emit('local::ready');
39288 if (vi.params.autoplay) {
39289 vi.start();
39290 }
39291 },
39292 onAdStarted: function onAdStarted() {
39293 vi.emit('local::started');
39294 },
39295 onAdClick: function onAdClick(targetUrl) {
39296 vi.emit('local::click', targetUrl);
39297 },
39298 onAdImpression: function onAdImpression() {
39299 vi.emit('local::impression');
39300 },
39301 onAdStopped: function onAdStopped(reason) {
39302 app.off('resize', onResize);
39303 removeOverlay();
39304
39305 vi.emit('local::stopped', reason);
39306 if (reason === 'complete') {
39307 vi.emit('local::complete');
39308 vi.emit('local::completed');
39309 }
39310 if (reason === 'userexit') {
39311 vi.emit('local::userexit');
39312 }
39313 vi.destroyed = true;
39314 },
39315 onAutoPlayFailed: function onAutoPlayFailed(reason, videoEl) {
39316 vi.emit('local::autoplayFailed', reason, videoEl);
39317 if (reason && reason.name && reason.name.indexOf('NotAllowedError') !== -1 && vi.params.fallbackOverlay) {
39318 createOverlay(videoEl);
39319 }
39320 },
39321 onAdError: function onAdError(msg) {
39322 removeOverlay();
39323 app.off('resize', onResize);
39324 vi.emit('local::error', msg);
39325 vi.destroyed = true;
39326 },
39327 });
39328
39329 vi.init();
39330
39331 Utils.extend(vi, {
39332 app: app,
39333 });
39334 }
39335
5d51ea26
DC
39336 if ( Framework7Class ) ViAd.__proto__ = Framework7Class;
39337 ViAd.prototype = Object.create( Framework7Class && Framework7Class.prototype );
5309fbda
DC
39338 ViAd.prototype.constructor = ViAd;
39339
39340 ViAd.prototype.start = function start () {
39341 var vi = this;
39342 if (vi.destroyed) { return; }
39343 if (vi.ad) { vi.ad.startAd(); }
39344 };
39345
39346 ViAd.prototype.pause = function pause () {
39347 var vi = this;
39348 if (vi.destroyed) { return; }
39349 if (vi.ad) { vi.ad.pauseAd(); }
39350 };
39351
39352 ViAd.prototype.resume = function resume () {
39353 var vi = this;
39354 if (vi.destroyed) { return; }
39355 if (vi.ad) { vi.ad.resumeAd(); }
39356 };
39357
39358 ViAd.prototype.stop = function stop () {
39359 var vi = this;
39360 if (vi.destroyed) { return; }
39361 if (vi.ad) { vi.ad.stopAd(); }
39362 };
39363
39364 ViAd.prototype.init = function init () {
39365 var vi = this;
39366 if (vi.destroyed) { return; }
39367 if (vi.ad) { vi.ad.initAd(); }
39368 };
39369
39370 ViAd.prototype.destroy = function destroy () {
39371 var vi = this;
39372 vi.destroyed = true;
39373 vi.emit('local::beforeDestroy');
39374 Utils.deleteProps(vi);
39375 };
39376
39377 return ViAd;
39378 }(Framework7Class));
39379
39380 var Vi = {
39381 name: 'vi',
39382 params: {
39383 vi: {
39384 enabled: false,
39385 autoplay: true,
39386 fallbackOverlay: true,
39387 fallbackOverlayText: 'Please watch this ad',
39388 showMute: true,
39389 startMuted: (Device.ios || Device.android) && !Device.cordova,
39390 appId: null,
39391 appVer: null,
39392 language: null,
39393 width: null,
39394 height: null,
39395 placementId: 'pltd4o7ibb9rc653x14',
39396 placementType: 'interstitial',
39397 videoSlot: null,
39398 showProgress: true,
39399 showBranding: true,
39400 os: null,
39401 osVersion: null,
39402 orientation: null,
39403 age: null,
39404 gender: null,
39405 advertiserId: null,
39406 latitude: null,
39407 longitude: null,
39408 accuracy: null,
39409 storeId: null,
39410 ip: null,
39411 manufacturer: null,
39412 model: null,
39413 connectionType: null,
39414 connectionProvider: null,
39415 },
39416 },
39417 create: function create() {
39418 var app = this;
39419 app.vi = {
39420 sdkReady: false,
39421 createAd: function createAd(adParams) {
39422 return new ViAd(app, adParams);
39423 },
39424 loadSdk: function loadSdk() {
39425 if (app.vi.sdkReady) { return; }
39426 var script = doc.createElement('script');
39427 script.onload = function onload() {
39428 app.emit('viSdkReady');
39429 app.vi.sdkReady = true;
39430 };
39431 script.src = 'https://c.vi-serve.com/viadshtml/vi.min.js';
39432 $('head').append(script);
39433 },
39434 };
39435 },
39436 on: {
39437 init: function init() {
39438 var app = this;
39439 if (app.params.vi.enabled || (app.passedParams.vi && app.passedParams.vi.enabled !== false)) { app.vi.loadSdk(); }
39440 },
39441 },
39442 };
39443
39444 var Elevation = {
39445 name: 'elevation',
39446 };
39447
39448 var Typography = {
39449 name: 'typography',
39450 };
39451
39452 {
39453 if (typeof window !== 'undefined') {
39454 // Template7
39455 if (!window.Template7) { window.Template7 = Template7; }
39456
39457 // Dom7
39458 if (!window.Dom7) { window.Dom7 = $; }
39459 }
39460 }
39461
39462 // Install Core Modules & Components
39463 Router.use([
39464 RouterTemplateLoaderModule,
39465 RouterComponentLoaderModule ]);
39466
39467 Framework7.use([
39468 DeviceModule,
39469 SupportModule,
39470 UtilsModule,
39471 ResizeModule,
39472 RequestModule,
39473 TouchModule,
39474 ClicksModule,
5d51ea26 39475 RouterModule,
5309fbda
DC
39476 HistoryModule,
39477 StorageModule,
39478 ComponentModule,
39479 ServiceWorkerModule,
39480 Statusbar$1,
39481 View$1,
39482 Navbar$1,
39483 Toolbar$1,
39484 Subnavbar,
39485 TouchRipple$1,
39486 Modal$1,
5d51ea26 39487 Appbar,
5309fbda
DC
39488 Dialog$1,
39489 Popup$1,
39490 LoginScreen$1,
39491 Popover$1,
39492 Actions$1,
39493 Sheet$1,
39494 Toast$1,
39495 Preloader$1,
39496 Progressbar$1,
39497 Sortable$1,
39498 Swipeout$1,
39499 Accordion$1,
39500 ContactsList,
39501 VirtualList$1,
39502 ListIndex$1,
39503 Timeline,
39504 Tabs,
39505 Panel$1,
39506 Card,
39507 Chip,
39508 Form,
39509 Input$1,
39510 Checkbox,
39511 Radio,
39512 Toggle$1,
39513 Range$1,
39514 Stepper$1,
39515 SmartSelect$1,
39516 Grid,
39517 Calendar$1,
39518 Picker$1,
39519 InfiniteScroll$1,
39520 PullToRefresh$1,
39521 Lazy$1,
39522 DataTable$1,
39523 Fab$1,
39524 Searchbar$1,
39525 Messages$1,
39526 Messagebar$1,
39527 Swiper$1,
39528 PhotoBrowser$1,
39529 Notification$1,
39530 Autocomplete$1,
39531 Tooltip$1,
39532 Gauge$1,
39533 Skeleton,
39534 Menu$1,
5d51ea26
DC
39535 ColorPicker$1,
39536 Treeview$1,
5309fbda
DC
39537 Vi,
39538 Elevation,
39539 Typography
39540 ]);
39541
39542 return Framework7;
39543
39544}));