Sindbad~EG File Manager

Current Path : /home/beeson/public_html/WebMathXpert/
Upload File :
Current File : //home/beeson/public_html/WebMathXpert/ParameterSlider.js

function supportsSlider(graphtypeNumber, parameterName){
	// graphtypeNumber is a value from mainchoice.h
	let integerNames = ["n","N","m","M","k","K"]
	if(integerNames.includes(parameterName))
		return false;
	let slidertypes = [0,1,2,5,6,7]
		 // ORDINARY, COMPARE_SAME, COMPARE_DIFFERENT, PARAMETRIC, POLAR_CIRCULAR, POLAR
	return slidertypes.includes(graphtypeNumber);
}

function makeParameterSlider(index, parameters, parentElement) {
    // Create the slider container
    const sliderContainer = document.createElement('div');
    sliderContainer.style.width = '61px';
    sliderContainer.style.height = '24px';
    sliderContainer.style.backgroundColor = 'rgb(0,0,128)';
    sliderContainer.style.display = 'flex';
    sliderContainer.style.alignItems = 'center';
    sliderContainer.style.justifyContent = 'center';
    sliderContainer.style.border = 'none';
    sliderContainer.style.margin = '-1px 0 0 0';
    sliderContainer.style.padding = '0';

    // Create the slider
    const slider = document.createElement('input');
    slider.type = 'range';
    const parameter = parameters[index];
    slider.min = parameter.rangemin;
    slider.max = parameter.rangemax;
    slider.step = (slider.max - slider.min) / 50.0;
    slider.value = parameter.value;
    slider.id = `parameterSlider${index}`;
	 console.log("slider run: ", slider.min, slider.max);
	 console.log("slider step:", slider.step);
	 

    // Match button styles
    slider.style.width = '55px';
    slider.style.height = '5px';
    slider.style.border = 'none';
    slider.style.appearance = 'none';
    slider.style.cursor = 'pointer';
    slider.style.margin = '0';
    slider.style.padding = '0';
    slider.style.background = 'white';
    slider.style.borderRadius = '3px';
    slider.style.outline = 'none';

    // Slider Change Handling
    slider.addEventListener('input', (event) => {
        let value = parseFloat(event.target.value);
        let oldValue = parameters[index].value;
        console.log(`Slider ${index} moved. Value: ${value}, OldValue: ${oldValue}`);
        applySliderChange(index, value);
    });

    // Handle Slider Activation (Switching Parameter)
    slider.addEventListener('pointerdown', () => handleParameterSwitch(index));

    // Send updateParameters when user releases the mouse
    slider.addEventListener('pointerup', () => {
        let value = parameters[index].value;
        let parametersString = parameters.map(param => `${param.name}#${param.value}#${param.increment}#${param.index}`).join(';');
        const windowHeight = window.innerHeight;
		  const svgContainer = document.getElementById('svgContainer');
		  const graphwidth = svgContainer.getBoundingClientRect().width;
        let messageParameter = `${graphwidth}+${windowHeight}+${parametersString}`;
        // graphwidth is a global Javasscript variable 
        sendMessageToEngine("updateParameters", messageParameter)
            .then(response => console.log("Engine Response:", response))
            .catch(error => console.error("Error updating parameter in Engine:", error));
    });
	 
	// add an event listener so Tooltips works 
	slider.addEventListener('mouseenter', showTooltip);
	slider.addEventListener('mouseleave', hideTooltip);

    // Append the slider to its container and then to the parent element
    sliderContainer.appendChild(slider);
    parentElement.appendChild(sliderContainer);
}


function applySliderChange(index, value) {
	let oldValue = parameters[index].value;
	if (value === oldValue) return; // No change

	parameters[index].value = value;
	let oldValueStr = oldValue.toFixed(4);
	let valueStr = value.toFixed(4);

	// Hide old paths, show new ones
	document.querySelectorAll(`[param="${oldValueStr}"]`).forEach(el => el.style.display = "none");
	//  document.querySelectorAll(`[param="${valueStr}"]`).forEach(el => el.style.display = "block");
	 
	 document.querySelectorAll(`[param="${valueStr}"]`).forEach(el => {
		// console.log(`Making visible: ${el.getAttribute("param")}`, el);
		el.style.display = "block";
	});

	// Move the titles
	// Loop through all possible title elements (up to title5)
	for (let i = 0; i < 6; i++) {
		let titleId = `title${i}-${valueStr}`;
		let titleElement = document.getElementById(titleId);
		let draggableTitle = document.getElementById(`draggableTitle${i}`);
		let originalTitle = document.getElementById(`title${i}`);
		if (titleElement && draggableTitle) {
			if (originalTitle) {
				originalTitle.style.display = "none";
			}
			draggableTitle.style.display = "block";
			moveSvgElementToContainer(titleId, `draggableTitle${i}`);
		}
	 }
}

function enableSlider(index) {
    let slider = document.getElementById("parameterSlider" + index);  
    if (slider) {
        console.log("Enabling slider interaction for:", slider.id);
            // Simulate fresh pointerup
        slider.dispatchEvent(new PointerEvent("pointerup", { bubbles: true }));   
     }
}

// Handle Parameter Switch
function handleParameterSwitch(index) {
	console.log("in handleParameterSwitch with ", index, activeParameter);
	if (index === activeParameter) {
		 return;
	 }
    activeParameter = index;

    console.log(`Switching active parameter to ${index}, submitting form to PHP_SELF.`);

    // Create a hidden form
    let form = document.createElement("form");
    form.method = "POST";
    form.action = window.location.href; // Submits to PHP_SELF

    // Create the hidden input field
    let input = document.createElement("input");
    input.type = "hidden";
    input.name = "newActiveParameter";
    input.value = index;

    // Append input to form and form to body
    form.appendChild(input);
    document.body.appendChild(form);
	 
	 // synthetic pointerup that will be received by the old page,
	 // so it will release its capture of mouse events.
	
	 let slider = document.getElementById("parameterSlider" + activeParameter);
    if (slider) {
          console.log("Releasing pointer capture before submitting form...");
          slider.releasePointerCapture(1); // Explicitly release pointer capture
          slider.dispatchEvent(new PointerEvent("pointerup", { bubbles: true }));
      }
    
    // Submit the form
    form.submit();
    // here we need to enable the slider in the reloaded page
	  setTimeout(() => enableSlider(index), 100);
	 
}

Sindbad File Manager Version 1.0, Coded By Sindbad EG ~ The Terrorists