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

var component;

if (window.UIkit) {
    component = addon(UIkit);
}

if (typeof define == 'function' && define.amd) {
    define('uikit-notify', ['uikit'], function(){
        return component || addon(UIkit);
    });
}

})(function(UI){

"use strict";

var containers = {},
    messages   = {},

    notify     =  function(options){

        if (UI.$.type(options) == 'string') {
            options = { message: options };
        }

        if (arguments[1]) {
            options = UI.$.extend(options, UI.$.type(arguments[1]) == 'string' ? {status:arguments[1]} : arguments[1]);
        }

        return (new Message(options)).show();
    },
    closeAll  = function(group, instantly){

        var id;

        if (group) {
            for(id in messages) { if(group===messages[id].group) messages[id].close(instantly); }
        } else {
            for(id in messages) { messages[id].close(instantly); }
        }
    };

var Message = function(options){

    this.options = UI.$.extend({}, Message.defaults, options);

    this.uuid    = UI.Utils.uid('notifymsg');
    this.element = UI.$([

        '<div class="uk-notify-message">',
            '<a class="uk-close"></a>',
            '<div></div>',
        '</div>'

    ].join('')).data("notifyMessage", this);

    this.content(this.options.message);

    // status
    if (this.options.status) {
        this.element.addClass('uk-notify-message-'+this.options.status);
        this.currentstatus = this.options.status;
    }

    this.group = this.options.group;

    messages[this.uuid] = this;

    if(!containers[this.options.pos]) {
        containers[this.options.pos] = UI.$('<div class="uk-notify uk-notify-'+this.options.pos+'"></div>').appendTo('body').on("click", ".uk-notify-message", function(){

            var message = UI.$(this).data('notifyMessage');

            message.element.trigger('manualclose.uk.notify', [message]);
            message.close();
        });
    }
};

UI.$.extend(Message.prototype, {

    uuid: false,
    element: false,
    timout: false,
    currentstatus: "",
    group: false,

    show: function() {

        if (this.element.is(':visible')) return;

        var $this = this;

        containers[this.options.pos].show().prepend(this.element);

        var marginbottom = parseInt(this.element.css('margin-bottom'), 10);

        this.element.css({opacity:0, marginTop: -1*this.element.outerHeight(), marginBottom:0}).animate({opacity:1, marginTop:0, marginBottom:marginbottom}, function(){

            if ($this.options.timeout) {

                var closefn = function(){ $this.close(); };

                $this.timeout = setTimeout(closefn, $this.options.timeout);

                $this.element.hover(
                    function() { clearTimeout($this.timeout); },
                    function() { $this.timeout = setTimeout(closefn, $this.options.timeout);  }
                );
            }

        });

        return this;
    },

    close: function(instantly) {

        var $this    = this,
            finalize = function(){
                $this.element.remove();

                if (!containers[$this.options.pos].children().length) {
                    containers[$this.options.pos].hide();
                }

                $this.options.onClose.apply($this, []);
                $this.element.trigger('close.uk.notify', [$this]);

                delete messages[$this.uuid];
            };

        if (this.timeout) clearTimeout(this.timeout);

        if (instantly) {
            finalize();
        } else {
            this.element.animate({opacity:0, marginTop: -1* this.element.outerHeight(), marginBottom:0}, function(){
                finalize();
            });
        }
    },

    content: function(html){

        var container = this.element.find(">div");

        if(!html) {
            return container.html();
        }

        container.html(html);

        return this;
    },

    status: function(status) {

        if (!status) {
            return this.currentstatus;
        }

        this.element.removeClass('uk-notify-message-'+this.currentstatus).addClass('uk-notify-message-'+status);

        this.currentstatus = status;

        return this;
    }
});

Message.defaults = {
    message: "",
    status: "",
    timeout: 5000,
    group: null,
    pos: 'top-center',
    onClose: function() {}
};

UI.notify          = notify;
UI.notify.message  = Message;
UI.notify.closeAll = closeAll;

return notify;

});