]> git.sur5r.net Git - bacula/bacula/blob - gui/bweb/html/bresto.js
ebl cleanup
[bacula/bacula] / gui / bweb / html / bresto.js
1
2 //   Bweb - A Bacula web interface
3 //   Bacula® - The Network Backup Solution
4 //
5 //   Copyright (C) 2000-2006 Free Software Foundation Europe e.V.
6 //
7 //   The main author of Bweb is Eric Bollengier.
8 //   The main author of Bacula is Kern Sibbald, with contributions from
9 //   many others, a complete list can be found in the file AUTHORS.
10 //
11 //   This program is Free Software; you can redistribute it and/or
12 //   modify it under the terms of version two of the GNU General Public
13 //   License as published by the Free Software Foundation plus additions
14 //   that are listed in the file LICENSE.
15 //
16 //   This program is distributed in the hope that it will be useful, but
17 //   WITHOUT ANY WARRANTY; without even the implied warranty of
18 //   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19 //   General Public License for more details.
20 //
21 //   You should have received a copy of the GNU General Public License
22 //   along with this program; if not, write to the Free Software
23 //   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
24 //   02110-1301, USA.
25 //
26 //   Bacula® is a registered trademark of John Walker.
27 //   The licensor of Bacula is the Free Software Foundation Europe
28 //   (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zurich,
29 //   Switzerland, email:ftf@fsfeurope.org.
30
31 // render if vol is online/offline
32 function rd_vol_is_online(val)
33 {
34    return '<img src="/bweb/inflag' + val + '.png">';
35 }
36
37 // TODO: fichier ou rep
38 function rd_file_or_dir(val)
39 {
40    if (val == 'F') {
41       return '<img src="/bweb/A.png">';
42    } else {
43       return '<img src="/bweb/R.png">';
44    }
45 }
46
47 Ext.namespace('Ext.brestore');
48
49 Ext.brestore.jobid=0;            // selected jobid
50 Ext.brestore.jobdate='';         // selected date
51 Ext.brestore.client='';          // selected client
52 Ext.brestore.rclient='';         // selected client for resto
53 Ext.brestore.storage='';         // selected storage for resto
54 Ext.brestore.path='';            // current path (without user location)
55 Ext.brestore.root_path='';       // user location
56
57 Ext.brestore.option_vosb = false;
58 Ext.brestore.option_vafv = false;
59 Ext.brestore.dlglaunch;
60 Ext.BLANK_IMAGE_URL = '/bweb/ext/resources/images/aero/s.gif';  // 1.1
61
62 function get_node_path(node)
63 {
64    var temp='';
65    for (var p = node; p; p = p.parentNode) {
66        if (p.parentNode) {
67           if (p.text == '/') {
68              temp = p.text + temp;
69           } else {
70           temp = p.text + '/' + temp;
71           }
72        }
73    }
74    return Ext.brestore.root_path + temp;
75 }
76
77
78 function init_params(baseParams)
79 {
80    baseParams['client']= Ext.brestore.client;
81
82    if (Ext.brestore.option_vosb) {         
83       baseParams['jobid'] = Ext.brestore.jobid;
84    } else {
85       baseParams['date'] = Ext.brestore.jobdate;
86    }
87    return baseParams;
88 }
89
90
91 function ext_init()
92 {
93 //////////////////////////////////////////////////////////////:
94     var Tree = Ext.tree;
95     var tree_loader = new Ext.tree.TreeLoader({
96             baseParams:{}, 
97             dataUrl:'/cgi-bin/bweb/bresto.pl'
98         });
99
100     var tree = new Ext.tree.TreePanel('div-tree', {
101         animate:true, 
102         loader: tree_loader,
103         enableDD:true,
104         enableDragDrop: true,
105         containerScroll: true
106     });
107
108     // set the root node
109     var root = new Ext.tree.AsyncTreeNode({
110         text: 'Select a client then a job',
111         draggable:false,
112         id:'source'
113     });
114     tree.setRootNode(root);
115     Ext.brestore.tree = root;
116
117     // render the tree
118     tree.render();
119 //    root.expand();
120
121     tree.on('click', function(node, event) { 
122         Ext.brestore.path = get_node_path(node);
123         where_field.setValue(Ext.brestore.path);
124         file_store.removeAll();
125         file_versions_store.removeAll();
126         file_store.load({params:init_params({action: 'list_files',
127                                              path:Ext.brestore.path,
128                                              node:node.id})
129                        });
130         return true;
131     });
132
133     tree.on('beforeload', function(e) {
134         file_store.removeAll();
135         return true;
136     });
137
138
139 ////////////////////////////////////////////////////////////////
140
141   var file_store = new Ext.data.Store({
142         proxy: new Ext.data.HttpProxy({
143             url: '/cgi-bin/bweb/bresto.pl',
144             method: 'GET',
145             params:{}
146         }),
147
148         reader: new Ext.data.ArrayReader({
149         }, Ext.data.Record.create([
150    {name: 'fileid'    },
151    {name: 'filenameid'},
152    {name: 'pathid'    },
153    {name: 'jobid'     },
154    {name: 'name'      },
155    {name: 'size',     type: 'int'  },
156    {name: 'mtime',    type: 'date', dateFormat: 'Y-m-d h:i:s'}
157         ]))
158    });
159
160    var cm = new Ext.grid.ColumnModel([{
161            id:        'name', // id assigned so we can apply custom css (e.g. .x-grid-col-topic b { color:#333 })
162            header:    'File',
163            dataIndex: 'name',
164            width:     200,
165            css:       'white-space:normal;'
166         },{
167            header:    "Size",
168            dataIndex: 'size',
169            renderer:  human_size,
170            width:     50
171         },{
172            header:    "Date",
173            dataIndex: 'mtime',
174            renderer: Ext.util.Format.dateRenderer('Y-m-d h:i'),
175            width:     100
176         },{
177            dataIndex: 'pathid',
178            hidden: true
179         },{
180            dataIndex: 'filenameid',
181            hidden: true
182         },{
183            dataIndex: 'fileid',
184            hidden: true
185         },{
186            dataIndex: 'jobid',
187            hidden: true
188         }
189         ]);
190
191     // by default columns are sortable
192    cm.defaultSortable = true;
193     // create the grid
194    var files_grid = new Ext.grid.Grid('div-files', {
195         ds: file_store,
196         cm: cm,
197         ddGroup : 'TreeDD',
198         enableDrag: true,
199         enableDragDrop: true,
200         selModel: new Ext.grid.RowSelectionModel(),
201                 loadMask: true,
202         autoSizeColumns: true,
203         enableColLock:false
204         
205     });
206     // when we reload the view,
207     // we clear the file version box
208     file_store.on('beforeload', function(e) {
209         file_versions_store.removeAll();
210         return true;
211     });
212
213     // TODO: selection only when using dblclick
214     files_grid.selModel.on('rowselect', function(e,i,r) { 
215         if (r.json[4] == '.') {
216                         return true;
217                 }
218         Ext.brestore.filename = r.json[4];
219         file_versions_store.load({params:init_params({action: 'list_versions',
220                                                      vafv: Ext.brestore.option_vafv,
221                                                      pathid: r.json[2],
222                                                      filenameid: r.json[1]
223                                                      })
224                                  });
225         return true;
226     });
227
228 //////////////////////////////////////////////////////////////:
229
230   var file_selection_store = new Ext.data.Store({
231         proxy: new Ext.data.MemoryProxy(),
232
233         reader: new Ext.data.ArrayReader({
234         }, Ext.data.Record.create([
235    {name: 'jobid'     },
236    {name: 'fileid'    },
237    {name: 'filenameid'},
238    {name: 'pathid'    },
239    {name: 'name'      },
240    {name: 'size',     type: 'int'  },
241    {name: 'mtime',    type: 'date', dateFormat: 'Y-m-d h:i:s'}
242         ]))
243    });
244
245    var file_selection_cm = new Ext.grid.ColumnModel([{
246            id:        'name', // id assigned so we can apply custom css (e.g. .x-grid-col-topic b { color:#333 })
247            header:    "Name",
248            dataIndex: 'name',
249            width:     250
250         },{
251            header:    "JobId",
252            width:     50,
253            dataIndex: 'jobid'
254         },{
255            header:    "Size",
256            dataIndex: 'size',
257            renderer:  human_size,
258            width:     50
259         },{
260            header:    "Date",
261            dataIndex: 'mtime',
262            renderer: Ext.util.Format.dateRenderer('Y-m-d h:i'),
263            width:     100
264         },{
265            dataIndex: 'pathid',
266            header: 'PathId',
267            hidden: true
268         },{
269            dataIndex: 'filenameid',
270            hidden: true
271         },{
272            dataIndex: 'fileid',
273            header: 'FileId',
274            hidden: true
275         }
276         ]);
277
278
279     // create the grid
280    var file_selection_grid = new Ext.grid.Grid('div-file-selection', {
281         cm: file_selection_cm,
282         ds: file_selection_store,
283         ddGroup : 'TreeDD',
284         enableDrag: false,
285         enableDrop: true,
286         selModel: new Ext.grid.RowSelectionModel(),
287         loadMask: true,
288         enableColLock:false
289     });
290
291     var file_selection_record = Ext.data.Record.create(
292       {name: 'jobid'},
293       {name: 'fileid'},
294       {name: 'filenameid'},
295       {name: 'pathid'},
296       {name: 'size'},
297       {name: 'mtime'}
298     );
299 // data.selections[0].json[]
300 // data.node.id
301 // http://extjs.com/forum/showthread.php?t=12582&highlight=drag+drop
302     var ddrow = new Ext.dd.DropTarget(file_selection_grid.container, {
303         ddGroup : 'TreeDD',
304         copy:false,
305         notifyDrop : function(dd, e, data){
306            var r;
307            if (data.selections) {
308              if (data.grid.id == 'div-files') {
309                  for(var i=0;i<data.selections.length;i++) {
310                     r = new file_selection_record({
311                       jobid:     data.selections[0].json[3],
312                       fileid:    data.selections[i].json[0],
313                       filenameid:data.selections[i].json[1],
314                       pathid:    data.selections[i].json[2],
315                       name: Ext.brestore.path + data.selections[i].json[4],
316                       size:      data.selections[i].json[5],
317                       mtime:     data.selections[i].json[6]
318                     });
319                     file_selection_store.add(r)
320                  }
321              }
322
323              if (data.grid.id == 'div-file-versions') {
324                     r = new file_selection_record({
325                       jobid:     data.selections[0].json[3],
326                       fileid:    data.selections[0].json[0],
327                       filenameid:data.selections[0].json[1],
328                       pathid:    data.selections[0].json[2],
329                       name: Ext.brestore.path + Ext.brestore.filename,
330                       size:      data.selections[0].json[7],
331                       mtime:     data.selections[0].json[8]     
332                     });
333                     file_selection_store.add(r)
334              }
335            }
336   
337            if (data.node) {
338               var path= get_node_path(data.node);
339               r = new file_selection_record({
340                       jobid:     data.node.attributes.jobid,
341                       fileid:    0,
342                       filenameid:0,
343                       pathid:    data.node.id,
344                       name:      path,
345                       size:      4096,
346                       mtime:     0
347               });
348               file_selection_store.add(r)
349            }
350   
351            return true;
352     }});
353
354    file_selection_grid.on('enddrag', function(dd,e) { 
355         alert(e) ; return true;
356     });
357    file_selection_grid.on('notifyDrop', function(dd,e) { 
358         alert(e) ; return true;
359     });
360    func1 = function(e,b,c) { 
361                 if (e.browserEvent.keyCode == 46) {
362                         for (elt in file_selection_grid.getSelectionModel().getSelections()) {
363                                 alert(elt);
364 //                              file_selection_store.remove(elt);
365                         }
366                 } 
367         };
368    file_selection_grid.on('keypress', func1);
369 ///////////////////////////////////////////////////////
370
371   var file_versions_store = new Ext.data.Store({
372         proxy: new Ext.data.HttpProxy({
373             url: '/cgi-bin/bweb/bresto.pl',
374             method: 'GET',
375             params:{offset:0, limit:50 }
376         }),
377
378         reader: new Ext.data.ArrayReader({
379         }, Ext.data.Record.create([
380    {name: 'fileid'    },
381    {name: 'filenameid'},
382    {name: 'pathid'    },
383    {name: 'jobid'     },
384    {name: 'volume'    },
385    {name: 'inchanger' },
386    {name: 'md5'       },
387    {name: 'size',     type: 'int'  },
388    {name: 'mtime',    type: 'date', dateFormat: 'Y-m-d h:i:s'}
389         ]))
390    });
391
392    var file_versions_cm = new Ext.grid.ColumnModel([{
393            id:        'name', // id assigned so we can apply custom css (e.g. .x-grid-col-topic b { color:#333 })
394            dataIndex: 'name',
395            hidden: true
396         },{
397            header:    "InChanger",
398            dataIndex: 'inchanger',
399            width:     60,
400            renderer:  rd_vol_is_online
401         },{
402            header:    "Volume",
403            dataIndex: 'volume'
404         },{
405            header:    "JobId",
406            width:     50,
407            dataIndex: 'jobid'
408         },{
409            header:    "Size",
410            dataIndex: 'size',
411            renderer:  human_size,
412            width:     50
413         },{
414            header:    "Date",
415            dataIndex: 'mtime',
416            renderer: Ext.util.Format.dateRenderer('Y-m-d h:i'),
417            width:     100
418         },{
419            header:    "MD5",
420            dataIndex: 'md5',
421            width:     160
422         },{
423            header:    "pathid",
424            dataIndex: 'pathid',
425            hidden: true
426         },{
427            header:    "filenameid",
428            dataIndex: 'filenameid',
429            hidden: true
430         },{
431            header:    "fileid",
432            dataIndex: 'fileid',
433            hidden: true
434         }
435    ]);
436
437     // by default columns are sortable
438    file_versions_cm.defaultSortable = true;
439
440     // create the grid
441    var file_versions_grid = new Ext.grid.Grid('div-file-versions', {
442         ds: file_versions_store,
443         cm: file_versions_cm,
444         ddGroup : 'TreeDD',
445         enableDrag: true,
446         enableDrop: false,
447         selModel: new Ext.grid.RowSelectionModel(),
448         loadMask: true,
449         enableColLock:false
450         
451     });
452
453     file_versions_grid.on('rowdblclick', function(e) { 
454         alert(e) ; file_versions_store.removeAll(); return true;
455     });
456
457 //////////////////////////////////////////////////////////////:
458
459
460     var client_store = new Ext.data.Store({
461         proxy: new Ext.data.HttpProxy({
462             url: '/cgi-bin/bweb/bresto.pl',
463             method: 'GET',
464             params:{action:'list_client'}
465         }),
466
467         reader: new Ext.data.ArrayReader({
468         }, Ext.data.Record.create([
469            {name: 'name' }
470         ]))
471     });
472
473     var client_combo = new Ext.form.ComboBox({
474         fieldLabel: 'Clients',
475         store: client_store,
476         displayField:'name',
477         typeAhead: true,
478         mode: 'local',
479         triggerAction: 'all',
480         emptyText:'Select a client...',
481         selectOnFocus:true,
482         forceSelection: true,
483         width:135
484     });
485
486     client_combo.on('valid', function(e) { 
487         Ext.brestore.client = e.getValue();
488         Ext.brestore.jobid=0;
489         Ext.brestore.jobdate = '';
490         Ext.brestore.root_path='';
491         job_combo.clearValue();
492         file_store.removeAll();
493         file_versions_store.removeAll();
494         root.collapse(false, false);
495         while(root.firstChild){
496             root.removeChild(root.firstChild);
497         }
498         job_store.load( {params:{action: 'list_job',
499                                  client:Ext.brestore.client}});
500         return true;
501     });
502
503 //////////////////////////////////////////////////////////////:
504
505     var job_store = new Ext.data.Store({
506         proxy: new Ext.data.HttpProxy({
507             url: '/cgi-bin/bweb/bresto.pl',
508             method: 'GET',
509             params:{offset:0, limit:50 }
510         }),
511
512         reader: new Ext.data.ArrayReader({
513         }, Ext.data.Record.create([
514            {name: 'jobid' },
515            {name: 'date'  },
516            {name: 'jobname' }
517         ]))
518     });
519
520     var job_combo = new Ext.form.ComboBox({
521         fieldLabel: 'Jobs',
522         store: job_store,
523         displayField:'jobname',
524         typeAhead: true,
525         mode: 'local',
526         triggerAction: 'all',
527         emptyText:'Select a job...',
528         selectOnFocus:true,
529                 loadMask: true,
530         forceSelection: true,
531         width:350
532     });
533
534     job_combo.on('select', function(e,c) {
535         Ext.brestore.jobid = c.json[0];
536         Ext.brestore.jobdate = c.json[1];
537         Ext.brestore.root_path='';
538         root.setText("Root");
539         tree_loader.baseParams = init_params({init:1, action: 'list_dirs'});
540         root.reload();
541     });
542
543 ////////////////////////////////////////////////////////////////
544
545     function sel_option(item, check)
546     {
547         if (item.id == 'id_vosb') {
548            Ext.brestore.option_vosb = check;
549         }
550         if (item.id == 'id_vafv') {
551            Ext.brestore.option_vafv = check;
552         }
553     }
554
555     var menu = new Ext.menu.Menu({
556         id: 'div-main-menu',
557         items: [ 
558            new Ext.menu.CheckItem({
559                 id: 'id_vosb',
560                 text: 'View only selected backup',
561                 checked: Ext.brestore.option_vosb,
562                 checkHandler: sel_option
563             }),
564            new Ext.menu.CheckItem({
565                 id: 'id_vafv',
566                 text: 'View all file versions',
567                 checked: Ext.brestore.option_vafv,
568                 checkHandler: sel_option
569             })
570         ]
571     });
572 ////////////////////////////////////////////////////////////////:
573
574     // create the primary toolbar
575     var tb2 = new Ext.Toolbar('div-tb-sel');
576
577     var where_field = new Ext.form.TextField({
578             fieldLabel: 'Location',
579             name: 'where',
580             width:175,
581             allowBlank:false
582     });
583
584     var tb = new Ext.Toolbar('div-toolbar', [
585         client_combo,
586         job_combo,
587         '-',
588         {
589           id: 'tb_home',
590 //        icon: '/bweb/up.gif',
591           text: 'Change location',
592           cls:'x-btn-text-icon',
593           handler: function() { 
594                 var where = where_field.getValue();
595                 Ext.brestore.root_path=where;
596                 root.setText(where);
597                 tree_loader.baseParams = init_params({ action:'list_dirs', path: where });
598                 root.reload();
599           }
600         },
601         where_field,
602         '-',
603         {
604             cls: 'x-btn-text-icon bmenu', // icon and text class
605             text:'Options',
606             menu: menu  // assign menu by instance
607         },
608         {
609             icon: '/bweb/mR.png', // icons can also be specified inline
610             cls: 'x-btn-icon',
611             title: 'restore',
612             handler: function() { 
613                 if (Ext.brestore.dlglaunch) {
614                    Ext.brestore.dlglaunch.show();
615                    return 0;
616                 }
617                 Ext.brestore.dlglaunch = new Ext.LayoutDialog("div-resto-dlg", {
618 //                        modal:true,
619                         width:600,
620                         height:500,
621                         shadow:true,
622                         minWidth:300,
623                         minHeight:300,
624                         proxyDrag: true,
625 //                        west: {
626 //                              split:true,
627 //                              initialSize: 150,
628 //                              minSize: 100,
629 //                              maxSize: 250,
630 //                              titlebar: true,
631 //                              collapsible: true,
632 //                              animate: true
633 //                          },
634                         center: {
635                                 autoScroll:true,
636 //                              tabPosition: 'top',
637 //                              closeOnTab: true,
638 //                              alwaysShowTabs: true
639                         }
640                 });
641
642     var fs = new Ext.form.Form({
643         labelAlign: 'right',
644         labelWidth: 80
645     });
646
647 //    var resto_store = new Ext.data.Store({
648 //        proxy: new Ext.data.HttpProxy({
649 //            url: '/cgi-bin/bweb/bresto.pl',
650 //            method: 'GET',
651 //            params:{action:'list_resto'}
652 //        }),
653 //
654 //        reader: new Ext.data.ArrayReader({
655 //        }, Ext.data.Record.create([
656 //           {name: 'name' }
657 //        ]))
658 //    });
659
660     var rclient_combo = new Ext.form.ComboBox({
661             value: Ext.brestore.client,
662             fieldLabel: 'Client',
663             hiddenName:'client',
664             store: client_store,
665             displayField:'name',
666             typeAhead: true,
667             mode: 'local',
668             triggerAction: 'all',
669             emptyText:'Select a client...',
670             selectOnFocus:true,
671             width:190
672         });
673     var where_text = new Ext.form.TextField({
674             fieldLabel: 'Where',
675             name: 'where',
676             value: '/tmp/bacula-restore',
677             width:190
678         });
679     var stripprefix_text = new Ext.form.TextField({
680             fieldLabel: 'Strip prefix',
681             name: 'strip_prefix',
682             value: '',
683             disabled: 1,
684             width:190
685         });
686     var addsuffix_text = new Ext.form.TextField({
687             fieldLabel: 'Add suffix',
688             name: 'add_suffix',
689             value: '',
690             disabled: 1,
691             width:190
692         });
693     var addprefix_text = new Ext.form.TextField({
694             fieldLabel: 'Add prefix',
695             name: 'add_prefix',
696             value: '',
697             disabled: 1,
698             width:190
699         });
700     var rwhere_text = new Ext.form.TextField({
701             fieldLabel: 'Where regexp',
702             name: 'regexp_where',
703             value: '',
704             disabled: 1,
705             width:190
706         });
707     var usefilerelocation_bp = new Ext.form.Checkbox({
708             fieldLabel: 'Use file relocation',
709             name: 'use_relocation',
710             checked: 0
711     });
712     var useregexp_bp = new Ext.form.Checkbox({
713             fieldLabel: 'Use regexp',
714             name: 'use_regexp',
715             disabled: 1,
716             checked: 0 
717     });
718     usefilerelocation_bp.on('check', function(bp,state) {
719        if (state) {
720           where_text.disable();
721           useregexp_bp.enable();
722           if (useregexp_bp.getValue()) {
723              addsuffix_text.disable();
724              addprefix_text.disable();
725              stripprefix_text.disable();
726              rwhere_text.enable();
727           } else {
728              addsuffix_text.enable();
729              addprefix_text.enable();
730              stripprefix_text.enable();
731              rwhere_text.disable();
732           }
733        } else {
734           where_text.enable();
735           addsuffix_text.disable();
736           addprefix_text.disable();
737           stripprefix_text.disable();
738           useregexp_bp.disable();
739           rwhere_text.disable();
740        }
741     }); 
742
743     useregexp_bp.on('check', function(bp,state) {
744        if (state) {
745           addsuffix_text.disable();
746           addprefix_text.disable();
747           stripprefix_text.disable();
748           rwhere_text.enable();
749        } else {
750           addsuffix_text.enable();
751           addprefix_text.enable();
752           stripprefix_text.enable();
753           rwhere_text.disable();
754        }
755     }); 
756
757
758     var storage_store = new Ext.data.Store({
759         proxy: new Ext.data.HttpProxy({
760             url: '/cgi-bin/bweb/bresto.pl',
761             method: 'GET',
762             params:{action:'list_storage'}
763         }),
764
765         reader: new Ext.data.ArrayReader({
766         }, Ext.data.Record.create([
767            {name: 'name' }
768         ]))
769     });
770     var storage_combo = new Ext.form.ComboBox({
771             fieldLabel: 'Storage',
772             hiddenName:'storage',
773             store: storage_store,
774             displayField:'name',
775             typeAhead: true,
776             mode: 'local',
777             triggerAction: 'all',
778             emptyText:'Select a storage...',
779             selectOnFocus:true,
780             width:190
781         });
782 ////////////////////////////////////////////////////////////////
783   var media_store = new Ext.data.Store({
784         proxy: new Ext.data.HttpProxy({
785             url: '/cgi-bin/bweb/bresto.pl',
786             method: 'GET',
787             params:{offset:0, limit:50 }
788         }),
789
790         reader: new Ext.data.ArrayReader({
791         }, Ext.data.Record.create([
792    {name: 'volumename'},
793    {name: 'enabled'   },
794    {name: 'inchanger' }
795         ]))
796    });
797
798    var media_cm = new Ext.grid.ColumnModel([{
799            header:    "InChanger",
800            dataIndex: 'inchanger',
801            width:     60,
802            renderer:  rd_vol_is_online
803         }, {
804            header:    "Volume",
805            id:        'volumename', 
806            dataIndex: 'volumename',
807            width:     140
808         }
809    ]);
810
811     // create the grid
812    var media_grid = new Ext.grid.Grid('div-media', {
813         ds: media_store,
814         cm: media_cm,
815         enableDrag: false,
816         enableDrop: false,
817         loadMask: true,
818         width: 200,
819         enableColLock:false        
820     });
821
822     var items = file_selection_store.data.items;
823     var tab_fileid=new Array();
824     var tab_jobid=new Array();
825     for(var i=0;i<items.length;i++) {
826        if (items[i].data['fileid']) {
827           tab_fileid.push(items[i].data['fileid']);
828        }
829        tab_jobid.push(items[i].data['jobid']);
830     }
831     var res = tab_fileid.join(",");
832     var res2 = tab_jobid.join(",");
833
834 ////////////////////////////////////////////////////////////////
835     fs.fieldset(
836         {legend:'Media needed'},
837         media_grid
838     );
839     fs.fieldset(
840         {legend:'Restore options'},
841         new Ext.form.ComboBox({
842             fieldLabel: 'Replace',
843             hiddenName:'replace',
844             store: new Ext.data.SimpleStore({
845                  fields: ['replace'],
846                  data : [['always'],['never'],['if newer']]
847             }),
848             displayField:'replace',
849             typeAhead: true,
850             mode: 'local',
851             triggerAction: 'all',
852             emptyText:'never',
853             selectOnFocus:true,
854             width:190
855         }),
856 //
857 //        new Ext.form.ComboBox({
858 //            fieldLabel: 'job',
859 //            hiddenName:'job',
860 //            store: resto_store,
861 //            displayField:'name',
862 //            typeAhead: true,
863 //            mode: 'local',
864 //            triggerAction: 'all',
865 //            emptyText:'Select a job...',
866 //            selectOnFocus:true,
867 //            width:190
868 //        }),
869
870         rclient_combo,
871         storage_combo,
872         where_text
873         );
874     fs.fieldset(
875         {legend:'File relocation'},
876         usefilerelocation_bp,
877         stripprefix_text,
878         addprefix_text,
879         addsuffix_text,
880         useregexp_bp,
881         rwhere_text
882     );
883     media_store.baseParams = init_params({action: 'get_media', jobid: res2, fileid: res});
884     media_store.load();
885     storage_store.load({params:{action: 'list_storage'}});
886 //  resto_store.load({params:{action: 'list_resto'}});
887     fs.render('div-resto-form');
888
889 //      var f = new Ext.form.BasicForm('div-resto-form', {url: '/bweb/test', method: 'GET',
890 //                                                      baseParams: {init: 1}
891 //                                                     }
892 //                                     );
893
894     var launch_restore = function() {
895         var items = file_selection_store.data.items;
896         var tab_fileid=new Array();
897         var tab_dirid=new Array();
898         var tab_jobid=new Array();
899         for(var i=0;i<items.length;i++) {
900                 if (items[i].data['fileid']) {
901                         tab_fileid.push(items[i].data['fileid']);
902                 } else {
903                         tab_dirid.push(items[i].data['pathid']);
904                 }
905                 tab_jobid.push(items[i].data['jobid']);
906         }
907         var res = ';fileid=' + tab_fileid.join(";fileid=");
908         var res2 = ';dirid=' + tab_dirid.join(";dirid=");
909         var res3 = ';jobid=' + tab_jobid.join(";jobid=");
910
911         var res4 = ';client=' + rclient_combo.getValue();
912         if (storage_combo.getValue()) {
913            res4 = res4 + ';storage=' + storage_combo.getValue();
914         }
915         if (usefilerelocation_bp.getValue()) {
916            if (useregexp_bp.getValue()) {
917               res4 = res4 + ';regexwhere=' + rwhere_text.getValue();
918            } else {
919               var reg = new Array();
920               if (stripprefix_text.getValue()) {
921                  reg.push('!' + stripprefix_text.getValue() + '!!i');
922               }
923               if (addprefix_text.getValue()) {
924                  reg.push('!^!' + addprefix_text.getValue() + '!');
925               }
926               if (addsuffix_text.getValue()) {
927                  reg.push('!([^/])$!$1' + addsuffix_text.getValue() + '!');
928               }
929               res4 = res4 + ';regexwhere=' + reg.join(',');
930            }
931         } else {
932            res4 = res4 + ';where=' + where_text.getValue();
933         }
934         window.location='/cgi-bin/bweb/bresto.pl?action=restore' + res + res2 + res3 + res4;
935     } // end launch_restore
936
937     var dialog = Ext.brestore.dlglaunch;
938     dialog.addKeyListener(27, dialog.hide, dialog);
939     dialog.addButton('Submit', launch_restore);
940     dialog.addButton('Close', dialog.hide, dialog);
941     
942     var layout = dialog.getLayout();
943     layout.beginUpdate();
944     layout.add('center', new Ext.ContentPanel('div-resto-form', {
945                                 autoCreate:true, title: 'Third Tab', closable:true, background:true}));
946     layout.endUpdate();
947     dialog.show();
948
949     }
950   }
951  ]);
952
953 ////////////////////////////////////////////////////////////////
954
955     var layout = new Ext.BorderLayout(document.body, {
956         north: {
957 //            split: true
958         },
959         south: {
960             split: true, initialSize: 300
961         },
962         east: {
963             split: true, initialSize: 550
964         },
965         west: {
966             split: true, initialSize: 300
967         },
968         center: {
969             initialSize: 450
970         }        
971         
972     });
973
974 layout.beginUpdate();
975   layout.add('north', new Ext.ContentPanel('div-toolbar', {
976       fitToFrame: true, autoCreate:true,closable: false 
977   }));
978   layout.add('south', new Ext.ContentPanel('div-file-selection', {
979       toolbar: tb2,resizeEl:'div-file-selection',
980       fitToFrame: true, autoCreate:true,closable: false
981   }));
982   layout.add('east', new Ext.ContentPanel('div-file-versions', {
983       fitToFrame: true, autoCreate:true,closable: false
984   }));
985   layout.add('west', new Ext.ContentPanel('div-tree', {
986       autoScroll:true, fitToFrame: true, 
987       autoCreate:true,closable: false
988   }));
989   layout.add('center', new Ext.ContentPanel('div-files', {
990       autoScroll:true,autoCreate:true,fitToFrame: true
991   }));
992 layout.endUpdate();     
993
994
995 ////////////////////////////////////////////////////////////////
996
997 //    job_store.load();
998     client_store.load({params:{action: 'list_client'}});
999 //    file_store.load({params:{offset:0, limit:50}});
1000 //    file_versions_store.load({params:{offset:0, limit:50}});
1001 //    file_selection_store.load();
1002    files_grid.render();
1003    file_selection_grid.render();
1004    file_versions_grid.render();
1005
1006 }
1007 Ext.onReady( ext_init );