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 Kern Sibbald.
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){
851 if (data.selections) {
852 if (data.grid.id == 'div-files') {
853 for(var i=0;i<data.selections.length;i++) {
854 r = new file_selection_record({
855 jobid: data.selections[0].json[3],
856 fileid: data.selections[i].json[0],
857 filenameid:data.selections[i].json[1],
858 pathid: data.selections[i].json[2],
859 name: Ext.brestore.path + data.selections[i].json[4],
860 size: data.selections[i].json[5],
861 mtime: data.selections[i].json[6]
863 file_selection_store.add(r);
867 if (data.grid.id == 'div-file-versions') {
868 r = new file_selection_record({
869 jobid: data.selections[0].json[3],
870 fileid: data.selections[0].json[0],
871 filenameid:data.selections[0].json[1],
872 pathid: data.selections[0].json[2],
873 name: Ext.brestore.path + Ext.brestore.filename,
874 size: data.selections[0].json[7],
875 mtime: data.selections[0].json[8]
877 file_selection_store.add(r)
882 var path= get_node_path(data.node);
883 r = new file_selection_record({
884 jobid: data.node.attributes.jobid,
887 pathid: data.node.id,
892 file_selection_store.add(r)
898 function force_reload_media_store() {
899 Ext.brestore.force_reload = 1;
900 reload_media_store();
901 Ext.brestore.force_reload = 0;
904 function reload_media_store() {
905 var items = file_selection_store.data.items;
906 var tab_fileid=new Array();
907 var tab_dirid=new Array();
908 var tab_jobid=new Array();
909 var enable_compute=false;
910 for(var i=0;i<items.length;i++) {
911 if (items[i].data['fileid']) {
912 tab_fileid.push(items[i].data['fileid']);
914 tab_dirid.push(items[i].data['pathid']);
917 tab_jobid.push(items[i].data['jobid']);
919 var res = tab_fileid.join(",");
920 var res2 = tab_jobid.join(",");
921 var res3 = tab_dirid.join(",");
923 Ext.brestore.media_store.baseParams = init_params({
928 force: Ext.brestore.force_reload
930 Ext.brestore.media_store.load();
931 if (enable_compute) {
932 Ext.get('reload_media').show();
934 Ext.get('reload_media').hide();
938 function display_run_job() {
939 if (Ext.brestore.dlglaunch) {
940 reload_media_store();
941 Ext.brestore.dlglaunch.show();
944 var rclient_combo = new Ext.form.ComboBox({
945 value: Ext.brestore.client,
946 fieldLabel: 'Client',
952 triggerAction: 'all',
953 emptyText:'Select a client...',
954 forceSelection: true,
955 value: Ext.brestore.client,
958 var where_text = new Ext.form.TextField({
961 value: '/tmp/bacula-restore'
963 var stripprefix_text = new Ext.form.TextField({
964 fieldLabel: 'Strip prefix',
965 name: 'strip_prefix',
969 var addsuffix_text = new Ext.form.TextField({
970 fieldLabel: 'Add suffix',
975 var addprefix_text = new Ext.form.TextField({
976 fieldLabel: 'Add prefix',
981 var rwhere_text = new Ext.form.TextField({
982 fieldLabel: 'Where regexp',
983 name: 'regexp_where',
987 var useregexp_bp = new Ext.form.Checkbox({
988 fieldLabel: 'Use regexp',
992 handler: function(bp,state) {
994 addsuffix_text.disable();
995 addprefix_text.disable();
996 stripprefix_text.disable();
997 rwhere_text.enable();
999 addsuffix_text.enable();
1000 addprefix_text.enable();
1001 stripprefix_text.enable();
1002 rwhere_text.disable();
1007 var usefilerelocation_bp = new Ext.form.Checkbox({
1008 fieldLabel: 'Use file relocation',
1009 name: 'use_relocation',
1013 usefilerelocation_bp.on('check', function(bp,state) {
1015 where_text.disable();
1016 useregexp_bp.enable();
1017 if (useregexp_bp.getValue()) {
1018 addsuffix_text.disable();
1019 addprefix_text.disable();
1020 stripprefix_text.disable();
1021 rwhere_text.enable();
1023 addsuffix_text.enable();
1024 addprefix_text.enable();
1025 stripprefix_text.enable();
1026 rwhere_text.disable();
1029 where_text.enable();
1030 addsuffix_text.disable();
1031 addprefix_text.disable();
1032 stripprefix_text.disable();
1033 useregexp_bp.disable();
1034 rwhere_text.disable();
1038 useregexp_bp.on('check', function(bp,state) {
1040 addsuffix_text.disable();
1041 addprefix_text.disable();
1042 stripprefix_text.disable();
1043 rwhere_text.enable();
1045 addsuffix_text.enable();
1046 addprefix_text.enable();
1047 stripprefix_text.enable();
1048 rwhere_text.disable();
1052 var media_store = Ext.brestore.media_store = new Ext.data.Store({
1053 proxy: new Ext.data.HttpProxy({
1054 url: '/cgi-bin/bweb/bresto.pl',
1056 params:{offset:0, limit:50 }
1059 reader: new Ext.data.ArrayReader({
1060 }, Ext.data.Record.create([
1061 {name: 'volumename'},
1063 {name: 'inchanger' }
1067 var media_cm = new Ext.grid.ColumnModel(
1069 header: "InChanger",
1070 dataIndex: 'inchanger',
1072 renderer: rd_vol_is_online
1076 dataIndex: 'volumename',
1082 var media_grid = new Ext.grid.GridPanel({
1083 id: 'div-media-grid',
1086 enableDragDrop: false,
1093 var form_panel = new Ext.FormPanel({
1094 labelWidth : 75, // label settings here cascade unless overridden
1096 bodyStyle : 'padding:5px 5px 0',
1098 // autoHeight : true,
1104 bodyStyle : 'padding:5px 5px 0',
1105 deferredRender : false,
1108 title : 'Restore details',
1111 title : 'Restore options',
1113 defaults : {width: 210},
1114 bodyStyle : 'padding:5px 5px 0',
1115 items :[ rclient_combo, where_text, replace_combo ]
1118 title : 'Media needed',
1120 defaults : {width: 280},
1121 bodyStyle : 'padding:5px 5px 0',
1122 items :[ media_grid,
1123 {xtype: 'button', id: 'reload_media',
1124 text: 'Compute with directories',
1125 tooltip: 'Can take long time...',
1126 handler:force_reload_media_store}]
1133 title : 'File relocation',
1135 defaults : {width: 210},
1136 bodyStyle : 'padding:5px 5px 0',
1137 items :[ usefilerelocation_bp, stripprefix_text,
1138 addprefix_text, addsuffix_text, useregexp_bp,
1142 title : 'Other options',
1144 defaults : {width: 210},
1145 bodyStyle : 'padding:5px 5px 0',
1146 defaultType : 'textfield',
1151 tooltip: 'YYY-MM-DD HH:MM'
1154 fieldLabel: 'Priority',
1164 handler: function() {
1165 if(!form_panel.getForm().isValid()) { alert("invalid") }
1166 else { launch_restore() }
1170 handler: function() { Ext.brestore.dlglaunch.hide(); }
1174 Ext.brestore.dlglaunch = new Ext.Window({
1175 applyTo : 'resto-div',
1176 title : 'Restore selection',
1180 closeAction :'hide',
1185 // Ext.brestore.dlglaunch.addKeyListener(27,
1186 // Ext.brestore.dlglaunch.hide,
1187 // Ext.brestore.dlglaunch);
1189 * var storage_store = new Ext.data.Store({
1190 * proxy: new Ext.data.HttpProxy({
1191 * url: '/cgi-bin/bweb/bresto.pl',
1193 * params:{action:'list_storage'}
1196 * reader: new Ext.data.ArrayReader({
1197 * }, Ext.data.Record.create([
1202 ////////////////////////////////////////////////////////////////
1204 function launch_restore() {
1205 var items = file_selection_store.data.items;
1206 var tab_fileid=new Array();
1207 var tab_dirid=new Array();
1208 var tab_jobid=new Array();
1209 for(var i=0;i<items.length;i++) {
1210 if (items[i].data['fileid']) {
1211 tab_fileid.push(items[i].data['fileid']);
1213 tab_dirid.push(items[i].data['pathid']);
1215 tab_jobid.push(items[i].data['jobid']);
1217 var res = ';fileid=' + tab_fileid.join(";fileid=");
1218 var res2 = ';dirid=' + tab_dirid.join(";dirid=");
1219 var res3 = ';jobid=' + tab_jobid.join(";jobid=");
1221 var res4 = ';client=' + rclient_combo.getValue();
1222 // if (storage_combo.getValue()) {
1223 // res4 = res4 + ';storage=' + storage_combo.getValue();
1225 if (Ext.brestore.use_filerelocation) {
1226 if (useregexp_bp.getValue()) {
1227 res4 = res4 + ';regexwhere=' + rwhere_text.getValue();
1229 var reg = new Array();
1230 if (stripprefix_text.getValue()) {
1231 reg.push('!' + stripprefix_text.getValue() + '!!i');
1233 if (addprefix_text.getValue()) {
1234 reg.push('!^!' + addprefix_text.getValue() + '!');
1236 if (addsuffix_text.getValue()) {
1237 reg.push('!([^/])$!$1' + addsuffix_text.getValue() + '!');
1239 res4 = res4 + ';regexwhere=' + reg.join(',');
1242 res4 = res4 + ';where=' + where_text.getValue();
1244 window.location='/cgi-bin/bweb/bresto.pl?action=restore' + res + res2 + res3 + res4;
1245 } // end launch_restore
1248 ////////////////////////////////////////////////////////////////
1249 reload_media_store();
1250 Ext.brestore.dlglaunch.show();
1251 // storage_store.load({params:{action: 'list_storage'}});