scratch – Diff between revs 96 and 115

Subversion Repositories:
Rev:
Only display areas with differencesIgnore whitespace
Rev 96 Rev 115
1 <!DOCTYPE html> 1 <!DOCTYPE html>
2 <html lang="en"> 2 <html lang="en">
3 <head> 3 <head>
4 <meta charset="utf-8"> 4 <meta charset="utf-8">
5 <meta http-equiv="X-UA-Compatible" content="IE=edge"> 5 <meta http-equiv="X-UA-Compatible" content="IE=edge">
6 <meta name="viewport" content="width=device-width, initial-scale=1"> 6 <meta name="viewport" content="width=device-width, initial-scale=1">
7 <!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags --> 7 <!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags -->
8 <meta name="description" content="quick asset upload"> 8 <meta name="description" content="quick asset upload">
9 <meta name="author" content="Wizardry and Steamworks"> 9 <meta name="author" content="Wizardry and Steamworks">
10 <link rel="icon" href="favicon.ico"> 10 <link rel="icon" href="favicon.ico">
11   11  
12 <title>scratch</title> 12 <title>scratch</title>
13 13
14 <!-- Bootstrap core CSS --> 14 <!-- Bootstrap core CSS -->
15 <link href="bower_components/bootstrap/dist/css/bootstrap.min.css" rel="stylesheet"> 15 <link href="bower_components/bootstrap/dist/css/bootstrap.min.css" rel="stylesheet">
16 <!-- Font Awesome --> 16 <!-- Font Awesome -->
17 <link href="bower_components/font-awesome/css/font-awesome.min.css" rel="stylesheet"> 17 <link href="bower_components/font-awesome/css/font-awesome.min.css" rel="stylesheet">
18 18
19 <!-- DropZone --> 19 <!-- DropZone -->
20 <link href="bower_components/dropzone/dist/min/dropzone.min.css" rel="stylesheet"> 20 <link href="bower_components/dropzone/dist/min/dropzone.min.css" rel="stylesheet">
21 21
22 <!-- Site-wide style CCS --> 22 <!-- Site-wide style CCS -->
23 <link href="css/style.css" rel="stylesheet"> 23 <link href="css/style.css" rel="stylesheet">
24 24
25 <!-- Local style --> 25 <!-- Local style -->
26 <link href="css/files/style.css" rel="stylesheet"> 26 <link href="css/files/style.css" rel="stylesheet">
27 </head> 27 </head>
28   28  
29 <body> 29 <body>
30   30  
31 <!-- Main component for a primary marketing message or call to action --> 31 <!-- Main component for a primary marketing message or call to action -->
32 <div class="paralax-background"></div> 32 <div class="paralax-background"></div>
33 <div class="jumbotron"> 33 <div class="jumbotron">
34 <h1>scratch copy</h1> 34 <h1>scratch copy</h1>
35 <p class="quote">the asset sharer</p> 35 <p class="quote">the asset sharer</p>
36 </div> 36 </div>
37   37  
38 <div class="container"> 38 <div class="container">
39 39
40 <ul class="nav nav-tabs"> 40 <ul class="nav nav-tabs">
41 <li><a href="index.html">Home</a></li> 41 <li><a href="index.html">Home</a></li>
42 <li class="active"><a href="#">File</a></li> 42 <li class="active"><a href="#">File</a></li>
43 <li><a href="text.html">Text</a></li> 43 <li><a href="text.html">Text</a></li>
44 <li><a href="draw.html">Draw</a></li> 44 <li><a href="draw.html">Draw</a></li>
45 <li><a href="link.html">Link</a></li> 45 <li><a href="link.html">Link</a></li>
-   46 <li><a href="gallery.html">Gallery</a></li>
46 </ul> 47 </ul>
47 48
48 <div id="main-panel" class="panel panel-default"> 49 <div id="main-panel" class="panel panel-default">
49 <div class="panel-heading"> 50 <div class="panel-heading">
50 <div id="actions" class="row"> 51 <div id="actions" class="row">
51 <div class="col-lg-5"> 52 <div class="col-lg-5">
52 <div class="btn-group btn-group-justified" role="group"> 53 <div class="btn-group btn-group-justified" role="group">
53 <!-- The fileinput-button span is used to style the file input field as button --> 54 <!-- The fileinput-button span is used to style the file input field as button -->
54 <div class="btn-group" role="group"> 55 <div class="btn-group" role="group">
55 <button id="uploadbutton" type="button" class="btn btn-default"> 56 <button id="uploadbutton" type="button" class="btn btn-default">
56 <i class="glyphicon glyphicon-plus"></i> 57 <i class="glyphicon glyphicon-plus"></i>
57 <span>Add...</span> 58 <span>Add...</span>
58 </button> 59 </button>
59 </div> 60 </div>
60 <div class="btn-group" role="group"> 61 <div class="btn-group" role="group">
61 <button type="submit" class="btn btn-default start"> 62 <button type="submit" class="btn btn-default start">
62 <i class="glyphicon glyphicon-upload"></i> 63 <i class="glyphicon glyphicon-upload"></i>
63 <span>Upload All</span> 64 <span>Upload All</span>
64 </button> 65 </button>
65 </div> 66 </div>
66 <div class="btn-group" role="group"> 67 <div class="btn-group" role="group">
67 <button type="reset" class="btn btn-danger cancel"> 68 <button type="reset" class="btn btn-danger cancel">
68 <i class="glyphicon glyphicon-ban-circle"></i> 69 <i class="glyphicon glyphicon-ban-circle"></i>
69 <span>Cancel All</span> 70 <span>Cancel All</span>
70 </button> 71 </button>
71 </div> 72 </div>
72 </div> 73 </div>
73 </div> 74 </div>
74 </div> 75 </div>
75 </div> 76 </div>
76 <div class="panel-body" id="uploadpanel"> 77 <div class="panel-body" id="uploadpanel">
77 <div class="table table-striped files" id="previews"> 78 <div class="table table-striped files" id="previews">
78 <div id="template" class="file-row"> 79 <div id="template" class="file-row">
79 <!-- This is used as the file preview template --> 80 <!-- This is used as the file preview template -->
80 <div> 81 <div>
81 <span class="preview"><img src="img/fileholder.svg" width="58" alt="Upload file thumbnail" data-dz-thumbnail></span> 82 <span class="preview"><img src="img/fileholder.svg" width="58" alt="Upload file thumbnail" data-dz-thumbnail></span>
82 </div> 83 </div>
83 <div> 84 <div>
84 <p id="name" class="name" data-dz-name></p> 85 <p id="name" class="name" data-dz-name></p>
85 <div class="input-group"> 86 <div class="input-group">
86 <input id="URL" type="text" class="form-control" readonly> 87 <input id="URL" type="text" class="form-control" readonly>
87 <span class="input-group-btn"> 88 <span class="input-group-btn">
88 <button id="btn-mailto" class="btn btn-default" type="button"><i class="glyphicon glyphicon-envelope"></i></button> 89 <button id="btn-mailto" class="btn btn-default" type="button"><i class="glyphicon glyphicon-envelope"></i></button>
89 </span> 90 </span>
90 <span class="input-group-btn"> 91 <span class="input-group-btn">
91 <button id="btn-facebook" class="btn btn-default" type="button" disabled><i class="fa fa-facebook"></i></button> 92 <button id="btn-facebook" class="btn btn-default" type="button" disabled><i class="fa fa-facebook"></i></button>
92 </span> 93 </span>
93 <span class="input-group-btn"> 94 <span class="input-group-btn">
94 <button id="btn-clipboard" class="btn btn-default" type="button"><i class="glyphicon glyphicon-paperclip"></i></button> 95 <button id="btn-clipboard" class="btn btn-default" type="button"><i class="glyphicon glyphicon-paperclip"></i></button>
95 </span> 96 </span>
96 </div> 97 </div>
97 <div class="input-group"> 98 <div class="input-group">
98 <input id="deleteURL" type="text" class="form-control" readonly> 99 <input id="deleteURL" type="text" class="form-control" readonly>
99 <span class="input-group-btn"> 100 <span class="input-group-btn">
100 <button id="btn-clipboard-delete" class="btn btn-default" type="button"><i class="glyphicon glyphicon-paperclip"></i></button> 101 <button id="btn-clipboard-delete" class="btn btn-default" type="button"><i class="glyphicon glyphicon-paperclip"></i></button>
101 </span> 102 </span>
102 </div> 103 </div>
103 <strong class="error text-danger" data-dz-errormessage></strong> 104 <strong class="error text-danger" data-dz-errormessage></strong>
104 </div> 105 </div>
105 <div> 106 <div>
106 <p class="size" data-dz-size></p> 107 <p class="size" data-dz-size></p>
107 <div id="progress" class="progress active" role="progressbar"> 108 <div id="progress" class="progress active" role="progressbar">
108 <div class="progress-bar progress-bar-custom" style="width:0%;" aria-valuemin="0" aria-valuemax="100" aria-valuenow="0" data-dz-uploadprogress></div> 109 <div class="progress-bar progress-bar-custom" style="width:0%;" aria-valuemin="0" aria-valuemax="100" aria-valuenow="0" data-dz-uploadprogress></div>
109 </div> 110 </div>
110 </div> 111 </div>
111 <div> 112 <div>
112 <button id="start" class="btn btn-default start"> 113 <button id="start" class="btn btn-default start">
113 <i class="glyphicon glyphicon-upload"></i> 114 <i class="glyphicon glyphicon-upload"></i>
114 <span>Upload</span> 115 <span>Upload</span>
115 </button> 116 </button>
116 <button id="cancel" data-dz-remove class="btn btn-warning cancel"> 117 <button id="cancel" data-dz-remove class="btn btn-warning cancel">
117 <i class="glyphicon glyphicon-ban-circle"></i> 118 <i class="glyphicon glyphicon-ban-circle"></i>
118 <span>Cancel</span> 119 <span>Cancel</span>
119 </button> 120 </button>
120 <button id="remove" data-dz-remove class="btn btn-danger remove"> 121 <button id="remove" data-dz-remove class="btn btn-danger remove">
121 <i class="glyphicon glyphicon-remove"></i> 122 <i class="glyphicon glyphicon-remove"></i>
122 <span>Remove</span> 123 <span>Remove</span>
123 </button> 124 </button>
124 </div> 125 </div>
125 </div> 126 </div>
126   127  
127 </div> 128 </div>
128 </div> 129 </div>
129 <!-- The global file processing state --> 130 <!-- The global file processing state -->
130 <div class="fileupload-process"> 131 <div class="fileupload-process">
131 <div id="total-progress" class="progress active" role="progressbar"> 132 <div id="total-progress" class="progress active" role="progressbar">
132 <div class="progress-bar progress-bar-custom" style="width:0%;" aria-valuemin="0" aria-valuemax="100" aria-valuenow="0" data-dz-uploadprogress></div> 133 <div class="progress-bar progress-bar-custom" style="width:0%;" aria-valuemin="0" aria-valuemax="100" aria-valuenow="0" data-dz-uploadprogress></div>
133 </div> 134 </div>
134 </div> 135 </div>
135 </div> 136 </div>
136   137  
137 </div> <!-- /container --> 138 </div> <!-- /container -->
138 139
139 <div id="footer"> 140 <div id="footer">
140 <div class="container"> 141 <div class="container">
141 <p class="text-muted credit text-center">Copyright <i class="glyphicon glyphicon-copyright-mark"></i> 2017 <a href="http://grimore.org">Wizardry and Steamworks</a>.</p> 142 <p class="text-muted credit text-center">Copyright <i class="glyphicon glyphicon-copyright-mark"></i> 2017 <a href="http://grimore.org">Wizardry and Steamworks</a>.</p>
142 </div> 143 </div>
143 </div> 144 </div>
144   145  
145 <!-- jQuery --> 146 <!-- jQuery -->
146 <script src="bower_components/jquery/dist/jquery.min.js"></script> 147 <script src="bower_components/jquery/dist/jquery.min.js"></script>
147 <!-- BootStrap --> 148 <!-- BootStrap -->
148 <script src="bower_components/bootstrap/dist/js/bootstrap.min.js"></script> 149 <script src="bower_components/bootstrap/dist/js/bootstrap.min.js"></script>
149 <!-- DropZone --> 150 <!-- DropZone -->
150 <script src="bower_components/dropzone/dist/min/dropzone.min.js"></script> 151 <script src="bower_components/dropzone/dist/min/dropzone.min.js"></script>
151 <!-- Clipboard --> 152 <!-- Clipboard -->
152 <script src="bower_components/clipboard/dist/clipboard.min.js"></script> 153 <script src="bower_components/clipboard/dist/clipboard.min.js"></script>
153 <script> 154 <script>
154 $(document).ready(() => { 155 $(document).ready(() => {
155 $.get('session.php').then((token) => { 156 $.get('session.php').then((token) => {
156 // Get the template HTML and remove it from the doument 157 // Get the template HTML and remove it from the doument
157 var previewNode = document 158 var previewNode = document
158 .querySelector("#template"); 159 .querySelector("#template");
159 previewNode.id = ""; 160 previewNode.id = "";
160 var previewTemplate = previewNode 161 var previewTemplate = previewNode
161 .parentNode 162 .parentNode
162 .innerHTML; 163 .innerHTML;
163 previewNode 164 previewNode
164 .parentNode 165 .parentNode
165 .removeChild(previewNode); 166 .removeChild(previewNode);
166 167
167 var myDropzone = new Dropzone('.panel-body', { // Make the whole body a dropzone 168 var myDropzone = new Dropzone('.panel-body', { // Make the whole body a dropzone
168 url: 'file.php', // Set the url 169 url: 'file.php', // Set the url
169 paramName: 'file', 170 paramName: 'file',
170 thumbnailWidth: 80, 171 thumbnailWidth: 80,
171 thumbnailHeight: 80, 172 thumbnailHeight: 80,
172 //parallelUploads: 20, 173 //parallelUploads: 20,
173 previewTemplate: previewTemplate, 174 previewTemplate: previewTemplate,
174 autoQueue: false, // Make sure the files aren't queued until manually added 175 autoQueue: false, // Make sure the files aren't queued until manually added
175 previewsContainer: '#previews', // Container to display the previews 176 previewsContainer: '#previews', // Container to display the previews
176 clickable: [ 177 clickable: [
177 '#uploadbutton', 178 '#uploadbutton',
178 '#uploadpanel' 179 '#uploadpanel'
179 ], 180 ],
180 //clickable: "#uploadbutton" // Element that should be used as click trigger to select files. 181 //clickable: "#uploadbutton" // Element that should be used as click trigger to select files.
181 }).on('sending', (file, xhr, formData) => { 182 }).on('sending', (file, xhr, formData) => {
182 // Append session token. 183 // Append session token.
183 formData.append('token', token); 184 formData.append('token', token);
184 }).on('addedfile', (file) => { 185 }).on('addedfile', (file) => {
185 // Hookup the start button 186 // Hookup the start button
186 file.previewElement.querySelector(".start").onclick = () => { 187 file.previewElement.querySelector(".start").onclick = () => {
187 myDropzone.enqueueFile(file); 188 myDropzone.enqueueFile(file);
188 }; 189 };
189 }).on('totaluploadprogress', (progress) => { 190 }).on('totaluploadprogress', (progress) => {
190 document 191 document
191 .querySelector('#total-progress .progress-bar') 192 .querySelector('#total-progress .progress-bar')
192 .style 193 .style
193 .width = progress + "%"; 194 .width = progress + "%";
194 }).on('sending', (file) => { 195 }).on('sending', (file) => {
195 // Show the total progress bar when upload starts 196 // Show the total progress bar when upload starts
196 document.querySelector("#total-progress") 197 document.querySelector("#total-progress")
197 .style 198 .style
198 .opacity = 1; 199 .opacity = 1;
199 200
200 // And disable the start button. 201 // And disable the start button.
201 file 202 file
202 .previewElement 203 .previewElement
203 .querySelector(".start") 204 .querySelector(".start")
204 .setAttribute("disabled", "disabled"); 205 .setAttribute("disabled", "disabled");
205 }).on('queuecomplete', (progress) => { 206 }).on('queuecomplete', (progress) => {
206 document.querySelector("#total-progress") 207 document.querySelector("#total-progress")
207 .style 208 .style
208 .opacity = "0"; 209 .opacity = "0";
209 }).on('success', (file, data) => { 210 }).on('success', (file, data) => {
210 // Serialize JSON to object. 211 // Serialize JSON to object.
211 data = JSON.parse(data); 212 data = JSON.parse(data);
212 213
213 // Set the ID of the URL box. 214 // Set the ID of the URL box.
214 const boxURLID = '_' + Math 215 const boxURLID = '_' + Math
215 .random() 216 .random()
216 .toString(36) 217 .toString(36)
217 .substr(2, 9); 218 .substr(2, 9);
218 file 219 file
219 .previewElement 220 .previewElement
220 .querySelector("#URL") 221 .querySelector("#URL")
221 .value = location.protocol 222 .value = location.protocol
222 .concat("//") 223 .concat("//")
223 .concat(window.location.hostname) 224 .concat(window.location.hostname)
224 .concat("/") 225 .concat("/")
225 .concat(data.hash); 226 .concat(data.hash);
226 227
227 file 228 file
228 .previewElement 229 .previewElement
229 .querySelector("#URL") 230 .querySelector("#URL")
230 .setAttribute('id', boxURLID) 231 .setAttribute('id', boxURLID)
231   232  
232 // Set the ID of the delete URL box. 233 // Set the ID of the delete URL box.
233 const deleteBoxURLID = '_' + Math 234 const deleteBoxURLID = '_' + Math
234 .random() 235 .random()
235 .toString(36) 236 .toString(36)
236 .substr(2, 9); 237 .substr(2, 9);
237 file 238 file
238 .previewElement 239 .previewElement
239 .querySelector("#deleteURL") 240 .querySelector("#deleteURL")
240 .value = location.protocol.concat("//") 241 .value = location.protocol.concat("//")
241 .concat(window.location.hostname) 242 .concat(window.location.hostname)
242 .concat("/") 243 .concat("/")
243 .concat(data.timestamp) 244 .concat(data.timestamp)
244 .concat("/") 245 .concat("/")
245 .concat(data.hash); 246 .concat(data.hash);
246 247
247 file 248 file
248 .previewElement 249 .previewElement
249 .querySelector("#deleteURL") 250 .querySelector("#deleteURL")
250 .setAttribute('id', deleteBoxURLID) 251 .setAttribute('id', deleteBoxURLID)
251 252
252 // Set the ID of the URL clipboard button. 253 // Set the ID of the URL clipboard button.
253 const clipButtonID = '_' + Math 254 const clipButtonID = '_' + Math
254 .random() 255 .random()
255 .toString(36) 256 .toString(36)
256 .substr(2, 9); 257 .substr(2, 9);
257 file 258 file
258 .previewElement 259 .previewElement
259 .querySelector("#btn-clipboard") 260 .querySelector("#btn-clipboard")
260 .setAttribute('data-clipboard-target', '#' + boxURLID) 261 .setAttribute('data-clipboard-target', '#' + boxURLID)
261 262
262 file 263 file
263 .previewElement 264 .previewElement
264 .querySelector("#btn-clipboard") 265 .querySelector("#btn-clipboard")
265 .setAttribute('id', clipButtonID); 266 .setAttribute('id', clipButtonID);
266 267
267 new Clipboard('#' + clipButtonID); 268 new Clipboard('#' + clipButtonID);
268 269
269 // Set the ID of the delete URL clipboard button. 270 // Set the ID of the delete URL clipboard button.
270 const clipButtonDeleteID = '_' + Math 271 const clipButtonDeleteID = '_' + Math
271 .random() 272 .random()
272 .toString(36) 273 .toString(36)
273 .substr(2, 9); 274 .substr(2, 9);
274 file 275 file
275 .previewElement 276 .previewElement
276 .querySelector("#btn-clipboard-delete") 277 .querySelector("#btn-clipboard-delete")
277 .setAttribute('data-clipboard-target', '#' + deleteBoxURLID) 278 .setAttribute('data-clipboard-target', '#' + deleteBoxURLID)
278 279
279 file 280 file
280 .previewElement 281 .previewElement
281 .querySelector("#btn-clipboard-delete") 282 .querySelector("#btn-clipboard-delete")
282 .setAttribute('id', clipButtonDeleteID); 283 .setAttribute('id', clipButtonDeleteID);
283 284
284 new Clipboard('#' + clipButtonDeleteID); 285 new Clipboard('#' + clipButtonDeleteID);
285 286
286 // Set the ID of the mailto button. 287 // Set the ID of the mailto button.
287 const mailToButtonID = '_' + Math 288 const mailToButtonID = '_' + Math
288 .random() 289 .random()
289 .toString(36) 290 .toString(36)
290 .substr(2, 9); 291 .substr(2, 9);
291 292
292 file 293 file
293 .previewElement 294 .previewElement
294 .querySelector("#btn-mailto") 295 .querySelector("#btn-mailto")
295 .setAttribute('id', mailToButtonID); 296 .setAttribute('id', mailToButtonID);
296   297  
297 file 298 file
298 .previewElement 299 .previewElement
299 .querySelector(".start") 300 .querySelector(".start")
300 .setAttribute("disabled", "disabled"); 301 .setAttribute("disabled", "disabled");
301 file 302 file
302 .previewElement 303 .previewElement
303 .querySelector(".cancel") 304 .querySelector(".cancel")
304 .setAttribute("disabled", "disabled"); 305 .setAttribute("disabled", "disabled");
305 306
306 $('#' + mailToButtonID).on('click', () => { 307 $('#' + mailToButtonID).on('click', () => {
307 window.location.href = "mailto:?subject="+ 308 window.location.href = "mailto:?subject="+
308 encodeURIComponent("Can't scratch this!") + "&body=" + 309 encodeURIComponent("Can't scratch this!") + "&body=" +
309 encodeURIComponent($('#' + boxURLID).val()); 310 encodeURIComponent($('#' + boxURLID).val());
310 }); 311 });
311 312
312 // Set the ID of the facebook button. 313 // Set the ID of the facebook button.
313 const faceBookButtonID = '_' + Math 314 const faceBookButtonID = '_' + Math
314 .random() 315 .random()
315 .toString(36) 316 .toString(36)
316 .substr(2, 9); 317 .substr(2, 9);
317   318  
318 file 319 file
319 .previewElement 320 .previewElement
320 .querySelector("#btn-facebook") 321 .querySelector("#btn-facebook")
321 .setAttribute('id', faceBookButtonID); 322 .setAttribute('id', faceBookButtonID);
322 323
323 switch(data.opengraph) { 324 switch(data.opengraph) {
324 case true: 325 case true:
325 // Enable the facebook button. 326 // Enable the facebook button.
326 file 327 file
327 .previewElement 328 .previewElement
328 .querySelector('#' + faceBookButtonID) 329 .querySelector('#' + faceBookButtonID)
329 .removeAttribute("disabled"); 330 .removeAttribute("disabled");
330 331
331 // Change the URL when the user clicks the button. 332 // Change the URL when the user clicks the button.
332 $('#' + faceBookButtonID).on('click', () => { 333 $('#' + faceBookButtonID).on('click', () => {
333 $('#' + boxURLID) 334 $('#' + boxURLID)
334 .val( 335 .val(
335 location.protocol.concat("//") 336 location.protocol.concat("//")
336 .concat(window.location.hostname) 337 .concat(window.location.hostname)
337 .concat("/") 338 .concat("/")
338 .concat("og") 339 .concat("og")
339 .concat("/") 340 .concat("/")
340 .concat(data.hash) 341 .concat(data.hash)
341 ); 342 );
342 }); 343 });
343 break; 344 break;
344 default: 345 default:
345 // Disable the facebook button. 346 // Disable the facebook button.
346 file 347 file
347 .previewElement 348 .previewElement
348 .querySelector('#' + faceBookButtonID) 349 .querySelector('#' + faceBookButtonID)
349 .setAttribute("disabled", "disabled"); 350 .setAttribute("disabled", "disabled");
350 break; 351 break;
351 } 352 }
352 }); 353 });
353 354
354 document.querySelector("#actions .start").onclick = () => { 355 document.querySelector("#actions .start").onclick = () => {
355 myDropzone.enqueueFiles( 356 myDropzone.enqueueFiles(
356 myDropzone 357 myDropzone
357 .getFilesWithStatus(Dropzone.ADDED)); 358 .getFilesWithStatus(Dropzone.ADDED));
358 }; 359 };
359 360
360 document.querySelector("#actions .cancel").onclick = () => { 361 document.querySelector("#actions .cancel").onclick = () => {
361 myDropzone.removeAllFiles(true); 362 myDropzone.removeAllFiles(true);
362 }; 363 };
363 }); 364 });
364 365
365 // Scroll to the panel. 366 // Scroll to the panel.
366 $('html, body').animate({ 367 $('html, body').animate({
367 scrollTop: $('#main-panel').offset().top 368 scrollTop: $('#main-panel').offset().top
368 }, 'slow'); 369 }, 'slow');
369 }); 370 });
370 </script> 371 </script>
371 <!-- Jumbotron parallax effect --> 372 <!-- Jumbotron parallax effect -->
372 <script> 373 <script>
373 const jumboHeight = $('.jumbotron').outerHeight(); 374 const jumboHeight = $('.jumbotron').outerHeight();
374 function parallax(){ 375 function parallax(){
375 var scrolled = $(window).scrollTop(); 376 var scrolled = $(window).scrollTop();
376 $('.paralax-background').css('height', (jumboHeight-scrolled) + 'px'); 377 $('.paralax-background').css('height', (jumboHeight-scrolled) + 'px');
377 } 378 }
378   379  
379 $(window).scroll(function(e){ 380 $(window).scroll(function(e){
380 parallax(); 381 parallax();
381 }); 382 });
382 </script> 383 </script>
383 </body> 384 </body>
384 </html> 385 </html>
385   386