diff --git a/public/home.html b/public/home.html index 129b0fe9..84bb8d56 100644 --- a/public/home.html +++ b/public/home.html @@ -30,6 +30,7 @@ + diff --git a/public/js/calculate_grade.js b/public/js/calculate_grade.js index a49cf486..54b8ed66 100755 --- a/public/js/calculate_grade.js +++ b/public/js/calculate_grade.js @@ -322,3 +322,250 @@ let getCategoryDisplay = function (gradeInfo, computingClassData) { return categoryDisplay; } + +//in a function because when extraFunctions first runs, jquery isn't initialized +function initialize_jquery_prototype() { + jQuery.prototype.replace_text = function(input) { + this.contents().filter(function() {return (this.nodeType == 3);}).replaceWith(input) + } +} + +function getGPA(gradeToBeGPA) { + + let parsed = parseFloat(gradeToBeGPA); + if (parsed >= 97) { + return 4.0; + } else if (parsed >= 93) { + return 4.0; + } else if (parsed >= 90) { + return 3.7; + } else if (parsed >= 87) { + return 3.3; + } else if (parsed >= 83) { + return 3.0; + } else if (parsed >= 80) { + return 2.7; + } else if (parsed >= 77) { + return 2.3; + } else if (parsed >= 73) { + return 2.0; + } else if (parsed >= 70) { + return 1.7; + } else if (parsed >= 67) { + return 1.3; + } else if (parsed >= 63) { + return 1.0; + } else if (parsed >= 60) { + return 0.7; + } else { + return 0.0; + } +} + +function GPAType() { + let selectElem = $("#gpa_select"); + let selectedElem = $(".gpa_select-selected"); + let selection = $("#gpa_select option")[selectElem.prop("selectedIndex")].value; + + let quarterName = ""; + let quarterData; + + if (selection == 0) { + quarterName = "Current Quarter"; + quarterData = currentTableData.terms.current; + } + else { + quarterName = "Q" + selection; + quarterData = currentTableData.terms["q" + selection]; + } + + if (selectedElem.html().includes("GPA")) { + if (quarterData.GPA.outOfFour != quarterData.calcGPA.outOfFour) { + $("#current, #current_gpa, #init_gpa").replace_text( + "Current Quarter Unweighted: " + currentTableData.terms.current.GPA.outOfFour.toFixed(2) + + "
Calculated: " + currentTableData.terms.current.calcGPA.outOfFour.toFixed(2) + ); + for (let i = 1; i <= 4; i++) { + $(`#q${i}, #q${i}_gpa`).replace_text( + "Q" + i + " Unweighted: " + currentTableData.terms["q" + i].GPA.outOfFour.toFixed(2) + + (currentTableData.terms["q" + i].calcGPA ? ( + "
Calculated: " + currentTableData.terms["q" + i].calcGPA.outOfFour.toFixed(2) + ) : "") + ); + } + selectedElem.replace_text( + quarterName + " Unweighted: " + quarterData.GPA.outOfFour.toFixed(2) + + "
Calculated: " + quarterData.calcGPA.outOfFour.toFixed(2) + ); + $("#cum, #cum_gpa").replace_text( + "Cumulative Unweighted: " + currentTableData.cumGPA.outOfFour.toFixed(2) + ); + } + else { + $("#current, #current_gpa, #init_gpa").replace_text( + "Current Quarter Unweighted: " + currentTableData.terms.current.GPA.outOfFour.toFixed(2) + ); + for (let i = 1; i <= 4; i++) { + $(`#q${i}, #q${i}_gpa`).replace_text( + "Q" + i + " Unweighted: " + currentTableData.terms["q" + i].GPA.outOfFour.toFixed(2) + ); + } + selectedElem.replace_text( + quarterName + " Unweighted: " + quarterData.GPA.outOfFour.toFixed(2) + ); + $("#cum, #cum_gpa").replace_text( + "Cumulative Unweighted: " + currentTableData.cumGPA.outOfFour.toFixed(2) + ); + } + } + else if (selectedElem.html().includes("Unweighted")) { + if (quarterData.GPA.outOfFive != quarterData.calcGPA.outOfFive) { + $("#current, #current_gpa, #init_gpa").replace_text( + "Current Quarter Weighted: " + currentTableData.terms.current.GPA.outOfFive.toFixed(2) + + "
Calculated: " + currentTableData.terms.current.calcGPA.outOfFive.toFixed(2) + ); + for (let i = 1; i <= 4; i++) { + $(`#q${i}, #q${i}_gpa`).replace_text( + "Q" + i + " Weighted: " + currentTableData.terms["q" + i].GPA.outOfFive.toFixed(2) + + (currentTableData.terms["q" + i].calcGPA ? ( + "
Calculated: " + currentTableData.terms["q" + i].calcGPA.outOfFive.toFixed(2) + ) : "") + ); + } + selectedElem.replace_text( + quarterName + " Weighted: " + quarterData.GPA.outOfFive.toFixed(2) + + "
Calculated: " + quarterData.calcGPA.outOfFive.toFixed(2) + ); + $("#cum, #cum_gpa").replace_text( + "Cumulative Weighted: " + currentTableData.cumGPA.outOfFive.toFixed(2) + ); + } + else { + $("#current, #current_gpa, #init_gpa").replace_text( + "Current Quarter Weighted: " + currentTableData.terms.current.GPA.outOfFive.toFixed(2) + ); + for (let i = 1; i <= 4; i++) { + $(`#q${i}, #q${i}_gpa`).replace_text( + "Q" + i + " Weighted: " + currentTableData.terms["q" + i].GPA.outOfFive.toFixed(2) + ); + } + selectedElem.replace_text( + quarterName + " Weighted: " + quarterData.GPA.outOfFive.toFixed(2) + ); + $("#cum, #cum_gpa").replace_text( + "Cumulative Weighted: " + currentTableData.cumGPA.outOfFive.toFixed(2) + ); + } + } + else if (selectedElem.html().includes("Weighted")) { + if (quarterData.GPA.percent != quarterData.calcGPA.percent) { + $("#current, #current_gpa, #init_gpa").replace_text( + "Current Quarter GPA: " + currentTableData.terms.current.GPA.percent.toFixed(2) + + "
Calculated: " + currentTableData.terms.current.calcGPA.percent.toFixed(2) + ); + for (let i = 1; i <= 4; i++) { + $(`#q${i}, #q${i}_gpa`).replace_text( + "Q" + i + " GPA: " + currentTableData.terms["q" + i].GPA.percent.toFixed(2) + + (currentTableData.terms["q" + i].calcGPA ? ( + "
Calculated: " + currentTableData.terms["q" + i].calcGPA.percent.toFixed(2) + ) : "") + ); + } + selectedElem.replace_text( + quarterName + " GPA: " + quarterData.GPA.percent.toFixed(2) + + "
Calculated: " + quarterData.calcGPA.percent.toFixed(2) + ); + $("#cum, #cum_gpa").replace_text( + "Cumulative GPA: " + currentTableData.cumGPA.percent.toFixed(2) + ); + } + else { + $("#current, #current_gpa, #init_gpa").replace_text( + "Current Quarter GPA: " + currentTableData.terms.current.GPA.percent.toFixed(2) + ); + for (let i = 1; i <= 4; i++) { + $(`#q${i}, #q${i}_gpa`).replace_text( + "Q" + i + " GPA: " + currentTableData.terms["q" + i].GPA.percent.toFixed(2) + ); + } + selectedElem.replace_text( + quarterName + " GPA: " + quarterData.GPA.percent.toFixed(2) + ); + $("#cum, #cum_gpa").replace_text( + "Cumulative GPA: " + currentTableData.cumGPA.percent.toFixed(2) + ); + } + } +} + +function getLetterGrade(gradeToBeLettered) { + let parsed = parseFloat(gradeToBeLettered); + if (parsed >= 96.5) { + return "A+"; + } else if (parsed >= 92.5) { + return "A"; + } else if (parsed >= 89.5) { + return "A-"; + } else if (parsed >= 86.5) { + return "B+"; + } else if (parsed >= 82.5) { + return "B"; + } else if (parsed >= 79.5) { + return "B-"; + } else if (parsed >= 76.5) { + return "C+"; + } else if (parsed >= 72.5) { + return "C"; + } else if (parsed >= 69.5) { + return "C-"; + } else if (parsed >= 66.5) { + return "D+"; + } else if (parsed >= 62.5) { + return "D"; + } else if (parsed >= 59.5) { + return "D-"; + } else { + return "F"; + } +} + +function getColor(gradeToBeColored) { + if (vip_username_list.includes(currentTableData.username)) { + return "#1E8541"; + } + + if (parseFloat(gradeToBeColored) >= 89.5) { + return "var(--green1)"; + } else if (parseFloat(gradeToBeColored) >= 79.5) { + return "var(--blue)"; + } else if (parseFloat(gradeToBeColored) >= 69.5) { + return "var(--orange)"; + } else if (parseFloat(gradeToBeColored) >= 59.5) { + return "var(--orange1)"; + } else if (parseFloat(gradeToBeColored) >= 0) { + return "var(--red)"; + } else { + return "var(--black)"; + } +} + +let lightColors = ["#3d995c", "#a3a3f5", "#eba947", "#ebb147", "#eb4747"]; +function getLightColor(gradeToBeColored) { + if (vip_username_list.includes(currentTableData.username)) { + return "#1E8541"; + } + + if (parseFloat(gradeToBeColored) >= 89.5) { + return lightColors[0]; + } else if (parseFloat(gradeToBeColored) >= 79.5) { + return lightColors[1]; + } else if (parseFloat(gradeToBeColored) >= 69.5) { + return lightColors[2]; + } else if (parseFloat(gradeToBeColored) >= 59.5) { + return lightColors[3]; + } else if (parseFloat(gradeToBeColored) >= 0) { + return lightColors[4]; + } else { + return "black"; + } +} diff --git a/public/js/extraFunctions.js b/public/js/extraFunctions.js index e90b2562..11aeae0f 100755 --- a/public/js/extraFunctions.js +++ b/public/js/extraFunctions.js @@ -9,253 +9,6 @@ Number.prototype.countDecimals = function () { return this.toString().split(".")[1].length || 0; } -//in a function because when extraFunctions first runs, jquery isn't initialized -function initialize_jquery_prototype() { - jQuery.prototype.replace_text = function(input) { - this.contents().filter(function() {return (this.nodeType == 3);}).replaceWith(input) - } -} - -function getGPA(gradeToBeGPA) { - - let parsed = parseFloat(gradeToBeGPA); - if (parsed >= 97) { - return 4.0; - } else if (parsed >= 93) { - return 4.0; - } else if (parsed >= 90) { - return 3.7; - } else if (parsed >= 87) { - return 3.3; - } else if (parsed >= 83) { - return 3.0; - } else if (parsed >= 80) { - return 2.7; - } else if (parsed >= 77) { - return 2.3; - } else if (parsed >= 73) { - return 2.0; - } else if (parsed >= 70) { - return 1.7; - } else if (parsed >= 67) { - return 1.3; - } else if (parsed >= 63) { - return 1.0; - } else if (parsed >= 60) { - return 0.7; - } else { - return 0.0; - } -} - -function GPAType() { - let selectElem = $("#gpa_select"); - let selectedElem = $(".gpa_select-selected"); - let selection = $("#gpa_select option")[selectElem.prop("selectedIndex")].value; - - let quarterName = ""; - let quarterData; - - if (selection == 0) { - quarterName = "Current Quarter"; - quarterData = currentTableData.terms.current; - } - else { - quarterName = "Q" + selection; - quarterData = currentTableData.terms["q" + selection]; - } - - if (selectedElem.html().includes("GPA")) { - if (quarterData.GPA.outOfFour != quarterData.calcGPA.outOfFour) { - $("#current, #current_gpa, #init_gpa").replace_text( - "Current Quarter Unweighted: " + currentTableData.terms.current.GPA.outOfFour.toFixed(2) + - "
Calculated: " + currentTableData.terms.current.calcGPA.outOfFour.toFixed(2) - ); - for (let i = 1; i <= 4; i++) { - $(`#q${i}, #q${i}_gpa`).replace_text( - "Q" + i + " Unweighted: " + currentTableData.terms["q" + i].GPA.outOfFour.toFixed(2) + - (currentTableData.terms["q" + i].calcGPA ? ( - "
Calculated: " + currentTableData.terms["q" + i].calcGPA.outOfFour.toFixed(2) - ) : "") - ); - } - selectedElem.replace_text( - quarterName + " Unweighted: " + quarterData.GPA.outOfFour.toFixed(2) + - "
Calculated: " + quarterData.calcGPA.outOfFour.toFixed(2) - ); - $("#cum, #cum_gpa").replace_text( - "Cumulative Unweighted: " + currentTableData.cumGPA.outOfFour.toFixed(2) - ); - } - else { - $("#current, #current_gpa, #init_gpa").replace_text( - "Current Quarter Unweighted: " + currentTableData.terms.current.GPA.outOfFour.toFixed(2) - ); - for (let i = 1; i <= 4; i++) { - $(`#q${i}, #q${i}_gpa`).replace_text( - "Q" + i + " Unweighted: " + currentTableData.terms["q" + i].GPA.outOfFour.toFixed(2) - ); - } - selectedElem.replace_text( - quarterName + " Unweighted: " + quarterData.GPA.outOfFour.toFixed(2) - ); - $("#cum, #cum_gpa").replace_text( - "Cumulative Unweighted: " + currentTableData.cumGPA.outOfFour.toFixed(2) - ); - } - } - else if (selectedElem.html().includes("Unweighted")) { - if (quarterData.GPA.outOfFive != quarterData.calcGPA.outOfFive) { - $("#current, #current_gpa, #init_gpa").replace_text( - "Current Quarter Weighted: " + currentTableData.terms.current.GPA.outOfFive.toFixed(2) + - "
Calculated: " + currentTableData.terms.current.calcGPA.outOfFive.toFixed(2) - ); - for (let i = 1; i <= 4; i++) { - $(`#q${i}, #q${i}_gpa`).replace_text( - "Q" + i + " Weighted: " + currentTableData.terms["q" + i].GPA.outOfFive.toFixed(2) + - (currentTableData.terms["q" + i].calcGPA ? ( - "
Calculated: " + currentTableData.terms["q" + i].calcGPA.outOfFive.toFixed(2) - ) : "") - ); - } - selectedElem.replace_text( - quarterName + " Weighted: " + quarterData.GPA.outOfFive.toFixed(2) + - "
Calculated: " + quarterData.calcGPA.outOfFive.toFixed(2) - ); - $("#cum, #cum_gpa").replace_text( - "Cumulative Weighted: " + currentTableData.cumGPA.outOfFive.toFixed(2) - ); - } - else { - $("#current, #current_gpa, #init_gpa").replace_text( - "Current Quarter Weighted: " + currentTableData.terms.current.GPA.outOfFive.toFixed(2) - ); - for (let i = 1; i <= 4; i++) { - $(`#q${i}, #q${i}_gpa`).replace_text( - "Q" + i + " Weighted: " + currentTableData.terms["q" + i].GPA.outOfFive.toFixed(2) - ); - } - selectedElem.replace_text( - quarterName + " Weighted: " + quarterData.GPA.outOfFive.toFixed(2) - ); - $("#cum, #cum_gpa").replace_text( - "Cumulative Weighted: " + currentTableData.cumGPA.outOfFive.toFixed(2) - ); - } - } - else if (selectedElem.html().includes("Weighted")) { - if (quarterData.GPA.percent != quarterData.calcGPA.percent) { - $("#current, #current_gpa, #init_gpa").replace_text( - "Current Quarter GPA: " + currentTableData.terms.current.GPA.percent.toFixed(2) + - "
Calculated: " + currentTableData.terms.current.calcGPA.percent.toFixed(2) - ); - for (let i = 1; i <= 4; i++) { - $(`#q${i}, #q${i}_gpa`).replace_text( - "Q" + i + " GPA: " + currentTableData.terms["q" + i].GPA.percent.toFixed(2) + - (currentTableData.terms["q" + i].calcGPA ? ( - "
Calculated: " + currentTableData.terms["q" + i].calcGPA.percent.toFixed(2) - ) : "") - ); - } - selectedElem.replace_text( - quarterName + " GPA: " + quarterData.GPA.percent.toFixed(2) + - "
Calculated: " + quarterData.calcGPA.percent.toFixed(2) - ); - $("#cum, #cum_gpa").replace_text( - "Cumulative GPA: " + currentTableData.cumGPA.percent.toFixed(2) - ); - } - else { - $("#current, #current_gpa, #init_gpa").replace_text( - "Current Quarter GPA: " + currentTableData.terms.current.GPA.percent.toFixed(2) - ); - for (let i = 1; i <= 4; i++) { - $(`#q${i}, #q${i}_gpa`).replace_text( - "Q" + i + " GPA: " + currentTableData.terms["q" + i].GPA.percent.toFixed(2) - ); - } - selectedElem.replace_text( - quarterName + " GPA: " + quarterData.GPA.percent.toFixed(2) - ); - $("#cum, #cum_gpa").replace_text( - "Cumulative GPA: " + currentTableData.cumGPA.percent.toFixed(2) - ); - } - } -} - -function getLetterGrade(gradeToBeLettered) { - let parsed = parseFloat(gradeToBeLettered); - if (parsed >= 96.5) { - return "A+"; - } else if (parsed >= 92.5) { - return "A"; - } else if (parsed >= 89.5) { - return "A-"; - } else if (parsed >= 86.5) { - return "B+"; - } else if (parsed >= 82.5) { - return "B"; - } else if (parsed >= 79.5) { - return "B-"; - } else if (parsed >= 76.5) { - return "C+"; - } else if (parsed >= 72.5) { - return "C"; - } else if (parsed >= 69.5) { - return "C-"; - } else if (parsed >= 66.5) { - return "D+"; - } else if (parsed >= 62.5) { - return "D"; - } else if (parsed >= 59.5) { - return "D-"; - } else { - return "F"; - } -} - -function getColor(gradeToBeColored) { - if (vip_username_list.includes(currentTableData.username)) { - return "#1E8541"; - } - - if (parseFloat(gradeToBeColored) >= 89.5) { - return "var(--green1)"; - } else if (parseFloat(gradeToBeColored) >= 79.5) { - return "var(--blue)"; - } else if (parseFloat(gradeToBeColored) >= 69.5) { - return "var(--orange)"; - } else if (parseFloat(gradeToBeColored) >= 59.5) { - return "var(--orange1)"; - } else if (parseFloat(gradeToBeColored) >= 0) { - return "var(--red)"; - } else { - return "var(--black)"; - } -} - -let lightColors = ["#3d995c", "#a3a3f5", "#eba947", "#ebb147", "#eb4747"]; -function getLightColor(gradeToBeColored) { - if (vip_username_list.includes(currentTableData.username)) { - return "#1E8541"; - } - - if (parseFloat(gradeToBeColored) >= 89.5) { - return lightColors[0]; - } else if (parseFloat(gradeToBeColored) >= 79.5) { - return lightColors[1]; - } else if (parseFloat(gradeToBeColored) >= 69.5) { - return lightColors[2]; - } else if (parseFloat(gradeToBeColored) >= 59.5) { - return lightColors[3]; - } else if (parseFloat(gradeToBeColored) >= 0) { - return lightColors[4]; - } else { - return "black"; - } -} - let rowFormatter = function(cell) { let rowColor = cell.getRow().getData().color; let value = cell.getValue(); @@ -394,496 +147,6 @@ let gradeFormatter = function(cell, formatterParams) { } -} -let scale = 1; -let adjustedScale = 1; -let controlAdjustedScale = adjustedScale; -let pdf = null; -let currentPageNum = null; -let pendingPageNum = null; -let currentPdfIndex = null; - -let render_page_pdf = function(pageNumber) { - pdf.getPage(pageNumber).then(function(page) { - - // Update page indicator text - $("#page-indicator").text(`PAGE ${pageNumber} OF ${pdf.numPages}`); - - scale = 1; - - let viewport = page.getViewport({scale}); - - - let modifier = $('#pdf-container').width(); - - if ($(window).width() >= 900) { - modifier = 900; - } - - adjustedScale = (modifier / viewport.width) * 0.97; - controlAdjustedScale = (modifier / viewport.width) * 0.97; - - - viewport = page.getViewport({"scale": adjustedScale}); - - - let canvas = document.getElementById('pdf-canvas'); - let context = canvas.getContext('2d'); - canvas.width = viewport.width; - canvas.height = viewport.height; - - let renderContext = { - canvasContext: context, - viewport: viewport - }; - - let renderTask = page.render(renderContext); - renderTask.promise.then(function () { - pdfrendering = false; - // Another page rendering is pending - if (pendingPageNum !== null) { - render_page_pdf(pendingPageNum); - pendingPageNum = null; - } - }); - - }); -} - -let generate_pdf = function(index) { - if (!pdfrendering) { - pdfrendering = true; - let adjustedHeight = $(window).height() - 280; - if (!document.isFullScreen && !document.fullscreenElement && !document.webkitFullscreenElement && !document.mozFullScreenElement && !document.msFullscreenElement) { $('#pdf-container').css('height', adjustedHeight + 'px'); - } else { - $('#pdf-container').css('height', $(window).height() + 'px'); - } - - let pdfInitParams = {"data": ((currentTableData.pdf_files)[index]).content}; - // Store the index of the current PDF in `currentPdfIndex` - currentPdfIndex = index; - let loadingTask = pdfjsLib.getDocument(pdfInitParams); - loadingTask.promise.then(function(pdf_) { - pdf = pdf_; - currentPageNum = 1; - render_page_pdf(1); - }, function (reason) { - console.error(reason); - }); -} -} - -let zoom_in_pdf = function() { - if (!pdfrendering) { - pdfrendering = true; - let pdfInitParams = {"data": (currentTableData.pdf_files)[currentPdfIndex].content}; - let loadingTask = pdfjsLib.getDocument(pdfInitParams); - loadingTask.promise.then(function(pdf) { - - pdf.getPage(currentPageNum).then(function(page) { - - adjustedScale += 0.1; - - let viewport = page.getViewport({"scale": adjustedScale}); - - let canvas = document.getElementById('pdf-canvas'); - let context = canvas.getContext('2d'); - - canvas.width = viewport.width; - canvas.height = viewport.height; - - let renderContext = { - canvasContext: context, - viewport: viewport - }; - - let renderTask = page.render(renderContext); - renderTask.promise.then(function () { - pdfrendering = false; - }); - - }); - - - }, function (reason) { - console.error(reason); - }); - } -} - -let zoom_out_pdf = function() { - if (!pdfrendering) { - pdfrendering = true; - let pdfInitParams = {"data": (currentTableData.pdf_files)[currentPdfIndex].content}; - let loadingTask = pdfjsLib.getDocument(pdfInitParams); - loadingTask.promise.then(function(pdf) { - - pdf.getPage(currentPageNum).then(function(page) { - - adjustedScale -= 0.1; - - let viewport = page.getViewport({"scale": adjustedScale}); - - - let canvas = document.getElementById('pdf-canvas'); - let context = canvas.getContext('2d'); - - canvas.width = viewport.width; - canvas.height = viewport.height; - - let renderContext = { - canvasContext: context, - viewport: viewport - }; - - let renderTask = page.render(renderContext); - renderTask.promise.then(function () { - pdfrendering = false; - }); - - }); - - }, function (reason) { - console.error(reason); - }); - } -} - -// Render a certain page of the PDF or queue it to be rendered -let queue_render_page_pdf = function(pageNumber) { - if (pdf) { - if (pdfrendering) { - pendingPageNum = pageNumber; - } - else { - render_page_pdf(pageNumber); - } - } -} - -// Go one page back in the PDF -let prev_page_pdf = function() { - if (!currentPageNum || currentPageNum <= 1) return; - else { - currentPageNum--; - queue_render_page_pdf(currentPageNum); - } -} - -// Go one page forward in the PDF -let next_page_pdf = function() { - if (!currentPageNum || currentPageNum >= pdf.numPages) return; - else { - currentPageNum++; - queue_render_page_pdf(currentPageNum); - } -} - -async function download_pdf() { - // Get current PDF file's raw data - const data = await pdf.getData(); - // Use application/octet-stream MIME type to force a download (instead of - // having it open in a browser PDF viewer) - saveAs(new Blob([data], { - type: "application/octet-stream" - }), `${currentTableData.pdf_files[currentPdfIndex].title}.pdf`); -} - -function pdf_closeAllSelect(elmnt) { - /* A function that will close all select boxes in the document, - except the current select box: */ - let x, y, i, arrNo = []; - x = document.getElementsByClassName("pdf_select-items"); - y = document.getElementsByClassName("pdf_select-selected"); - for (i = 0; i < y.length; i++) { - if (elmnt === y[i]) { - arrNo.push(i) - } else { - y[i].classList.remove("pdf_select-arrow-active"); - } - } - for (i = 0; i < x.length; i++) { - if (arrNo.indexOf(i)) { - x[i].classList.add("pdf_select-hide"); - } - } -} -function closeAllSelect(elmnt) { - // $('.select-selected').removeClass("activated-selected-item"); - $('.select-items div').removeClass("activated-select-items"); - /* A function that will close all select boxes in the document, - except the current select box: */ - let x, y, i, arrNo = []; - x = document.getElementsByClassName("gpa_select-items"); - y = document.getElementsByClassName("gpa_select-selected"); - for (i = 0; i < y.length; i++) { - if (elmnt === y[i]) { - arrNo.push(i) - } else { - y[i].classList.remove("select-arrow-active"); - } - } - for (i = 0; i < x.length; i++) { - if (arrNo.indexOf(i)) { - x[i].classList.add("select-hide"); - } - } - if (!$(".gpa_select-selected").hasClass("select-arrow-active")) { - $('.gpa_select-selected').removeClass("activated-selected-item"); - $('.gpa_select-items div').removeClass("activated-select-items"); - } - -} -function tableData_closeAllSelect(elmnt) { - // $('.select-selected').removeClass("activated-selected-item"); - $('.tableData_select-items div').removeClass("activated-select-items"); - /* A function that will close all select boxes in the document, - except the current select box: */ - let x, y, i, arrNo = []; - x = document.getElementsByClassName("tableData_select-items"); - y = document.getElementsByClassName("tableData_select-selected"); - for (i = 0; i < y.length; i++) { - if (elmnt === y[i]) { - arrNo.push(i) - } else { - y[i].classList.remove("select-arrow-active"); - } - } - for (i = 0; i < x.length; i++) { - if (arrNo.indexOf(i)) { - x[i].classList.add("select-hide"); - } - } - if (!$(".tableData_select-selected").hasClass("select-arrow-active")) { - $('.tableData_select-selected').removeClass("activated-selected-item"); - $('.tableData_select-items div').removeClass("activated-select-items"); - } - -} - -function initialize_resize_hamburger() { - - // Total width of all items in tab minus hamburger - let total_width = -44.25; - - // Width of all items to the left (because they get removed last) plus logout button and hamburger widths - // 44.25 is hamburger width, has to be hardcoded becuase it might be display: none;'d - let left_width = 44.25 + $('#logout_button').outerWidth() - - // Gets all non-tablinks-right elements and adds their width to total_width and also left_width - $('.tab .tablinks:not(.tablinks-right)').outerWidth((_, w) => { - total_width += w; - left_width += w; - }); - - // Gets all tablinks-right elements and adds their width to total_width - $('.tab .tablinks-right').outerWidth((_, w) => {total_width += w;}) - - const switch_left_items = () => { - // Checks if left items are in sidenav - const in_sidenav = $('.tab .tablinks:not(.tablinks-right, .switch-exempt)').length === 0 - - if (in_sidenav) { - // Moves items from sidenav to tab - $('#sidenav .tablinks:not(.tablinks-right, .switch-exempt)').detach().appendTo($(".tab")); - } else { - // Moves items from tab to sidenav - $('.tab .tablinks:not(.tablinks-right, .switch-exempt)').detach().appendTo($("#sidenav")); - // Puts all the tablinks-right things below the non-tablinks-right things - for (const child of $('#sidenav .tablinks-right')) { - $('#sidenav').append(child); - } - } - } - - // REASON IT ADDS ITEMS IN REVERSE: - // Otherwise the items would basically go from right to left (in tab) - // To down to up, when I'd like it to be up to down. - const switch_right_items = function() { - // Checks if right-items (more specifically buttons) are hidden - - const in_sidenav = $('.tab .gpa_custom-select').length == 0 - - if (in_sidenav) { - - // Adds right items to tab in reverse - const children = $('#sidenav .tablinks-right:not(#logout_button)') - for (const child of [...children].reverse()) { - $(".tab").append(child); - } - - // Also closes the sidebar - closeSideNav(); - } else { - - // Adds right items to sidenav in reverse - const children = $('.tab .tablinks-right:not(#logout_button)') - for (const child of [...children].reverse()) { - $("#sidenav").append(child) - } - } - } - - const switch_hamburger = function() { - - // Hides or unhides the hamburger - if ($('#hamburger_button').hasClass("hide")) { - $('#hamburger_button').removeClass("hide") - } else { - $('#hamburger_button').addClass("hide") - } - } - - // navbar_state has 3 states - // 0 -> bar has enough space for everything, THIS IS THE DEFAULT IN THE CSS/HTML - // 1 -> bar can't fit the items on the right - // 2 -> bar can only fit logout and hamburger - // old_navbar_state is used to compare the newer navbar_state to the current navbar_state - let navbar_state, old_navbar_state; - const update_navbar_state = function() { - if ($(".tab").width() <= left_width) { - navbar_state = 2; - } else if ($(".tab").width() <= total_width) { - navbar_state = 1; - } else { - navbar_state = 0; - } - } - - // Initially instantiates nav_bar_state and old_nav_bar_state - update_navbar_state(); - old_navbar_state = navbar_state; - - // Initially switches whatever is necessary, only if navbar_state is 1 or 2 because 0 is default - if (navbar_state === 1) { - switch_right_items(); - switch_hamburger(); - } else if (navbar_state === 2) { - switch_right_items(); - switch_left_items(); - switch_hamburger(); - } - - // ADDS THE EVENT LISTENER - window.addEventListener("resize", function () { - - // Updates navbar_state - update_navbar_state(); - - // If they're different, updates the tab and sidenav - if (old_navbar_state !== navbar_state) { - if ((old_navbar_state === 0 && navbar_state === 1) || (old_navbar_state === 1 && navbar_state === 0)) { - // When moving to and from 0 and 1, needs to switch both right items and hamburgers - switch_right_items(); - switch_hamburger(); - } - else if ((old_navbar_state === 1 && navbar_state === 2) || (old_navbar_state === 2 && navbar_state === 1)) { - // When moving between 1 and 2, needs to switch left items - switch_left_items(); - } - else if ((old_navbar_state === 0 && navbar_state === 2) || (old_navbar_state === 2 && navbar_state === 0)) { - // If it goes from 0 to 2 or 2 to 0, do everything in succession - switch_right_items(); - switch_hamburger(); - switch_left_items(); - } - - } - - // Updates the old navbar state for later comparisons - old_navbar_state = navbar_state; - - }); - -} - - -//pdf dropdown stuff -let initialize_pdf_dropdown = function() { - - //let o = new Option(tableData.pdf_files[i].title, i); - ///// jquerify the DOM object 'o' so we can use the html method - //$(o).html(tableData.pdf_files[i].title); - //$("#pdf-select").append(o); - - for (let i = 1; i < currentTableData.pdf_files.length + 1; i++) { - if (i === 1) { - let o = new Option(currentTableData.pdf_files[i - 1].title, 0); - /// jquerify the DOM object 'o' so we can use the html method - $(o).html(currentTableData.pdf_files[i - 1].title); - $("#pdf_select").append(o); - } - - let o = new Option(currentTableData.pdf_files[i - 1].title, i); - /// jquerify the DOM object 'o' so we can use the html method - $(o).html(currentTableData.pdf_files[i - 1].title); - $("#pdf_select").append(o); - - } - - let x, i, j, selElmnt, a, b, c; - /* Look for any elements with the class "pdf_custom-select": */ - x = document.getElementsByClassName("pdf_custom-select"); - for (i = 0; i < x.length; i++) { - selElmnt = x[i].getElementsByTagName("select")[0]; - /* For each element, create a new DIV that will act as the selected item: */ - a = document.createElement("DIV"); - a.setAttribute("class", "pdf_select-selected"); - a.innerHTML = selElmnt.options[selElmnt.selectedIndex].innerHTML; - x[i].appendChild(a); - /* For each element, create a new DIV that will contain the option list: */ - b = document.createElement("DIV"); - b.setAttribute("class", "pdf_select-items pdf_select-hide"); - for (j = 1; j < selElmnt.length; j++) { - /* For each option in the original select element, - create a new DIV that will act as an option item: */ - c = document.createElement("DIV"); - c.innerHTML = selElmnt.options[j].innerHTML; - c.setAttribute("data-value", selElmnt.options[j].value); - c.addEventListener("click", function(e) { - /* When an item is clicked, update the original select box, - and the selected item: */ - let y, i, k, s, h; - s = this.parentNode.parentNode.getElementsByTagName("select")[0]; - h = this.parentNode.previousSibling; - for (i = 0; i < s.length; i++) { - if (s.options[i].value === this.getAttribute("data-value")) { - if (i === 0) { - pdf_index = i; - generate_pdf(i); - - } else { - pdf_index = i - 1; - generate_pdf(i - 1); - } - s.selectedIndex = i; - h.innerHTML = this.innerHTML; - y = this.parentNode.getElementsByClassName("pdf_same-as-selected"); - for (k = 0; k < y.length; k++) { - y[k].removeAttribute("class"); - } - this.setAttribute("class", "pdf_same-as-selected"); - break; - } - } - h.click(); - }); - b.appendChild(c); - } - x[i].appendChild(b); - a.addEventListener("click", function(e) { - /* When the select box is clicked, close any other select boxes, - and open/close the current select box: */ - e.stopPropagation(); - pdf_closeAllSelect(this); - closeAllSelect(); - tableData_closeAllSelect(); - this.nextSibling.classList.toggle("pdf_select-hide"); - this.classList.toggle("pdf_select-arrow-active"); - }); - } - - } // Switch terms @@ -1388,64 +651,6 @@ function setup_tooltips() { } } -let toggle_fullscreen_icon = function() { - if ($('#expand-pdf-icon i').hasClass('fa-expand-alt')) { - $('#expand-pdf-icon i').removeClass("fa-expand-alt").addClass("fa-compress-alt"); - $('#expand-pdf-icon .tooltiptext').attr('style', $('#expand-pdf-icon .tooltiptext').attr('style').replace("margin-left: -92px;", "margin-left: -95px;")).replace_text("Exit Fullscreen") - - } else { - $('#expand-pdf-icon i').removeClass("fa-compress-alt").addClass("fa-expand-alt"); - $('#expand-pdf-icon .tooltiptext').attr('style', $('#expand-pdf-icon .tooltiptext').attr('style').replace("margin-left: -95px;", "margin-left: -92px;")).replace_text("Go Fullscreen") - - } -} - -let toggle_fullscreen_pdf = function() { - let elem = document.getElementById('reports'); - - console.log("Fullscreen Activate"); - if (!document.isFullScreen && !document.fullscreenElement && !document.webkitFullscreenElement && !document.mozFullScreenElement && !document.msFullscreenElement) { - if (elem.requestFullscreen) { - elem.requestFullscreen(); - toggle_fullscreen_icon(); - - } else if (elem.mozRequestFullScreen) { /* Firefox */ - elem.mozRequestFullScreen(); - toggle_fullscreen_icon(); - - } else if (elem.webkitRequestFullscreen) { /* Chrome, Safari and Opera */ - let new_height = $(window).height(); - elem.webkitRequestFullscreen(); - toggle_fullscreen_icon(); - - } else if (elem.msRequestFullscreen) { /* IE/Edge */ - elem.msRequestFullscreen(); - toggle_fullscreen_icon(); - - } - } else { - - if (document.exitFullscreen) { - document.exitFullscreen(); - toggle_fullscreen_icon(); - - } else if (document.mozCancelFullScreen) { /* Firefox */ - document.mozCancelFullScreen(); - toggle_fullscreen_icon(); - - } else if (document.webkitExitFullscreen) { /* Chrome, Safari and Opera */ - document.webkitExitFullscreen(); - toggle_fullscreen_icon(); - - } else if (document.msExitFullscreen) { /* IE/Edge */ - document.msExitFullscreen(); - toggle_fullscreen_icon(); - - } - } -} - - function parseTableData({ classes, quarter_oid }) { for (let i = 0; i < classes.length; i++) { diff --git a/public/js/home.js b/public/js/home.js index 7a0006c6..7adae671 100644 --- a/public/js/home.js +++ b/public/js/home.js @@ -2,7 +2,6 @@ const termConverter = ['current', 'q1', 'q2', 'q3', 'q4']; let pdf_index = 0; -let pdfrendering = false; let modals = { "stats": document.getElementById('stats_modal'), "corrections": document.getElementById('corrections_modal'), diff --git a/public/js/reports.js b/public/js/reports.js new file mode 100644 index 00000000..e8e7fd07 --- /dev/null +++ b/public/js/reports.js @@ -0,0 +1,548 @@ +let pdfrendering = false; +let scale = 1; +let adjustedScale = 1; +let controlAdjustedScale = adjustedScale; +let pdf = null; +let currentPageNum = null; +let pendingPageNum = null; +let currentPdfIndex = null; + +let render_page_pdf = function(pageNumber) { + pdf.getPage(pageNumber).then(function(page) { + + // Update page indicator text + $("#page-indicator").text(`PAGE ${pageNumber} OF ${pdf.numPages}`); + + scale = 1; + + let viewport = page.getViewport({scale}); + + + let modifier = $('#pdf-container').width(); + + if ($(window).width() >= 900) { + modifier = 900; + } + + adjustedScale = (modifier / viewport.width) * 0.97; + controlAdjustedScale = (modifier / viewport.width) * 0.97; + + + viewport = page.getViewport({"scale": adjustedScale}); + + + let canvas = document.getElementById('pdf-canvas'); + let context = canvas.getContext('2d'); + canvas.width = viewport.width; + canvas.height = viewport.height; + + let renderContext = { + canvasContext: context, + viewport: viewport + }; + + let renderTask = page.render(renderContext); + renderTask.promise.then(function () { + pdfrendering = false; + // Another page rendering is pending + if (pendingPageNum !== null) { + render_page_pdf(pendingPageNum); + pendingPageNum = null; + } + }); + + }); +} + +let generate_pdf = function(index) { + if (!pdfrendering) { + pdfrendering = true; + let adjustedHeight = $(window).height() - 280; + if (!document.isFullScreen && !document.fullscreenElement && !document.webkitFullscreenElement && !document.mozFullScreenElement && !document.msFullscreenElement) { $('#pdf-container').css('height', adjustedHeight + 'px'); + } else { + $('#pdf-container').css('height', $(window).height() + 'px'); + } + + let pdfInitParams = {"data": ((currentTableData.pdf_files)[index]).content}; + // Store the index of the current PDF in `currentPdfIndex` + currentPdfIndex = index; + let loadingTask = pdfjsLib.getDocument(pdfInitParams); + loadingTask.promise.then(function(pdf_) { + pdf = pdf_; + currentPageNum = 1; + render_page_pdf(1); + }, function (reason) { + console.error(reason); + }); +} +} + +let zoom_in_pdf = function() { + if (!pdfrendering) { + pdfrendering = true; + let pdfInitParams = {"data": (currentTableData.pdf_files)[currentPdfIndex].content}; + let loadingTask = pdfjsLib.getDocument(pdfInitParams); + loadingTask.promise.then(function(pdf) { + + pdf.getPage(currentPageNum).then(function(page) { + + adjustedScale += 0.1; + + let viewport = page.getViewport({"scale": adjustedScale}); + + let canvas = document.getElementById('pdf-canvas'); + let context = canvas.getContext('2d'); + + canvas.width = viewport.width; + canvas.height = viewport.height; + + let renderContext = { + canvasContext: context, + viewport: viewport + }; + + let renderTask = page.render(renderContext); + renderTask.promise.then(function () { + pdfrendering = false; + }); + + }); + + + }, function (reason) { + console.error(reason); + }); + } +} + +let zoom_out_pdf = function() { + if (!pdfrendering) { + pdfrendering = true; + let pdfInitParams = {"data": (currentTableData.pdf_files)[currentPdfIndex].content}; + let loadingTask = pdfjsLib.getDocument(pdfInitParams); + loadingTask.promise.then(function(pdf) { + + pdf.getPage(currentPageNum).then(function(page) { + + adjustedScale -= 0.1; + + let viewport = page.getViewport({"scale": adjustedScale}); + + + let canvas = document.getElementById('pdf-canvas'); + let context = canvas.getContext('2d'); + + canvas.width = viewport.width; + canvas.height = viewport.height; + + let renderContext = { + canvasContext: context, + viewport: viewport + }; + + let renderTask = page.render(renderContext); + renderTask.promise.then(function () { + pdfrendering = false; + }); + + }); + + }, function (reason) { + console.error(reason); + }); + } +} + +// Render a certain page of the PDF or queue it to be rendered +let queue_render_page_pdf = function(pageNumber) { + if (pdf) { + if (pdfrendering) { + pendingPageNum = pageNumber; + } + else { + render_page_pdf(pageNumber); + } + } +} + +// Go one page back in the PDF +let prev_page_pdf = function() { + if (!currentPageNum || currentPageNum <= 1) return; + else { + currentPageNum--; + queue_render_page_pdf(currentPageNum); + } +} + +// Go one page forward in the PDF +let next_page_pdf = function() { + if (!currentPageNum || currentPageNum >= pdf.numPages) return; + else { + currentPageNum++; + queue_render_page_pdf(currentPageNum); + } +} + +async function download_pdf() { + // Get current PDF file's raw data + const data = await pdf.getData(); + // Use application/octet-stream MIME type to force a download (instead of + // having it open in a browser PDF viewer) + saveAs(new Blob([data], { + type: "application/octet-stream" + }), `${currentTableData.pdf_files[currentPdfIndex].title}.pdf`); +} + +function pdf_closeAllSelect(elmnt) { + /* A function that will close all select boxes in the document, + except the current select box: */ + let x, y, i, arrNo = []; + x = document.getElementsByClassName("pdf_select-items"); + y = document.getElementsByClassName("pdf_select-selected"); + for (i = 0; i < y.length; i++) { + if (elmnt === y[i]) { + arrNo.push(i) + } else { + y[i].classList.remove("pdf_select-arrow-active"); + } + } + for (i = 0; i < x.length; i++) { + if (arrNo.indexOf(i)) { + x[i].classList.add("pdf_select-hide"); + } + } +} +function closeAllSelect(elmnt) { + // $('.select-selected').removeClass("activated-selected-item"); + $('.select-items div').removeClass("activated-select-items"); + /* A function that will close all select boxes in the document, + except the current select box: */ + let x, y, i, arrNo = []; + x = document.getElementsByClassName("gpa_select-items"); + y = document.getElementsByClassName("gpa_select-selected"); + for (i = 0; i < y.length; i++) { + if (elmnt === y[i]) { + arrNo.push(i) + } else { + y[i].classList.remove("select-arrow-active"); + } + } + for (i = 0; i < x.length; i++) { + if (arrNo.indexOf(i)) { + x[i].classList.add("select-hide"); + } + } + if (!$(".gpa_select-selected").hasClass("select-arrow-active")) { + $('.gpa_select-selected').removeClass("activated-selected-item"); + $('.gpa_select-items div').removeClass("activated-select-items"); + } + +} +function tableData_closeAllSelect(elmnt) { + // $('.select-selected').removeClass("activated-selected-item"); + $('.tableData_select-items div').removeClass("activated-select-items"); + /* A function that will close all select boxes in the document, + except the current select box: */ + let x, y, i, arrNo = []; + x = document.getElementsByClassName("tableData_select-items"); + y = document.getElementsByClassName("tableData_select-selected"); + for (i = 0; i < y.length; i++) { + if (elmnt === y[i]) { + arrNo.push(i) + } else { + y[i].classList.remove("select-arrow-active"); + } + } + for (i = 0; i < x.length; i++) { + if (arrNo.indexOf(i)) { + x[i].classList.add("select-hide"); + } + } + if (!$(".tableData_select-selected").hasClass("select-arrow-active")) { + $('.tableData_select-selected').removeClass("activated-selected-item"); + $('.tableData_select-items div').removeClass("activated-select-items"); + } + +} + +function initialize_resize_hamburger() { + + // Total width of all items in tab minus hamburger + let total_width = -44.25; + + // Width of all items to the left (because they get removed last) plus logout button and hamburger widths + // 44.25 is hamburger width, has to be hardcoded becuase it might be display: none;'d + let left_width = 44.25 + $('#logout_button').outerWidth() + + // Gets all non-tablinks-right elements and adds their width to total_width and also left_width + $('.tab .tablinks:not(.tablinks-right)').outerWidth((_, w) => { + total_width += w; + left_width += w; + }); + + // Gets all tablinks-right elements and adds their width to total_width + $('.tab .tablinks-right').outerWidth((_, w) => {total_width += w;}) + + const switch_left_items = () => { + // Checks if left items are in sidenav + const in_sidenav = $('.tab .tablinks:not(.tablinks-right, .switch-exempt)').length === 0 + + if (in_sidenav) { + // Moves items from sidenav to tab + $('#sidenav .tablinks:not(.tablinks-right, .switch-exempt)').detach().appendTo($(".tab")); + } else { + // Moves items from tab to sidenav + $('.tab .tablinks:not(.tablinks-right, .switch-exempt)').detach().appendTo($("#sidenav")); + // Puts all the tablinks-right things below the non-tablinks-right things + for (const child of $('#sidenav .tablinks-right')) { + $('#sidenav').append(child); + } + } + } + + // REASON IT ADDS ITEMS IN REVERSE: + // Otherwise the items would basically go from right to left (in tab) + // To down to up, when I'd like it to be up to down. + const switch_right_items = function() { + // Checks if right-items (more specifically buttons) are hidden + + const in_sidenav = $('.tab .gpa_custom-select').length == 0 + + if (in_sidenav) { + + // Adds right items to tab in reverse + const children = $('#sidenav .tablinks-right:not(#logout_button)') + for (const child of [...children].reverse()) { + $(".tab").append(child); + } + + // Also closes the sidebar + closeSideNav(); + } else { + + // Adds right items to sidenav in reverse + const children = $('.tab .tablinks-right:not(#logout_button)') + for (const child of [...children].reverse()) { + $("#sidenav").append(child) + } + } + } + + const switch_hamburger = function() { + + // Hides or unhides the hamburger + if ($('#hamburger_button').hasClass("hide")) { + $('#hamburger_button').removeClass("hide") + } else { + $('#hamburger_button').addClass("hide") + } + } + + // navbar_state has 3 states + // 0 -> bar has enough space for everything, THIS IS THE DEFAULT IN THE CSS/HTML + // 1 -> bar can't fit the items on the right + // 2 -> bar can only fit logout and hamburger + // old_navbar_state is used to compare the newer navbar_state to the current navbar_state + let navbar_state, old_navbar_state; + const update_navbar_state = function() { + if ($(".tab").width() <= left_width) { + navbar_state = 2; + } else if ($(".tab").width() <= total_width) { + navbar_state = 1; + } else { + navbar_state = 0; + } + } + + // Initially instantiates nav_bar_state and old_nav_bar_state + update_navbar_state(); + old_navbar_state = navbar_state; + + // Initially switches whatever is necessary, only if navbar_state is 1 or 2 because 0 is default + if (navbar_state === 1) { + switch_right_items(); + switch_hamburger(); + } else if (navbar_state === 2) { + switch_right_items(); + switch_left_items(); + switch_hamburger(); + } + + // ADDS THE EVENT LISTENER + window.addEventListener("resize", function () { + + // Updates navbar_state + update_navbar_state(); + + // If they're different, updates the tab and sidenav + if (old_navbar_state !== navbar_state) { + if ((old_navbar_state === 0 && navbar_state === 1) || (old_navbar_state === 1 && navbar_state === 0)) { + // When moving to and from 0 and 1, needs to switch both right items and hamburgers + switch_right_items(); + switch_hamburger(); + } + else if ((old_navbar_state === 1 && navbar_state === 2) || (old_navbar_state === 2 && navbar_state === 1)) { + // When moving between 1 and 2, needs to switch left items + switch_left_items(); + } + else if ((old_navbar_state === 0 && navbar_state === 2) || (old_navbar_state === 2 && navbar_state === 0)) { + // If it goes from 0 to 2 or 2 to 0, do everything in succession + switch_right_items(); + switch_hamburger(); + switch_left_items(); + } + + } + + // Updates the old navbar state for later comparisons + old_navbar_state = navbar_state; + + }); + +} + + +//pdf dropdown stuff +let initialize_pdf_dropdown = function() { + + //let o = new Option(tableData.pdf_files[i].title, i); + ///// jquerify the DOM object 'o' so we can use the html method + //$(o).html(tableData.pdf_files[i].title); + //$("#pdf-select").append(o); + + for (let i = 1; i < currentTableData.pdf_files.length + 1; i++) { + if (i === 1) { + let o = new Option(currentTableData.pdf_files[i - 1].title, 0); + /// jquerify the DOM object 'o' so we can use the html method + $(o).html(currentTableData.pdf_files[i - 1].title); + $("#pdf_select").append(o); + } + + let o = new Option(currentTableData.pdf_files[i - 1].title, i); + /// jquerify the DOM object 'o' so we can use the html method + $(o).html(currentTableData.pdf_files[i - 1].title); + $("#pdf_select").append(o); + + } + + let x, i, j, selElmnt, a, b, c; + /* Look for any elements with the class "pdf_custom-select": */ + x = document.getElementsByClassName("pdf_custom-select"); + for (i = 0; i < x.length; i++) { + selElmnt = x[i].getElementsByTagName("select")[0]; + /* For each element, create a new DIV that will act as the selected item: */ + a = document.createElement("DIV"); + a.setAttribute("class", "pdf_select-selected"); + a.innerHTML = selElmnt.options[selElmnt.selectedIndex].innerHTML; + x[i].appendChild(a); + /* For each element, create a new DIV that will contain the option list: */ + b = document.createElement("DIV"); + b.setAttribute("class", "pdf_select-items pdf_select-hide"); + for (j = 1; j < selElmnt.length; j++) { + /* For each option in the original select element, + create a new DIV that will act as an option item: */ + c = document.createElement("DIV"); + c.innerHTML = selElmnt.options[j].innerHTML; + c.setAttribute("data-value", selElmnt.options[j].value); + c.addEventListener("click", function(e) { + /* When an item is clicked, update the original select box, + and the selected item: */ + let y, i, k, s, h; + s = this.parentNode.parentNode.getElementsByTagName("select")[0]; + h = this.parentNode.previousSibling; + for (i = 0; i < s.length; i++) { + if (s.options[i].value === this.getAttribute("data-value")) { + if (i === 0) { + pdf_index = i; + generate_pdf(i); + + } else { + pdf_index = i - 1; + generate_pdf(i - 1); + } + s.selectedIndex = i; + h.innerHTML = this.innerHTML; + y = this.parentNode.getElementsByClassName("pdf_same-as-selected"); + for (k = 0; k < y.length; k++) { + y[k].removeAttribute("class"); + } + this.setAttribute("class", "pdf_same-as-selected"); + break; + } + } + h.click(); + }); + b.appendChild(c); + } + x[i].appendChild(b); + a.addEventListener("click", function(e) { + /* When the select box is clicked, close any other select boxes, + and open/close the current select box: */ + e.stopPropagation(); + pdf_closeAllSelect(this); + closeAllSelect(); + tableData_closeAllSelect(); + this.nextSibling.classList.toggle("pdf_select-hide"); + this.classList.toggle("pdf_select-arrow-active"); + }); + } + + +} + +let toggle_fullscreen_icon = function() { + if ($('#expand-pdf-icon i').hasClass('fa-expand-alt')) { + $('#expand-pdf-icon i').removeClass("fa-expand-alt").addClass("fa-compress-alt"); + $('#expand-pdf-icon .tooltiptext').attr('style', $('#expand-pdf-icon .tooltiptext').attr('style').replace("margin-left: -92px;", "margin-left: -95px;")).replace_text("Exit Fullscreen") + + } else { + $('#expand-pdf-icon i').removeClass("fa-compress-alt").addClass("fa-expand-alt"); + $('#expand-pdf-icon .tooltiptext').attr('style', $('#expand-pdf-icon .tooltiptext').attr('style').replace("margin-left: -95px;", "margin-left: -92px;")).replace_text("Go Fullscreen") + + } +} + +let toggle_fullscreen_pdf = function() { + let elem = document.getElementById('reports'); + + console.log("Fullscreen Activate"); + if (!document.isFullScreen && !document.fullscreenElement && !document.webkitFullscreenElement && !document.mozFullScreenElement && !document.msFullscreenElement) { + if (elem.requestFullscreen) { + elem.requestFullscreen(); + toggle_fullscreen_icon(); + + } else if (elem.mozRequestFullScreen) { /* Firefox */ + elem.mozRequestFullScreen(); + toggle_fullscreen_icon(); + + } else if (elem.webkitRequestFullscreen) { /* Chrome, Safari and Opera */ + let new_height = $(window).height(); + elem.webkitRequestFullscreen(); + toggle_fullscreen_icon(); + + } else if (elem.msRequestFullscreen) { /* IE/Edge */ + elem.msRequestFullscreen(); + toggle_fullscreen_icon(); + + } + } else { + + if (document.exitFullscreen) { + document.exitFullscreen(); + toggle_fullscreen_icon(); + + } else if (document.mozCancelFullScreen) { /* Firefox */ + document.mozCancelFullScreen(); + toggle_fullscreen_icon(); + + } else if (document.webkitExitFullscreen) { /* Chrome, Safari and Opera */ + document.webkitExitFullscreen(); + toggle_fullscreen_icon(); + + } else if (document.msExitFullscreen) { /* IE/Edge */ + document.msExitFullscreen(); + toggle_fullscreen_icon(); + + } + } +}