aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--library/jgrowl/.gitignore5
-rw-r--r--library/jgrowl/Gruntfile.js61
-rw-r--r--library/jgrowl/LICENSE7
-rw-r--r--library/jgrowl/README3
-rw-r--r--library/jgrowl/README.md75
-rw-r--r--library/jgrowl/bower.json32
-rw-r--r--library/jgrowl/examples/appendTo.html103
-rw-r--r--library/jgrowl/examples/bootstrap.html91
-rwxr-xr-xlibrary/jgrowl/examples/jgrowl.html171
-rw-r--r--library/jgrowl/jgrowl.jquery.json40
-rw-r--r--library/jgrowl/jquery.jgrowl.css101
-rwxr-xr-xlibrary/jgrowl/jquery.jgrowl.js399
-rw-r--r--library/jgrowl/jquery.jgrowl.map1
-rw-r--r--library/jgrowl/jquery.jgrowl.min.css1
-rw-r--r--library/jgrowl/jquery.jgrowl.min.js (renamed from library/jgrowl/jquery.jgrowl_minimized.js)2
-rwxr-xr-xlibrary/jgrowl/less/jgrowl.core.less101
-rw-r--r--library/jgrowl/less/jgrowl.less2
-rw-r--r--library/jgrowl/less/jgrowl.variables.less8
-rw-r--r--library/jgrowl/package.json23
-rw-r--r--view/php/theme_init.php2
20 files changed, 1222 insertions, 6 deletions
diff --git a/library/jgrowl/.gitignore b/library/jgrowl/.gitignore
new file mode 100644
index 000000000..385e49ef1
--- /dev/null
+++ b/library/jgrowl/.gitignore
@@ -0,0 +1,5 @@
+.DS_Store
+node_modules/
+jGrowl.iml
+jGrowl.ipr
+jGrowl.iws
diff --git a/library/jgrowl/Gruntfile.js b/library/jgrowl/Gruntfile.js
new file mode 100644
index 000000000..fed0fceee
--- /dev/null
+++ b/library/jgrowl/Gruntfile.js
@@ -0,0 +1,61 @@
+module.exports = function(grunt) {
+
+ grunt.initConfig({
+ pkg: grunt.file.readJSON('package.json'),
+ uglify: {
+ options: {
+ sourceMap: true,
+ sourceMapName: 'jquery.jgrowl.map'
+ },
+ jgrowl: {
+ files: {
+ 'jquery.jgrowl.min.js': ['jquery.jgrowl.js']
+ }
+ }
+ },
+ less: {
+ jgrowl: {
+ files: {
+ "jquery.jgrowl.css": "less/jgrowl.less"
+ }
+ }
+ },
+ cssmin: {
+ jgrowl: {
+ expand: true,
+ src: 'jquery.jgrowl.css',
+ ext: '.jgrowl.min.css'
+ }
+ },
+ jshint: {
+ files: ['Gruntfile.js', 'jquery.jgrowl.js'],
+ options: {
+ // options here to override JSHint defaults
+ globals: {
+ jQuery: true,
+ console: true,
+ module: true,
+ document: true
+ }
+ }
+ },
+ watch: {
+ scripts: {
+ files: ['jquery.jgrowl.js', 'less/*'],
+ tasks: ['jshint', 'less', 'cssmin', 'uglify'],
+ options: {
+ spawn: false
+ }
+ }
+ }
+ });
+
+ grunt.loadNpmTasks('grunt-contrib-uglify');
+ grunt.loadNpmTasks('grunt-contrib-cssmin');
+ grunt.loadNpmTasks('grunt-contrib-jshint');
+ grunt.loadNpmTasks('grunt-contrib-watch');
+ grunt.loadNpmTasks('grunt-contrib-less');
+
+ grunt.registerTask('test', ['jshint']);
+ grunt.registerTask('default', ['jshint', 'uglify', 'less', 'cssmin']);
+};
diff --git a/library/jgrowl/LICENSE b/library/jgrowl/LICENSE
new file mode 100644
index 000000000..e70a54a58
--- /dev/null
+++ b/library/jgrowl/LICENSE
@@ -0,0 +1,7 @@
+Copyright (c) 2012 Stan Lemon
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/library/jgrowl/README b/library/jgrowl/README
deleted file mode 100644
index d0f1a62ad..000000000
--- a/library/jgrowl/README
+++ /dev/null
@@ -1,3 +0,0 @@
-https://github.com/stanlemon/jGrowl
-
-jGrowl is free and open source, it's distributed under the MIT and GPL licenses
diff --git a/library/jgrowl/README.md b/library/jgrowl/README.md
new file mode 100644
index 000000000..7dfd85637
--- /dev/null
+++ b/library/jgrowl/README.md
@@ -0,0 +1,75 @@
+# jGrowl
+jGrowl is a jQuery plugin that raises unobtrusive messages within the browser, similar to the way that OS X's Growl Framework works. The idea is simple, deliver notifications to the end user in a noticeable way that doesn't obstruct the work flow and yet keeps the user informed.
+
+## Installation
+jGrowl can be added to your project using package managers like bower and npm or directly into your html using cdnjs, as well as the good old fashioned copy-paste into your project directory.
+
+Use cdnjs:
+
+```html
+<link rel="stylesheet" type="text/css" href="//cdnjs.cloudflare.com/ajax/libs/jquery-jgrowl/1.4.1/jquery.jgrowl.min.css" />
+<script src="//cdnjs.cloudflare.com/ajax/libs/jquery-jgrowl/1.4.1/jquery.jgrowl.min.js"></script>
+```
+
+Install with bower
+
+```
+bower install jgrowl
+```
+
+Install with npm
+
+```
+npm install jgrowl
+```
+
+```js
+// Sample 1
+$.jGrowl("Hello world!");
+// Sample 2
+$.jGrowl("Stick this!", { sticky: true });
+// Sample 3
+$.jGrowl("A message with a header", { header: 'Important' });
+// Sample 4
+$.jGrowl("A message that will live a little longer.", { life: 10000 });
+// Sample 5
+$.jGrowl("A message with a beforeOpen callback and a different opening animation.", {
+ beforeClose: function(e,m) {
+ alert('About to close this notification!');
+ },
+ animateOpen: {
+ height: 'show'
+ }
+});
+```
+
+## Configuration Options
+| Option | Default | Description |
+|------------------|--------------------------------------|------------------------------------------------------------|
+| pool | 0 | Limit the number of messages appearing at a given time to the number in the pool. |
+| header | empty | Optional header to prefix the message, this is often helpful for associating messages to each other. |
+| group | empty | A css class to be applied to notifications when they are created, useful for 'grouping' notifications by a css selector. |
+| sticky | false | When set to true a message will stick to the screen until it is intentionally closed by the user. |
+| position | top-right | Designates a class which is applied to the jGrowl container and controls its position on the screen. By Default there are five options available, top-left, top-right, bottom-left, bottom-right, center. This must be changed in the defaults before the startup method is called. |
+| appendTo | body | The element where our jGrowl messages are appended to. The default is `body` but feel free to define another one. |
+| glue | after | Designates whether a jGrowl notification should be appended to the container after all notifications, or whether it should be prepended to the container before all notifications. Options are after or before. |
+| theme | default | A CSS class designating custom styling for this particular message, intended for use with jQuery UI. |
+| themeState | highlight | A CSS class designating custom styling for this particular message and its state, intended for use with jQuery UI. |
+| corners | 10px | If the corners jQuery plugin is include this option specifies the curvature radius to be used for the notifications as they are created. |
+| check | 250 | The frequency that jGrowl should check for messages to be scrubbed from the screen.This must be changed in the defaults before the startup method is called. |
+| life | 3000 | The lifespan of a non-sticky message on the screen. |
+| closeDuration | normal | The animation speed used to close a notification. |
+| openDuration | normal | The animation speed used to open a notification. |
+| easing | swing | The easing method to be used with the animation for opening and closing a notification. |
+| closer | true | Whether or not the close-all button should be used when more then one notification appears on the screen. Optionally this property can be set to a function which will be used as a callback when the close all button is clicked. This must be changed in the defaults before the startup method is called. |
+| closeTemplate | &times; | This content is used for the individual notification close links that are added to the corner of a notification. This must be changed in the defaults before the startup method is called. |
+| closerTemplate | &lt;div&gt;[ close all ]&lt;/div&gt; | This content is used for the close-all link that is added to the bottom of a jGrowl container when it contains more than one notification. This must be changed in the defaults before the startup method is called. |
+| log | function(e,m,o) {} | Callback to be used before anything is done with the notification. This is intended to be used if the user would like to have some type of logging mechanism for all notifications passed to jGrowl. This callback receives the notification's DOM context, the notification's message and its option object. |
+| beforeOpen | function(e,m,o) {} | Callback to be used before a new notification is opened. This callback receives the notification's DOM context, the notification's message and its option object. |
+| afterOpen | function(e,m,o) {} | Callback to be used after a new notification is opened. This callback receives the notification's DOM context, the notification's message and its option object. |
+| open | function(e,m,o) {} | Callback to be used when a new notification is opened. This callback receives the notification's DOM context, the notifications message and its option object. |
+| beforeClose | function(e,m,o) {} | Callback to be used before a new notification is closed. This callback receives the notification's DOM context, the notification's message and its option object. |
+| close | function(e,m,o) {} | Callback to be used when a new notification is closed. This callback receives the notification's DOM context, the notification's message and its option object. |
+| click | function(e,m,o) {} | Callback to be used when a notification is clicked. This callback receives the notification's DOM context, the notification's message and its option object. |
+| animateOpen | { opacity: 'show' } | The animation properties to use when opening a new notification (default to fadeOut). |
+| animateClose | { opacity: 'hide' } | The animation properties to use when closing a new notification (defaults to fadeIn). |
diff --git a/library/jgrowl/bower.json b/library/jgrowl/bower.json
new file mode 100644
index 000000000..15cfc754b
--- /dev/null
+++ b/library/jgrowl/bower.json
@@ -0,0 +1,32 @@
+{
+ "name": "jGrowl",
+ "version": "1.4.5",
+ "homepage": "https://github.com/stanlemon/jGrowl",
+ "authors": [
+ "Stan Lemon <stosh1985@gmail.com>"
+ ],
+ "description": "jGrowl is an unobtrusive notification system for web applications.",
+ "main": [
+ "jquery.jgrowl.css",
+ "jquery.jgrowl.js"
+ ],
+ "keywords": [
+ "growl",
+ "jgrowl",
+ "jquery",
+ "toaster",
+ "notification",
+ "message"
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "jquery": ">=1.4"
+ },
+ "ignore": [
+ "**/.*",
+ "node_modules",
+ "bower_components",
+ "test",
+ "tests"
+ ]
+}
diff --git a/library/jgrowl/examples/appendTo.html b/library/jgrowl/examples/appendTo.html
new file mode 100644
index 000000000..3eb0f4d27
--- /dev/null
+++ b/library/jgrowl/examples/appendTo.html
@@ -0,0 +1,103 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html lang="en-US" xml:lang="en-US" xmlns="http://www.w3.org/1999/xhtml" debug="true">
+ <head>
+ <title>jGrowl Examples</title>
+ <link rel="stylesheet" href="../jquery.jgrowl.css" type="text/css"/>
+ <style type="text/css">
+ html,
+ body {
+ font-family: "Helvetica neue", Helvetica, Arial, sans-serif;
+ padding: 0;
+ margin: 0;
+ }
+
+ h1, h2, h3, h4, h5 {
+ margin-top: 2px;
+ margin-bottom: 2px;
+ }
+
+ .jGrowl .manilla {
+ background-color: #FFF1C2;
+ color: navy;
+ }
+
+ .jGrowl .flora {
+ background: #E6F7D4 url(flora-notification.png) no-repeat;
+ -moz-border-radius: 0px;
+ -webkit-border-radius: 0px;
+ opacity: 1;
+ filter: alpha(opacity = 100);
+ width: 270px;
+ height: 90px;
+ padding: 0px;
+ overflow: hidden;
+ border-color: #5ab500;
+ }
+
+ .jGrowl .flora .message {
+ padding: 5px;
+ color: #000;
+ }
+
+ .jGrowl .flora .header {
+ background: url(flora-header.png) no-repeat;
+ padding: 5px;
+ }
+
+ .jGrowl .flora .close {
+ background: url(flora-close.png) no-repeat;
+ padding: 5px;
+ color: transparent;
+ padding: 0px;
+ margin: 5px;
+ width: 17px;
+ }
+
+ #dummyNav {
+ position: fixed;
+ background: green;
+ width: 100%;
+ height: 50px;
+ }
+
+ </style>
+ <script type="text/javascript" src="http://code.jquery.com/jquery.js"></script>
+ <script type="text/javascript" src="../jquery.jgrowl.js"></script>
+ <script type="text/javascript">
+
+ // In case you don't have firebug...
+ if(typeof console === "undefined") {
+ console = { log: function() { } };
+ }
+
+ (function($){
+
+ $(function(){
+
+ $.jGrowl.defaults.closerTemplate = "<div>[ xxxxx ]</div>";
+ $.jGrowl.defaults.appendTo = "div#dummyNav";
+
+ $.jGrowl("This message is sticky and clickable", {
+ sticky: true,
+ click: function(msg) {
+ alert("You clicked me");
+ }
+ });
+
+ $.jGrowl("This message is sticky and clickable");
+ $.jGrowl("This message is sticky and clickable");
+ $.jGrowl("This message is sticky and clickable");
+ $.jGrowl("This message is sticky and clickable");
+ $.jGrowl("This message is sticky and clickable");
+ $.jGrowl("This message is sticky and clickable");
+ });
+ })(jQuery);
+
+ </script>
+ </head>
+ <body>
+ <div id="dummyNav">I'm the dummy navigation</div>
+
+ <h1>Append To Another DOM-Object</h1>
+ </body>
+</html>
diff --git a/library/jgrowl/examples/bootstrap.html b/library/jgrowl/examples/bootstrap.html
new file mode 100644
index 000000000..6e069a3b9
--- /dev/null
+++ b/library/jgrowl/examples/bootstrap.html
@@ -0,0 +1,91 @@
+<!DOCTYPE html>
+<html lang="en">
+ <head>
+ <meta charset="utf-8">
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <meta name="description" content="">
+ <meta name="author" content="">
+
+ <title>jGrowl and Bootstrap</title>
+
+ <link rel="stylesheet" href="../jquery.jgrowl.css" type="text/css"/>
+ <link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css">
+
+ <!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->
+ <!--[if lt IE 9]>
+ <script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
+ <script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script>
+ <![endif]-->
+
+ <style>
+ body {
+ padding-top: 50px;
+ }
+ </style>
+ </head>
+
+ <body>
+ <div id="jGrowl-container1" class="jGrowl top-right"></div>
+
+ <div class="navbar navbar-inverse navbar-fixed-top" role="navigation">
+ <div class="container">
+ <div class="navbar-header">
+ <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
+ <span class="sr-only">Toggle navigation</span>
+ <span class="icon-bar"></span>
+ <span class="icon-bar"></span>
+ <span class="icon-bar"></span>
+ </button>
+ <a class="navbar-brand" href="#">jGrowl</a>
+ </div>
+ <div class="collapse navbar-collapse">
+ <ul class="nav navbar-nav">
+ <li class="active"><a href="#">Home</a></li>
+ <li><a href="#about">About</a></li>
+ <li><a href="#contact">Contact</a></li>
+ </ul>
+ </div><!--/.nav-collapse -->
+ </div>
+ </div>
+
+ <div class="container">
+
+ <div>
+ <h1>jGrowl and Bootstrap</h1>
+ <p class="lead">This is a Bootstrap starter template with jGrowl integrated. As you can see it's extremely easy to make jGrowl look and feel like part of Bootstrap.</p>
+ </div>
+ <div id="jGrowl-container2" class="jGrowl"></div>
+ </div><!-- /.container -->
+
+
+ <!-- Bootstrap core JavaScript
+ ================================================== -->
+ <!-- Placed at the end of the document so the pages load faster -->
+ <script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
+ <script src="//netdna.bootstrapcdn.com/bootstrap/3.1.1/js/bootstrap.min.js"></script>
+ <script type="text/javascript" src="../jquery.jgrowl.js"></script>
+ <script type="text/javascript">
+ (function($){
+ $(function(){
+ $.jGrowl.defaults.closerTemplate = '<div class="alert alert-info">Close All</div>';
+
+ var alertTypes = ['success', 'info', 'warning', 'danger'];
+
+ for (var i=0; i<10; i++) {
+ setTimeout(function(){
+ var alertType = alertTypes[Math.floor(Math.random()*alertTypes.length)];
+
+ $('#jGrowl-container1').jGrowl({
+ header: alertType.substring(0, 1).toUpperCase() + alertType.substring(1) + ' Notification',
+ message: 'Hello world ',
+ group: 'alert-' + alertType,
+ life: 5000
+ });
+ }, i*2000);
+ }
+ });
+ })(jQuery);
+ </script>
+ </body>
+</html>
diff --git a/library/jgrowl/examples/jgrowl.html b/library/jgrowl/examples/jgrowl.html
new file mode 100755
index 000000000..e10fdd6cb
--- /dev/null
+++ b/library/jgrowl/examples/jgrowl.html
@@ -0,0 +1,171 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html lang="en-US" xml:lang="en-US" xmlns="http://www.w3.org/1999/xhtml" debug="true">
+ <head>
+ <title>jGrowl Examples</title>
+ <link rel="stylesheet" href="../jquery.jgrowl.css" type="text/css"/>
+ <style type="text/css">
+ body {
+ font-family: "Helvetica neue", Helvetica, Arial, sans-serif;
+ }
+
+ h1, h2, h3, h4, h5 {
+ margin-top: 2px;
+ margin-bottom: 2px;
+ }
+
+ .jGrowl .manilla {
+ background-color: #FFF1C2;
+ color: navy;
+ }
+
+ .jGrowl .flora {
+ background: #E6F7D4 url(flora-notification.png) no-repeat;
+ -moz-border-radius: 0px;
+ -webkit-border-radius: 0px;
+ opacity: 1;
+ filter: alpha(opacity = 100);
+ width: 270px;
+ height: 90px;
+ padding: 0px;
+ overflow: hidden;
+ border-color: #5ab500;
+ }
+
+ .jGrowl .flora .message {
+ padding: 5px;
+ color: #000;
+ }
+
+ .jGrowl .flora .header {
+ background: url(flora-header.png) no-repeat;
+ padding: 5px;
+ }
+
+ .jGrowl .flora .close {
+ background: url(flora-close.png) no-repeat;
+ padding: 5px;
+ color: transparent;
+ padding: 0px;
+ margin: 5px;
+ width: 17px;
+ }
+
+ #random {
+ padding: 20px;
+ width: 1500px;
+ background-color: #ff7070;
+ }
+
+ #logs {
+ margin-top: 30px;
+ background-color: #efefef;
+ border: 1px solid #aaa;
+ padding: 10px;
+ }
+
+ </style>
+ <script type="text/javascript" src="http://code.jquery.com/jquery.js"></script>
+ <script type="text/javascript" src="../jquery.jgrowl.js"></script>
+ <script type="text/javascript">
+
+ // In case you don't have firebug...
+ if(typeof console === "undefined") {
+ console = { log: function() { } };
+ }
+
+ (function($){
+
+ $(function(){
+
+ $.jGrowl.defaults.pool = 5;
+
+ $.jGrowl.defaults.closerTemplate = '<div>hide all notifications</div>';
+
+ // This value can be true, false or a function to be used as a callback when the closer is clciked
+ $.jGrowl.defaults.closer = function() {
+ console.log("Closing everything!", this);
+ };
+
+ // A callback for logging notifications.
+ $.jGrowl.defaults.log = function(e,m,o) {
+ $('#logs').append("<div><strong>#" + $(e).attr('id') + "</strong> <em>" + (new Date()).getTime() + "</em>: " + m + " (" + o.theme + ")</div>")
+ }
+
+ $.jGrowl("Sticky notifications don't have an end of life", { sticky: true });
+ $.jGrowl("Custom theme, custom animations, header, longer life and a whole bunch of callbacks...", {
+ header: 'Header',
+ life: 5000,
+ theme: 'manilla',
+ speed: 'slow',
+ beforeOpen: function(e,m,o) {
+ console.log("I am going to be opened!", this);
+ },
+ open: function(e,m,o) {
+ console.log("I have been opened!", this);
+ },
+ beforeClose: function(e,m,o) {
+ console.log("I am going to be closed!", this);
+ },
+ close: function(e,m,o) {
+ console.log("I have been closed!", this);
+ },
+ animateOpen: {
+ height: "show",
+ width: "show"
+ },
+ animateClose: {
+ height: "hide",
+ width: "show"
+ }
+ });
+
+ $.jGrowl("This message will not open because we have a callback that returns false.", {
+ beforeOpen: function() {
+ console.log("Going to open a notification, but not really...");
+ },
+ open: function() {
+ return false;
+ }
+ });
+
+ $.jGrowl("This message will not close because we have a callback that returns false.", {
+ beforeClose: function() {
+ return false;
+ }
+ });
+
+ $('#test1').jGrowl("Testing a custom container.", {
+ closer: false,
+ sticky: true,
+ glue: 'before'
+ });
+
+ $('#test1').jGrowl("This will be prepended before the last message.", {
+ glue: 'before'
+ });
+
+ $.jGrowl("This message is sticky and clickable", {
+ sticky: true,
+ click: function(msg) {
+ alert("You clicked me");
+ }
+ });
+ });
+ })(jQuery);
+
+ </script>
+ </head>
+ <body>
+ <h1>jGrowl Tests</h1>
+
+ <p><a href="javascript:void(0);" onclick="$.jGrowl('One more message...');">Create a new message.</a></p>
+
+ <p><a href="javascript:void(0);" onclick="$('#test1').jGrowl('shutdown');">Shutdown bottom-left container.</a></p>
+
+ <div id="random">An extra wide node, watch as the jGrowl containers stay put in the corners of the screen..</div>
+
+ <div id="logs"><h3>Log:</h3></div>
+
+ <div id="test1" class="bottom-left"></div>
+ </body>
+</html>
diff --git a/library/jgrowl/jgrowl.jquery.json b/library/jgrowl/jgrowl.jquery.json
new file mode 100644
index 000000000..c5f0756c9
--- /dev/null
+++ b/library/jgrowl/jgrowl.jquery.json
@@ -0,0 +1,40 @@
+{
+ "name": "jgrowl",
+ "filename": "jquery.jgrowl.min.js",
+ "title": "jGrowl",
+ "description": "jGrowl is a jQuery plugin that raises unobtrusive messages within the browser, similar to the way that OS X's Growl Framework works. The idea is simple, deliver notifications to the end user in a noticeable way that doesn't obstruct the work flow and yet keeps the user informed.",
+ "keywords": [
+ "growl",
+ "jgrowl",
+ "jquery",
+ "toaster",
+ "notification",
+ "message"
+ ],
+ "version": "1.4.3",
+ "author": {
+ "name": "Stan Lemon",
+ "email": "stosh1985@gmail.com",
+ "url": "http://stanlemon.net"
+ },
+ "maintainers": [
+ {
+ "name": "Stan Lemon",
+ "email": "stosh1985@gmail.com",
+ "url": "http://stanlemon.net"
+ }
+ ],
+ "licenses": [
+ {
+ "type": "MIT",
+ "url": "https://github.com/stanlemon/jGrowl/blob/master/LICENSE"
+ }
+ ],
+ "bugs": "https://github.com/stanlemon/jGrowl/issues",
+ "homepage": "https://github.com/stanlemon/jGrowl",
+ "docs": "https://github.com/stanlemon/jGrowl",
+ "download": "https://github.com/stanlemon/jGrowl/archive/master.zip",
+ "dependencies": {
+ "jquery": ">=1.4"
+ }
+}
diff --git a/library/jgrowl/jquery.jgrowl.css b/library/jgrowl/jquery.jgrowl.css
index ea3948415..4a00b60f7 100644
--- a/library/jgrowl/jquery.jgrowl.css
+++ b/library/jgrowl/jquery.jgrowl.css
@@ -1 +1,100 @@
-.jGrowl{z-index:9999;color:#fff;font-size:12px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;position:fixed}.jGrowl.top-left{left:0;top:0}.jGrowl.top-right{right:0;top:0}.jGrowl.bottom-left{left:0;bottom:0}.jGrowl.bottom-right{right:0;bottom:0}.jGrowl.center{top:0;width:50%;left:25%}.jGrowl.center .jGrowl-closer,.jGrowl.center .jGrowl-notification{margin-left:auto;margin-right:auto}.jGrowl-notification{background-color:#000;opacity:.9;-ms-filter:alpha(90);filter:alpha(90);zoom:1;width:250px;padding:10px;margin:10px;text-align:left;display:none;border-radius:5px;min-height:40px}.jGrowl-notification .ui-state-highlight,.jGrowl-notification .ui-widget-content .ui-state-highlight,.jGrowl-notification .ui-widget-header .ui-state-highlight{border:1px solid #000;background:#000;color:#fff}.jGrowl-notification .jGrowl-header{font-weight:700;font-size:.85em}.jGrowl-notification .jGrowl-close{background-color:transparent;color:inherit;border:none;z-index:99;float:right;font-weight:700;font-size:1em;cursor:pointer}.jGrowl-closer{background-color:#000;opacity:.9;-ms-filter:alpha(90);filter:alpha(90);zoom:1;width:250px;padding:10px;margin:10px;display:none;border-radius:5px;padding-top:4px;padding-bottom:4px;cursor:pointer;font-size:.9em;font-weight:700;text-align:center}.jGrowl-closer .ui-state-highlight,.jGrowl-closer .ui-widget-content .ui-state-highlight,.jGrowl-closer .ui-widget-header .ui-state-highlight{border:1px solid #000;background:#000;color:#fff}@media print{.jGrowl{display:none}} \ No newline at end of file
+.jGrowl {
+ z-index: 9999;
+ color: #ffffff;
+ font-size: 12px;
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+ position: fixed;
+}
+.jGrowl.top-left {
+ left: 0px;
+ top: 0px;
+}
+.jGrowl.top-right {
+ right: 0px;
+ top: 0px;
+}
+.jGrowl.bottom-left {
+ left: 0px;
+ bottom: 0px;
+}
+.jGrowl.bottom-right {
+ right: 0px;
+ bottom: 0px;
+}
+.jGrowl.center {
+ top: 0px;
+ width: 50%;
+ left: 25%;
+}
+.jGrowl.center .jGrowl-notification,
+.jGrowl.center .jGrowl-closer {
+ margin-left: auto;
+ margin-right: auto;
+}
+.jGrowl-notification {
+ background-color: #000000;
+ opacity: 0.9;
+ filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=(0.9*100));
+ -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=(0.9*100));
+ zoom: 1;
+ width: 250px;
+ padding: 10px;
+ margin: 10px;
+ text-align: left;
+ display: none;
+ border-radius: 5px;
+ min-height: 40px;
+}
+.jGrowl-notification .ui-state-highlight,
+.jGrowl-notification .ui-widget-content .ui-state-highlight,
+.jGrowl-notification .ui-widget-header .ui-state-highlight {
+ border: 1px solid #000;
+ background: #000;
+ color: #fff;
+}
+.jGrowl-notification .jGrowl-header {
+ font-weight: bold;
+ font-size: .85em;
+}
+.jGrowl-notification .jGrowl-close {
+ background-color: transparent;
+ color: inherit;
+ border: none;
+ z-index: 99;
+ float: right;
+ font-weight: bold;
+ font-size: 1em;
+ cursor: pointer;
+}
+.jGrowl-closer {
+ background-color: #000000;
+ opacity: 0.9;
+ filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=(0.9*100));
+ -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=(0.9*100));
+ zoom: 1;
+ width: 250px;
+ padding: 10px;
+ margin: 10px;
+ text-align: left;
+ display: none;
+ border-radius: 5px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ cursor: pointer;
+ font-size: .9em;
+ font-weight: bold;
+ text-align: center;
+}
+.jGrowl-closer .ui-state-highlight,
+.jGrowl-closer .ui-widget-content .ui-state-highlight,
+.jGrowl-closer .ui-widget-header .ui-state-highlight {
+ border: 1px solid #000;
+ background: #000;
+ color: #fff;
+}
+/** Hide jGrowl when printing **/
+@media print {
+ .jGrowl {
+ display: none;
+ }
+}
diff --git a/library/jgrowl/jquery.jgrowl.js b/library/jgrowl/jquery.jgrowl.js
new file mode 100755
index 000000000..d5444d438
--- /dev/null
+++ b/library/jgrowl/jquery.jgrowl.js
@@ -0,0 +1,399 @@
+/**
+ * jGrowl 1.4.5
+ *
+ * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
+ * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
+ *
+ * Written by Stan Lemon <stosh1985@gmail.com>
+ * Last updated: 2015.02.01
+ *
+ * jGrowl is a jQuery plugin implementing unobtrusive userland notifications. These
+ * notifications function similarly to the Growl Framework available for
+ * Mac OS X (http://growl.info).
+ *
+ * To Do:
+ * - Move library settings to containers and allow them to be changed per container
+ *
+ * Changes in 1.4.5
+ * - Fixed arguement list for click callback, thanks @timotheeg
+ *
+ * Changes in 1.4.4
+ * - Revert word-break changes, thanks @curtisgibby
+ *
+ * Changes in 1.4.3
+ * - Fixed opactiy in LESS for older version of IE
+ *
+ * Changes in 1.4.2
+ * - Added word-break to less/css
+ *
+ * Changes in 1.4.1
+ * - Added appendTo option
+ * - jQuery compatibility updates
+ * - Add check for closing a notification before it opens
+ *
+ * Changes in 1.4.0
+ * - Removed IE6 support
+ * - Added LESS support
+ *
+ * Changes in 1.3.0
+ * - Added non-vendor border-radius to stylesheet
+ * - Added grunt for generating minified js and css
+ * - Added npm package info
+ * - Added bower package info
+ * - Updates for jshint
+ *
+ * Changes in 1.2.13
+ * - Fixed clearing interval when the container shuts down
+ *
+ * Changes in 1.2.12
+ * - Added compressed versions using UglifyJS and Sqwish
+ * - Improved README with configuration options explanation
+ * - Added a source map
+ *
+ * Changes in 1.2.11
+ * - Fix artifacts left behind by the shutdown method and text-cleanup
+ *
+ * Changes in 1.2.10
+ * - Fix beforeClose to be called in click event
+ *
+ * Changes in 1.2.9
+ * - Fixed BC break in jQuery 2.0 beta
+ *
+ * Changes in 1.2.8
+ * - Fixes for jQuery 1.9 and the MSIE6 check, note that with jQuery 2.0 support
+ * jGrowl intends to drop support for IE6 altogether
+ *
+ * Changes in 1.2.6
+ * - Fixed js error when a notification is opening and closing at the same time
+ *
+ * Changes in 1.2.5
+ * - Changed wrapper jGrowl's options usage to "o" instead of $.jGrowl.defaults
+ * - Added themeState option to control 'highlight' or 'error' for jQuery UI
+ * - Ammended some CSS to provide default positioning for nested usage.
+ * - Changed some CSS to be prefixed with jGrowl- to prevent namespacing issues
+ * - Added two new options - openDuration and closeDuration to allow
+ * better control of notification open and close speeds, respectively
+ * Patch contributed by Jesse Vincet.
+ * - Added afterOpen callback. Patch contributed by Russel Branca.
+ *
+ * Changes in 1.2.4
+ * - Fixed IE bug with the close-all button
+ * - Fixed IE bug with the filter CSS attribute (special thanks to gotwic)
+ * - Update IE opacity CSS
+ * - Changed font sizes to use "em", and only set the base style
+ *
+ * Changes in 1.2.3
+ * - The callbacks no longer use the container as context, instead they use the actual notification
+ * - The callbacks now receive the container as a parameter after the options parameter
+ * - beforeOpen and beforeClose now check the return value, if it's false - the notification does
+ * not continue. The open callback will also halt execution if it returns false.
+ * - Fixed bug where containers would get confused
+ * - Expanded the pause functionality to pause an entire container.
+ *
+ * Changes in 1.2.2
+ * - Notification can now be theme rolled for jQuery UI, special thanks to Jeff Chan!
+ *
+ * Changes in 1.2.1
+ * - Fixed instance where the interval would fire the close method multiple times.
+ * - Added CSS to hide from print media
+ * - Fixed issue with closer button when div { position: relative } is set
+ * - Fixed leaking issue with multiple containers. Special thanks to Matthew Hanlon!
+ *
+ * Changes in 1.2.0
+ * - Added message pooling to limit the number of messages appearing at a given time.
+ * - Closing a notification is now bound to the notification object and triggered by the close button.
+ *
+ * Changes in 1.1.2
+ * - Added iPhone styled example
+ * - Fixed possible IE7 bug when determining if the ie6 class shoudl be applied.
+ * - Added template for the close button, so that it's content could be customized.
+ *
+ * Changes in 1.1.1
+ * - Fixed CSS styling bug for ie6 caused by a mispelling
+ * - Changes height restriction on default notifications to min-height
+ * - Added skinned examples using a variety of images
+ * - Added the ability to customize the content of the [close all] box
+ * - Added jTweet, an example of using jGrowl + Twitter
+ *
+ * Changes in 1.1.0
+ * - Multiple container and instances.
+ * - Standard $.jGrowl() now wraps $.fn.jGrowl() by first establishing a generic jGrowl container.
+ * - Instance methods of a jGrowl container can be called by $.fn.jGrowl(methodName)
+ * - Added glue preferenced, which allows notifications to be inserted before or after nodes in the container
+ * - Added new log callback which is called before anything is done for the notification
+ * - Corner's attribute are now applied on an individual notification basis.
+ *
+ * Changes in 1.0.4
+ * - Various CSS fixes so that jGrowl renders correctly in IE6.
+ *
+ * Changes in 1.0.3
+ * - Fixed bug with options persisting across notifications
+ * - Fixed theme application bug
+ * - Simplified some selectors and manipulations.
+ * - Added beforeOpen and beforeClose callbacks
+ * - Reorganized some lines of code to be more readable
+ * - Removed unnecessary this.defaults context
+ * - If corners plugin is present, it's now customizable.
+ * - Customizable open animation.
+ * - Customizable close animation.
+ * - Customizable animation easing.
+ * - Added customizable positioning (top-left, top-right, bottom-left, bottom-right, center)
+ *
+ * Changes in 1.0.2
+ * - All CSS styling is now external.
+ * - Added a theme parameter which specifies a secondary class for styling, such
+ * that notifications can be customized in appearance on a per message basis.
+ * - Notification life span is now customizable on a per message basis.
+ * - Added the ability to disable the global closer, enabled by default.
+ * - Added callbacks for when a notification is opened or closed.
+ * - Added callback for the global closer.
+ * - Customizable animation speed.
+ * - jGrowl now set itself up and tears itself down.
+ *
+ * Changes in 1.0.1:
+ * - Removed dependency on metadata plugin in favor of .data()
+ * - Namespaced all events
+ */
+(function($) {
+ /** jGrowl Wrapper - Establish a base jGrowl Container for compatibility with older releases. **/
+ $.jGrowl = function( m , o ) {
+ // To maintain compatibility with older version that only supported one instance we'll create the base container.
+ if ( $('#jGrowl').length === 0 )
+ $('<div id="jGrowl"></div>').addClass( (o && o.position) ? o.position : $.jGrowl.defaults.position ).appendTo( (o && o.appendTo) ? o.appendTo : $.jGrowl.defaults.appendTo );
+
+ // Create a notification on the container.
+ $('#jGrowl').jGrowl(m,o);
+ };
+
+
+ /** Raise jGrowl Notification on a jGrowl Container **/
+ $.fn.jGrowl = function( m , o ) {
+ // Short hand for passing in just an object to this method
+ if ( o === undefined && $.isPlainObject(m) ) {
+ o = m;
+ m = o.message;
+ }
+
+ if ( $.isFunction(this.each) ) {
+ var args = arguments;
+
+ return this.each(function() {
+ /** Create a jGrowl Instance on the Container if it does not exist **/
+ if ( $(this).data('jGrowl.instance') === undefined ) {
+ $(this).data('jGrowl.instance', $.extend( new $.fn.jGrowl(), { notifications: [], element: null, interval: null } ));
+ $(this).data('jGrowl.instance').startup( this );
+ }
+
+ /** Optionally call jGrowl instance methods, or just raise a normal notification **/
+ if ( $.isFunction($(this).data('jGrowl.instance')[m]) ) {
+ $(this).data('jGrowl.instance')[m].apply( $(this).data('jGrowl.instance') , $.makeArray(args).slice(1) );
+ } else {
+ $(this).data('jGrowl.instance').create( m , o );
+ }
+ });
+ }
+ };
+
+ $.extend( $.fn.jGrowl.prototype , {
+
+ /** Default JGrowl Settings **/
+ defaults: {
+ pool: 0,
+ header: '',
+ group: '',
+ sticky: false,
+ position: 'top-right',
+ appendTo: 'body',
+ glue: 'after',
+ theme: 'default',
+ themeState: 'highlight',
+ corners: '10px',
+ check: 250,
+ life: 3000,
+ closeDuration: 'normal',
+ openDuration: 'normal',
+ easing: 'swing',
+ closer: true,
+ closeTemplate: '&times;',
+ closerTemplate: '<div>[ close all ]</div>',
+ log: function() {},
+ beforeOpen: function() {},
+ afterOpen: function() {},
+ open: function() {},
+ beforeClose: function() {},
+ close: function() {},
+ click: function() {},
+ animateOpen: {
+ opacity: 'show'
+ },
+ animateClose: {
+ opacity: 'hide'
+ }
+ },
+
+ notifications: [],
+
+ /** jGrowl Container Node **/
+ element: null,
+
+ /** Interval Function **/
+ interval: null,
+
+ /** Create a Notification **/
+ create: function( message , options ) {
+ var o = $.extend({}, this.defaults, options);
+
+ /* To keep backward compatibility with 1.24 and earlier, honor 'speed' if the user has set it */
+ if (typeof o.speed !== 'undefined') {
+ o.openDuration = o.speed;
+ o.closeDuration = o.speed;
+ }
+
+ this.notifications.push({ message: message , options: o });
+
+ o.log.apply( this.element , [this.element,message,o] );
+ },
+
+ render: function( n ) {
+ var self = this;
+ var message = n.message;
+ var o = n.options;
+
+ // Support for jQuery theme-states, if this is not used it displays a widget header
+ o.themeState = (o.themeState === '') ? '' : 'ui-state-' + o.themeState;
+
+ var notification = $('<div/>')
+ .addClass('jGrowl-notification alert ' + o.themeState + ' ui-corner-all' + ((o.group !== undefined && o.group !== '') ? ' ' + o.group : ''))
+ .append($('<button/>').addClass('jGrowl-close').html(o.closeTemplate))
+ .append($('<div/>').addClass('jGrowl-header').html(o.header))
+ .append($('<div/>').addClass('jGrowl-message').html(message))
+ .data("jGrowl", o).addClass(o.theme).children('.jGrowl-close').bind("click.jGrowl", function() {
+ $(this).parent().trigger('jGrowl.beforeClose');
+ return false;
+ })
+ .parent();
+
+
+ /** Notification Actions **/
+ $(notification).bind("mouseover.jGrowl", function() {
+ $('.jGrowl-notification', self.element).data("jGrowl.pause", true);
+ }).bind("mouseout.jGrowl", function() {
+ $('.jGrowl-notification', self.element).data("jGrowl.pause", false);
+ }).bind('jGrowl.beforeOpen', function() {
+ if ( o.beforeOpen.apply( notification , [notification,message,o,self.element] ) !== false ) {
+ $(this).trigger('jGrowl.open');
+ }
+ }).bind('jGrowl.open', function() {
+ if ( o.open.apply( notification , [notification,message,o,self.element] ) !== false ) {
+ if ( o.glue == 'after' ) {
+ $('.jGrowl-notification:last', self.element).after(notification);
+ } else {
+ $('.jGrowl-notification:first', self.element).before(notification);
+ }
+
+ $(this).animate(o.animateOpen, o.openDuration, o.easing, function() {
+ // Fixes some anti-aliasing issues with IE filters.
+ if ($.support.opacity === false)
+ this.style.removeAttribute('filter');
+
+ if ( $(this).data("jGrowl") !== null && typeof $(this).data("jGrowl") !== 'undefined') // Happens when a notification is closing before it's open.
+ $(this).data("jGrowl").created = new Date();
+
+ $(this).trigger('jGrowl.afterOpen');
+ });
+ }
+ }).bind('jGrowl.afterOpen', function() {
+ o.afterOpen.apply( notification , [notification,message,o,self.element] );
+ }).bind('click', function() {
+ o.click.apply( notification, [notification,message,o,self.element] );
+ }).bind('jGrowl.beforeClose', function() {
+ if ( o.beforeClose.apply( notification , [notification,message,o,self.element] ) !== false )
+ $(this).trigger('jGrowl.close');
+ }).bind('jGrowl.close', function() {
+ // Pause the notification, lest during the course of animation another close event gets called.
+ $(this).data('jGrowl.pause', true);
+ $(this).animate(o.animateClose, o.closeDuration, o.easing, function() {
+ if ( $.isFunction(o.close) ) {
+ if ( o.close.apply( notification , [notification,message,o,self.element] ) !== false )
+ $(this).remove();
+ } else {
+ $(this).remove();
+ }
+ });
+ }).trigger('jGrowl.beforeOpen');
+
+ /** Optional Corners Plugin **/
+ if ( o.corners !== '' && $.fn.corner !== undefined ) $(notification).corner( o.corners );
+
+ /** Add a Global Closer if more than one notification exists **/
+ if ($('.jGrowl-notification:parent', self.element).length > 1 &&
+ $('.jGrowl-closer', self.element).length === 0 && this.defaults.closer !== false ) {
+ $(this.defaults.closerTemplate).addClass('jGrowl-closer ' + this.defaults.themeState + ' ui-corner-all').addClass(this.defaults.theme)
+ .appendTo(self.element).animate(this.defaults.animateOpen, this.defaults.speed, this.defaults.easing)
+ .bind("click.jGrowl", function() {
+ $(this).siblings().trigger("jGrowl.beforeClose");
+
+ if ( $.isFunction( self.defaults.closer ) ) {
+ self.defaults.closer.apply( $(this).parent()[0] , [$(this).parent()[0]] );
+ }
+ });
+ }
+ },
+
+ /** Update the jGrowl Container, removing old jGrowl notifications **/
+ update: function() {
+ $(this.element).find('.jGrowl-notification:parent').each( function() {
+ if ($(this).data("jGrowl") !== undefined && $(this).data("jGrowl").created !== undefined &&
+ ($(this).data("jGrowl").created.getTime() + parseInt($(this).data("jGrowl").life, 10)) < (new Date()).getTime() &&
+ $(this).data("jGrowl").sticky !== true &&
+ ($(this).data("jGrowl.pause") === undefined || $(this).data("jGrowl.pause") !== true) ) {
+
+ // Pause the notification, lest during the course of animation another close event gets called.
+ $(this).trigger('jGrowl.beforeClose');
+ }
+ });
+
+ if (this.notifications.length > 0 &&
+ (this.defaults.pool === 0 || $(this.element).find('.jGrowl-notification:parent').length < this.defaults.pool) )
+ this.render( this.notifications.shift() );
+
+ if ($(this.element).find('.jGrowl-notification:parent').length < 2 ) {
+ $(this.element).find('.jGrowl-closer').animate(this.defaults.animateClose, this.defaults.speed, this.defaults.easing, function() {
+ $(this).remove();
+ });
+ }
+ },
+
+ /** Setup the jGrowl Notification Container **/
+ startup: function(e) {
+ this.element = $(e).addClass('jGrowl').append('<div class="jGrowl-notification"></div>');
+ this.interval = setInterval( function() {
+ // some error in chage ^^
+ var instance = $(e).data('jGrowl.instance');
+ if (undefined !== instance) {
+ instance.update();
+ }
+ }, parseInt(this.defaults.check, 10));
+ },
+
+ /** Shutdown jGrowl, removing it and clearing the interval **/
+ shutdown: function() {
+ $(this.element).removeClass('jGrowl')
+ .find('.jGrowl-notification').trigger('jGrowl.close')
+ .parent().empty()
+ ;
+
+ clearInterval(this.interval);
+ },
+
+ close: function() {
+ $(this.element).find('.jGrowl-notification').each(function(){
+ $(this).trigger('jGrowl.beforeClose');
+ });
+ }
+ });
+
+ /** Reference the Defaults Object for compatibility with older versions of jGrowl **/
+ $.jGrowl.defaults = $.fn.jGrowl.prototype.defaults;
+
+})(jQuery);
diff --git a/library/jgrowl/jquery.jgrowl.map b/library/jgrowl/jquery.jgrowl.map
index e69de29bb..a04b1e347 100644
--- a/library/jgrowl/jquery.jgrowl.map
+++ b/library/jgrowl/jquery.jgrowl.map
@@ -0,0 +1 @@
+{"version":3,"file":"jquery.jgrowl.min.js","sources":["jquery.jgrowl.js"],"names":["$","jGrowl","m","o","length","addClass","position","defaults","appendTo","fn","undefined","isPlainObject","message","isFunction","this","each","args","arguments","data","extend","notifications","element","interval","startup","apply","makeArray","slice","create","prototype","pool","header","group","sticky","glue","theme","themeState","corners","check","life","closeDuration","openDuration","easing","closer","closeTemplate","closerTemplate","log","beforeOpen","afterOpen","open","beforeClose","close","click","animateOpen","opacity","animateClose","options","speed","push","render","n","self","notification","append","html","children","bind","parent","trigger","after","before","animate","support","style","removeAttribute","created","Date","remove","corner","siblings","update","find","getTime","parseInt","shift","e","setInterval","instance","shutdown","removeClass","empty","clearInterval","jQuery"],"mappings":"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"} \ No newline at end of file
diff --git a/library/jgrowl/jquery.jgrowl.min.css b/library/jgrowl/jquery.jgrowl.min.css
new file mode 100644
index 000000000..a12f907e5
--- /dev/null
+++ b/library/jgrowl/jquery.jgrowl.min.css
@@ -0,0 +1 @@
+.jGrowl{z-index:9999;color:#fff;font-size:12px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;position:fixed}.jGrowl.top-left{left:0;top:0}.jGrowl.top-right{right:0;top:0}.jGrowl.bottom-left{left:0;bottom:0}.jGrowl.bottom-right{right:0;bottom:0}.jGrowl.center{top:0;width:50%;left:25%}.jGrowl.center .jGrowl-closer,.jGrowl.center .jGrowl-notification{margin-left:auto;margin-right:auto}.jGrowl-notification{background-color:#000;opacity:.9;filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=(0.9*100));-ms-filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=(0.9*100));zoom:1;width:250px;padding:10px;margin:10px;text-align:left;display:none;border-radius:5px;min-height:40px}.jGrowl-notification .ui-state-highlight,.jGrowl-notification .ui-widget-content .ui-state-highlight,.jGrowl-notification .ui-widget-header .ui-state-highlight{border:1px solid #000;background:#000;color:#fff}.jGrowl-notification .jGrowl-header{font-weight:700;font-size:.85em}.jGrowl-notification .jGrowl-close{background-color:transparent;color:inherit;border:none;z-index:99;float:right;font-weight:700;font-size:1em;cursor:pointer}.jGrowl-closer{background-color:#000;opacity:.9;filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=(0.9*100));-ms-filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=(0.9*100));zoom:1;width:250px;padding:10px;margin:10px;display:none;border-radius:5px;padding-top:4px;padding-bottom:4px;cursor:pointer;font-size:.9em;font-weight:700;text-align:center}.jGrowl-closer .ui-state-highlight,.jGrowl-closer .ui-widget-content .ui-state-highlight,.jGrowl-closer .ui-widget-header .ui-state-highlight{border:1px solid #000;background:#000;color:#fff}@media print{.jGrowl{display:none}} \ No newline at end of file
diff --git a/library/jgrowl/jquery.jgrowl_minimized.js b/library/jgrowl/jquery.jgrowl.min.js
index 7e8b6fb35..418c3db79 100644
--- a/library/jgrowl/jquery.jgrowl_minimized.js
+++ b/library/jgrowl/jquery.jgrowl.min.js
@@ -1,2 +1,2 @@
-!function(a){a.jGrowl=function(b,c){0===a("#jGrowl").length&&a('<div id="jGrowl"></div>').addClass(c&&c.position?c.position:a.jGrowl.defaults.position).appendTo(c&&c.appendTo?c.appendTo:a.jGrowl.defaults.appendTo),a("#jGrowl").jGrowl(b,c)},a.fn.jGrowl=function(b,c){if(void 0===c&&a.isPlainObject(b)&&(c=b,b=c.message),a.isFunction(this.each)){var d=arguments;return this.each(function(){void 0===a(this).data("jGrowl.instance")&&(a(this).data("jGrowl.instance",a.extend(new a.fn.jGrowl,{notifications:[],element:null,interval:null})),a(this).data("jGrowl.instance").startup(this)),a.isFunction(a(this).data("jGrowl.instance")[b])?a(this).data("jGrowl.instance")[b].apply(a(this).data("jGrowl.instance"),a.makeArray(d).slice(1)):a(this).data("jGrowl.instance").create(b,c)})}},a.extend(a.fn.jGrowl.prototype,{defaults:{pool:0,header:"",group:"",sticky:!1,position:"top-right",appendTo:"body",glue:"after",theme:"default",themeState:"highlight",corners:"10px",check:250,life:3e3,closeDuration:"normal",openDuration:"normal",easing:"swing",closer:!0,closeTemplate:"&times;",closerTemplate:"<div>[ close all ]</div>",log:function(){},beforeOpen:function(){},afterOpen:function(){},open:function(){},beforeClose:function(){},close:function(){},click:function(){},animateOpen:{opacity:"show"},animateClose:{opacity:"hide"}},notifications:[],element:null,interval:null,create:function(b,c){var d=a.extend({},this.defaults,c);"undefined"!=typeof d.speed&&(d.openDuration=d.speed,d.closeDuration=d.speed),this.notifications.push({message:b,options:d}),d.log.apply(this.element,[this.element,b,d])},render:function(b){var c=this,d=b.message,e=b.options;e.themeState=""===e.themeState?"":"ui-state-"+e.themeState;var f=a("<div/>").addClass("jGrowl-notification alert "+e.themeState+" ui-corner-all"+(void 0!==e.group&&""!==e.group?" "+e.group:"")).append(a("<button/>").addClass("jGrowl-close").html(e.closeTemplate)).append(a("<div/>").addClass("jGrowl-header").html(e.header)).append(a("<div/>").addClass("jGrowl-message").html(d)).data("jGrowl",e).addClass(e.theme).children(".jGrowl-close").bind("click.jGrowl",function(){return a(this).parent().trigger("jGrowl.beforeClose"),!1}).parent();a(f).bind("mouseover.jGrowl",function(){a(".jGrowl-notification",c.element).data("jGrowl.pause",!0)}).bind("mouseout.jGrowl",function(){a(".jGrowl-notification",c.element).data("jGrowl.pause",!1)}).bind("jGrowl.beforeOpen",function(){e.beforeOpen.apply(f,[f,d,e,c.element])!==!1&&a(this).trigger("jGrowl.open")}).bind("jGrowl.open",function(){e.open.apply(f,[f,d,e,c.element])!==!1&&("after"==e.glue?a(".jGrowl-notification:last",c.element).after(f):a(".jGrowl-notification:first",c.element).before(f),a(this).animate(e.animateOpen,e.openDuration,e.easing,function(){a.support.opacity===!1&&this.style.removeAttribute("filter"),null!==a(this).data("jGrowl")&&"undefined"!=typeof a(this).data("jGrowl")&&(a(this).data("jGrowl").created=new Date),a(this).trigger("jGrowl.afterOpen")}))}).bind("jGrowl.afterOpen",function(){e.afterOpen.apply(f,[f,d,e,c.element])}).bind("click",function(){e.click.apply(f,[f.message,e,c.element])}).bind("jGrowl.beforeClose",function(){e.beforeClose.apply(f,[f,d,e,c.element])!==!1&&a(this).trigger("jGrowl.close")}).bind("jGrowl.close",function(){a(this).data("jGrowl.pause",!0),a(this).animate(e.animateClose,e.closeDuration,e.easing,function(){a.isFunction(e.close)?e.close.apply(f,[f,d,e,c.element])!==!1&&a(this).remove():a(this).remove()})}).trigger("jGrowl.beforeOpen"),""!==e.corners&&void 0!==a.fn.corner&&a(f).corner(e.corners),a(".jGrowl-notification:parent",c.element).length>1&&0===a(".jGrowl-closer",c.element).length&&this.defaults.closer!==!1&&a(this.defaults.closerTemplate).addClass("jGrowl-closer "+this.defaults.themeState+" ui-corner-all").addClass(this.defaults.theme).appendTo(c.element).animate(this.defaults.animateOpen,this.defaults.speed,this.defaults.easing).bind("click.jGrowl",function(){a(this).siblings().trigger("jGrowl.beforeClose"),a.isFunction(c.defaults.closer)&&c.defaults.closer.apply(a(this).parent()[0],[a(this).parent()[0]])})},update:function(){a(this.element).find(".jGrowl-notification:parent").each(function(){void 0!==a(this).data("jGrowl")&&void 0!==a(this).data("jGrowl").created&&a(this).data("jGrowl").created.getTime()+parseInt(a(this).data("jGrowl").life,10)<(new Date).getTime()&&a(this).data("jGrowl").sticky!==!0&&(void 0===a(this).data("jGrowl.pause")||a(this).data("jGrowl.pause")!==!0)&&a(this).trigger("jGrowl.beforeClose")}),this.notifications.length>0&&(0===this.defaults.pool||a(this.element).find(".jGrowl-notification:parent").length<this.defaults.pool)&&this.render(this.notifications.shift()),a(this.element).find(".jGrowl-notification:parent").length<2&&a(this.element).find(".jGrowl-closer").animate(this.defaults.animateClose,this.defaults.speed,this.defaults.easing,function(){a(this).remove()})},startup:function(b){this.element=a(b).addClass("jGrowl").append('<div class="jGrowl-notification"></div>'),this.interval=setInterval(function(){a(b).data("jGrowl.instance").update()},parseInt(this.defaults.check,10))},shutdown:function(){a(this.element).removeClass("jGrowl").find(".jGrowl-notification").trigger("jGrowl.close").parent().empty(),clearInterval(this.interval)},close:function(){a(this.element).find(".jGrowl-notification").each(function(){a(this).trigger("jGrowl.beforeClose")})}}),a.jGrowl.defaults=a.fn.jGrowl.prototype.defaults}(jQuery);
+!function(a){a.jGrowl=function(b,c){0===a("#jGrowl").length&&a('<div id="jGrowl"></div>').addClass(c&&c.position?c.position:a.jGrowl.defaults.position).appendTo(c&&c.appendTo?c.appendTo:a.jGrowl.defaults.appendTo),a("#jGrowl").jGrowl(b,c)},a.fn.jGrowl=function(b,c){if(void 0===c&&a.isPlainObject(b)&&(c=b,b=c.message),a.isFunction(this.each)){var d=arguments;return this.each(function(){void 0===a(this).data("jGrowl.instance")&&(a(this).data("jGrowl.instance",a.extend(new a.fn.jGrowl,{notifications:[],element:null,interval:null})),a(this).data("jGrowl.instance").startup(this)),a.isFunction(a(this).data("jGrowl.instance")[b])?a(this).data("jGrowl.instance")[b].apply(a(this).data("jGrowl.instance"),a.makeArray(d).slice(1)):a(this).data("jGrowl.instance").create(b,c)})}},a.extend(a.fn.jGrowl.prototype,{defaults:{pool:0,header:"",group:"",sticky:!1,position:"top-right",appendTo:"body",glue:"after",theme:"default",themeState:"highlight",corners:"10px",check:250,life:3e3,closeDuration:"normal",openDuration:"normal",easing:"swing",closer:!0,closeTemplate:"&times;",closerTemplate:"<div>[ close all ]</div>",log:function(){},beforeOpen:function(){},afterOpen:function(){},open:function(){},beforeClose:function(){},close:function(){},click:function(){},animateOpen:{opacity:"show"},animateClose:{opacity:"hide"}},notifications:[],element:null,interval:null,create:function(b,c){var d=a.extend({},this.defaults,c);"undefined"!=typeof d.speed&&(d.openDuration=d.speed,d.closeDuration=d.speed),this.notifications.push({message:b,options:d}),d.log.apply(this.element,[this.element,b,d])},render:function(b){var c=this,d=b.message,e=b.options;e.themeState=""===e.themeState?"":"ui-state-"+e.themeState;var f=a("<div/>").addClass("jGrowl-notification alert "+e.themeState+" ui-corner-all"+(void 0!==e.group&&""!==e.group?" "+e.group:"")).append(a("<button/>").addClass("jGrowl-close").html(e.closeTemplate)).append(a("<div/>").addClass("jGrowl-header").html(e.header)).append(a("<div/>").addClass("jGrowl-message").html(d)).data("jGrowl",e).addClass(e.theme).children(".jGrowl-close").bind("click.jGrowl",function(){return a(this).parent().trigger("jGrowl.beforeClose"),!1}).parent();a(f).bind("mouseover.jGrowl",function(){a(".jGrowl-notification",c.element).data("jGrowl.pause",!0)}).bind("mouseout.jGrowl",function(){a(".jGrowl-notification",c.element).data("jGrowl.pause",!1)}).bind("jGrowl.beforeOpen",function(){e.beforeOpen.apply(f,[f,d,e,c.element])!==!1&&a(this).trigger("jGrowl.open")}).bind("jGrowl.open",function(){e.open.apply(f,[f,d,e,c.element])!==!1&&("after"==e.glue?a(".jGrowl-notification:last",c.element).after(f):a(".jGrowl-notification:first",c.element).before(f),a(this).animate(e.animateOpen,e.openDuration,e.easing,function(){a.support.opacity===!1&&this.style.removeAttribute("filter"),null!==a(this).data("jGrowl")&&"undefined"!=typeof a(this).data("jGrowl")&&(a(this).data("jGrowl").created=new Date),a(this).trigger("jGrowl.afterOpen")}))}).bind("jGrowl.afterOpen",function(){e.afterOpen.apply(f,[f,d,e,c.element])}).bind("click",function(){e.click.apply(f,[f,d,e,c.element])}).bind("jGrowl.beforeClose",function(){e.beforeClose.apply(f,[f,d,e,c.element])!==!1&&a(this).trigger("jGrowl.close")}).bind("jGrowl.close",function(){a(this).data("jGrowl.pause",!0),a(this).animate(e.animateClose,e.closeDuration,e.easing,function(){a.isFunction(e.close)?e.close.apply(f,[f,d,e,c.element])!==!1&&a(this).remove():a(this).remove()})}).trigger("jGrowl.beforeOpen"),""!==e.corners&&void 0!==a.fn.corner&&a(f).corner(e.corners),a(".jGrowl-notification:parent",c.element).length>1&&0===a(".jGrowl-closer",c.element).length&&this.defaults.closer!==!1&&a(this.defaults.closerTemplate).addClass("jGrowl-closer "+this.defaults.themeState+" ui-corner-all").addClass(this.defaults.theme).appendTo(c.element).animate(this.defaults.animateOpen,this.defaults.speed,this.defaults.easing).bind("click.jGrowl",function(){a(this).siblings().trigger("jGrowl.beforeClose"),a.isFunction(c.defaults.closer)&&c.defaults.closer.apply(a(this).parent()[0],[a(this).parent()[0]])})},update:function(){a(this.element).find(".jGrowl-notification:parent").each(function(){void 0!==a(this).data("jGrowl")&&void 0!==a(this).data("jGrowl").created&&a(this).data("jGrowl").created.getTime()+parseInt(a(this).data("jGrowl").life,10)<(new Date).getTime()&&a(this).data("jGrowl").sticky!==!0&&(void 0===a(this).data("jGrowl.pause")||a(this).data("jGrowl.pause")!==!0)&&a(this).trigger("jGrowl.beforeClose")}),this.notifications.length>0&&(0===this.defaults.pool||a(this.element).find(".jGrowl-notification:parent").length<this.defaults.pool)&&this.render(this.notifications.shift()),a(this.element).find(".jGrowl-notification:parent").length<2&&a(this.element).find(".jGrowl-closer").animate(this.defaults.animateClose,this.defaults.speed,this.defaults.easing,function(){a(this).remove()})},startup:function(b){this.element=a(b).addClass("jGrowl").append('<div class="jGrowl-notification"></div>'),this.interval=setInterval(function(){var c=a(b).data("jGrowl.instance");void 0!==c&&c.update()},parseInt(this.defaults.check,10))},shutdown:function(){a(this.element).removeClass("jGrowl").find(".jGrowl-notification").trigger("jGrowl.close").parent().empty(),clearInterval(this.interval)},close:function(){a(this.element).find(".jGrowl-notification").each(function(){a(this).trigger("jGrowl.beforeClose")})}}),a.jGrowl.defaults=a.fn.jGrowl.prototype.defaults}(jQuery);
//# sourceMappingURL=jquery.jgrowl.map \ No newline at end of file
diff --git a/library/jgrowl/less/jgrowl.core.less b/library/jgrowl/less/jgrowl.core.less
new file mode 100755
index 000000000..e3f8d4873
--- /dev/null
+++ b/library/jgrowl/less/jgrowl.core.less
@@ -0,0 +1,101 @@
+
+.jGrowl {
+ z-index: 9999;
+ color: @jgrowl-color;
+ font-size: @jgrowl-fontSize;
+ font-family: @jgrowl-fontFamily;
+ position: fixed;
+
+ &.top-left {
+ left: 0px;
+ top: 0px;
+ }
+
+ &.top-right {
+ right: 0px;
+ top: 0px;
+ }
+
+ &.bottom-left {
+ left: 0px;
+ bottom: 0px;
+ }
+
+ &.bottom-right {
+ right: 0px;
+ bottom: 0px;
+ }
+
+ &.center {
+ top: 0px;
+ width: 50%;
+ left: 25%;
+
+ .jGrowl-notification,
+ .jGrowl-closer {
+ margin-left: auto;
+ margin-right: auto;
+ }
+ }
+}
+
+.notification() {
+ background-color: @jgrowl-backgroundColor;
+ opacity: @jgrowl-opacity;
+ // These are for older versions of Internet Explorer that don't support opacity
+ filter: e(%("progid:DXImageTransform.Microsoft.Alpha(Opacity=(%d*100))",@jgrowl-opacity));
+ -ms-filter: e(%("progid:DXImageTransform.Microsoft.Alpha(Opacity=(%d*100))",@jgrowl-opacity));
+ zoom: 1;
+ width: @jgrowl-width;
+ padding: 10px;
+ margin: 10px;
+ text-align: left;
+ display: none;
+ border-radius: @jgrowl-borderRadius;
+
+ .ui-state-highlight,
+ .ui-widget-content .ui-state-highlight,
+ .ui-widget-header .ui-state-highlight {
+ border: 1px solid #000;
+ background: #000;
+ color: #fff;
+ }
+}
+
+.jGrowl-notification {
+ .notification;
+ min-height: @jgrowl-height;
+
+ .jGrowl-header {
+ font-weight: bold;
+ font-size: .85em;
+ }
+
+ .jGrowl-close {
+ background-color: transparent;
+ color: inherit;
+ border: none;
+ z-index: 99;
+ float: right;
+ font-weight: bold;
+ font-size: 1em;
+ cursor: pointer;
+ }
+}
+
+.jGrowl-closer {
+ .notification;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ cursor: pointer;
+ font-size: .9em;
+ font-weight: bold;
+ text-align: center;
+}
+
+/** Hide jGrowl when printing **/
+@media print {
+ .jGrowl {
+ display: none;
+ }
+}
diff --git a/library/jgrowl/less/jgrowl.less b/library/jgrowl/less/jgrowl.less
new file mode 100644
index 000000000..d55478820
--- /dev/null
+++ b/library/jgrowl/less/jgrowl.less
@@ -0,0 +1,2 @@
+@import "jgrowl.variables.less";
+@import "jgrowl.core.less"; \ No newline at end of file
diff --git a/library/jgrowl/less/jgrowl.variables.less b/library/jgrowl/less/jgrowl.variables.less
new file mode 100644
index 000000000..ec025cb39
--- /dev/null
+++ b/library/jgrowl/less/jgrowl.variables.less
@@ -0,0 +1,8 @@
+@jgrowl-width: 250px;
+@jgrowl-height: 40px;
+@jgrowl-backgroundColor: #000;
+@jgrowl-color: #fff;
+@jgrowl-fontSize: 12px;
+@jgrowl-fontFamily: "Helvetica Neue", Helvetica, Arial, sans-serif;
+@jgrowl-opacity: .90;
+@jgrowl-borderRadius: 5px; \ No newline at end of file
diff --git a/library/jgrowl/package.json b/library/jgrowl/package.json
new file mode 100644
index 000000000..8e523ed84
--- /dev/null
+++ b/library/jgrowl/package.json
@@ -0,0 +1,23 @@
+{
+ "name": "jgrowl",
+ "version": "1.4.5",
+ "author": {
+ "name" : "Stan Lemon",
+ "email" : "stosh1985@gmail.com",
+ "url" : "http://stanlemon.net"
+ },
+ "src": "jquery.jgrowl.js",
+ "style": "jquery.jgrowl.css",
+ "repository" : {
+ "type" : "git",
+ "url" : "http://github.com/stanlemon/jGrowl.git"
+ },
+ "devDependencies": {
+ "grunt": "~0.4.2",
+ "grunt-contrib-jshint": "~0.6.3",
+ "grunt-contrib-uglify": "~0.4.0",
+ "grunt-contrib-cssmin": "~0.9.0",
+ "grunt-contrib-less": "~0.11.0",
+ "grunt-contrib-watch": "~0.6.1"
+ }
+}
diff --git a/view/php/theme_init.php b/view/php/theme_init.php
index 73e559c45..d683a3b58 100644
--- a/view/php/theme_init.php
+++ b/view/php/theme_init.php
@@ -21,7 +21,7 @@ head_add_js('autocomplete.js');
head_add_js('/library/jquery.timeago.js');
head_add_js('/library/readmore.js/readmore.js');
head_add_js('/library/sticky-kit/sticky-kit.min.js');
-head_add_js('/library/jgrowl/jquery.jgrowl_minimized.js');
+head_add_js('/library/jgrowl/jquery.jgrowl.min.js');
head_add_js('/library/cryptojs/components/core-min.js');
head_add_js('/library/cryptojs/rollups/aes.js');
head_add_js('/library/cryptojs/rollups/rabbit.js');