]> git.sur5r.net Git - bacula/bacula/blob - gui/bweb/html/bresto.js
ebl update to use the new gettext method
[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                                              node:node.id})
128                        });
129         return true;
130     });
131
132     tree.on('beforeload', function(e) {
133         file_store.removeAll();
134         return true;
135     });
136
137
138 ////////////////////////////////////////////////////////////////
139
140   var file_store = new Ext.data.Store({
141         proxy: new Ext.data.HttpProxy({
142             url: '/cgi-bin/bweb/bresto.pl',
143             method: 'GET',
144             params:{}
145         }),
146
147         reader: new Ext.data.ArrayReader({
148         }, Ext.data.Record.create([
149    {name: 'fileid'    },
150    {name: 'filenameid'},
151    {name: 'pathid'    },
152    {name: 'jobid'     },
153    {name: 'name'      },
154    {name: 'size',     type: 'int'  },
155    {name: 'mtime',    type: 'date', dateFormat: 'Y-m-d h:i:s'}
156         ]))
157    });
158
159    var cm = new Ext.grid.ColumnModel([{
160            id:        'name', // id assigned so we can apply custom css (e.g. .x-grid-col-topic b { color:#333 })
161            header:    'File',
162            dataIndex: 'name',
163            width:     200,
164            css:       'white-space:normal;'
165         },{
166            header:    "Size",
167            dataIndex: 'size',
168            renderer:  human_size,
169            width:     50
170         },{
171            header:    "Date",
172            dataIndex: 'mtime',
173            renderer: Ext.util.Format.dateRenderer('Y-d-m h:i:s'),
174            width:     100
175         },{
176            dataIndex: 'pathid',
177            hidden: true
178         },{
179            dataIndex: 'filenameid',
180            hidden: true
181         },{
182            dataIndex: 'fileid',
183            hidden: true
184         },{
185            dataIndex: 'jobid',
186            hidden: true
187         }
188         ]);
189
190     // by default columns are sortable
191    cm.defaultSortable = true;
192     // create the grid
193    var files_grid = new Ext.grid.Grid('div-files', {
194         ds: file_store,
195         cm: cm,
196         ddGroup : 'TreeDD',
197         enableDrag: true,
198         enableDragDrop: true,
199         selModel: new Ext.grid.RowSelectionModel(),
200         loadMask: true,
201         autoSizeColumns: true,
202         enableColLock:false
203         
204     });
205     // when we reload the view,
206     // we clear the file version box
207     file_store.on('beforeload', function(e) {
208         file_versions_store.removeAll();
209         return true;
210     });
211
212     // TODO: selection only when using dblclick
213     files_grid.selModel.on('rowselect', function(e,i,r) { 
214         Ext.brestore.filename = r.json[4];
215         file_versions_store.load({params:init_params({action: 'list_versions',
216                                                      vafv: Ext.brestore.option_vafv,
217                                                      pathid: r.json[2],
218                                                      filenameid: r.json[1]
219                                                      })
220                                  });
221         return true;
222     });
223     files_grid.render();
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    file_selection_grid.render();
358
359 ///////////////////////////////////////////////////////
360
361   var file_versions_store = new Ext.data.Store({
362         proxy: new Ext.data.HttpProxy({
363             url: '/cgi-bin/bweb/bresto.pl',
364             method: 'GET',
365             params:{offset:0, limit:50 }
366         }),
367
368         reader: new Ext.data.ArrayReader({
369         }, Ext.data.Record.create([
370    {name: 'fileid'    },
371    {name: 'filenameid'},
372    {name: 'pathid'    },
373    {name: 'jobid'     },
374    {name: 'volume'    },
375    {name: 'inchanger' },
376    {name: 'md5'       },
377    {name: 'size',     type: 'int'  },
378    {name: 'mtime',    type: 'date', dateFormat: 'Y-m-d h:i:s'}
379         ]))
380    });
381
382    var file_versions_cm = new Ext.grid.ColumnModel([{
383            id:        'name', // id assigned so we can apply custom css (e.g. .x-grid-col-topic b { color:#333 })
384            dataIndex: 'name',
385            hidden: true
386         },{
387            header:    "InChanger",
388            dataIndex: 'inchanger',
389            width:     60,
390            renderer:  rd_vol_is_online
391         },{
392            header:    "Volume",
393            dataIndex: 'volume'
394         },{
395            header:    "JobId",
396            width:     50,
397            dataIndex: 'jobid'
398         },{
399            header:    "Size",
400            dataIndex: 'size',
401            renderer:  human_size,
402            width:     50
403         },{
404            header:    "Date",
405            dataIndex: 'mtime',
406            renderer: Ext.util.Format.dateRenderer('Y-d-m h:i:s'),
407            width:     100
408         },{
409            header:    "MD5",
410            dataIndex: 'md5',
411            width:     160
412         },{
413            header:    "pathid",
414            dataIndex: 'pathid',
415            hidden: true
416         },{
417            header:    "filenameid",
418            dataIndex: 'filenameid',
419            hidden: true
420         },{
421            header:    "fileid",
422            dataIndex: 'fileid',
423            hidden: true
424         }
425    ]);
426
427     // by default columns are sortable
428    file_versions_cm.defaultSortable = true;
429
430     // create the grid
431    var file_versions_grid = new Ext.grid.Grid('div-file-versions', {
432         ds: file_versions_store,
433         cm: file_versions_cm,
434         ddGroup : 'TreeDD',
435         enableDrag: true,
436         enableDrop: false,
437         selModel: new Ext.grid.RowSelectionModel(),
438         loadMask: true,
439         enableColLock:false
440         
441     });
442
443     file_versions_grid.on('rowdblclick', function(e) { 
444         alert(e) ; file_versions_store.removeAll(); return true;
445     });
446     file_versions_grid.render();
447
448 //////////////////////////////////////////////////////////////:
449
450
451     var client_store = new Ext.data.Store({
452         proxy: new Ext.data.HttpProxy({
453             url: '/cgi-bin/bweb/bresto.pl',
454             method: 'GET',
455             params:{action:'list_client'}
456         }),
457
458         reader: new Ext.data.ArrayReader({
459         }, Ext.data.Record.create([
460            {name: 'name' }
461         ]))
462     });
463
464     var client_combo = new Ext.form.ComboBox({
465         fieldLabel: 'Clients',
466         store: client_store,
467         displayField:'name',
468         typeAhead: true,
469         mode: 'local',
470         triggerAction: 'all',
471         emptyText:'Select a client...',
472         selectOnFocus:true,
473         forceSelection: true,
474         width:135
475     });
476
477     client_combo.on('valid', function(e) { 
478         Ext.brestore.client = e.getValue();
479         Ext.brestore.jobid=0;
480         Ext.brestore.jobdate = '';
481         Ext.brestore.root_path='';
482         job_combo.clearValue();
483         file_store.removeAll();
484         file_versions_store.removeAll();
485         root.collapse(false, false);
486         while(root.firstChild){
487             root.removeChild(root.firstChild);
488         }
489         job_store.load( {params:{action: 'list_job',
490                                  client:Ext.brestore.client}});
491         return true;
492     });
493
494 //////////////////////////////////////////////////////////////:
495
496     var job_store = new Ext.data.Store({
497         proxy: new Ext.data.HttpProxy({
498             url: '/cgi-bin/bweb/bresto.pl',
499             method: 'GET',
500             params:{offset:0, limit:50 }
501         }),
502
503         reader: new Ext.data.ArrayReader({
504         }, Ext.data.Record.create([
505            {name: 'jobid' },
506            {name: 'date'  },
507            {name: 'jobname' }
508         ]))
509     });
510
511     var job_combo = new Ext.form.ComboBox({
512         fieldLabel: 'Jobs',
513         store: job_store,
514         displayField:'jobname',
515         typeAhead: true,
516         mode: 'local',
517         triggerAction: 'all',
518         emptyText:'Select a job...',
519         selectOnFocus:true,
520         forceSelection: true,
521         width:350
522     });
523
524     job_combo.on('select', function(e,c) {
525         Ext.brestore.jobid = c.json[0];
526         Ext.brestore.jobdate = c.json[1];
527         Ext.brestore.root_path='';
528         root.setText("Root");
529         tree_loader.baseParams = init_params({init:1, action: 'list_dirs'});
530         root.reload();
531     });
532
533 ////////////////////////////////////////////////////////////////
534
535     function sel_option(item, check)
536     {
537         if (item.id == 'id_vosb') {
538            Ext.brestore.option_vosb = check;
539         }
540         if (item.id == 'id_vafv') {
541            Ext.brestore.option_vafv = check;
542         }
543     }
544
545     var menu = new Ext.menu.Menu({
546         id: 'div-main-menu',
547         items: [ 
548            new Ext.menu.CheckItem({
549                 id: 'id_vosb',
550                 text: 'View only selected backup',
551                 checked: Ext.brestore.option_vosb,
552                 checkHandler: sel_option
553             }),
554            new Ext.menu.CheckItem({
555                 id: 'id_vafv',
556                 text: 'View all file versions',
557                 checked: Ext.brestore.option_vafv,
558                 checkHandler: sel_option
559             })
560         ]
561     });
562 ////////////////////////////////////////////////////////////////:
563
564     // create the primary toolbar
565     var tb2 = new Ext.Toolbar('div-tb-sel');
566
567     var where_field = new Ext.form.TextField({
568             fieldLabel: 'Location',
569             name: 'where',
570             width:175,
571             allowBlank:false
572     });
573
574     var tb = new Ext.Toolbar('div-toolbar', [
575         client_combo,
576         job_combo,
577         '-',
578         {
579           id: 'tb_home',
580 //        icon: '/bweb/up.gif',
581           text: 'Change location',
582           cls:'x-btn-text-icon',
583           handler: function() { 
584                 var where = where_field.getValue();
585                 Ext.brestore.root_path=where;
586                 root.setText(where);
587                 tree_loader.baseParams = init_params({ action:'list_dirs', path: where });
588                 root.reload();
589           }
590         },
591         where_field,
592         '-',
593         {
594             cls: 'x-btn-text-icon bmenu', // icon and text class
595             text:'Options',
596             menu: menu  // assign menu by instance
597         },
598         {
599             icon: '/bweb/mR.png', // icons can also be specified inline
600             cls: 'x-btn-icon',
601             title: 'restore',
602             handler: function() { 
603                 if (Ext.brestore.dlglaunch) {
604                    Ext.brestore.dlglaunch.show();
605                    return 0;
606                 }
607                 Ext.brestore.dlglaunch = new Ext.LayoutDialog("div-resto-dlg", {
608 //                        modal:true,
609                         width:600,
610                         height:400,
611                         shadow:true,
612                         minWidth:300,
613                         minHeight:300,
614                         proxyDrag: true,
615 //                        west: {
616 //                              split:true,
617 //                              initialSize: 150,
618 //                              minSize: 100,
619 //                              maxSize: 250,
620 //                              titlebar: true,
621 //                              collapsible: true,
622 //                              animate: true
623 //                          },
624                         center: {
625                                 autoScroll:true,
626 //                              tabPosition: 'top',
627 //                              closeOnTab: true,
628 //                              alwaysShowTabs: true
629                         }
630                 });
631
632     var fs = new Ext.form.Form({
633         labelAlign: 'right',
634         labelWidth: 80
635     });
636
637 //    var resto_store = new Ext.data.Store({
638 //        proxy: new Ext.data.HttpProxy({
639 //            url: '/cgi-bin/bweb/bresto.pl',
640 //            method: 'GET',
641 //            params:{action:'list_resto'}
642 //        }),
643 //
644 //        reader: new Ext.data.ArrayReader({
645 //        }, Ext.data.Record.create([
646 //           {name: 'name' }
647 //        ]))
648 //    });
649
650     var rclient_combo = new Ext.form.ComboBox({
651             value: Ext.brestore.client,
652             fieldLabel: 'client',
653             hiddenName:'client',
654             store: client_store,
655             displayField:'name',
656             typeAhead: true,
657             mode: 'local',
658             triggerAction: 'all',
659             emptyText:'Select a client...',
660             selectOnFocus:true,
661             width:190
662         });
663     var where_text = new Ext.form.TextField({
664             fieldLabel: 'Where',
665             name: 'where',
666             value: '/tmp/bacula-restore',
667             width:190
668         });
669     var storage_store = new Ext.data.Store({
670         proxy: new Ext.data.HttpProxy({
671             url: '/cgi-bin/bweb/bresto.pl',
672             method: 'GET',
673             params:{action:'list_storage'}
674         }),
675
676         reader: new Ext.data.ArrayReader({
677         }, Ext.data.Record.create([
678            {name: 'name' }
679         ]))
680     });
681     var storage_combo = new Ext.form.ComboBox({
682             fieldLabel: 'storage',
683             hiddenName:'storage',
684             store: storage_store,
685             displayField:'name',
686             typeAhead: true,
687             mode: 'local',
688             triggerAction: 'all',
689             emptyText:'Select a storage...',
690             selectOnFocus:true,
691             width:190
692         });
693 ////////////////////////////////////////////////////////////////
694   var media_store = new Ext.data.Store({
695         proxy: new Ext.data.HttpProxy({
696             url: '/cgi-bin/bweb/bresto.pl',
697             method: 'GET',
698             params:{offset:0, limit:50 }
699         }),
700
701         reader: new Ext.data.ArrayReader({
702         }, Ext.data.Record.create([
703    {name: 'volumename'},
704    {name: 'enabled'   },
705    {name: 'inchanger' }
706         ]))
707    });
708
709    var media_cm = new Ext.grid.ColumnModel([{
710            header:    "InChanger",
711            dataIndex: 'inchanger',
712            width:     60,
713            renderer:  rd_vol_is_online
714         }, {
715            header:    "Volume",
716            id:        'volumename', 
717            dataIndex: 'volumename',
718            width:     140
719         }
720    ]);
721
722     // create the grid
723    var media_grid = new Ext.grid.Grid('div-media', {
724         ds: media_store,
725         cm: media_cm,
726         enableDrag: false,
727         enableDrop: false,
728         loadMask: true,
729         width: 200,
730         enableColLock:false        
731     });
732
733     media_grid.render();
734
735     var items = file_selection_store.data.items;
736     var tab_fileid=new Array();
737     var tab_jobid=new Array();
738     for(var i=0;i<items.length;i++) {
739        if (items[i].data['fileid']) {
740           tab_fileid.push(items[i].data['fileid']);
741        }
742        tab_jobid.push(items[i].data['jobid']);
743     }
744     var res = tab_fileid.join(",");
745     var res2 = tab_jobid.join(",");
746
747     media_store.baseParams = init_params({action: 'get_media', jobid: res2, fileid: res});
748     media_store.reload();
749
750 ////////////////////////////////////////////////////////////////
751     fs.fieldset(
752         {legend:'Media needed'},
753         media_grid
754     );
755     fs.fieldset(
756         {legend:'Restore job'},
757         new Ext.form.ComboBox({
758             fieldLabel: 'Replace',
759             hiddenName:'replace',
760             store: new Ext.data.SimpleStore({
761                  fields: ['replace'],
762                  data : [['always'],['never'],['if newer']]
763             }),
764             displayField:'replace',
765             typeAhead: true,
766             mode: 'local',
767             triggerAction: 'all',
768             emptyText:'never',
769             selectOnFocus:true,
770             width:190
771         }),
772 //
773 //        new Ext.form.ComboBox({
774 //            fieldLabel: 'job',
775 //            hiddenName:'job',
776 //            store: resto_store,
777 //            displayField:'name',
778 //            typeAhead: true,
779 //            mode: 'local',
780 //            triggerAction: 'all',
781 //            emptyText:'Select a job...',
782 //            selectOnFocus:true,
783 //            width:190
784 //        }),
785
786         rclient_combo,
787         where_text,
788         storage_combo
789     );
790     storage_store.load({params:{action: 'list_storage'}});
791 //  resto_store.load({params:{action: 'list_resto'}});
792     fs.render('div-resto-form');
793
794 //      var f = new Ext.form.BasicForm('div-resto-form', {url: '/bweb/test', method: 'GET',
795 //                                                      baseParams: {init: 1}
796 //                                                     }
797 //                                     );
798
799     var launch_restore = function() {
800         var items = file_selection_store.data.items;
801         var tab_fileid=new Array();
802         var tab_dirid=new Array();
803         var tab_jobid=new Array();
804         for(var i=0;i<items.length;i++) {
805                 if (items[i].data['fileid']) {
806                         tab_fileid.push(items[i].data['fileid']);
807                 } else {
808                         tab_dirid.push(items[i].data['pathid']);
809                 }
810                 tab_jobid.push(items[i].data['jobid']);
811         }
812         var res = ';fileid=' + tab_fileid.join(";fileid=");
813         var res2 = ';dirid=' + tab_dirid.join(";dirid=");
814         var res3 = ';jobid=' + tab_jobid.join(";jobid=");
815
816         var res4 = ';client=' + rclient_combo.getValue() + ';storage=' + storage_combo.getValue() + ';where=' + where_text.getValue();
817
818         window.location='/cgi-bin/bweb/bresto.pl?action=restore' + res + res2 + res3 + res4;
819     } // end launch_restore
820
821     var dialog = Ext.brestore.dlglaunch;
822     dialog.addKeyListener(27, dialog.hide, dialog);
823     dialog.addButton('Submit', launch_restore);
824     dialog.addButton('Close', dialog.hide, dialog);
825     
826     var layout = dialog.getLayout();
827     layout.beginUpdate();
828     layout.add('center', new Ext.ContentPanel('div-resto-form', {
829                                 autoCreate:true, title: 'Third Tab', closable:true, background:true}));
830     layout.endUpdate();
831     dialog.show();
832
833     }
834   }
835  ]);
836
837 ////////////////////////////////////////////////////////////////
838
839     var layout = new Ext.BorderLayout(document.body, {
840         north: {
841 //            split: true
842         },
843         south: {
844             split: true, initialSize: 300
845         },
846         east: {
847             split: true, initialSize: 550
848         },
849         west: {
850             split: true, initialSize: 300
851         },
852         center: {
853             initialSize: 450
854         }        
855         
856     });
857
858 layout.beginUpdate();
859   layout.add('north', new Ext.ContentPanel('div-toolbar', {
860       fitToFrame: true, autoCreate:true,closable: false 
861   }));
862   layout.add('south', new Ext.ContentPanel('div-file-selection', {
863       toolbar: tb2,resizeEl:'div-file-selection',
864       fitToFrame: true, autoCreate:true,closable: false
865   }));
866   layout.add('east', new Ext.ContentPanel('div-file-versions', {
867       fitToFrame: true, autoCreate:true,closable: false
868   }));
869   layout.add('west', new Ext.ContentPanel('div-tree', {
870       autoScroll:true, fitToFrame: true, 
871       autoCreate:true,closable: false
872   }));
873   layout.add('center', new Ext.ContentPanel('div-files', {
874       autoScroll:true,autoCreate:true,fitToFrame: true
875   }));
876 layout.endUpdate();     
877
878
879 ////////////////////////////////////////////////////////////////
880
881 //    job_store.load();
882     client_store.load({params:{action: 'list_client'}});
883 //    file_store.load({params:{offset:0, limit:50}});
884 //    file_versions_store.load({params:{offset:0, limit:50}});
885 //    file_selection_store.load();
886
887 }
888 Ext.onReady( ext_init );