// Generated by CoffeeScript 1.10.0

/*
 jQuery Growl
 Copyright 2015 Kevin Sylvestre
 1.3.2
 */

(
	function() {
		"use strict";
		var $, Animation, Growl,
			bind = function( fn, me ) {
				return function() {
					return fn.apply( me, arguments );
				};
			};

		$ = jQuery;

		Animation = (
			function() {
				function Animation() {
				}

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

				Animation.transition = function( $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;

			}
		)();

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

				Growl.growl = function( settings ) {
					if ( settings == null ) {
						settings = {};
					}
					this.initialize();
					return new Growl( settings );
				};

				Growl.initialize = function() {
					return $( "body:not(:has(#growls))" ).append( '<div id="growls" />' );
				};

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

				Growl.prototype.render = function() {
					var $growl;
					$growl = this.$growl();
					this.$growls().append( $growl );
					if ( this.settings.fixed ) {
						this.present();
					} else {
						this.cycle();
					}
				};

				Growl.prototype.bind = function( $growl ) {
					if ( $growl == null ) {
						$growl = 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 );
				};

				Growl.prototype.unbind = function( $growl ) {
					if ( $growl == null ) {
						$growl = 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 );
				};

				Growl.prototype.mouseEnter = function( event ) {
					var $growl;
					$growl = this.$growl();
					return $growl.stop( true, true );
				};

				Growl.prototype.mouseLeave = function( event ) {
					return this.waitAndDismiss();
				};

				Growl.prototype.click = function( event ) {
					if ( this.settings.url != null ) {
						event.preventDefault();
						event.stopPropagation();
						return window.open( this.settings.url );
					}
				};

				Growl.prototype.close = function( event ) {
					var $growl;
					event.preventDefault();
					event.stopPropagation();
					$growl = this.$growl();
					return $growl.stop().queue( this.dismiss ).queue( this.remove );
				};

				Growl.prototype.cycle = function() {
					var $growl;
					$growl = this.$growl();
					return $growl.queue( this.present ).queue( this.waitAndDismiss() );
				};

				Growl.prototype.waitAndDismiss = function() {
					var $growl;
					$growl = this.$growl();
					return $growl.delay( this.settings.duration ).queue( this.dismiss ).queue( this.remove );
				};

				Growl.prototype.present = function( callback ) {
					var $growl;
					$growl = this.$growl();
					this.bind( $growl );
					return this.animate( $growl, this.settings.namespace + "-incoming", 'out', callback );
				};

				Growl.prototype.dismiss = function( callback ) {
					var $growl;
					$growl = this.$growl();
					this.unbind( $growl );
					return this.animate( $growl, this.settings.namespace + "-outgoing", 'in', callback );
				};

				Growl.prototype.remove = function( callback ) {
					this.$growl().remove();
					return typeof callback === "function" ? callback() : void 0;
				};

				Growl.prototype.animate = function( $element, name, direction, callback ) {
					var transition;
					if ( direction == null ) {
						direction = 'in';
					}
					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();
					}
				};

				Growl.prototype.$growls = function() {
					return this.$_growls != null ? this.$_growls : this.$_growls = $( '#growls' );
				};

				Growl.prototype.$growl = function() {
					return this.$_growl != null ? this.$_growl : this.$_growl = $( this.html() );
				};

				Growl.prototype.html = function() {
					return this.container( this.content() );
				};

				Growl.prototype.content = function() {
					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>";
				};

				Growl.prototype.container = function( 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;

			}
		)();

		this.Growl = Growl;

		$.growl = function( options ) {
			if ( options == null ) {
				options = {};
			}
			return Growl.growl( options );
		};

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

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

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

	}
).call( this );
