var windowWidth = window.innerWidth; var is_mobile = function() { return !(window.getComputedStyle(document.getElementById('is_mobile')).display === "none"); }; var nbPagePerLine = 5; if(is_mobile()) { nbPagePerLine = 2; } var pdfjsLib = window['pdfjs-dist/build/pdf']; pdfjsLib.GlobalWorkerOptions.workerSrc = '/vendor/pdf.worker.js?legacy'; var nbPDF = 0; var pages = []; var loadPDF = async function(pdfBlob, filename, pdfIndex) { let url = await URL.createObjectURL(pdfBlob); let dataTransfer = new DataTransfer(); let i = 0; for (i = 0; i < document.getElementById('input_pdf').files.length; i++) { dataTransfer.items.add(document.getElementById('input_pdf').files[i]); } dataTransfer.items.add(new File([pdfBlob], filename, { type: 'application/pdf' })); document.getElementById('input_pdf').files = dataTransfer.files; updateListePDF(); let pdfLetter = String.fromCharCode(96 + i+1).toUpperCase(); let loadingTask = pdfjsLib.getDocument(url); loadingTask.promise.then(function(pdf) { for(var pageNumber = 1; pageNumber <= pdf.numPages; pageNumber++ ) { pdf.getPage(pageNumber).then(function(page) { let pageIndex = pdfLetter + "_" + (page.pageNumber - 1); pages[pageIndex] = page; let pageHTML = '
'; pageHTML += ''; pageHTML += '
'; pageHTML += '
'; pageHTML += '
'; pageHTML += '
'; pageHTML += '
'; pageHTML += '
'; pageHTML += '
'; pageHTML += '

Page '+page.pageNumber+' - '+filename+'

'; pageHTML += ''; pageHTML += ''; pageHTML += '
'; document.getElementById('container-pages').insertAdjacentHTML('beforeend', pageHTML); let canvasContainer = document.getElementById('canvas-container-' + pageIndex); canvasContainer.addEventListener('dragstart', function(e) { this.querySelector('.container-checkbox').classList.add('d-none'); this.querySelector('.container-resize').classList.add('d-none'); this.querySelector('.canvas-pdf').classList.add('shadow-lg'); this.querySelector('.canvas-pdf').style.border = '2px dashed #777'; e.dataTransfer.setData('element', this.id); this.style.opacity = 0.4; document.querySelector('#container-bar').classList.add('d-none'); }); canvasContainer.addEventListener('dragend', function(e) { this.querySelector('.container-checkbox').classList.remove('d-none'); this.querySelector('.container-resize').classList.remove('d-none'); this.querySelector('.canvas-pdf').classList.remove('shadow-lg'); this.querySelector('.canvas-pdf').style.border = '2px solid transparent'; this.style.opacity = 1; document.querySelector('#container-bar').classList.remove('d-none'); stateCheckbox(this.querySelector('input[type=checkbox]')); }); canvasContainer.addEventListener('dragover', function(e) { if (e.preventDefault) { e.preventDefault(); } if(e.layerX > e.target.clientWidth / 2) { this.insertAdjacentElement('beforebegin', document.querySelector('#'+e.dataTransfer.getData('element'))); } else { this.insertAdjacentElement('afterend', document.querySelector('#'+e.dataTransfer.getData('element'))); } return false; }); canvasContainer.querySelector('.btn-delete').addEventListener('click', function(e) { let checkbox = this.parentNode.querySelector('input[type=checkbox]'); checkbox.checked = !checkbox.checked; stateCheckbox(checkbox); }); canvasContainer.querySelector('.btn-select').addEventListener('click', function(e) { let checkbox = this.parentNode.querySelector('input[type=checkbox].input-select'); checkbox.checked = !checkbox.checked; let container = this.parentNode; if(checkbox.checked) { container.classList.add('border'); container.classList.add('border-primary'); container.classList.add('border-3'); } else { container.classList.remove('border'); container.classList.remove('border-primary'); container.classList.remove('border-3'); } }); canvasContainer.querySelector('.btn-rotate').addEventListener('click', function(e) { let inputRotate = document.querySelector('#input_rotate_'+pageIndex); inputRotate.value = (parseInt(inputRotate.value) + 90) % 360; pageRender(pageIndex); }) pageRender(pageIndex); }); } }, function (reason) { console.error(reason); }); }; var pageRenderAll = function() { for(pageIndex in pages) { pageRender(pageIndex); } } var pageRender = function(pageIndex) { let page = pages[pageIndex]; let rotation = parseInt(document.querySelector('#input_rotate_'+pageIndex).value); let viewport = page.getViewport({scale: 1, rotation: rotation}); let size = Math.floor((document.getElementById('container-pages').offsetWidth - (8*(nbPagePerLine+1)) - 12) / nbPagePerLine); let scaleWidth = size / viewport.width; let scaleHeight = size / viewport.height; let viewportWidth = page.getViewport({scale: scaleWidth, rotation: rotation}); let viewportHeight = page.getViewport({scale: scaleHeight, rotation: rotation}); if(viewportWidth.height > size) { viewport = viewportHeight; } else { viewport = viewportWidth; } let canvasContainer = document.getElementById('canvas-container-' + pageIndex); canvasContainer.style.height = (size + 4) + "px"; canvasContainer.style.width = (size + 4) + "px"; let canvasPDF = canvasContainer.querySelector('.canvas-pdf'); let context = canvasPDF.getContext('2d'); canvasPDF.height = viewport.height; canvasPDF.width = viewport.width; page.render({ canvasContext: context, viewport: viewport, }); } var stateCheckbox = function(checkbox) { let checkboxContainer = checkbox.parentNode.parentNode.parentNode; if(checkbox.checked) { checkboxContainer.style.opacity = '1' } else { checkboxContainer.style.opacity = '0.2'; } }; var updateListePDF = function() { document.querySelector('#list_pdf').innerHTML = ""; for (var i = 0; i < document.querySelector('#input_pdf').files.length; i++) { const pdfFile = document.querySelector('#input_pdf').files.item(i); document.querySelector('#list_pdf').insertAdjacentHTML('beforeend', '
  • '+decodeURI(pdfFile.name)+'
  • '); } } var createEventsListener = function() { document.getElementById('save').addEventListener('click', function(event) { let order = []; let selectionMode = false; if(document.querySelectorAll('.canvas-container .input-select:checked').length > 0) { selectionMode = true; } document.querySelectorAll('.canvas-container').forEach(function(canvasContainer) { let checkbox = canvasContainer.querySelector('.checkbox-page'); if(selectionMode) { checkbox = canvasContainer.querySelector('.input-select'); } let inputRotate = canvasContainer.querySelector('.input-rotate'); let pageValue = ""; if(checkbox.checked) { pageValue = checkbox.value; } if(pageValue && inputRotate.value == 90) { pageValue = pageValue + "-east"; } if(pageValue && inputRotate.value == 180) { pageValue = pageValue + "-south"; } if(pageValue && inputRotate.value == 270) { pageValue = pageValue + "-west"; } if(pageValue) { order.push(pageValue); } }); document.querySelector('#input_pages').value = order.join(','); }); document.getElementById('input_pdf_upload_2').addEventListener('change', async function(event) { if(this.files[0].size > maxSize) { alert("Le PDF ne doit pas dépasser " + Math.round(maxSize/1024/1024) + " Mo"); this.value = ""; return; } const cache = await caches.open('pdf'); let filename = this.files[0].name; let response = new Response(this.files[0], { "status" : 200, "statusText" : "OK" }); let urlPdf = '/pdf/'+filename; await cache.put(urlPdf, response); let pdfBlob = await getPDFBlobFromCache(urlPdf); nbPDF++; loadPDF(pdfBlob, filename, nbPDF); this.value = ''; }); document.getElementById('btn-zoom-decrease').addEventListener('click', function(event) { nbPagePerLine++; pageRenderAll(); }); document.getElementById('btn-zoom-increase').addEventListener('click', function(event) { nbPagePerLine--; pageRenderAll(); }); } async function getPDFBlobFromCache(cacheUrl) { const cache = await caches.open('pdf'); let responsePdf = await cache.match(cacheUrl); if(!responsePdf) { return null; } let pdfBlob = await responsePdf.blob(); return pdfBlob; } async function uploadFromUrl(url) { history.replaceState({}, '', '/organization'); var response = await fetch(url); if(response.status != 200) { return; } var pdfBlob = await response.blob(); if(pdfBlob.type != 'application/pdf' && pdfBlob.type != 'application/octet-stream') { return; } let dataTransfer = new DataTransfer(); let filename = url.replace(/^.*\//, ''); dataTransfer.items.add(new File([pdfBlob], filename, { type: 'application/pdf' })); document.getElementById('input_pdf_upload').files = dataTransfer.files; document.getElementById('input_pdf_upload').dispatchEvent(new Event("change")); } var pageUpload = async function() { document.getElementById('input_pdf_upload').value = ''; document.getElementById('page-upload').classList.remove('d-none'); document.getElementById('page-organization').classList.add('d-none'); document.getElementById('input_pdf_upload').focus(); const cache = await caches.open('pdf'); document.getElementById('input_pdf_upload').addEventListener('change', async function(event) { if(document.getElementById('input_pdf_upload').files[0].size > maxSize) { alert("Le PDF ne doit pas dépasser " + Math.round(maxSize/1024/1024) + " Mo"); document.getElementById('input_pdf_upload').value = ""; return; } let filename = document.getElementById('input_pdf_upload').files[0].name; let response = new Response(document.getElementById('input_pdf_upload').files[0], { "status" : 200, "statusText" : "OK" }); let urlPdf = '/pdf/'+filename; await cache.put(urlPdf, response); history.pushState({}, '', '/organization#'+filename); pageOrganization(urlPdf) }); } var pageOrganization = async function(url) { let filename = url.replace('/pdf/', ''); document.title = filename + ' - ' + document.title; document.getElementById('page-upload').classList.add('d-none'); document.getElementById('page-organization').classList.remove('d-none'); let pdfBlob = await getPDFBlobFromCache(url); if(!pdfBlob) { document.location = '/organization'; return; } createEventsListener(); loadPDF(pdfBlob, filename, nbPDF); }; (function () { if(window.location.hash && window.location.hash.match(/^\#http/)) { let hashUrl = window.location.hash.replace(/^\#/, ''); pageUpload(); uploadFromUrl(hashUrl); } else if(window.location.hash) { pageOrganization('/pdf/'+window.location.hash.replace(/^\#/, '')); } else { pageUpload(); } window.addEventListener('hashchange', function() { window.location.reload(); }) })();