1 (function($, rf) {
  2 
  3     rf.ui = rf.ui || {};
  4     
  5     var defaultOptions = {
  6         styleClass: '',
  7         nonblocking: false,
  8         nonblockingOpacity: 0.2,
  9         showHistory: false,
 10         animationSpeed: 'slow',
 11         opacity: '1',
 12         showShadow: false,
 13         showCloseButton: true,
 14         appearAnimation: 'fade',
 15         hideAnimation: 'fade',
 16         sticky: false,
 17         stayTime: 8000,
 18         delay: 0
 19     };
 20     
 21     var defaultStackId = "org.richfaces.notifyStack.default";
 22     
 23     var events = "click dblclick  keydown keypress keyup mousedown mousemove mouseout mouseover mouseup";
 24     
 25     var propertyTranslation = {
 26         'summary':'pnotify_title',
 27         'detail': 'pnotify_text',
 28         'styleClass': 'pnotify_addclass',
 29         'nonblocking': 'pnotify_nonblock',
 30         'nonblockingOpacity': 'pnotify_nonblock_opacity',
 31         'showHistory': 'pnotify_history',
 32         'animation': 'pnotify_animation',
 33         'appearAnimation': 'effect_in',
 34         'hideAnimation': 'effect_out',
 35         'animationSpeed': 'pnotify_animate_speed',
 36         'opacity': 'pnotify_opacity',
 37         'showShadow': 'pnotify_shadow',
 38         'showCloseButton': 'pnotify_closer',
 39         'sticky': 'pnotify_hide',
 40         'stayTime': 'pnotify_delay'
 41     };
 42     
 43     var severityClasses = ["rf-ntf-inf", "rf-ntf-wrn", "rf-ntf-err", "rf-ntf-ftl"];
 44     
 45     var translateProperties = function(target, source, translation) {
 46         for (var attr in source) {
 47             var targetAttr = translation[attr] != null ? translation[attr] : attr;
 48             target[targetAttr] = source[attr];
 49             if (target[targetAttr] instanceof Object) {
 50                 target[targetAttr] = $.extend({}, target[targetAttr], translation);
 51             }
 52         }
 53         return target;
 54     };
 55     
 56     var getDefaultStack = function() {
 57         if (!document.getElementById(defaultStackId)) {
 58             var stackElement = $('<span id="' + defaultStackId + '" class="rf-ntf-stck" />');
 59             $('body').append(stackElement);
 60             new rf.ui.NotifyStack(defaultStackId);
 61         }
 62         return getStack(defaultStackId);
 63     };
 64     
 65     var getStack = function(stackId) {
 66         if (!stackId) {
 67             return getDefaultStack();
 68         }
 69         return rf.component(stackId).getStack();
 70     };
 71     
 72 
 73     var array_remove = function(array, from, to) {
 74         var rest = array.slice((to || from) + 1 || array.length);
 75         array.length = from < 0 ? array.length + from : from;
 76         return array.push.apply(array, rest);
 77     };
 78     
 79     rf.ui.Notify = function(options) {
 80         var options = $.extend({}, defaultOptions, options);
 81         
 82         if (typeof options.severity == "number") {
 83             var severity = severityClasses[options.severity];
 84             options.styleClass = options.styleClass ? severity + " " + options.styleClass : severity;
 85         }
 86         
 87         var pnotifyOptions = translateProperties({}, options, propertyTranslation);
 88 
 89         var display = function() {
 90             var stack = getStack(options.stackId);
 91             pnotifyOptions.pnotify_stack = stack;
 92             pnotifyOptions.pnotify_addclass += ' rf-ntf-pos-' + stack.position;
 93             pnotifyOptions.pnotify_after_close = function(pnotify) {
 94                 var index = $.inArray(pnotify, stack.notifications);
 95                 if (index >= 0) {
 96                     array_remove(stack.notifications, index);
 97                 }
 98             }
 99             var pnotify = $.pnotify(pnotifyOptions);
100             pnotify.on(events, function(e) {
101                 if (options['on' + e.type]) {
102                     options['on' + e.type].call(this, e);
103                 }
104             });
105             stack.addNotification(pnotify);
106         }
107         
108         if (options.sticky !== null) {
109             pnotifyOptions.pnotify_hide = !options.sticky;
110         }
111         
112         $(document).ready(function() {
113             if (options.delay) {
114                 setTimeout(function() {
115                     display();
116                 }, options.delay);
117             } else {
118                 display();
119             }
120         });
121     };
122 
123 })(RichFaces.jQuery, RichFaces);