Merge pull request #14825 from williamdes/issue-14478-export-stream
[phpmyadmin.git] / js / export.js
blob2ce72d6b8c20371fef45647f4a54b5af219d7fd2
1 /* vim: set expandtab sw=4 ts=4 sts=4: */
2 /**
3  * Functions used in the export tab
4  *
5  */
7 /**
8  * Disables the "Dump some row(s)" sub-options
9  */
10 function disable_dump_some_rows_sub_options () {
11     $('label[for=\'limit_to\']').fadeTo('fast', 0.4);
12     $('label[for=\'limit_from\']').fadeTo('fast', 0.4);
13     $('input[type=\'text\'][name=\'limit_to\']').prop('disabled', 'disabled');
14     $('input[type=\'text\'][name=\'limit_from\']').prop('disabled', 'disabled');
17 /**
18  * Enables the "Dump some row(s)" sub-options
19  */
20 function enable_dump_some_rows_sub_options () {
21     $('label[for=\'limit_to\']').fadeTo('fast', 1);
22     $('label[for=\'limit_from\']').fadeTo('fast', 1);
23     $('input[type=\'text\'][name=\'limit_to\']').prop('disabled', '');
24     $('input[type=\'text\'][name=\'limit_from\']').prop('disabled', '');
27 /**
28  * Return template data as a json object
29  *
30  * @returns template data
31  */
32 function getTemplateData () {
33     var $form = $('form[name="dump"]');
34     var blacklist = ['token', 'server', 'db', 'table', 'single_table',
35         'export_type', 'export_method', 'sql_query', 'template_id'];
36     var obj = {};
37     var arr = $form.serializeArray();
38     $.each(arr, function () {
39         if ($.inArray(this.name, blacklist) < 0) {
40             if (obj[this.name] !== undefined) {
41                 if (! obj[this.name].push) {
42                     obj[this.name] = [obj[this.name]];
43                 }
44                 obj[this.name].push(this.value || '');
45             } else {
46                 obj[this.name] = this.value || '';
47             }
48         }
49     });
50     // include unchecked checboxes (which are ignored by serializeArray()) with null
51     // to uncheck them when loading the template
52     $form.find('input[type="checkbox"]:not(:checked)').each(function () {
53         if (obj[this.name] === undefined) {
54             obj[this.name] = null;
55         }
56     });
57     // include empty multiselects
58     $form.find('select').each(function () {
59         if ($(this).find('option:selected').length === 0) {
60             obj[this.name] = [];
61         }
62     });
63     return obj;
66 /**
67  * Create a template with selected options
68  *
69  * @param name name of the template
70  */
71 function createTemplate (name) {
72     var templateData = getTemplateData();
74     var params = {
75         ajax_request : true,
76         server : PMA_commonParams.get('server'),
77         db : PMA_commonParams.get('db'),
78         table : PMA_commonParams.get('table'),
79         exportType : $('input[name="export_type"]').val(),
80         templateAction : 'create',
81         templateName : name,
82         templateData : JSON.stringify(templateData)
83     };
85     PMA_ajaxShowMessage();
86     $.post('tbl_export.php', params, function (response) {
87         if (response.success === true) {
88             $('#templateName').val('');
89             $('#template').html(response.data);
90             $('#template').find('option').each(function () {
91                 if ($(this).text() === name) {
92                     $(this).prop('selected', true);
93                 }
94             });
95             PMA_ajaxShowMessage(PMA_messages.strTemplateCreated);
96         } else {
97             PMA_ajaxShowMessage(response.error, false);
98         }
99     });
103  * Loads a template
105  * @param id ID of the template to load
106  */
107 function loadTemplate (id) {
108     var params = {
109         ajax_request : true,
110         server : PMA_commonParams.get('server'),
111         db : PMA_commonParams.get('db'),
112         table : PMA_commonParams.get('table'),
113         exportType : $('input[name="export_type"]').val(),
114         templateAction : 'load',
115         templateId : id,
116     };
118     PMA_ajaxShowMessage();
119     $.post('tbl_export.php', params, function (response) {
120         if (response.success === true) {
121             var $form = $('form[name="dump"]');
122             var options = JSON.parse(response.data);
123             $.each(options, function (key, value) {
124                 var $element = $form.find('[name="' + key + '"]');
125                 if ($element.length) {
126                     if (($element.is('input') && $element.attr('type') === 'checkbox') && value === null) {
127                         $element.prop('checked', false);
128                     } else {
129                         if (($element.is('input') && $element.attr('type') === 'checkbox') ||
130                             ($element.is('input') && $element.attr('type') === 'radio') ||
131                             ($element.is('select') && $element.attr('multiple') === 'multiple')) {
132                             if (! value.push) {
133                                 value = [value];
134                             }
135                         }
136                         $element.val(value);
137                     }
138                     $element.trigger('change');
139                 }
140             });
141             $('input[name="template_id"]').val(id);
142             PMA_ajaxShowMessage(PMA_messages.strTemplateLoaded);
143         } else {
144             PMA_ajaxShowMessage(response.error, false);
145         }
146     });
150  * Updates an existing template with current options
152  * @param id ID of the template to update
153  */
154 function updateTemplate (id) {
155     var templateData = getTemplateData();
157     var params = {
158         ajax_request : true,
159         server : PMA_commonParams.get('server'),
160         db : PMA_commonParams.get('db'),
161         table : PMA_commonParams.get('table'),
162         exportType : $('input[name="export_type"]').val(),
163         templateAction : 'update',
164         templateId : id,
165         templateData : JSON.stringify(templateData)
166     };
168     PMA_ajaxShowMessage();
169     $.post('tbl_export.php', params, function (response) {
170         if (response.success === true) {
171             PMA_ajaxShowMessage(PMA_messages.strTemplateUpdated);
172         } else {
173             PMA_ajaxShowMessage(response.error, false);
174         }
175     });
179  * Delete a template
181  * @param id ID of the template to delete
182  */
183 function deleteTemplate (id) {
184     var params = {
185         ajax_request : true,
186         server : PMA_commonParams.get('server'),
187         db : PMA_commonParams.get('db'),
188         table : PMA_commonParams.get('table'),
189         exportType : $('input[name="export_type"]').val(),
190         templateAction : 'delete',
191         templateId : id,
192     };
194     PMA_ajaxShowMessage();
195     $.post('tbl_export.php', params, function (response) {
196         if (response.success === true) {
197             $('#template').find('option[value="' + id + '"]').remove();
198             PMA_ajaxShowMessage(PMA_messages.strTemplateDeleted);
199         } else {
200             PMA_ajaxShowMessage(response.error, false);
201         }
202     });
206  * Unbind all event handlers before tearing down a page
207  */
208 AJAX.registerTeardown('export.js', function () {
209     $('#plugins').off('change');
210     $('input[type=\'radio\'][name=\'sql_structure_or_data\']').off('change');
211     $('input[type=\'radio\'][name$=\'_structure_or_data\']').off('change');
212     $('input[type=\'radio\'][name=\'output_format\']').off('change');
213     $('#checkbox_sql_include_comments').off('change');
214     $('input[type=\'radio\'][name=\'quick_or_custom\']').off('change');
215     $('input[type=\'radio\'][name=\'allrows\']').off('change');
216     $('#btn_alias_config').off('click');
217     $('.alias_remove').off('click');
218     $('#db_alias_button').off('click');
219     $('#table_alias_button').off('click');
220     $('#column_alias_button').off('click');
221     $('input[name="table_select[]"]').off('change');
222     $('input[name="table_structure[]"]').off('change');
223     $('input[name="table_data[]"]').off('change');
224     $('#table_structure_all').off('change');
225     $('#table_data_all').off('change');
226     $('input[name="createTemplate"]').off('click');
227     $('select[name="template"]').off('change');
228     $('input[name="updateTemplate"]').off('click');
229     $('input[name="deleteTemplate"]').off('click');
232 AJAX.registerOnload('export.js', function () {
233     /**
234      * Export template handling code
235      */
236     // create a new template
237     $('input[name="createTemplate"]').on('click', function (e) {
238         e.preventDefault();
239         var name = $('input[name="templateName"]').val();
240         if (name.length) {
241             createTemplate(name);
242         }
243     });
245     // load an existing template
246     $('select[name="template"]').on('change', function (e) {
247         e.preventDefault();
248         var id = $(this).val();
249         if (id.length) {
250             loadTemplate(id);
251         }
252     });
254     // udpate an existing template with new criteria
255     $('input[name="updateTemplate"]').on('click', function (e) {
256         e.preventDefault();
257         var id = $('select[name="template"]').val();
258         if (id.length) {
259             updateTemplate(id);
260         }
261     });
263     // delete an existing template
264     $('input[name="deleteTemplate"]').on('click', function (e) {
265         e.preventDefault();
266         var id = $('select[name="template"]').val();
267         if (id.length) {
268             deleteTemplate(id);
269         }
270     });
272     /**
273      * Toggles the hiding and showing of each plugin's options
274      * according to the currently selected plugin from the dropdown list
275      */
276     $('#plugins').change(function () {
277         $('#format_specific_opts').find('div.format_specific_options').hide();
278         var selected_plugin_name = $('#plugins').find('option:selected').val();
279         $('#' + selected_plugin_name + '_options').show();
280     });
282     /**
283      * Toggles the enabling and disabling of the SQL plugin's comment options that apply only when exporting structure
284      */
285     $('input[type=\'radio\'][name=\'sql_structure_or_data\']').change(function () {
286         var comments_are_present = $('#checkbox_sql_include_comments').prop('checked');
287         var show = $('input[type=\'radio\'][name=\'sql_structure_or_data\']:checked').val();
288         if (show === 'data') {
289             // disable the SQL comment options
290             if (comments_are_present) {
291                 $('#checkbox_sql_dates').prop('disabled', true).parent().fadeTo('fast', 0.4);
292             }
293             $('#checkbox_sql_relation').prop('disabled', true).parent().fadeTo('fast', 0.4);
294             $('#checkbox_sql_mime').prop('disabled', true).parent().fadeTo('fast', 0.4);
295         } else {
296             // enable the SQL comment options
297             if (comments_are_present) {
298                 $('#checkbox_sql_dates').prop('disabled', false).parent().fadeTo('fast', 1);
299             }
300             $('#checkbox_sql_relation').prop('disabled', false).parent().fadeTo('fast', 1);
301             $('#checkbox_sql_mime').prop('disabled', false).parent().fadeTo('fast', 1);
302         }
304         if (show === 'structure') {
305             $('#checkbox_sql_auto_increment').prop('disabled', true).parent().fadeTo('fast', 0.4);
306         } else {
307             $('#checkbox_sql_auto_increment').prop('disabled', false).parent().fadeTo('fast', 1);
308         }
309     });
311     // For separate-file exports only ZIP compression is allowed
312     $('input[type="checkbox"][name="as_separate_files"]').change(function () {
313         if ($(this).is(':checked')) {
314             $('#compression').val('zip');
315         }
316     });
318     $('#compression').change(function () {
319         if ($('option:selected').val() !== 'zip') {
320             $('input[type="checkbox"][name="as_separate_files"]').prop('checked', false);
321         }
322     });
325 function setup_table_structure_or_data () {
326     if ($('input[name=\'export_type\']').val() !== 'database') {
327         return;
328     }
329     var pluginName = $('#plugins').find('option:selected').val();
330     var formElemName = pluginName + '_structure_or_data';
331     var force_structure_or_data = !($('input[name=\'' + formElemName + '_default\']').length);
333     if (force_structure_or_data === true) {
334         $('input[name="structure_or_data_forced"]').val(1);
335         $('.export_structure input[type="checkbox"], .export_data input[type="checkbox"]')
336             .prop('disabled', true);
337         $('.export_structure, .export_data').fadeTo('fast', 0.4);
338     } else {
339         $('input[name="structure_or_data_forced"]').val(0);
340         $('.export_structure input[type="checkbox"], .export_data input[type="checkbox"]')
341             .prop('disabled', false);
342         $('.export_structure, .export_data').fadeTo('fast', 1);
344         var structure_or_data = $('input[name="' + formElemName + '_default"]').val();
346         if (structure_or_data === 'structure') {
347             $('.export_data input[type="checkbox"]')
348                 .prop('checked', false);
349         } else if (structure_or_data === 'data') {
350             $('.export_structure input[type="checkbox"]')
351                 .prop('checked', false);
352         }
353         if (structure_or_data === 'structure' || structure_or_data === 'structure_and_data') {
354             if (!$('.export_structure input[type="checkbox"]:checked').length) {
355                 $('input[name="table_select[]"]:checked')
356                     .closest('tr')
357                     .find('.export_structure input[type="checkbox"]')
358                     .prop('checked', true);
359             }
360         }
361         if (structure_or_data === 'data' || structure_or_data === 'structure_and_data') {
362             if (!$('.export_data input[type="checkbox"]:checked').length) {
363                 $('input[name="table_select[]"]:checked')
364                     .closest('tr')
365                     .find('.export_data input[type="checkbox"]')
366                     .prop('checked', true);
367             }
368         }
370         check_selected_tables();
371         check_table_select_all();
372         check_table_select_struture_or_data();
373     }
377  * Toggles the hiding and showing of plugin structure-specific and data-specific
378  * options
379  */
380 function toggle_structure_data_opts () {
381     var pluginName = $('select#plugins').val();
382     var radioFormName = pluginName + '_structure_or_data';
383     var dataDiv = '#' + pluginName + '_data';
384     var structureDiv = '#' + pluginName + '_structure';
385     var show = $('input[type=\'radio\'][name=\'' + radioFormName + '\']:checked').val();
386     if (show === 'data') {
387         $(dataDiv).slideDown('slow');
388         $(structureDiv).slideUp('slow');
389     } else {
390         $(structureDiv).slideDown('slow');
391         if (show === 'structure') {
392             $(dataDiv).slideUp('slow');
393         } else {
394             $(dataDiv).slideDown('slow');
395         }
396     }
400  * Toggles the disabling of the "save to file" options
401  */
402 function toggle_save_to_file () {
403     var $ulSaveAsfile = $('#ul_save_asfile');
404     if (!$('#radio_dump_asfile').prop('checked')) {
405         $ulSaveAsfile.find('> li').fadeTo('fast', 0.4);
406         $ulSaveAsfile.find('> li > input').prop('disabled', true);
407         $ulSaveAsfile.find('> li > select').prop('disabled', true);
408     } else {
409         $ulSaveAsfile.find('> li').fadeTo('fast', 1);
410         $ulSaveAsfile.find('> li > input').prop('disabled', false);
411         $ulSaveAsfile.find('> li > select').prop('disabled', false);
412     }
415 AJAX.registerOnload('export.js', function () {
416     toggle_save_to_file();
417     $('input[type=\'radio\'][name=\'output_format\']').change(toggle_save_to_file);
421  * For SQL plugin, toggles the disabling of the "display comments" options
422  */
423 function toggle_sql_include_comments () {
424     $('#checkbox_sql_include_comments').change(function () {
425         var $ulIncludeComments = $('#ul_include_comments');
426         if (!$('#checkbox_sql_include_comments').prop('checked')) {
427             $ulIncludeComments.find('> li').fadeTo('fast', 0.4);
428             $ulIncludeComments.find('> li > input').prop('disabled', true);
429         } else {
430             // If structure is not being exported, the comment options for structure should not be enabled
431             if ($('#radio_sql_structure_or_data_data').prop('checked')) {
432                 $('#text_sql_header_comment').prop('disabled', false).parent('li').fadeTo('fast', 1);
433             } else {
434                 $ulIncludeComments.find('> li').fadeTo('fast', 1);
435                 $ulIncludeComments.find('> li > input').prop('disabled', false);
436             }
437         }
438     });
441 function check_table_select_all () {
442     var total = $('input[name="table_select[]"]').length;
443     var str_checked = $('input[name="table_structure[]"]:checked').length;
444     var data_checked = $('input[name="table_data[]"]:checked').length;
445     var str_all = $('#table_structure_all');
446     var data_all = $('#table_data_all');
448     if (str_checked === total) {
449         str_all
450             .prop('indeterminate', false)
451             .prop('checked', true);
452     } else if (str_checked === 0) {
453         str_all
454             .prop('indeterminate', false)
455             .prop('checked', false);
456     } else {
457         str_all
458             .prop('indeterminate', true)
459             .prop('checked', false);
460     }
462     if (data_checked === total) {
463         data_all
464             .prop('indeterminate', false)
465             .prop('checked', true);
466     } else if (data_checked === 0) {
467         data_all
468             .prop('indeterminate', false)
469             .prop('checked', false);
470     } else {
471         data_all
472             .prop('indeterminate', true)
473             .prop('checked', false);
474     }
477 function check_table_select_struture_or_data () {
478     var str_checked = $('input[name="table_structure[]"]:checked').length;
479     var data_checked = $('input[name="table_data[]"]:checked').length;
480     var auto_increment = $('#checkbox_sql_auto_increment');
482     var pluginName = $('select#plugins').val();
483     var dataDiv = '#' + pluginName + '_data';
484     var structureDiv = '#' + pluginName + '_structure';
486     if (str_checked === 0) {
487         $(structureDiv).slideUp('slow');
488     } else {
489         $(structureDiv).slideDown('slow');
490     }
492     if (data_checked === 0) {
493         $(dataDiv).slideUp('slow');
494         auto_increment.prop('disabled', true).parent().fadeTo('fast', 0.4);
495     } else {
496         $(dataDiv).slideDown('slow');
497         auto_increment.prop('disabled', false).parent().fadeTo('fast', 1);
498     }
501 function toggle_table_select_all_str () {
502     var str_all = $('#table_structure_all').is(':checked');
503     if (str_all) {
504         $('input[name="table_structure[]"]').prop('checked', true);
505     } else {
506         $('input[name="table_structure[]"]').prop('checked', false);
507     }
510 function toggle_table_select_all_data () {
511     var data_all = $('#table_data_all').is(':checked');
512     if (data_all) {
513         $('input[name="table_data[]"]').prop('checked', true);
514     } else {
515         $('input[name="table_data[]"]').prop('checked', false);
516     }
519 function check_selected_tables (argument) {
520     $('.export_table_select tbody tr').each(function () {
521         check_table_selected(this);
522     });
525 function check_table_selected (row) {
526     var $row = $(row);
527     var table_select = $row.find('input[name="table_select[]"]');
528     var str_check = $row.find('input[name="table_structure[]"]');
529     var data_check = $row.find('input[name="table_data[]"]');
531     var data = data_check.is(':checked:not(:disabled)');
532     var structure = str_check.is(':checked:not(:disabled)');
534     if (data && structure) {
535         table_select.prop({ checked: true, indeterminate: false });
536         $row.addClass('marked');
537     } else if (data || structure) {
538         table_select.prop({ checked: true, indeterminate: true });
539         $row.removeClass('marked');
540     } else {
541         table_select.prop({ checked: false, indeterminate: false });
542         $row.removeClass('marked');
543     }
546 function toggle_table_select (row) {
547     var $row = $(row);
548     var table_selected = $row.find('input[name="table_select[]"]').is(':checked');
550     if (table_selected) {
551         $row.find('input[type="checkbox"]:not(:disabled)').prop('checked', true);
552         $row.addClass('marked');
553     } else {
554         $row.find('input[type="checkbox"]:not(:disabled)').prop('checked', false);
555         $row.removeClass('marked');
556     }
559 function handleAddProcCheckbox () {
560     if ($('#table_structure_all').is(':checked') === true
561         && $('#table_data_all').is(':checked') === true
562     ) {
563         $('#checkbox_sql_procedure_function').prop('checked', true);
564     } else {
565         $('#checkbox_sql_procedure_function').prop('checked', false);
566     }
569 AJAX.registerOnload('export.js', function () {
570     /**
571      * For SQL plugin, if "CREATE TABLE options" is checked/unchecked, check/uncheck each of its sub-options
572      */
573     var $create = $('#checkbox_sql_create_table_statements');
574     var $create_options = $('#ul_create_table_statements').find('input');
575     $create.change(function () {
576         $create_options.prop('checked', $(this).prop('checked'));
577     });
578     $create_options.change(function () {
579         if ($create_options.is(':checked')) {
580             $create.prop('checked', true);
581         }
582     });
584     /**
585      * Disables the view output as text option if the output must be saved as a file
586      */
587     $('#plugins').change(function () {
588         var active_plugin = $('#plugins').find('option:selected').val();
589         var force_file = $('#force_file_' + active_plugin).val();
590         if (force_file === 'true') {
591             if ($('#radio_dump_asfile').prop('checked') !== true) {
592                 $('#radio_dump_asfile').prop('checked', true);
593                 toggle_save_to_file();
594             }
595             $('#radio_view_as_text').prop('disabled', true).parent().fadeTo('fast', 0.4);
596         } else {
597             $('#radio_view_as_text').prop('disabled', false).parent().fadeTo('fast', 1);
598         }
599     });
601     $('input[type=\'radio\'][name$=\'_structure_or_data\']').on('change', function () {
602         toggle_structure_data_opts();
603     });
605     $('input[name="table_select[]"]').on('change', function () {
606         toggle_table_select($(this).closest('tr'));
607         check_table_select_all();
608         handleAddProcCheckbox();
609         check_table_select_struture_or_data();
610     });
612     $('input[name="table_structure[]"]').on('change', function () {
613         check_table_selected($(this).closest('tr'));
614         check_table_select_all();
615         handleAddProcCheckbox();
616         check_table_select_struture_or_data();
617     });
619     $('input[name="table_data[]"]').on('change', function () {
620         check_table_selected($(this).closest('tr'));
621         check_table_select_all();
622         handleAddProcCheckbox();
623         check_table_select_struture_or_data();
624     });
626     $('#table_structure_all').on('change', function () {
627         toggle_table_select_all_str();
628         check_selected_tables();
629         handleAddProcCheckbox();
630         check_table_select_struture_or_data();
631     });
633     $('#table_data_all').on('change', function () {
634         toggle_table_select_all_data();
635         check_selected_tables();
636         handleAddProcCheckbox();
637         check_table_select_struture_or_data();
638     });
640     if ($('input[name=\'export_type\']').val() === 'database') {
641         // Hide structure or data radio buttons
642         $('input[type=\'radio\'][name$=\'_structure_or_data\']').each(function () {
643             var $this = $(this);
644             var name = $this.prop('name');
645             var val = $('input[name="' + name + '"]:checked').val();
646             var name_default = name + '_default';
647             if (!$('input[name="' + name_default + '"]').length) {
648                 $this
649                     .after(
650                         $('<input type="hidden" name="' + name_default + '" value="' + val + '" disabled>')
651                     )
652                     .after(
653                         $('<input type="hidden" name="' + name + '" value="structure_and_data">')
654                     );
655                 $this.parent().find('label').remove();
656             } else {
657                 $this.parent().remove();
658             }
659         });
660         $('input[type=\'radio\'][name$=\'_structure_or_data\']').remove();
662         // Disable CREATE table checkbox for sql
663         var createTableCheckbox = $('#checkbox_sql_create_table');
664         createTableCheckbox.prop('checked', true);
665         var dummyCreateTable = $('#checkbox_sql_create_table')
666             .clone()
667             .removeAttr('id')
668             .attr('type', 'hidden');
669         createTableCheckbox
670             .prop('disabled', true)
671             .after(dummyCreateTable)
672             .parent()
673             .fadeTo('fast', 0.4);
675         setup_table_structure_or_data();
676     }
678     /**
679      * Handle force structure_or_data
680      */
681     $('#plugins').change(setup_table_structure_or_data);
685  * Toggles display of options when quick and custom export are selected
686  */
687 function toggle_quick_or_custom () {
688     if ($('input[name=\'quick_or_custom\']').length === 0 // custom_no_form option
689         || $('#radio_custom_export').prop('checked') // custom
690     ) {
691         $('#databases_and_tables').show();
692         $('#rows').show();
693         $('#output').show();
694         $('#format_specific_opts').show();
695         $('#output_quick_export').hide();
696         var selected_plugin_name = $('#plugins').find('option:selected').val();
697         $('#' + selected_plugin_name + '_options').show();
698     } else { // quick
699         $('#databases_and_tables').hide();
700         $('#rows').hide();
701         $('#output').hide();
702         $('#format_specific_opts').hide();
703         $('#output_quick_export').show();
704     }
706 var time_out;
707 function check_time_out (time_limit) {
708     if (typeof time_limit === 'undefined' || time_limit === 0) {
709         return true;
710     }
711     // margin of one second to avoid race condition to set/access session variable
712     time_limit = time_limit + 1;
713     var href = 'export.php';
714     var params = {
715         'ajax_request' : true,
716         'check_time_out' : true
717     };
718     clearTimeout(time_out);
719     time_out = setTimeout(function () {
720         $.get(href, params, function (data) {
721             if (data.message === 'timeout') {
722                 PMA_ajaxShowMessage(
723                     '<div class="error">' +
724                     PMA_messages.strTimeOutError +
725                     '</div>',
726                     false
727                 );
728             }
729         });
730     }, time_limit * 1000);
734  * Handler for Database/table alias select
736  * @param event object the event object
738  * @return void
739  */
740 function aliasSelectHandler (event) {
741     var sel = event.data.sel;
742     var type = event.data.type;
743     var inputId = $(this).val();
744     var $label = $(this).next('label');
745     $('input#' + $label.attr('for')).addClass('hide');
746     $('input#' + inputId).removeClass('hide');
747     $label.attr('for', inputId);
748     $('#alias_modal ' + sel + '[id$=' + type + ']:visible').addClass('hide');
749     var $inputWrapper = $('#alias_modal ' + sel + '#' + inputId + type);
750     $inputWrapper.removeClass('hide');
751     if (type === '_cols' && $inputWrapper.length > 0) {
752         var outer = $inputWrapper[0].outerHTML;
753         // Replace opening tags
754         var regex = /<dummy_inp/gi;
755         if (outer.match(regex)) {
756             var newTag = outer.replace(regex, '<input');
757             // Replace closing tags
758             regex = /<\/dummy_inp/gi;
759             newTag = newTag.replace(regex, '</input');
760             // Assign replacement
761             $inputWrapper.replaceWith(newTag);
762         }
763     } else if (type === '_tables') {
764         $('.table_alias_select:visible').change();
765     }
766     $('#alias_modal').dialog('option', 'position', 'center');
770  * Handler for Alias dialog box
772  * @param event object the event object
774  * @return void
775  */
776 function createAliasModal (event) {
777     event.preventDefault();
778     var dlgButtons = {};
779     dlgButtons[PMA_messages.strSaveAndClose] = function () {
780         $(this).dialog('close');
781         $('#alias_modal').parent().appendTo($('form[name="dump"]'));
782     };
783     $('#alias_modal').dialog({
784         width: Math.min($(window).width() - 100, 700),
785         maxHeight: $(window).height(),
786         modal: true,
787         dialogClass: 'alias-dialog',
788         buttons: dlgButtons,
789         create: function () {
790             $(this).css('maxHeight', $(window).height() - 150);
791             var db = PMA_commonParams.get('db');
792             if (db) {
793                 var option = $('<option></option>');
794                 option.text(db);
795                 option.attr('value', db);
796                 $('#db_alias_select').append(option).val(db).change();
797             } else {
798                 var params = {
799                     ajax_request : true,
800                     server : PMA_commonParams.get('server'),
801                     type: 'list-databases'
802                 };
803                 $.post('ajax.php', params, function (response) {
804                     if (response.success === true) {
805                         $.each(response.databases, function (idx, value) {
806                             var option = $('<option></option>');
807                             option.text(value);
808                             option.attr('value', value);
809                             $('#db_alias_select').append(option);
810                         });
811                     } else {
812                         PMA_ajaxShowMessage(response.error, false);
813                     }
814                 });
815             }
816         },
817         close: function () {
818             var isEmpty = true;
819             $(this).find('input[type="text"]').each(function () {
820                 // trim empty input fields on close
821                 if ($(this).val()) {
822                     isEmpty = false;
823                 } else {
824                     $(this).parents('tr').remove();
825                 }
826             });
827             // Toggle checkbox based on aliases
828             $('input#btn_alias_config').prop('checked', !isEmpty);
829         },
830         position: { my: 'center top', at: 'center top', of: window }
831     });
834 function aliasToggleRow (elm) {
835     var inputs = elm.parents('tr').find('input,button');
836     if (elm.val()) {
837         inputs.attr('disabled', false);
838     } else {
839         inputs.attr('disabled', true);
840     }
843 function addAlias (type, name, field, value) {
844     if (value === '') {
845         return;
846     }
848     var row = $('#alias_data tfoot tr').clone();
849     row.find('th').text(type);
850     row.find('td:first').text(name);
851     row.find('input').attr('name', field);
852     row.find('input').val(value);
853     row.find('.alias_remove').on('click', function () {
854         $(this).parents('tr').remove();
855     });
857     var matching = $('#alias_data [name="' + $.escapeSelector(field) + '"]');
858     if (matching.length > 0) {
859         matching.parents('tr').remove();
860     }
862     $('#alias_data tbody').append(row);
865 AJAX.registerOnload('export.js', function () {
866     $('input[type=\'radio\'][name=\'quick_or_custom\']').change(toggle_quick_or_custom);
868     $('#scroll_to_options_msg').hide();
869     $('#format_specific_opts').find('div.format_specific_options')
870         .hide()
871         .css({
872             'border': 0,
873             'margin': 0,
874             'padding': 0
875         })
876         .find('h3')
877         .remove();
878     toggle_quick_or_custom();
879     toggle_structure_data_opts();
880     toggle_sql_include_comments();
881     check_table_select_all();
882     handleAddProcCheckbox();
884     /**
885      * Initially disables the "Dump some row(s)" sub-options
886      */
887     disable_dump_some_rows_sub_options();
889     /**
890      * Disables the "Dump some row(s)" sub-options when it is not selected
891      */
892     $('input[type=\'radio\'][name=\'allrows\']').change(function () {
893         if ($('input[type=\'radio\'][name=\'allrows\']').prop('checked')) {
894             enable_dump_some_rows_sub_options();
895         } else {
896             disable_dump_some_rows_sub_options();
897         }
898     });
900     // Open Alias Modal Dialog on click
901     $('#btn_alias_config').on('click', createAliasModal);
902     $('.alias_remove').on('click', function () {
903         $(this).parents('tr').remove();
904     });
905     $('#db_alias_select').on('change', function () {
906         aliasToggleRow($(this));
907         var db = $(this).val();
908         var table = PMA_commonParams.get('table');
909         if (table) {
910             var option = $('<option></option>');
911             option.text(table);
912             option.attr('value', table);
913             $('#table_alias_select').append(option).val(table).change();
914         } else {
915             var params = {
916                 ajax_request : true,
917                 server : PMA_commonParams.get('server'),
918                 db : $(this).val(),
919                 type: 'list-tables'
920             };
921             $.post('ajax.php', params, function (response) {
922                 if (response.success === true) {
923                     $.each(response.tables, function (idx, value) {
924                         var option = $('<option></option>');
925                         option.text(value);
926                         option.attr('value', value);
927                         $('#table_alias_select').append(option);
928                     });
929                 } else {
930                     PMA_ajaxShowMessage(response.error, false);
931                 }
932             });
933         }
934     });
935     $('#table_alias_select').on('change', function () {
936         aliasToggleRow($(this));
937         var params = {
938             ajax_request : true,
939             server : PMA_commonParams.get('server'),
940             db : $('#db_alias_select').val(),
941             table: $(this).val(),
942             type: 'list-columns'
943         };
944         $.post('ajax.php', params, function (response) {
945             if (response.success === true) {
946                 $.each(response.columns, function (idx, value) {
947                     var option = $('<option></option>');
948                     option.text(value);
949                     option.attr('value', value);
950                     $('#column_alias_select').append(option);
951                 });
952             } else {
953                 PMA_ajaxShowMessage(response.error, false);
954             }
955         });
956     });
957     $('#column_alias_select').on('change', function () {
958         aliasToggleRow($(this));
959     });
960     $('#db_alias_button').on('click', function (e) {
961         e.preventDefault();
962         var db = $('#db_alias_select').val();
963         addAlias(
964             PMA_messages.strAliasDatabase,
965             db,
966             'aliases[' + db + '][alias]',
967             $('#db_alias_name').val()
968         );
969         $('#db_alias_name').val('');
970     });
971     $('#table_alias_button').on('click', function (e) {
972         e.preventDefault();
973         var db = $('#db_alias_select').val();
974         var table = $('#table_alias_select').val();
975         addAlias(
976             PMA_messages.strAliasTable,
977             db + '.' + table,
978             'aliases[' + db + '][tables][' + table + '][alias]',
979             $('#table_alias_name').val()
980         );
981         $('#table_alias_name').val('');
982     });
983     $('#column_alias_button').on('click', function (e) {
984         e.preventDefault();
985         var db = $('#db_alias_select').val();
986         var table = $('#table_alias_select').val();
987         var column = $('#column_alias_select').val();
988         addAlias(
989             PMA_messages.strAliasColumn,
990             db + '.' + table + '.' + column,
991             'aliases[' + db + '][tables][' + table + '][colums][' + column + ']',
992             $('#column_alias_name').val()
993         );
994         $('#column_alias_name').val('');
995     });