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