From 6fd87629c752736ac5e9bf5a25bd12ccb121f903 Mon Sep 17 00:00:00 2001
From: phasefx <phasefx@dcc99617-32d9-48b4-a31d-7c20da2025e4>
Date: Thu, 12 Nov 2009 06:03:26 +0000
Subject: [PATCH] Turn off bubbling for the oils_persist event (makes things
 less noisy with iframes, etc.).  Support @oils_persist_peers for persisting
 related elements (mainly to support radio group style widgets)

git-svn-id: svn://svn.open-ils.org/ILS/trunk@14879 dcc99617-32d9-48b4-a31d-7c20da2025e4
---
 .../staff_client/chrome/content/OpenILS/global_util.js  | 17 ++++++++++++-----
 1 file changed, 12 insertions(+), 5 deletions(-)

diff --git a/Open-ILS/xul/staff_client/chrome/content/OpenILS/global_util.js b/Open-ILS/xul/staff_client/chrome/content/OpenILS/global_util.js
index f99b2f14de..f1923e6aa6 100644
--- a/Open-ILS/xul/staff_client/chrome/content/OpenILS/global_util.js
+++ b/Open-ILS/xul/staff_client/chrome/content/OpenILS/global_util.js
@@ -50,10 +50,12 @@
         }
     }
 
-    function oils_persist(e) {
+    function oils_persist(e,cancelable) {
         try {
+            if (!e) { return; }
+            if (typeof cancelable == 'undefined') { cancelable = false; } 
             var evt = document.createEvent("Events");
-            evt.initEvent( 'oils_persist', true, true );
+            evt.initEvent( 'oils_persist', false, cancelable ); // event name, bubbles, cancelable
             e.dispatchEvent(evt);
         } catch(E) {
             alert('Error with oils_persist():' + E);
@@ -65,9 +67,7 @@
             function gen_event_handler(etype,node) {
                 return function(ev) {
                     try {
-                        var evt = document.createEvent("Events");
-                        evt.initEvent( 'oils_persist', true, true );
-                        ev.target.dispatchEvent(evt);
+                        oils_persist(ev.target);
                     } catch(E) {
                         alert('Error in persist_helper, firing virtual event oils_persist after ' + etype + ' event on ' + node.nodeName + '.id = ' + node.id + ': ' + E);
                     }
@@ -104,6 +104,13 @@
                             prefs.setCharPref( key, value );
                             // TODO: Need to add logic for window resizing, splitter repositioning, grippy state, etc.
                         }
+                        if (target.hasAttribute('oils_persist_peers') && ! ev.cancelable) { // We abuse the .cancelable field on the oils_persist event to prevent looping
+                            var peer_list = target.getAttribute('oils_persist_peers').split(' ');
+                            for (var j = 0; j < peer_list.length; j++) {
+                                dump('persist_helper: dispatching oils_persist to peer ' + peer_list[j] + '\n');
+                                oils_persist( document.getElementById( peer_list[j] ), true );
+                            } 
+                        }
                     } catch(E) {
                         alert('Error in persist_helper() event listener for ' + bk + ': ' + E);
                     }
-- 
2.11.0