/*jslint browser: true */
/*global ace, jQuery */
/**
* PHP Console
*
* A web-based php debug console
*
* Copyright (C) 2010, Jordi Boggiano
* http://seld.be/ - j.boggiano@seld.be
*
* Licensed under the new BSD License
* See the LICENSE file for details
*
* Source on Github http://github.com/Seldaek/php-console
*/
(function (require, $, ace) {
"use strict";
var updateStatusBar, prepareClippyButton, refreshKrumoState, handleSubmit, initializeAce, handleAjaxError,
options, editor;
options = {
tabsize: 4,
editor: 'editor'
};
/**
* updates the text of the status bar
*/
updateStatusBar = function (e) {
var cursor_position = editor.getCursorPosition();
$('.statusbar .position').text('Line: ' + (1 + cursor_position.row) + ', Column: ' + cursor_position.column);
};
/**
* prepares a clippy button for clipboard access
*/
prepareClippyButton = function (e) {
var selection = editor.getSession().doc.getTextRange(editor.getSelectionRange());
if (!selection) {
$('.statusbar .copy').hide();
return;
}
$('#clippy embed').attr('FlashVars', 'text=' + selection);
$('#clippy param[name="FlashVars"]').attr('value', 'text=' + selection);
$('.statusbar .copy').html($('.statusbar .copy').html()).show();
};
/**
* adds a toggle button to expand/collapse all krumo sub-trees at once
*/
refreshKrumoState = function () {
if ($('.krumo-expand').length > 0) {
$('Toggle all')
.click(function (e) {
$('div.krumo-element.krumo-expand').each(function (idx, el) {
window.krumo.toggle(el);
});
e.preventDefault();
})
.prependTo('.output');
}
};
/**
* does an async request to eval the php code and displays the result
*/
handleSubmit = function (e) {
e.preventDefault();
$('div.output').html(' Loading ...');
// store session
if (window.localStorage) {
localStorage.setItem('phpCode', editor.getSession().getValue());
}
var controlChars = {
'NUL' : /\x00/g, // Null char
'SOH' : /\x01/g, // Start of Heading
'STX' : /\x02/g, // Start of Text
'ETX' : /\x03/g, // End of Text
'EOT' : /\x04/g, // End of Transmission
'ENQ' : /\x05/g, // Enquiry
'ACK' : /\x06/g, // Acknowledgment
'BEL' : /\x07/g, // Bell
'BS' : /\x08/g, // Back Space
'SO' : /\x0E/g, // Shift Out / X-On
'SI' : /\x0F/g, // Shift In / X-Off
'DLE' : /\x10/g, // Data Line Escape
'DC1' : /\x11/g, // Device Control 1 (oft. XON)
'DC2' : /\x12/g, // Device Control 2
'DC3' : /\x13/g, // Device Control 3 (oft. XOFF)
'DC4' : /\x14/g, // Device Control 4
'NAK' : /\x15/g, // Negative Acknowledgement
'SYN' : /\x16/g, // Synchronous Idle
'ETB' : /\x17/g, // End of Transmit Block
'CAN' : /\x18/g, // Cancel
'EM' : /\x19/g, // End of Medium
'SUB' : /\x1A/g, // Substitute
'ESC' : /\x1B/g, // Escape
'FS' : /\x1C/g, // File Separator
'GS' : /\x1D/g, // Group Separator
'RS' : /\x1E/g, // Record Separator
'US' : /\x1F/g // Unit Separator
};
// eval server-side
$.post('?js=1', { code: editor.getSession().getValue() }, function (res, status, jqXHR) {
var mem = jqXHR.getResponseHeader("X-Memory-Usage") || "",
rendertime = jqXHR.getResponseHeader("X-Rendertime") || "";
if (mem || rendertime) {
$('.statusbar .runtime-info').text('Memory usage: '+ mem + ' MB, Rendertime: ' + rendertime + 'ms');
} else {
$('.statusbar .runtime-info').text('');
}
if (res.match(/#end-php-console-output#$/)) {
var result = res.substring(0, res.length - 24);
$.each(controlChars, function (identifier, regex) {
result = result.replace(regex, '' + identifier + '');
});
$('div.output').html(result);
} else {
$('div.output').html(res + "
Script ended unexpectedly.");
}
refreshKrumoState();
});
};
handleAjaxError = function (event, jqxhr, settings, exception) {
$('div.output').html("Error occured while posting your code.");
refreshKrumoState();
};
initializeAce = function () {
var PhpMode, code, storedCode;
code = $('#' + options.editor).text();
// reload last session
if (window.localStorage && code.match(/(<\?php)?\s*/)) {
storedCode = localStorage.getItem('phpCode');
if (storedCode) {
code = storedCode;
}
}
$('#' + options.editor).replaceWith('