Sindbad~EG File Manager
<!DOCTYPE html>
<?php
$serverAddress = 'localhost'; // Adjust the server address
$serverPort = 12349; // Adjust the server port
$timeout = 300; // Connection timeout in seconds, long enough for debugging.
$startupDelay = 5; // Delay for server startup in seconds, if server is not already running
if (!(isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] == 'on' ||
$_SERVER['HTTPS'] == 1) ||
isset($_SERVER['HTTP_X_FORWARDED_PROTO']) &&
$_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https'))
{
$redirect = 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
header('HTTP/1.1 301 Moved Permanently');
header('Location: ' . $redirect);
exit();
}
if ($_SERVER['SERVER_NAME'] == 'localhost') {
$serverAddress = 'localhost';
} else {
$serverAddress = 'mathxpert.org';
}
session_start();
$sessionId = session_id(); // guaranteed not to contain a pipe character
ini_set('display_errors', 1);
error_reporting(E_ALL);
require("SendMessage.php");
?>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, maximum-scale=1.0, user-scalable=0">
<style>
/* Set a global font-family rule for all text elements. Only Times New Roman actually works well. */
text {
# font-family: 'Times New Roman'; /*, 'Cambria Math', 'STIX Two Math', 'Latin Modern Math', 'TeX Gyre Termes Math'; */
}
svg text {
font-family: 'Times New Roman';
font-size: 14px;
fill: black;
text-align: center;
}
/* Ensure Arial for button and tooltip text */
.svg-button text, .svg-button svg text, .tooltip svg text{
font-family: 'Arial';
}
/* Stacking form elements vertically */
form {
display: flex;
flex-direction: column;
align-items: flex-start; /* Align items to the start of the form */
gap: 10px; /* Add some space between each element */
}
#formulaPrompt {
margin-bottom: 5px;
}
input[type="text"] {
width: 300px; /* Set the width of the text input */
}
/* CSS to style the entry fields with a light green background */
input[type="text"],
input[type="number"],
input[type="email"],
textarea
{
background-color: #ccffcc; /* Light green background */
border: 1px solid #ccc; /* Optional: Border styling */
padding: 5px; /* Optional: Padding for better spacing */
border-radius: 4px; /* Optional: Rounded corners */
}
/* Style for focus state */
input[type="text"]:focus,
input[type="number"]:focus,
input[type="email"]:focus,
textarea:focus,
select:focus {
background-color: #b3ffb3; /* Slightly darker green when focused */
outline: none; /* Remove default outline */
border-color: #66cc66; /* Optional: Change border color on focus */
}
#svgContainer, #myForm {
display: block; /* Ensures each is on its line */
width: 100%; /* Adjusts width to the container */
}
#svgContainer {
margin-bottom: 5px;
margin-top: 10px;
background-color: lightblue;
visibility: hidden;
}
#EntryFields {
display: flex;
align-items: center;
}
.function-entry {
display: flex;
align-items: center;
}
#expressionID {
flex: 1; /* Allow input field to take up remaining space */
}
#arrowButton {
background: none;
border: none;
padding: 0;
margin-left: 10px; /* Add some spacing between the input and button */
cursor: pointer;
}
#arrowButton img {
display: block;
}
/* Tooltips */
.tooltip {
position: absolute;
background-color: lightyellow;
border: 1px solid black;
color: black;
padding: 5px;
border-radius: 3px;
white-space: nowrap;
z-index: 1000;
display: none; /* Hide by default */
font-size: 12px; /* Change the font size */
font-family: Arial, sans-serif;
}
.tooltip::before {
content: '';
position: absolute;
top: -8px; /* Adjust based on the size of the triangle */
left: 0px; /* Adjust based on desired position */
border-width: 0 5px 10px 0px; /* Create a smaller yellow triangle pointing up */
border-style: solid;
border-color: transparent transparent lightyellow transparent; /* Only the bottom part is visible */
}
.hidden {
display: none;
}
</style>
<title><?php echo($title); ?></title>
<?php
if (isset($_POST['topicField3'])) // may have been set by ArrowButton.js
{ $topic = $_POST['topicField3'];
// echo("topic = $topic"); // used for debugging
}
?>
<script>
var topic = <?php echo($topic); ?>;
var problemtype = <?php echo($problemtype); ?>;
console.log('topic:', topic, 'problemtype:', problemtype);
</script>
</head>
<body>
<?php
$language = $_GET['language'];
$windowWidth = $_GET['windowWidth'];
$windowHeight = $_GET['windowHeight'];
$toolbarWidth = $_GET['toolbarWidth']; // this needs to be passed to GraphDoc.php
$graphWidth = $windowWidth - $toolbarWidth;
$problemText = isset($_POST["$placeholder"]) ? $_POST["$placeholder"] : ''; // Capture the input after submission
$range1 = isset($_POST["$placeholder"."2"]) ? $_POST["$placeholder"."2"] : '';
$range2 = isset($_POST["$placeholder"."3"]) ? $_POST["$placeholder"."3"] : '';
// echo("ranges: $range1 $range2"); They do indeed arrive here and get sent with setupAndCheckGraph
?>
<?php
if ($_SERVER["REQUEST_METHOD"] === "POST")
{ $editflag = 0;
if(isset($_POST["editflagField"])) // after the simulated Display click in presentProblem()
{ $editflag = 0;
echo( "<script>var editflag = false; var problemText = \"$problemText\" ;</script>");
}
if(isset($_POST["problemTextField"])) // direct from the Edit button in GetProblemAsync.php
{ // from the Edit button in GetProblemAsync.php
$problemText = $_POST["problemTextField"];
$editTopic = $_POST["topicField"];
$editflag = 1;
echo( "<script> var problemText = \"$problemText\"; var editTopic = $editTopic; var editflag = true;</script>");
}
}
?>
<form action="<?php echo htmlspecialchars($_SERVER['PHP_SELF'] . '?' . $_SERVER['QUERY_STRING']); ?>"
method="post"
id="formulaForm"
autocomplete="on"
>
<svg id="<?php echo $promptID?>" width="200" x="0" y="30" left="0" height="25">
<text x="0" y="20">Function to graph:</text>
</svg>
<div id="EntryFields">
<div class="function-entry">
<input type="text" id= "<?php echo $placeholderID?>" name="<?php echo $placeholder?>" y="20" width="300"
placeholder= "" // it will be put in by the translation code
value="<?php echo htmlspecialchars($problemText); ?>"
autofocus
>
<button
id="arrowButton"
class="svg-button"
type="button"
onClick="handleArrowClick(document.getElementById('<?php echo $placeholderID?>'),problemtype,topic)"
>
<img src="images/drawn_bow_arrow_30px.png" alt="Arrow Icon" width="30" height="30">
</button>
</div>
</div>
<button type="submit" id="displayButton1" class="svg-button" style="background-color:transparent; border:none;">
<svg width="60" height="30" style="position:relative; overflow:visible;" xmlns="http://www.w3.org/2000/svg">
<!-- Background -->
<rect width="60" height="30" fill="rgb(0,0,128)" />
<!-- Text -->
<text x="30" y="20" style="fill:white;" font-size="12" font-family="Arial" text-anchor="middle">Display</text>
</svg>
</button>
<input type="hidden" name="topicField3" value="<?php echo($topic); ?>" id="topicField3">
<input type="hidden" name="editflagField" value="<?php echo($editflag); ?>" id ="editflagField">
</form>
<!-- tooltip-container is used by Tooltips.js to put each tooltip text, one at a time, into it. So it's empty now. -->
<div id="tooltip-container" class = "tooltip"></div>
<!-- put all needed tooltips here as <svg> elements.
This pre-document file does not receive Tooltips from the Engine. They must be written here. -->
<svg class="tooltip" id="tooltip-displayButton1" width="300" height="30"
style="display:none;
position:absolute;
left: 0; top: 0;
xmlns="http://www.w3.org/2000/svg"
>
<text x = "0" y="16" style="font-size:14px;fill:black;stroke:none;">Display the formula in mathematical notation </text>
</svg>
<svg class="tooltip" id="tooltip-draw2" width="150" height="30"
style="display:none;
position:absolute;
left: 0; top: 0;
xmlns="http://www.w3.org/2000/svg"
>
<text x = "0" y="16" style="font-size:14px;fill:black;stroke:none;">Draw the graph </text>
</svg>
<svg class="tooltip" id="tooltip-arrowButton" width="250" height="40"
style="display:none; position:absolute; left: 0; top: 0;"
xmlns="http://www.w3.org/2000/svg"
>
<text x = "0" y="16" style="font-size:14px;fill:black;stroke:none;">Shoots a sample problem into</text>
<text x = "0" y="35" style="font-size:14px;fill:black;stroke:none;">the entry field to the left</text>
</svg>
<?php
$clientSocket = createClientSocket($serverAddress, $serverPort, $timeout);
if ($_SERVER["REQUEST_METHOD"] === "POST" && $editflag ==0)
{ if(!isset($problemText))
$problemText = $_POST["$placeholder"];
// only continue if $editflag is false. Check if the "data" field is empty
if ( empty($problemText))
{ // it might be because arrowButton returned a second field with a range interval
$newField = $placeholder . "1";
if(isset($_POST[$newField]))
$problemText = $_POST[$newField];
if(empty($problemText)){
// Display an alert using JavaScript
echo '<script>alert("You must enter a formula to be displayed");</script>';
}
}
if (!empty($problemText))
{
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false)
{
echo "Socket creation failed: " . socket_strerror(socket_last_error()) . "<br>";
}
else
{
socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array("sec" => $timeout, "usec" => 0));
$result = socket_connect($socket, $serverAddress, $serverPort);
if ($result)
{ // '+' in the following line is just the character '+', not an operation
// if there are graph ranges, tack them on to problemText after an @ symbol
// There may be one or two of them, not more, and if two, they should be comma-separated
if($range1 != "")
$problemText = $problemText . "@" . $range1;
if($range1 != "" && $range2 != "")
$problemText = $problemText . "," . $range2;
$param = "\"$problemText\"+$problemtype+$language+$graphWidth+$windowHeight";
$response = sendMessage($clientSocket,"setupAndCheckGraph",$param);
if ($response === false)
{
$errcode = socket_last_error($socket);
$message = socket_strerror($errcode);
echo "Socket_read error: $message<br>";
}
else
{
?>
<div style="display:none;">
<?php include 'ButtonDefinitions.svg'; ?>
</div>
<div id="svgContainer" >
<?php // and now add the dynamically generated SVG
echo ($response);
/* More elaborately, we could use Javascript to add $response to the DOM,
then check whether the class is parserError, and if it is, put up
an alert with the message; otherwise echo it as here or just add it to
svgContainer.
*/
?>
</div>
<?php
if(strstr($response, "termSVG")){
?>
<form id="myForm" method="post" action="GraphDoc.php">
<!-- the action element has no name as we don't need it posted, especially not with name "action", which causes a conflict -->
<input type="hidden" id="formAction" value="">
<!-- The following "draw2" button could be define by <use href="#draw"></use> as in GraphDoc.php,
but then we still have to set the fill to white, which is done in Javascript in GraphDoc.php.
So I just defined it inline here, which makes it possible to modify it independent of the Graph Toolbar -->
<button type="submit" name="draw2" id="draw2" class="svg-button" style="background-color:transparent; border:none;">
<svg width="60" height="30" style="position:relative;overflow:visible;" xmlns="http://www.w3.org/2000/svg">
<!-- Background -->
<rect width="60" height="30" fill="rgb(0,0,128)" />
<!-- Horizontal line -->
<line x1="0" y1="7.5" x2="60" y2="7.5" stroke="white" stroke-width="1" />
<!-- Vertical line -->
<line x1="30" y1="0" x2="30" y2="15" stroke="white" stroke-width="1" />
<!-- Cubic curve -->
<path d="M 0 15 Q 10 -5 30 7.5 Q 50 20 60 -5" fill="none" stroke="white" stroke-width="1" />
<!-- Text -->
<text x="30" y="25" style="fill:white;" font-size="12" font-family="Arial" text-anchor="middle" >Draw</text>
</svg>
</button>
<input type="hidden" name="widthField3" id="widthField2" value = <?php echo $graphWidth ?> >
<input type="hidden" name="heightField3" id="heightField2" value=<?php echo $windowHeight ?> >
<input type="hidden" name="toolbarwidthField" id="toolbarwidthField" value = <?php echo $toolbarWidth ?> >
<input type="hidden" name="language" id="language" value = <?php echo $language ?> >
<input type="hidden" name="topicField" value="<?php echo($topic); ?>" id="topicField2">
</form>
<?php
}
?>
<?php
}
}
else
{
echo "Failed to connect to the MathXpert Engine: " . socket_strerror(socket_last_error()) . "<br>";
}
}
}
}
?>
<script src="TranslateEnterPages.js"></script>
<script src="MoveSvgElement.js"></script>
<script>
function adjustFormPositionAfterSvgResizes() {
var svgContainer = document.getElementById('svgContainer');
var myForm = document.getElementById('myForm');
if(myForm == null)
return;
// Get the current height of the svgContainer
if(svgContainer){ // it doesn't exist until the Display form is processed
var currentHeight = svgContainer.offsetHeight;
}
// Adjust the form's margin to prevent overlap
myForm.style.marginTop = (currentHeight + 20) + 'px'; // Adjust as needed for spacing
}
</script>
<script>
document.addEventListener('DOMContentLoaded', function() {
if (typeof editflag !== "undefined" && editflag) {
let inputField = document.getElementById('<?php echo $placeholderID?>');
topic = editTopic; // will get us more refined solutions maybe
presentProblem(topic, problemText, inputField, problemtype);
return;
}
var svgContainer = document.getElementById('svgContainer');
setLanguage('<?php echo($language); ?>');
if(svgContainer)
svgContainer.style.visibility = "visible";
moveSvgElementToContainer("parsedTerm", "svgContainer");
// Adjust the form position right after resizing the container
adjustFormPositionAfterSvgResizes();
});
</script>
<script src="Tooltips.js"></script>
<script src="FetchMessage.js"></script>
<script src="arrowButton.js"> </script>
</body>
</html>
Sindbad File Manager Version 1.0, Coded By Sindbad EG ~ The Terrorists