]> git.sur5r.net Git - bacula/bacula/blob - gui/bweb/html/bresto.js
ebl fix replace bug
[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-d-m h:i:s'),
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         Ext.brestore.filename = r.json[4];
216         file_versions_store.load({params:init_params({action: 'list_versions',
217                                                      vafv: Ext.brestore.option_vafv,
218                                                      pathid: r.json[2],
219                                                      filenameid: r.json[1]
220                                                      })
221                                  });
222         return true;
223     });
224
225 //////////////////////////////////////////////////////////////:
226
227   var file_selection_store = new Ext.data.Store({
228         proxy: new Ext.data.MemoryProxy(),
229
230         reader: new Ext.data.ArrayReader({
231         }, Ext.data.Record.create([
232    {name: 'jobid'     },
233    {name: 'fileid'    },
234    {name: 'filenameid'},
235    {name: 'pathid'    },
236    {name: 'name'      },
237    {name: 'size',     type: 'int'  },
238    {name: 'mtime',    type: 'date', dateFormat: 'Y-m-d h:i:s'}
239         ]))
240    });
241
242    var file_selection_cm = new Ext.grid.ColumnModel([{
243            id:        'name', // id assigned so we can apply custom css (e.g. .x-grid-col-topic b { color:#333 })
244            header:    "Name",
245            dataIndex: 'name',
246            width:     250
247         },{
248            header:    "JobId",
249            width:     50,
250            dataIndex: 'jobid'
251         },{
252            header:    "Size",
253            dataIndex: 'size',
254            renderer:  human_size,
255            width:     50
256         },{
257            header:    "Date",
258            dataIndex: 'mtime',
259            renderer: Ext.util.Format.dateRenderer('Y-d-m h:i'),
260            width:     100
261         },{
262            dataIndex: 'pathid',
263            header: 'PathId'
264 //           hidden: true
265         },{
266            dataIndex: 'filenameid',
267            hidden: true
268         },{
269            dataIndex: 'fileid',
270            header: 'FileId'
271 //           hidden: true
272         }
273         ]);
274
275
276     // create the grid
277    var file_selection_grid = new Ext.grid.Grid('div-file-selection', {
278         cm: file_selection_cm,
279         ds: file_selection_store,
280         ddGroup : 'TreeDD',
281         enableDrag: false,
282         enableDrop: true,
283         selModel: new Ext.grid.RowSelectionModel(),
284         loadMask: true,
285         enableColLock:false
286     });
287
288     var file_selection_record = Ext.data.Record.create(
289       {name: 'jobid'},
290       {name: 'fileid'},
291       {name: 'filenameid'},
292       {name: 'pathid'},
293       {name: 'size'},
294       {name: 'mtime'}
295     );
296 // data.selections[0].json[]
297 // data.node.id
298 // http://extjs.com/forum/showthread.php?t=12582&highlight=drag+drop
299     var ddrow = new Ext.dd.DropTarget(file_selection_grid.container, {
300         ddGroup : 'TreeDD',
301         copy:false,
302         notifyDrop : function(dd, e, data){
303            var r;
304            if (data.selections) {
305              if (data.grid.id == 'div-files') {
306                  for(var i=0;i<data.selections.length;i++) {
307                     r = new file_selection_record({
308                       jobid:     data.selections[0].json[3],
309                       fileid:    data.selections[i].json[0],
310                       filenameid:data.selections[i].json[1],
311                       pathid:    data.selections[i].json[2],
312                       name: Ext.brestore.path + data.selections[i].json[4],
313                       size:      data.selections[i].json[5],
314                       mtime:     data.selections[i].json[6]
315                     });
316                     file_selection_store.add(r)
317                  }
318              }
319
320              if (data.grid.id == 'div-file-versions') {
321                     r = new file_selection_record({
322                       jobid:     data.selections[0].json[3],
323                       fileid:    data.selections[0].json[0],
324                       filenameid:data.selections[0].json[1],
325                       pathid:    data.selections[0].json[2],
326                       name: Ext.brestore.path + Ext.brestore.filename,
327                       size:      data.selections[0].json[7],
328                       mtime:     data.selections[0].json[8]     
329                     });
330                     file_selection_store.add(r)
331              }
332            }
333   
334            if (data.node) {
335               var path= get_node_path(data.node);
336               r = new file_selection_record({
337                       jobid:     data.node.attributes.jobid,
338                       fileid:    0,
339                       filenameid:0,
340                       pathid:    data.node.id,
341                       name:      path,
342                       size:      4096,
343                       mtime:     0
344               });
345               file_selection_store.add(r)
346            }
347   
348            return true;
349     }});
350
351    file_selection_grid.on('enddrag', function(dd,e) { 
352         alert(e) ; return true;
353     });
354    file_selection_grid.on('notifyDrop', function(dd,e) { 
355         alert(e) ; return true;
356     });
357
358 ///////////////////////////////////////////////////////
359
360   var file_versions_store = new Ext.data.Store({
361         proxy: new Ext.data.HttpProxy({
362             url: '/cgi-bin/bweb/bresto.pl',
363             method: 'GET',
364             params:{offset:0, limit:50 }
365         }),
366
367         reader: new Ext.data.ArrayReader({
368         }, Ext.data.Record.create([
369    {name: 'fileid'    },
370    {name: 'filenameid'},
371    {name: 'pathid'    },
372    {name: 'jobid'     },
373    {name: 'volume'    },
374    {name: 'inchanger' },
375    {name: 'md5'       },
376    {name: 'size',     type: 'int'  },
377    {name: 'mtime',    type: 'date', dateFormat: 'Y-m-d h:i:s'}
378         ]))
379    });
380
381    var file_versions_cm = new Ext.grid.ColumnModel([{
382            id:        'name', // id assigned so we can apply custom css (e.g. .x-grid-col-topic b { color:#333 })
383            dataIndex: 'name',
384            hidden: true
385         },{
386            header:    "InChanger",
387            dataIndex: 'inchanger',
388            width:     60,
389            renderer:  rd_vol_is_online
390         },{
391            header:    "Volume",
392            dataIndex: 'volume'
393         },{
394            header:    "JobId",
395            width:     50,
396            dataIndex: 'jobid'
397         },{
398            header:    "Size",
399            dataIndex: 'size',
400            renderer:  human_size,
401            width:     50
402         },{
403            header:    "Date",
404            dataIndex: 'mtime',
405            renderer: Ext.util.Format.dateRenderer('Y-d-m h:i:s'),
406            width:     100
407         },{
408            header:    "MD5",
409            dataIndex: 'md5',
410            width:     160
411         },{
412            header:    "pathid",
413            dataIndex: 'pathid',
414            hidden: true
415         },{
416            header:    "filenameid",
417            dataIndex: 'filenameid',
418            hidden: true
419         },{
420            header:    "fileid",
421            dataIndex: 'fileid',
422            hidden: true
423         }
424    ]);
425
426     // by default columns are sortable
427    file_versions_cm.defaultSortable = true;
428
429     // create the grid
430    var file_versions_grid = new Ext.grid.Grid('div-file-versions', {
431         ds: file_versions_store,
432         cm: file_versions_cm,
433         ddGroup : 'TreeDD',
434         enableDrag: true,
435         enableDrop: false,
436         selModel: new Ext.grid.RowSelectionModel(),
437         loadMask: true,
438         enableColLock:false
439         
440     });
441
442     file_versions_grid.on('rowdblclick', function(e) { 
443         alert(e) ; file_versions_store.removeAll(); return true;
444     });
445
446 //////////////////////////////////////////////////////////////:
447
448
449     var client_store = new Ext.data.Store({
450         proxy: new Ext.data.HttpProxy({
451             url: '/cgi-bin/bweb/bresto.pl',
452             method: 'GET',
453             params:{action:'list_client'}
454         }),
455
456         reader: new Ext.data.ArrayReader({
457         }, Ext.data.Record.create([
458            {name: 'name' }
459         ]))
460     });
461
462     var client_combo = new Ext.form.ComboBox({
463         fieldLabel: 'Clients',
464         store: client_store,
465         displayField:'name',
466         typeAhead: true,
467         mode: 'local',
468         triggerAction: 'all',
469         emptyText:'Select a client...',
470         selectOnFocus:true,
471         forceSelection: true,
472         width:135
473     });
474
475     client_combo.on('valid', function(e) { 
476         Ext.brestore.client = e.getValue();
477         Ext.brestore.jobid=0;
478         Ext.brestore.jobdate = '';
479         Ext.brestore.root_path='';
480         job_combo.clearValue();
481         file_store.removeAll();
482         file_versions_store.removeAll();
483         root.collapse(false, false);
484         while(root.firstChild){
485             root.removeChild(root.firstChild);
486         }
487         job_store.load( {params:{action: 'list_job',
488                                  client:Ext.brestore.client}});
489         return true;
490     });
491
492 //////////////////////////////////////////////////////////////:
493
494     var job_store = new Ext.data.Store({
495         proxy: new Ext.data.HttpProxy({
496             url: '/cgi-bin/bweb/bresto.pl',
497             method: 'GET',
498             params:{offset:0, limit:50 }
499         }),
500
501         reader: new Ext.data.ArrayReader({
502         }, Ext.data.Record.create([
503            {name: 'jobid' },
504            {name: 'date'  },
505            {name: 'jobname' }
506         ]))
507     });
508
509     var job_combo = new Ext.form.ComboBox({
510         fieldLabel: 'Jobs',
511         store: job_store,
512         displayField:'jobname',
513         typeAhead: true,
514         mode: 'local',
515         triggerAction: 'all',
516         emptyText:'Select a job...',
517         selectOnFocus:true,
518         forceSelection: true,
519         width:350
520     });
521
522     job_combo.on('select', function(e,c) {
523         Ext.brestore.jobid = c.json[0];
524         Ext.brestore.jobdate = c.json[1];
525         Ext.brestore.root_path='';
526         root.setText("Root");
527         tree_loader.baseParams = init_params({init:1, action: 'list_dirs'});
528         root.reload();
529     });
530
531 ////////////////////////////////////////////////////////////////
532
533     function sel_option(item, check)
534     {
535         if (item.id == 'id_vosb') {
536            Ext.brestore.option_vosb = check;
537         }
538         if (item.id == 'id_vafv') {
539            Ext.brestore.option_vafv = check;
540         }
541     }
542
543     var menu = new Ext.menu.Menu({
544         id: 'div-main-menu',
545         items: [ 
546            new Ext.menu.CheckItem({
547                 id: 'id_vosb',
548                 text: 'View only selected backup',
549                 checked: Ext.brestore.option_vosb,
550                 checkHandler: sel_option
551             }),
552            new Ext.menu.CheckItem({
553                 id: 'id_vafv',
554                 text: 'View all file versions',
555                 checked: Ext.brestore.option_vafv,
556                 checkHandler: sel_option
557             })
558         ]
559     });
560 ////////////////////////////////////////////////////////////////:
561
562     // create the primary toolbar
563     var tb2 = new Ext.Toolbar('div-tb-sel');
564
565     var where_field = new Ext.form.TextField({
566             fieldLabel: 'Location',
567             name: 'where',
568             width:175,
569             allowBlank:false
570     });
571
572     var tb = new Ext.Toolbar('div-toolbar', [
573         client_combo,
574         job_combo,
575         '-',
576         {
577           id: 'tb_home',
578 //        icon: '/bweb/up.gif',
579           text: 'Change location',
580           cls:'x-btn-text-icon',
581           handler: function() { 
582                 var where = where_field.getValue();
583                 Ext.brestore.root_path=where;
584                 root.setText(where);
585                 tree_loader.baseParams = init_params({ action:'list_dirs', path: where });
586                 root.reload();
587           }
588         },
589         where_field,
590         '-',
591         {
592             cls: 'x-btn-text-icon bmenu', // icon and text class
593             text:'Options',
594             menu: menu  // assign menu by instance
595         },
596         {
597             icon: '/bweb/mR.png', // icons can also be specified inline
598             cls: 'x-btn-icon',
599             title: 'restore',
600             handler: function() { 
601                 if (Ext.brestore.dlglaunch) {
602                    Ext.brestore.dlglaunch.show();
603                    return 0;
604                 }
605                 Ext.brestore.dlglaunch = new Ext.LayoutDialog("div-resto-dlg", {
606 //                        modal:true,
607                         width:600,
608                         height:400,
609                         shadow:true,
610                         minWidth:300,
611                         minHeight:300,
612                         proxyDrag: true,
613 //                        west: {
614 //                              split:true,
615 //                              initialSize: 150,
616 //                              minSize: 100,
617 //                              maxSize: 250,
618 //                              titlebar: true,
619 //                              collapsible: true,
620 //                              animate: true
621 //                          },
622                         center: {
623                                 autoScroll:true,
624 //                              tabPosition: 'top',
625 //                              closeOnTab: true,
626 //                              alwaysShowTabs: true
627                         }
628                 });
629
630     var fs = new Ext.form.Form({
631         labelAlign: 'right',
632         labelWidth: 80
633     });
634
635 //    var resto_store = new Ext.data.Store({
636 //        proxy: new Ext.data.HttpProxy({
637 //            url: '/cgi-bin/bweb/bresto.pl',
638 //            method: 'GET',
639 //            params:{action:'list_resto'}
640 //        }),
641 //
642 //        reader: new Ext.data.ArrayReader({
643 //        }, Ext.data.Record.create([
644 //           {name: 'name' }
645 //        ]))
646 //    });
647
648     var rclient_combo = new Ext.form.ComboBox({
649             value: Ext.brestore.client,
650             fieldLabel: 'client',
651             hiddenName:'client',
652             store: client_store,
653             displayField:'name',
654             typeAhead: true,
655             mode: 'local',
656             triggerAction: 'all',
657             emptyText:'Select a client...',
658             selectOnFocus:true,
659             width:190
660         });
661     var where_text = new Ext.form.TextField({
662             fieldLabel: 'Where',
663             name: 'where',
664             value: '/tmp/bacula-restore',
665             width:190
666         });
667     var storage_store = new Ext.data.Store({
668         proxy: new Ext.data.HttpProxy({
669             url: '/cgi-bin/bweb/bresto.pl',
670             method: 'GET',
671             params:{action:'list_storage'}
672         }),
673
674         reader: new Ext.data.ArrayReader({
675         }, Ext.data.Record.create([
676            {name: 'name' }
677         ]))
678     });
679     var storage_combo = new Ext.form.ComboBox({
680             fieldLabel: 'storage',
681             hiddenName:'storage',
682             store: storage_store,
683             displayField:'name',
684             typeAhead: true,
685             mode: 'local',
686             triggerAction: 'all',
687             emptyText:'Select a storage...',
688             selectOnFocus:true,
689             width:190
690         });
691 ////////////////////////////////////////////////////////////////
692   var media_store = new Ext.data.Store({
693         proxy: new Ext.data.HttpProxy({
694             url: '/cgi-bin/bweb/bresto.pl',
695             method: 'GET',
696             params:{offset:0, limit:50 }
697         }),
698
699         reader: new Ext.data.ArrayReader({
700         }, Ext.data.Record.create([
701    {name: 'volumename'},
702    {name: 'enabled'   },
703    {name: 'inchanger' }
704         ]))
705    });
706
707    var media_cm = new Ext.grid.ColumnModel([{
708            header:    "InChanger",
709            dataIndex: 'inchanger',
710            width:     60,
711            renderer:  rd_vol_is_online
712         }, {
713            header:    "Volume",
714            id:        'volumename', 
715            dataIndex: 'volumename',
716            width:     140
717         }
718    ]);
719
720     // create the grid
721    var media_grid = new Ext.grid.Grid('div-media', {
722         ds: media_store,
723         cm: media_cm,
724         enableDrag: false,
725         enableDrop: false,
726         loadMask: true,
727         width: 200,
728         enableColLock:false        
729     });
730
731     media_grid.render();
732
733     var items = file_selection_store.data.items;
734     var tab_fileid=new Array();
735     var tab_jobid=new Array();
736     for(var i=0;i<items.length;i++) {
737        if (items[i].data['fileid']) {
738           tab_fileid.push(items[i].data['fileid']);
739        }
740        tab_jobid.push(items[i].data['jobid']);
741     }
742     var res = tab_fileid.join(",");
743     var res2 = tab_jobid.join(",");
744
745     media_store.baseParams = init_params({action: 'get_media', jobid: res2, fileid: res});
746     media_store.reload();
747
748 ////////////////////////////////////////////////////////////////
749     fs.fieldset(
750         {legend:'Media needed'},
751         media_grid
752     );
753     fs.fieldset(
754         {legend:'Restore job'},
755         new Ext.form.ComboBox({
756             fieldLabel: 'Replace',
757             hiddenName:'replace',
758             store: new Ext.data.SimpleStore({
759                  fields: ['replace'],
760                  data : [['always'],['never'],['if newer']]
761             }),
762             displayField:'replace',
763             typeAhead: true,
764             mode: 'local',
765             triggerAction: 'all',
766             emptyText:'never',
767             selectOnFocus:true,
768             width:190
769         }),
770 //
771 //        new Ext.form.ComboBox({
772 //            fieldLabel: 'job',
773 //            hiddenName:'job',
774 //            store: resto_store,
775 //            displayField:'name',
776 //            typeAhead: true,
777 //            mode: 'local',
778 //            triggerAction: 'all',
779 //            emptyText:'Select a job...',
780 //            selectOnFocus:true,
781 //            width:190
782 //        }),
783
784         rclient_combo,
785         where_text,
786         storage_combo
787     );
788     storage_store.load({params:{action: 'list_storage'}});
789 //  resto_store.load({params:{action: 'list_resto'}});
790     fs.render('div-resto-form');
791
792 //      var f = new Ext.form.BasicForm('div-resto-form', {url: '/bweb/test', method: 'GET',
793 //                                                      baseParams: {init: 1}
794 //                                                     }
795 //                                     );
796
797     var launch_restore = function() {
798         var items = file_selection_store.data.items;
799         var tab_fileid=new Array();
800         var tab_dirid=new Array();
801         var tab_jobid=new Array();
802         for(var i=0;i<items.length;i++) {
803                 if (items[i].data['fileid']) {
804                         tab_fileid.push(items[i].data['fileid']);
805                 } else {
806                         tab_dirid.push(items[i].data['pathid']);
807                 }
808                 tab_jobid.push(items[i].data['jobid']);
809         }
810         var res = ';fileid=' + tab_fileid.join(";fileid=");
811         var res2 = ';dirid=' + tab_dirid.join(";dirid=");
812         var res3 = ';jobid=' + tab_jobid.join(";jobid=");
813
814         var res4 = ';client=' + rclient_combo.getValue() + ';storage=' + storage_combo.getValue() + ';where=' + where_text.getValue();
815
816         window.location='/cgi-bin/bweb/bresto.pl?action=restore' + res + res2 + res3 + res4;
817     } // end launch_restore
818
819     var dialog = Ext.brestore.dlglaunch;
820     dialog.addKeyListener(27, dialog.hide, dialog);
821     dialog.addButton('Submit', launch_restore);
822     dialog.addButton('Close', dialog.hide, dialog);
823     
824     var layout = dialog.getLayout();
825     layout.beginUpdate();
826     layout.add('center', new Ext.ContentPanel('div-resto-form', {
827                                 autoCreate:true, title: 'Third Tab', closable:true, background:true}));
828     layout.endUpdate();
829     dialog.show();
830
831     }
832   }
833  ]);
834
835 ////////////////////////////////////////////////////////////////
836
837     var layout = new Ext.BorderLayout(document.body, {
838         north: {
839 //            split: true
840         },
841         south: {
842             split: true, initialSize: 300
843         },
844         east: {
845             split: true, initialSize: 550
846         },
847         west: {
848             split: true, initialSize: 300
849         },
850         center: {
851             initialSize: 450
852         }        
853         
854     });
855
856 layout.beginUpdate();
857   layout.add('north', new Ext.ContentPanel('div-toolbar', {
858       fitToFrame: true, autoCreate:true,closable: false 
859   }));
860   layout.add('south', new Ext.ContentPanel('div-file-selection', {
861       toolbar: tb2,resizeEl:'div-file-selection',
862       fitToFrame: true, autoCreate:true,closable: false
863   }));
864   layout.add('east', new Ext.ContentPanel('div-file-versions', {
865       fitToFrame: true, autoCreate:true,closable: false
866   }));
867   layout.add('west', new Ext.ContentPanel('div-tree', {
868       autoScroll:true, fitToFrame: true, 
869       autoCreate:true,closable: false
870   }));
871   layout.add('center', new Ext.ContentPanel('div-files', {
872       autoScroll:true,autoCreate:true,fitToFrame: true
873   }));
874 layout.endUpdate();     
875
876
877 ////////////////////////////////////////////////////////////////
878
879 //    job_store.load();
880     client_store.load({params:{action: 'list_client'}});
881 //    file_store.load({params:{offset:0, limit:50}});
882 //    file_versions_store.load({params:{offset:0, limit:50}});
883 //    file_selection_store.load();
884    files_grid.render();
885    file_selection_grid.render();
886    file_versions_grid.render();
887
888 }
889 Ext.onReady( ext_init );