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