/*! UIkit 2.27.2 | www.getuikit.com | © 2014 YOOtheme | MIT License */ (function(UI) {

"use strict";

var stacks = [];

UI.component('stackMargin', {

    defaults: {
        cls: 'uk-margin-small-top',
        rowfirst: false,
        observe: false
    },

    boot: function() {

        // init code
        UI.ready(function(context) {

            UI.$('[data-uk-margin]', context).each(function() {

                var ele = UI.$(this);

                if (!ele.data('stackMargin')) {
                    UI.stackMargin(ele, UI.Utils.options(ele.attr('data-uk-margin')));
                }
            });
        });
    },

    init: function() {

        var $this = this;

        UI.$win.on('resize orientationchange', (function() {

            var fn = function() {
                $this.process();
            };

            UI.$(function() {
                fn();
                UI.$win.on('load', fn);
            });

            return UI.Utils.debounce(fn, 20);
        })());

        this.on('display.uk.check', function(e) {
            if (this.element.is(':visible')) this.process();
        }.bind(this));

        if (this.options.observe) {

            UI.domObserve(this.element, function(e) {
                if ($this.element.is(':visible')) $this.process();
            });
        }

        stacks.push(this);
    },

    process: function() {

        var $this = this, columns = this.element.children();

        UI.Utils.stackMargin(columns, this.options);

        if (!this.options.rowfirst || !columns.length) {
            return this;
        }

        // Mark first column elements
        var group = {}, minleft = false;

        columns.removeClass(this.options.rowfirst).each(function(offset, $ele){

            $ele = UI.$(this);

            if (this.style.display != 'none') {
                offset = $ele.offset().left;
                ((group[offset] = group[offset] || []) && group[offset]).push(this);
                minleft = minleft === false ? offset : Math.min(minleft, offset);
            }
        });

        UI.$(group[minleft]).addClass(this.options.rowfirst);

        return this;
    }

});

// responsive element e.g. iframes

(function(){

    var elements = [], check = function(ele) {

        if (!ele.is(':visible')) return;

        var width  = ele.parent().width(),
            iwidth = ele.data('width'),
            ratio  = (width / iwidth),
            height = Math.floor(ratio * ele.data('height'));

        ele.css({height: (width < iwidth) ? height : ele.data('height')});
    };

    UI.component('responsiveElement', {

        defaults: {},

        boot: function() {

            // init code
            UI.ready(function(context) {

                UI.$('iframe.uk-responsive-width, [data-uk-responsive]', context).each(function() {

                    var ele = UI.$(this), obj;

                    if (!ele.data('responsiveElement')) {
                        obj = UI.responsiveElement(ele, {});
                    }
                });
            });
        },

        init: function() {

            var ele = this.element;

            if (ele.attr('width') && ele.attr('height')) {

                ele.data({
                    width : ele.attr('width'),
                    height: ele.attr('height')
                }).on('display.uk.check', function(){
                    check(ele);
                });

                check(ele);

                elements.push(ele);
            }
        }
    });

    UI.$win.on('resize load', UI.Utils.debounce(function(){

        elements.forEach(function(ele){
            check(ele);
        });

    }, 15));

})();

// helper

UI.Utils.stackMargin = function(elements, options) {

    options = UI.$.extend({
        cls: 'uk-margin-small-top'
    }, options);

    elements = UI.$(elements).removeClass(options.cls);

    var min = false;

    elements.each(function(offset, height, pos, $ele){

        $ele   = UI.$(this);

        if ($ele.css('display') != 'none') {

            offset = $ele.offset();
            height = $ele.outerHeight();
            pos    = offset.top + height;

            $ele.data({
                ukMarginPos: pos,
                ukMarginTop: offset.top
            });

            if (min === false || (offset.top < min.top) ) {

                min = {
                    top  : offset.top,
                    left : offset.left,
                    pos  : pos
                };
            }
        }

    }).each(function($ele) {

        $ele   = UI.$(this);

        if ($ele.css('display') != 'none' && $ele.data('ukMarginTop') > min.top && $ele.data('ukMarginPos') > min.pos) {
            $ele.addClass(options.cls);
        }
    });
};

UI.Utils.matchHeights = function(elements, options) {

    elements = UI.$(elements).css('min-height', '');
    options  = UI.$.extend({ row : true }, options);

    var matchHeights = function(group){

        if (group.length < 2) return;

        var max = 0;

        group.each(function() {
            max = Math.max(max, UI.$(this).outerHeight());
        }).each(function() {

            var element = UI.$(this),
                height  = max - (element.css('box-sizing') == 'border-box' ? 0 : (element.outerHeight() - element.height()));

            element.css('min-height', height + 'px');
        });
    };

    if (options.row) {

        elements.first().width(); // force redraw

        setTimeout(function(){

            var lastoffset = false, group = [];

            elements.each(function() {

                var ele = UI.$(this), offset = ele.offset().top;

                if (offset != lastoffset && group.length) {

                    matchHeights(UI.$(group));
                    group  = [];
                    offset = ele.offset().top;
                }

                group.push(ele);
                lastoffset = offset;
            });

            if (group.length) {
                matchHeights(UI.$(group));
            }

        }, 0);

    } else {
        matchHeights(elements);
    }
};

(function(cacheSvgs){

    UI.Utils.inlineSvg = function(selector, root) {

        var images = UI.$(selector || 'img[src$=".svg"]', root || document).each(function(){

            var img = UI.$(this),
                src = img.attr('src');

            if (!cacheSvgs[src]) {

                var d = UI.$.Deferred();

                UI.$.get(src, {nc: Math.random()}, function(data){
                    d.resolve(UI.$(data).find('svg'));
                });

                cacheSvgs[src] = d.promise();
            }

            cacheSvgs[src].then(function(svg) {

                var $svg = UI.$(svg).clone();

                if (img.attr('id')) $svg.attr('id', img.attr('id'));
                if (img.attr('class')) $svg.attr('class', img.attr('class'));
                if (img.attr('style')) $svg.attr('style', img.attr('style'));

                if (img.attr('width')) {
                    $svg.attr('width', img.attr('width'));
                    if (!img.attr('height'))  $svg.removeAttr('height');
                }

                if (img.attr('height')){
                    $svg.attr('height', img.attr('height'));
                    if (!img.attr('width')) $svg.removeAttr('width');
                }

                img.replaceWith($svg);
            });
        });
    };

    // init code
    UI.ready(function(context) {
        UI.Utils.inlineSvg('[data-uk-svg]', context);
    });

})({});

UI.Utils.getCssVar = function(name) {

    /* usage in css:  .var-name:before { content:"xyz" } */

    var val, doc = document.documentElement, element = doc.appendChild(document.createElement('div'));

    element.classList.add('var-'+name);

    try {
        val = JSON.parse(val = getComputedStyle(element, ':before').content.replace(/^["'](.*)["']$/, '$1'));
    } catch (e) {
        val = undefined;
    }

    doc.removeChild(element);

    return val;
}

})(UIkit);