comparison docs/tutorial/uikit.js @ 3376:aad37ffd7d58

doc: import the training support Import the training support which was stored in a private-repository before.
author Boris Feld <boris.feld@octobus.net>
date Mon, 08 Jan 2018 11:46:53 +0100
parents
children
comparison
equal deleted inserted replaced
3375:1cb549cd6236 3376:aad37ffd7d58
1 /*! UIkit 2.25.0 | http://www.getuikit.com | (c) 2014 YOOtheme | MIT License */
2 (function(core) {
3
4 if (typeof define == "function" && define.amd) { // AMD
5
6 define("uikit", function(){
7
8 var uikit = window.UIkit || core(window, window.jQuery, window.document);
9
10 uikit.load = function(res, req, onload, config) {
11
12 var resources = res.split(','), load = [], i, base = (config.config && config.config.uikit && config.config.uikit.base ? config.config.uikit.base : "").replace(/\/+$/g, "");
13
14 if (!base) {
15 throw new Error( "Please define base path to UIkit in the requirejs config." );
16 }
17
18 for (i = 0; i < resources.length; i += 1) {
19 var resource = resources[i].replace(/\./g, '/');
20 load.push(base+'/components/'+resource);
21 }
22
23 req(load, function() {
24 onload(uikit);
25 });
26 };
27
28 return uikit;
29 });
30 }
31
32 if (!window.jQuery) {
33 throw new Error( "UIkit requires jQuery" );
34 }
35
36 if (window && window.jQuery) {
37 core(window, window.jQuery, window.document);
38 }
39
40
41 })(function(global, $, doc) {
42
43 "use strict";
44
45 var UI = {}, _UI = global.UIkit ? Object.create(global.UIkit) : undefined;
46
47 UI.version = '2.25.0';
48
49 UI.noConflict = function() {
50 // restore UIkit version
51 if (_UI) {
52 global.UIkit = _UI;
53 $.UIkit = _UI;
54 $.fn.uk = _UI.fn;
55 }
56
57 return UI;
58 };
59
60 UI.prefix = function(str) {
61 return str;
62 };
63
64 // cache jQuery
65 UI.$ = $;
66
67 UI.$doc = UI.$(document);
68 UI.$win = UI.$(window);
69 UI.$html = UI.$('html');
70
71 UI.support = {};
72 UI.support.transition = (function() {
73
74 var transitionEnd = (function() {
75
76 var element = doc.body || doc.documentElement,
77 transEndEventNames = {
78 WebkitTransition : 'webkitTransitionEnd',
79 MozTransition : 'transitionend',
80 OTransition : 'oTransitionEnd otransitionend',
81 transition : 'transitionend'
82 }, name;
83
84 for (name in transEndEventNames) {
85 if (element.style[name] !== undefined) return transEndEventNames[name];
86 }
87 }());
88
89 return transitionEnd && { end: transitionEnd };
90 })();
91
92 UI.support.animation = (function() {
93
94 var animationEnd = (function() {
95
96 var element = doc.body || doc.documentElement,
97 animEndEventNames = {
98 WebkitAnimation : 'webkitAnimationEnd',
99 MozAnimation : 'animationend',
100 OAnimation : 'oAnimationEnd oanimationend',
101 animation : 'animationend'
102 }, name;
103
104 for (name in animEndEventNames) {
105 if (element.style[name] !== undefined) return animEndEventNames[name];
106 }
107 }());
108
109 return animationEnd && { end: animationEnd };
110 })();
111
112 // requestAnimationFrame polyfill
113 //https://github.com/darius/requestAnimationFrame
114 (function() {
115
116 Date.now = Date.now || function() { return new Date().getTime(); };
117
118 var vendors = ['webkit', 'moz'];
119 for (var i = 0; i < vendors.length && !window.requestAnimationFrame; ++i) {
120 var vp = vendors[i];
121 window.requestAnimationFrame = window[vp+'RequestAnimationFrame'];
122 window.cancelAnimationFrame = (window[vp+'CancelAnimationFrame']
123 || window[vp+'CancelRequestAnimationFrame']);
124 }
125 if (/iP(ad|hone|od).*OS 6/.test(window.navigator.userAgent) // iOS6 is buggy
126 || !window.requestAnimationFrame || !window.cancelAnimationFrame) {
127 var lastTime = 0;
128 window.requestAnimationFrame = function(callback) {
129 var now = Date.now();
130 var nextTime = Math.max(lastTime + 16, now);
131 return setTimeout(function() { callback(lastTime = nextTime); },
132 nextTime - now);
133 };
134 window.cancelAnimationFrame = clearTimeout;
135 }
136 }());
137
138 UI.support.touch = (
139 ('ontouchstart' in document) ||
140 (global.DocumentTouch && document instanceof global.DocumentTouch) ||
141 (global.navigator.msPointerEnabled && global.navigator.msMaxTouchPoints > 0) || //IE 10
142 (global.navigator.pointerEnabled && global.navigator.maxTouchPoints > 0) || //IE >=11
143 false
144 );
145
146 UI.support.mutationobserver = (global.MutationObserver || global.WebKitMutationObserver || null);
147
148 UI.Utils = {};
149
150 UI.Utils.isFullscreen = function() {
151 return document.webkitFullscreenElement || document.mozFullScreenElement || document.msFullscreenElement || document.fullscreenElement || false;
152 };
153
154 UI.Utils.str2json = function(str, notevil) {
155 try {
156 if (notevil) {
157 return JSON.parse(str
158 // wrap keys without quote with valid double quote
159 .replace(/([\$\w]+)\s*:/g, function(_, $1){return '"'+$1+'":';})
160 // replacing single quote wrapped ones to double quote
161 .replace(/'([^']+)'/g, function(_, $1){return '"'+$1+'"';})
162 );
163 } else {
164 return (new Function("", "var json = " + str + "; return JSON.parse(JSON.stringify(json));"))();
165 }
166 } catch(e) { return false; }
167 };
168
169 UI.Utils.debounce = function(func, wait, immediate) {
170 var timeout;
171 return function() {
172 var context = this, args = arguments;
173 var later = function() {
174 timeout = null;
175 if (!immediate) func.apply(context, args);
176 };
177 var callNow = immediate && !timeout;
178 clearTimeout(timeout);
179 timeout = setTimeout(later, wait);
180 if (callNow) func.apply(context, args);
181 };
182 };
183
184 UI.Utils.removeCssRules = function(selectorRegEx) {
185 var idx, idxs, stylesheet, _i, _j, _k, _len, _len1, _len2, _ref;
186
187 if(!selectorRegEx) return;
188
189 setTimeout(function(){
190 try {
191 _ref = document.styleSheets;
192 for (_i = 0, _len = _ref.length; _i < _len; _i++) {
193 stylesheet = _ref[_i];
194 idxs = [];
195 stylesheet.cssRules = stylesheet.cssRules;
196 for (idx = _j = 0, _len1 = stylesheet.cssRules.length; _j < _len1; idx = ++_j) {
197 if (stylesheet.cssRules[idx].type === CSSRule.STYLE_RULE && selectorRegEx.test(stylesheet.cssRules[idx].selectorText)) {
198 idxs.unshift(idx);
199 }
200 }
201 for (_k = 0, _len2 = idxs.length; _k < _len2; _k++) {
202 stylesheet.deleteRule(idxs[_k]);
203 }
204 }
205 } catch (_error) {}
206 }, 0);
207 };
208
209 UI.Utils.isInView = function(element, options) {
210
211 var $element = $(element);
212
213 if (!$element.is(':visible')) {
214 return false;
215 }
216
217 var window_left = UI.$win.scrollLeft(), window_top = UI.$win.scrollTop(), offset = $element.offset(), left = offset.left, top = offset.top;
218
219 options = $.extend({topoffset:0, leftoffset:0}, options);
220
221 if (top + $element.height() >= window_top && top - options.topoffset <= window_top + UI.$win.height() &&
222 left + $element.width() >= window_left && left - options.leftoffset <= window_left + UI.$win.width()) {
223 return true;
224 } else {
225 return false;
226 }
227 };
228
229 UI.Utils.checkDisplay = function(context, initanimation) {
230
231 var elements = UI.$('[data-uk-margin], [data-uk-grid-match], [data-uk-grid-margin], [data-uk-check-display]', context || document), animated;
232
233 if (context && !elements.length) {
234 elements = $(context);
235 }
236
237 elements.trigger('display.uk.check');
238
239 // fix firefox / IE animations
240 if (initanimation) {
241
242 if (typeof(initanimation)!='string') {
243 initanimation = '[class*="uk-animation-"]';
244 }
245
246 elements.find(initanimation).each(function(){
247
248 var ele = UI.$(this),
249 cls = ele.attr('class'),
250 anim = cls.match(/uk\-animation\-(.+)/);
251
252 ele.removeClass(anim[0]).width();
253
254 ele.addClass(anim[0]);
255 });
256 }
257
258 return elements;
259 };
260
261 UI.Utils.options = function(string) {
262
263 if ($.type(string)!='string') return string;
264
265 if (string.indexOf(':') != -1 && string.trim().substr(-1) != '}') {
266 string = '{'+string+'}';
267 }
268
269 var start = (string ? string.indexOf("{") : -1), options = {};
270
271 if (start != -1) {
272 try {
273 options = UI.Utils.str2json(string.substr(start));
274 } catch (e) {}
275 }
276
277 return options;
278 };
279
280 UI.Utils.animate = function(element, cls) {
281
282 var d = $.Deferred();
283
284 element = UI.$(element);
285
286 element.css('display', 'none').addClass(cls).one(UI.support.animation.end, function() {
287 element.removeClass(cls);
288 d.resolve();
289 });
290
291 element.css('display', '');
292
293 return d.promise();
294 };
295
296 UI.Utils.uid = function(prefix) {
297 return (prefix || 'id') + (new Date().getTime())+"RAND"+(Math.ceil(Math.random() * 100000));
298 };
299
300 UI.Utils.template = function(str, data) {
301
302 var tokens = str.replace(/\n/g, '\\n').replace(/\{\{\{\s*(.+?)\s*\}\}\}/g, "{{!$1}}").split(/(\{\{\s*(.+?)\s*\}\})/g),
303 i=0, toc, cmd, prop, val, fn, output = [], openblocks = 0;
304
305 while(i < tokens.length) {
306
307 toc = tokens[i];
308
309 if(toc.match(/\{\{\s*(.+?)\s*\}\}/)) {
310 i = i + 1;
311 toc = tokens[i];
312 cmd = toc[0];
313 prop = toc.substring(toc.match(/^(\^|\#|\!|\~|\:)/) ? 1:0);
314
315 switch(cmd) {
316 case '~':
317 output.push("for(var $i=0;$i<"+prop+".length;$i++) { var $item = "+prop+"[$i];");
318 openblocks++;
319 break;
320 case ':':
321 output.push("for(var $key in "+prop+") { var $val = "+prop+"[$key];");
322 openblocks++;
323 break;
324 case '#':
325 output.push("if("+prop+") {");
326 openblocks++;
327 break;
328 case '^':
329 output.push("if(!"+prop+") {");
330 openblocks++;
331 break;
332 case '/':
333 output.push("}");
334 openblocks--;
335 break;
336 case '!':
337 output.push("__ret.push("+prop+");");
338 break;
339 default:
340 output.push("__ret.push(escape("+prop+"));");
341 break;
342 }
343 } else {
344 output.push("__ret.push('"+toc.replace(/\'/g, "\\'")+"');");
345 }
346 i = i + 1;
347 }
348
349 fn = new Function('$data', [
350 'var __ret = [];',
351 'try {',
352 'with($data){', (!openblocks ? output.join('') : '__ret = ["Not all blocks are closed correctly."]'), '};',
353 '}catch(e){__ret = [e.message];}',
354 'return __ret.join("").replace(/\\n\\n/g, "\\n");',
355 "function escape(html) { return String(html).replace(/&/g, '&amp;').replace(/\"/g, '&quot;').replace(/</g, '&lt;').replace(/>/g, '&gt;');}"
356 ].join("\n"));
357
358 return data ? fn(data) : fn;
359 };
360
361 UI.Utils.events = {};
362 UI.Utils.events.click = UI.support.touch ? 'tap' : 'click';
363
364 global.UIkit = UI;
365
366 // deprecated
367
368 UI.fn = function(command, options) {
369
370 var args = arguments, cmd = command.match(/^([a-z\-]+)(?:\.([a-z]+))?/i), component = cmd[1], method = cmd[2];
371
372 if (!UI[component]) {
373 $.error("UIkit component [" + component + "] does not exist.");
374 return this;
375 }
376
377 return this.each(function() {
378 var $this = $(this), data = $this.data(component);
379 if (!data) $this.data(component, (data = UI[component](this, method ? undefined : options)));
380 if (method) data[method].apply(data, Array.prototype.slice.call(args, 1));
381 });
382 };
383
384 $.UIkit = UI;
385 $.fn.uk = UI.fn;
386
387 UI.langdirection = UI.$html.attr("dir") == "rtl" ? "right" : "left";
388
389 UI.components = {};
390
391 UI.component = function(name, def) {
392
393 var fn = function(element, options) {
394
395 var $this = this;
396
397 this.UIkit = UI;
398 this.element = element ? UI.$(element) : null;
399 this.options = $.extend(true, {}, this.defaults, options);
400 this.plugins = {};
401
402 if (this.element) {
403 this.element.data(name, this);
404 }
405
406 this.init();
407
408 (this.options.plugins.length ? this.options.plugins : Object.keys(fn.plugins)).forEach(function(plugin) {
409
410 if (fn.plugins[plugin].init) {
411 fn.plugins[plugin].init($this);
412 $this.plugins[plugin] = true;
413 }
414
415 });
416
417 this.trigger('init.uk.component', [name, this]);
418
419 return this;
420 };
421
422 fn.plugins = {};
423
424 $.extend(true, fn.prototype, {
425
426 defaults : {plugins: []},
427
428 boot: function(){},
429 init: function(){},
430
431 on: function(a1,a2,a3){
432 return UI.$(this.element || this).on(a1,a2,a3);
433 },
434
435 one: function(a1,a2,a3){
436 return UI.$(this.element || this).one(a1,a2,a3);
437 },
438
439 off: function(evt){
440 return UI.$(this.element || this).off(evt);
441 },
442
443 trigger: function(evt, params) {
444 return UI.$(this.element || this).trigger(evt, params);
445 },
446
447 find: function(selector) {
448 return UI.$(this.element ? this.element: []).find(selector);
449 },
450
451 proxy: function(obj, methods) {
452
453 var $this = this;
454
455 methods.split(' ').forEach(function(method) {
456 if (!$this[method]) $this[method] = function() { return obj[method].apply(obj, arguments); };
457 });
458 },
459
460 mixin: function(obj, methods) {
461
462 var $this = this;
463
464 methods.split(' ').forEach(function(method) {
465 if (!$this[method]) $this[method] = obj[method].bind($this);
466 });
467 },
468
469 option: function() {
470
471 if (arguments.length == 1) {
472 return this.options[arguments[0]] || undefined;
473 } else if (arguments.length == 2) {
474 this.options[arguments[0]] = arguments[1];
475 }
476 }
477
478 }, def);
479
480 this.components[name] = fn;
481
482 this[name] = function() {
483
484 var element, options;
485
486 if (arguments.length) {
487
488 switch(arguments.length) {
489 case 1:
490
491 if (typeof arguments[0] === "string" || arguments[0].nodeType || arguments[0] instanceof jQuery) {
492 element = $(arguments[0]);
493 } else {
494 options = arguments[0];
495 }
496
497 break;
498 case 2:
499
500 element = $(arguments[0]);
501 options = arguments[1];
502 break;
503 }
504 }
505
506 if (element && element.data(name)) {
507 return element.data(name);
508 }
509
510 return (new UI.components[name](element, options));
511 };
512
513 if (UI.domready) {
514 UI.component.boot(name);
515 }
516
517 return fn;
518 };
519
520 UI.plugin = function(component, name, def) {
521 this.components[component].plugins[name] = def;
522 };
523
524 UI.component.boot = function(name) {
525
526 if (UI.components[name].prototype && UI.components[name].prototype.boot && !UI.components[name].booted) {
527 UI.components[name].prototype.boot.apply(UI, []);
528 UI.components[name].booted = true;
529 }
530 };
531
532 UI.component.bootComponents = function() {
533
534 for (var component in UI.components) {
535 UI.component.boot(component);
536 }
537 };
538
539
540 // DOM mutation save ready helper function
541
542 UI.domObservers = [];
543 UI.domready = false;
544
545 UI.ready = function(fn) {
546
547 UI.domObservers.push(fn);
548
549 if (UI.domready) {
550 fn(document);
551 }
552 };
553
554 UI.on = function(a1,a2,a3){
555
556 if (a1 && a1.indexOf('ready.uk.dom') > -1 && UI.domready) {
557 a2.apply(UI.$doc);
558 }
559
560 return UI.$doc.on(a1,a2,a3);
561 };
562
563 UI.one = function(a1,a2,a3){
564
565 if (a1 && a1.indexOf('ready.uk.dom') > -1 && UI.domready) {
566 a2.apply(UI.$doc);
567 return UI.$doc;
568 }
569
570 return UI.$doc.one(a1,a2,a3);
571 };
572
573 UI.trigger = function(evt, params) {
574 return UI.$doc.trigger(evt, params);
575 };
576
577 UI.domObserve = function(selector, fn) {
578
579 if(!UI.support.mutationobserver) return;
580
581 fn = fn || function() {};
582
583 UI.$(selector).each(function() {
584
585 var element = this,
586 $element = UI.$(element);
587
588 if ($element.data('observer')) {
589 return;
590 }
591
592 try {
593
594 var observer = new UI.support.mutationobserver(UI.Utils.debounce(function(mutations) {
595 fn.apply(element, []);
596 $element.trigger('changed.uk.dom');
597 }, 50));
598
599 // pass in the target node, as well as the observer options
600 observer.observe(element, { childList: true, subtree: true });
601
602 $element.data('observer', observer);
603
604 } catch(e) {}
605 });
606 };
607
608 UI.init = function(root) {
609
610 root = root || document;
611
612 UI.domObservers.forEach(function(fn){
613 fn(root);
614 });
615 };
616
617 UI.on('domready.uk.dom', function(){
618
619 UI.init();
620
621 if (UI.domready) UI.Utils.checkDisplay();
622 });
623
624 document.addEventListener('DOMContentLoaded', function(){
625
626 var domReady = function() {
627
628 UI.$body = UI.$('body');
629
630 UI.ready(function(context){
631 UI.domObserve('[data-uk-observe]');
632 });
633
634 UI.on('changed.uk.dom', function(e) {
635 UI.init(e.target);
636 UI.Utils.checkDisplay(e.target);
637 });
638
639 UI.trigger('beforeready.uk.dom');
640
641 UI.component.bootComponents();
642
643 // custom scroll observer
644 requestAnimationFrame((function(){
645
646 var memory = {dir: {x:0, y:0}, x: window.pageXOffset, y:window.pageYOffset};
647
648 var fn = function(){
649 // reading this (window.page[X|Y]Offset) causes a full page recalc of the layout in Chrome,
650 // so we only want to do this once
651 var wpxo = window.pageXOffset;
652 var wpyo = window.pageYOffset;
653
654 // Did the scroll position change since the last time we were here?
655 if (memory.x != wpxo || memory.y != wpyo) {
656
657 // Set the direction of the scroll and store the new position
658 if (wpxo != memory.x) {memory.dir.x = wpxo > memory.x ? 1:-1; } else { memory.dir.x = 0; }
659 if (wpyo != memory.y) {memory.dir.y = wpyo > memory.y ? 1:-1; } else { memory.dir.y = 0; }
660
661 memory.x = wpxo;
662 memory.y = wpyo;
663
664 // Trigger the scroll event, this could probably be sent using memory.clone() but this is
665 // more explicit and easier to see exactly what is being sent in the event.
666 UI.$doc.trigger('scrolling.uk.document', [{
667 "dir": {"x": memory.dir.x, "y": memory.dir.y}, "x": wpxo, "y": wpyo
668 }]);
669 }
670
671 requestAnimationFrame(fn);
672 };
673
674 if (UI.support.touch) {
675 UI.$html.on('touchmove touchend MSPointerMove MSPointerUp pointermove pointerup', fn);
676 }
677
678 if (memory.x || memory.y) fn();
679
680 return fn;
681
682 })());
683
684 // run component init functions on dom
685 UI.trigger('domready.uk.dom');
686
687 if (UI.support.touch) {
688
689 // remove css hover rules for touch devices
690 // UI.Utils.removeCssRules(/\.uk-(?!navbar).*:hover/);
691
692 // viewport unit fix for uk-height-viewport - should be fixed in iOS 8
693 if (navigator.userAgent.match(/(iPad|iPhone|iPod)/g)) {
694
695 UI.$win.on('load orientationchange resize', UI.Utils.debounce((function(){
696
697 var fn = function() {
698 $('.uk-height-viewport').css('height', window.innerHeight);
699 return fn;
700 };
701
702 return fn();
703
704 })(), 100));
705 }
706 }
707
708 UI.trigger('afterready.uk.dom');
709
710 // mark that domready is left behind
711 UI.domready = true;
712 };
713
714 if (document.readyState == 'complete' || document.readyState == 'interactive') {
715 setTimeout(domReady);
716 }
717
718 return domReady;
719
720 }());
721
722 // add touch identifier class
723 UI.$html.addClass(UI.support.touch ? "uk-touch" : "uk-notouch");
724
725 // add uk-hover class on tap to support overlays on touch devices
726 if (UI.support.touch) {
727
728 var hoverset = false,
729 exclude,
730 hovercls = 'uk-hover',
731 selector = '.uk-overlay, .uk-overlay-hover, .uk-overlay-toggle, .uk-animation-hover, .uk-has-hover';
732
733 UI.$html.on('mouseenter touchstart MSPointerDown pointerdown', selector, function() {
734
735 if (hoverset) $('.'+hovercls).removeClass(hovercls);
736
737 hoverset = $(this).addClass(hovercls);
738
739 }).on('mouseleave touchend MSPointerUp pointerup', function(e) {
740
741 exclude = $(e.target).parents(selector);
742
743 if (hoverset) {
744 hoverset.not(exclude).removeClass(hovercls);
745 }
746 });
747 }
748
749 return UI;
750 });
751
752 // Based on Zeptos touch.js
753 // https://raw.github.com/madrobby/zepto/master/src/touch.js
754 // Zepto.js may be freely distributed under the MIT license.
755
756 ;(function($){
757
758 if ($.fn.swipeLeft) {
759 return;
760 }
761
762
763 var touch = {}, touchTimeout, tapTimeout, swipeTimeout, longTapTimeout, longTapDelay = 750, gesture;
764
765 function swipeDirection(x1, x2, y1, y2) {
766 return Math.abs(x1 - x2) >= Math.abs(y1 - y2) ? (x1 - x2 > 0 ? 'Left' : 'Right') : (y1 - y2 > 0 ? 'Up' : 'Down');
767 }
768
769 function longTap() {
770 longTapTimeout = null;
771 if (touch.last) {
772 if ( touch.el !== undefined ) touch.el.trigger('longTap');
773 touch = {};
774 }
775 }
776
777 function cancelLongTap() {
778 if (longTapTimeout) clearTimeout(longTapTimeout);
779 longTapTimeout = null;
780 }
781
782 function cancelAll() {
783 if (touchTimeout) clearTimeout(touchTimeout);
784 if (tapTimeout) clearTimeout(tapTimeout);
785 if (swipeTimeout) clearTimeout(swipeTimeout);
786 if (longTapTimeout) clearTimeout(longTapTimeout);
787 touchTimeout = tapTimeout = swipeTimeout = longTapTimeout = null;
788 touch = {};
789 }
790
791 function isPrimaryTouch(event){
792 return event.pointerType == event.MSPOINTER_TYPE_TOUCH && event.isPrimary;
793 }
794
795 $(function(){
796 var now, delta, deltaX = 0, deltaY = 0, firstTouch;
797
798 if ('MSGesture' in window) {
799 gesture = new MSGesture();
800 gesture.target = document.body;
801 }
802
803 $(document)
804 .on('MSGestureEnd gestureend', function(e){
805
806 var swipeDirectionFromVelocity = e.originalEvent.velocityX > 1 ? 'Right' : e.originalEvent.velocityX < -1 ? 'Left' : e.originalEvent.velocityY > 1 ? 'Down' : e.originalEvent.velocityY < -1 ? 'Up' : null;
807
808 if (swipeDirectionFromVelocity && touch.el !== undefined) {
809 touch.el.trigger('swipe');
810 touch.el.trigger('swipe'+ swipeDirectionFromVelocity);
811 }
812 })
813 // MSPointerDown: for IE10
814 // pointerdown: for IE11
815 .on('touchstart MSPointerDown pointerdown', function(e){
816
817 if(e.type == 'MSPointerDown' && !isPrimaryTouch(e.originalEvent)) return;
818
819 firstTouch = (e.type == 'MSPointerDown' || e.type == 'pointerdown') ? e : e.originalEvent.touches[0];
820
821 now = Date.now();
822 delta = now - (touch.last || now);
823 touch.el = $('tagName' in firstTouch.target ? firstTouch.target : firstTouch.target.parentNode);
824
825 if(touchTimeout) clearTimeout(touchTimeout);
826
827 touch.x1 = firstTouch.pageX;
828 touch.y1 = firstTouch.pageY;
829
830 if (delta > 0 && delta <= 250) touch.isDoubleTap = true;
831
832 touch.last = now;
833 longTapTimeout = setTimeout(longTap, longTapDelay);
834
835 // adds the current touch contact for IE gesture recognition
836 if (gesture && ( e.type == 'MSPointerDown' || e.type == 'pointerdown' || e.type == 'touchstart' ) ) {
837 gesture.addPointer(e.originalEvent.pointerId);
838 }
839
840 })
841 // MSPointerMove: for IE10
842 // pointermove: for IE11
843 .on('touchmove MSPointerMove pointermove', function(e){
844
845 if (e.type == 'MSPointerMove' && !isPrimaryTouch(e.originalEvent)) return;
846
847 firstTouch = (e.type == 'MSPointerMove' || e.type == 'pointermove') ? e : e.originalEvent.touches[0];
848
849 cancelLongTap();
850 touch.x2 = firstTouch.pageX;
851 touch.y2 = firstTouch.pageY;
852
853 deltaX += Math.abs(touch.x1 - touch.x2);
854 deltaY += Math.abs(touch.y1 - touch.y2);
855 })
856 // MSPointerUp: for IE10
857 // pointerup: for IE11
858 .on('touchend MSPointerUp pointerup', function(e){
859
860 if (e.type == 'MSPointerUp' && !isPrimaryTouch(e.originalEvent)) return;
861
862 cancelLongTap();
863
864 // swipe
865 if ((touch.x2 && Math.abs(touch.x1 - touch.x2) > 30) || (touch.y2 && Math.abs(touch.y1 - touch.y2) > 30)){
866
867 swipeTimeout = setTimeout(function() {
868 if ( touch.el !== undefined ) {
869 touch.el.trigger('swipe');
870 touch.el.trigger('swipe' + (swipeDirection(touch.x1, touch.x2, touch.y1, touch.y2)));
871 }
872 touch = {};
873 }, 0);
874
875 // normal tap
876 } else if ('last' in touch) {
877
878 // don't fire tap when delta position changed by more than 30 pixels,
879 // for instance when moving to a point and back to origin
880 if (isNaN(deltaX) || (deltaX < 30 && deltaY < 30)) {
881 // delay by one tick so we can cancel the 'tap' event if 'scroll' fires
882 // ('tap' fires before 'scroll')
883 tapTimeout = setTimeout(function() {
884
885 // trigger universal 'tap' with the option to cancelTouch()
886 // (cancelTouch cancels processing of single vs double taps for faster 'tap' response)
887 var event = $.Event('tap');
888 event.cancelTouch = cancelAll;
889 if ( touch.el !== undefined ) touch.el.trigger(event);
890
891 // trigger double tap immediately
892 if (touch.isDoubleTap) {
893 if ( touch.el !== undefined ) touch.el.trigger('doubleTap');
894 touch = {};
895 }
896
897 // trigger single tap after 250ms of inactivity
898 else {
899 touchTimeout = setTimeout(function(){
900 touchTimeout = null;
901 if ( touch.el !== undefined ) touch.el.trigger('singleTap');
902 touch = {};
903 }, 250);
904 }
905 }, 0);
906 } else {
907 touch = {};
908 }
909 deltaX = deltaY = 0;
910 }
911 })
912 // when the browser window loses focus,
913 // for example when a modal dialog is shown,
914 // cancel all ongoing events
915 .on('touchcancel MSPointerCancel', cancelAll);
916
917 // scrolling the window indicates intention of the user
918 // to scroll, not tap or swipe, so cancel all ongoing events
919 $(window).on('scroll', cancelAll);
920 });
921
922 ['swipe', 'swipeLeft', 'swipeRight', 'swipeUp', 'swipeDown', 'doubleTap', 'tap', 'singleTap', 'longTap'].forEach(function(eventName){
923 $.fn[eventName] = function(callback){ return $(this).on(eventName, callback); };
924 });
925 })(jQuery);
926
927 (function(UI) {
928
929 "use strict";
930
931 var stacks = [];
932
933 UI.component('stackMargin', {
934
935 defaults: {
936 cls: 'uk-margin-small-top',
937 rowfirst: false
938 },
939
940 boot: function() {
941
942 // init code
943 UI.ready(function(context) {
944
945 UI.$("[data-uk-margin]", context).each(function() {
946
947 var ele = UI.$(this);
948
949 if (!ele.data("stackMargin")) {
950 UI.stackMargin(ele, UI.Utils.options(ele.attr("data-uk-margin")));
951 }
952 });
953 });
954 },
955
956 init: function() {
957
958 var $this = this;
959
960 UI.$win.on('resize orientationchange', (function() {
961
962 var fn = function() {
963 $this.process();
964 };
965
966 UI.$(function() {
967 fn();
968 UI.$win.on("load", fn);
969 });
970
971 return UI.Utils.debounce(fn, 20);
972 })());
973
974 UI.$html.on("changed.uk.dom", function(e) {
975 $this.process();
976 });
977
978 this.on("display.uk.check", function(e) {
979 if (this.element.is(":visible")) this.process();
980 }.bind(this));
981
982 stacks.push(this);
983 },
984
985 process: function() {
986
987 var $this = this, columns = this.element.children();
988
989 UI.Utils.stackMargin(columns, this.options);
990
991 if (!this.options.rowfirst) {
992 return this;
993 }
994
995 // Mark first column elements
996 var pos_cache = columns.removeClass(this.options.rowfirst).filter(':visible').first().position();
997
998 if (pos_cache) {
999 columns.each(function() {
1000 UI.$(this)[UI.$(this).position().left == pos_cache.left ? 'addClass':'removeClass']($this.options.rowfirst);
1001 });
1002 }
1003
1004 return this;
1005 }
1006
1007 });
1008
1009
1010 // responsive element e.g. iframes
1011
1012 (function(){
1013
1014 var elements = [], check = function(ele) {
1015
1016 if (!ele.is(':visible')) return;
1017
1018 var width = ele.parent().width(),
1019 iwidth = ele.data('width'),
1020 ratio = (width / iwidth),
1021 height = Math.floor(ratio * ele.data('height'));
1022
1023 ele.css({'height': (width < iwidth) ? height : ele.data('height')});
1024 };
1025
1026 UI.component('responsiveElement', {
1027
1028 defaults: {},
1029
1030 boot: function() {
1031
1032 // init code
1033 UI.ready(function(context) {
1034
1035 UI.$("iframe.uk-responsive-width, [data-uk-responsive]", context).each(function() {
1036
1037 var ele = UI.$(this), obj;
1038
1039 if (!ele.data("responsiveElement")) {
1040 obj = UI.responsiveElement(ele, {});
1041 }
1042 });
1043 });
1044 },
1045
1046 init: function() {
1047
1048 var ele = this.element;
1049
1050 if (ele.attr('width') && ele.attr('height')) {
1051
1052 ele.data({
1053
1054 'width' : ele.attr('width'),
1055 'height': ele.attr('height')
1056
1057 }).on('display.uk.check', function(){
1058 check(ele);
1059 });
1060
1061 check(ele);
1062
1063 elements.push(ele);
1064 }
1065 }
1066 });
1067
1068 UI.$win.on('resize load', UI.Utils.debounce(function(){
1069
1070 elements.forEach(function(ele){
1071 check(ele);
1072 });
1073
1074 }, 15));
1075
1076 })();
1077
1078
1079
1080 // helper
1081
1082 UI.Utils.stackMargin = function(elements, options) {
1083
1084 options = UI.$.extend({
1085 'cls': 'uk-margin-small-top'
1086 }, options);
1087
1088 options.cls = options.cls;
1089
1090 elements = UI.$(elements).removeClass(options.cls);
1091
1092 var skip = false,
1093 firstvisible = elements.filter(":visible:first"),
1094 offset = firstvisible.length ? (firstvisible.position().top + firstvisible.outerHeight()) - 1 : false; // (-1): weird firefox bug when parent container is display:flex
1095
1096 if (offset === false || elements.length == 1) return;
1097
1098 elements.each(function() {
1099
1100 var column = UI.$(this);
1101
1102 if (column.is(":visible")) {
1103
1104 if (skip) {
1105 column.addClass(options.cls);
1106 } else {
1107
1108 if (column.position().top >= offset) {
1109 skip = column.addClass(options.cls);
1110 }
1111 }
1112 }
1113 });
1114 };
1115
1116 UI.Utils.matchHeights = function(elements, options) {
1117
1118 elements = UI.$(elements).css('min-height', '');
1119 options = UI.$.extend({ row : true }, options);
1120
1121 var matchHeights = function(group){
1122
1123 if (group.length < 2) return;
1124
1125 var max = 0;
1126
1127 group.each(function() {
1128 max = Math.max(max, UI.$(this).outerHeight());
1129 }).each(function() {
1130
1131 var element = UI.$(this),
1132 height = max - (element.css('box-sizing') == 'border-box' ? 0 : (element.outerHeight() - element.height()));
1133
1134 element.css('min-height', height + 'px');
1135 });
1136 };
1137
1138 if (options.row) {
1139
1140 elements.first().width(); // force redraw
1141
1142 setTimeout(function(){
1143
1144 var lastoffset = false, group = [];
1145
1146 elements.each(function() {
1147
1148 var ele = UI.$(this), offset = ele.offset().top;
1149
1150 if (offset != lastoffset && group.length) {
1151
1152 matchHeights(UI.$(group));
1153 group = [];
1154 offset = ele.offset().top;
1155 }
1156
1157 group.push(ele);
1158 lastoffset = offset;
1159 });
1160
1161 if (group.length) {
1162 matchHeights(UI.$(group));
1163 }
1164
1165 }, 0);
1166
1167 } else {
1168 matchHeights(elements);
1169 }
1170 };
1171
1172 (function(cacheSvgs){
1173
1174 UI.Utils.inlineSvg = function(selector, root) {
1175
1176 var images = UI.$(selector || 'img[src$=".svg"]', root || document).each(function(){
1177
1178 var img = UI.$(this),
1179 src = img.attr('src');
1180
1181 if (!cacheSvgs[src]) {
1182
1183 var d = UI.$.Deferred();
1184
1185 UI.$.get(src, {nc: Math.random()}, function(data){
1186 d.resolve(UI.$(data).find('svg'));
1187 });
1188
1189 cacheSvgs[src] = d.promise();
1190 }
1191
1192 cacheSvgs[src].then(function(svg) {
1193
1194 var $svg = UI.$(svg).clone();
1195
1196 if (img.attr('id')) $svg.attr('id', img.attr('id'));
1197 if (img.attr('class')) $svg.attr('class', img.attr('class'));
1198 if (img.attr('style')) $svg.attr('style', img.attr('style'));
1199
1200 if (img.attr('width')) {
1201 $svg.attr('width', img.attr('width'));
1202 if (!img.attr('height')) $svg.removeAttr('height');
1203 }
1204
1205 if (img.attr('height')){
1206 $svg.attr('height', img.attr('height'));
1207 if (!img.attr('width')) $svg.removeAttr('width');
1208 }
1209
1210 img.replaceWith($svg);
1211 });
1212 });
1213 };
1214
1215 // init code
1216 UI.ready(function(context) {
1217 UI.Utils.inlineSvg('[data-uk-svg]', context);
1218 });
1219
1220 })({});
1221
1222 })(UIkit);
1223
1224 (function(UI) {
1225
1226 "use strict";
1227
1228 UI.component('smoothScroll', {
1229
1230 boot: function() {
1231
1232 // init code
1233 UI.$html.on("click.smooth-scroll.uikit", "[data-uk-smooth-scroll]", function(e) {
1234 var ele = UI.$(this);
1235
1236 if (!ele.data("smoothScroll")) {
1237 var obj = UI.smoothScroll(ele, UI.Utils.options(ele.attr("data-uk-smooth-scroll")));
1238 ele.trigger("click");
1239 }
1240
1241 return false;
1242 });
1243 },
1244
1245 init: function() {
1246
1247 var $this = this;
1248
1249 this.on("click", function(e) {
1250 e.preventDefault();
1251 scrollToElement(UI.$(this.hash).length ? UI.$(this.hash) : UI.$("body"), $this.options);
1252 });
1253 }
1254 });
1255
1256 function scrollToElement(ele, options) {
1257
1258 options = UI.$.extend({
1259 duration: 1000,
1260 transition: 'easeOutExpo',
1261 offset: 0,
1262 complete: function(){}
1263 }, options);
1264
1265 // get / set parameters
1266 var target = ele.offset().top - options.offset,
1267 docheight = UI.$doc.height(),
1268 winheight = window.innerHeight;
1269
1270 if ((target + winheight) > docheight) {
1271 target = docheight - winheight;
1272 }
1273
1274 // animate to target, fire callback when done
1275 UI.$("html,body").stop().animate({scrollTop: target}, options.duration, options.transition).promise().done(options.complete);
1276 }
1277
1278 UI.Utils.scrollToElement = scrollToElement;
1279
1280 if (!UI.$.easing.easeOutExpo) {
1281 UI.$.easing.easeOutExpo = function(x, t, b, c, d) { return (t == d) ? b + c : c * (-Math.pow(2, -10 * t / d) + 1) + b; };
1282 }
1283
1284 })(UIkit);
1285
1286 (function(UI) {
1287
1288 "use strict";
1289
1290 var $win = UI.$win,
1291 $doc = UI.$doc,
1292 scrollspies = [],
1293 checkScrollSpy = function() {
1294 for(var i=0; i < scrollspies.length; i++) {
1295 window.requestAnimationFrame.apply(window, [scrollspies[i].check]);
1296 }
1297 };
1298
1299 UI.component('scrollspy', {
1300
1301 defaults: {
1302 "target" : false,
1303 "cls" : "uk-scrollspy-inview",
1304 "initcls" : "uk-scrollspy-init-inview",
1305 "topoffset" : 0,
1306 "leftoffset" : 0,
1307 "repeat" : false,
1308 "delay" : 0
1309 },
1310
1311 boot: function() {
1312
1313 // listen to scroll and resize
1314 $doc.on("scrolling.uk.document", checkScrollSpy);
1315 $win.on("load resize orientationchange", UI.Utils.debounce(checkScrollSpy, 50));
1316
1317 // init code
1318 UI.ready(function(context) {
1319
1320 UI.$("[data-uk-scrollspy]", context).each(function() {
1321
1322 var element = UI.$(this);
1323
1324 if (!element.data("scrollspy")) {
1325 var obj = UI.scrollspy(element, UI.Utils.options(element.attr("data-uk-scrollspy")));
1326 }
1327 });
1328 });
1329 },
1330
1331 init: function() {
1332
1333 var $this = this, inviewstate, initinview, togglecls = this.options.cls.split(/,/), fn = function(){
1334
1335 var elements = $this.options.target ? $this.element.find($this.options.target) : $this.element,
1336 delayIdx = elements.length === 1 ? 1 : 0,
1337 toggleclsIdx = 0;
1338
1339 elements.each(function(idx){
1340
1341 var element = UI.$(this),
1342 inviewstate = element.data('inviewstate'),
1343 inview = UI.Utils.isInView(element, $this.options),
1344 toggle = element.data('ukScrollspyCls') || togglecls[toggleclsIdx].trim();
1345
1346 if (inview && !inviewstate && !element.data('scrollspy-idle')) {
1347
1348 if (!initinview) {
1349 element.addClass($this.options.initcls);
1350 $this.offset = element.offset();
1351 initinview = true;
1352
1353 element.trigger("init.uk.scrollspy");
1354 }
1355
1356 element.data('scrollspy-idle', setTimeout(function(){
1357
1358 element.addClass("uk-scrollspy-inview").toggleClass(toggle).width();
1359 element.trigger("inview.uk.scrollspy");
1360
1361 element.data('scrollspy-idle', false);
1362 element.data('inviewstate', true);
1363
1364 }, $this.options.delay * delayIdx));
1365
1366 delayIdx++;
1367 }
1368
1369 if (!inview && inviewstate && $this.options.repeat) {
1370
1371 if (element.data('scrollspy-idle')) {
1372 clearTimeout(element.data('scrollspy-idle'));
1373 element.data('scrollspy-idle', false);
1374 }
1375
1376 element.removeClass("uk-scrollspy-inview").toggleClass(toggle);
1377 element.data('inviewstate', false);
1378
1379 element.trigger("outview.uk.scrollspy");
1380 }
1381
1382 toggleclsIdx = togglecls[toggleclsIdx + 1] ? (toggleclsIdx + 1) : 0;
1383
1384 });
1385 };
1386
1387 fn();
1388
1389 this.check = fn;
1390
1391 scrollspies.push(this);
1392 }
1393 });
1394
1395
1396 var scrollspynavs = [],
1397 checkScrollSpyNavs = function() {
1398 for(var i=0; i < scrollspynavs.length; i++) {
1399 window.requestAnimationFrame.apply(window, [scrollspynavs[i].check]);
1400 }
1401 };
1402
1403 UI.component('scrollspynav', {
1404
1405 defaults: {
1406 "cls" : 'uk-active',
1407 "closest" : false,
1408 "topoffset" : 0,
1409 "leftoffset" : 0,
1410 "smoothscroll" : false
1411 },
1412
1413 boot: function() {
1414
1415 // listen to scroll and resize
1416 $doc.on("scrolling.uk.document", checkScrollSpyNavs);
1417 $win.on("resize orientationchange", UI.Utils.debounce(checkScrollSpyNavs, 50));
1418
1419 // init code
1420 UI.ready(function(context) {
1421
1422 UI.$("[data-uk-scrollspy-nav]", context).each(function() {
1423
1424 var element = UI.$(this);
1425
1426 if (!element.data("scrollspynav")) {
1427 var obj = UI.scrollspynav(element, UI.Utils.options(element.attr("data-uk-scrollspy-nav")));
1428 }
1429 });
1430 });
1431 },
1432
1433 init: function() {
1434
1435 var ids = [],
1436 links = this.find("a[href^='#']").each(function(){ if(this.getAttribute("href").trim()!=='#') ids.push(this.getAttribute("href")); }),
1437 targets = UI.$(ids.join(",")),
1438
1439 clsActive = this.options.cls,
1440 clsClosest = this.options.closest || this.options.closest;
1441
1442 var $this = this, inviews, fn = function(){
1443
1444 inviews = [];
1445
1446 for (var i=0 ; i < targets.length ; i++) {
1447 if (UI.Utils.isInView(targets.eq(i), $this.options)) {
1448 inviews.push(targets.eq(i));
1449 }
1450 }
1451
1452 if (inviews.length) {
1453
1454 var navitems,
1455 scrollTop = $win.scrollTop(),
1456 target = (function(){
1457 for(var i=0; i< inviews.length;i++){
1458 if(inviews[i].offset().top >= scrollTop){
1459 return inviews[i];
1460 }
1461 }
1462 })();
1463
1464 if (!target) return;
1465
1466 if ($this.options.closest) {
1467 links.blur().closest(clsClosest).removeClass(clsActive);
1468 navitems = links.filter("a[href='#"+target.attr("id")+"']").closest(clsClosest).addClass(clsActive);
1469 } else {
1470 navitems = links.removeClass(clsActive).filter("a[href='#"+target.attr("id")+"']").addClass(clsActive);
1471 }
1472
1473 $this.element.trigger("inview.uk.scrollspynav", [target, navitems]);
1474 }
1475 };
1476
1477 if (this.options.smoothscroll && UI.smoothScroll) {
1478 links.each(function(){
1479 UI.smoothScroll(this, $this.options.smoothscroll);
1480 });
1481 }
1482
1483 fn();
1484
1485 this.element.data("scrollspynav", this);
1486
1487 this.check = fn;
1488 scrollspynavs.push(this);
1489
1490 }
1491 });
1492
1493 })(UIkit);
1494
1495 (function(UI){
1496
1497 "use strict";
1498
1499 var toggles = [];
1500
1501 UI.component('toggle', {
1502
1503 defaults: {
1504 target : false,
1505 cls : 'uk-hidden',
1506 animation : false,
1507 duration : 200
1508 },
1509
1510 boot: function(){
1511
1512 // init code
1513 UI.ready(function(context) {
1514
1515 UI.$("[data-uk-toggle]", context).each(function() {
1516 var ele = UI.$(this);
1517
1518 if (!ele.data("toggle")) {
1519 var obj = UI.toggle(ele, UI.Utils.options(ele.attr("data-uk-toggle")));
1520 }
1521 });
1522
1523 setTimeout(function(){
1524
1525 toggles.forEach(function(toggle){
1526 toggle.getToggles();
1527 });
1528
1529 }, 0);
1530 });
1531 },
1532
1533 init: function() {
1534
1535 var $this = this;
1536
1537 this.aria = (this.options.cls.indexOf('uk-hidden') !== -1);
1538
1539 this.getToggles();
1540
1541 this.on("click", function(e) {
1542 if ($this.element.is('a[href="#"]')) e.preventDefault();
1543 $this.toggle();
1544 });
1545
1546 toggles.push(this);
1547 },
1548
1549 toggle: function() {
1550
1551 if(!this.totoggle.length) return;
1552
1553 if (this.options.animation && UI.support.animation) {
1554
1555 var $this = this, animations = this.options.animation.split(',');
1556
1557 if (animations.length == 1) {
1558 animations[1] = animations[0];
1559 }
1560
1561 animations[0] = animations[0].trim();
1562 animations[1] = animations[1].trim();
1563
1564 this.totoggle.css('animation-duration', this.options.duration+'ms');
1565
1566 this.totoggle.each(function(){
1567
1568 var ele = UI.$(this);
1569
1570 if (ele.hasClass($this.options.cls)) {
1571
1572 ele.toggleClass($this.options.cls);
1573
1574 UI.Utils.animate(ele, animations[0]).then(function(){
1575 ele.css('animation-duration', '');
1576 UI.Utils.checkDisplay(ele);
1577 });
1578
1579 } else {
1580
1581 UI.Utils.animate(this, animations[1]+' uk-animation-reverse').then(function(){
1582 ele.toggleClass($this.options.cls).css('animation-duration', '');
1583 UI.Utils.checkDisplay(ele);
1584 });
1585
1586 }
1587
1588 });
1589
1590 } else {
1591 this.totoggle.toggleClass(this.options.cls);
1592 UI.Utils.checkDisplay(this.totoggle);
1593 }
1594
1595 this.updateAria();
1596
1597 },
1598
1599 getToggles: function() {
1600 this.totoggle = this.options.target ? UI.$(this.options.target):[];
1601 this.updateAria();
1602 },
1603
1604 updateAria: function() {
1605 if (this.aria && this.totoggle.length) {
1606 this.totoggle.each(function(){
1607 UI.$(this).attr('aria-hidden', UI.$(this).hasClass('uk-hidden'));
1608 });
1609 }
1610 }
1611 });
1612
1613 })(UIkit);
1614
1615 (function(UI) {
1616
1617 "use strict";
1618
1619 UI.component('alert', {
1620
1621 defaults: {
1622 "fade": true,
1623 "duration": 200,
1624 "trigger": ".uk-alert-close"
1625 },
1626
1627 boot: function() {
1628
1629 // init code
1630 UI.$html.on("click.alert.uikit", "[data-uk-alert]", function(e) {
1631
1632 var ele = UI.$(this);
1633
1634 if (!ele.data("alert")) {
1635
1636 var alert = UI.alert(ele, UI.Utils.options(ele.attr("data-uk-alert")));
1637
1638 if (UI.$(e.target).is(alert.options.trigger)) {
1639 e.preventDefault();
1640 alert.close();
1641 }
1642 }
1643 });
1644 },
1645
1646 init: function() {
1647
1648 var $this = this;
1649
1650 this.on("click", this.options.trigger, function(e) {
1651 e.preventDefault();
1652 $this.close();
1653 });
1654 },
1655
1656 close: function() {
1657
1658 var element = this.trigger("close.uk.alert"),
1659 removeElement = function () {
1660 this.trigger("closed.uk.alert").remove();
1661 }.bind(this);
1662
1663 if (this.options.fade) {
1664 element.css("overflow", "hidden").css("max-height", element.height()).animate({
1665 "height" : 0,
1666 "opacity" : 0,
1667 "padding-top" : 0,
1668 "padding-bottom" : 0,
1669 "margin-top" : 0,
1670 "margin-bottom" : 0
1671 }, this.options.duration, removeElement);
1672 } else {
1673 removeElement();
1674 }
1675 }
1676
1677 });
1678
1679 })(UIkit);
1680
1681 (function(UI) {
1682
1683 "use strict";
1684
1685 UI.component('buttonRadio', {
1686
1687 defaults: {
1688 "activeClass": 'uk-active',
1689 "target": ".uk-button"
1690 },
1691
1692 boot: function() {
1693
1694 // init code
1695 UI.$html.on("click.buttonradio.uikit", "[data-uk-button-radio]", function(e) {
1696
1697 var ele = UI.$(this);
1698
1699 if (!ele.data("buttonRadio")) {
1700
1701 var obj = UI.buttonRadio(ele, UI.Utils.options(ele.attr("data-uk-button-radio"))),
1702 target = UI.$(e.target);
1703
1704 if (target.is(obj.options.target)) {
1705 target.trigger("click");
1706 }
1707 }
1708 });
1709 },
1710
1711 init: function() {
1712
1713 var $this = this;
1714
1715 // Init ARIA
1716 this.find($this.options.target).attr('aria-checked', 'false').filter('.' + $this.options.activeClass).attr('aria-checked', 'true');
1717
1718 this.on("click", this.options.target, function(e) {
1719
1720 var ele = UI.$(this);
1721
1722 if (ele.is('a[href="#"]')) e.preventDefault();
1723
1724 $this.find($this.options.target).not(ele).removeClass($this.options.activeClass).blur();
1725 ele.addClass($this.options.activeClass);
1726
1727 // Update ARIA
1728 $this.find($this.options.target).not(ele).attr('aria-checked', 'false');
1729 ele.attr('aria-checked', 'true');
1730
1731 $this.trigger("change.uk.button", [ele]);
1732 });
1733
1734 },
1735
1736 getSelected: function() {
1737 return this.find('.' + this.options.activeClass);
1738 }
1739 });
1740
1741 UI.component('buttonCheckbox', {
1742
1743 defaults: {
1744 "activeClass": 'uk-active',
1745 "target": ".uk-button"
1746 },
1747
1748 boot: function() {
1749
1750 UI.$html.on("click.buttoncheckbox.uikit", "[data-uk-button-checkbox]", function(e) {
1751 var ele = UI.$(this);
1752
1753 if (!ele.data("buttonCheckbox")) {
1754
1755 var obj = UI.buttonCheckbox(ele, UI.Utils.options(ele.attr("data-uk-button-checkbox"))),
1756 target = UI.$(e.target);
1757
1758 if (target.is(obj.options.target)) {
1759 target.trigger("click");
1760 }
1761 }
1762 });
1763 },
1764
1765 init: function() {
1766
1767 var $this = this;
1768
1769 // Init ARIA
1770 this.find($this.options.target).attr('aria-checked', 'false').filter('.' + $this.options.activeClass).attr('aria-checked', 'true');
1771
1772 this.on("click", this.options.target, function(e) {
1773 var ele = UI.$(this);
1774
1775 if (ele.is('a[href="#"]')) e.preventDefault();
1776
1777 ele.toggleClass($this.options.activeClass).blur();
1778
1779 // Update ARIA
1780 ele.attr('aria-checked', ele.hasClass($this.options.activeClass));
1781
1782 $this.trigger("change.uk.button", [ele]);
1783 });
1784
1785 },
1786
1787 getSelected: function() {
1788 return this.find('.' + this.options.activeClass);
1789 }
1790 });
1791
1792
1793 UI.component('button', {
1794
1795 defaults: {},
1796
1797 boot: function() {
1798
1799 UI.$html.on("click.button.uikit", "[data-uk-button]", function(e) {
1800 var ele = UI.$(this);
1801
1802 if (!ele.data("button")) {
1803
1804 var obj = UI.button(ele, UI.Utils.options(ele.attr("data-uk-button")));
1805 ele.trigger("click");
1806 }
1807 });
1808 },
1809
1810 init: function() {
1811
1812 var $this = this;
1813
1814 // Init ARIA
1815 this.element.attr('aria-pressed', this.element.hasClass("uk-active"));
1816
1817 this.on("click", function(e) {
1818
1819 if ($this.element.is('a[href="#"]')) e.preventDefault();
1820
1821 $this.toggle();
1822 $this.trigger("change.uk.button", [$this.element.blur().hasClass("uk-active")]);
1823 });
1824
1825 },
1826
1827 toggle: function() {
1828 this.element.toggleClass("uk-active");
1829
1830 // Update ARIA
1831 this.element.attr('aria-pressed', this.element.hasClass("uk-active"));
1832 }
1833 });
1834
1835 })(UIkit);
1836
1837
1838 (function(UI) {
1839
1840 "use strict";
1841
1842 var active = false, hoverIdle, flips = {
1843 'x': {
1844 "bottom-left" : 'bottom-right',
1845 "bottom-right" : 'bottom-left',
1846 "bottom-center" : 'bottom-center',
1847 "top-left" : 'top-right',
1848 "top-right" : 'top-left',
1849 "top-center" : 'top-center',
1850 "left-top" : 'right-top',
1851 "left-bottom" : 'right-bottom',
1852 "left-center" : 'right-center',
1853 "right-top" : 'left-top',
1854 "right-bottom" : 'left-bottom',
1855 "right-center" : 'left-center'
1856 },
1857 'y': {
1858 "bottom-left" : 'top-left',
1859 "bottom-right" : 'top-right',
1860 "bottom-center" : 'top-center',
1861 "top-left" : 'bottom-left',
1862 "top-right" : 'bottom-right',
1863 "top-center" : 'bottom-center',
1864 "left-top" : 'left-bottom',
1865 "left-bottom" : 'left-top',
1866 "left-center" : 'left-center',
1867 "right-top" : 'right-bottom',
1868 "right-bottom" : 'right-top',
1869 "right-center" : 'right-center'
1870 },
1871 'xy': {
1872 "bottom-left" : 'top-right',
1873 "bottom-right" : 'top-left',
1874 "bottom-center" : 'top-center',
1875 "top-left" : 'bottom-right',
1876 "top-right" : 'bottom-left',
1877 "top-center" : 'bottom-center',
1878 "left-top" : 'right-bottom',
1879 "left-bottom" : 'right-top',
1880 "left-center" : 'right-center',
1881 "right-top" : 'left-bottom',
1882 "right-bottom" : 'left-top',
1883 "right-center" : 'left-center'
1884 }
1885 };
1886
1887 UI.component('dropdown', {
1888
1889 defaults: {
1890 'mode' : 'hover',
1891 'pos' : 'bottom-left',
1892 'offset' : 0,
1893 'remaintime' : 800,
1894 'justify' : false,
1895 'boundary' : UI.$win,
1896 'delay' : 0,
1897 'dropdownSelector': '.uk-dropdown,.uk-dropdown-blank',
1898 'hoverDelayIdle' : 250,
1899 'preventflip' : false
1900 },
1901
1902 remainIdle: false,
1903
1904 boot: function() {
1905
1906 var triggerevent = UI.support.touch ? "click" : "mouseenter";
1907
1908 // init code
1909 UI.$html.on(triggerevent+".dropdown.uikit", "[data-uk-dropdown]", function(e) {
1910
1911 var ele = UI.$(this);
1912
1913 if (!ele.data("dropdown")) {
1914
1915 var dropdown = UI.dropdown(ele, UI.Utils.options(ele.attr("data-uk-dropdown")));
1916
1917 if (triggerevent=="click" || (triggerevent=="mouseenter" && dropdown.options.mode=="hover")) {
1918 dropdown.element.trigger(triggerevent);
1919 }
1920
1921 if (dropdown.element.find(dropdown.options.dropdownSelector).length) {
1922 e.preventDefault();
1923 }
1924 }
1925 });
1926 },
1927
1928 init: function() {
1929
1930 var $this = this;
1931
1932 this.dropdown = this.find(this.options.dropdownSelector);
1933 this.offsetParent = this.dropdown.parents().filter(function() {
1934 return UI.$.inArray(UI.$(this).css('position'), ['relative', 'fixed', 'absolute']) !== -1;
1935 }).slice(0,1);
1936
1937 this.centered = this.dropdown.hasClass('uk-dropdown-center');
1938 this.justified = this.options.justify ? UI.$(this.options.justify) : false;
1939
1940 this.boundary = UI.$(this.options.boundary);
1941
1942 if (!this.boundary.length) {
1943 this.boundary = UI.$win;
1944 }
1945
1946 // legacy DEPRECATED!
1947 if (this.dropdown.hasClass('uk-dropdown-up')) {
1948 this.options.pos = 'top-left';
1949 }
1950 if (this.dropdown.hasClass('uk-dropdown-flip')) {
1951 this.options.pos = this.options.pos.replace('left','right');
1952 }
1953 if (this.dropdown.hasClass('uk-dropdown-center')) {
1954 this.options.pos = this.options.pos.replace(/(left|right)/,'center');
1955 }
1956 //-- end legacy
1957
1958 // Init ARIA
1959 this.element.attr('aria-haspopup', 'true');
1960 this.element.attr('aria-expanded', this.element.hasClass("uk-open"));
1961
1962 if (this.options.mode == "click" || UI.support.touch) {
1963
1964 this.on("click.uk.dropdown", function(e) {
1965
1966 var $target = UI.$(e.target);
1967
1968 if (!$target.parents($this.options.dropdownSelector).length) {
1969
1970 if ($target.is("a[href='#']") || $target.parent().is("a[href='#']") || ($this.dropdown.length && !$this.dropdown.is(":visible")) ){
1971 e.preventDefault();
1972 }
1973
1974 $target.blur();
1975 }
1976
1977 if (!$this.element.hasClass('uk-open')) {
1978
1979 $this.show();
1980
1981 } else {
1982
1983 if (!$this.dropdown.find(e.target).length || $target.is(".uk-dropdown-close") || $target.parents(".uk-dropdown-close").length) {
1984 $this.hide();
1985 }
1986 }
1987 });
1988
1989 } else {
1990
1991 this.on("mouseenter", function(e) {
1992
1993 $this.trigger('pointerenter.uk.dropdown', [$this]);
1994
1995 if ($this.remainIdle) {
1996 clearTimeout($this.remainIdle);
1997 }
1998
1999 if (hoverIdle) {
2000 clearTimeout(hoverIdle);
2001 }
2002
2003 if (active && active == $this) {
2004 return;
2005 }
2006
2007 // pseudo manuAim
2008 if (active && active != $this) {
2009
2010 hoverIdle = setTimeout(function() {
2011 hoverIdle = setTimeout($this.show.bind($this), $this.options.delay);
2012 }, $this.options.hoverDelayIdle);
2013
2014 } else {
2015
2016 hoverIdle = setTimeout($this.show.bind($this), $this.options.delay);
2017 }
2018
2019 }).on("mouseleave", function() {
2020
2021 if (hoverIdle) {
2022 clearTimeout(hoverIdle);
2023 }
2024
2025 $this.remainIdle = setTimeout(function() {
2026 if (active && active == $this) $this.hide();
2027 }, $this.options.remaintime);
2028
2029 $this.trigger('pointerleave.uk.dropdown', [$this]);
2030
2031 }).on("click", function(e){
2032
2033 var $target = UI.$(e.target);
2034
2035 if ($this.remainIdle) {
2036 clearTimeout($this.remainIdle);
2037 }
2038
2039 if (active && active == $this) {
2040 if (!$this.dropdown.find(e.target).length || $target.is(".uk-dropdown-close") || $target.parents(".uk-dropdown-close").length) {
2041 $this.hide();
2042 }
2043 return;
2044 }
2045
2046 if ($target.is("a[href='#']") || $target.parent().is("a[href='#']")){
2047 e.preventDefault();
2048 }
2049
2050 $this.show();
2051 });
2052 }
2053 },
2054
2055 show: function(){
2056
2057 UI.$html.off("click.outer.dropdown");
2058
2059 if (active && active != this) {
2060 active.hide(true);
2061 }
2062
2063 if (hoverIdle) {
2064 clearTimeout(hoverIdle);
2065 }
2066
2067 this.trigger('beforeshow.uk.dropdown', [this]);
2068
2069 this.checkDimensions();
2070 this.element.addClass('uk-open');
2071
2072 // Update ARIA
2073 this.element.attr('aria-expanded', 'true');
2074
2075 this.trigger('show.uk.dropdown', [this]);
2076
2077 UI.Utils.checkDisplay(this.dropdown, true);
2078 active = this;
2079
2080 this.registerOuterClick();
2081 },
2082
2083 hide: function(force) {
2084
2085 this.trigger('beforehide.uk.dropdown', [this, force]);
2086
2087 this.element.removeClass('uk-open');
2088
2089 if (this.remainIdle) {
2090 clearTimeout(this.remainIdle);
2091 }
2092
2093 this.remainIdle = false;
2094
2095 // Update ARIA
2096 this.element.attr('aria-expanded', 'false');
2097
2098 this.trigger('hide.uk.dropdown', [this, force]);
2099
2100 if (active == this) active = false;
2101 },
2102
2103 registerOuterClick: function(){
2104
2105 var $this = this;
2106
2107 UI.$html.off("click.outer.dropdown");
2108
2109 setTimeout(function() {
2110
2111 UI.$html.on("click.outer.dropdown", function(e) {
2112
2113 if (hoverIdle) {
2114 clearTimeout(hoverIdle);
2115 }
2116
2117 var $target = UI.$(e.target);
2118
2119 if (active == $this && !$this.element.find(e.target).length) {
2120 $this.hide(true);
2121 UI.$html.off("click.outer.dropdown");
2122 }
2123 });
2124 }, 10);
2125 },
2126
2127 checkDimensions: function() {
2128
2129 if (!this.dropdown.length) return;
2130
2131 // reset
2132 this.dropdown.removeClass('uk-dropdown-top uk-dropdown-bottom uk-dropdown-left uk-dropdown-right uk-dropdown-stack').css({
2133 'top-left':'',
2134 'left':'',
2135 'margin-left' :'',
2136 'margin-right':''
2137 });
2138
2139 if (this.justified && this.justified.length) {
2140 this.dropdown.css("min-width", "");
2141 }
2142
2143 var $this = this,
2144 pos = UI.$.extend({}, this.offsetParent.offset(), {width: this.offsetParent[0].offsetWidth, height: this.offsetParent[0].offsetHeight}),
2145 posoffset = this.options.offset,
2146 dropdown = this.dropdown,
2147 offset = dropdown.show().offset() || {left: 0, top: 0},
2148 width = dropdown.outerWidth(),
2149 height = dropdown.outerHeight(),
2150 boundarywidth = this.boundary.width(),
2151 boundaryoffset = this.boundary[0] !== window && this.boundary.offset() ? this.boundary.offset(): {top:0, left:0},
2152 dpos = this.options.pos;
2153
2154 var variants = {
2155 "bottom-left" : {top: 0 + pos.height + posoffset, left: 0},
2156 "bottom-right" : {top: 0 + pos.height + posoffset, left: 0 + pos.width - width},
2157 "bottom-center" : {top: 0 + pos.height + posoffset, left: 0 + pos.width / 2 - width / 2},
2158 "top-left" : {top: 0 - height - posoffset, left: 0},
2159 "top-right" : {top: 0 - height - posoffset, left: 0 + pos.width - width},
2160 "top-center" : {top: 0 - height - posoffset, left: 0 + pos.width / 2 - width / 2},
2161 "left-top" : {top: 0, left: 0 - width - posoffset},
2162 "left-bottom" : {top: 0 + pos.height - height, left: 0 - width - posoffset},
2163 "left-center" : {top: 0 + pos.height / 2 - height / 2, left: 0 - width - posoffset},
2164 "right-top" : {top: 0, left: 0 + pos.width + posoffset},
2165 "right-bottom" : {top: 0 + pos.height - height, left: 0 + pos.width + posoffset},
2166 "right-center" : {top: 0 + pos.height / 2 - height / 2, left: 0 + pos.width + posoffset}
2167 },
2168 css = {},
2169 pp;
2170
2171 pp = dpos.split('-');
2172 css = variants[dpos] ? variants[dpos] : variants['bottom-left'];
2173
2174 // justify dropdown
2175 if (this.justified && this.justified.length) {
2176 justify(dropdown.css({left:0}), this.justified, boundarywidth);
2177 } else {
2178
2179 if (this.options.preventflip !== true) {
2180
2181 var fdpos;
2182
2183 switch(this.checkBoundary(pos.left + css.left, pos.top + css.top, width, height, boundarywidth)) {
2184 case "x":
2185 if(this.options.preventflip !=='x') fdpos = flips['x'][dpos] || 'right-top';
2186 break;
2187 case "y":
2188 if(this.options.preventflip !=='y') fdpos = flips['y'][dpos] || 'top-left';
2189 break;
2190 case "xy":
2191 if(!this.options.preventflip) fdpos = flips['xy'][dpos] || 'right-bottom';
2192 break;
2193 }
2194
2195 if (fdpos) {
2196
2197 pp = fdpos.split('-');
2198 css = variants[fdpos] ? variants[fdpos] : variants['bottom-left'];
2199
2200 // check flipped
2201 if (this.checkBoundary(pos.left + css.left, pos.top + css.top, width, height, boundarywidth)) {
2202 pp = dpos.split('-');
2203 css = variants[dpos] ? variants[dpos] : variants['bottom-left'];
2204 }
2205 }
2206 }
2207 }
2208
2209 if (width > boundarywidth) {
2210 dropdown.addClass("uk-dropdown-stack");
2211 this.trigger('stack.uk.dropdown', [this]);
2212 }
2213
2214 dropdown.css(css).css("display", "").addClass('uk-dropdown-'+pp[0]);
2215 },
2216
2217 checkBoundary: function(left, top, width, height, boundarywidth) {
2218
2219 var axis = "";
2220
2221 if (left < 0 || ((left - UI.$win.scrollLeft())+width) > boundarywidth) {
2222 axis += "x";
2223 }
2224
2225 if ((top - UI.$win.scrollTop()) < 0 || ((top - UI.$win.scrollTop())+height) > window.innerHeight) {
2226 axis += "y";
2227 }
2228
2229 return axis;
2230 }
2231 });
2232
2233
2234 UI.component('dropdownOverlay', {
2235
2236 defaults: {
2237 'justify' : false,
2238 'cls' : '',
2239 'duration': 200
2240 },
2241
2242 boot: function() {
2243
2244 // init code
2245 UI.ready(function(context) {
2246
2247 UI.$("[data-uk-dropdown-overlay]", context).each(function() {
2248 var ele = UI.$(this);
2249
2250 if (!ele.data("dropdownOverlay")) {
2251 UI.dropdownOverlay(ele, UI.Utils.options(ele.attr("data-uk-dropdown-overlay")));
2252 }
2253 });
2254 });
2255 },
2256
2257 init: function() {
2258
2259 var $this = this;
2260
2261 this.justified = this.options.justify ? UI.$(this.options.justify) : false;
2262 this.overlay = this.element.find('uk-dropdown-overlay');
2263
2264 if (!this.overlay.length) {
2265 this.overlay = UI.$('<div class="uk-dropdown-overlay"></div>').appendTo(this.element);
2266 }
2267
2268 this.overlay.addClass(this.options.cls);
2269
2270 this.on({
2271
2272 'beforeshow.uk.dropdown': function(e, dropdown) {
2273 $this.dropdown = dropdown;
2274
2275 if ($this.justified && $this.justified.length) {
2276 justify($this.overlay.css({'display':'block', 'margin-left':'','margin-right':''}), $this.justified, $this.justified.outerWidth());
2277 }
2278 },
2279
2280 'show.uk.dropdown': function(e, dropdown) {
2281
2282 var h = $this.dropdown.dropdown.outerHeight(true);
2283
2284 $this.dropdown.element.removeClass('uk-open');
2285
2286 $this.overlay.stop().css('display', 'block').animate({height: h}, $this.options.duration, function() {
2287
2288 $this.dropdown.dropdown.css('visibility', '');
2289 $this.dropdown.element.addClass('uk-open');
2290
2291 UI.Utils.checkDisplay($this.dropdown.dropdown, true);
2292 });
2293
2294 $this.pointerleave = false;
2295 },
2296
2297 'hide.uk.dropdown': function() {
2298 $this.overlay.stop().animate({height: 0}, $this.options.duration);
2299 },
2300
2301 'pointerenter.uk.dropdown': function(e, dropdown) {
2302 clearTimeout($this.remainIdle);
2303 },
2304
2305 'pointerleave.uk.dropdown': function(e, dropdown) {
2306 $this.pointerleave = true;
2307 }
2308 });
2309
2310
2311 this.overlay.on({
2312
2313 'mouseenter': function() {
2314 if ($this.remainIdle) {
2315 clearTimeout($this.dropdown.remainIdle);
2316 clearTimeout($this.remainIdle);
2317 }
2318 },
2319
2320 'mouseleave': function(){
2321
2322 if ($this.pointerleave && active) {
2323
2324 $this.remainIdle = setTimeout(function() {
2325 if(active) active.hide();
2326 }, active.options.remaintime);
2327 }
2328 }
2329 })
2330 }
2331
2332 });
2333
2334
2335 function justify(ele, justifyTo, boundarywidth, offset) {
2336
2337 ele = UI.$(ele);
2338 justifyTo = UI.$(justifyTo);
2339 boundarywidth = boundarywidth || window.innerWidth;
2340 offset = offset || ele.offset();
2341
2342 if (justifyTo.length) {
2343
2344 var jwidth = justifyTo.outerWidth();
2345
2346 ele.css("min-width", jwidth);
2347
2348 if (UI.langdirection == 'right') {
2349
2350 var right1 = boundarywidth - (justifyTo.offset().left + jwidth),
2351 right2 = boundarywidth - (ele.offset().left + ele.outerWidth());
2352
2353 ele.css("margin-right", right1 - right2);
2354
2355 } else {
2356 ele.css("margin-left", justifyTo.offset().left - offset.left);
2357 }
2358 }
2359 }
2360
2361 })(UIkit);
2362
2363 (function(UI) {
2364
2365 "use strict";
2366
2367 var grids = [];
2368
2369 UI.component('gridMatchHeight', {
2370
2371 defaults: {
2372 "target" : false,
2373 "row" : true,
2374 "ignorestacked" : false
2375 },
2376
2377 boot: function() {
2378
2379 // init code
2380 UI.ready(function(context) {
2381
2382 UI.$("[data-uk-grid-match]", context).each(function() {
2383 var grid = UI.$(this), obj;
2384
2385 if (!grid.data("gridMatchHeight")) {
2386 obj = UI.gridMatchHeight(grid, UI.Utils.options(grid.attr("data-uk-grid-match")));
2387 }
2388 });
2389 });
2390 },
2391
2392 init: function() {
2393
2394 var $this = this;
2395
2396 this.columns = this.element.children();
2397 this.elements = this.options.target ? this.find(this.options.target) : this.columns;
2398
2399 if (!this.columns.length) return;
2400
2401 UI.$win.on('load resize orientationchange', (function() {
2402
2403 var fn = function() {
2404 $this.match();
2405 };
2406
2407 UI.$(function() { fn(); });
2408
2409 return UI.Utils.debounce(fn, 50);
2410 })());
2411
2412 UI.$html.on("changed.uk.dom", function(e) {
2413 $this.columns = $this.element.children();
2414 $this.elements = $this.options.target ? $this.find($this.options.target) : $this.columns;
2415 $this.match();
2416 });
2417
2418 this.on("display.uk.check", function(e) {
2419 if(this.element.is(":visible")) this.match();
2420 }.bind(this));
2421
2422 grids.push(this);
2423 },
2424
2425 match: function() {
2426
2427 var firstvisible = this.columns.filter(":visible:first");
2428
2429 if (!firstvisible.length) return;
2430
2431 var stacked = Math.ceil(100 * parseFloat(firstvisible.css('width')) / parseFloat(firstvisible.parent().css('width'))) >= 100;
2432
2433 if (stacked && !this.options.ignorestacked) {
2434 this.revert();
2435 } else {
2436 UI.Utils.matchHeights(this.elements, this.options);
2437 }
2438
2439 return this;
2440 },
2441
2442 revert: function() {
2443 this.elements.css('min-height', '');
2444 return this;
2445 }
2446 });
2447
2448 UI.component('gridMargin', {
2449
2450 defaults: {
2451 cls : 'uk-grid-margin',
2452 rowfirst : 'uk-row-first'
2453 },
2454
2455 boot: function() {
2456
2457 // init code
2458 UI.ready(function(context) {
2459
2460 UI.$("[data-uk-grid-margin]", context).each(function() {
2461 var grid = UI.$(this), obj;
2462
2463 if (!grid.data("gridMargin")) {
2464 obj = UI.gridMargin(grid, UI.Utils.options(grid.attr("data-uk-grid-margin")));
2465 }
2466 });
2467 });
2468 },
2469
2470 init: function() {
2471
2472 var stackMargin = UI.stackMargin(this.element, this.options);
2473 }
2474 });
2475
2476 })(UIkit);
2477
2478 (function(UI) {
2479
2480 "use strict";
2481
2482 var active = false, activeCount = 0, $html = UI.$html, body;
2483
2484 UI.component('modal', {
2485
2486 defaults: {
2487 keyboard: true,
2488 bgclose: true,
2489 minScrollHeight: 150,
2490 center: false,
2491 modal: true
2492 },
2493
2494 scrollable: false,
2495 transition: false,
2496 hasTransitioned: true,
2497
2498 init: function() {
2499
2500 if (!body) body = UI.$('body');
2501
2502 if (!this.element.length) return;
2503
2504 var $this = this;
2505
2506 this.paddingdir = "padding-" + (UI.langdirection == 'left' ? "right":"left");
2507 this.dialog = this.find(".uk-modal-dialog");
2508
2509 this.active = false;
2510
2511 // Update ARIA
2512 this.element.attr('aria-hidden', this.element.hasClass("uk-open"));
2513
2514 this.on("click", ".uk-modal-close", function(e) {
2515 e.preventDefault();
2516 $this.hide();
2517 }).on("click", function(e) {
2518
2519 var target = UI.$(e.target);
2520
2521 if (target[0] == $this.element[0] && $this.options.bgclose) {
2522 $this.hide();
2523 }
2524 });
2525 },
2526
2527 toggle: function() {
2528 return this[this.isActive() ? "hide" : "show"]();
2529 },
2530
2531 show: function() {
2532
2533 if (!this.element.length) return;
2534
2535 var $this = this;
2536
2537 if (this.isActive()) return;
2538
2539 if (this.options.modal && active) {
2540 active.hide(true);
2541 }
2542
2543 this.element.removeClass("uk-open").show();
2544 this.resize();
2545
2546 if (this.options.modal) {
2547 active = this;
2548 }
2549
2550 this.active = true;
2551
2552 activeCount++;
2553
2554 if (UI.support.transition) {
2555 this.hasTransitioned = false;
2556 this.element.one(UI.support.transition.end, function(){
2557 $this.hasTransitioned = true;
2558 }).addClass("uk-open");
2559 } else {
2560 this.element.addClass("uk-open");
2561 }
2562
2563 $html.addClass("uk-modal-page").height(); // force browser engine redraw
2564
2565 // Update ARIA
2566 this.element.attr('aria-hidden', 'false');
2567
2568 this.element.trigger("show.uk.modal");
2569
2570 UI.Utils.checkDisplay(this.dialog, true);
2571
2572 return this;
2573 },
2574
2575 hide: function(force) {
2576
2577 if (!force && UI.support.transition && this.hasTransitioned) {
2578
2579 var $this = this;
2580
2581 this.one(UI.support.transition.end, function() {
2582 $this._hide();
2583 }).removeClass("uk-open");
2584
2585 } else {
2586
2587 this._hide();
2588 }
2589
2590 return this;
2591 },
2592
2593 resize: function() {
2594
2595 var bodywidth = body.width();
2596
2597 this.scrollbarwidth = window.innerWidth - bodywidth;
2598
2599 body.css(this.paddingdir, this.scrollbarwidth);
2600
2601 this.element.css('overflow-y', this.scrollbarwidth ? 'scroll' : 'auto');
2602
2603 if (!this.updateScrollable() && this.options.center) {
2604
2605 var dh = this.dialog.outerHeight(),
2606 pad = parseInt(this.dialog.css('margin-top'), 10) + parseInt(this.dialog.css('margin-bottom'), 10);
2607
2608 if ((dh + pad) < window.innerHeight) {
2609 this.dialog.css({'top': (window.innerHeight/2 - dh/2) - pad });
2610 } else {
2611 this.dialog.css({'top': ''});
2612 }
2613 }
2614 },
2615
2616 updateScrollable: function() {
2617
2618 // has scrollable?
2619 var scrollable = this.dialog.find('.uk-overflow-container:visible:first');
2620
2621 if (scrollable.length) {
2622
2623 scrollable.css('height', 0);
2624
2625 var offset = Math.abs(parseInt(this.dialog.css('margin-top'), 10)),
2626 dh = this.dialog.outerHeight(),
2627 wh = window.innerHeight,
2628 h = wh - 2*(offset < 20 ? 20:offset) - dh;
2629
2630 scrollable.css({
2631 'max-height': (h < this.options.minScrollHeight ? '':h),
2632 'height':''
2633 });
2634
2635 return true;
2636 }
2637
2638 return false;
2639 },
2640
2641 _hide: function() {
2642
2643 this.active = false;
2644 if (activeCount > 0) activeCount--;
2645 else activeCount = 0;
2646
2647 this.element.hide().removeClass('uk-open');
2648
2649 // Update ARIA
2650 this.element.attr('aria-hidden', 'true');
2651
2652 if (!activeCount) {
2653 $html.removeClass('uk-modal-page');
2654 body.css(this.paddingdir, "");
2655 }
2656
2657 if(active===this) active = false;
2658
2659 this.trigger('hide.uk.modal');
2660 },
2661
2662 isActive: function() {
2663 return this.active;
2664 }
2665
2666 });
2667
2668 UI.component('modalTrigger', {
2669
2670 boot: function() {
2671
2672 // init code
2673 UI.$html.on("click.modal.uikit", "[data-uk-modal]", function(e) {
2674
2675 var ele = UI.$(this);
2676
2677 if (ele.is("a")) {
2678 e.preventDefault();
2679 }
2680
2681 if (!ele.data("modalTrigger")) {
2682 var modal = UI.modalTrigger(ele, UI.Utils.options(ele.attr("data-uk-modal")));
2683 modal.show();
2684 }
2685
2686 });
2687
2688 // close modal on esc button
2689 UI.$html.on('keydown.modal.uikit', function (e) {
2690
2691 if (active && e.keyCode === 27 && active.options.keyboard) { // ESC
2692 e.preventDefault();
2693 active.hide();
2694 }
2695 });
2696
2697 UI.$win.on("resize orientationchange", UI.Utils.debounce(function(){
2698 if (active) active.resize();
2699 }, 150));
2700 },
2701
2702 init: function() {
2703
2704 var $this = this;
2705
2706 this.options = UI.$.extend({
2707 "target": $this.element.is("a") ? $this.element.attr("href") : false
2708 }, this.options);
2709
2710 this.modal = UI.modal(this.options.target, this.options);
2711
2712 this.on("click", function(e) {
2713 e.preventDefault();
2714 $this.show();
2715 });
2716
2717 //methods
2718 this.proxy(this.modal, "show hide isActive");
2719 }
2720 });
2721
2722 UI.modal.dialog = function(content, options) {
2723
2724 var modal = UI.modal(UI.$(UI.modal.dialog.template).appendTo("body"), options);
2725
2726 modal.on("hide.uk.modal", function(){
2727 if (modal.persist) {
2728 modal.persist.appendTo(modal.persist.data("modalPersistParent"));
2729 modal.persist = false;
2730 }
2731 modal.element.remove();
2732 });
2733
2734 setContent(content, modal);
2735
2736 return modal;
2737 };
2738
2739 UI.modal.dialog.template = '<div class="uk-modal"><div class="uk-modal-dialog" style="min-height:0;"></div></div>';
2740
2741 UI.modal.alert = function(content, options) {
2742
2743 options = UI.$.extend(true, {bgclose:false, keyboard:false, modal:false, labels:UI.modal.labels}, options);
2744
2745 var modal = UI.modal.dialog(([
2746 '<div class="uk-margin uk-modal-content">'+String(content)+'</div>',
2747 '<div class="uk-modal-footer uk-text-right"><button class="uk-button uk-button-primary uk-modal-close">'+options.labels.Ok+'</button></div>'
2748 ]).join(""), options);
2749
2750 modal.on('show.uk.modal', function(){
2751 setTimeout(function(){
2752 modal.element.find('button:first').focus();
2753 }, 50);
2754 });
2755
2756 return modal.show();
2757 };
2758
2759 UI.modal.confirm = function(content, onconfirm, oncancel) {
2760
2761 var options = arguments.length > 1 && arguments[arguments.length-1] ? arguments[arguments.length-1] : {};
2762
2763 onconfirm = UI.$.isFunction(onconfirm) ? onconfirm : function(){};
2764 oncancel = UI.$.isFunction(oncancel) ? oncancel : function(){};
2765 options = UI.$.extend(true, {bgclose:false, keyboard:false, modal:false, labels:UI.modal.labels}, UI.$.isFunction(options) ? {}:options);
2766
2767 var modal = UI.modal.dialog(([
2768 '<div class="uk-margin uk-modal-content">'+String(content)+'</div>',
2769 '<div class="uk-modal-footer uk-text-right"><button class="uk-button js-modal-confirm-cancel">'+options.labels.Cancel+'</button> <button class="uk-button uk-button-primary js-modal-confirm">'+options.labels.Ok+'</button></div>'
2770 ]).join(""), options);
2771
2772 modal.element.find(".js-modal-confirm, .js-modal-confirm-cancel").on("click", function(){
2773 UI.$(this).is('.js-modal-confirm') ? onconfirm() : oncancel();
2774 modal.hide();
2775 });
2776
2777 modal.on('show.uk.modal', function(){
2778 setTimeout(function(){
2779 modal.element.find('.js-modal-confirm').focus();
2780 }, 50);
2781 });
2782
2783 return modal.show();
2784 };
2785
2786 UI.modal.prompt = function(text, value, onsubmit, options) {
2787
2788 onsubmit = UI.$.isFunction(onsubmit) ? onsubmit : function(value){};
2789 options = UI.$.extend(true, {bgclose:false, keyboard:false, modal:false, labels:UI.modal.labels}, options);
2790
2791 var modal = UI.modal.dialog(([
2792 text ? '<div class="uk-modal-content uk-form">'+String(text)+'</div>':'',
2793 '<div class="uk-margin-small-top uk-modal-content uk-form"><p><input type="text" class="uk-width-1-1"></p></div>',
2794 '<div class="uk-modal-footer uk-text-right"><button class="uk-button uk-modal-close">'+options.labels.Cancel+'</button> <button class="uk-button uk-button-primary js-modal-ok">'+options.labels.Ok+'</button></div>'
2795 ]).join(""), options),
2796
2797 input = modal.element.find("input[type='text']").val(value || '').on('keyup', function(e){
2798 if (e.keyCode == 13) {
2799 modal.element.find(".js-modal-ok").trigger('click');
2800 }
2801 });
2802
2803 modal.element.find(".js-modal-ok").on("click", function(){
2804 if (onsubmit(input.val())!==false){
2805 modal.hide();
2806 }
2807 });
2808
2809 modal.on('show.uk.modal', function(){
2810 setTimeout(function(){
2811 input.focus();
2812 }, 50);
2813 });
2814
2815 return modal.show();
2816 };
2817
2818 UI.modal.blockUI = function(content, options) {
2819
2820 var modal = UI.modal.dialog(([
2821 '<div class="uk-margin uk-modal-content">'+String(content || '<div class="uk-text-center">...</div>')+'</div>'
2822 ]).join(""), UI.$.extend({bgclose:false, keyboard:false, modal:false}, options));
2823
2824 modal.content = modal.element.find('.uk-modal-content:first');
2825
2826 return modal.show();
2827 };
2828
2829
2830 UI.modal.labels = {
2831 'Ok': 'Ok',
2832 'Cancel': 'Cancel'
2833 };
2834
2835
2836 // helper functions
2837 function setContent(content, modal){
2838
2839 if(!modal) return;
2840
2841 if (typeof content === 'object') {
2842
2843 // convert DOM object to a jQuery object
2844 content = content instanceof jQuery ? content : UI.$(content);
2845
2846 if(content.parent().length) {
2847 modal.persist = content;
2848 modal.persist.data("modalPersistParent", content.parent());
2849 }
2850 }else if (typeof content === 'string' || typeof content === 'number') {
2851 // just insert the data as innerHTML
2852 content = UI.$('<div></div>').html(content);
2853 }else {
2854 // unsupported data type!
2855 content = UI.$('<div></div>').html('UIkit.modal Error: Unsupported data type: ' + typeof content);
2856 }
2857
2858 content.appendTo(modal.element.find('.uk-modal-dialog'));
2859
2860 return modal;
2861 }
2862
2863 })(UIkit);
2864
2865 (function(UI) {
2866
2867 "use strict";
2868 // navigation
2869 UI.component('nav', {
2870
2871 defaults: {
2872 "toggle": ">li.uk-parent > a[href*='#']",
2873 "lists": ">li.uk-parent > ul",
2874 "multiple": true
2875 },
2876
2877 boot: function() {
2878
2879 // init code
2880 UI.ready(function(context) {
2881
2882 UI.$("[data-uk-nav]", context).each(function() {
2883 var nav = UI.$(this);
2884
2885 if (!nav.data("nav")) {
2886 var obj = UI.nav(nav, UI.Utils.options(nav.attr("data-uk-nav")));
2887 }
2888 });
2889 });
2890 },
2891
2892 init: function() {
2893
2894 var $this = this;
2895
2896 this.on("click.uk.nav", this.options.toggle, function(e) {
2897 // e.preventDefault();
2898 var ele = UI.$(this);
2899 $this.open(ele.parent()[0] == $this.element[0] ? ele : ele.parent("li"));
2900 });
2901
2902 this.find(this.options.lists).each(function() {
2903 var $ele = UI.$(this),
2904 parent = $ele.parent(),
2905 active = parent.hasClass("uk-active");
2906
2907 $ele.wrap('<div style="overflow:hidden;height:0;position:relative;"></div>');
2908 parent.data("list-container", $ele.parent()[active ? 'removeClass':'addClass']('uk-hidden'));
2909
2910 // Init ARIA
2911 parent.attr('aria-expanded', parent.hasClass("uk-open"));
2912
2913 if (active) $this.open(parent, true);
2914 });
2915
2916 },
2917
2918 open: function(li, noanimation) {
2919 noanimation = true;
2920 var $this = this, element = this.element, $li = UI.$(li), $container = $li.data('list-container');
2921
2922 if (!this.options.multiple) {
2923
2924 element.children('.uk-open').not(li).each(function() {
2925
2926 var ele = UI.$(this);
2927
2928 if (ele.data('list-container')) {
2929 ele.data('list-container').stop().animate({height: 0}, function() {
2930 UI.$(this).parent().removeClass('uk-open').end().addClass('uk-hidden');
2931 });
2932 }
2933 });
2934 }
2935
2936 $li.toggleClass('uk-open');
2937
2938 // Update ARIA
2939 $li.attr('aria-expanded', $li.hasClass('uk-open'));
2940
2941 if ($container) {
2942
2943 if ($li.hasClass('uk-open')) {
2944 $container.removeClass('uk-hidden');
2945 }
2946
2947 if (noanimation) {
2948
2949 $container.stop().height($li.hasClass('uk-open') ? 'auto' : 0);
2950
2951 if (!$li.hasClass('uk-open')) {
2952 $container.addClass('uk-hidden');
2953 }
2954
2955 this.trigger('display.uk.check');
2956
2957 } else {
2958
2959 $container.stop().animate({
2960 height: ($li.hasClass('uk-open') ? getHeight($container.find('ul:first')) : 0)
2961 }, function() {
2962
2963 if (!$li.hasClass('uk-open')) {
2964 $container.addClass('uk-hidden');
2965 } else {
2966 $container.css('height', '');
2967 }
2968
2969 $this.trigger('display.uk.check');
2970 });
2971 }
2972 }
2973 }
2974 });
2975
2976
2977 // helper
2978
2979 function getHeight(ele) {
2980 var $ele = UI.$(ele), height = "auto";
2981
2982 if ($ele.is(":visible")) {
2983 height = $ele.outerHeight();
2984 } else {
2985 var tmp = {
2986 position: $ele.css("position"),
2987 visibility: $ele.css("visibility"),
2988 display: $ele.css("display")
2989 };
2990
2991 height = $ele.css({position: 'absolute', visibility: 'hidden', display: 'block'}).outerHeight();
2992
2993 $ele.css(tmp); // reset element
2994 }
2995
2996 return height;
2997 }
2998
2999 })(UIkit);
3000
3001 (function(UI) {
3002
3003 "use strict";
3004
3005 var scrollpos = {x: window.scrollX, y: window.scrollY},
3006 $win = UI.$win,
3007 $doc = UI.$doc,
3008 $html = UI.$html,
3009 Offcanvas = {
3010
3011 show: function(element) {
3012
3013 element = UI.$(element);
3014
3015 if (!element.length) return;
3016
3017 var $body = UI.$('body'),
3018 bar = element.find(".uk-offcanvas-bar:first"),
3019 rtl = (UI.langdirection == "right"),
3020 flip = bar.hasClass("uk-offcanvas-bar-flip") ? -1:1,
3021 dir = flip * (rtl ? -1 : 1),
3022
3023 scrollbarwidth = window.innerWidth - $body.width();
3024
3025 scrollpos = {x: window.pageXOffset, y: window.pageYOffset};
3026
3027 element.addClass("uk-active");
3028
3029 $body.css({"width": window.innerWidth - scrollbarwidth, "height": window.innerHeight}).addClass("uk-offcanvas-page");
3030 $body.css((rtl ? "margin-right" : "margin-left"), (rtl ? -1 : 1) * (bar.outerWidth() * dir)).width(); // .width() - force redraw
3031
3032 $html.css('margin-top', scrollpos.y * -1);
3033
3034 bar.addClass("uk-offcanvas-bar-show");
3035
3036 this._initElement(element);
3037
3038 bar.trigger('show.uk.offcanvas', [element, bar]);
3039
3040 // Update ARIA
3041 element.attr('aria-hidden', 'false');
3042 },
3043
3044 hide: function(force) {
3045
3046 var $body = UI.$('body'),
3047 panel = UI.$(".uk-offcanvas.uk-active"),
3048 rtl = (UI.langdirection == "right"),
3049 bar = panel.find(".uk-offcanvas-bar:first"),
3050 finalize = function() {
3051 $body.removeClass("uk-offcanvas-page").css({"width": "", "height": "", "margin-left": "", "margin-right": ""});
3052 panel.removeClass("uk-active");
3053
3054 bar.removeClass("uk-offcanvas-bar-show");
3055 $html.css('margin-top', '');
3056 window.scrollTo(scrollpos.x, scrollpos.y);
3057 bar.trigger('hide.uk.offcanvas', [panel, bar]);
3058
3059 // Update ARIA
3060 panel.attr('aria-hidden', 'true');
3061 };
3062
3063 if (!panel.length) return;
3064
3065 if (UI.support.transition && !force) {
3066
3067 $body.one(UI.support.transition.end, function() {
3068 finalize();
3069 }).css((rtl ? "margin-right" : "margin-left"), "");
3070
3071 setTimeout(function(){
3072 bar.removeClass("uk-offcanvas-bar-show");
3073 }, 0);
3074
3075 } else {
3076 finalize();
3077 }
3078 },
3079
3080 _initElement: function(element) {
3081
3082 if (element.data("OffcanvasInit")) return;
3083
3084 element.on("click.uk.offcanvas swipeRight.uk.offcanvas swipeLeft.uk.offcanvas", function(e) {
3085
3086 var target = UI.$(e.target);
3087
3088 if (!e.type.match(/swipe/)) {
3089
3090 if (!target.hasClass("uk-offcanvas-close")) {
3091 if (target.hasClass("uk-offcanvas-bar")) return;
3092 if (target.parents(".uk-offcanvas-bar:first").length) return;
3093 }
3094 }
3095
3096 e.stopImmediatePropagation();
3097 Offcanvas.hide();
3098 });
3099
3100 element.on("click", "a[href*='#']", function(e){
3101
3102 var link = UI.$(this),
3103 href = link.attr("href");
3104
3105 if (href == "#") {
3106 return;
3107 }
3108
3109 UI.$doc.one('hide.uk.offcanvas', function() {
3110
3111 var target;
3112
3113 try {
3114 target = UI.$(link[0].hash);
3115 } catch (e){
3116 target = '';
3117 }
3118
3119 if (!target.length) {
3120 target = UI.$('[name="'+link[0].hash.replace('#','')+'"]');
3121 }
3122
3123 if (target.length && UI.Utils.scrollToElement) {
3124 UI.Utils.scrollToElement(target, UI.Utils.options(link.attr('data-uk-smooth-scroll') || '{}'));
3125 } else {
3126 window.location.href = href;
3127 }
3128 });
3129
3130 Offcanvas.hide();
3131 });
3132
3133 element.data("OffcanvasInit", true);
3134 }
3135 };
3136
3137 UI.component('offcanvasTrigger', {
3138
3139 boot: function() {
3140
3141 // init code
3142 $html.on("click.offcanvas.uikit", "[data-uk-offcanvas]", function(e) {
3143
3144 e.preventDefault();
3145
3146 var ele = UI.$(this);
3147
3148 if (!ele.data("offcanvasTrigger")) {
3149 var obj = UI.offcanvasTrigger(ele, UI.Utils.options(ele.attr("data-uk-offcanvas")));
3150 ele.trigger("click");
3151 }
3152 });
3153
3154 $html.on('keydown.uk.offcanvas', function(e) {
3155
3156 if (e.keyCode === 27) { // ESC
3157 Offcanvas.hide();
3158 }
3159 });
3160 },
3161
3162 init: function() {
3163
3164 var $this = this;
3165
3166 this.options = UI.$.extend({
3167 "target": $this.element.is("a") ? $this.element.attr("href") : false
3168 }, this.options);
3169
3170 this.on("click", function(e) {
3171 e.preventDefault();
3172 Offcanvas.show($this.options.target);
3173 });
3174 }
3175 });
3176
3177 UI.offcanvas = Offcanvas;
3178
3179 })(UIkit);
3180
3181 (function(UI) {
3182
3183 "use strict";
3184
3185 var Animations;
3186
3187 UI.component('switcher', {
3188
3189 defaults: {
3190 connect : false,
3191 toggle : ">*",
3192 active : 0,
3193 animation : false,
3194 duration : 200,
3195 swiping : true
3196 },
3197
3198 animating: false,
3199
3200 boot: function() {
3201
3202 // init code
3203 UI.ready(function(context) {
3204
3205 UI.$("[data-uk-switcher]", context).each(function() {
3206 var switcher = UI.$(this);
3207
3208 if (!switcher.data("switcher")) {
3209 var obj = UI.switcher(switcher, UI.Utils.options(switcher.attr("data-uk-switcher")));
3210 }
3211 });
3212 });
3213 },
3214
3215 init: function() {
3216
3217 var $this = this;
3218
3219 this.on("click.uk.switcher", this.options.toggle, function(e) {
3220 e.preventDefault();
3221 $this.show(this);
3222 });
3223
3224 if (this.options.connect) {
3225
3226 this.connect = UI.$(this.options.connect);
3227
3228 this.connect.find(".uk-active").removeClass(".uk-active");
3229
3230 // delegate switch commands within container content
3231 if (this.connect.length) {
3232
3233 // Init ARIA for connect
3234 this.connect.children().attr('aria-hidden', 'true');
3235
3236 this.connect.on("click", '[data-uk-switcher-item]', function(e) {
3237
3238 e.preventDefault();
3239
3240 var item = UI.$(this).attr('data-uk-switcher-item');
3241
3242 if ($this.index == item) return;
3243
3244 switch(item) {
3245 case 'next':
3246 case 'previous':
3247 $this.show($this.index + (item=='next' ? 1:-1));
3248 break;
3249 default:
3250 $this.show(parseInt(item, 10));
3251 }
3252 });
3253
3254 if (this.options.swiping) {
3255
3256 this.connect.on('swipeRight swipeLeft', function(e) {
3257 e.preventDefault();
3258 if(!window.getSelection().toString()) {
3259 $this.show($this.index + (e.type == 'swipeLeft' ? 1 : -1));
3260 }
3261 });
3262 }
3263 }
3264
3265 var toggles = this.find(this.options.toggle),
3266 active = toggles.filter(".uk-active");
3267
3268 if (active.length) {
3269 this.show(active, false);
3270 } else {
3271
3272 if (this.options.active===false) return;
3273
3274 active = toggles.eq(this.options.active);
3275 this.show(active.length ? active : toggles.eq(0), false);
3276 }
3277
3278 // Init ARIA for toggles
3279 toggles.not(active).attr('aria-expanded', 'false');
3280 active.attr('aria-expanded', 'true');
3281
3282 this.on('changed.uk.dom', function() {
3283 $this.connect = UI.$($this.options.connect);
3284 });
3285 }
3286
3287 },
3288
3289 show: function(tab, animate) {
3290
3291 if (this.animating) {
3292 return;
3293 }
3294
3295 if (isNaN(tab)) {
3296 tab = UI.$(tab);
3297 } else {
3298
3299 var toggles = this.find(this.options.toggle);
3300
3301 tab = tab < 0 ? toggles.length-1 : tab;
3302 tab = toggles.eq(toggles[tab] ? tab : 0);
3303 }
3304
3305 var $this = this,
3306 toggles = this.find(this.options.toggle),
3307 active = UI.$(tab),
3308 animation = Animations[this.options.animation] || function(current, next) {
3309
3310 if (!$this.options.animation) {
3311 return Animations.none.apply($this);
3312 }
3313
3314 var anim = $this.options.animation.split(',');
3315
3316 if (anim.length == 1) {
3317 anim[1] = anim[0];
3318 }
3319
3320 anim[0] = anim[0].trim();
3321 anim[1] = anim[1].trim();
3322
3323 return coreAnimation.apply($this, [anim, current, next]);
3324 };
3325
3326 if (animate===false || !UI.support.animation) {
3327 animation = Animations.none;
3328 }
3329
3330 if (active.hasClass("uk-disabled")) return;
3331
3332 // Update ARIA for Toggles
3333 toggles.attr('aria-expanded', 'false');
3334 active.attr('aria-expanded', 'true');
3335
3336 toggles.filter(".uk-active").removeClass("uk-active");
3337 active.addClass("uk-active");
3338
3339 if (this.options.connect && this.connect.length) {
3340
3341 this.index = this.find(this.options.toggle).index(active);
3342
3343 if (this.index == -1 ) {
3344 this.index = 0;
3345 }
3346
3347 this.connect.each(function() {
3348
3349 var container = UI.$(this),
3350 children = UI.$(container.children()),
3351 current = UI.$(children.filter('.uk-active')),
3352 next = UI.$(children.eq($this.index));
3353
3354 $this.animating = true;
3355
3356 animation.apply($this, [current, next]).then(function(){
3357
3358 current.removeClass("uk-active");
3359 next.addClass("uk-active");
3360
3361 // Update ARIA for connect
3362 current.attr('aria-hidden', 'true');
3363 next.attr('aria-hidden', 'false');
3364
3365 UI.Utils.checkDisplay(next, true);
3366
3367 $this.animating = false;
3368
3369 });
3370 });
3371 }
3372
3373 this.trigger("show.uk.switcher", [active]);
3374 }
3375 });
3376
3377 Animations = {
3378
3379 'none': function() {
3380 var d = UI.$.Deferred();
3381 d.resolve();
3382 return d.promise();
3383 },
3384
3385 'fade': function(current, next) {
3386 return coreAnimation.apply(this, ['uk-animation-fade', current, next]);
3387 },
3388
3389 'slide-bottom': function(current, next) {
3390 return coreAnimation.apply(this, ['uk-animation-slide-bottom', current, next]);
3391 },
3392
3393 'slide-top': function(current, next) {
3394 return coreAnimation.apply(this, ['uk-animation-slide-top', current, next]);
3395 },
3396
3397 'slide-vertical': function(current, next, dir) {
3398
3399 var anim = ['uk-animation-slide-top', 'uk-animation-slide-bottom'];
3400
3401 if (current && current.index() > next.index()) {
3402 anim.reverse();
3403 }
3404
3405 return coreAnimation.apply(this, [anim, current, next]);
3406 },
3407
3408 'slide-left': function(current, next) {
3409 return coreAnimation.apply(this, ['uk-animation-slide-left', current, next]);
3410 },
3411
3412 'slide-right': function(current, next) {
3413 return coreAnimation.apply(this, ['uk-animation-slide-right', current, next]);
3414 },
3415
3416 'slide-horizontal': function(current, next, dir) {
3417
3418 var anim = ['uk-animation-slide-right', 'uk-animation-slide-left'];
3419
3420 if (current && current.index() > next.index()) {
3421 anim.reverse();
3422 }
3423
3424 return coreAnimation.apply(this, [anim, current, next]);
3425 },
3426
3427 'scale': function(current, next) {
3428 return coreAnimation.apply(this, ['uk-animation-scale-up', current, next]);
3429 }
3430 };
3431
3432 UI.switcher.animations = Animations;
3433
3434
3435 // helpers
3436
3437 function coreAnimation(cls, current, next) {
3438
3439 var d = UI.$.Deferred(), clsIn = cls, clsOut = cls, release;
3440
3441 if (next[0]===current[0]) {
3442 d.resolve();
3443 return d.promise();
3444 }
3445
3446 if (typeof(cls) == 'object') {
3447 clsIn = cls[0];
3448 clsOut = cls[1] || cls[0];
3449 }
3450
3451 UI.$body.css('overflow-x', 'hidden'); // fix scroll jumping in iOS
3452
3453 release = function() {
3454
3455 if (current) current.hide().removeClass('uk-active '+clsOut+' uk-animation-reverse');
3456
3457 next.addClass(clsIn).one(UI.support.animation.end, function() {
3458
3459 next.removeClass(''+clsIn+'').css({opacity:'', display:''});
3460
3461 d.resolve();
3462
3463 UI.$body.css('overflow-x', '');
3464
3465 if (current) current.css({opacity:'', display:''});
3466
3467 }.bind(this)).show();
3468 };
3469
3470 next.css('animation-duration', this.options.duration+'ms');
3471
3472 if (current && current.length) {
3473
3474 current.css('animation-duration', this.options.duration+'ms');
3475
3476 current.css('display', 'none').addClass(clsOut+' uk-animation-reverse').one(UI.support.animation.end, function() {
3477 release();
3478 }.bind(this)).css('display', '');
3479
3480 } else {
3481 next.addClass('uk-active');
3482 release();
3483 }
3484
3485 return d.promise();
3486 }
3487
3488 })(UIkit);
3489
3490 (function(UI) {
3491
3492 "use strict";
3493
3494 UI.component('tab', {
3495
3496 defaults: {
3497 'target' : '>li:not(.uk-tab-responsive, .uk-disabled)',
3498 'connect' : false,
3499 'active' : 0,
3500 'animation' : false,
3501 'duration' : 200,
3502 'swiping' : true
3503 },
3504
3505 boot: function() {
3506
3507 // init code
3508 UI.ready(function(context) {
3509
3510 UI.$("[data-uk-tab]", context).each(function() {
3511
3512 var tab = UI.$(this);
3513
3514 if (!tab.data("tab")) {
3515 var obj = UI.tab(tab, UI.Utils.options(tab.attr("data-uk-tab")));
3516 }
3517 });
3518 });
3519 },
3520
3521 init: function() {
3522
3523 var $this = this;
3524
3525 this.current = false;
3526
3527 this.on("click.uk.tab", this.options.target, function(e) {
3528
3529 e.preventDefault();
3530
3531 if ($this.switcher && $this.switcher.animating) {
3532 return;
3533 }
3534
3535 var current = $this.find($this.options.target).not(this);
3536
3537 current.removeClass("uk-active").blur();
3538
3539 $this.trigger("change.uk.tab", [UI.$(this).addClass("uk-active"), $this.current]);
3540
3541 $this.current = UI.$(this);
3542
3543 // Update ARIA
3544 if (!$this.options.connect) {
3545 current.attr('aria-expanded', 'false');
3546 UI.$(this).attr('aria-expanded', 'true');
3547 }
3548 });
3549
3550 if (this.options.connect) {
3551 this.connect = UI.$(this.options.connect);
3552 }
3553
3554 // init responsive tab
3555 this.responsivetab = UI.$('<li class="uk-tab-responsive uk-active"><a></a></li>').append('<div class="uk-dropdown uk-dropdown-small"><ul class="uk-nav uk-nav-dropdown"></ul><div>');
3556
3557 this.responsivetab.dropdown = this.responsivetab.find('.uk-dropdown');
3558 this.responsivetab.lst = this.responsivetab.dropdown.find('ul');
3559 this.responsivetab.caption = this.responsivetab.find('a:first');
3560
3561 if (this.element.hasClass("uk-tab-bottom")) this.responsivetab.dropdown.addClass("uk-dropdown-up");
3562
3563 // handle click
3564 this.responsivetab.lst.on('click.uk.tab', 'a', function(e) {
3565
3566 e.preventDefault();
3567 e.stopPropagation();
3568
3569 var link = UI.$(this);
3570
3571 $this.element.children('li:not(.uk-tab-responsive)').eq(link.data('index')).trigger('click');
3572 });
3573
3574 this.on('show.uk.switcher change.uk.tab', function(e, tab) {
3575 $this.responsivetab.caption.html(tab.text());
3576 });
3577
3578 this.element.append(this.responsivetab);
3579
3580 // init UIkit components
3581 if (this.options.connect) {
3582 this.switcher = UI.switcher(this.element, {
3583 'toggle' : '>li:not(.uk-tab-responsive)',
3584 'connect' : this.options.connect,
3585 'active' : this.options.active,
3586 'animation' : this.options.animation,
3587 'duration' : this.options.duration,
3588 'swiping' : this.options.swiping
3589 });
3590 }
3591
3592 UI.dropdown(this.responsivetab, {"mode": "click", "preventflip": "y"});
3593
3594 // init
3595 $this.trigger("change.uk.tab", [this.element.find(this.options.target).not('.uk-tab-responsive').filter('.uk-active')]);
3596
3597 this.check();
3598
3599 UI.$win.on('resize orientationchange', UI.Utils.debounce(function(){
3600 if ($this.element.is(":visible")) $this.check();
3601 }, 100));
3602
3603 this.on('display.uk.check', function(){
3604 if ($this.element.is(":visible")) $this.check();
3605 });
3606 },
3607
3608 check: function() {
3609
3610 var children = this.element.children('li:not(.uk-tab-responsive)').removeClass('uk-hidden');
3611
3612 if (!children.length) {
3613 this.responsivetab.addClass('uk-hidden');
3614 return;
3615 }
3616
3617 var top = (children.eq(0).offset().top + Math.ceil(children.eq(0).height()/2)),
3618 doresponsive = false,
3619 item, link, clone;
3620
3621 this.responsivetab.lst.empty();
3622
3623 children.each(function(){
3624
3625 if (UI.$(this).offset().top > top) {
3626 doresponsive = true;
3627 }
3628 });
3629
3630 if (doresponsive) {
3631
3632 for (var i = 0; i < children.length; i++) {
3633
3634 item = UI.$(children.eq(i));
3635 link = item.find('a');
3636
3637 if (item.css('float') != 'none' && !item.attr('uk-dropdown')) {
3638
3639 if (!item.hasClass('uk-disabled')) {
3640
3641 clone = item[0].outerHTML.replace('<a ', '<a data-index="'+i+'" ');
3642
3643 this.responsivetab.lst.append(clone);
3644 }
3645
3646 item.addClass('uk-hidden');
3647 }
3648 }
3649 }
3650
3651 this.responsivetab[this.responsivetab.lst.children('li').length ? 'removeClass':'addClass']('uk-hidden');
3652 }
3653 });
3654
3655 })(UIkit);
3656
3657 (function(UI){
3658
3659 "use strict";
3660
3661 UI.component('cover', {
3662
3663 defaults: {
3664 automute : true
3665 },
3666
3667 boot: function() {
3668
3669 // auto init
3670 UI.ready(function(context) {
3671
3672 UI.$("[data-uk-cover]", context).each(function(){
3673
3674 var ele = UI.$(this);
3675
3676 if(!ele.data("cover")) {
3677 var plugin = UI.cover(ele, UI.Utils.options(ele.attr("data-uk-cover")));
3678 }
3679 });
3680 });
3681 },
3682
3683 init: function() {
3684
3685 this.parent = this.element.parent();
3686
3687 UI.$win.on('load resize orientationchange', UI.Utils.debounce(function(){
3688 this.check();
3689 }.bind(this), 100));
3690
3691 this.on("display.uk.check", function(e) {
3692 if(this.element.is(":visible")) this.check();
3693 }.bind(this));
3694
3695 this.check();
3696
3697 if (this.element.is('iframe') && this.options.automute) {
3698
3699 var src = this.element.attr('src');
3700
3701 this.element.attr('src', '').on('load', function(){
3702
3703 this.contentWindow.postMessage('{ "event": "command", "func": "mute", "method":"setVolume", "value":0}', '*');
3704
3705 }).attr('src', [src, (src.indexOf('?') > -1 ? '&':'?'), 'enablejsapi=1&api=1'].join(''));
3706 }
3707 },
3708
3709 check: function() {
3710
3711 this.element.css({
3712 'width' : '',
3713 'height' : ''
3714 });
3715
3716 this.dimension = {w: this.element.width(), h: this.element.height()};
3717
3718 if (this.element.attr('width') && !isNaN(this.element.attr('width'))) {
3719 this.dimension.w = this.element.attr('width');
3720 }
3721
3722 if (this.element.attr('height') && !isNaN(this.element.attr('height'))) {
3723 this.dimension.h = this.element.attr('height');
3724 }
3725
3726 this.ratio = this.dimension.w / this.dimension.h;
3727
3728 var w = this.parent.width(), h = this.parent.height(), width, height;
3729
3730 // if element height < parent height (gap underneath)
3731 if ((w / this.ratio) < h) {
3732
3733 width = Math.ceil(h * this.ratio);
3734 height = h;
3735
3736 // element width < parent width (gap to right)
3737 } else {
3738
3739 width = w;
3740 height = Math.ceil(w / this.ratio);
3741 }
3742
3743 this.element.css({
3744 'width' : width,
3745 'height' : height
3746 });
3747 }
3748 });
3749
3750 })(UIkit);