]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/web/reports/oils_rpt_folder_window.js
f5e0cf8c3187075210b4328f57a49861970fe291
[Evergreen.git] / Open-ILS / web / reports / oils_rpt_folder_window.js
1 dojo.requireLocalization("openils.reports", "reports");
2
3 var rpt_strings = dojo.i18n.getLocalization("openils.reports", "reports");
4 var NG_NEW_TEMPLATE_INTERFACE = '/eg/staff/reporter/template/new';
5 var NG_CLONE_TEMPLATE_INTERFACE = '/eg/staff/reporter/template/clone';
6 var NG_CLONE_LEGACY_TEMPLATE_INTERFACE = '/eg/staff/reporter/legacy/template/clone';
7 var OILS_TEMPLATE_INTERFACE = 'xul/template_builder.xul';
8 var OILS_LEGACY_TEMPLATE_INTERFACE = 'oils_rpt_builder.xhtml';
9
10
11 /* generic folder window class */
12 oilsRptSetSubClass('oilsRptFolderWindow', 'oilsRptObject');
13 function oilsRptFolderWindow(type, folderId) { 
14         this.init();
15         var node = oilsRptCurrentFolderManager.findNode(type, folderId);
16         this.selector = DOM.oils_rpt_folder_contents_selector;
17         this.folderNode = node;
18         this.type = type;
19     this.folderId = folderId;
20     oilsRptFolderWindow.folderIdMap[folderId] = this;
21 }
22
23 // maps folder IDs to their containing oilsRptFolderWindow objects
24 oilsRptFolderWindow.folderIdMap = {};
25
26 oilsRptFolderWindow.prototype.draw = function() {
27
28         _debug('drawing folder window for ' + this.folderNode.folder.name() );
29
30         var obj = this;
31         setSelector(DOM.oils_rpt_output_limit_selector, oilsRptOutputLimit);
32         setSelector(DOM.oils_rpt_output_limit_selector_2, oilsRptOutputLimit2);
33
34         DOM.oils_rpt_output_limit_selector.onchange = function() {
35                 oilsRptOutputLimit = getSelectorVal(DOM.oils_rpt_output_limit_selector);
36                 obj.draw();
37         }
38
39         DOM.oils_rpt_output_limit_selector_2.onchange = function() {
40                 oilsRptOutputLimit2 = getSelectorVal(DOM.oils_rpt_output_limit_selector_2);
41                 obj.draw();
42         }
43
44         var mine = ( this.folderNode.folder.owner().id() == USER.id() );
45
46         _debug('drawing folder window with type '+this.type);
47         if(mine) _debug('folder is mine...');
48
49         if( mine && this.type == 'template') 
50                 unHideMe(DOM.oils_rpt_folder_window_contents_new_template.parentNode);
51         else hideMe(DOM.oils_rpt_folder_window_contents_new_template.parentNode);
52
53         unHideMe(DOM.oils_rpt_folder_window_contents_div);
54         hideMe(DOM.oils_rpt_folder_manager_div);
55         hideMe(DOM.oils_rpt_top_folder);
56
57         DOM.oils_rpt_folder_window_manage_tab.onclick = function() {
58                 unHideMe(DOM.oils_rpt_folder_window_contents_div);
59                 hideMe(DOM.oils_rpt_folder_manager_div);
60         }
61         DOM.oils_rpt_folder_window_edit_tab.onclick = function() {
62                 hideMe(DOM.oils_rpt_folder_window_contents_div);
63                 unHideMe(DOM.oils_rpt_folder_manager_div);
64         }
65
66         this.setFolderEditActions();
67
68         hideMe(DOM.oils_rpt_template_folder_new_report);
69         unHideMe(DOM.oils_rpt_folder_table_right_td);
70         hideMe(DOM.oils_rpt_folder_table_alt_td);
71         this.drawFolderDetails();
72
73         DOM.oils_rpt_folder_content_action_go.onclick = 
74                 function() {obj.doFolderAction()}
75
76         this.fetchFolderData();
77
78         var sel = DOM.oils_rpt_folder_contents_action_selector;
79         var x = true;
80         for( var i = 0; i < sel.options.length; i++ ) {
81                 var opt = sel.options[i];
82
83                 if( !mine && opt.getAttribute('value').match(/move/) ) {
84                         hideMe(opt);
85                         continue;
86                 }
87
88                 if( opt.getAttribute('type') == this.type ) {
89                         if(x && !opt.disabled) {
90                                 opt.selected = true;
91                                 x = false;
92                         }
93                         unHideMe(opt);
94                 } else hideMe(opt);
95         }
96
97         this.drawEditActions();
98
99         var porg = PERMS.SHARE_REPORT_FOLDER;
100         if( porg < 1 ) 
101                 DOM.oils_rpt_folder_manager_share_opt.disabled = true;
102 }
103
104 oilsRptFolderWindow.prototype.drawEditActions = function() {
105
106         DOM.oils_rpt_folder_window_contents_new_template.onclick = function() {
107                 var s = location.search+'';
108                 s = s.replace(/\&folder=\d+/g,'');
109                 s = s.replace(/\&ct=\d+/g,'');
110                 if (window.IAMBROWSER) {
111             window.top.location.href = NG_NEW_TEMPLATE_INTERFACE+'/'+obj.folderNode.folder.id();
112         } else {
113             goTo( OILS_TEMPLATE_INTERFACE+s+'&folder='+obj.folderNode.folder.id());
114         }
115         }
116
117
118         if( this.folderNode.folder.owner().id() != USER.id() )
119                 hideMe(DOM.oils_rpt_folder_manager_tab_table);
120         else
121                 unHideMe(DOM.oils_rpt_folder_manager_tab_table);
122
123         if( isTrue(this.folderNode.folder.shared())) {
124                 DOM.oils_rpt_folder_manager_share_opt.disabled = true;
125                 DOM.oils_rpt_folder_manager_unshare_opt.disabled = false;
126         } else {
127                 DOM.oils_rpt_folder_manager_share_opt.disabled = false;
128                 DOM.oils_rpt_folder_manager_unshare_opt.disabled = true;
129         }
130
131         this.hideFolderActions();
132         var obj = this;
133
134         DOM.oils_rpt_folder_manager_actions_submit.onclick = function() {
135                 var act = getSelectorVal(DOM.oils_rpt_folder_manager_actions);
136                 _debug("doing folder action: " + act);
137                 obj.hideFolderActions();
138                 switch(act) {
139                         case 'change_name':
140                                 unHideMe(DOM.oils_rpt_folder_manager_change_name_div);
141                                 break;
142                         case 'create_sub_folder':
143                                 var porg = PERMS.SHARE_REPORT_FOLDER;
144                                 if( porg < 1 ) 
145                                         DOM.oils_rpt_folder_manager_sub_shared.disabled = true;
146                                 removeChildren(DOM.oils_rpt_folder_manager_sub_lib_picker);
147                                 unHideMe(DOM.oils_rpt_folder_manager_create_sub);
148                                 obj.myOrgSelector = new oilsRptMyOrgsWidget(
149                                         DOM.oils_rpt_folder_manager_sub_lib_picker, USER.ws_ou(), porg)
150                                 obj.myOrgSelector.draw();
151                                 break;
152                         case 'delete':
153                                 obj.doFolderDelete();
154                                 break;
155                         case 'share':
156                                 obj.shareFolder();
157                                 break;
158                         case 'unshare':
159                                 obj.unShareFolder();
160                                 break;
161                 }
162         }
163
164 }
165
166
167 oilsRptFolderWindow.prototype.shareFolder = function() {
168         var folder = this.folderNode.folder;
169         if(isTrue(folder.shared()))
170                 return alertId('oils_rpt_folder_already_shared');
171         unHideMe(DOM.oils_rpt_folder_manager_share_div);
172
173
174         var orgsel = new oilsRptMyOrgsWidget(
175                 DOM.oils_rpt_folder_manager_share_lib_picker, 
176                 USER.ws_ou(), PERMS.SHARE_REPORT_FOLDER);
177         orgsel.draw();
178
179         var type = this.type;
180         DOM.oils_rpt_folder_manager_share_submit.onclick = function() {
181                 folder.shared('t');
182                 folder.share_with(orgsel.getValue());
183                 oilsRptUpdateFolder( folder, type, 
184                         function(success) {
185                                 if(success) {
186                                         oilsRptAlertSuccess();
187                                         oilsRptCurrentFolderManager.draw();
188                                 }
189                         }
190                 );
191         }
192 }
193
194 oilsRptFolderWindow.prototype.unShareFolder = function() {
195         var folder = this.folderNode.folder;
196         if(!isTrue(folder.shared()))
197                 return alertId('oils_rpt_folder_already_unshared');
198         if(!confirmId('oils_rpt_folder_unshare_confirm')) return;
199         folder.shared('f');
200         var type = this.type;
201         oilsRptUpdateFolder( folder, type, 
202                 function(success) {
203                         if(success) {
204                                 oilsRptAlertSuccess();
205                                 oilsRptCurrentFolderManager.draw();
206                         }
207                 }
208         );
209 }
210
211
212 oilsRptFolderWindow.prototype.hideFolderActions = function() {
213         hideMe(DOM.oils_rpt_folder_manager_change_name_div);
214         hideMe(DOM.oils_rpt_folder_manager_create_sub);
215         hideMe(DOM.oils_rpt_folder_manager_share_div);
216 }
217
218
219 oilsRptFolderWindow.prototype.doFolderAction = function() {
220         var objs = (this.fmTable) ? this.fmTable.getSelected() : [];
221
222         if( this.type == 'output' && this.fmTable2 ) 
223                 objs = objs.concat( this.fmTable2.getSelected() );
224
225         if( objs.length == 0 ) 
226                 return alert(rpt_strings.FOLDER_WINDOW_SELECT_ITEM);
227         var action = getSelectorVal(DOM.oils_rpt_folder_contents_action_selector);
228
229         var obj = this;
230         var successCallback = function(errid) {
231                 if(errid) alertId(errid)
232                 else oilsRptAlertSuccess();
233                 obj.draw();
234         };
235
236         var obj = this;
237         switch(action) {
238
239                 case 'create_report' :
240                         hideMe(DOM.oils_rpt_folder_table_right_td);
241                         unHideMe(DOM.oils_rpt_folder_table_alt_td);
242                         unHideMe(DOM.oils_rpt_editor_div);
243                         new oilsRptReportEditor(new oilsReport(objs[0]), this);
244                         break;
245                 case 'delete_report' :
246                         if(!confirmId('oils_rpt_verify_report_delete')) return;
247                         this.deleteReports(objs, 0, successCallback);
248                         break;
249
250                 case 'delete_template' :
251             if(!confirmId('oils_rpt_verify_template_delete')) return;
252                         this.deleteTemplates(objs, 0, successCallback);
253                         break;
254
255                 case 'show_output':
256                         this.showOutput(objs[0]);
257                         break;
258
259                 case 'delete_output':
260                         if(!confirmId('oils_rpt_folder_contents_confirm_delete')) return;
261                         this.deleteOutputs(objs,0, successCallback);
262                         break;
263
264                 case 'move_template':
265                         this.changeBatchFolder(objs, 'template', successCallback);
266                         break;
267
268                 case 'move_report':
269                         this.changeBatchFolder(objs, 'report', successCallback);
270                         break;
271
272                 case 'move_output':
273                         this.changeBatchFolder(objs, 'output', successCallback);
274                         break;
275
276                 case 'clone_template':
277                         this.cloneTemplate(objs[0]);
278         }
279 }
280
281 oilsRptFolderWindow.prototype.changeBatchFolder = function(objs, type, callback) {
282         hideMe(DOM.oils_rpt_folder_window_contents_table);
283         unHideMe(DOM.oils_rpt_move_folder_div)
284         var obj = this;
285         this.drawFolderOptions(type,    
286                 function(folderid) {
287                         obj.changeFolderList(objs, type, folderid, 0, callback);
288                         hideMe(DOM.oils_rpt_move_folder_div)
289                         unHideMe(DOM.oils_rpt_folder_window_contents_table);
290                 }
291         );
292 }
293
294 oilsRptFolderWindow.prototype.cloneTemplate = function(template) {
295         hideMe(DOM.oils_rpt_folder_window_contents_table);
296         unHideMe(DOM.oils_rpt_move_folder_div)
297         var obj = this;
298         this.drawFolderOptions('template',
299                 function(folderid) {
300                         var s = location.search+'';
301                         s = s.replace(/\&folder=\d+/g,'');
302                         s = s.replace(/\&ct=\d+/g,'');
303             version = JSON2js(template.data()).version;
304             if(version && version >= 5) {
305                             window.top.location.href = NG_CLONE_TEMPLATE_INTERFACE+'/'+folderid+'/'+template.id();
306             } else if(version && version >= 2) {
307                         if (window.IAMBROWSER) {
308                                 window.top.location.href = NG_CLONE_LEGACY_TEMPLATE_INTERFACE+'/'+folderid+'/'+template.id();
309                 } else {
310                     _debug('entering new template building interface with template version ' + version);
311                             goTo(OILS_TEMPLATE_INTERFACE+s+'&folder='+folderid+'&ct='+template.id());
312                 }
313             } else {
314                         if (window.IAMBROWSER) {
315                                 window.top.location.href = NG_CLONE_LEGACY_TEMPLATE_INTERFACE+'/'+folderid+'/'+template.id();
316                 } else {
317                             goTo(OILS_LEGACY_TEMPLATE_INTERFACE+s+'&folder='+folderid+'&ct='+template.id());
318                 }
319             }
320                 }
321         );
322 }
323
324
325 oilsRptFolderWindow.prototype.changeFolderList = function(list, type, folderid, idx, callback, errid) {
326         if( idx >= list.length ) return callback(errid);
327         var item = list[idx];
328         var obj = this;
329         var rcback = function(){obj.changeFolderList(list,type,folderid,++idx,callback,errid)};
330
331         item.folder(folderid);
332
333         switch(type) {
334                 case 'template':
335                         oilsRptUpdateTemplate(item,rcback);
336                         break;
337                 case 'report':
338                         oilsRptUpdateReport(item,rcback);
339                         break;
340                 case 'output':
341                         oilsRptUpdateSchedule(item,rcback);
342                         break;
343         }
344 }
345
346 oilsRptFolderWindow.prototype.drawFolderOptions = function(type, callback) {
347         //var oilsRptChangeFolderTree;
348         var selectedFolder;
349         oilsRptBuildFolder(
350                 type,
351                 DOM.oils_rpt_move_folder_picker,
352                 'tree9807897',
353                 rpt_strings.FOLDER_WINDOW_CHANGE_FOLDERS,
354                 function(node) { 
355                         appendClear(DOM.oils_rpt_move_folder_selected, node.folder.name());
356                         selectedFolder = node.folder.id();
357                 } 
358         );
359
360         DOM.oils_rpt_change_folder_submit.onclick = function() {
361                 if(selectedFolder) callback(selectedFolder);
362         }
363
364         DOM.oils_rpt_change_folder_cancel.onclick = function() {
365                 hideMe(DOM.oils_rpt_move_folder_div)
366                 unHideMe(DOM.oils_rpt_folder_window_contents_table);
367         }
368 }
369
370
371 oilsRptFolderWindow.prototype.deleteOutputs = function(list, idx, callback, errid) {
372         if( idx >= list.length ) return callback(errid);
373         var output = list[idx];
374
375         if( output.runner().id()  != USER.id() ) {
376                 this.deleteOutputs(list, ++idx, 
377                         callback, 'oils_rpt_folder_contents_no_delete');
378
379         } else {
380                 _debug('deleting output ' + output.id());
381                 var req = new Request(OILS_RPT_DELETE_SCHEDULE,SESSION,output.id());
382                 var obj = this;
383                 req.callback(function(){obj.deleteOutputs(list, ++idx, callback, errid);});
384                 req.send();
385         }
386 }
387
388 oilsRptFolderWindow.prototype.showOutput = function(sched) {
389         oilsRptFetchReport(sched.report().id(), 
390                 function(r) {
391                         var url = oilsRptBuildOutputLink(r.template(), r.id(), sched.id());
392                         _debug("launching report output view at URL: " + url);
393                         if(isXUL() && !window.IAMBROWSER) 
394                                 xulG.new_tab(xulG.url_prefix('XUL_REMOTE_BROWSER?url=') + url,
395                                         {tab_name: dojo.string.substitute( rpt_strings.FOLDER_WINDOW_REPORT_OUTPUT, [r.name()] ), browser:false},
396                                         {no_xulG:false, show_nav_buttons:true, show_print_button:true});
397                         else {
398                                 //goTo(url);
399                                 var win = window.open(url,r.name(), 'resizable,width=800,height=600,scrollbars=1'); 
400                         }
401                 }
402         );
403 }
404
405
406 oilsRptFolderWindow.prototype.deleteReports = function(list, idx, callback, errid) {
407         if( idx >= list.length ) return callback(errid);
408         var report = list[idx];
409
410         var obj = this;
411         if( report.owner().id() != USER.id() ) {
412                 this.deleteReports(list, ++idx, 
413                         callback, 'oils_rpt_folder_contents_no_delete');
414
415         } else {
416
417 //              var req0 = new Request(OILS_RPT_REPORT_HAS_OUTS, SESSION, report.id());
418 //              req0.callback(
419 //                      function(r0) {
420 //                              var r0es = r0.getResultObject();
421 //                              if( r0es != '0' ) {
422 //                                      obj.deleteReports(list, ++idx, 
423 //                                              callback, 'oils_rpt_folder_contents_report_no_delete');
424 //                              } else {
425                                         _debug('deleting report ' + report.id());
426                                         var req = new Request(OILS_RPT_DELETE_REPORT, SESSION, report.id());
427                                         req.callback(function(r) { 
428                                                 var res = r.getResultObject();
429                                                 if( res == 0 ) return oilsRptAlertFailure();
430                                                 obj.deleteReports(list, ++idx, callback, errid)
431                                         });
432                                         req.send();
433 //                              }
434 //                      }
435 //              );
436 //
437 //              req0.send();
438         }
439 }
440
441 oilsRptFolderWindow.prototype.deleteTemplates = function(list, idx, callback, errid) {
442         if( idx >= list.length ) return callback(errid);
443         var tmpl = list[idx];
444
445         var obj = this;
446         if( tmpl.owner().id() != USER.id() ) {
447                 this.deleteTemplates(list, ++idx, 
448                         callback, 'oils_rpt_folder_contents_no_delete');
449
450         } else {
451
452
453 //              var req0 = new Request( OILS_RPT_TEMPLATE_HAS_RPTS, SESSION, tmpl.id() );
454 //              req0.callback(
455 //                      function(r0) {
456 //                              var resp = r0.getResultObject();
457 //
458 //                              if( resp != '0' ) {
459 //                                      obj.deleteTemplates(list, ++idx, 
460 //                                              callback, 'oils_rpt_folder_contents_template_no_delete');
461 //
462 //                              } else {
463                                         _debug('deleting template ' + tmpl.id());
464                                         var req = new Request(OILS_RPT_DELETE_TEMPLATE, SESSION, tmpl.id());
465                                         req.callback(function(r) {
466                                                 var res = r.getResultObject();
467                                                 if( res == 0 ) return oilsRptAlertFailure();
468                                                 if( res == 1 ) errid = 'oils_rpt_folder_contents_template_no_delete';
469                                                 obj.deleteTemplates(list, ++idx, callback, errid)
470                                         });
471                                         req.send();
472 //                              }
473 //                      }
474 //              );
475 //              req0.send();
476         }
477 }
478
479
480
481 oilsRptFolderWindow.prototype.drawFolderDetails = function() {
482         appendClear(DOM.oils_rpt_folder_creator_label, 
483                 text(this.folderNode.folder.owner().usrname()));
484         appendClear(DOM.oils_rpt_folder_name_label, 
485                 text(this.folderNode.folder.name()));
486 }
487
488
489 oilsRptFolderWindow.prototype.fetchFolderData = function(callback) {
490
491         hideMe(DOM.oils_rpt_content_count_row_2);
492         hideMe(DOM.oils_rpt_content_row_2);
493
494         removeChildren(this.selector);
495         var req = new Request(OILS_RPT_FETCH_FOLDER_DATA, 
496                 SESSION, this.type, this.folderNode.folder.id(), oilsRptOutputLimit);
497
498         hideMe(DOM.oils_rpt_pending_output);
499
500         if(this.type == 'output') {
501                 unHideMe(DOM.oils_rpt_pending_output);
502                 /* first fetch the non-complete schedules */
503                 req = new Request(OILS_RPT_FETCH_OUTPUT, 
504                         SESSION, this.folderNode.folder.id(), oilsRptOutputLimit, 0);
505         }
506
507         var obj = this;
508         removeChildren(obj.selector);
509         req.callback(
510                 function(r) {
511                         var res = r.getResultObject();
512
513                         if( res.length == 0 ) {
514                                 //hideMe(DOM.oils_rpt_content_count_row); /* this also hides the new-template link.. fix me */
515                                 hideMe(DOM.oils_rpt_content_row);
516                                 unHideMe(DOM.oils_rpt_content_row_empty);
517                         } else {
518                                 unHideMe(DOM.oils_rpt_content_count_row);
519                                 unHideMe(DOM.oils_rpt_content_row);
520                                 hideMe(DOM.oils_rpt_content_row_empty);
521                         }
522
523                         if( obj.type == 'output' ) {
524                                 obj.fleshSchedules(res, 0, obj.selector);
525                         } else {
526
527
528                                 obj.fmTable = drawFMObjectTable( 
529                                         { 
530                                                 dest : obj.selector, 
531                                                 obj : res,
532                                                 selectCol : true,
533                                                 selectColName : rpt_strings.FOLDER_WINDOW_COLNAME_SELECT,
534                                                 selectAllName : rpt_strings.FOLDER_WINDOW_COLNAME_ALL,
535                                                 selectNoneName : rpt_strings.FOLDER_WINDOW_COLNAME_NONE
536                                         }
537                                 );
538                         }
539                 }
540         );
541         req.send();
542
543         if( this.type != 'output' ) return;
544
545         /*
546         unHideMe(DOM.oils_rpt_content_count_row_2);
547         unHideMe(DOM.oils_rpt_content_row_2);
548         */
549
550         /* now fetch the completed schedules */
551         req = new Request(OILS_RPT_FETCH_OUTPUT, 
552                 SESSION, this.folderNode.folder.id(), oilsRptOutputLimit2, 1);
553
554         _debug("TRYING: fleshing finished scheds with div: " + DOM.oils_rpt_folder_contents_selector_2);
555         removeChildren(DOM.oils_rpt_folder_contents_selector_2);
556         req.callback(
557                 function(r) {
558                         var res = r.getResultObject();
559
560                         if( res.length == 0 ) {
561                                 hideMe(DOM.oils_rpt_content_count_row_2);
562                                 hideMe(DOM.oils_rpt_content_row_2);
563                         } else {
564                                 unHideMe(DOM.oils_rpt_content_count_row_2);
565                                 unHideMe(DOM.oils_rpt_content_row_2);
566                         }
567
568                         _debug("fleshing finished scheds with div: " + DOM.oils_rpt_folder_contents_selector_2);
569                         obj.fleshSchedules(res, 0, DOM.oils_rpt_folder_contents_selector_2, true);
570                 }
571         );
572         req.send();
573 }
574
575
576 oilsRptFolderWindow.prototype.fleshSchedules = function(list, idx, selector, isSecond) {
577
578         if( idx >= list.length ) return;
579
580         var sched = list[idx];
581         var obj = this;
582
583         oilsRptFetchUser(sched.runner(),
584
585                 function(user) {
586                         sched.runner(user);
587                         oilsRptFetchTemplate(sched.report().template(),
588
589                                 function(template) {
590                                         sched.report().template(template);
591                                         if( idx == 0 ) {
592                                                 _debug("drawing schedule with output: "+selector);
593                                                 var t = drawFMObjectTable( 
594                                                         { 
595                                                                 dest : selector, 
596                                                                 obj : [sched],
597                                                                 selectCol : true,
598                                                                 selectColName : rpt_strings.FOLDER_WINDOW_COLNAME_SELECT,
599                                                                 selectAllName : rpt_strings.FOLDER_WINDOW_COLNAME_ALL,
600                                                                 selectNoneName : rpt_strings.FOLDER_WINDOW_COLNAME_NONE
601                                                         }
602                                                 );
603
604                                                 if( isSecond ) obj.fmTable2 = t;
605                                                 else obj.fmTable = t;
606
607                                         } else {
608                                                 //obj.fmTable.add(sched);
609                                                 if( isSecond ) obj.fmTable2.add(sched);
610                                                 else obj.fmTable.add(sched);
611                                         }
612
613                                         obj.fleshSchedules(list, ++idx, selector, isSecond);
614                                 }
615                         );
616                 }
617         );
618 }
619
620
621 oilsRptFolderWindow.prototype.setSelected = function(folderNode) {
622         this.selectedFolder = folderNode;
623 }
624
625 oilsRptFolderWindow.prototype.setFolderEditActions = function() {
626         var folder = this.folderNode.folder;
627
628         var obj = this;
629         DOM.oils_rpt_folder_manager_name_input.value = folder.name();
630         DOM.oils_rpt_folder_manager_change_name_submit.onclick = function() {
631                 var name = DOM.oils_rpt_folder_manager_name_input.value;
632                 if(name != "") {
633                         folder.name( name );
634                         if(confirmId('oils_rpt_folder_manager_change_name_confirm')) {
635                                 oilsRptUpdateFolder(folder, obj.type,
636                                         function(success) {
637                                                 if(success) {
638                                                         oilsRptAlertSuccess();
639                                                         oilsRptCurrentFolderManager.draw();
640                                                 }
641                                         }
642                                 );
643                         }
644                 }
645         }
646
647         DOM.oils_rpt_folder_manager_sub_lib_create.onclick = function() {
648                 var folder;
649
650                 if( obj.type == 'report' ) folder = new rrf();
651                 if( obj.type == 'template' ) folder = new rtf();
652                 if( obj.type == 'output' ) folder = new rof();
653
654                 folder.owner(USER.id());
655                 folder.parent(obj.folderNode.folder.id());
656                 folder.name(DOM.oils_rpt_folder_manager_sub_name.value);
657                 var shared = getSelectorVal(DOM.oils_rpt_folder_manager_sub_shared);
658                 folder.shared( (shared == 'yes') ? 't' : 'f');
659                 if( folder.shared() == 't' )
660                         folder.share_with( obj.myOrgSelector.getValue() );
661
662                 oilsRptCreateFolder(folder, obj.type,
663                         function(success) {
664                                 if(success) {
665                                         oilsRptAlertSuccess();
666                                         oilsRptCurrentFolderManager.draw();
667                                 }
668                         }
669                 );
670         }
671 }
672
673
674 oilsRptFolderWindow.prototype.doFolderDelete = function() {
675         
676         var cache = oilsRptFolderNodeCache[this.type];
677         /* let's see if this folder has any children */
678         for( var c in cache ) 
679                 if( cache[c].folder.parent() == this.folderNode.folder.id() )
680                         return alertId('oils_rpt_folder_cannot_delete');
681
682         /* lets see if the folder has contents */
683         var req = new Request(OILS_RPT_FETCH_FOLDER_DATA, 
684                 SESSION, this.type, this.folderNode.folder.id(), 1);
685
686         if(this.type == 'output') {
687                 req = new Request(OILS_RPT_FETCH_OUTPUT, 
688                         SESSION, this.folderNode.folder.id(), 1);
689         }
690
691         var obj = this;
692         req.send();
693
694         req.callback( 
695                 function(r) {
696
697                         var contents = r.getResultObject();
698                         if( contents.length > 0 ) 
699                                 return alertId('oils_rpt_folder_cannot_delete');
700
701                         if( confirmId('oils_rpt_folder_manager_delete_confirm') ) {
702                                 var req2 = new Request(OILS_RPT_DELETE_FOLDER, 
703                                         SESSION, obj.type, obj.folderNode.folder.id());
704         
705                                 req2.callback( 
706                                         function(r2) {
707                                                 var res = r2.getResultObject();
708                                                 if( res == 1 ) {
709                                                         oilsRptAlertSuccess();
710                                                         oilsRptCurrentFolderManager.draw();
711                                                 }
712                                                 else alert('error: '+js2JSON(res));
713                                         }
714                                 );
715
716                                 req2.send();
717                         }
718                 }
719         );
720 }
721
722 function oilsRptViewEditReport(report, readonly) {
723
724
725     var folderWindow = oilsRptFolderWindow.folderIdMap[report.folder()];
726
727     var req = new Request(
728         'open-ils.reporter:open-ils.reporter.report.fleshed.retrieve',
729         SESSION, report.id()
730     );
731
732     req.callback(function(r) {
733
734         hideMe(DOM.oils_rpt_folder_table_right_td);
735         unHideMe(DOM.oils_rpt_folder_table_alt_td);
736         unHideMe(DOM.oils_rpt_editor_div);
737
738         report = r.getResultObject();
739
740         new oilsRptReportEditor(
741             new oilsReport(report.template(), report), folderWindow, readonly);
742     });
743
744     req.send();
745 }
746
747 function oilsRptViewReport(report) {
748     oilsRptViewEditReport(report, true);
749 }
750
751 function oilsRptEditReport(report) {
752     oilsRptViewEditReport(report);
753 }
754
755