Sindbad~EG File Manager

Current Path : /home/beeson/public_html/WebMathXpert/
Upload File :
Current File : //home/beeson/public_html/WebMathXpert/EnterGraphParametric.php

<!DOCTYPE html>
<?php
$graphtype = $PARAMETRIC = 5;   // from mainchoi.h 
$problemtype = 110;  // from probtype.h
$topic = 28;  // _parametric_graph 
$title = "Parametric Graphs";  

$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");
$Formulas = [];
for ($i = 1; $i <= 2; $i++) {   
    $Formulas[$i] = isset($_POST["dataParametric$i"]) ? $_POST["dataParametric$i"] : '';
}
if(isset($_POST['dataParametric3']))
	$Formula3 = $Formulas[3] = $_POST['dataParametric3'];  
else if(strstr($Formulas[1], "theta"))  
	$Formula3 = $Formulas[3] = "0 <= theta <= 2 pi";
else
	$Formula3 = $Formulas[3] =  "0 <= t <= 2pi";  // from the Edit button
?>
<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 */
	}
   .function-entry {
       display: flex;
       align-items: center;
       margin-bottom: 10px;
   }

   .function-entry svg {
       margin-right: 10px;
   }

   #EntryFields {
       margin-bottom: 0px;
   }

	/* 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; /*  Padding for better spacing */
		border-radius: 4px; /*  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; /* Hide the element initially */
	}
	.add-function-container {
		display: flex;
		align-items: center; /* Align items vertically center */
		gap: 10px; /* Add some space between the button and label */
		margin-top: 10px; /* Add space above the container */
	}
	.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); ?>;
var graphtype = <?php echo($graphtype); ?>;
console.log('topic:', topic, 'problemtype:', problemtype, 'graphtype', graphtype);
</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;
?>

<?php
	$language = $_GET['language'];
	$windowWidth = $_GET['windowWidth'];
	$windowHeight = $_GET['windowHeight'];
	$toolbarWidth = $_GET['toolbarWidth'];  // this needs to be passed to GraphDoc.php
	$graphWidth = $windowWidth - $toolbarWidth;
	   // echo("windowWidth = $windowWidth and toolbarWidth = $toolbarWidth and graphWidth = $graphWidth"); 
	$nequations = 3;  
	    //  this file can't handle graph relations like -5 < x < 5
		 //  arrowButton shouldn't generate them and user can't enter them

 	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; </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>");  
 				}   
 		}
	
?>

<select id="typesize">
	<option id="changeTypeSize" value="1">Change Type Size</option>
	<option id="normalSize" value="2">Normal</option>
	<option id="largerSize" value="3">Larger</option>
	<option id="smallerSize" value="4">Smaller</option>
</select>
<form action="<?php echo htmlspecialchars($_SERVER['PHP_SELF'] . '?' . $_SERVER['QUERY_STRING']); ?>" 
	method="post" 
	id="formulaForm"
	autocomplete="on"
>
	<svg id="EnterGraphParametric" width="200" x="0" y="30" height="25">
		<text x="0" y="20">
		</text>
	</svg>
	<div id="EntryFields">	
		<div class="function-entry">
			<input type="text" 
				name="dataParametric1"  
				id="dataParametricID1" 
				placeholder="sin nt" 
				value="<?php echo htmlspecialchars($Formulas[1]); ?>" 
				autofocus
			>
			<button 
				id="arrowButton" 
				class="svg-button" 
				type="button"
				onClick="handleArrowClick(document.getElementById('dataParametricID1'),graphtype,topic)"
			>
				<img src="images/drawn_bow_arrow_30px.png" alt="Arrow Icon" width="30" height="30">
			</button>
		</div>
		<div class="function-entry">
			<input type="text" name="dataParametric2"  id="dataParametricID2" placeholder="cos mt" value="<?php echo htmlspecialchars($Formulas[2]); ?>">
		</div>
		<div class="function-entry">
			<input type="text" name="dataParametric3"  id="dataParametricID3" placeholder="0 <= t <= 2 pi" value="<?php echo htmlspecialchars($Formulas[3]); ?>">
		</div>		
	</div>
	</div>
		<input type="hidden" name="nequations" id="nequations" value="3">
		<button type="submit" id="displayButton" 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" id="nequations" name="nequations" value= <?php echo($nequations); ?>>
		<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-displayButton" 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 formulas in mathematical notation </text>
</svg>	
<svg class="tooltip" id="tooltip-draw3" 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>
<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>
<!-- Placeholder text element that will be translated -->
<text id="alertParametric" class="alert" style="display: none;">You must enter two formulas and the range of the parameter</text>

<?php
	function validVariableName($input) { 
	    // List of valid Greek letter names
	    $greekLetters = ["alpha", "beta", "gamma", "delta", "omega", "epsilon", "mu", "lambda", "sigma", "theta", "phi","rho", "psi", "tau", "nu"];
	    // Check if input is a single ASCII letter (upper or lower case)
	    if (preg_match('/^[a-zA-Z]$/', $input)) {
	        return true;
	    }
	    // Check if input matches a Greek letter name (case-sensitive)
	    if (in_array($input, $greekLetters)) {
	        return true;
		}
	    // If neither condition is met, return false  
	    return false;
	}

	function isValidInterval($input) { 
		// Regular expression to match three strings separated by '<=' or '<', the middle one non-blank
	   $pattern = '/^\s*([^\s]+(?:\s+[^\s]+)*)\s*(<=|<)\s*([^\s]+)\s*(<=|<)\s*([^\s]+(?:\s+[^\s]+)*)\s*$/';
  
		if (preg_match($pattern, $input, $matches)) {
			// Check if the middle captured string satisfies validVariableName()  
			$middleVariable = $matches[3];  
			return validVariableName($middleVariable);
		}  
		return false;
	}

	$clientSocket = createClientSocket($serverAddress, $serverPort, $timeout);
	if ($_SERVER["REQUEST_METHOD"] === "POST" && $editflag == 0) 
	{
		$Formula1 = $_POST['dataParametric1'];
		$Formula2 = $_POST['dataParametric2'];  
		if(isset($_POST['dataParametric3']))
			$Formula3 = $_POST['dataParametric3'];  
		else if(strstr($Formula1, "theta"))  
			$Formula3 = $Formulas[3] = "0 <= theta <= 2 pi";
		else
			$Formula3 = $Formulas[3] =  "0 <= t <= 2pi";  // from the Edit button
		// Check if the "dataParametric" fields are empty, and if the interval at least has two inequality signs
		if (empty($Formula1) || empty($Formula2) || empty($Formula3) || !isValidInterval($Formula3))
			{ 
				// Display an alert using JavaScript, but only after the translation script has run, hence the Timeout
				echo '<script>
				function showAlert() {
					var alertMessage = document.getElementById("alertParametric").textContent;
					alert(alertMessage);
					document.getElementById("dataParametricID3").value = "";
				}
				document.addEventListener("DOMContentLoaded", function() {
					// Ensure the translation script has run before showing the alert
					setTimeout(showAlert, 100); // Adjust the delay as needed
				});	
				</script>';
			}
		else 
			{  $Formula = "$Formula1, $Formula2, $Formula3";
				$nequations = 3;
				$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) 
							{  
								$param = "\"$Formula\"+$graphtype+$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  
													   // add the dynamically generated SVG, 
													   // which comes as an SVG element with id "parsedTerm" of class "termSVG"
													   // if it doesn't parse, it's <svg> of class "parserError".
														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 "draw3" button could be defined 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="draw3" id="draw3" 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 src="Tooltips.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
	}

	 document.addEventListener('DOMContentLoaded', function() { 
			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(); 
			if (typeof editflag !== "undefined" && editflag) {
				let inputField = document.getElementById('dataParametricID1');  
				topic = editTopic;  // will get us more refined solutions maybe  
				presentProblem(topic, problemText, inputField, problemtype);   
				return; 
			}
	 });
</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