您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
align form with scan
// ==UserScript== // @name Zooniverse Rainfall Rescue form align // @namespace https://github.com/CzarnyZajaczek // @description align form with scan // @include https://www.zooniverse.org/projects/edh/rainfall-rescue/classify // @version 0.5 // @author Tomasz Dąbski "CzarnyZajaczek" // @license GPL-3.0 http://www.gnu.org/licenses/gpl-3.0.txt // @grant none // @run-at document-end // ==/UserScript== var scriptValue = "// function ZooniverseRainfallRescueFormAlign() {\n"+ "// \n"+ "// }\n"+ "// code of function ZooniverseRainfallRescueFormAligndragElement() copied from https://www.w3schools.com/howto/howto_js_draggable.asp and slightly adapted (function name and DOM ids)\n"+ "// Make the DIV element draggable:\n"+ "ZooniverseRainfallRescueFormAligndragElement(document.getElementById(\"greasemonkey-zooniverse-rainfall-rescue-form-aligned_verlay_form\"));\n"+ "function ZooniverseRainfallRescueFormAligndragElement(elmnt) {\n"+ " var pos1 = 0, pos2 = 0, pos3 = 0, pos4 = 0;\n"+ " if (document.getElementById(\"greasemonkey-zooniverse-rainfall-rescue-form-drag_overlay_form\")) {\n"+ " // if present, the header is where you move the DIV from:\n"+ " document.getElementById(\"greasemonkey-zooniverse-rainfall-rescue-form-drag_overlay_form\").onmousedown = dragMouseDown;\n"+ " } else {\n"+ " // otherwise, move the DIV from anywhere inside the DIV:\n"+ " elmnt.onmousedown = dragMouseDown;\n"+ " }\n"+ " function dragMouseDown(e) {\n"+ " e = e || window.event;\n"+ " e.preventDefault();\n"+ " // get the mouse cursor position at startup:\n"+ " pos3 = e.clientX;\n"+ " pos4 = e.clientY;\n"+ " document.onmouseup = closeDragElement;\n"+ " // call a function whenever the cursor moves:\n"+ " document.onmousemove = elementDrag;\n"+ " }\n"+ " function elementDrag(e) {\n"+ " e = e || window.event;\n"+ " e.preventDefault();\n"+ " // calculate the new cursor position:\n"+ " pos1 = pos3 - e.clientX;\n"+ " pos2 = pos4 - e.clientY;\n"+ " pos3 = e.clientX;\n"+ " pos4 = e.clientY;\n"+ " // set the element's new position:\n"+ " elmnt.style.top = (elmnt.offsetTop - pos2) + \"px\";\n"+ " elmnt.style.left = (elmnt.offsetLeft - pos1) + \"px\";\n"+ " }\n"+ " function closeDragElement() {\n"+ " // stop moving when mouse button is released:\n"+ " document.onmouseup = null;\n"+ " document.onmousemove = null;\n"+ " }\n"+ "}\n"+ "function ZooniverseRainfallRescueFormAlignDecreaseSize() {\n"+ " var pixelsDisplay;\n"+ " var formRowHeight;\n"+ " var rawNumber;\n"+ " var formTable;\n"+ " var formTableRows;\n"+ " var i;\n"+ " \n"+ " pixelsDisplay = document.getElementById('greasemonkey-zooniverse-rainfall-rescue-form-pixels_display');\n"+ " \n"+ " formRowHeight = pixelsDisplay.innerHTML;\n"+ " rawNumber = formRowHeight.split('px')[0];\n"+ " \n"+ " if (rawNumber >1) {\n"+ " rawNumber--;\n"+ " }\n"+ " \n"+ " pixelsDisplay.innerHTML = rawNumber+'px';\n"+ " formTable = document.getElementById('greasemonkey-zooniverse-rainfall-rescue-form-form_table');\n"+ " \n"+ " formTableRows = formTable.getElementsByTagName('tr');\n"+ " \n"+ " for (i = 0; i < formTableRows.length; i++) {\n"+ " if ((' ' + formTableRows[i].className + ' ').indexOf(' greasemonkey-zooniverse-rainfall-rescue-form-form_table_row ') > -1) {\n"+ " formTableRows[i].style.height = rawNumber+'px';\n"+ " }\n"+ " }\n"+ " \n"+ "}\n"+ "function ZooniverseRainfallRescueFormAlignIncreaseSize() {\n"+ " var pixelsDisplay;\n"+ " var formRowHeight;\n"+ " var rawNumber;\n"+ " var formTable;\n"+ " var formTableRows;\n"+ " var i;\n"+ " \n"+ " pixelsDisplay = document.getElementById('greasemonkey-zooniverse-rainfall-rescue-form-pixels_display');\n"+ " \n"+ " formRowHeight = pixelsDisplay.innerHTML;\n"+ " \n"+ " rawNumber = formRowHeight.split('px')[0];\n"+ " \n"+ " if (rawNumber <200) {\n"+ " rawNumber++;\n"+ " }\n"+ " \n"+ " pixelsDisplay.innerHTML = rawNumber+'px';\n"+ " \n"+ " formTable = document.getElementById('greasemonkey-zooniverse-rainfall-rescue-form-form_table');\n"+ " \n"+ " formTableRows = formTable.getElementsByTagName('tr');\n"+ " \n"+ " for (i = 0; i < formTableRows.length; i++) {\n"+ " if ((' ' + formTableRows[i].className + ' ').indexOf(' greasemonkey-zooniverse-rainfall-rescue-form-form_table_row ') > -1) {\n"+ " formTableRows[i].style.height = rawNumber+'px';\n"+ " }\n"+ " }\n"+ " \n"+ "}\n"+ "function ZooniverseRainfallRescueFormAlignReloadFormWaiter() {\n"+ " var scriptLockDivId;\n"+ " var scriptLock;\n"+ " var scriptLockParent;\n"+ " var setIntervalIdBox;\n"+ " var setIntervalId;\n"+ " \n"+ " scriptLockDivId = 'greasemonkey-zooniverse-rainfall-rescue-form-align-reload_form_processing';\n"+ " scriptLock = document.getElementById(scriptLockDivId);\n"+ " if (scriptLock) {\n"+ " scriptLockParent = scriptLock.parentNode;\n"+ " scriptLockParent.removeChild(scriptLock);\n"+ " }\n"+ " \n"+ " \n"+ " \n"+ " setIntervalIdBox = [];\n"+ " setIntervalId = setInterval(function(){\n"+ " // check for elements loaded\n"+ " var divElements;\n"+ " var parentDiv;\n"+ " var taskContainerElement;\n"+ " var taskContainerParent;\n"+ " var taskContainerParentButtons;\n"+ " var workflowTaskDivs;\n"+ " var workflowTaskElements;\n"+ " var inputTextarea;\n"+ " var classifierLargeImageDiv;\n"+ " var subjectViewerDiv;\n"+ " var classifierLargeImageDivDivs;\n"+ " var scriptLock;\n"+ " var headerElement;\n"+ " var scriptLockDiv;\n"+ " var formPositionTop;\n"+ " var formPositionLeft;\n"+ "// var firstYearPositionLeft;\n"+ " var formPositionLeftByYear;\n"+ " var formTable;\n"+ " var formTableRowsInputs;\n"+ " var rowsFound;\n"+ " var formTableRows;\n"+ " var formTableRowsTDs;\n"+ " var i;\n"+ " var j;\n"+ " var k;\n"+ " var childNodes;\n"+ " var tdElements;\n"+ " var formTableTdCalculated;\n"+ " var formTableTdIsDiffer;\n"+ " var yearFound;\n"+ " var year;\n"+ " var rowDivs;\n"+ " var formInput;\n"+ " var formLabel;\n"+ " var formLabelDiv;\n"+ " var workflowTaskElementDivs;\n"+ " var formLabelStrong;\n"+ " var yearNumber;\n"+ " var formTableTdI;\n"+ " var formLabelBox;\n"+ " var formTableTdL;\n"+ " var yearText;\n"+ " var lastDigit;\n"+ " var lastDigitNumber;\n"+ " var newFormPositionLeft;\n"+ " var innerSpan;\n"+ " var formOverlayContainerDiv;\n"+ " \n"+ " divElements = document.getElementsByTagName('div');\n"+ " parentDiv = false;\n"+ " for (i = 0; i < divElements.length; i++) {\n"+ " if ((' ' + divElements[i].className + ' ').indexOf(' project-page ') > -1) {\n"+ " parentDiv = divElements[i];\n"+ " break;\n"+ " }\n"+ " }\n"+ " \n"+ " \n"+ " taskContainerElement = false;\n"+ " \n"+ " for (i = 0; i < divElements.length; i++) {\n"+ " if ((' ' + divElements[i].className + ' ').indexOf(' task-container ') > -1) {\n"+ " taskContainerElement = divElements[i];\n"+ " break;\n"+ " }\n"+ " }\n"+ " \n"+ " if (!taskContainerElement) {\n"+ " return;\n"+ " }\n"+ " \n"+ " \n"+ " taskContainerParent = taskContainerElement.parentNode;\n"+ " if (!taskContainerParent) {\n"+ " return;\n"+ " }\n"+ " \n"+ " taskContainerParentButtons = taskContainerParent.getElementsByTagName('button');\n"+ " if (!taskContainerParentButtons) {\n"+ " return;\n"+ " }\n"+ " \n"+ " \n"+ " workflowTaskDivs = taskContainerElement.getElementsByTagName('div');\n"+ " workflowTaskElements = [];\n"+ " \n"+ " for (i = 0; i < workflowTaskDivs.length; i++) {\n"+ " if ((' ' + workflowTaskDivs[i].className + ' ').indexOf(' workflow-task ') > -1) {\n"+ " workflowTaskElements.push(workflowTaskDivs[i]);\n"+ " inputTextarea = workflowTaskDivs[i].getElementsByTagName('textarea')[0];\n"+ " if (!inputTextarea) {\n"+ " return;\n"+ " }\n"+ " }\n"+ " }\n"+ " \n"+ " if (workflowTaskElements.length < 13) {\n"+ " return;\n"+ " }\n"+ " \n"+ " classifierLargeImageDiv = false;\n"+ " \n"+ " for (i = 0; i < divElements.length; i++) {\n"+ " if ((' ' + divElements[i].className + ' ').indexOf(' classifier ') > -1) {\n"+ " if ((' ' + divElements[i].className + ' ').indexOf(' large-image ') > -1) {\n"+ " classifierLargeImageDiv = divElements[i];\n"+ " break;\n"+ " }\n"+ " }\n"+ " }\n"+ " \n"+ " if (!classifierLargeImageDiv) {\n"+ " return;\n"+ " }\n"+ " \n"+ " \n"+ " subjectViewerDiv = false;\n"+ " classifierLargeImageDivDivs = classifierLargeImageDiv.getElementsByTagName('div');\n"+ " for (i = 0; i < classifierLargeImageDivDivs.length; i++) {\n"+ " if ((' ' + classifierLargeImageDivDivs[i].className + ' ').indexOf(' subject-viewer ') > -1) {\n"+ " subjectViewerDiv = classifierLargeImageDivDivs[i];\n"+ " }\n"+ " }\n"+ " \n"+ " if (!subjectViewerDiv) {\n"+ " return;\n"+ " }\n"+ " \n"+ " \n"+ " if (!parentDiv) {\n"+ " return;\n"+ " }\n"+ " \n"+ " // lock, in case of unsynced 2 calls\n"+ " scriptLock = document.getElementById(scriptLockDivId);\n"+ " if (scriptLock) {\n"+ " return;\n"+ " }\n"+ " \n"+ " headerElement = parentDiv.getElementsByTagName('header')[0];\n"+ " \n"+ " scriptLockDiv = document.createElement('DIV');\n"+ " scriptLockDiv.id = scriptLockDivId;\n"+ " \n"+ " parentDiv.insertBefore(scriptLockDiv, headerElement);\n"+ " \n"+ " formOverlayContainerDiv = document.getElementById('greasemonkey-zooniverse-rainfall-rescue-form-aligned_verlay_form');\n"+ " \n"+ " \n"+ " formPositionTop = \"429px\";\n"+ " formPositionLeft = \"860px\";\n"+ " \n"+ " // firstYearPositionLeft = \"235px\";\n"+ " \n"+ " formPositionLeftByYear = [];\n"+ " formPositionLeftByYear.push(\"235px\"); //0\n"+ " formPositionLeftByYear.push(\"296px\"); //1\n"+ " formPositionLeftByYear.push(\"353px\"); //2\n"+ " formPositionLeftByYear.push(\"412px\");//3\n"+ " formPositionLeftByYear.push(\"470px\");//4\n"+ " formPositionLeftByYear.push(\"529px\");//5\n"+ " formPositionLeftByYear.push(\"587px\");//6\n"+ " formPositionLeftByYear.push(\"646px\");//7\n"+ " formPositionLeftByYear.push(\"704px\");//8\n"+ " formPositionLeftByYear.push(\"763px\");//9\n"+ " \n"+ "// formOverlayContainerDiv.style.top = formPositionTop;\n"+ " formOverlayContainerDiv.style.left = formPositionLeft;\n"+ " \n"+ " // unload form elements\n"+ " formTable = document.getElementById('greasemonkey-zooniverse-rainfall-rescue-form-form_table');\n"+ " \n"+ " formTableRowsInputs = [];\n"+ " \n"+ " rowsFound = 0;\n"+ " formTableRows = formTable.getElementsByTagName('tr');\n"+ " for (i = 0; i < formTableRows.length; i++) {\n"+ " if ((' ' + formTableRows[i].className + ' ').indexOf(' greasemonkey-zooniverse-rainfall-rescue-form-form_table_row ') > -1) {\n"+ " formTableRowsTDs = formTableRows[i].childNodes;\n"+ " for (j = 0; j < formTableRowsTDs.length; j++) {\n"+ " childNodes = formTableRowsTDs[j].childNodes;\n"+ " for (k = 0; k < childNodes.length; k++) {\n"+ " formTableRowsTDs[j].removeChild(childNodes[k]);\n"+ " }\n"+ " }\n"+ " formTableRowsInputs.push(formTableRows[i]);\n"+ " rowsFound++;\n"+ " }\n"+ " \n"+ " if ((' ' + formTableRows[i].className + ' ').indexOf(' greasemonkey-zooniverse-rainfall-rescue-form-control_checksum ') > -1) {\n"+ " tdElements = formTableRows[i].getElementsByTagName('td');\n"+ " formTableTdCalculated = tdElements[0];\n"+ " formTableTdIsDiffer = tdElements[1];\n"+ " \n"+ " childNodes = formTableTdCalculated.childNodes;\n"+ " for (k = 0; k < childNodes.length; k++) {\n"+ " formTableTdCalculated.removeChild(childNodes[k]);\n"+ " }\n"+ " childNodes = formTableTdIsDiffer.childNodes;\n"+ " for (k = 0; k < childNodes.length; k++) {\n"+ " formTableTdIsDiffer.removeChild(childNodes[k]);\n"+ " }\n"+ " }\n"+ " }\n"+ " \n"+ " \n"+ " // load form elements again into table\n"+ " \n"+ " yearFound = false;\n"+ " year = false;\n"+ " \n"+ " for (i = 0; i < workflowTaskElements.length; i++) {\n"+ " rowDivs = formTableRowsInputs[i].getElementsByTagName('td');\n"+ " \n"+ " formInput = workflowTaskElements[i].getElementsByTagName('label')[0];\n"+ " formLabelDiv = false;\n"+ " \n"+ " workflowTaskElementDivs = workflowTaskElements[i].getElementsByTagName('div');\n"+ " for (j = 0; j < workflowTaskElementDivs.length; j++) {\n"+ " if ((' ' + workflowTaskElementDivs[j].className + ' ').indexOf(' markdown ') > -1) {\n"+ " if ((' ' + workflowTaskElementDivs[j].className + ' ').indexOf(' question ') > -1) {\n"+ " formLabelDiv =workflowTaskElementDivs[j];\n"+ " break;\n"+ " }\n"+ " }\n"+ " }\n"+ " \n"+ " if (formLabelDiv.getElementsByTagName('p').length > 1) {\n"+ " k = formLabelDiv.getElementsByTagName('p').length;\n"+ " k--;\n"+ " formLabel = formLabelDiv.getElementsByTagName('p')[k];\n"+ " } else {\n"+ " formLabel = formLabelDiv.getElementsByTagName('p')[0];\n"+ " }\n"+ " if (!yearFound) {\n"+ " formLabelStrong = formLabel.getElementsByTagName('strong')[0];\n"+ " year = formLabelStrong.innerHTML.split(' ');\n"+ " for (j = 0; j < year.length; j++) {\n"+ " yearNumber = parseInt(year[j]);\n"+ " if (yearNumber>1000 && yearNumber<2021) {\n"+ " yearFound = true;\n"+ " }\n"+ " }\n"+ " }\n"+ " formLabel.style.margin = \"0px\";\n"+ " \n"+ " formInput.getElementsByTagName('textarea')[0].style.padding = \"0px\";\n"+ " \n"+ " formTableTdI = rowDivs[0];\n"+ " \n"+ " formTableTdI.appendChild(formInput);\n"+ " \n"+ " formLabelBox = document.createElement('DIV');\n"+ " formLabelBox.appendChild(formLabel);\n"+ " \n"+ " formTableTdL = rowDivs[1];\n"+ " \n"+ " formTableTdL.appendChild(formLabelBox);\n"+ " }\n"+ " \n"+ " if (yearFound) {\n"+ " // take last digit from year\n"+ " yearText = year.toString();\n"+ " lastDigit = yearText[yearText.length -1];\n"+ " \n"+ " lastDigitNumber = parseInt(lastDigit);\n"+ " \n"+ " newFormPositionLeft = formPositionLeftByYear[lastDigitNumber];\n"+ " formOverlayContainerDiv.style.left = newFormPositionLeft;\n"+ " }\n"+ " \n"+ " // add event listener to button\n"+ " \n"+ " taskContainerParent = taskContainerElement.parentNode;\n"+ " \n"+ " taskContainerParentButtons = taskContainerParent.getElementsByTagName('button');\n"+ " \n"+ " for (i = 0; i < taskContainerParentButtons.length; i++) {\n"+ " innerSpan = taskContainerParentButtons[i].getElementsByTagName('span')[0];\n"+ " if (innerSpan.innerHTML.trim().toLowerCase() == 'done') {\n"+ " if (taskContainerParentButtons[i].addEventListener) {\n"+ " taskContainerParentButtons[i].addEventListener(\"click\", ZooniverseRainfallRescueFormAlignReloadFormWaiter);\n"+ " } else if (taskContainerParentButtons[i].attachEvent) {\n"+ " taskContainerParentButtons[i].attachEvent(\"onclick\", ZooniverseRainfallRescueFormAlignReloadFormWaiter);\n"+ " }\n"+ " break;\n"+ " }\n"+ " }\n"+ " \n"+ " // control checksum\n"+ " \n"+ " formTableRows = formTable.getElementsByTagName('tr');\n"+ " for (i = 0; i < formTableRows.length; i++) {\n"+ " if ((' ' + formTableRows[i].className + ' ').indexOf(' greasemonkey-zooniverse-rainfall-rescue-form-form_table_row ') > -1) {\n"+ " inputTextarea = formTableRows[i].getElementsByTagName('textarea')[0];\n"+ " \n"+ " if (inputTextarea.addEventListener) {\n"+ " inputTextarea.addEventListener(\"input\", ZooniverseRainfallRescueFormAlignChecksum);\n"+ " } else if (inputTextarea.attachEvent) {\n"+ " inputTextarea.attachEvent(\"oninput\", ZooniverseRainfallRescueFormAlignChecksum);\n"+ " }\n"+ " }\n"+ " }\n"+ " \n"+ " \n"+ " // turn off timer\n"+ " \n"+ " if (setIntervalIdBox.length == 1) {\n"+ " clearInterval(setIntervalIdBox[0]);\n"+ " }\n"+ " }, 300, setIntervalIdBox);\n"+ " setIntervalIdBox.push(setIntervalId);\n"+ "}\n"+ "function ZooniverseRainfallRescueFormAlignChecksum() {\n"+ " var formTable;\n"+ " var formTableRows;\n"+ " var sumValue;\n"+ " var difference;\n"+ " var isDiffer;\n"+ " var maxPrecision;\n"+ " var inputTextarea;\n"+ " var inputValue;\n"+ " var numberText;\n"+ " var numberParts;\n"+ " var numberPrecision;\n"+ " var tmpsumValue;\n"+ " var tmpinputValue;\n"+ " var tdElements;\n"+ " var formTableTdCalculated;\n"+ " var formTableTdIsDiffer;\n"+ " var childNodes;\n"+ " var i;\n"+ " var j;\n"+ " var k;\n"+ " var checksumSpan;\n"+ " var checksumContents;\n"+ " var summarySpan;\n"+ " var summaryContents;\n"+ " formTable = document.getElementById('greasemonkey-zooniverse-rainfall-rescue-form-form_table');\n"+ " \n"+ " \n"+ " formTableRows = formTable.getElementsByTagName('tr');\n"+ " \n"+ " sumValue = 0;\n"+ " difference = 0;\n"+ " isDiffer = false;\n"+ " maxPrecision = 0;\n"+ " \n"+ " for (i = 0; i < formTableRows.length; i++) {\n"+ " if ((' ' + formTableRows[i].className + ' ').indexOf(' greasemonkey-zooniverse-rainfall-rescue-form-form_table_row ') > -1) {\n"+ " inputTextarea = formTableRows[i].getElementsByTagName('textarea')[0];\n"+ " \n"+ " inputValue = parseFloat(inputTextarea.value);\n"+ " if (isNaN(inputValue)) {\n"+ " inputValue = 0;\n"+ " }\n"+ "// alert(1);\n"+ " numberText = inputTextarea.value.trim().replace(',', '.');\n"+ "// alert(2);\n"+ " if (numberText.indexOf('.') > -1) {\n"+ "// alert(3);\n"+ " numberParts = numberText.split('.');\n"+ "// alert(4);\n"+ " numberPrecision = numberParts[1].length;\n"+ "// alert(5);\n"+ " if (numberPrecision> maxPrecision) {\n"+ "// alert(6);\n"+ " maxPrecision = numberPrecision;\n"+ " }\n"+ " }\n"+ " if (i<13) {\n"+ " sumValue = sumValue + inputValue;\n"+ " } else {\n"+ " tmpsumValue = sumValue;\n"+ " tmpinputValue = inputValue;\n"+ " if (maxPrecision > 0) {\n"+ "// alert(7);\n"+ " for (j=0; j<maxPrecision; j++) {\n"+ "// alert(8);\n"+ " tmpsumValue = tmpsumValue * 10;\n"+ " tmpinputValue = tmpinputValue * 10;\n"+ " }\n"+ "// alert(9);\n"+ " }\n"+ " tmpsumValue = Math.round(tmpsumValue);\n"+ "// alert(10);\n"+ " tmpinputValue = Math.round(tmpinputValue);\n"+ "// alert(11);\n"+ " \n"+ " \n"+ " if (tmpsumValue == tmpinputValue) {\n"+ " isDiffer = false;\n"+ " } else {\n"+ " isDiffer = true;\n"+ " difference = inputValue - sumValue;\n"+ " }\n"+ " }\n"+ " }\n"+ " \n"+ " if ((' ' + formTableRows[i].className + ' ').indexOf(' greasemonkey-zooniverse-rainfall-rescue-form-control_checksum ') > -1) {\n"+ " tdElements = formTableRows[i].getElementsByTagName('td');\n"+ " formTableTdCalculated = tdElements[0];\n"+ " formTableTdIsDiffer = tdElements[1];\n"+ " \n"+ " childNodes = formTableTdCalculated.childNodes;\n"+ " for (k = 0; k < childNodes.length; k++) {\n"+ " formTableTdCalculated.removeChild(childNodes[k]);\n"+ " }\n"+ " childNodes = formTableTdIsDiffer.childNodes;\n"+ " for (k = 0; k < childNodes.length; k++) {\n"+ " formTableTdIsDiffer.removeChild(childNodes[k]);\n"+ " }\n"+ " \n"+ " checksumSpan = document.createElement('span');\n"+ " checksumContents = document.createTextNode(sumValue);\n"+ " checksumSpan.appendChild(checksumContents);\n"+ " formTableTdCalculated.appendChild(checksumSpan);\n"+ " \n"+ " summarySpan = document.createElement('span');\n"+ " if (!isDiffer) {\n"+ " summaryContents = document.createTextNode('equal');\n"+ " summarySpan.style.color = 'green';\n"+ " summarySpan.style.fontWeight = 'bold';\n"+ " } else {\n"+ " summarySpan.style.fontWeight = 'normal';\n"+ " summarySpan.style.color = 'red';\n"+ " if (difference > 0) {\n"+ " summaryContents = document.createTextNode('+'+difference);\n"+ "// summarySpan.style.color = 'red';\n"+ " } else {\n"+ " summaryContents = document.createTextNode(difference);\n"+ "// summarySpan.style.color = 'blue';\n"+ " }\n"+ " }\n"+ " \n"+ " summarySpan.appendChild(summaryContents);\n"+ " formTableTdIsDiffer.appendChild(summarySpan);\n"+ " }\n"+ " }\n"+ "}\n"+ "function ZooniverseRainfallRescueFormAlignCommaDot() {\n"+ " \n"+ "}"; var setIntervalIdBox = []; var setIntervalId = setInterval(function(){ var scriptAddedDivId; var scriptLockDivId; var scriptAdded; var divElements; var parentDiv; var taskContainerElement; var taskContainerParent; var taskContainerParentButtons; var workflowTaskDivs; var workflowTaskElements; var inputTextarea; var classifierLargeImageDiv; var subjectViewerDiv; var classifierLargeImageDivDivs; var scriptLock; var headerElement; var scriptLockDiv; var formOverlayContainerDivId; var formOverlayContainerDiv; // var debugContents; var formRowFirstRowOffsetTop; var formRowHeight; var formRowTotalTop; var formPositionTop; var formPositionLeft; // var firstYearPositionLeft; var formPositionLeftByYear; var headerDiv; var headerContents; var headerTable; var headerTableTbody; var headerTR; var headerTD; var minusButton; var buttonContents; var pixelsDisplay; var plusButton; var formTable; var formTableTbody; var yearFound; var year; var formSpacerRow; var formTableTdI; var formTableTdL; var formRow; var formInput; var formLabel; var formLabelDiv; var workflowTaskElementDivs; var i; var j; var k; var formLabelStrong; var yearNumber; var formLabelBox; var yearText; var lastDigit; var lastDigitNumber; var newFormPositionLeft; var ScriptTag; var ScriptTagContents; var scriptAddedDiv; var formTableTdCalculated; var formTableTdCalculatedPlaceholder; var formTableTdIsDiffer; var formTableRows; var innerSpan; var classifierLargeImageDivNavs; var formTableTd; scriptAddedDivId = 'greasemonkey-zooniverse-rainfall-rescue-form-align'; scriptLockDivId = 'greasemonkey-zooniverse-rainfall-rescue-form-align-reload_form_processing'; scriptAdded = document.getElementById(scriptAddedDivId); if (scriptAdded) { if (setIntervalIdBox.length == 1) { clearInterval(setIntervalIdBox[0]); } return; } divElements = document.getElementsByTagName('div'); parentDiv = false; for (i = 0; i < divElements.length; i++) { if ((' ' + divElements[i].className + ' ').indexOf(' project-page ') > -1) { parentDiv = divElements[i]; break; } } taskContainerElement = false; for (i = 0; i < divElements.length; i++) { if ((' ' + divElements[i].className + ' ').indexOf(' task-container ') > -1) { taskContainerElement = divElements[i]; break; } } if (!taskContainerElement) { return; } taskContainerParent = taskContainerElement.parentNode; if (!taskContainerParent) { return; } taskContainerParentButtons = taskContainerParent.getElementsByTagName('button'); if (!taskContainerParentButtons) { return; } workflowTaskDivs = taskContainerElement.getElementsByTagName('div'); workflowTaskElements = []; for (i = 0; i < workflowTaskDivs.length; i++) { if ((' ' + workflowTaskDivs[i].className + ' ').indexOf(' workflow-task ') > -1) { workflowTaskElements.push(workflowTaskDivs[i]); inputTextarea = workflowTaskDivs[i].getElementsByTagName('textarea')[0]; if (!inputTextarea) { return; } } } if (workflowTaskElements.length < 13) { return; } classifierLargeImageDiv = false; for (i = 0; i < divElements.length; i++) { if ((' ' + divElements[i].className + ' ').indexOf(' classifier ') > -1) { if ((' ' + divElements[i].className + ' ').indexOf(' large-image ') > -1) { classifierLargeImageDiv = divElements[i]; break; } } } if (!classifierLargeImageDiv) { return; } subjectViewerDiv = false; classifierLargeImageDivDivs = classifierLargeImageDiv.getElementsByTagName('div'); for (i = 0; i < classifierLargeImageDivDivs.length; i++) { if ((' ' + classifierLargeImageDivDivs[i].className + ' ').indexOf(' subject-viewer ') > -1) { subjectViewerDiv = classifierLargeImageDivDivs[i]; } } if (!subjectViewerDiv) { return; } if (!parentDiv) { return; } scriptLock = document.getElementById(scriptLockDivId); if (scriptLock) { return; } headerElement = parentDiv.getElementsByTagName('header')[0]; scriptLockDiv = document.createElement('DIV'); scriptLockDiv.id = scriptLockDivId; parentDiv.insertBefore(scriptLockDiv, headerElement); // rearrange form formOverlayContainerDivId = 'greasemonkey-zooniverse-rainfall-rescue-form-aligned_verlay_form'; formOverlayContainerDiv = document.createElement('DIV'); formOverlayContainerDiv.id = formOverlayContainerDivId; // debugContents = document.createTextNode('-- form --'); // formOverlayContainerDiv.appendChild(debugContents); formOverlayContainerDiv.style.zIndex = '10'; classifierLargeImageDiv.style.justifyContent = 'left'; formOverlayContainerDiv.style.position = "absolute"; classifierLargeImageDiv.appendChild(formOverlayContainerDiv); formOverlayContainerDiv.style.backgroundColor = 'white'; formRowFirstRowOffsetTop = "8px"; formRowHeight = "35px"; // with borderBottom 1px = 36px formRowTotalTop = "19px"; formPositionTop = "429px"; formPositionLeft = "860px"; // firstYearPositionLeft = "235px"; formPositionLeftByYear = []; formPositionLeftByYear.push("235px"); //0 formPositionLeftByYear.push("296px"); //1 formPositionLeftByYear.push("353px"); //2 formPositionLeftByYear.push("412px");//3 formPositionLeftByYear.push("470px");//4 formPositionLeftByYear.push("529px");//5 formPositionLeftByYear.push("587px");//6 formPositionLeftByYear.push("646px");//7 formPositionLeftByYear.push("704px");//8 formPositionLeftByYear.push("763px");//9 formOverlayContainerDiv.style.top = formPositionTop; formOverlayContainerDiv.style.left = formPositionLeft; // draggable header headerDiv = document.createElement('DIV'); headerDiv.id = 'greasemonkey-zooniverse-rainfall-rescue-form-drag_overlay_form'; headerContents = document.createTextNode('click here to drag this form'); headerDiv.appendChild(headerContents); headerDiv.style.backgroundColor = "#2196F3"; headerDiv.style.color = "#FFFFFF"; headerDiv.title = "Align bottom of this header to bottom line of row containing years"; // header table headerTable = document.createElement('TABLE'); formOverlayContainerDiv.appendChild(headerTable); headerTableTbody = document.createElement('TBODY'); headerTable.appendChild(headerTableTbody); headerTR = document.createElement('TR'); headerTR.style.margin = "0px"; headerTR.style.padding = "0px"; headerTableTbody.appendChild(headerTR); headerTD = document.createElement('TD'); headerTD.style.margin = "0px"; headerTD.style.padding = "0px"; headerTD.style.width = "100%"; headerTR.appendChild(headerTD); headerTD.appendChild(headerDiv); minusButton = document.createElement('DIV'); minusButton.id = 'greasemonkey-zooniverse-rainfall-rescue-form-minus_button'; minusButton.style.backgroundColor = "red"; minusButton.style.width = "30px"; minusButton.style.height = "30px"; minusButton.title = "Decrease height of input form rows"; headerTD = document.createElement('TD'); headerTD.style.margin = "0px"; headerTD.style.padding = "0px"; headerTR.appendChild(headerTD); headerTD.appendChild(minusButton); buttonContents = document.createTextNode('-'); minusButton.appendChild(buttonContents); pixelsDisplay = document.createElement('DIV'); pixelsDisplay.id = 'greasemonkey-zooniverse-rainfall-rescue-form-pixels_display'; headerTD = document.createElement('TD'); headerTD.style.margin = "0px"; headerTD.style.padding = "0px"; headerTR.appendChild(headerTD); headerTD.appendChild(pixelsDisplay); buttonContents = document.createTextNode(formRowHeight); pixelsDisplay.appendChild(buttonContents); pixelsDisplay.title = "Row has this height + 1px bottom border"; plusButton = document.createElement('DIV'); plusButton.id = 'greasemonkey-zooniverse-rainfall-rescue-form-plus_button'; plusButton.style.backgroundColor = "green"; plusButton.style.width = "30px"; plusButton.style.height = "30px"; plusButton.title = "Increase height of input form rows"; headerTD = document.createElement('TD'); headerTD.style.margin = "0px"; headerTD.style.padding = "0px"; headerTR.appendChild(headerTD); headerTD.appendChild(plusButton); buttonContents = document.createTextNode('+'); plusButton.appendChild(buttonContents); formOverlayContainerDiv.style.margin = "0px"; formOverlayContainerDiv.style.padding = "0px"; formTable = document.createElement('TABLE'); formOverlayContainerDiv.appendChild(formTable); formTableTbody = document.createElement('TBODY'); formTable.appendChild(formTableTbody); formTable.id = 'greasemonkey-zooniverse-rainfall-rescue-form-form_table'; yearFound = false; year = false; for (i = 0; i < workflowTaskElements.length; i++) { if (i == 0) { formSpacerRow = document.createElement('TR'); formSpacerRow.style.height = formRowFirstRowOffsetTop; formTableTdI = document.createElement('TD'); formTableTdL = document.createElement('TD'); formSpacerRow.appendChild(formTableTdI); formSpacerRow.appendChild(formTableTdI); formTableTdI.style.height = formRowFirstRowOffsetTop; formTableTdL.style.height = formRowFirstRowOffsetTop; formTableTdI.style.margin = "0px"; formTableTdI.style.padding = "0px"; formTableTdL.style.margin = "0px"; formTableTdL.style.padding = "0px"; formTableTbody.appendChild(formSpacerRow); } if (i == 12) { formSpacerRow = document.createElement('TR'); formSpacerRow.style.height = formRowTotalTop; formTableTdI = document.createElement('TD'); formTableTdL = document.createElement('TD'); formSpacerRow.appendChild(formTableTdI); formSpacerRow.appendChild(formTableTdL); formTableTdI.style.height = formRowTotalTop; formTableTdL.style.height = formRowTotalTop; formTableTdI.style.margin = "0px"; formTableTdI.style.padding = "0px"; formTableTdL.style.margin = "0px"; formTableTdL.style.padding = "0px"; formTableTbody.appendChild(formSpacerRow); } formRow = document.createElement('TR'); formTableTbody.appendChild(formRow); formRow.style.height = formRowHeight; formRow.className = 'greasemonkey-zooniverse-rainfall-rescue-form-form_table_row'; formInput = workflowTaskElements[i].getElementsByTagName('label')[0]; formLabelDiv = false; workflowTaskElementDivs = workflowTaskElements[i].getElementsByTagName('div'); for (j = 0; j < workflowTaskElementDivs.length; j++) { if ((' ' + workflowTaskElementDivs[j].className + ' ').indexOf(' markdown ') > -1) { if ((' ' + workflowTaskElementDivs[j].className + ' ').indexOf(' question ') > -1) { formLabelDiv =workflowTaskElementDivs[j]; break; } } } if (formLabelDiv.getElementsByTagName('p').length > 1) { k = formLabelDiv.getElementsByTagName('p').length; k--; formLabel = formLabelDiv.getElementsByTagName('p')[k]; } else { formLabel = formLabelDiv.getElementsByTagName('p')[0]; } if (!yearFound) { formLabelStrong = formLabel.getElementsByTagName('strong')[0]; year = formLabelStrong.innerHTML.split(' '); for (j = 0; j < year.length; j++) { yearNumber = parseInt(year[j]); if (yearNumber>1000 && yearNumber<2021) { yearFound = true; break; } } } formLabel.style.margin = "0px"; formInput.getElementsByTagName('textarea')[0].style.padding = "0px"; formTableTdI = document.createElement('TD'); formTableTdI.appendChild(formInput); formRow.appendChild(formTableTdI); formLabelBox = document.createElement('DIV'); formLabelBox.appendChild(formLabel); formTableTdL = document.createElement('TD'); formTableTdL.appendChild(formLabelBox); formRow.appendChild(formTableTdL); // formTableTdL.style.height = formRowHeight; // formTableTdI.style.height = formRowHeight; formTableTdI.style.margin = "0px"; formTableTdI.style.padding = "0px"; formTableTdL.style.margin = "0px"; formTableTdL.style.padding = "0px"; formTableTdL.style.borderBottom = "1px solid"; formTableTdI.style.borderBottom = "1px solid"; formTableTdL.style.borderBottomColor = "#000000"; formTableTdI.style.borderBottomColor = "#000000"; } if (yearFound) { // take last digit from year yearText = year.toString(); lastDigit = yearText[yearText.length -1]; lastDigitNumber = parseInt(lastDigit); newFormPositionLeft = formPositionLeftByYear[lastDigitNumber]; formOverlayContainerDiv.style.left = newFormPositionLeft; // alert('yearFound:'+yearText+' lastDigit:'+lastDigit+' lastDigitNumber:'+lastDigitNumber+' newFormPositionLeft:'+newFormPositionLeft); } // insert js in element parentDiv headerElement = parentDiv.getElementsByTagName('header')[0]; ScriptTag = document.createElement('SCRIPT'); ScriptTag.type = "text/javascript"; ScriptTagContents = document.createTextNode(scriptValue); ScriptTag.appendChild(ScriptTagContents); parentDiv.insertBefore(ScriptTag, headerElement); scriptAddedDiv = document.createElement('DIV'); scriptAddedDiv.id = scriptAddedDivId; parentDiv.insertBefore(scriptAddedDiv, headerElement); // ZooniverseRainfallRescueFormAlignDecreaseSize should be referenced only after script from scriptValue is injected in page minusButton.onclick = function(){ ZooniverseRainfallRescueFormAlignDecreaseSize(); }; // ZooniverseRainfallRescueFormAlignIncreaseSize should be referenced only after script from scriptValue is injected in page plusButton.onclick = function(){ ZooniverseRainfallRescueFormAlignIncreaseSize(); }; // control checksum formRow = document.createElement('TR'); formTableTbody.appendChild(formRow); formTableTdCalculated = document.createElement('TD'); formTableTdCalculated.title = "Total calculated"; formRow.appendChild(formTableTdCalculated); formRow.className = "greasemonkey-zooniverse-rainfall-rescue-form-control_checksum"; formTableTdCalculatedPlaceholder = document.createElement('SPAN'); formTableTdCalculatedPlaceholder.innerHTML = ' '; formTableTdCalculated.appendChild(formTableTdCalculatedPlaceholder); formTableTdIsDiffer = document.createElement('TD'); formRow.appendChild(formTableTdIsDiffer); formTableTdIsDiffer.title = "Difference: total calculated - total inscribed"; formTableRows = formTable.getElementsByTagName('tr'); for (i = 0; i < formTableRows.length; i++) { if ((' ' + formTableRows[i].className + ' ').indexOf(' greasemonkey-zooniverse-rainfall-rescue-form-form_table_row ') > -1) { inputTextarea = formTableRows[i].getElementsByTagName('textarea')[0]; if (inputTextarea.addEventListener) { inputTextarea.addEventListener("input", ZooniverseRainfallRescueFormAlignChecksum); } else if (inputTextarea.attachEvent) { inputTextarea.attachEvent("oninput", ZooniverseRainfallRescueFormAlignChecksum); } } } // move buttons ("done") for (i = 0; i < taskContainerParentButtons.length; i++) { innerSpan = taskContainerParentButtons[i].getElementsByTagName('span')[0]; if (innerSpan.innerHTML.trim().toLowerCase() == 'done') { if (taskContainerParentButtons[i].addEventListener) { taskContainerParentButtons[i].addEventListener("click", ZooniverseRainfallRescueFormAlignReloadFormWaiter); } else if (taskContainerParentButtons[i].attachEvent) { taskContainerParentButtons[i].attachEvent("onclick", ZooniverseRainfallRescueFormAlignReloadFormWaiter); } break; } } classifierLargeImageDivNavs = classifierLargeImageDiv.getElementsByTagName('nav'); for (i = 0; i < classifierLargeImageDivNavs.length; i++) { if ((' ' + classifierLargeImageDivNavs[i].className + ' ').indexOf(' task-nav ') > -1) { formRow = document.createElement('TR'); formTableTbody.appendChild(formRow); formTableTd = document.createElement('TD'); formRow.appendChild(formTableTd); formTableTd.colspan = "2"; formRow.className = "greasemonkey-zooniverse-rainfall-rescue-form-task_nav"; formTableTd.appendChild(classifierLargeImageDivNavs[i]); break; } } }, 300, setIntervalIdBox, scriptValue); setIntervalIdBox.push(setIntervalId);