var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

// Generated by CoffeeScript 2.1.0
(function () {
    /*
    jQuery Growl
    Copyright 2015 Kevin Sylvestre
    1.3.5
    */
    "use strict";

    var $, Animation, Growl;

    $ = jQuery;

    Animation = function () {
        var Animation = function () {
            function Animation() {
                _classCallCheck(this, Animation);
            }

            _createClass(Animation, null, [{
                key: "transition",
                value: function transition($el) {
                    var el, ref, result, type;
                    el = $el[0];
                    ref = this.transitions;
                    for (type in ref) {
                        result = ref[type];
                        if (el.style[type] != null) {
                            return result;
                        }
                    }
                }
            }]);

            return Animation;
        }();

        ;

        Animation.transitions = {
            "webkitTransition": "webkitTransitionEnd",
            "mozTransition": "mozTransitionEnd",
            "oTransition": "oTransitionEnd",
            "transition": "transitionend"
        };

        return Animation;
    }();

    Growl = function () {
        var Growl = function () {
            _createClass(Growl, null, [{
                key: "growl",
                value: function growl() {
                    var settings = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};

                    return new Growl(settings);
                }
            }]);

            function Growl() {
                var settings = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};

                _classCallCheck(this, Growl);

                this.render = this.render.bind(this);
                this.bind = this.bind.bind(this);
                this.unbind = this.unbind.bind(this);
                this.mouseEnter = this.mouseEnter.bind(this);
                this.mouseLeave = this.mouseLeave.bind(this);
                this.click = this.click.bind(this);
                this.close = this.close.bind(this);
                this.cycle = this.cycle.bind(this);
                this.waitAndDismiss = this.waitAndDismiss.bind(this);
                this.present = this.present.bind(this);
                this.dismiss = this.dismiss.bind(this);
                this.remove = this.remove.bind(this);
                this.animate = this.animate.bind(this);
                this.$growls = this.$growls.bind(this);
                this.$growl = this.$growl.bind(this);
                this.html = this.html.bind(this);
                this.content = this.content.bind(this);
                this.container = this.container.bind(this);
                this.settings = $.extend({}, Growl.settings, settings);
                this.initialize(this.settings.location);
                this.render();
            }

            _createClass(Growl, [{
                key: "initialize",
                value: function initialize(location) {
                    var id;
                    id = 'growls-' + location;
                    return $('body:not(:has(#' + id + '))').append('<div id="' + id + '" />');
                }
            }, {
                key: "render",
                value: function render() {
                    var $growl;
                    $growl = this.$growl();
                    this.$growls(this.settings.location).append($growl);
                    if (this.settings.fixed) {
                        this.present();
                    } else {
                        this.cycle();
                    }
                }
            }, {
                key: "bind",
                value: function bind() {
                    var $growl = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.$growl();

                    $growl.on("click", this.click);
                    if (this.settings.delayOnHover) {
                        $growl.on("mouseenter", this.mouseEnter);
                        $growl.on("mouseleave", this.mouseLeave);
                    }
                    return $growl.on("contextmenu", this.close).find("." + this.settings.namespace + "-close").on("click", this.close);
                }
            }, {
                key: "unbind",
                value: function unbind() {
                    var $growl = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.$growl();

                    $growl.off("click", this.click);
                    if (this.settings.delayOnHover) {
                        $growl.off("mouseenter", this.mouseEnter);
                        $growl.off("mouseleave", this.mouseLeave);
                    }
                    return $growl.off("contextmenu", this.close).find("." + this.settings.namespace + "-close").off("click", this.close);
                }
            }, {
                key: "mouseEnter",
                value: function mouseEnter(event) {
                    var $growl;
                    $growl = this.$growl();
                    return $growl.stop(true, true);
                }
            }, {
                key: "mouseLeave",
                value: function mouseLeave(event) {
                    return this.waitAndDismiss();
                }
            }, {
                key: "click",
                value: function click(event) {
                    if (this.settings.url != null) {
                        event.preventDefault();
                        event.stopPropagation();
                        return window.open(this.settings.url);
                    }
                }
            }, {
                key: "close",
                value: function close(event) {
                    var $growl;
                    event.preventDefault();
                    event.stopPropagation();
                    $growl = this.$growl();
                    return $growl.stop().queue(this.dismiss).queue(this.remove);
                }
            }, {
                key: "cycle",
                value: function cycle() {
                    var $growl;
                    $growl = this.$growl();
                    return $growl.queue(this.present).queue(this.waitAndDismiss());
                }
            }, {
                key: "waitAndDismiss",
                value: function waitAndDismiss() {
                    var $growl;
                    $growl = this.$growl();
                    return $growl.delay(this.settings.duration).queue(this.dismiss).queue(this.remove);
                }
            }, {
                key: "present",
                value: function present(callback) {
                    var $growl;
                    $growl = this.$growl();
                    this.bind($growl);
                    return this.animate($growl, this.settings.namespace + "-incoming", 'out', callback);
                }
            }, {
                key: "dismiss",
                value: function dismiss(callback) {
                    var $growl;
                    $growl = this.$growl();
                    this.unbind($growl);
                    return this.animate($growl, this.settings.namespace + "-outgoing", 'in', callback);
                }
            }, {
                key: "remove",
                value: function remove(callback) {
                    this.$growl().remove();
                    return typeof callback === "function" ? callback() : void 0;
                }
            }, {
                key: "animate",
                value: function animate($element, name) {
                    var direction = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'in';
                    var callback = arguments[3];

                    var transition;
                    transition = Animation.transition($element);
                    $element[direction === 'in' ? 'removeClass' : 'addClass'](name);
                    $element.offset().position;
                    $element[direction === 'in' ? 'addClass' : 'removeClass'](name);
                    if (callback == null) {
                        return;
                    }
                    if (transition != null) {
                        $element.one(transition, callback);
                    } else {
                        callback();
                    }
                }
            }, {
                key: "$growls",
                value: function $growls(location) {
                    var base;
                    if (this.$_growls == null) {
                        this.$_growls = [];
                    }
                    return (base = this.$_growls)[location] != null ? base[location] : base[location] = $('#growls-' + location);
                }
            }, {
                key: "$growl",
                value: function $growl() {
                    return this.$_growl != null ? this.$_growl : this.$_growl = $(this.html());
                }
            }, {
                key: "html",
                value: function html() {
                    return this.container(this.content());
                }
            }, {
                key: "content",
                value: function content() {
                    return "<div class='" + this.settings.namespace + "-close'>" + this.settings.close + "</div>\n<div class='" + this.settings.namespace + "-title'>" + this.settings.title + "</div>\n<div class='" + this.settings.namespace + "-message'>" + this.settings.message + "</div>";
                }
            }, {
                key: "container",
                value: function container(content) {
                    return "<div class='" + this.settings.namespace + " " + this.settings.namespace + "-" + this.settings.style + " " + this.settings.namespace + "-" + this.settings.size + "'>\n  " + content + "\n</div>";
                }
            }]);

            return Growl;
        }();


        Growl.settings = {
            namespace: 'growl',
            duration: 3200,
            close: "&#215;",
            location: "default",
            style: "success",
            size: "medium",
            delayOnHover: true
        };

        return Growl;
    }();

    this.Growl = Growl;

    $.growl = function () {
        var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};

        return Growl.growl(options);
    };

    $.growl.error = function () {
        var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};

        var settings;
        settings = {
            title: "Error!",
            style: "error"
        };
        return $.growl($.extend(settings, options));
    };

    $.growl.notice = function () {
        var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};

        var settings;
        settings = {
            title: "Notice!",
            style: "notice"
        };
        return $.growl($.extend(settings, options));
    };

    $.growl.warning = function () {
        var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};

        var settings;
        settings = {
            title: "Warning!",
            style: "warning"
        };
        return $.growl($.extend(settings, options));
    };
}).call(this);
