1 // Bweb - A Bacula web interface
2 // Bacula® - The Network Backup Solution
4 // Copyright (C) 2000-2008 Free Software Foundation Europe e.V.
6 // The main author of Bweb is Eric Bollengier.
7 // The main author of Bacula is Kern Sibbald, with contributions from
8 // many others, a complete list can be found in the file AUTHORS.
10 // This program is Free Software; you can redistribute it and/or
11 // modify it under the terms of version two of the GNU General Public
12 // License as published by the Free Software Foundation plus additions
13 // that are listed in the file LICENSE.
15 // This program is distributed in the hope that it will be useful, but
16 // WITHOUT ANY WARRANTY; without even the implied warranty of
17 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 // General Public License for more details.
20 // You should have received a copy of the GNU General Public License
21 // along with this program; if not, write to the Free Software
22 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
25 // Bacula® is a registered trademark of John Walker.
26 // The licensor of Bacula is the Free Software Foundation Europe
27 // (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zurich,
28 // Switzerland, email:ftf@fsfeurope.org.
30 // render if vol is online/offline
31 function rd_vol_is_online(val)
33 return '<img src="inflag' + val + '.png">';
36 // TODO: fichier ou rep
37 function rd_file_or_dir(val)
40 return '<img src="A.png">';
42 return '<img src="R.png">';
46 Ext.namespace('Ext.brestore');
47 Ext.brestore.jobid=0; // selected jobid
48 Ext.brestore.jobdate=''; // selected date
49 Ext.brestore.client=''; // selected client
50 Ext.brestore.rclient=''; // selected client for resto
51 Ext.brestore.storage=''; // selected storage for resto
52 Ext.brestore.path=''; // current path (without user location)
53 Ext.brestore.pathid=0; // current pathid
54 Ext.brestore.root_path=''; // user location
55 Ext.brestore.media_store; // media store
56 Ext.brestore.option_vosb = false;
57 Ext.brestore.option_vafv = false;
58 Ext.brestore.option_vcopies = false;
59 Ext.brestore.dlglaunch;
60 Ext.brestore.fpattern;
61 Ext.brestore.use_filerelocation=false;
62 Ext.brestore.limit = 2000;
63 Ext.brestore.offset = 0;
64 Ext.brestore.force_reload = 0;
66 function get_node_path(node)
69 for (var p = node; p; p = p.parentNode) {
74 temp = p.text + '/' + temp;
78 return Ext.brestore.root_path + temp;
81 function init_params(baseParams)
83 baseParams['client']= Ext.brestore.client;
85 if (Ext.brestore.option_vosb) {
86 baseParams['jobid'] = Ext.brestore.jobid;
88 baseParams['date'] = Ext.brestore.jobdate;
90 baseParams['offset'] = Ext.brestore.offset;
91 baseParams['limit'] = Ext.brestore.limit;
92 if (Ext.brestore.fpattern) {
93 if (RegExp(Ext.brestore.fpattern)) {
94 baseParams['pattern'] = Ext.brestore.fpattern;
100 function captureEvents(observable) {
101 Ext.util.Observable.capture(
103 function(eventName) {
104 console.info(eventName);
110 ////////////////////////////////////////////////////////////////
112 Ext.BLANK_IMAGE_URL = 'ext/resources/images/default/s.gif';
113 Ext.onReady(function(){
114 if (!Ext.version || Ext.version < 2.2) {
115 alert("You must upgrade your extjs version to 2.2");
119 Ext.QuickTips.init();
121 // Init tree for directory selection
122 var tree_loader = new Ext.tree.TreeLoader({
124 dataUrl:'/cgi-bin/bweb/bresto.pl'
127 var tree = new Ext.tree.TreePanel({
131 enableDragDrop: true,
132 containerScroll: true,
133 title: 'Directories',
138 var root = new Ext.tree.AsyncTreeNode({
139 text: 'Select a client then a job',
143 tree.setRootNode(root);
144 Ext.brestore.tree = root; // shortcut
146 var click_cb = function(node, event) {
147 Ext.brestore.path = get_node_path(node);
148 Ext.brestore.pathid = node.id;
149 Ext.brestore.offset=0;
150 Ext.brestore.fpattern = Ext.get('txt-file-pattern').getValue();
151 where_field.setValue(Ext.brestore.path);
153 file_store.load({params:init_params({action: 'list_files',
154 path:Ext.brestore.path,
160 tree.on('click', click_cb);
162 tree.on('beforeload', function(e,b) {
164 // file_store.removeAll();
167 tree.on('load', function(n,e) {
174 ////////////////////////////////////////////////////////////////
176 var file_store = new Ext.data.Store({
177 proxy: new Ext.data.HttpProxy({
178 url: '/cgi-bin/bweb/bresto.pl',
183 reader: new Ext.data.ArrayReader({},
184 Ext.data.Record.create([
186 {name: 'filenameid'},
190 {name: 'size', type: 'int' },
191 {name: 'mtime', type: 'date', dateFormat: 'Y-m-d h:i:s'}
194 Ext.brestore.file_store=file_store;
195 var cm = new Ext.grid.ColumnModel([{
196 id: 'cm-id', // id assigned so we can apply custom css
197 // (e.g. .x-grid-col-topic b { color:#333 })
201 css: 'white-space:normal;'
205 renderer: human_size,
210 renderer: Ext.util.Format.dateRenderer('Y-m-d h:i'),
217 header: "FilenameId",
218 dataIndex: 'filenameid',
230 // by default columns are sortable
231 cm.defaultSortable = true;
234 function update_limits() {
235 Ext.get('txt-file-offset').dom.value = Ext.brestore.offset;
236 Ext.get('txt-file-limit').dom.value = Ext.brestore.offset + Ext.brestore.limit;
239 // get limits from user input
240 function update_user_limits() {
241 var off = parseInt(Ext.get('txt-file-offset').getValue());
242 var lim = parseInt(Ext.get('txt-file-limit').getValue());
243 if (off >= 0 && lim >= 0 && off < lim) {
244 Ext.brestore.offset = off;
245 Ext.brestore.limit = lim - off;
249 Ext.brestore.fpattern = Ext.get('txt-file-pattern').getValue();
252 var file_paging_next = new Ext.Toolbar.Button({
254 icon: '/bweb/ext/resources/images/default/grid/page-next.gif',
257 handler: function(a,b,c) {
258 update_user_limits();
259 if (file_store.getCount() >= Ext.brestore.limit) {
260 Ext.brestore.offset += Ext.brestore.limit;
261 file_store.removeAll();
262 file_versions_store.removeAll();
263 file_store.load({params:init_params({action: 'list_files',
264 path:Ext.brestore.path,
265 node:Ext.brestore.pathid})
270 var file_paging_prev = new Ext.Toolbar.Button({
272 icon: '/bweb/ext/resources/images/default/grid/page-prev.gif',
275 handler: function() {
276 update_user_limits();
277 if (Ext.brestore.offset > 0) {
278 Ext.brestore.offset -= Ext.brestore.limit;
279 if (Ext.brestore.offset < 0) {
280 Ext.brestore.offset=0;
282 file_store.removeAll();
283 file_versions_store.removeAll();
284 file_store.load({params:init_params({action: 'list_files',
285 path:Ext.brestore.path,
286 node:Ext.brestore.pathid})
291 var file_paging_pattern = new Ext.form.TextField({
292 enableKeyEvents: true,
293 id: 'txt-file-pattern',
296 file_paging_pattern.on('keyup', function(a, e) {
297 if (e.getKey() == e. ENTER) {
299 var pattern = file_paging_pattern.getValue();
301 re = new RegExp(pattern, "i");
304 file_store.filter('name', re);
306 file_store.clearFilter(false);
310 var file_paging = new Ext.Toolbar({
311 items: [file_paging_prev, {
312 id: 'txt-file-offset',
313 xtype: 'numberfield',
315 value: Ext.brestore.offset
320 id: 'txt-file-limit',
321 xtype: 'numberfield',
323 value: Ext.brestore.limit
324 }, file_paging_next, '->', file_paging_pattern, {
326 icon: '/bweb/ext/resources/images/default/grid/refresh.gif',
329 handler: function(a,b,c) {
330 update_user_limits();
331 file_store.removeAll();
332 file_versions_store.removeAll();
333 file_store.load({params:init_params({action: 'list_files',
334 path:Ext.brestore.path,
335 node:Ext.brestore.pathid})
340 var file_grid = new Ext.grid.GridPanel({
345 enableDragDrop: true,
346 selModel: new Ext.grid.RowSelectionModel(),
348 autoSizeColumns: true,
351 title: 'Directory content',
354 Ext.brestore.file_grid=file_grid;
355 // when we reload the view,
356 // we clear the file version box
357 file_store.on('beforeload', function(e) {
358 file_store.removeAll();
359 file_versions_store.removeAll();
363 // If we have more than limit elements, we can
364 // display the next button
365 file_store.on('load', function(e,o) {
367 if (e.getCount() >= Ext.brestore.limit) {
368 file_paging_next.enable();
370 file_paging_next.disable();
373 if (Ext.brestore.offset) {
374 file_paging_prev.enable();
376 file_paging_prev.disable();
382 * file_store.on('loadexception', function(obj, options, response, e){
383 * console.info('store loadexception, arguments:', arguments);
384 * console.info('error = ', e);
387 * file_store.on('load', function(store, records, options){
388 * //store is loaded, now you can work with it's records, etc.
389 * console.info('store load, arguments:', arguments);
390 * console.info('Store count = ', store.getCount());
393 // TODO: selection only when using dblclick
394 file_grid.selModel.on('rowselect', function(e,i,r) {
395 if (r.json[4] == '.') {
398 Ext.brestore.filename = r.json[4];
399 file_versions_store.load({
400 params:init_params({action: 'list_versions',
401 vafv: Ext.brestore.option_vafv,
402 vcopies: Ext.brestore.option_vcopies,
404 filenameid: r.json[1]
410 ////////////////////////////////////////////////////////////////
412 var file_selection_store = new Ext.data.Store({
413 proxy: new Ext.data.MemoryProxy(),
415 reader: new Ext.data.ArrayReader({},
416 Ext.data.Record.create([
419 {name: 'filenameid'},
422 {name: 'size', type: 'int' },
423 {name: 'mtime'}//, type: 'date', dateFormat: 'Y-m-d h:i:s'}
427 var file_selection_cm = new Ext.grid.ColumnModel([
429 id: 'file-selection-id',
440 renderer: human_size,
445 // renderer: Ext.util.Format.dateRenderer('Y-m-d h:i'),
452 header: 'Filenameid',
453 dataIndex: 'filenameid',
463 var file_selection_grid = new Ext.grid.GridPanel({
464 colModel: file_selection_cm,
465 store: file_selection_store,
467 enableDragDrop: false,
468 selModel: new Ext.grid.RowSelectionModel(),
477 var file_selection_record = Ext.data.Record.create(
480 {name: 'filenameid'},
485 // captureEvents(file_selection_grid);
486 // captureEvents(file_selection_store);
488 func1 = function(e,b,c) {
489 if (e.browserEvent.keyCode == 46) {
490 var m = file_selection_grid.getSelections();
492 for(var i = 0, len = m.length; i < len; i++){
493 file_selection_store.remove(m[i]);
498 file_selection_grid.on('keypress', func1);
500 ////////////////////////////////////////////////////////////////
502 var file_versions_store = new Ext.data.Store({
503 proxy: new Ext.data.HttpProxy({
504 url: '/cgi-bin/bweb/bresto.pl',
506 params:{offset:0, limit:50 }
509 reader: new Ext.data.ArrayReader({},
510 Ext.data.Record.create([
512 {name: 'filenameid'},
516 {name: 'inchanger' },
518 {name: 'size', type: 'int' },
519 {name: 'mtime', type: 'date', dateFormat: 'Y-m-d h:i:s'}
523 var file_versions_cm = new Ext.grid.ColumnModel([{
524 id: 'file-version-id',
529 dataIndex: 'inchanger',
531 renderer: rd_vol_is_online
543 renderer: human_size,
548 renderer: Ext.util.Format.dateRenderer('Y-m-d h:i'),
559 header: "filenameid",
560 dataIndex: 'filenameid',
568 // by default columns are sortable
569 file_versions_cm.defaultSortable = true;
572 var file_versions_grid = new Ext.grid.GridPanel({
573 id: 'div-file-versions',
574 store: file_versions_store,
575 colModel: file_versions_cm,
577 enableDragDrop: true,
578 selModel: new Ext.grid.RowSelectionModel(),
582 title: 'File version',
586 file_versions_grid.on('rowdblclick', function(e) {
587 alert(e) ; file_versions_store.removeAll(); return true;
591 ////////////////////////////////////////////////////////////////
593 var client_store = new Ext.data.Store({
594 proxy: new Ext.data.HttpProxy({
595 url: '/cgi-bin/bweb/bresto.pl',
597 params:{action:'list_client'}
600 reader: new Ext.data.ArrayReader({
601 }, Ext.data.Record.create([
606 var client_combo = new Ext.form.ComboBox({
607 fieldLabel: 'Clients',
612 triggerAction: 'all',
613 emptyText:'Select a client...',
615 forceSelection: true,
619 var replace_store = new Ext.data.SimpleStore({
620 fields: ['value', 'text'],
621 data : [['never', 'Never'],['always', 'Always']]
624 var replace_combo = new Ext.form.ComboBox({
625 fieldLabel: 'Replace',
626 store: replace_store,
630 triggerAction: 'all',
631 emptyText:'Replace mode...',
633 forceSelection: true,
637 client_combo.on('valid', function(e) {
638 Ext.brestore.client = e.getValue();
639 Ext.brestore.jobid=0;
640 Ext.brestore.jobdate = '';
641 Ext.brestore.root_path='';
642 Ext.brestore.offset=0;
643 job_combo.clearValue();
644 file_store.removeAll();
645 file_versions_store.removeAll();
646 root.collapse(false, false);
647 while(root.firstChild){
648 root.removeChild(root.firstChild);
650 job_store.load( {params:{action: 'list_job',
651 client:Ext.brestore.client}});
655 //////////////////////////////////////////////////////////////:
657 var job_store = new Ext.data.Store({
658 proxy: new Ext.data.HttpProxy({
659 url: '/cgi-bin/bweb/bresto.pl',
661 params:{offset:0, limit:50 }
664 reader: new Ext.data.ArrayReader({
665 }, Ext.data.Record.create([
672 var job_combo = new Ext.form.ComboBox({
675 displayField: 'jobname',
677 triggerAction: 'all',
678 emptyText: 'Select a job...',
682 forceSelection: true,
686 job_combo.on('select', function(e,c) {
687 Ext.brestore.jobid = c.json[0];
688 Ext.brestore.jobdate = c.json[1];
689 Ext.brestore.root_path='';
690 root.setText("Root");
691 tree_loader.baseParams = init_params({init:1, action: 'list_dirs'});
695 var where_field = new Ext.form.TextField({
696 fieldLabel: 'Location',
702 function sel_option(item, check)
704 if (item.id == 'id_vosb') {
705 Ext.brestore.option_vosb = check;
707 if (item.id == 'id_vafv') {
708 Ext.brestore.option_vafv = check;
710 if (item.id == 'id_vcopies') {
711 Ext.brestore.option_vcopies = check;
715 var menu = new Ext.menu.Menu({
718 new Ext.menu.CheckItem({
720 text: 'View only selected backup',
721 checked: Ext.brestore.option_vosb,
722 checkHandler: sel_option
724 new Ext.menu.CheckItem({
726 text: 'View all file versions',
727 checked: Ext.brestore.option_vafv,
728 checkHandler: sel_option
730 new Ext.menu.CheckItem({
732 text: 'View copies version',
733 checked: Ext.brestore.option_vcopies,
734 checkHandler: sel_option
739 var tb = new Ext.Toolbar({
745 text: 'Change location',
746 cls:'x-btn-text-icon',
747 handler: function() {
748 var where = where_field.getValue();
750 Ext.MessageBox.show({
751 title: 'Bad parameter',
752 msg: 'Location is empty!',
753 buttons: Ext.MessageBox.OK,
754 icon: Ext.MessageBox.ERROR
758 Ext.brestore.root_path=where;
760 tree_loader.baseParams = init_params({
761 action:'list_dirs', path: where
769 iconCls: 'bmenu', // <-- icon
770 menu: menu // assign menu by instance
773 { // TODO: put this button on south panel
774 icon: '/bweb/mR.png', // icons can also be specified inline
775 cls: 'x-btn-text-icon',
776 tooltip: 'Run restore',
778 handler: function() {
779 if (!file_selection_store.data.items.length) {
780 Ext.MessageBox.show({
781 title: 'Empty selection',
782 msg: 'Your object selection list is empty!',
783 buttons: Ext.MessageBox.OK,
784 icon: Ext.MessageBox.ERROR
793 ////////////////////////////////////////////////////////////////
795 // Define Main interface
796 var MainView = new Ext.Viewport({
798 title: 'Bacula Web Restore',
801 renderTo: Ext.getBody(),
813 title: 'Directories',
819 title: 'Directory content',
825 title: 'File version',
829 items: file_versions_grid
832 title: 'Restore selection',
836 items: file_selection_grid
839 client_store.load({params:{action: 'list_client'}});
841 // data.selections[0].json[]
843 // http://extjs.com/forum/showthread.php?t=12582&highlight=drag+drop
845 var horror_show1 = file_selection_grid.getView().el.dom;
846 var ddrow = new Ext.dd.DropTarget(horror_show1, {
849 notifyDrop : function(dd, e, data){
850 console.info("DropTarget");
852 if (data.selections) {
853 if (data.grid.id == 'div-files') {
854 for(var i=0;i<data.selections.length;i++) {
855 r = new file_selection_record({
856 jobid: data.selections[0].json[3],
857 fileid: data.selections[i].json[0],
858 filenameid:data.selections[i].json[1],
859 pathid: data.selections[i].json[2],
860 name: Ext.brestore.path + data.selections[i].json[4],
861 size: data.selections[i].json[5],
862 mtime: data.selections[i].json[6]
864 file_selection_store.add(r);
868 if (data.grid.id == 'div-file-versions') {
869 r = new file_selection_record({
870 jobid: data.selections[0].json[3],
871 fileid: data.selections[0].json[0],
872 filenameid:data.selections[0].json[1],
873 pathid: data.selections[0].json[2],
874 name: Ext.brestore.path + Ext.brestore.filename,
875 size: data.selections[0].json[7],
876 mtime: data.selections[0].json[8]
878 file_selection_store.add(r)
883 var path= get_node_path(data.node);
884 r = new file_selection_record({
885 jobid: data.node.attributes.jobid,
888 pathid: data.node.id,
893 file_selection_store.add(r)
899 function force_reload_media_store() {
900 Ext.brestore.force_reload = 1;
901 reload_media_store();
902 Ext.brestore.force_reload = 0;
905 function reload_media_store() {
906 var items = file_selection_store.data.items;
907 var tab_fileid=new Array();
908 var tab_dirid=new Array();
909 var tab_jobid=new Array();
910 var enable_compute=false;
911 for(var i=0;i<items.length;i++) {
912 if (items[i].data['fileid']) {
913 tab_fileid.push(items[i].data['fileid']);
915 tab_dirid.push(items[i].data['pathid']);
918 tab_jobid.push(items[i].data['jobid']);
920 var res = tab_fileid.join(",");
921 var res2 = tab_jobid.join(",");
922 var res3 = tab_dirid.join(",");
924 Ext.brestore.media_store.baseParams = init_params({
929 force: Ext.brestore.force_reload
931 Ext.brestore.media_store.load();
932 if (enable_compute) {
933 Ext.get('reload_media').show();
935 Ext.get('reload_media').hide();
939 function display_run_job() {
940 if (Ext.brestore.dlglaunch) {
941 reload_media_store();
942 Ext.brestore.dlglaunch.show();
945 var rclient_combo = new Ext.form.ComboBox({
946 value: Ext.brestore.client,
947 fieldLabel: 'Client',
953 triggerAction: 'all',
954 emptyText:'Select a client...',
955 forceSelection: true,
956 value: Ext.brestore.client,
959 var where_text = new Ext.form.TextField({
962 value: '/tmp/bacula-restore'
964 var stripprefix_text = new Ext.form.TextField({
965 fieldLabel: 'Strip prefix',
966 name: 'strip_prefix',
970 var addsuffix_text = new Ext.form.TextField({
971 fieldLabel: 'Add suffix',
976 var addprefix_text = new Ext.form.TextField({
977 fieldLabel: 'Add prefix',
982 var rwhere_text = new Ext.form.TextField({
983 fieldLabel: 'Where regexp',
984 name: 'regexp_where',
988 var useregexp_bp = new Ext.form.Checkbox({
989 fieldLabel: 'Use regexp',
993 handler: function(bp,state) {
995 addsuffix_text.disable();
996 addprefix_text.disable();
997 stripprefix_text.disable();
998 rwhere_text.enable();
1000 addsuffix_text.enable();
1001 addprefix_text.enable();
1002 stripprefix_text.enable();
1003 rwhere_text.disable();
1008 var usefilerelocation_bp = new Ext.form.Checkbox({
1009 fieldLabel: 'Use file relocation',
1010 name: 'use_relocation',
1014 usefilerelocation_bp.on('check', function(bp,state) {
1016 where_text.disable();
1017 useregexp_bp.enable();
1018 if (useregexp_bp.getValue()) {
1019 addsuffix_text.disable();
1020 addprefix_text.disable();
1021 stripprefix_text.disable();
1022 rwhere_text.enable();
1024 addsuffix_text.enable();
1025 addprefix_text.enable();
1026 stripprefix_text.enable();
1027 rwhere_text.disable();
1030 where_text.enable();
1031 addsuffix_text.disable();
1032 addprefix_text.disable();
1033 stripprefix_text.disable();
1034 useregexp_bp.disable();
1035 rwhere_text.disable();
1039 useregexp_bp.on('check', function(bp,state) {
1041 addsuffix_text.disable();
1042 addprefix_text.disable();
1043 stripprefix_text.disable();
1044 rwhere_text.enable();
1046 addsuffix_text.enable();
1047 addprefix_text.enable();
1048 stripprefix_text.enable();
1049 rwhere_text.disable();
1053 var media_store = Ext.brestore.media_store = new Ext.data.Store({
1054 proxy: new Ext.data.HttpProxy({
1055 url: '/cgi-bin/bweb/bresto.pl',
1057 params:{offset:0, limit:50 }
1060 reader: new Ext.data.ArrayReader({
1061 }, Ext.data.Record.create([
1062 {name: 'volumename'},
1064 {name: 'inchanger' }
1068 var media_cm = new Ext.grid.ColumnModel(
1070 header: "InChanger",
1071 dataIndex: 'inchanger',
1073 renderer: rd_vol_is_online
1077 dataIndex: 'volumename',
1083 var media_grid = new Ext.grid.GridPanel({
1084 id: 'div-media-grid',
1087 enableDragDrop: false,
1094 var form_panel = new Ext.FormPanel({
1095 labelWidth : 75, // label settings here cascade unless overridden
1097 bodyStyle : 'padding:5px 5px 0',
1099 // autoHeight : true,
1105 bodyStyle : 'padding:5px 5px 0',
1106 deferredRender : false,
1109 title : 'Restore details',
1112 title : 'Restore options',
1114 defaults : {width: 210},
1115 bodyStyle : 'padding:5px 5px 0',
1116 items :[ rclient_combo, where_text, replace_combo ]
1119 title : 'Media needed',
1121 defaults : {width: 280},
1122 bodyStyle : 'padding:5px 5px 0',
1123 items :[ media_grid,
1124 {xtype: 'button', id: 'reload_media',
1125 text: 'Compute with directories',
1126 tooltip: 'Can take long time...',
1127 handler:force_reload_media_store}]
1134 title : 'File relocation',
1136 defaults : {width: 210},
1137 bodyStyle : 'padding:5px 5px 0',
1138 items :[ usefilerelocation_bp, stripprefix_text,
1139 addprefix_text, addsuffix_text, useregexp_bp,
1143 title : 'Other options',
1145 defaults : {width: 210},
1146 bodyStyle : 'padding:5px 5px 0',
1147 defaultType : 'textfield',
1152 tooltip: 'YYY-MM-DD HH:MM'
1155 fieldLabel: 'Priority',
1165 handler: function() {
1166 if(!form_panel.getForm().isValid()) { alert("invalid") }
1167 else { launch_restore() }
1171 handler: function() { Ext.brestore.dlglaunch.hide(); }
1175 Ext.brestore.dlglaunch = new Ext.Window({
1176 applyTo : 'resto-div',
1177 title : 'Restore selection',
1181 closeAction :'hide',
1186 // Ext.brestore.dlglaunch.addKeyListener(27,
1187 // Ext.brestore.dlglaunch.hide,
1188 // Ext.brestore.dlglaunch);
1190 * var storage_store = new Ext.data.Store({
1191 * proxy: new Ext.data.HttpProxy({
1192 * url: '/cgi-bin/bweb/bresto.pl',
1194 * params:{action:'list_storage'}
1197 * reader: new Ext.data.ArrayReader({
1198 * }, Ext.data.Record.create([
1203 ////////////////////////////////////////////////////////////////
1205 function launch_restore() {
1206 var items = file_selection_store.data.items;
1207 var tab_fileid=new Array();
1208 var tab_dirid=new Array();
1209 var tab_jobid=new Array();
1210 for(var i=0;i<items.length;i++) {
1211 if (items[i].data['fileid']) {
1212 tab_fileid.push(items[i].data['fileid']);
1214 tab_dirid.push(items[i].data['pathid']);
1216 tab_jobid.push(items[i].data['jobid']);
1218 var res = ';fileid=' + tab_fileid.join(";fileid=");
1219 var res2 = ';dirid=' + tab_dirid.join(";dirid=");
1220 var res3 = ';jobid=' + tab_jobid.join(";jobid=");
1222 var res4 = ';client=' + rclient_combo.getValue();
1223 // if (storage_combo.getValue()) {
1224 // res4 = res4 + ';storage=' + storage_combo.getValue();
1226 if (Ext.brestore.use_filerelocation) {
1227 if (useregexp_bp.getValue()) {
1228 res4 = res4 + ';regexwhere=' + rwhere_text.getValue();
1230 var reg = new Array();
1231 if (stripprefix_text.getValue()) {
1232 reg.push('!' + stripprefix_text.getValue() + '!!i');
1234 if (addprefix_text.getValue()) {
1235 reg.push('!^!' + addprefix_text.getValue() + '!');
1237 if (addsuffix_text.getValue()) {
1238 reg.push('!([^/])$!$1' + addsuffix_text.getValue() + '!');
1240 res4 = res4 + ';regexwhere=' + reg.join(',');
1243 res4 = res4 + ';where=' + where_text.getValue();
1245 window.location='/cgi-bin/bweb/bresto.pl?action=restore' + res + res2 + res3 + res4;
1246 } // end launch_restore
1249 ////////////////////////////////////////////////////////////////
1250 reload_media_store();
1251 Ext.brestore.dlglaunch.show();
1252 // storage_store.load({params:{action: 'list_storage'}});