@@ -12,10 +12,13 @@ const outputDiv = document.getElementById('output');
1212const hintLabel = document . getElementById ( 'hint' ) ;
1313const encodeButton = document . getElementById ( 'encodeButton' ) ;
1414const decodeButton = document . getElementById ( 'decodeButton' ) ;
15- const downloadBtnContainer = document . getElementById ( 'downloadBtnContainer' ) ;
1615const downloadBtn = document . getElementById ( 'downloadBtn' ) ;
1716const errorDiv = document . getElementById ( 'error' ) ;
1817const imTypeSelect = document . getElementById ( 'imTypeSelect' ) ;
18+ const downloadBtnContainer = document . getElementById ( 'downloadBtn-container' ) ;
19+ const outputContainer = document . getElementById ( 'output-container' ) ;
20+ const footer = document . getElementById ( 'footer' ) ;
21+
1922const worker = new Worker ( './worker.js' , { type : 'module' } ) ;
2023
2124const urlParams = new URLSearchParams ( window . location . search ) ;
@@ -42,22 +45,32 @@ function checkInput() {
4245}
4346
4447async function showError ( msg ) {
48+ ensureOutput ( ) ;
4549 errorDiv . textContent = msg ;
4650 errorDiv . style . display = 'block' ;
4751 console . error ( msg ) ;
4852}
4953
54+ function ensureOutput ( ) {
55+ outputContainer . style . opacity = '1' ;
56+ footer . style . top = '0' ;
57+ }
58+
5059function resetOutput ( ) {
60+ outputContainer . style . opacity = '0' ;
5161 inputImgDiv . innerHTML = '' ;
5262 outputDiv . innerHTML = '' ;
5363 errorDiv . textContent = '' ;
5464 errorDiv . style . display = 'none' ;
5565 downloadBtnContainer . style . display = 'none' ;
5666 hintLabel . textContent = '' ;
67+ footer . style . top = '-3rem' ;
5768}
5869
5970async function showImage ( imBlob ) {
6071 resetOutput ( ) ;
72+ ensureOutput ( ) ;
73+
6174 hintLabel . textContent = '' ;
6275 const blob = new Blob ( [ imBlob ] , { type : 'image/png' } ) ;
6376 const url = URL . createObjectURL ( blob ) ;
@@ -80,10 +93,13 @@ async function showImage(imBlob) {
8093}
8194
8295async function encode_image ( ) {
83- checkInput ( ) ;
8496 resetOutput ( ) ;
97+ checkInput ( ) ;
98+
8599 const inputBlob = await getInputBlob ( ) ;
86100 hintLabel . textContent = `Encoding...` ;
101+
102+ ensureOutput ( ) ;
87103 worker . postMessage ( {
88104 type : 'encode' ,
89105 buffer : inputBlob ,
@@ -94,10 +110,13 @@ async function encode_image() {
94110}
95111
96112async function decode_image ( ) {
97- checkInput ( ) ;
98113 resetOutput ( ) ;
114+ checkInput ( ) ;
115+
99116 const inputBlob = await getInputBlob ( ) ;
100117 hintLabel . textContent = `Decoding...` ;
118+
119+ ensureOutput ( ) ;
101120 worker . postMessage ( {
102121 type : 'decode' ,
103122 buffer : inputBlob ,
@@ -116,29 +135,34 @@ worker.onmessage = async (event) => {
116135 await showImage ( event . data . buffer ) ;
117136} ;
118137
119- encodeButton . addEventListener ( 'click' , encode_image ) ;
120- decodeButton . addEventListener ( 'click' , decode_image ) ;
121- imTypeSelect . addEventListener ( 'change' , ( ) => {
122- const warningDiv = document . getElementById ( 'warning' ) ;
123- if ( imTypeSelect . value === 'jpeg' ) {
124- warningDiv . style . display = 'block' ;
125- }
126- else {
127- warningDiv . style . display = 'none' ;
128- }
129- } ) ;
130- fileInput . addEventListener ( 'change' , ( ) => {
131- resetOutput ( ) ;
132- hintLabel . textContent += ' (Below is the selected image)' ;
133- const file = fileInput . files [ 0 ] ;
134- if ( file ) {
135- const imgElem = document . createElement ( 'img' ) ;
136- imgElem . src = URL . createObjectURL ( file ) ;
137- imgElem . alt = 'Selected Image' ;
138- inputImgDiv . innerHTML = '' ;
139- inputImgDiv . appendChild ( imgElem ) ;
140- }
141- } ) ;
138+ // Event listeners for inputs
139+ {
140+ encodeButton . addEventListener ( 'click' , encode_image ) ;
141+ decodeButton . addEventListener ( 'click' , decode_image ) ;
142+
143+ imTypeSelect . addEventListener ( 'change' , ( ) => {
144+ if ( imTypeSelect . value === 'jpeg' ) {
145+ encodeButton . disabled = true ;
146+ }
147+ else {
148+ encodeButton . disabled = false ;
149+ }
150+ } ) ;
151+
152+ fileInput . addEventListener ( 'change' , ( ) => {
153+ resetOutput ( ) ;
154+ hintLabel . textContent = '(The selected image)' ;
155+ const file = fileInput . files [ 0 ] ;
156+ if ( file ) {
157+ ensureOutput ( ) ;
158+ const imgElem = document . createElement ( 'img' ) ;
159+ imgElem . src = URL . createObjectURL ( file ) ;
160+ imgElem . alt = 'Selected Image' ;
161+ inputImgDiv . innerHTML = '' ;
162+ inputImgDiv . appendChild ( imgElem ) ;
163+ }
164+ } ) ;
165+ }
142166
143167// handle drag and drop
144168{
@@ -149,26 +173,30 @@ fileInput.addEventListener('change', ()=>{
149173 if ( inDrag ) return ;
150174 dropZone . style . display = 'none' ;
151175 }
176+
152177 window . addEventListener ( 'dragover' , ( event ) => {
153178 event . preventDefault ( ) ;
154179 dropZone . style . display = 'block' ;
155180 inDrag = true ;
156- if ( taskId ) { window . clearTimeout ( taskId ) ; }
181+ if ( taskId ) { window . clearTimeout ( taskId ) ; }
157182 taskId = window . setTimeout ( hideDropZone , 100 ) ;
158183 } ) ;
184+
159185 window . addEventListener ( 'dragmove' , ( event ) => {
160186 event . preventDefault ( ) ;
161187 dropZone . style . display = 'block' ;
162188 inDrag = true ;
163189 if ( taskId ) { window . clearTimeout ( taskId ) ; }
164190 taskId = window . setTimeout ( hideDropZone , 100 ) ;
165191 } ) ;
192+
166193 window . addEventListener ( 'dragleave' , ( event ) => {
167194 event . preventDefault ( ) ;
168195 inDrag = false ;
169196 if ( taskId ) { window . clearTimeout ( taskId ) ; }
170197 taskId = window . setTimeout ( hideDropZone , 100 ) ;
171198 } ) ;
199+
172200 dropZone . addEventListener ( 'drop' , ( event ) => {
173201 event . preventDefault ( ) ;
174202 if ( event . dataTransfer . files . length > 0 ) {
0 commit comments