diff options
Diffstat (limited to 'notifier/observer_growl.js')
-rw-r--r-- | notifier/observer_growl.js | 120 |
1 files changed, 120 insertions, 0 deletions
diff --git a/notifier/observer_growl.js b/notifier/observer_growl.js new file mode 100644 index 0000000..b6f1d96 --- /dev/null +++ b/notifier/observer_growl.js @@ -0,0 +1,120 @@ +/** + * notifier.js plugin observer + * @name observer_growl.js + * @description growl when notified. + * @description-ja Growl風通知。 + * @author suVene suvene@zeromemory.info + * @version 0.1.0 + * Last Change: 07-Dec-2008. + * + * use JQuery + * http://jquery.com/ + * use JGrowl + * http://stanlemon.net/projects/jgrowl.html + */ +(function() { + +var notifier = liberator.plugins.notifier; +if (!notifier) return; + +var lib = notifier.lib; +var $U = lib.$U; +var logger = $U.getLogger('observer_growl'); + +var Growl = function() {//{{{ + this.initialize.apply(this, arguments); +} +Growl.prototype = { + defaults: { + life: 3000 + }, + initialize: function(dom, container) { + this.dom = dom; + this.container = container; + this.created = new Date(); + this.life = this.defaults.life; + dom.childNodes[0].addEventListener("click", $U.bind(this, this.remove), false); + }, + remove: function() { + this.container.removeChild(this.dom); + }, + +}//}}} + +notifier.observer.register({ + initialize: function () { + logger.log('initialize'); + this.count = 1; + + io.getRuntimeDirectories('').forEach(function(dir) { + let path = io.expandPath(dir.path + '/plugin/notifier'); + $U.readDirectory(path, '^jquery' , function(f) { + try { + io.source(f.path, true) + logger.log('load success: ' + f.leafName); + } catch (e) { + logger.log('load failed: ' + f.leafName); + } + }); + }); + }, + update: function(message) { + logger.log('update:' + this.count); + + var doc = window.content.document; + var container = doc.getElementById("observer_growl"); + if (!container) { + doc.body.appendChild(util.xmlToDom(<div id="observer_growl" class="observer_growl top-right" />, doc)); + container = doc.getElementById("observer_growl"); + } + + this.createPopup(doc, message, container); + container.appendChild(this.createPopup(doc, message, container)); + + if (container.childNodes.length == 1) { + var interval = setInterval($U.bind(this, this.checkStatus), 1000); + container.__interval__ = interval; + } + + this.count++; + }, + createPopup: function(doc, message, nodes) { + var dom; + var html = + <div class="observer_growl_notification" style="display: block;"> + <div class="close">×</div> + <div class="header">{util.escapeHTML(this.count + ': ' + message.title)}</div> + <div class="message">{util.escapeHTML(message.message)}</div> + </div>; + dom = util.xmlToDom(html, doc, nodes); + dom.__data__ = new Growl(dom, nodes); + + let count = this.count; + return dom; + }, + checkStatus: function() { + + var doc = window.content.document; + var container = doc.getElementById("observer_growl"); + if (!container) return; + + var removeNodes = []; + for (let i = 0, len = container.childNodes.length; i < len; i++) { + let item = container.childNodes[i]; + let growl = item.__data__; + if (growl && growl.created && + growl.created.getTime() + growl.life < (new Date()).getTime()) { + removeNodes.push(item); + } + } + removeNodes.forEach(function(n) container.removeChild(n)); + + if (container.childNodes.length == 0) + clearInterval(container.__interval__); + + } +}); + +})(); +// vim: set fdm=marker sw=4 ts=4 sts=0 et: + |