/** * @author Inateno / http://inateno.com / http://dreamirl.com */ /** * <b>You have to write your own CSS to place it, of course I give you a sample to try it<br> * Don't use margins on "notification" element directly, that's why I use a div inside<br> * (and set padding on the parent to simulate a margin)</b> * @namespace Notifications * @author Inateno */ define( [], function() { var Notifications = new function() { this.DEName = "Notifications"; this.notifs = {}; // contain all notifications created this.notifsHeight = 0; this.selector = "notifsContainer"; this.container = null; this.templateName = "notificationTemplate"; this.template = null; this.defaultExpirationTime = 3500; this.closeAnimationDuration= 400; this.notificationClassName = "notification"; this.inited = false; var _self = this; /** * Init Notifications, get template and container in the dom * @memberOf Notifications * @protected * @param {object} params - Optional parameters, you can change all default value (check out the main constructor) */ this.init = function( params ) { params = params || {}; this.selector = params.selector || this.selector; this.templateName = params.templateName || this.templateName; this.closeAnimationDuration = params.closeAnimationDuration || this.closeAnimationDuration; this.notificationClassName = params.notificationClassName || this.notificationClassName; this.container = params.container || document.getElementById( this.selector ); var templateContainer = document.getElementById( this.templateName ) this.template = params.template || templateContainer ? templateContainer.innerHTML : null; if ( !this.container || !this.template ) throw new Error( "Can't init Notifications without a container element AND a template -- " + "container selector:: " + this.selector + " -- templateName:: " + this.templateName ); this.inited = true; this.notifsHeight = this.container.offsetHeight || 0; if ( templateContainer ) document.body.removeChild( templateContainer ); } /** * Create a notification * @memberOf Notifications * @public * @param {string} text - The title of the book. * @param {int} expirationTime - Optional parameters in milliseconds * @example DE.Notifications.create( "hello world", 1500 ); */ this.create = function( text, expirationTime ) // use this one { if ( !this.inited ) { console.log( "You don't init Notifications, init it before call it" ); return; } this.notifsHeight = this.notifsHeight < 0 ? 0 : this.notifsHeight; var time = expirationTime || this.defaultExpirationTime; var id = Date.now() + "-" + ( ( Math.random() * 100 ) >> 0 ); var notif = document.createElement( 'div' ); notif.className = this.notificationClassName; notif.innerHTML = this.template; notif.getElementsByClassName( 'content' )[ 0 ].innerHTML = text; notif.id = 'notif' + id; this.container.appendChild( notif ); this.notifs[ id ] = notif; this.notifs[ id ].getElementsByClassName( 'notifClose' )[ 0 ] .addEventListener( 'click', function() { _self.remove( id ); } ); var height = this.notifs[ id ].offsetHeight; this.notifsHeight += height; this.container.style.height = this.notifsHeight + 'px'; this.bindRemove( id, time ); } /** * bind the remove function * @memberOf Notifications * @protected * @param {string} id - Is the notification to bind * @param {int} time - is the time notification will stay on screen */ this.bindRemove = function( id, time ) { time = time || this.defaultExpirationTime; setTimeout( function() { _self.triggerRemove( id ); }, time ); } /** * launch animation to remove a notification * @memberOf Notifications * @protected * @param {string} id - Is the notification to animate */ this.triggerRemove = function( id ) { if ( !this.notifs[ id ] ) return; this.notifs[ id ].className = this.notifs[ id ].className + ' disapear'; setTimeout( function() { _self.remove( id ); }, this.closeAnimationDuration ); } /** * remove a notification from dom and object container * @memberOf Notifications * @protected * @param {string} id - Is the notification to remove */ this.remove = function( id ) { var height = this.notifs[ id ].offsetHeight; this.notifsHeight -= height; this.container.style.height = this.notifsHeight + 'px'; this.container.removeChild( this.notifs[ id ] ); delete this.notifs[ id ]; return; } }; return Notifications; } );