JAVASCRIPT 21
Console.js Guest on 4th May 2021 10:57:24 AM
  1. /* vim: set expandtab sw=4 ts=4 sts=4: */
  2. /**
  3.  * Used in or for console
  4.  *
  5.  * @package phpMyAdmin-Console
  6.  */
  7.  
  8. /**
  9.  * Console object
  10.  */
  11. var PMA_console = {
  12.     /**
  13.      * @var object, jQuery object, selector is '#pma_console>.content'
  14.      * @access private
  15.      */
  16.     $consoleContent: null,
  17.     /**
  18.      * @var object, jQuery object, selector is '#pma_console .content',
  19.      *  used for resizer
  20.      * @access private
  21.      */
  22.     $consoleAllContents: null,
  23.     /**
  24.      * @var object, jQuery object, selector is '#pma_console .toolbar'
  25.      * @access private
  26.      */
  27.     $consoleToolbar: null,
  28.     /**
  29.      * @var object, jQuery object, selector is '#pma_console .template'
  30.      * @access private
  31.      */
  32.     $consoleTemplates: null,
  33.     /**
  34.      * @var object, jQuery object, form for submit
  35.      * @access private
  36.      */
  37.     $requestForm: null,
  38.     /**
  39.      * @var object, contain console config
  40.      * @access private
  41.      */
  42.     config: null,
  43.     /**
  44.      * @var bool, if console element exist, it'll be true
  45.      * @access public
  46.      */
  47.     isEnabled: false,
  48.     /**
  49.      * @var bool, make sure console events bind only once
  50.      * @access private
  51.      */
  52.     isInitialized: false,
  53.     /**
  54.      * Used for console initialize, reinit is ok, just some variable assignment
  55.      *
  56.      * @return void
  57.      */
  58.     initialize: function() {
  59.  
  60.         if ($('#pma_console').length === 0) {
  61.             return;
  62.         }
  63.  
  64.         PMA_console.isEnabled = true;
  65.  
  66.         // Cookie var checks and init
  67.         if (! $.cookie('pma_console_height')) {
  68.             $.cookie('pma_console_height', 92);
  69.         }
  70.         if (! $.cookie('pma_console_mode')) {
  71.             $.cookie('pma_console_mode', 'info');
  72.         }
  73.  
  74.         // Vars init
  75.         PMA_console.$consoleToolbar = $("#pma_console").find(">.toolbar");
  76.         PMA_console.$consoleContent = $("#pma_console").find(">.content");
  77.         PMA_console.$consoleAllContents = $('#pma_console').find('.content');
  78.         PMA_console.$consoleTemplates = $('#pma_console').find('>.templates');
  79.  
  80.         // Generate a from for post
  81.         PMA_console.$requestForm = $('<form method="post" action="import.php">' +
  82.             '<input name="is_js_confirmed" value="0">' +
  83.             '<textarea name="sql_query"></textarea>' +
  84.             '<input name="console_message_id" value="0">' +
  85.             '<input name="server" value="">' +
  86.             '<input name="db" value="">' +
  87.             '<input name="table" value="">' +
  88.             '<input name="token" value="' +
  89.             PMA_commonParams.get('token') +
  90.             '">' +
  91.             '</form>'
  92.         );
  93.         PMA_console.$requestForm.bind('submit', AJAX.requestHandler);
  94.  
  95.         // Event binds shouldn't run again
  96.         if (PMA_console.isInitialized === false) {
  97.  
  98.             // Load config first
  99.             var tempConfig = JSON.parse($.cookie('pma_console_config'));
  100.             if (tempConfig) {
  101.                 if (tempConfig.alwaysExpand === true) {
  102.                     $('#pma_console_options input[name=always_expand]').prop('checked', true);
  103.                 }
  104.                 if (tempConfig.startHistory === true) {
  105.                     $('#pma_console_options').find('input[name=start_history]').prop('checked', true);
  106.                 }
  107.                 if (tempConfig.currentQuery === true) {
  108.                     $('#pma_console_options').find('input[name=current_query]').prop('checked', true);
  109.                 }
  110.                 if (ConsoleEnterExecutes === true) {
  111.                     $('#pma_console_options').find('input[name=enter_executes]').prop('checked', true);
  112.                 }
  113.                 if (tempConfig.darkTheme === true) {
  114.                     $('#pma_console_options').find('input[name=dark_theme]').prop('checked', true);
  115.                     $('#pma_console').find('>.content').addClass('console_dark_theme');
  116.                 }
  117.             } else {
  118.                 $('#pma_console_options').find('input[name=current_query]').prop('checked', true);
  119.             }
  120.  
  121.             PMA_console.updateConfig();
  122.  
  123.             PMA_consoleResizer.initialize();
  124.             PMA_consoleInput.initialize();
  125.             PMA_consoleMessages.initialize();
  126.             PMA_consoleBookmarks.initialize();
  127.             PMA_consoleDebug.initialize();
  128.  
  129.             PMA_console.$consoleToolbar.children('.console_switch').click(PMA_console.toggle);
  130.             $(document).keydown(function(event) {
  131.                 // Ctrl + Alt + C
  132.                 if (event.ctrlKey && event.altKey && event.keyCode === 67) {
  133.                     PMA_console.toggle();
  134.                 }
  135.             });
  136.  
  137.             $('#pma_console').find('.toolbar').children().mousedown(function(event) {
  138.                 event.preventDefault();
  139.                 event.stopImmediatePropagation();
  140.             });
  141.  
  142.             $('#pma_console').find('.button.clear').click(function() {
  143.                 PMA_consoleMessages.clear();
  144.             });
  145.  
  146.             $('#pma_console').find('.button.history').click(function() {
  147.                 PMA_consoleMessages.showHistory();
  148.             });
  149.  
  150.             $('#pma_console').find('.button.options').click(function() {
  151.                 PMA_console.showCard('#pma_console_options');
  152.             });
  153.  
  154.             $('#pma_console').find('.button.debug').click(function() {
  155.                 PMA_console.showCard('#debug_console');
  156.             });
  157.  
  158.             PMA_console.$consoleContent.click(function(event) {
  159.                 if (event.target == this) {
  160.                     PMA_consoleInput.focus();
  161.                 }
  162.             });
  163.  
  164.             $('#pma_console').find('.mid_layer').click(function() {
  165.                 PMA_console.hideCard($(this).parent().children('.card'));
  166.             });
  167.             $('#debug_console').find('.switch_button').click(function() {
  168.                 PMA_console.hideCard($(this).closest('.card'));
  169.             });
  170.             $('#pma_bookmarks').find('.switch_button').click(function() {
  171.                 PMA_console.hideCard($(this).closest('.card'));
  172.             });
  173.             $('#pma_console_options').find('.switch_button').click(function() {
  174.                 PMA_console.hideCard($(this).closest('.card'));
  175.             });
  176.  
  177.             $('#pma_console_options').find('input[type=checkbox]').change(function() {
  178.                 PMA_console.updateConfig();
  179.             });
  180.  
  181.             $('#pma_console_options').find('.button.default').click(function() {
  182.                 $('#pma_console_options input[name=always_expand]').prop('checked', false);
  183.                 $('#pma_console_options').find('input[name=start_history]').prop('checked', false);
  184.                 $('#pma_console_options').find('input[name=current_query]').prop('checked', true);
  185.                 $('#pma_console_options').find('input[name=enter_executes]').prop('checked', false);
  186.                 $('#pma_console_options').find('input[name=dark_theme]').prop('checked', false);
  187.                 PMA_console.updateConfig();
  188.             });
  189.  
  190.             $('#pma_console_options').find('input[name=enter_executes]').change(function() {
  191.                 PMA_consoleMessages.showInstructions(PMA_console.config.enterExecutes);
  192.             });
  193.  
  194.             $(document).ajaxComplete(function (event, xhr, ajaxOptions) {
  195.                 if (ajaxOptions.dataType != 'json') {
  196.                     return;
  197.                 }
  198.                 try {
  199.                     var data = $.parseJSON(xhr.responseText);
  200.                     PMA_console.ajaxCallback(data);
  201.                 } catch (e) {
  202.                     console.log("Invalid JSON!" + e.message);
  203.                     if (AJAX.xhr && AJAX.xhr.status === 0 && AJAX.xhr.statusText !== 'abort') {
  204.                         PMA_ajaxShowMessage($('<div />',{'class':'error','html':PMA_messages.strRequestFailed+' ( '+escapeHtml(AJAX.xhr.statusText)+' )'}));
  205.                         AJAX.active = false;
  206.                         AJAX.xhr = null;
  207.                     }
  208.                 }
  209.             });
  210.  
  211.             PMA_console.isInitialized = true;
  212.         }
  213.  
  214.         // Change console mode from cookie
  215.         switch($.cookie('pma_console_mode')) {
  216.             case 'collapse':
  217.                 PMA_console.collapse();
  218.                 break;
  219.             /* jshint -W086 */// no break needed in default section
  220.             default:
  221.                 $.cookie('pma_console_mode', 'info');
  222.             case 'info':
  223.             /* jshint +W086 */
  224.                 PMA_console.info();
  225.                 break;
  226.             case 'show':
  227.                 PMA_console.show(true);
  228.                 PMA_console.scrollBottom();
  229.                 break;
  230.         }
  231.     },
  232.     /**
  233.      * Execute query and show results in console
  234.      *
  235.      * @return void
  236.      */
  237.     execute: function(queryString, options) {
  238.         if (typeof(queryString) != 'string' || ! /[a-z]|[A-Z]/.test(queryString)) {
  239.             return;
  240.         }
  241.         PMA_console.$requestForm.children('textarea').val(queryString);
  242.         PMA_console.$requestForm.children('[name=server]').attr('value', PMA_commonParams.get('server'));
  243.         if (options && options.db) {
  244.             PMA_console.$requestForm.children('[name=db]').val(options.db);
  245.             if (options.table) {
  246.                 PMA_console.$requestForm.children('[name=table]').val(options.table);
  247.             } else {
  248.                 PMA_console.$requestForm.children('[name=table]').val('');
  249.             }
  250.         } else {
  251.             PMA_console.$requestForm.children('[name=db]').val(
  252.                 (PMA_commonParams.get('db').length > 0 ? PMA_commonParams.get('db') : ''));
  253.         }
  254.         PMA_console.$requestForm.find('[name=profiling]').remove();
  255.         if (options && options.profiling === true) {
  256.             PMA_console.$requestForm.append('<input name="profiling" value="on">');
  257.         }
  258.         if (! confirmQuery(PMA_console.$requestForm[0], PMA_console.$requestForm.children('textarea')[0])) {
  259.             return;
  260.         }
  261.         PMA_console.$requestForm.children('[name=console_message_id]')
  262.             .val(PMA_consoleMessages.appendQuery({sql_query: queryString}).message_id);
  263.         PMA_console.$requestForm.trigger('submit');
  264.         PMA_consoleInput.clear();
  265.         PMA_reloadNavigation();
  266.     },
  267.     ajaxCallback: function(data) {
  268.         if (data && data.console_message_id) {
  269.             PMA_consoleMessages.updateQuery(data.console_message_id, data.success,
  270.                 (data._reloadQuerywindow ? data._reloadQuerywindow : false));
  271.         } else if ( data && data._reloadQuerywindow) {
  272.             if (data._reloadQuerywindow.sql_query.length > 0) {
  273.                 PMA_consoleMessages.appendQuery(data._reloadQuerywindow, 'successed')
  274.                     .$message.addClass(PMA_console.config.currentQuery ? '' : 'hide');
  275.             }
  276.         }
  277.     },
  278.     /**
  279.      * Change console to collapse mode
  280.      *
  281.      * @return void
  282.      */
  283.     collapse: function() {
  284.         $.cookie('pma_console_mode', 'collapse');
  285.         var pmaConsoleHeight = $.cookie('pma_console_height');
  286.  
  287.         if (pmaConsoleHeight < 32) {
  288.             $.cookie('pma_console_height', 92);
  289.         }
  290.         PMA_console.$consoleToolbar.addClass('collapsed');
  291.         PMA_console.$consoleAllContents.height(pmaConsoleHeight);
  292.         PMA_console.$consoleContent.stop();
  293.         PMA_console.$consoleContent.animate({'margin-bottom': -1 * PMA_console.$consoleContent.outerHeight() + 'px'},
  294.             'fast', 'easeOutQuart', function() {
  295.                 PMA_console.$consoleContent.css({display:'none'});
  296.                 $(window).trigger('resize');
  297.             });
  298.         PMA_console.hideCard();
  299.     },
  300.     /**
  301.      * Show console
  302.      *
  303.      * @param bool inputFocus If true, focus the input line after show()
  304.      * @return void
  305.      */
  306.     show: function(inputFocus) {
  307.         $.cookie('pma_console_mode', 'show');
  308.  
  309.         var pmaConsoleHeight = $.cookie('pma_console_height');
  310.  
  311.         if (pmaConsoleHeight < 32) {
  312.             $.cookie('pma_console_height', 32);
  313.             PMA_console.collapse();
  314.             return;
  315.         }
  316.         PMA_console.$consoleContent.css({display:'block'});
  317.         if (PMA_console.$consoleToolbar.hasClass('collapsed')) {
  318.             PMA_console.$consoleToolbar.removeClass('collapsed');
  319.         }
  320.         PMA_console.$consoleAllContents.height(pmaConsoleHeight);
  321.         PMA_console.$consoleContent.stop();
  322.         PMA_console.$consoleContent.animate({'margin-bottom': 0},
  323.             'fast', 'easeOutQuart', function() {
  324.                 $(window).trigger('resize');
  325.                 if (inputFocus) {
  326.                     PMA_consoleInput.focus();
  327.                 }
  328.             });
  329.     },
  330.     /**
  331.      * Change console to SQL information mode
  332.      * this mode shows current SQL query
  333.      * This mode is the default mode
  334.      *
  335.      * @return void
  336.      */
  337.     info: function() {
  338.         // Under construction
  339.         PMA_console.collapse();
  340.     },
  341.     /**
  342.      * Toggle console mode between collapse/show
  343.      * Used for toggle buttons and shortcuts
  344.      *
  345.      * @return void
  346.      */
  347.     toggle: function() {
  348.         switch($.cookie('pma_console_mode')) {
  349.             case 'collapse':
  350.             case 'info':
  351.                 PMA_console.show(true);
  352.                 break;
  353.             case 'show':
  354.                 PMA_console.collapse();
  355.                 break;
  356.             default:
  357.                 PMA_consoleInitialize();
  358.         }
  359.     },
  360.     /**
  361.      * Scroll console to bottom
  362.      *
  363.      * @return void
  364.      */
  365.     scrollBottom: function() {
  366.         PMA_console.$consoleContent.scrollTop(PMA_console.$consoleContent.prop("scrollHeight"));
  367.     },
  368.     /**
  369.      * Show card
  370.      *
  371.      * @param string cardSelector Selector, select string will be "#pma_console " + cardSelector
  372.      * this param also can be JQuery object, if you need.
  373.      *
  374.      * @return void
  375.      */
  376.     showCard: function(cardSelector) {
  377.         var $card = null;
  378.         if (typeof(cardSelector) !== 'string') {
  379.             if (cardSelector.length > 0) {
  380.                 $card = cardSelector;
  381.             } else {
  382.                 return;
  383.             }
  384.         } else {
  385.             $card = $("#pma_console " + cardSelector);
  386.         }
  387.         if ($card.length === 0) {
  388.             return;
  389.         }
  390.         $card.parent().children('.mid_layer').show().fadeTo(0, 0.15);
  391.         $card.addClass('show');
  392.         PMA_consoleInput.blur();
  393.         if ($card.parents('.card').length > 0) {
  394.             PMA_console.showCard($card.parents('.card'));
  395.         }
  396.     },
  397.     /**
  398.      * Scroll console to bottom
  399.      *
  400.      * @param object $targetCard Target card JQuery object, if it's empty, function will hide all cards
  401.      * @return void
  402.      */
  403.     hideCard: function($targetCard) {
  404.         if (! $targetCard) {
  405.             $('#pma_console').find('.mid_layer').fadeOut(140);
  406.             $('#pma_console').find('.card').removeClass('show');
  407.         } else if ($targetCard.length > 0) {
  408.             $targetCard.parent().find('.mid_layer').fadeOut(140);
  409.             $targetCard.find('.card').removeClass('show');
  410.             $targetCard.removeClass('show');
  411.         }
  412.     },
  413.     /**
  414.      * Used for update console config
  415.      *
  416.      * @return void
  417.      */
  418.     updateConfig: function() {
  419.         PMA_console.config = {
  420.             alwaysExpand: $('#pma_console_options input[name=always_expand]').prop('checked'),
  421.             startHistory: $('#pma_console_options').find('input[name=start_history]').prop('checked'),
  422.             currentQuery: $('#pma_console_options').find('input[name=current_query]').prop('checked'),
  423.             enterExecutes: $('#pma_console_options').find('input[name=enter_executes]').prop('checked'),
  424.             darkTheme: $('#pma_console_options').find('input[name=dark_theme]').prop('checked')
  425.         };
  426.         $.cookie('pma_console_config', JSON.stringify(PMA_console.config));
  427.         /*Setting the dark theme of the console*/
  428.         if (PMA_console.config.darkTheme) {
  429.             $('#pma_console').find('>.content').addClass('console_dark_theme');
  430.         } else {
  431.             $('#pma_console').find('>.content').removeClass('console_dark_theme');
  432.         }
  433.     },
  434.     isSelect: function (queryString) {
  435.         var reg_exp = /^SELECT\s+/i;
  436.         return reg_exp.test(queryString);
  437.     }
  438. };
  439.  
  440. /**
  441.  * Resizer object
  442.  * Careful: this object UI logics highly related with functions under PMA_console
  443.  * Resizing min-height is 32, if small than it, console will collapse
  444.  */
  445. var PMA_consoleResizer = {
  446.     _posY: 0,
  447.     _height: 0,
  448.     _resultHeight: 0,
  449.     /**
  450.      * Mousedown event handler for bind to resizer
  451.      *
  452.      * @return void
  453.      */
  454.     _mousedown: function(event) {
  455.         if ($.cookie('pma_console_mode') !== 'show') {
  456.             return;
  457.         }
  458.         PMA_consoleResizer._posY = event.pageY;
  459.         PMA_consoleResizer._height = PMA_console.$consoleContent.height();
  460.         $(document).mousemove(PMA_consoleResizer._mousemove);
  461.         $(document).mouseup(PMA_consoleResizer._mouseup);
  462.         // Disable text selection while resizing
  463.         $(document).bind('selectstart', function() { return false; });
  464.     },
  465.     /**
  466.      * Mousemove event handler for bind to resizer
  467.      *
  468.      * @return void
  469.      */
  470.     _mousemove: function(event) {
  471.         if (event.pageY < 35) {
  472.             event.pageY = 35
  473.         }
  474.         PMA_consoleResizer._resultHeight = PMA_consoleResizer._height + (PMA_consoleResizer._posY -event.pageY);
  475.         // Content min-height is 32, if adjusting height small than it we'll move it out of the page
  476.         if (PMA_consoleResizer._resultHeight <= 32) {
  477.             PMA_console.$consoleAllContents.height(32);
  478.             PMA_console.$consoleContent.css('margin-bottom', PMA_consoleResizer._resultHeight - 32);
  479.         }
  480.         else {
  481.             // Logic below makes viewable area always at bottom when adjusting height and content already at bottom
  482.             if (PMA_console.$consoleContent.scrollTop() + PMA_console.$consoleContent.innerHeight() + 16
  483.                 >= PMA_console.$consoleContent.prop('scrollHeight')) {
  484.                 PMA_console.$consoleAllContents.height(PMA_consoleResizer._resultHeight);
  485.                 PMA_console.scrollBottom();
  486.             } else {
  487.                 PMA_console.$consoleAllContents.height(PMA_consoleResizer._resultHeight);
  488.             }
  489.         }
  490.     },
  491.     /**
  492.      * Mouseup event handler for bind to resizer
  493.      *
  494.      * @return void
  495.      */
  496.     _mouseup: function() {
  497.         $.cookie('pma_console_height', PMA_consoleResizer._resultHeight);
  498.         PMA_console.show();
  499.         $(document).unbind('mousemove');
  500.         $(document).unbind('mouseup');
  501.         $(document).unbind('selectstart');
  502.     },
  503.     /**
  504.      * Used for console resizer initialize
  505.      *
  506.      * @return void
  507.      */
  508.     initialize: function() {
  509.         $('#pma_console').find('.toolbar').unbind('mousedown');
  510.         $('#pma_console').find('.toolbar').mousedown(PMA_consoleResizer._mousedown);
  511.     }
  512. };
  513.  
  514.  
  515. /**
  516.  * Console input object
  517.  */
  518. var PMA_consoleInput = {
  519.     /**
  520.      * @var array, contains Codemirror objects or input jQuery objects
  521.      * @access private
  522.      */
  523.     _inputs: null,
  524.     /**
  525.      * @var bool, if codemirror enabled
  526.      * @access private
  527.      */
  528.     _codemirror: false,
  529.     /**
  530.      * @var int, count for history navigation, 0 for current input
  531.      * @access private
  532.      */
  533.     _historyCount: 0,
  534.     /**
  535.      * @var string, current input when navigating through history
  536.      * @access private
  537.      */
  538.     _historyPreserveCurrent: null,
  539.     /**
  540.      * Used for console input initialize
  541.      *
  542.      * @return void
  543.      */
  544.     initialize: function() {
  545.         // _cm object can't be reinitialize
  546.         if (PMA_consoleInput._inputs !== null) {
  547.             return;
  548.         }
  549.         if (typeof CodeMirror !== 'undefined') {
  550.             PMA_consoleInput._codemirror = true;
  551.         }
  552.         PMA_consoleInput._inputs = [];
  553.         if (PMA_consoleInput._codemirror) {
  554.             PMA_consoleInput._inputs.console = CodeMirror($('#pma_console').find('.console_query_input')[0], {
  555.                 theme: 'pma',
  556.                 mode: 'text/x-sql',
  557.                 lineWrapping: true,
  558.                 extraKeys: {"Ctrl-Space": "autocomplete"},
  559.                 hintOptions: {"completeSingle": false, "completeOnSingleClick": true},
  560.                 gutters: ["CodeMirror-lint-markers"],
  561.                 lint: {
  562.                     "getAnnotations": CodeMirror.sqlLint,
  563.                     "async": true,
  564.                 }
  565.             });
  566.             PMA_consoleInput._inputs.console.on("inputRead", codemirrorAutocompleteOnInputRead);
  567.             PMA_consoleInput._inputs.console.on("keydown", function(instance, event) {
  568.                 PMA_consoleInput._historyNavigate(event);
  569.             });
  570.             if ($('#pma_bookmarks').length !== 0) {
  571.                 PMA_consoleInput._inputs.bookmark = CodeMirror($('#pma_console').find('.bookmark_add_input')[0], {
  572.                     theme: 'pma',
  573.                     mode: 'text/x-sql',
  574.                     lineWrapping: true,
  575.                     extraKeys: {"Ctrl-Space": "autocomplete"},
  576.                     hintOptions: {"completeSingle": false, "completeOnSingleClick": true},
  577.                     gutters: ["CodeMirror-lint-markers"],
  578.                     lint: {
  579.                         "getAnnotations": CodeMirror.sqlLint,
  580.                         "async": true,
  581.                     }
  582.                 });
  583.                 PMA_consoleInput._inputs.bookmark.on("inputRead", codemirrorAutocompleteOnInputRead);
  584.             }
  585.         } else {
  586.             PMA_consoleInput._inputs.console =
  587.                 $('<textarea>').appendTo('#pma_console .console_query_input')
  588.                     .on('keydown', PMA_consoleInput._historyNavigate);
  589.             if ($('#pma_bookmarks').length !== 0) {
  590.                 PMA_consoleInput._inputs.bookmark =
  591.                     $('<textarea>').appendTo('#pma_console .bookmark_add_input');
  592.             }
  593.         }
  594.         $('#pma_console').find('.console_query_input').keydown(PMA_consoleInput._keydown);
  595.     },
  596.     _historyNavigate: function(event) {
  597.         if (event.keyCode == 38 || event.keyCode == 40) {
  598.             var upPermitted = false;
  599.             var downPermitted = false;
  600.             var editor = PMA_consoleInput._inputs.console;
  601.             var cursorLine;
  602.             var totalLine;
  603.             if (PMA_consoleInput._codemirror) {
  604.                 cursorLine = editor.getCursor().line;
  605.                 totalLine = editor.lineCount();
  606.             } else {
  607.                 // Get cursor position from textarea
  608.                 var text = PMA_consoleInput.getText();
  609.                 cursorLine = text.substr(0, editor.prop("selectionStart")).split("\n").length - 1;
  610.                 totalLine = text.split(/\r*\n/).length;
  611.             }
  612.             if (cursorLine === 0) {
  613.                 upPermitted = true;
  614.             }
  615.             if (cursorLine == totalLine - 1) {
  616.                 downPermitted = true;
  617.             }
  618.             var nextCount;
  619.             var queryString = false;
  620.             if (upPermitted && event.keyCode == 38) {
  621.                 // Navigate up in history
  622.                 if (PMA_consoleInput._historyCount === 0) {
  623.                     PMA_consoleInput._historyPreserveCurrent = PMA_consoleInput.getText();
  624.                 }
  625.                 nextCount = PMA_consoleInput._historyCount + 1;
  626.                 queryString = PMA_consoleMessages.getHistory(nextCount);
  627.             } else if (downPermitted && event.keyCode == 40) {
  628.                 // Navigate down in history
  629.                 if (PMA_consoleInput._historyCount === 0) {
  630.                     return;
  631.                 }
  632.                 nextCount = PMA_consoleInput._historyCount - 1;
  633.                 if (nextCount === 0) {
  634.                     queryString = PMA_consoleInput._historyPreserveCurrent;
  635.                 } else {
  636.                     queryString = PMA_consoleMessages.getHistory(nextCount);
  637.                 }
  638.             }
  639.             if (queryString !== false) {
  640.                 PMA_consoleInput._historyCount = nextCount;
  641.                 PMA_consoleInput.setText(queryString, 'console');
  642.                 if (PMA_consoleInput._codemirror) {
  643.                     editor.setCursor(editor.lineCount(), 0);
  644.                 }
  645.                 event.preventDefault();
  646.             }
  647.         }
  648.     },
  649.     /**
  650.      * Mousedown event handler for bind to input
  651.      * Shortcut is Ctrl+Enter key or just ENTER, depending on console's
  652.      * configuration.
  653.      *
  654.      * @return void
  655.      */
  656.     _keydown: function(event) {
  657.         if (PMA_console.config.enterExecutes) {
  658.             // Enter, but not in combination with Shift (which writes a new line).
  659.             if (!event.shiftKey && event.keyCode === 13) {
  660.                 PMA_consoleInput.execute();
  661.             }
  662.         } else {
  663.             // Ctrl+Enter
  664.             if (event.ctrlKey && event.keyCode === 13) {
  665.                 PMA_consoleInput.execute();
  666.             }
  667.         }
  668.     },
  669.     /**
  670.      * Used for send text to PMA_console.execute()
  671.      *
  672.      * @return void
  673.      */
  674.     execute: function() {
  675.         if (PMA_consoleInput._codemirror) {
  676.             PMA_console.execute(PMA_consoleInput._inputs.console.getValue());
  677.         } else {
  678.             PMA_console.execute(PMA_consoleInput._inputs.console.val());
  679.         }
  680.     },
  681.     /**
  682.      * Used for clear the input
  683.      *
  684.      * @param string target, default target is console input
  685.      * @return void
  686.      */
  687.     clear: function(target) {
  688.         PMA_consoleInput.setText('', target);
  689.     },
  690.     /**
  691.      * Used for set focus to input
  692.      *
  693.      * @return void
  694.      */
  695.     focus: function() {
  696.         PMA_consoleInput._inputs.console.focus();
  697.     },
  698.     /**
  699.      * Used for blur input
  700.      *
  701.      * @return void
  702.      */
  703.     blur: function() {
  704.         if (PMA_consoleInput._codemirror) {
  705.             PMA_consoleInput._inputs.console.getInputField().blur();
  706.         } else {
  707.             PMA_consoleInput._inputs.console.blur();
  708.         }
  709.     },
  710.     /**
  711.      * Used for set text in input
  712.      *
  713.      * @param string text
  714.      * @param string target
  715.      * @return void
  716.      */
  717.     setText: function(text, target) {
  718.         if (PMA_consoleInput._codemirror) {
  719.             switch(target) {
  720.                 case 'bookmark':
  721.                     PMA_console.execute(PMA_consoleInput._inputs.bookmark.setValue(text));
  722.                     break;
  723.                 default:
  724.                 case 'console':
  725.                     PMA_console.execute(PMA_consoleInput._inputs.console.setValue(text));
  726.             }
  727.         } else {
  728.             switch(target) {
  729.                 case 'bookmark':
  730.                     PMA_console.execute(PMA_consoleInput._inputs.bookmark.val(text));
  731.                     break;
  732.                 default:
  733.                 case 'console':
  734.                     PMA_console.execute(PMA_consoleInput._inputs.console.val(text));
  735.             }
  736.         }
  737.     },
  738.     getText: function(target) {
  739.         if (PMA_consoleInput._codemirror) {
  740.             switch(target) {
  741.                 case 'bookmark':
  742.                     return PMA_consoleInput._inputs.bookmark.getValue();
  743.                 default:
  744.                 case 'console':
  745.                     return PMA_consoleInput._inputs.console.getValue();
  746.             }
  747.         } else {
  748.             switch(target) {
  749.                 case 'bookmark':
  750.                     return PMA_consoleInput._inputs.bookmark.val();
  751.                 default:
  752.                 case 'console':
  753.                     return PMA_consoleInput._inputs.console.val();
  754.             }
  755.         }
  756.     }
  757.  
  758. };
  759.  
  760.  
  761. /**
  762.  * Console messages, and message items management object
  763.  */
  764. var PMA_consoleMessages = {
  765.     /**
  766.      * Used for clear the messages
  767.      *
  768.      * @return void
  769.      */
  770.     clear: function() {
  771.         $('#pma_console').find('.content .console_message_container .message:not(.welcome)').addClass('hide');
  772.         $('#pma_console').find('.content .console_message_container .message.failed').remove();
  773.         $('#pma_console').find('.content .console_message_container .message.expanded').find('.action.collapse').click();
  774.     },
  775.     /**
  776.      * Used for show history messages
  777.      *
  778.      * @return void
  779.      */
  780.     showHistory: function() {
  781.         $('#pma_console').find('.content .console_message_container .message.hide').removeClass('hide');
  782.     },
  783.     /**
  784.      * Used for getting a perticular history query
  785.      *
  786.      * @param int nthLast get nth query message from latest, i.e 1st is last
  787.      * @return string message
  788.      */
  789.     getHistory: function(nthLast) {
  790.         var $queries = $('#pma_console').find('.content .console_message_container .query');
  791.         var length = $queries.length;
  792.         var $query = $queries.eq(length - nthLast);
  793.         if (!$query || (length - nthLast) < 0) {
  794.             return false;
  795.         } else {
  796.             return $query.text();
  797.         }
  798.     },
  799.     /**
  800.      * Used to show the correct message depending on which key
  801.      * combination executes the query (Ctrl+Enter or Enter).
  802.      *
  803.      * @param bool enterExecutes Only Enter has to be pressed to execute query.
  804.      * @return void
  805.      */
  806.     showInstructions: function(enterExecutes) {
  807.         enterExecutes = +enterExecutes || 0; // conversion to int
  808.         var $welcomeMsg = $('#pma_console').find('.content .console_message_container .message.welcome span');
  809.         $welcomeMsg.children('[id^=instructions]').hide();
  810.         $welcomeMsg.children('#instructions-' + enterExecutes).show();
  811.     },
  812.     /**
  813.      * Used for log new message
  814.      *
  815.      * @param string msgString Message to show
  816.      * @param string msgType Message type
  817.      * @return object, {message_id, $message}
  818.      */
  819.     append: function(msgString, msgType) {
  820.         if (typeof(msgString) !== 'string') {
  821.             return false;
  822.         }
  823.         // Generate an ID for each message, we can find them later
  824.         var msgId = Math.round(Math.random()*(899999999999)+100000000000);
  825.         var now = new Date();
  826.         var $newMessage =
  827.             $('<div class="message ' +
  828.                 (PMA_console.config.alwaysExpand ? 'expanded' : 'collapsed') +
  829.                 '" msgid="' + msgId + '"><div class="action_content"></div></div>');
  830.         switch(msgType) {
  831.             case 'query':
  832.                 $newMessage.append('<div class="query highlighted"></div>');
  833.                 if (PMA_consoleInput._codemirror) {
  834.                     CodeMirror.runMode(msgString,
  835.                         'text/x-sql', $newMessage.children('.query')[0]);
  836.                 } else {
  837.                     $newMessage.children('.query').text(msgString);
  838.                 }
  839.                 $newMessage.children('.action_content')
  840.                     .append(PMA_console.$consoleTemplates.children('.query_actions').html());
  841.                 break;
  842.             default:
  843.             case 'normal':
  844.                 $newMessage.append('<div>' + msgString + '</div>');
  845.         }
  846.         PMA_consoleMessages._msgEventBinds($newMessage);
  847.         $newMessage.find('span.text.query_time span')
  848.             .text(now.getHours() + ':' + now.getMinutes() + ':' + now.getSeconds())
  849.             .parent().attr('title', now);
  850.         return {message_id: msgId,
  851.                 $message: $newMessage.appendTo('#pma_console .content .console_message_container')};
  852.     },
  853.     /**
  854.      * Used for log new query
  855.      *
  856.      * @param string queryData Struct should be
  857.      * {sql_query: "Query string", db: "Target DB", table: "Target Table"}
  858.      * @param string state Message state
  859.      * @return object, {message_id: string message id, $message: JQuery object}
  860.      */
  861.     appendQuery: function(queryData, state) {
  862.         var targetMessage = PMA_consoleMessages.append(queryData.sql_query, 'query');
  863.         if (! targetMessage) {
  864.             return false;
  865.         }
  866.         if (queryData.db && queryData.table) {
  867.             targetMessage.$message.attr('targetdb', queryData.db);
  868.             targetMessage.$message.attr('targettable', queryData.table);
  869.             targetMessage.$message.find('.text.targetdb span').text(queryData.db);
  870.         }
  871.         if (PMA_console.isSelect(queryData.sql_query)) {
  872.             targetMessage.$message.addClass('select');
  873.         }
  874.         switch(state) {
  875.             case 'failed':
  876.                 targetMessage.$message.addClass('failed');
  877.                 break;
  878.             case 'successed':
  879.                 targetMessage.$message.addClass('successed');
  880.                 break;
  881.             default:
  882.             case 'pending':
  883.                 targetMessage.$message.addClass('pending');
  884.         }
  885.         return targetMessage;
  886.     },
  887.     _msgEventBinds: function($targetMessage) {
  888.         // Leave unbinded elements, remove binded.
  889.         $targetMessage = $targetMessage.filter(':not(.binded)');
  890.         if ($targetMessage.length === 0) {
  891.             return;
  892.         }
  893.         $targetMessage.addClass('binded');
  894.  
  895.         $targetMessage.find('.action.expand').click(function () {
  896.             $(this).closest('.message').removeClass('collapsed');
  897.             $(this).closest('.message').addClass('expanded');
  898.         });
  899.         $targetMessage.find('.action.collapse').click(function () {
  900.             $(this).closest('.message').addClass('collapsed');
  901.             $(this).closest('.message').removeClass('expanded');
  902.         });
  903.         $targetMessage.find('.action.edit').click(function () {
  904.             PMA_consoleInput.setText($(this).parent().siblings('.query').text());
  905.             PMA_consoleInput.focus();
  906.         });
  907.         $targetMessage.find('.action.requery').click(function () {
  908.             var query = $(this).parent().siblings('.query').text();
  909.             var $message = $(this).closest('.message');
  910.             if (confirm(PMA_messages.strConsoleRequeryConfirm + '\n' +
  911.                 (query.length<100 ? query : query.slice(0, 100) + '...'))
  912.             ) {
  913.                 PMA_console.execute(query, {db: $message.attr('targetdb'), table: $message.attr('targettable')});
  914.             }
  915.         });
  916.         $targetMessage.find('.action.bookmark').click(function () {
  917.             var query = $(this).parent().siblings('.query').text();
  918.             var $message = $(this).closest('.message');
  919.             PMA_consoleBookmarks.addBookmark(query, $message.attr('targetdb'));
  920.             PMA_console.showCard('#pma_bookmarks .card.add');
  921.         });
  922.         $targetMessage.find('.action.edit_bookmark').click(function () {
  923.             var query = $(this).parent().siblings('.query').text();
  924.             var $message = $(this).closest('.message');
  925.             var isShared = $message.find('span.bookmark_label').hasClass('shared');
  926.             var label = $message.find('span.bookmark_label').text();
  927.             PMA_consoleBookmarks.addBookmark(query, $message.attr('targetdb'), label, isShared);
  928.             PMA_console.showCard('#pma_bookmarks .card.add');
  929.         });
  930.         $targetMessage.find('.action.delete_bookmark').click(function () {
  931.             var $message = $(this).closest('.message');
  932.             if (confirm(PMA_messages.strConsoleDeleteBookmarkConfirm + '\n' + $message.find('.bookmark_label').text())) {
  933.                 $.post('import.php',
  934.                     {token: PMA_commonParams.get('token'),
  935.                     server: PMA_commonParams.get('server'),
  936.                     action_bookmark: 2,
  937.                     ajax_request: true,
  938.                     id_bookmark: $message.attr('bookmarkid')},
  939.                     function () {
  940.                         PMA_consoleBookmarks.refresh();
  941.                     });
  942.             }
  943.         });
  944.         $targetMessage.find('.action.profiling').click(function () {
  945.             var $message = $(this).closest('.message');
  946.             PMA_console.execute($(this).parent().siblings('.query').text(),
  947.                 {db: $message.attr('targetdb'),
  948.                 table: $message.attr('targettable'),
  949.                 profiling: true});
  950.         });
  951.         $targetMessage.find('.action.explain').click(function () {
  952.             var $message = $(this).closest('.message');
  953.             PMA_console.execute('EXPLAIN ' + $(this).parent().siblings('.query').text(),
  954.                 {db: $message.attr('targetdb'),
  955.                 table: $message.attr('targettable')});
  956.         });
  957.         $targetMessage.find('.action.dbg_show_trace').click(function () {
  958.             var $message = $(this).closest('.message');
  959.             if (!$message.find('.trace').length) {
  960.                 PMA_consoleDebug.getQueryDetails(
  961.                     $message.data('queryInfo'),
  962.                     $message.data('totalTime'),
  963.                     $message
  964.                 );
  965.                 PMA_consoleMessages._msgEventBinds($message.find('.message:not(.binded)'));
  966.             }
  967.             $message.addClass('show_trace');
  968.             $message.removeClass('hide_trace');
  969.         });
  970.         $targetMessage.find('.action.dbg_hide_trace').click(function () {
  971.             var $message = $(this).closest('.message');
  972.             $message.addClass('hide_trace');
  973.             $message.removeClass('show_trace');
  974.         });
  975.         $targetMessage.find('.action.dbg_show_args').click(function () {
  976.             var $message = $(this).closest('.message');
  977.             $message.addClass('show_args expanded');
  978.             $message.removeClass('hide_args collapsed');
  979.         });
  980.         $targetMessage.find('.action.dbg_hide_args').click(function () {
  981.             var $message = $(this).closest('.message');
  982.             $message.addClass('hide_args collapsed');
  983.             $message.removeClass('show_args expanded');
  984.         });
  985.         if (PMA_consoleInput._codemirror) {
  986.             $targetMessage.find('.query:not(.highlighted)').each(function(index, elem) {
  987.                     CodeMirror.runMode($(elem).text(),
  988.                         'text/x-sql', elem);
  989.                     $(this).addClass('highlighted');
  990.                 });
  991.         }
  992.     },
  993.     msgAppend: function(msgId, msgString, msgType) {
  994.         var $targetMessage = $('#pma_console').find('.content .console_message_container .message[msgid=' + msgId +']');
  995.         if ($targetMessage.length === 0 || isNaN(parseInt(msgId)) || typeof(msgString) !== 'string') {
  996.             return false;
  997.         }
  998.         $targetMessage.append('<div>' + msgString + '</div>');
  999.     },
  1000.     updateQuery: function(msgId, isSuccessed, queryData) {
  1001.         var $targetMessage = $('#pma_console').find('.console_message_container .message[msgid=' + parseInt(msgId) +']');
  1002.         if ($targetMessage.length === 0 || isNaN(parseInt(msgId))) {
  1003.             return false;
  1004.         }
  1005.         $targetMessage.removeClass('pending failed successed');
  1006.         if (isSuccessed) {
  1007.             $targetMessage.addClass('successed');
  1008.             if (queryData) {
  1009.                 $targetMessage.children('.query').text('');
  1010.                 $targetMessage.removeClass('select');
  1011.                 if (PMA_console.isSelect(queryData.sql_query)) {
  1012.                     $targetMessage.addClass('select');
  1013.                 }
  1014.                 if (PMA_consoleInput._codemirror) {
  1015.                     CodeMirror.runMode(queryData.sql_query, 'text/x-sql', $targetMessage.children('.query')[0]);
  1016.                 } else {
  1017.                     $targetMessage.children('.query').text(queryData.sql_query);
  1018.                 }
  1019.                 $targetMessage.attr('targetdb', queryData.db);
  1020.                 $targetMessage.attr('targettable', queryData.table);
  1021.                 $targetMessage.find('.text.targetdb span').text(queryData.db);
  1022.             }
  1023.         } else {
  1024.             $targetMessage.addClass('failed');
  1025.         }
  1026.     },
  1027.     /**
  1028.      * Used for console messages initialize
  1029.      *
  1030.      * @return void
  1031.      */
  1032.     initialize: function() {
  1033.         PMA_consoleMessages._msgEventBinds($('#pma_console').find('.message:not(.binded)'));
  1034.         if (PMA_console.config.startHistory) {
  1035.             PMA_consoleMessages.showHistory();
  1036.         }
  1037.         PMA_consoleMessages.showInstructions(PMA_console.config.enterExecutes);
  1038.     }
  1039. };
  1040.  
  1041.  
  1042. /**
  1043.  * Console bookmarks card, and bookmarks items management object
  1044.  */
  1045. var PMA_consoleBookmarks = {
  1046.     _bookmarks: [],
  1047.     addBookmark: function (queryString, targetDb, label, isShared, id) {
  1048.         $('#pma_bookmarks').find('.add [name=shared]').prop('checked', false);
  1049.         $('#pma_bookmarks').find('.add [name=label]').val('');
  1050.         $('#pma_bookmarks').find('.add [name=targetdb]').val('');
  1051.         $('#pma_bookmarks').find('.add [name=id_bookmark]').val('');
  1052.         PMA_consoleInput.setText('', 'bookmark');
  1053.  
  1054.         switch(arguments.length) {
  1055.             case 4:
  1056.                 $('#pma_bookmarks').find('.add [name=shared]').prop('checked', isShared);
  1057.             case 3:
  1058.                 $('#pma_bookmarks').find('.add [name=label]').val(label);
  1059.             case 2:
  1060.                 $('#pma_bookmarks').find('.add [name=targetdb]').val(targetDb);
  1061.             case 1:
  1062.                 PMA_consoleInput.setText(queryString, 'bookmark');
  1063.             default:
  1064.                 break;
  1065.         }
  1066.     },
  1067.     refresh: function () {
  1068.         $.get('import.php',
  1069.             {ajax_request: true,
  1070.             token: PMA_commonParams.get('token'),
  1071.             server: PMA_commonParams.get('server'),
  1072.             console_bookmark_refresh: 'refresh'},
  1073.             function(data) {
  1074.                 if (data.console_message_bookmark) {
  1075.                     $('#pma_bookmarks').find('.content.bookmark').html(data.console_message_bookmark);
  1076.                     PMA_consoleMessages._msgEventBinds($('#pma_bookmarks').find('.message:not(.binded)'));
  1077.                 }
  1078.             });
  1079.     },
  1080.     /**
  1081.      * Used for console bookmarks initialize
  1082.      * message events are already binded by PMA_consoleMsg._msgEventBinds
  1083.      *
  1084.      * @return void
  1085.      */
  1086.     initialize: function() {
  1087.         if ($('#pma_bookmarks').length === 0) {
  1088.             return;
  1089.         }
  1090.         $('#pma_console').find('.button.bookmarks').click(function() {
  1091.             PMA_console.showCard('#pma_bookmarks');
  1092.         });
  1093.         $('#pma_bookmarks').find('.button.add').click(function() {
  1094.             PMA_console.showCard('#pma_bookmarks .card.add');
  1095.         });
  1096.         $('#pma_bookmarks').find('.card.add [name=submit]').click(function () {
  1097.             if ($('#pma_bookmarks').find('.card.add [name=label]').val().length === 0
  1098.                 || PMA_consoleInput.getText('bookmark').length === 0)
  1099.             {
  1100.                 alert(PMA_messages.strFormEmpty);
  1101.                 return;
  1102.             }
  1103.             $(this).prop('disabled', true);
  1104.             $.post('import.php',
  1105.                 {token: PMA_commonParams.get('token'),
  1106.                 ajax_request: true,
  1107.                 console_bookmark_add: 'true',
  1108.                 label: $('#pma_bookmarks').find('.card.add [name=label]').val(),
  1109.                 server: PMA_commonParams.get('server'),
  1110.                 db: $('#pma_bookmarks').find('.card.add [name=targetdb]').val(),
  1111.                 bookmark_query: PMA_consoleInput.getText('bookmark'),
  1112.                 shared: $('#pma_bookmarks').find('.card.add [name=shared]').prop('checked')},
  1113.                 function () {
  1114.                     PMA_consoleBookmarks.refresh();
  1115.                     $('#pma_bookmarks').find('.card.add [name=submit]').prop('disabled', false);
  1116.                     PMA_console.hideCard($('#pma_bookmarks').find('.card.add'));
  1117.                 });
  1118.         });
  1119.         $('#pma_console').find('.button.refresh').click(function() {
  1120.             PMA_consoleBookmarks.refresh();
  1121.         });
  1122.     }
  1123. };
  1124.  
  1125. var PMA_consoleDebug;
  1126. PMA_consoleDebug = {
  1127.     _config: {
  1128.         groupQueries: false,
  1129.         orderBy: 'exec', // Possible 'exec' => Execution order, 'time' => Time taken, 'count'
  1130.         order: 'asc' // Possible 'asc', 'desc'
  1131.     },
  1132.     _lastDebugInfo: {
  1133.         debugInfo: null,
  1134.         url: null
  1135.     },
  1136.     initialize: function () {
  1137.         // Try to get debug info after every AJAX request
  1138.         $(document).ajaxSuccess(function (event, xhr, settings, data) {
  1139.             if (data._debug) {
  1140.                 PMA_consoleDebug.showLog(data._debug, settings.url);
  1141.             }
  1142.         });
  1143.  
  1144.         // Initialize config
  1145.         this._initConfig();
  1146.  
  1147.         if (this.configParam('groupQueries')) {
  1148.             $('#debug_console').addClass('grouped');
  1149.         } else {
  1150.             $('#debug_console').addClass('ungrouped');
  1151.             if (PMA_consoleDebug.configParam('orderBy') == 'count') {
  1152.                 $('#debug_console').find('.button.order_by.sort_exec').addClass('active');
  1153.             }
  1154.         }
  1155.         var orderBy = this.configParam('orderBy');
  1156.         var order = this.configParam('order');
  1157.         $('#debug_console').find('.button.order_by.sort_' + orderBy).addClass('active');
  1158.         $('#debug_console').find('.button.order.order_' + order).addClass('active');
  1159.  
  1160.         // Initialize actions in toolbar
  1161.         $('#debug_console').find('.button.group_queries').click(function () {
  1162.             $('#debug_console').addClass('grouped');
  1163.             $('#debug_console').removeClass('ungrouped');
  1164.             PMA_consoleDebug.configParam('groupQueries', true);
  1165.             PMA_consoleDebug.refresh();
  1166.             if (PMA_consoleDebug.configParam('orderBy') == 'count') {
  1167.                 $('#debug_console').find('.button.order_by.sort_exec').removeClass('active');
  1168.             }
  1169.         });
  1170.         $('#debug_console').find('.button.ungroup_queries').click(function () {
  1171.             $('#debug_console').addClass('ungrouped');
  1172.             $('#debug_console').removeClass('grouped');
  1173.             PMA_consoleDebug.configParam('groupQueries', false);
  1174.             PMA_consoleDebug.refresh();
  1175.             if (PMA_consoleDebug.configParam('orderBy') == 'count') {
  1176.                 $('#debug_console').find('.button.order_by.sort_exec').addClass('active');
  1177.             }
  1178.         });
  1179.         $('#debug_console').find('.button.order_by').click(function () {
  1180.             var $this = $(this);
  1181.             $('#debug_console').find('.button.order_by').removeClass('active');
  1182.             $this.addClass('active');
  1183.             if ($this.hasClass('sort_time')) {
  1184.                 PMA_consoleDebug.configParam('orderBy', 'time');
  1185.             } else if ($this.hasClass('sort_exec')) {
  1186.                 PMA_consoleDebug.configParam('orderBy', 'exec');
  1187.             } else if ($this.hasClass('sort_count')) {
  1188.                 PMA_consoleDebug.configParam('orderBy', 'count');
  1189.             }
  1190.             PMA_consoleDebug.refresh();
  1191.         });
  1192.         $('#debug_console').find('.button.order').click(function () {
  1193.             var $this = $(this);
  1194.             $('#debug_console').find('.button.order').removeClass('active');
  1195.             $this.addClass('active');
  1196.             if ($this.hasClass('order_asc')) {
  1197.                 PMA_consoleDebug.configParam('order', 'asc');
  1198.             } else if ($this.hasClass('order_desc')) {
  1199.                 PMA_consoleDebug.configParam('order', 'desc');
  1200.             }
  1201.             PMA_consoleDebug.refresh();
  1202.         });
  1203.  
  1204.         // Show SQL debug info for first page load
  1205.         if (typeof debugSQLInfo !== 'undefined' && debugSQLInfo !== 'null') {
  1206.             $('#pma_console').find('.button.debug').removeClass('hide');
  1207.         }
  1208.         else {
  1209.             return;
  1210.         }
  1211.         PMA_consoleDebug.showLog(debugSQLInfo);
  1212.     },
  1213.     _initConfig: function () {
  1214.         var config = JSON.parse($.cookie('pma_console_dbg_config'));
  1215.         if (config) {
  1216.             for (var name in config) {
  1217.                 if (config.hasOwnProperty(name)) {
  1218.                     this._config[name] = config[name];
  1219.                 }
  1220.             }
  1221.         }
  1222.     },
  1223.     configParam: function (name, value) {
  1224.         if (typeof value === 'undefined') {
  1225.             return this._config[name];
  1226.         }
  1227.         this._config[name] = value;
  1228.         $.cookie('pma_console_dbg_config', JSON.stringify(this._config));
  1229.         return value;
  1230.     },
  1231.     _formatFunctionCall: function (dbgStep) {
  1232.         var functionName = '';
  1233.         if ('class' in dbgStep) {
  1234.             functionName += dbgStep.class;
  1235.             functionName += dbgStep.type;
  1236.         }
  1237.         functionName += dbgStep.function;
  1238.         if (dbgStep.args.length) {
  1239.             functionName += '(...)';
  1240.         } else {
  1241.             functionName += '()';
  1242.         }
  1243.         return functionName;
  1244.     },
  1245.     _formatFunctionArgs: function (dbgStep) {
  1246.         var $args = $('<div>');
  1247.         if (dbgStep.args.length) {
  1248.             $args.append('<div class="message welcome">')
  1249.                 .append(
  1250.                 $('<div class="message welcome">')
  1251.                     .text(
  1252.                     PMA_sprintf(
  1253.                         PMA_messages.strConsoleDebugArgsSummary,
  1254.                         dbgStep.args.length
  1255.                     )
  1256.                 )
  1257.             );
  1258.             for (var i = 0; i < dbgStep.args.length; i++) {
  1259.                 $args.append(
  1260.                     $('<div class="message">')
  1261.                         .html(
  1262.                         '<pre>' +
  1263.                         escapeHtml(JSON.stringify(dbgStep.args[i], null, "  ")) +
  1264.                         '</pre>'
  1265.                     )
  1266.                 );
  1267.             }
  1268.         }
  1269.         return $args;
  1270.     },
  1271.     _formatFileName: function (dbgStep) {
  1272.         var fileName = '';
  1273.         if ('file' in dbgStep) {
  1274.             fileName += dbgStep.file;
  1275.             fileName += '#' + dbgStep.line;
  1276.         }
  1277.         return fileName;
  1278.     },
  1279.     _formatBackTrace: function (dbgTrace) {
  1280.         var $traceElem = $('<div class="trace">');
  1281.         $traceElem.append(
  1282.             $('<div class="message welcome">')
  1283.         );
  1284.         var step, $stepElem;
  1285.         for (var stepId in dbgTrace) {
  1286.             if (dbgTrace.hasOwnProperty(stepId)) {
  1287.                 step = dbgTrace[stepId];
  1288.                 if (!Array.isArray(step) && typeof step !== 'object') {
  1289.                     $stepElem =
  1290.                         $('<div class="message traceStep collapsed hide_args">')
  1291.                             .append(
  1292.                             $('<span>').text(step)
  1293.                         );
  1294.                 } else {
  1295.                     if (typeof step.args === 'string' && step.args) {
  1296.                         step.args = [step.args];
  1297.                     }
  1298.                     $stepElem =
  1299.                         $('<div class="message traceStep collapsed hide_args">')
  1300.                             .append(
  1301.                             $('<span class="function">').text(this._formatFunctionCall(step))
  1302.                         )
  1303.                             .append(
  1304.                             $('<span class="file">').text(this._formatFileName(step))
  1305.                         );
  1306.                     if (step.args.length) {
  1307.                         $stepElem
  1308.                             .append(
  1309.                             $('<span class="args">').html(this._formatFunctionArgs(step))
  1310.                         )
  1311.                             .prepend(
  1312.                             $('<div class="action_content">')
  1313.                                 .append(
  1314.                                 '<span class="action dbg_show_args">' +
  1315.                                 PMA_messages.strConsoleDebugShowArgs +
  1316.                                 '</span> '
  1317.                             )
  1318.                                 .append(
  1319.                                 '<span class="action dbg_hide_args">' +
  1320.                                 PMA_messages.strConsoleDebugHideArgs +
  1321.                                 '</span> '
  1322.                             )
  1323.                         );
  1324.                     }
  1325.                 }
  1326.                 $traceElem.append($stepElem);
  1327.             }
  1328.         }
  1329.         return $traceElem;
  1330.     },
  1331.     _formatQueryOrGroup: function (queryInfo, totalTime) {
  1332.         var grouped, queryText, queryTime, count, i;
  1333.         if (Array.isArray(queryInfo)) {
  1334.             // It is grouped
  1335.             grouped = true;
  1336.  
  1337.             queryText = queryInfo[0].query;
  1338.  
  1339.             queryTime = 0;
  1340.             for (i in queryInfo) {
  1341.                 queryTime += queryInfo[i].time;
  1342.             }
  1343.  
  1344.             count = queryInfo.length;
  1345.         } else {
  1346.             queryText = queryInfo.query;
  1347.             queryTime = queryInfo.time;
  1348.         }
  1349.  
  1350.         var $query = $('<div class="message collapsed hide_trace">')
  1351.             .append(
  1352.             $('#debug_console').find('.templates .debug_query').clone()
  1353.         )
  1354.             .append(
  1355.             $('<div class="query">')
  1356.                 .text(queryText)
  1357.         )
  1358.             .data('queryInfo', queryInfo)
  1359.             .data('totalTime', totalTime);
  1360.         if (grouped) {
  1361.             $query.find('.text.count').removeClass('hide');
  1362.             $query.find('.text.count span').text(count);
  1363.         }
  1364.         $query.find('.text.time span').text(queryTime + 's (' + ((queryTime * 100) / totalTime).toFixed(3) + '%)');
  1365.  
  1366.         return $query;
  1367.     },
  1368.     _appendQueryExtraInfo: function (query, $elem) {
  1369.         if ('error' in query) {
  1370.             $elem.append(
  1371.                 $('<div>').html(query.error)
  1372.             );
  1373.         }
  1374.         $elem.append(this._formatBackTrace(query.trace));
  1375.     },
  1376.     getQueryDetails: function (queryInfo, totalTime, $query) {
  1377.         if (Array.isArray(queryInfo)) {
  1378.             var $singleQuery;
  1379.             for (var i in queryInfo) {
  1380.                 $singleQuery = $('<div class="message welcome trace">')
  1381.                     .text((parseInt(i) + 1) + '.')
  1382.                     .append(
  1383.                     $('<span class="time">').text(
  1384.                         PMA_messages.strConsoleDebugTimeTaken +
  1385.                         ' ' + queryInfo[i].time + 's' +
  1386.                         ' (' + ((queryInfo[i].time * 100) / totalTime).toFixed(3) + '%)'
  1387.                     )
  1388.                 );
  1389.                 this._appendQueryExtraInfo(queryInfo[i], $singleQuery);
  1390.                 $query
  1391.                     .append('<div class="message welcome trace">')
  1392.                     .append($singleQuery);
  1393.             }
  1394.         } else {
  1395.             this._appendQueryExtraInfo(queryInfo, $query);
  1396.         }
  1397.     },
  1398.     showLog: function (debugInfo, url) {
  1399.         this._lastDebugInfo.debugInfo = debugInfo;
  1400.         this._lastDebugInfo.url = url;
  1401.  
  1402.         $('#debug_console').find('.debugLog').empty();
  1403.         $("#debug_console").find(".debug>.welcome").empty();
  1404.  
  1405.         var debugJson = false, i;
  1406.         if (typeof debugInfo === "object" && 'queries' in debugInfo) {
  1407.             // Copy it to debugJson, so that it doesn't get changed
  1408.             if (!('queries' in debugInfo)) {
  1409.                 debugJson = false;
  1410.             } else {
  1411.                 debugJson = {queries: []};
  1412.                 for (i in debugInfo.queries) {
  1413.                     debugJson.queries[i] = debugInfo.queries[i];
  1414.                 }
  1415.             }
  1416.         } else if (typeof debugInfo === "string") {
  1417.             try {
  1418.                 debugJson = JSON.parse(debugInfo);
  1419.             } catch (e) {
  1420.                 debugJson = false;
  1421.             }
  1422.             if (debugJson && !('queries' in debugJson)) {
  1423.                 debugJson = false;
  1424.             }
  1425.         }
  1426.         if (debugJson === false) {
  1427.             $("#debug_console").find(".debug>.welcome").text(
  1428.                 PMA_messages.strConsoleDebugError
  1429.             );
  1430.             return;
  1431.         }
  1432.         var allQueries = debugJson.queries;
  1433.         var uniqueQueries = {};
  1434.  
  1435.         var totalExec = allQueries.length;
  1436.  
  1437.         // Calculate total time and make unique query array
  1438.         var totalTime = 0;
  1439.         for (i = 0; i < totalExec; ++i) {
  1440.             totalTime += allQueries[i].time;
  1441.             if (!(allQueries[i].hash in uniqueQueries)) {
  1442.                 uniqueQueries[allQueries[i].hash] = [];
  1443.             }
  1444.             uniqueQueries[allQueries[i].hash].push(allQueries[i]);
  1445.         }
  1446.         // Count total unique queries, convert uniqueQueries to Array
  1447.         var totalUnique = 0, uniqueArray = [];
  1448.         for (var hash in uniqueQueries) {
  1449.             if (uniqueQueries.hasOwnProperty(hash)) {
  1450.                 ++totalUnique;
  1451.                 uniqueArray.push(uniqueQueries[hash]);
  1452.             }
  1453.         }
  1454.         uniqueQueries = uniqueArray;
  1455.         // Show summary
  1456.         $("#debug_console").find(".debug>.welcome").append(
  1457.             $('<span class="debug_summary">').text(
  1458.                 PMA_sprintf(
  1459.                     PMA_messages.strConsoleDebugSummary,
  1460.                     totalUnique,
  1461.                     totalExec,
  1462.                     totalTime
  1463.                 )
  1464.             )
  1465.         );
  1466.         if (url) {
  1467.             $("#debug_console").find(".debug>.welcome").append(
  1468.                 $('<span class="script_name">').text(url.split('?')[0])
  1469.             );
  1470.         }
  1471.  
  1472.         // For sorting queries
  1473.         function sortByTime(a, b) {
  1474.             var order = ((PMA_consoleDebug.configParam('order') == 'asc') ? 1 : -1);
  1475.             if (Array.isArray(a) && Array.isArray(b)) {
  1476.                 // It is grouped
  1477.                 var timeA = 0, timeB = 0, i;
  1478.                 for (i in a) {
  1479.                     timeA += a[i].time;
  1480.                 }
  1481.                 for (i in b) {
  1482.                     timeB += b[i].time;
  1483.                 }
  1484.                 return (timeA - timeB) * order;
  1485.             } else {
  1486.                 return (a.time - b.time) * order;
  1487.             }
  1488.         }
  1489.  
  1490.         function sortByCount(a, b) {
  1491.             var order = ((PMA_consoleDebug.configParam('order') == 'asc') ? 1 : -1);
  1492.             return (a.length - b.length) * order;
  1493.         }
  1494.  
  1495.         var orderBy = this.configParam('orderBy');
  1496.         var order = PMA_consoleDebug.configParam('order');
  1497.  
  1498.         if (this.configParam('groupQueries')) {
  1499.             // Sort queries
  1500.             if (orderBy == 'time') {
  1501.                 uniqueQueries.sort(sortByTime);
  1502.             } else if (orderBy == 'count') {
  1503.                 uniqueQueries.sort(sortByCount);
  1504.             } else if (orderBy == 'exec' && order == 'desc') {
  1505.                 uniqueQueries.reverse();
  1506.             }
  1507.             for (i in uniqueQueries) {
  1508.                 if (orderBy == 'time') {
  1509.                     uniqueQueries[i].sort(sortByTime);
  1510.                 } else if (orderBy == 'exec' && order == 'desc') {
  1511.                     uniqueQueries[i].reverse();
  1512.                 }
  1513.                 $('#debug_console').find('.debugLog').append(this._formatQueryOrGroup(uniqueQueries[i], totalTime));
  1514.             }
  1515.         } else {
  1516.             if (orderBy == 'time') {
  1517.                 allQueries.sort(sortByTime);
  1518.             } else if (order == 'desc') {
  1519.                 allQueries.reverse();
  1520.             }
  1521.             for (i = 0; i < totalExec; ++i) {
  1522.                 $('#debug_console').find('.debugLog').append(this._formatQueryOrGroup(allQueries[i], totalTime));
  1523.             }
  1524.         }
  1525.  
  1526.         PMA_consoleMessages._msgEventBinds($('#debug_console').find('.message:not(.binded)'));
  1527.     },
  1528.     refresh: function () {
  1529.         var last = this._lastDebugInfo;
  1530.         PMA_consoleDebug.showLog(last.debugInfo, last.url);
  1531.     }
  1532. };
  1533.  
  1534. /**s
  1535.  * Executed on page load
  1536.  */
  1537. $(function () {
  1538.     PMA_console.initialize();
  1539. });

Paste-bin is for source code and general debugging text.

Login or Register to edit, delete and keep track of your pastes and more.

Raw Paste
' + '' + '' + '' + '' + '' + '' ); PMA_console.$requestForm.bind('submit', AJAX.requestHandler); // Event binds shouldn't run again if (PMA_console.isInitialized === false) { // Load config first var tempConfig = JSON.parse($.cookie('pma_console_config')); if (tempConfig) { if (tempConfig.alwaysExpand === true) { $('#pma_console_options input[name=always_expand]').prop('checked', true); } if (tempConfig.startHistory === true) { $('#pma_console_options').find('input[name=start_history]').prop('checked', true); } if (tempConfig.currentQuery === true) { $('#pma_console_options').find('input[name=current_query]').prop('checked', true); } if (ConsoleEnterExecutes === true) { $('#pma_console_options').find('input[name=enter_executes]').prop('checked', true); } if (tempConfig.darkTheme === true) { $('#pma_console_options').find('input[name=dark_theme]').prop('checked', true); $('#pma_console').find('>.content').addClass('console_dark_theme'); } } else { $('#pma_console_options').find('input[name=current_query]').prop('checked', true); } PMA_console.updateConfig(); PMA_consoleResizer.initialize(); PMA_consoleInput.initialize(); PMA_consoleMessages.initialize(); PMA_consoleBookmarks.initialize(); PMA_consoleDebug.initialize(); PMA_console.$consoleToolbar.children('.console_switch').click(PMA_console.toggle); $(document).keydown(function(event) { // Ctrl + Alt + C if (event.ctrlKey && event.altKey && event.keyCode === 67) { PMA_console.toggle(); } }); $('#pma_console').find('.toolbar').children().mousedown(function(event) { event.preventDefault(); event.stopImmediatePropagation(); }); $('#pma_console').find('.button.clear').click(function() { PMA_consoleMessages.clear(); }); $('#pma_console').find('.button.history').click(function() { PMA_consoleMessages.showHistory(); }); $('#pma_console').find('.button.options').click(function() { PMA_console.showCard('#pma_console_options'); }); $('#pma_console').find('.button.debug').click(function() { PMA_console.showCard('#debug_console'); }); PMA_console.$consoleContent.click(function(event) { if (event.target == this) { PMA_consoleInput.focus(); } }); $('#pma_console').find('.mid_layer').click(function() { PMA_console.hideCard($(this).parent().children('.card')); }); $('#debug_console').find('.switch_button').click(function() { PMA_console.hideCard($(this).closest('.card')); }); $('#pma_bookmarks').find('.switch_button').click(function() { PMA_console.hideCard($(this).closest('.card')); }); $('#pma_console_options').find('.switch_button').click(function() { PMA_console.hideCard($(this).closest('.card')); }); $('#pma_console_options').find('input[type=checkbox]').change(function() { PMA_console.updateConfig(); }); $('#pma_console_options').find('.button.default').click(function() { $('#pma_console_options input[name=always_expand]').prop('checked', false); $('#pma_console_options').find('input[name=start_history]').prop('checked', false); $('#pma_console_options').find('input[name=current_query]').prop('checked', true); $('#pma_console_options').find('input[name=enter_executes]').prop('checked', false); $('#pma_console_options').find('input[name=dark_theme]').prop('checked', false); PMA_console.updateConfig(); }); $('#pma_console_options').find('input[name=enter_executes]').change(function() { PMA_consoleMessages.showInstructions(PMA_console.config.enterExecutes); }); $(document).ajaxComplete(function (event, xhr, ajaxOptions) { if (ajaxOptions.dataType != 'json') { return; } try { var data = $.parseJSON(xhr.responseText); PMA_console.ajaxCallback(data); } catch (e) { console.log("Invalid JSON!" + e.message); if (AJAX.xhr && AJAX.xhr.status === 0 && AJAX.xhr.statusText !== 'abort') { PMA_ajaxShowMessage($('
',{'class':'error','html':PMA_messages.strRequestFailed+' ( '+escapeHtml(AJAX.xhr.statusText)+' )'})); AJAX.active = false; AJAX.xhr = null; } } }); PMA_console.isInitialized = true; } // Change console mode from cookie switch($.cookie('pma_console_mode')) { case 'collapse': PMA_console.collapse(); break; /* jshint -W086 */// no break needed in default section default: $.cookie('pma_console_mode', 'info'); case 'info': /* jshint +W086 */ PMA_console.info(); break; case 'show': PMA_console.show(true); PMA_console.scrollBottom(); break; } }, /** * Execute query and show results in console * * @return void */ execute: function(queryString, options) { if (typeof(queryString) != 'string' || ! /[a-z]|[A-Z]/.test(queryString)) { return; } PMA_console.$requestForm.children('textarea').val(queryString); PMA_console.$requestForm.children('[name=server]').attr('value', PMA_commonParams.get('server')); if (options && options.db) { PMA_console.$requestForm.children('[name=db]').val(options.db); if (options.table) { PMA_console.$requestForm.children('[name=table]').val(options.table); } else { PMA_console.$requestForm.children('[name=table]').val(''); } } else { PMA_console.$requestForm.children('[name=db]').val( (PMA_commonParams.get('db').length > 0 ? PMA_commonParams.get('db') : '')); } PMA_console.$requestForm.find('[name=profiling]').remove(); if (options && options.profiling === true) { PMA_console.$requestForm.append(''); } if (! confirmQuery(PMA_console.$requestForm[0], PMA_console.$requestForm.children('textarea')[0])) { return; } PMA_console.$requestForm.children('[name=console_message_id]') .val(PMA_consoleMessages.appendQuery({sql_query: queryString}).message_id); PMA_console.$requestForm.trigger('submit'); PMA_consoleInput.clear(); PMA_reloadNavigation(); }, ajaxCallback: function(data) { if (data && data.console_message_id) { PMA_consoleMessages.updateQuery(data.console_message_id, data.success, (data._reloadQuerywindow ? data._reloadQuerywindow : false)); } else if ( data && data._reloadQuerywindow) { if (data._reloadQuerywindow.sql_query.length > 0) { PMA_consoleMessages.appendQuery(data._reloadQuerywindow, 'successed') .$message.addClass(PMA_console.config.currentQuery ? '' : 'hide'); } } }, /** * Change console to collapse mode * * @return void */ collapse: function() { $.cookie('pma_console_mode', 'collapse'); var pmaConsoleHeight = $.cookie('pma_console_height'); if (pmaConsoleHeight < 32) { $.cookie('pma_console_height', 92); } PMA_console.$consoleToolbar.addClass('collapsed'); PMA_console.$consoleAllContents.height(pmaConsoleHeight); PMA_console.$consoleContent.stop(); PMA_console.$consoleContent.animate({'margin-bottom': -1 * PMA_console.$consoleContent.outerHeight() + 'px'}, 'fast', 'easeOutQuart', function() { PMA_console.$consoleContent.css({display:'none'}); $(window).trigger('resize'); }); PMA_console.hideCard(); }, /** * Show console * * @param bool inputFocus If true, focus the input line after show() * @return void */ show: function(inputFocus) { $.cookie('pma_console_mode', 'show'); var pmaConsoleHeight = $.cookie('pma_console_height'); if (pmaConsoleHeight < 32) { $.cookie('pma_console_height', 32); PMA_console.collapse(); return; } PMA_console.$consoleContent.css({display:'block'}); if (PMA_console.$consoleToolbar.hasClass('collapsed')) { PMA_console.$consoleToolbar.removeClass('collapsed'); } PMA_console.$consoleAllContents.height(pmaConsoleHeight); PMA_console.$consoleContent.stop(); PMA_console.$consoleContent.animate({'margin-bottom': 0}, 'fast', 'easeOutQuart', function() { $(window).trigger('resize'); if (inputFocus) { PMA_consoleInput.focus(); } }); }, /** * Change console to SQL information mode * this mode shows current SQL query * This mode is the default mode * * @return void */ info: function() { // Under construction PMA_console.collapse(); }, /** * Toggle console mode between collapse/show * Used for toggle buttons and shortcuts * * @return void */ toggle: function() { switch($.cookie('pma_console_mode')) { case 'collapse': case 'info': PMA_console.show(true); break; case 'show': PMA_console.collapse(); break; default: PMA_consoleInitialize(); } }, /** * Scroll console to bottom * * @return void */ scrollBottom: function() { PMA_console.$consoleContent.scrollTop(PMA_console.$consoleContent.prop("scrollHeight")); }, /** * Show card * * @param string cardSelector Selector, select string will be "#pma_console " + cardSelector * this param also can be JQuery object, if you need. * * @return void */ showCard: function(cardSelector) { var $card = null; if (typeof(cardSelector) !== 'string') { if (cardSelector.length > 0) { $card = cardSelector; } else { return; } } else { $card = $("#pma_console " + cardSelector); } if ($card.length === 0) { return; } $card.parent().children('.mid_layer').show().fadeTo(0, 0.15); $card.addClass('show'); PMA_consoleInput.blur(); if ($card.parents('.card').length > 0) { PMA_console.showCard($card.parents('.card')); } }, /** * Scroll console to bottom * * @param object $targetCard Target card JQuery object, if it's empty, function will hide all cards * @return void */ hideCard: function($targetCard) { if (! $targetCard) { $('#pma_console').find('.mid_layer').fadeOut(140); $('#pma_console').find('.card').removeClass('show'); } else if ($targetCard.length > 0) { $targetCard.parent().find('.mid_layer').fadeOut(140); $targetCard.find('.card').removeClass('show'); $targetCard.removeClass('show'); } }, /** * Used for update console config * * @return void */ updateConfig: function() { PMA_console.config = { alwaysExpand: $('#pma_console_options input[name=always_expand]').prop('checked'), startHistory: $('#pma_console_options').find('input[name=start_history]').prop('checked'), currentQuery: $('#pma_console_options').find('input[name=current_query]').prop('checked'), enterExecutes: $('#pma_console_options').find('input[name=enter_executes]').prop('checked'), darkTheme: $('#pma_console_options').find('input[name=dark_theme]').prop('checked') }; $.cookie('pma_console_config', JSON.stringify(PMA_console.config)); /*Setting the dark theme of the console*/ if (PMA_console.config.darkTheme) { $('#pma_console').find('>.content').addClass('console_dark_theme'); } else { $('#pma_console').find('>.content').removeClass('console_dark_theme'); } }, isSelect: function (queryString) { var reg_exp = /^SELECT\s+/i; return reg_exp.test(queryString); } }; /** * Resizer object * Careful: this object UI logics highly related with functions under PMA_console * Resizing min-height is 32, if small than it, console will collapse */ var PMA_consoleResizer = { _posY: 0, _height: 0, _resultHeight: 0, /** * Mousedown event handler for bind to resizer * * @return void */ _mousedown: function(event) { if ($.cookie('pma_console_mode') !== 'show') { return; } PMA_consoleResizer._posY = event.pageY; PMA_consoleResizer._height = PMA_console.$consoleContent.height(); $(document).mousemove(PMA_consoleResizer._mousemove); $(document).mouseup(PMA_consoleResizer._mouseup); // Disable text selection while resizing $(document).bind('selectstart', function() { return false; }); }, /** * Mousemove event handler for bind to resizer * * @return void */ _mousemove: function(event) { if (event.pageY < 35) { event.pageY = 35 } PMA_consoleResizer._resultHeight = PMA_consoleResizer._height + (PMA_consoleResizer._posY -event.pageY); // Content min-height is 32, if adjusting height small than it we'll move it out of the page if (PMA_consoleResizer._resultHeight <= 32) { PMA_console.$consoleAllContents.height(32); PMA_console.$consoleContent.css('margin-bottom', PMA_consoleResizer._resultHeight - 32); } else { // Logic below makes viewable area always at bottom when adjusting height and content already at bottom if (PMA_console.$consoleContent.scrollTop() + PMA_console.$consoleContent.innerHeight() + 16 >= PMA_console.$consoleContent.prop('scrollHeight')) { PMA_console.$consoleAllContents.height(PMA_consoleResizer._resultHeight); PMA_console.scrollBottom(); } else { PMA_console.$consoleAllContents.height(PMA_consoleResizer._resultHeight); } } }, /** * Mouseup event handler for bind to resizer * * @return void */ _mouseup: function() { $.cookie('pma_console_height', PMA_consoleResizer._resultHeight); PMA_console.show(); $(document).unbind('mousemove'); $(document).unbind('mouseup'); $(document).unbind('selectstart'); }, /** * Used for console resizer initialize * * @return void */ initialize: function() { $('#pma_console').find('.toolbar').unbind('mousedown'); $('#pma_console').find('.toolbar').mousedown(PMA_consoleResizer._mousedown); } }; /** * Console input object */ var PMA_consoleInput = { /** * @var array, contains Codemirror objects or input jQuery objects * @access private */ _inputs: null, /** * @var bool, if codemirror enabled * @access private */ _codemirror: false, /** * @var int, count for history navigation, 0 for current input * @access private */ _historyCount: 0, /** * @var string, current input when navigating through history * @access private */ _historyPreserveCurrent: null, /** * Used for console input initialize * * @return void */ initialize: function() { // _cm object can't be reinitialize if (PMA_consoleInput._inputs !== null) { return; } if (typeof CodeMirror !== 'undefined') { PMA_consoleInput._codemirror = true; } PMA_consoleInput._inputs = []; if (PMA_consoleInput._codemirror) { PMA_consoleInput._inputs.console = CodeMirror($('#pma_console').find('.console_query_input')[0], { theme: 'pma', mode: 'text/x-sql', lineWrapping: true, extraKeys: {"Ctrl-Space": "autocomplete"}, hintOptions: {"completeSingle": false, "completeOnSingleClick": true}, gutters: ["CodeMirror-lint-markers"], lint: { "getAnnotations": CodeMirror.sqlLint, "async": true, } }); PMA_consoleInput._inputs.console.on("inputRead", codemirrorAutocompleteOnInputRead); PMA_consoleInput._inputs.console.on("keydown", function(instance, event) { PMA_consoleInput._historyNavigate(event); }); if ($('#pma_bookmarks').length !== 0) { PMA_consoleInput._inputs.bookmark = CodeMirror($('#pma_console').find('.bookmark_add_input')[0], { theme: 'pma', mode: 'text/x-sql', lineWrapping: true, extraKeys: {"Ctrl-Space": "autocomplete"}, hintOptions: {"completeSingle": false, "completeOnSingleClick": true}, gutters: ["CodeMirror-lint-markers"], lint: { "getAnnotations": CodeMirror.sqlLint, "async": true, } }); PMA_consoleInput._inputs.bookmark.on("inputRead", codemirrorAutocompleteOnInputRead); } } else { PMA_consoleInput._inputs.console = $('

Login or Register to edit or fork this paste. It's free.