]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Evergreen/staff_client/chrome/content/evergreen/main/app_shell.js
from the Department of Redundancy Department
[working/Evergreen.git] / Evergreen / staff_client / chrome / content / evergreen / main / app_shell.js
1 sdump('D_TRACE','Loading app_shell.js\n');
2
3 function app_shell_init(p) {
4         dump("TESTING: app_shell.js: " + mw.G['main_test_variable'] + '\n');
5
6         p.w.close_tab = function (t1,t2) { return close_tab(p.w.document,t1,t2); };
7         p.w.find_free_tab = function (tabs) { return find_free_tab(tabs); };
8         p.w.new_tab = function () { return new_tab(p.w.document,p.tabbox); };
9         p.w.replace_tab = function (label,chrome,params) { return replace_tab(p.w.document,p.tabbox,label,chrome,params); };
10         p.w.get_frame_in_tab = function (idx, all_or_vis) { return get_frame_in_tab( p.w.document, p.tabbox, idx, all_or_vis ); }; 
11         
12         //p.w.replace_tab('Tab','chrome://evergreen/content/main/about.xul');
13         spawn_javascript_shell(p.w.document,'replace_tab','main_tabbox',{});
14 }
15
16 function close_tab( d, t1, t2 ) {
17         // t1 = tabbox or tab, if t1 = tabbox, t2 = tab index, otherwise close current tab
18         sdump('D_TAB',arg_dump(arguments,{1:true,2:true}));
19         if (typeof(t1)!='object')
20                 t1 = d.getElementById(t1);
21         if (typeof(t1)!='object')
22                 throw('Could not find tab or tabbox. d = ' + d + ' tabbox = ' + t1 + '\n');
23         try {
24                 var tabbox;
25
26                 if (t1.tagName == 'tabbox')
27                         tabbox = t1;
28                 else
29                         tabbox = t1.parentNode.parentNode;
30
31                 var idx = tabbox.selectedIndex;
32                 if (t2)
33                         idx = t2;
34
35                 sdump('D_TAB','tabbox.selectedIndex = ' + tabbox.selectedIndex + '\n');
36                 var tabs = tabbox.firstChild; 
37                 var panels = tabbox.lastChild;
38
39                 if (idx == 0) {
40                         try {
41                                 tabs.advanceSelectedTab(+1);
42                         } catch(E) {
43                                 dump('failed tabs.advanceSelectedTab(+1):'+js2JSON(E) + '\n');
44                                 try {
45                                         tabs.advanceSelectedTab(-1);
46                                 } catch(E) {
47                                         dump('failed again tabs.advanceSelectedTab(-1):'+js2JSON(E) + '\n');
48                                 }
49                         }
50                 } else {
51                         try {
52                                 tabs.advanceSelectedTab(-1);
53                         } catch(E) {
54                                 dump('failed tabs.advanceSelectedTab(-1):'+js2JSON(E) + '\n');
55                                 try {
56                                         tabs.advanceSelectedTab(+1);
57                                 } catch(E) {
58                                         dump('failed again tabs.advanceSelectedTab(+1):'+js2JSON(E) + '\n');
59                                 }
60                         }
61
62                 }
63                 
64                 sdump('D_TAB','\tnew tabbox.selectedIndex = ' + tabbox.selectedIndex + '\n');
65
66                 tabs.childNodes[ idx ].hidden = true;
67                 sdump('D_TAB','tabs.childNodes[ ' + idx + ' ].hidden = true;\n');
68
69                 // Make sure we keep at least one tab open.
70                 var tab_flag = true;
71                 for (var i = 0; i < tabs.childNodes.length; i++) {
72                         var tab = tabs.childNodes[i];
73                         if (!tab.hidden)
74                                 tab_flag = false;
75                 }
76                 if (tab_flag)
77                         new_tab(d,tabbox);
78
79         } catch(E) {
80                 dump(E+'\n');
81                 throw(E);
82         }
83 }
84
85 function find_free_tab(tabs) {
86         var last_not_hidden = -1;
87         for (var i = 0; i<tabs.childNodes.length; i++) {
88                 var tab = tabs.childNodes[i];
89                 if (!tab.hidden)
90                         last_not_hidden = i;
91         }
92         if (last_not_hidden == tabs.childNodes.length - 1)
93                 last_not_hidden = -1;
94         // If the one next to last_not_hidden is hidden, we want it.
95         // Basically, we fill in tabs after existing tabs for as 
96         // long as possible.
97         var idx = last_not_hidden + 1;
98         var candidate = tabs.childNodes[ idx ];
99         if (candidate.hidden)
100                 return idx;
101         // Alright, find the first hidden then
102         for (var i = 0; i<tabs.childNodes.length; i++) {
103                 var tab = tabs.childNodes[i];
104                 if (tab.hidden)
105                         return i;
106         }
107         return -1;
108 }
109
110 function get_frame_in_tab( d, tabbox, idx, all_or_visible ) {
111         sdump('D_TAB',arg_dump(arguments));
112         if (typeof(tabbox)!='object')
113                 tabbox = d.getElementById(tabbox);
114         if (typeof(tabbox)!='object')
115                 throw('Could not find tabbox. d = ' + d + ' tabbox = ' + tabbox + '\n');
116         var tabs = tabbox.firstChild;
117         var panels = tabbox.lastChild;
118         try {
119                 if (all_or_visible == 'visible') {
120                         var count = 0;
121                         for (var i = 0; i < tabs.childNodes.length; i++) {
122                                 if (!tabs.childNodes[i].hidden) count++;
123                                 if (count==idx) return panels.childNodes[i].getElementsByTagName('iframe')[0];
124                         }
125                 } else {
126                         return panels.childNodes[ idx ].getElementsByTagName('iframe')[0];
127                 }
128         } catch(E) {
129                 dump(js2JSON(E) + '\n');
130         }
131         return null;
132 }
133
134 function new_tab( d, tabbox ) {
135         sdump('D_TAB',arg_dump(arguments));
136         if (typeof(tabbox)!='object')
137                 tabbox = d.getElementById(tabbox);
138         if (typeof(tabbox)!='object')
139                 throw('Could not find tabbox. d = ' + d + ' tabbox = ' + tabbox + '\n');
140         var tabs = tabbox.firstChild;
141         var panels = tabbox.lastChild;
142         var tc = find_free_tab(tabs);
143         sdump('D_TAB','find_free_tab returned ' + tc + '\n');
144         if (tc == -1) { return; } // let's only have up to 10 tabs
145         var tab = tabs.childNodes[ tc ];
146                 tab.setAttribute('label','Tab ' + (tc + 1) );
147                 tab.hidden = false;
148         try {
149                 tabs.selectedIndex = tc;
150                 replace_tab(d,tabbox,'Tab','chrome://evergreen/content/main/about.xul');
151         } catch(E) {
152                 dump('+++++++++++++++++++++++++++++' + E + ' : ' + js2JSON(E)+'\n');
153         }
154 }
155
156 function replace_tab( d, tabbox, label, chrome, params ) {
157         sdump('D_TAB',arg_dump(arguments,{2:true,3:true,4:true}));
158         if (typeof(tabbox)!='object')
159                 tabbox = d.getElementById(tabbox);
160         if (typeof(tabbox)!='object')
161                 throw('Could not find tabbox. d = ' + d + ' tabbox = ' + tabbox + '\n');
162         var tabs = tabbox.firstChild;
163         var panels = tabbox.lastChild;
164         try {
165                 var idx = tabs.selectedIndex;
166                 var tab = tabs.childNodes[ idx ];
167                 var panel = panels.childNodes[ idx ];
168
169                 tab.hidden = false;
170                 tab.setAttribute('label',label + ' ' + (idx+1));
171
172                 var frame = d.createElement('iframe');
173                 frame.setAttribute('flex','1');
174                 frame.setAttribute('src',chrome);
175                 panel.appendChild(frame);
176                 panel.replaceChild(panel.lastChild,panel.firstChild);
177                 frame.setAttribute('id','frame_'+idx);
178                 
179                 sdump('D_TAB','Created frame : ' + frame.id + ' for index : ' + idx + ' with src=' + frame.getAttribute('src') + '\n');
180                 //frame.contentWindow.parentWindow = parentWindow;
181                 //frame.contentWindow.tabWindow = this;
182                 //dump('replace_tab.tabWindow = ' + this + '\n');
183                 frame.contentWindow.mw = mw;
184                 //frame.contentWindow.am_i_a_top_level_tab = true;
185                 if (params) {
186                         frame.contentWindow.params = params;
187                 }
188                 return frame.contentWindow;
189         } catch(E) {
190                 dump(js2JSON(E)+'\n');
191         }
192         //debug_tabs(d,tabbox);
193 }