Your All-in-One Solution for Online Tools
Unlock productivity with our powerful suite of PDF, Image, Text, SEO, Developer, and Utility tools – all in one place, fast and free.
Explore All ToolsUnlock productivity with our powerful suite of PDF, Image, Text, SEO, Developer, and Utility tools – all in one place, fast and free.
Explore All ToolsUpload your PDF to Edit or Browse
Your PDF will appear here
Loaded: ${currentPdfFile.name} (Simulated view)
`; // In a real scenario, use PDF.js to render PDF } }); editorDropZone.addEventListener('dragover', (e) => { e.preventDefault(); editorDropZone.classList.add('dragover'); }); editorDropZone.addEventListener('dragleave', () => editorDropZone.classList.remove('dragover')); editorDropZone.addEventListener('drop', (e) => { e.preventDefault(); editorDropZone.classList.remove('dragover'); if (e.dataTransfer.files.length > 0 && e.dataTransfer.files[0].type === 'application/pdf') { currentPdfFile = e.dataTransfer.files[0]; pdfCanvasWrapper.innerHTML = `Loaded: ${currentPdfFile.name} (Simulated view)
`; } else { alert('Please drop a PDF file.'); } }); addTextBtn.addEventListener('click', () => { textInput.style.display = textInput.style.display === 'block' ? 'none' : 'block'; }); savePdfBtn.addEventListener('click', () => { if (!currentPdfFile) { alert('Please upload a PDF file first.'); return; } console.log('Simulating PDF save and download...'); // Simulate processing and download simulateProcessing(progressBarContainer, progressBar, downloadArea); const fakeBlob = new Blob([`Edited PDF content (simulated) from ${currentPdfFile.name}. Added text: "${textInput.value}"`], { type: 'application/pdf' }); const fileUrl = URL.createObjectURL(fakeBlob); downloadArea.querySelector('.btn-primary').href = fileUrl; downloadArea.querySelector('.btn-primary').download = `edited-${currentPdfFile.name}`; }); } function renderImageResizerTool(targetElement, handleFileProcessing) { // Re-use the existing dropzone for consistency targetElement.innerHTML = ` ${targetElement.innerHTML} `; const resizeWidth = targetElement.querySelector('#resize-width'); const resizeHeight = targetElement.querySelector('#resize-height'); const resizeBtn = targetElement.querySelector('#resize-image-btn'); const imagePreviewDiv = targetElement.querySelector('#image-preview'); const imagePreviewImg = imagePreviewDiv.querySelector('img'); const imagePreviewText = imagePreviewDiv.querySelector('p'); let currentImageFile = null; const originalHandleFileProcessing = handleFileProcessing; // Store reference to original // Override handleFileProcessing to include image preview handleFileProcessing = (files) => { originalHandleFileProcessing(files); // Call original to show progress/download if (files.length > 0 && files[0].type.startsWith('image/')) { currentImageFile = files[0]; const reader = new FileReader(); reader.onload = (e) => { imagePreviewImg.src = e.target.result; imagePreviewImg.style.display = 'block'; imagePreviewText.style.display = 'none'; }; reader.readAsDataURL(currentImageFile); } else { imagePreviewImg.style.display = 'none'; imagePreviewText.style.display = 'block'; currentImageFile = null; } }; // Re-attach drop zone with new handler if needed, or ensure the initial one calls this. const dropZone = targetElement.querySelector('.drop-zone'); if(dropZone) { const fileInput = dropZone.querySelector('input[type="file"]'); fileInput.removeEventListener('change', (e) => originalHandleFileProcessing(e.target.files)); dropZone.removeEventListener('drop', (e) => { e.preventDefault(); dropZone.classList.remove('dragover'); originalHandleFileProcessing(e.dataTransfer.files); }); fileInput.addEventListener('change', (e) => handleFileProcessing(e.target.files)); dropZone.addEventListener('drop', (e) => { e.preventDefault(); dropZone.classList.remove('dragover'); handleFileProcessing(e.dataTransfer.files); }); } resizeBtn.addEventListener('click', () => { if (!currentImageFile) { alert('Please upload an image first.'); return; } const width = parseInt(resizeWidth.value); const height = parseInt(resizeHeight.value); if (isNaN(width) || isNaN(height) || width <= 0 || height <= 0) { alert('Please enter valid width and height.'); return; } // Simulate client-side resizing const reader = new FileReader(); reader.onload = (e) => { const img = new Image(); img.onload = () => { const canvas = document.createElement('canvas'); canvas.width = width; canvas.height = height; const ctx = canvas.getContext('2d'); ctx.drawImage(img, 0, 0, width, height); const resizedDataUrl = canvas.toDataURL(currentImageFile.type); // Keep original type imagePreviewImg.src = resizedDataUrl; // Update preview imagePreviewImg.style.display = 'block'; imagePreviewText.style.display = 'none'; // Show progress and enable download const progressBarContainer = targetElement.querySelector('.progress-bar-container'); const progressBar = progressBarContainer.querySelector('.progress-bar'); const downloadArea = targetElement.querySelector('.download-area'); simulateProcessing(progressBarContainer, progressBar, downloadArea); downloadArea.querySelector('.btn-primary').href = resizedDataUrl; downloadArea.querySelector('.btn-primary').download = `resized-${currentImageFile.name}`; }; img.src = e.target.result; }; reader.readAsDataURL(currentImageFile); }); } function renderTextTool(targetElement, toolId) { // Remove the default dropzone for text-only tools const defaultDropZone = targetElement.querySelector('.drop-zone'); if (defaultDropZone) defaultDropZone.remove(); // Hide progress/download as these are usually immediate results const progressBarContainer = targetElement.querySelector('.progress-bar-container'); if (progressBarContainer) progressBarContainer.style.display = 'none'; const downloadArea = targetElement.querySelector('.download-area'); if (downloadArea) downloadArea.style.display = 'none'; targetElement.innerHTML = ` `; const textInputArea = targetElement.querySelector('#text-input-area'); const processTextBtn = targetElement.querySelector('#process-text-btn'); const textResultArea = targetElement.querySelector('#text-result-area'); processTextBtn.addEventListener('click', () => { const text = textInputArea.value; let result = ''; switch (toolId) { case 'word-counter': result = `Words: ${text.split(/\s+/).filter(word => word.length > 0).length}`; break; case 'character-counter': result = `Characters (incl. spaces): ${text.length}\nCharacters (excl. spaces): ${text.replace(/\s/g, '').length}`; break; case 'case-converter': result = `Uppercase: ${text.toUpperCase()}\nLowercase: ${text.toLowerCase()}\nTitle Case: ${text.replace(/\w\S*/g, (txt) => txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase())}`; break; // Add more text tools here default: result = "Unknown text tool."; } textResultArea.textContent = result; }); } function renderJsonFormatter(targetElement) { const defaultDropZone = targetElement.querySelector('.drop-zone'); if (defaultDropZone) defaultDropZone.remove(); const progressBarContainer = targetElement.querySelector('.progress-bar-container'); if (progressBarContainer) progressBarContainer.style.display = 'none'; const downloadArea = targetElement.querySelector('.download-area'); if (downloadArea) downloadArea.style.display = 'none'; targetElement.innerHTML = ` `; const jsonInput = targetElement.querySelector('#json-input'); const formatBtn = targetElement.querySelector('#format-json-btn'); const minifyBtn = targetElement.querySelector('#minify-json-btn'); const jsonOutput = targetElement.querySelector('#json-output'); const copyOutputBtn = targetElement.querySelector('#copy-json-output'); formatBtn.addEventListener('click', () => { try { const parsedJson = JSON.parse(jsonInput.value); jsonOutput.value = JSON.stringify(parsedJson, null, 2); } catch (e) { jsonOutput.value = `Error: Invalid JSON\n${e.message}`; } }); minifyBtn.addEventListener('click', () => { try { const parsedJson = JSON.parse(jsonInput.value); jsonOutput.value = JSON.stringify(parsedJson); } catch (e) { jsonOutput.value = `Error: Invalid JSON\n${e.message}`; } }); copyOutputBtn.addEventListener('click', () => { jsonOutput.select(); document.execCommand('copy'); alert('JSON output copied to clipboard!'); }); } function renderBase64Tool(targetElement, toolId) { const defaultDropZone = targetElement.querySelector('.drop-zone'); if (defaultDropZone) defaultDropZone.remove(); const progressBarContainer = targetElement.querySelector('.progress-bar-container'); if (progressBarContainer) progressBarContainer.style.display = 'none'; const downloadArea = targetElement.querySelector('.download-area'); if (downloadArea) downloadArea.style.display = 'none'; const encodeDecodeBtnText = toolId === 'base64-encoder' ? 'Encode to Base64' : 'Decode from Base64'; targetElement.innerHTML = ` `; const base64Input = targetElement.querySelector('#base64-input'); const processBtn = targetElement.querySelector('#process-base64-btn'); const base64Output = targetElement.querySelector('#base64-output'); const copyOutputBtn = targetElement.querySelector('#copy-base64-output'); processBtn.addEventListener('click', () => { const text = base64Input.value; let result = ''; try { if (toolId === 'base64-encoder') { result = btoa(text); // Encode } else { result = atob(text); // Decode } } catch (e) { result = `Error: Invalid Base64 string or encoding issue.\n${e.message}`; } base64Output.value = result; }); copyOutputBtn.addEventListener('click', () => { base64Output.select(); document.execCommand('copy'); alert('Output copied to clipboard!'); }); } function renderUrlTool(targetElement, toolId) { const defaultDropZone = targetElement.querySelector('.drop-zone'); if (defaultDropZone) defaultDropZone.remove(); const progressBarContainer = targetElement.querySelector('.progress-bar-container'); if (progressBarContainer) progressBarContainer.style.display = 'none'; const downloadArea = targetElement.querySelector('.download-area'); if (downloadArea) downloadArea.style.display = 'none'; const encodeDecodeBtnText = toolId === 'url-encoder' ? 'Encode URL' : 'Decode URL'; targetElement.innerHTML = ` `; const urlInput = targetElement.querySelector('#url-input'); const processBtn = targetElement.querySelector('#process-url-btn'); const urlOutput = targetElement.querySelector('#url-output'); const copyOutputBtn = targetElement.querySelector('#copy-url-output'); processBtn.addEventListener('click', () => { const text = urlInput.value; let result = ''; try { if (toolId === 'url-encoder') { result = encodeURIComponent(text); } else { result = decodeURIComponent(text); } } catch (e) { result = `Error: Invalid URL string or encoding issue.\n${e.message}`; } urlOutput.value = result; }); copyOutputBtn.addEventListener('click', () => { urlOutput.select(); document.execCommand('copy'); alert('Output copied to clipboard!'); }); } function renderMetaTagGenerator(targetElement) { const defaultDropZone = targetElement.querySelector('.drop-zone'); if (defaultDropZone) defaultDropZone.remove(); const progressBarContainer = targetElement.querySelector('.progress-bar-container'); if (progressBarContainer) progressBarContainer.style.display = 'none'; const downloadArea = targetElement.querySelector('.download-area'); if (downloadArea) downloadArea.style.display = 'none'; targetElement.innerHTML = ` `; const metaTitle = targetElement.querySelector('#meta-title'); const metaDescription = targetElement.querySelector('#meta-description'); const metaKeywords = targetElement.querySelector('#meta-keywords'); const metaAuthor = targetElement.querySelector('#meta-author'); const generateBtn = targetElement.querySelector('#generate-meta-btn'); const metaOutput = targetElement.querySelector('#meta-output'); const copyOutputBtn = targetElement.querySelector('#copy-meta-output'); generateBtn.addEventListener('click', () => { let tags = ''; if (metaTitle.value) tags += `