PageSourceSearch

https://www.luotokuopio.fi/js/custom-v4.js

js luotokuopio.fi collected 2026-10-06 20:15:03 UTC 29,167 bytes, 935 lines download raw bytes

1/* custom.js for Devkit */
2$(function () {
3  $(".misa").css({'display': 'none', 'visibility': 'hidden'});
4  /*$('.mobile-icon').click(function () {
5   $('nav ul').toggleClass("showing");
6   });*/
7});
8
9
10
11
12
13function toggle_submenu(div_id, div_class) {
14  
15  
16    /* Valikon korkeus vaihtelee, joten lasketaan */
17    var headerHeight = document.getElementById("header").offsetHeight;
18  
19    var submenuelems = document.getElementsByClassName('submenu');
20
21    for(var i = 0; i < submenuelems.length; i++) {
22
23      if (submenuelems[i].id == div_id) {
24          if( submenuelems[i].classList.contains(div_class) ){
25              submenuelems[i].classList.remove(div_class);
26              submenuelems[i].parentNode.classList.remove(div_class);
27          } else {
28              submenuelems[i].classList.add(div_class);
29              submenuelems[i].parentNode.classList.add(div_class);
30              
31                if (window.innerWidth > 1299) {
32                    submenuelems[i].style.top = headerHeight + 'px';
33                } else {
34                    submenuelems[i].removeAttribute('style');
35                }
36          }
37      } else {
38          if( submenuelems[i].classList.contains(div_class) ){
39            submenuelems[i].classList.remove(div_class);
40            submenuelems[i].parentNode.classList.remove(div_class);
41          }
42      }
43    
44  }
45}
46
47//var lastScrollTop = 0;
48
49$(window).scroll(function() {
50    if ($(this).scrollTop() > 50){  
51	$('header').addClass("scroll");
52	$('#main-menu').addClass("scroll");
53        
54        //$('#brandlogo').attr("src","images/xxx.png");
55	
56    }
57    else {
58        $('header').removeClass("scroll");
59        $('#main-menu').removeClass("scroll");
60
61        //$('#brandlogo').attr("src","images/xxx.png");
62    }
63    
64    /*
65   var st = window.pageYOffset || document.documentElement.scrollTop;
66   if (st > lastScrollTop && $(this).scrollTop() > 250){
67      $('header').addClass("up");
68   } else {
69      $('header').removeClass("up");
70   }
71   lastScrollTop = st <= 0 ? 0 : st; // For Mobile or negative scrolling
72    */
73});
74
75$("a.fancybox").fancybox({
76  speedIn: 600,
77  speedOut: 200,
78  overlayShow: false,
79  autoScale: true,
80});
81
82document.addEventListener('click', function(e) {
83    
84  if (e.target.closest('button') != null) {
85    if (!e.target.closest('button').classList.contains('show-some-button')) {
86        const some_share_buttons_container = document.querySelector('.social-sharing-btns.showing');
87        if (some_share_buttons_container) {
88            some_share_buttons_container.classList.remove('showing');
89        }
90    }
91  } else {
92      console.log('button null');
93  }   
94});
95
96
97$(window).on('load', function () {
98  AOS.refresh();
99});
100$(function () {
101  AOS.init();
102});
103
104document.addEventListener("DOMContentLoaded", function (event) {
105    
106  // some share
107  const some_share_button = document.querySelector('.show-some-button');
108  const some_share_buttons_container = document.querySelector('.social-sharing-btns');
109  if (some_share_button && some_share_buttons_container) {
110    
111      some_share_button.addEventListener("click", function() { 
112        if (some_share_buttons_container.classList.contains('showing')) {
113            some_share_buttons_container.classList.remove('showing');
114        } else {
115            some_share_buttons_container.classList.add('showing');
116        }
117        // $('.social-sharing-btns').not($('.social-sharing-btns')).removeClass('showing')
118		    // $('.social-sharing-btns').toggleClass('showing');
119     });
120  }
121    
122  // Uses sharer.js
123  //  https://ellisonleao.github.io/sharer.js/#twitter
124  var url = window.location.href;
125  var title = document.title;
126  var subject = "Read this good article";
127  var via = "bootstrapC";
128  console.log(url);
129  console.log(title);
130
131  //facebook
132  $("#share-fb")
133          .attr("data-url", url)
134          .attr("data-sharer", "facebook");
135  //twitter
136  $("#share-tw")
137          .attr("data-url", url)
138          .attr("data-title", title)
139          .attr("data-via", via)
140          .attr("data-sharer", "twitter");
141  //linkedin
142  $("#share-li")
143          .attr("data-url", url)
144          .attr("data-sharer", "linkedin");
145  // google plus
146  $("#share-gp")
147          .attr("data-url", url)
148          .attr("data-title", title)
149          .attr("data-sharer", "googleplus");
150  // email
151  $("#share-em")
152          .attr("data-url", url)
153          .attr("data-title", title)
154          .attr("data-subject", subject)
155          .attr("data-sharer", "email");
156
157  //Prevent basic click behavior
158  $(".sharer button").click(function () {
159    event.preventDefault();
160  });
161});
162
163$(function () {
164    $('a[href*="#"]:not([href="#"])').click(function () {
165      if (location.pathname.replace(/^\//, '') == this.pathname.replace(/^\//, '') && location.hostname == this.hostname) {
166        var target = $(this.hash);
167        target = target.length ? target : $('[name=' + this.hash.slice(1) + ']');
168        if (target.length) {
169          $('html, body').animate({scrollTop: (target.offset().top - 100)}, 1000);
170          return false;
171        }
172      }
173    });
174  });
175
176
177// external js: isotope.pkgd.js
178// init first imagesLoaded, then Isotope
179
180var $grid = $('.grid-isotope').imagesLoaded( function() {
181var $grid = $('.grid-isotope').isotope({
182  itemSelector: '.grid-item',
183   layoutMode: 'fitRows',
184  transitionDuration: 650,
185  // stagger: 30
186});
187// filter functions, DO NOT REMOVE!
188var filterFns = {
189};
190
191// bind filter button click
192$('.filters-button-group').on( 'click', 'button', function() {
193  var filterValue = $( this ).attr('data-filter');
194  // use filterFn if matches value
195  filterValue = filterFns[ filterValue ] || filterValue;
196  $grid.isotope({ filter: filterValue });
197});
198// change is-checked class on buttons
199$('.button-group').each( function( i, buttonGroup ) {
200  var $buttonGroup = $( buttonGroup );
201  $buttonGroup.on( 'click', 'button', function() {
202    $buttonGroup.find('.is-checked').removeClass('is-checked');
203    $( this ).addClass('is-checked');
204  });
205});
206
207});
208
209// SmartMenus init
210$(function() {
211  $('#main-menu').smartmenus({
212    showOnClick: true,		// show the first-level sub menus onclick instead of onmouseover (i.e. mimic desktop app menus) (matters only for mouse input)
213    hideOnClick: true,		// hide the sub menus on click/tap anywhere on the page
214    noMouseOver: true
215  });
216});
217
218/*** GENERAL START ***/
219
220function loadMore(that, offset, elem, limit, category, forced) {
221  var el = $(that);
222  el.closest('.js-news-cats').find('li').each(function(i){
223    $(this).removeClass('active');
224  });
225  el.closest('li').addClass('active');
226  if (sessionStorage.getItem('load-offset')) {
227    if (offset == 0) {
228      sessionStorage.setItem('load-offset', 0)
229    }
230    var offset_before = parseInt(sessionStorage.getItem('load-offset'));
231  } else {
232    var offset_before = 0;
233  }
234  
235 
236  var new_offset = offset + offset_before;
237   if (forced == 1) {
238      new_offset = 0;
239  }
240  
241  sessionStorage.setItem('load-offset', new_offset)
242
243  const data = {
244    offset: new_offset,
245    limit: limit,
246    category: category
247  };
248
249	console.log('new_offset - '+new_offset);
250	console.log('limit - '+limit);
251
252  const params = encodeQueryData(data);
253  const callbackArgs = [elem, limit, offset];
254  const responseType = 'html';
255  httpRequestHandler('get', 'ajax/ajax-load-more/', params, responseType, appendContent, callbackArgs);
256}
257
258function encodeQueryData(data) {
259  const ret = [];
260  for (let d in data)
261    ret.push(encodeURIComponent(d) + '=' + encodeURIComponent(data[d]));
262  return ret.join('&');
263}
264
265var xmlHttp = null;
266function httpRequestHandler(method, url, params, responseType, callbackFunction, callbackArgs, multipleRequestAllowed) {
267  if (method == 'post') {
268  var paramsSend = params;
269  var paramsGet = '';
270  } else {
271  var paramsSend = null;
272  var paramsGet = '?' + params;
273  }
274
275  if (multipleRequestAllowed == true) {
276      var xmlHttp = null;
277  }
278
279  if (xmlHttp != null) {
280      xmlHttp.abort();
281  } else {
282      if (document.getElementById('ajax-loader')) {
283        if (document.getElementById('ajax-loader').style.display == 'none') {
284          var loader = setTimeout(startLoader, 2000);
285        }
286      }
287  }
288
289  xmlHttp = new XMLHttpRequest();
290  xmlHttp.onreadystatechange = function () {
291      if (xmlHttp.readyState == 4 && xmlHttp.status == 200) {
292          if (loader) {
293            stopLoader(loader);
294          }
295          var response = xmlHttp.responseText;
296          if (xmlHttp.responseText !== '') {
297              if (responseType === 'json') {
298                  response = JSON.parse(xmlHttp.responseText);
299              }
300          }
301
302          if (callbackFunction) {
303              callbackFunction(...callbackArgs, response);
304          }
305      }
306  }
307  xmlHttp.open(method, url + paramsGet);
308  xmlHttp.setRequestHeader('Cache-Control', 'no-cache');
309  xmlHttp.send(paramsSend);
310}
311
312function appendContent(elem, limit, offset, requestResponse) {
313  if (offset == 0) {
314    document.getElementById(elem).innerHTML = '';
315  }
316  console.log(elem);
317  document.getElementById(elem).insertAdjacentHTML("beforeend", requestResponse);
318  var parseContent = document.createElement("div");
319  parseContent.innerHTML = requestResponse;
320  const lastLoadMore = Array.from(document.getElementById(elem).getElementsByClassName('loadMoreButtonJS')).pop();
321  console.log(lastLoadMore);
322  Array.from(document.getElementById(elem).getElementsByClassName('loadMoreButtonJS')).forEach(hideMe);
323  if (parseContent.querySelector('#total_count')) {
324    var itemsTotalCount = parseContent.querySelector('#total_count').value;
325    var listed_items = parseInt(sessionStorage.getItem('load-offset')) + limit;
326    if (listed_items < itemsTotalCount) {
327      lastLoadMore.style.display = 'block';
328    }
329  }
330}
331
332
333function hideMe(el) {
334  el.style.display = 'none';
335}
336
337function showAjaxContent(elementDOMID, innerHTMLData) {
338  if (elementDOMID) {
339    document.getElementById(elementDOMID).innerHTML = innerHTMLData;
340  }
341}
342function startLoader() {
343  document.getElementById('ajax-loader').innerHTML = '<img src="ikonit/loader-200.gif">';
344  document.getElementById('ajax-loader').style.display = 'block';
345}
346
347function stopLoader(interval) {
348  document.getElementById('ajax-loader').innerHTML = '';
349  document.getElementById('ajax-loader').style.display = 'none';
350  clearTimeout(interval);
351}
352
353function showMessage(message, message_class, delay) {
354  delay = (delay > 0) ? delay : 2000;
355  var messageBox = document.getElementById('messageBox');
356  messageBox.innerHTML = message;
357  messageBox.classList.remove('fadeout');
358  messageBox.classList.add(message_class);
359  messageBox.classList.add('fade');
360
361  setTimeout(function () {
362  messageBox.classList.remove('fade');
363  messageBox.classList.add('fadeout');
364  }, delay);
365}
366
367/*** GENERAL END ***/
368
369
370
371
372// Popupin aukaisu
373function getPopUp(url, paramsData, button, itemID) {
374  // paramsData.database = site;
375  console.log('getPopup...');
376  const params = encodeQueryData(paramsData);
377  const callbackArgs = [button, itemID];
378  const responseType = 'html';
379  httpRequestHandler('get', url, params, responseType, showPopUp, callbackArgs);
380}
381
382function getPopUpXX(url, paramsData, button, itemID) {
383  console.log('getPopup...');
384  return false;
385}
386
387function showPopUpTest(button, itemID, requestResponse) {
388    console.log(requestResponse);
389}
390
391
392// Alustetaan moduulin muokkaus ikkuna
393function showPopUp(button, itemID, requestResponse) {
394 
395 
396    // get editor container
397    const settingsElem = document.getElementById('settingsJS');
398
399    // Jos elementtiä ei ole olemassa, ollaan menossa muokkaamaan
400    if (settingsElem === null) {
401        
402        var settingsModule = document.createElement("div");
403      settingsModule.setAttribute('id', 'settingsJS');
404
405      // Editorin mitat h*w
406      const contentClientWidth = document.body.clientWidth;
407      var editorWidth = contentClientWidth - 100;
408      const contentClientHeight = document.body.clientHeight;
409      var editorHeight = contentClientHeight - 100;
410
411
412      // Editorin sijainti
413      if (editorWidth >= 700) {
414        var editoriLeft = (contentClientWidth / 2) - (700 / 2);
415        editorWidth = 700;
416      } else {
417        var editoriLeft = (contentClientWidth / 2) - (editorWidth / 2);
418      }
419      if (editorHeight >= 700) {
420        editorHeight = 700;
421      }
422
423      if (editorHeight >= 700) {
424        editorHeight = 700;
425      }
426
427      // settingsModule.setAttribute('style', 'width: ' + editorWidth + 'px; height: ' + editorHeight + 'px;');
428      settingsModule.setAttribute('style', 'width: ' + editorWidth + 'px; height: auto;');
429      settingsModule.innerHTML = requestResponse;
430      document.getElementById('popUpContainer').appendChild(settingsModule);
431      if (document.getElementById('popUpContainer').querySelector("#runscript")) {
432          eval(document.getElementById('popUpContainer').querySelector("#runscript").innerHTML);
433      }
434      document.getElementById('popUpContainer').setAttribute('style', 'right: ' + editoriLeft + 'px;');
435      var editing_mode = true;
436      document.getElementById('bodyOverlay').classList.add('disabled');
437    } else {
438      
439      var editing_mode = false;
440      document.getElementById('bodyOverlay').classList.remove('disabled');
441      // mahdollinen requestResponse, päivitetään sivu
442      if (requestResponse !== '') {
443          
444           console.log('reloadi');
445           console.log(requestResponse);
446           location.reload();
447           showMessage(requestResponse, 'msg', 1000);
448      }
449    }
450    
451    var settingsContainer = document.getElementById('popUpContainer'); // Moduulin editoinnin container
452    var editorOpenEvent = 'showPopUp';
453    var editorOpenClass = 'popUpOpen';
454
455    if (editing_mode === true) {
456      // Esitetään moduulin muokkausikkuna
457      // Show selected editor
458      settingsModule.classList.add(editorOpenClass);
459      // Add transition for container by class
460      settingsContainer.classList.add(editorOpenEvent);
461    } else {
462        if (document.getElementById('settingsJS')) {
463            document.getElementById('settingsJS').remove();
464        }
465        // Overlay taustalta pois
466        document.getElementById('bodyOverlay').classList.remove('disabled');
467        settingsContainer.classList.remove(editorOpenEvent);
468    }
469}
470
471function saveFormData(form, url, method, responseType, callbackFunction, lang, callbackArgs) {
472
473  // Luodaan lähetettävä formin data
474    var form_inputs = form.querySelectorAll('input, select, textarea');
475    var form_data = new FormData();
476  
477    for (var i = 0; form_inputs.length > i; i++) {
478      if (form_inputs[i].getAttribute('type') == 'checkbox') {
479        if (form_inputs[i].checked) {
480          form_data.append(form_inputs[i].name, form_inputs[i].value);
481        }
482      } else if (form_inputs[i].getAttribute('type') == 'radio') {
483        if (form_inputs[i].checked) {
484          form_data.append(form_inputs[i].name, form_inputs[i].value);
485        }
486      } else {
487        form_data.append(form_inputs[i].name, form_inputs[i].value);
488      }
489      console.log('input: '+form_inputs[i].name+','+form_inputs[i].value);
490    }
491  
492    // form_data.append('database', site);
493    form_data.append('lang', lang);
494  
495    console.log(form_data);
496  
497    httpRequestHandler(method, url, form_data, responseType, callbackFunction, callbackArgs);
498    return false;
499  
500  }
501
502function validateForm(form) {
503
504  // TODO input validation too! addEventListener for onkeyup with selector .sagaValidateForm input.sagaRequired
505    var valid = true;
506    var form_checkbox = false;
507    var form_checkbox_checked = false;
508    var form_checkbox_error_elem;
509    var form_radio = false;
510    var form_radio_checked = false;
511    var form_radio_error_elem;
512    // Error elementti joka esitetään formin ylälaidassa
513    var exists_form_error_elem = form.querySelector('.formErrorElement');
514    if (exists_form_error_elem) {
515        exists_form_error_elem.remove();
516    }
517    var form_error_elem = '';
518    
519    var form_inputs = form.querySelectorAll('input, select, textarea');
520
521    for (var i = 0; form_inputs.length > i; i++) {
522        if (form_inputs[i].parentElement.classList.contains('formError')) {
523            form_inputs[i].parentElement.classList.remove('formError');
524        }
525        // Pakolliset kentät
526        if (form_inputs[i].classList.contains('required')) {
527            if (form_inputs[i].getAttribute('type') == 'checkbox') {
528                form_checkbox = true;
529                //form_inputs[i].parentElement.classList.add('formError');
530                form_checkbox_error_elem = form_inputs[i];
531                if (form_inputs[i].checked) {
532                    form_checkbox_checked = true;
533                    //form_inputs[i].parentElement.classList.remove('formError');
534                }
535            } else if (form_inputs[i].getAttribute('type') == 'radio') {
536                form_radio = true; 
537                form_radio_error_elem = form_inputs[i];
538                //form_inputs[i].parentElement.classList.add('formError');
539                if (form_inputs[i].checked) {
540                    form_radio_checked = true;
541                    //form_inputs[i].parentElement.classList.remove('formError');
542                }
543            }  else {
544                if (form_inputs[i].value == '') { // Tyhjä kenttä
545                    valid = false;
546                    // Error elementin info
547                    if (form_inputs[i].getAttribute('data-form-error-msg') && form_inputs[i].getAttribute('data-form-error-msg') !== '') {
548                        form_error_elem += '- '+form_inputs[i].getAttribute('data-form-error-msg') + '<br>';
549                    } else {
550                        form_error_elem += '- '+form_inputs[i].label + '<br>';
551                    }
552                    form_inputs[i].parentElement.classList.add('formError');
553                }
554            }
555        }
556    }
557    // Onko kaikki checkboxit täytetty jota pakollisia
558    if (form_checkbox == true && form_checkbox_checked == false) {
559        valid = false;
560        form_checkbox_error_elem.parentElement.classList.add('formError');
561    }
562    // Onko kaikki radio elementit täytetty jota pakollisia
563    if (form_radio == true && form_radio_checked == false) {
564        valid = false;
565        form_radio_error_elem.parentElement.classList.add('formError');
566    }
567
568    // Esietettän error elementti
569    if (valid == false && form_error_elem !== '') {
570        // form.insertAdjacentHTML('afterbegin', '<div class="formErrorElement">'+form_error_elem)+'</div>';
571    }
572    
573    return valid;
574}
575
576function deleteProfilePicture(itemID) {
577  const paramsData = {
578    itemID: itemID
579  }
580  const params = encodeQueryData(paramsData);
581  const callbackArgs = [];
582  const responseType = 'html';
583  httpRequestHandler('get', 'ajax/delete-profile-picture/', params, responseType, updatePage, callbackArgs);
584}
585
586function deleteAccount(itemID) {
587  const paramsData = {
588    itemID: itemID
589  }
590  const params = encodeQueryData(paramsData);
591  const callbackArgs = [];
592  const responseType = 'html';
593  httpRequestHandler('get', 'ajax/ajax-delete-account-final/', params, responseType, updatePageTest, callbackArgs);
594}
595
596
597function updatePage() {
598    location.reload(); 
599}
600
601
602function updatePageTest(response) {
603    console.log('updatepage temp - ');
604    console.log(response);
605}
606
607
608function inviteUser(elem, roleIDs, contactID, email, lang, url, method, responseType, callbackFunction, callbackArgs) {
609
610  const data = {
611    lang: lang,
612    roleIDs: roleIDs,
613    contactID: contactID,
614    email: email
615  };
616
617  const params = encodeQueryData(data);
618  httpRequestHandler(method, url, params, responseType, callbackFunction, callbackArgs);
619}
620
621function userInvited(elem, requestResponse) {
622  if (elem && requestResponse.trim() != '' && requestResponse != '-1') {
623      elem.parentElement.innerHTML = '<span>'+requestResponse+'</span>';
624  }
625}
626
627function getOrderInfo(externalKey, url, method, responseType, callbackFunction, callbackArgs) {
628  const data = {
629    lang: lang,
630    externalKey: externalKey
631  };
632
633  const params = encodeQueryData(data);
634  httpRequestHandler(method, url, params, responseType, callbackFunction, callbackArgs);
635}
636
637
638function getOrderInfoLight(externalKey, url, method, responseType, callbackFunction, callbackArgs) {
639  const data = {
640    lang: lang,
641    externalKey: externalKey
642  };
643
644  const params = encodeQueryData(data);
645  httpRequestHandlerLight(method, url, params, responseType, callbackFunction, callbackArgs);
646}
647
648
649
650
651function updateOrders(url, method, responseType, callbackFunction, callbackArgs) {
652  const data = {
653    lang: lang
654  };
655  const params = encodeQueryData(data);
656  httpRequestHandler(method, url, params, responseType, callbackFunction, callbackArgs);
657}
658
659
660
661function confirmOrder(form, itemID) {
662
663    var orderID = form.querySelector('[name="orderID"]').value;
664    if (orderID == '') {
665        alert('Order ID missing!');
666        return false;
667    }
668
669    var confirm = false; // Käsitelläänkö vai siirretäänkö takaisin käsiteltäväksi
670    var confirmed = form.querySelector('[name="confirmed"]').value;
671    if (confirmed == '') {
672        confirm = true;
673    } else { // Tilaus on jo tasomestarilla tai tuotannossa, avataan popup jossa varoitetaan tästä
674      const data = {
675        lang: lang,
676        orderID: orderID
677      };
678      const params = encodeQueryData(data);
679      const callbackArgs = [];
680      httpRequestHandler('GET','ajax/ajax-order-to-checklist/', params, 'html', updatePage, callbackArgs);
681      return false;
682    }
683
684    // Ohjataanko tasomestarille
685    var worktop_master = form.querySelector('[name="worktop_master"]');
686    if (worktop_master) {
687        if (worktop_master.checked) { // Tasomestarille, avataan popup
688            getPopUp('ajax/ajax-select-worktop-master/', {lang: lang, itemID: orderID}, form, itemID);
689        } else { // Ohjataan valitsemaan tuotantolinja 
690            getPopUp('ajax/ajax-select-production-line/', {lang: lang, itemID: orderID}, form, itemID);
691        }
692    }
693    
694}
695
696function selectThis(elem) {
697    var all_elements = elem.parentElement.querySelectorAll('tr');
698    for (let i = 0; i < all_elements.length; i++) {
699      all_elements[i].classList.remove('selected');
700    }
701
702    elem.classList.add('selected');
703}
704
705function addValue(elemID, value) {
706    document.getElementById(elemID).value = value;
707}
708
709function validateTableSelect(form, elemName) {
710    var validateValue = form.querySelector('[name="'+elemName+'"]');
711    if (validateValue.value != '') {
712        return true;
713    } else {
714        validateValue.insertAdjacentHTML('afterend', '<p style="padding: 1rem; color: red;">Valitse tasomestari</p>');
715        return false;
716    }
717}
718
719/** MEDIA START **/
720function dropHandler(elem, ev, media_typeID) {
721  ev.preventDefault();
722  let dt = ev.dataTransfer;
723  let files = dt.files;
724  document.getElementById('fileElem').files = dt.files;
725  previewFiles(files, media_typeID);
726}
727
728function previewFile(file, media_typeID, i) {
729  document.getElementById('fsagaAddNewGalleryItemHolder').innerHTML = '';
730  let reader = new FileReader();
731  reader.readAsDataURL(file);
732  reader.onloadend = function() {
733    let filenameElem = document.createElement('span');
734    filenameElem.innerHTML = file.name;
735    filenameElem.className = 'fsagaFormGroup';
736    let img = document.createElement('img');
737    img.src = reader.result;
738    let img_container = document.createElement('div');
739    img_container.className = 'fsagaAddNewGalleryItemHolderImageWrapper';
740    img_container.appendChild(img);
741    let div = document.createElement('div');
742    div.className = 'fsagaPadSmall';
743    div.setAttribute('id', 'fileMedia'+i)
744
745    var template = '';
746    if (media_typeID == 1) {
747        template = document.getElementById('fsagaMediaImageEditTmpl').innerHTML;
748    }
749    div.appendChild(filenameElem);
750    div.appendChild(img_container);
751    div.insertAdjacentHTML('beforeend', template);
752    document.getElementById('fsagaAddNewGalleryItemHolder').appendChild(div);
753
754  }
755}
756
757function uploadFile(file, media_typeID, itemID, index) { // <- Add `index` parameter
758
759  var url = 'ajax/ajax-save-media-item/';
760  var xhr = new XMLHttpRequest();
761  var form_data = new FormData();
762
763  var form = document.getElementById('fileMedia'+index);
764  var form_inputs = form.querySelectorAll('input, select, textarea');
765
766  for (var i = 0; form_inputs.length > i; i++) {
767    if (form_inputs[i].getAttribute('type') == 'checkbox') {
768      if (form_inputs[i].checked) {
769        form_data.append(form_inputs[i].name, form_inputs[i].value);
770      }
771    } else if (form_inputs[i].getAttribute('type') == 'radio') {
772      if (form_inputs[i].checked) {
773        form_data.append(form_inputs[i].name, form_inputs[i].files[0]);
774      }
775    } else if (form_inputs[i].getAttribute('type') == 'file') {
776      form_data.append(form_inputs[i].name, form_inputs[i].value);
777    } else {
778      form_data.append(form_inputs[i].name, form_inputs[i].value);
779    }
780  }
781
782  form_data.append('database', site);
783  form_data.append('lang', lang);
784  form_data.append('media_typeID', media_typeID);
785  form_data.append('itemID', itemID);
786
787  xhr.open('POST', url, true);
788
789  // Add following event listener
790  xhr.upload.addEventListener("progress", function(e) {
791    console.log('loaded:'+e.loaded);
792    console.log('total:'+e.total);
793    updateProgress(index, (e.loaded * 100.0 / e.total) || 100);
794  })
795
796  xhr.addEventListener('readystatechange', function(e) {
797    if (xhr.readyState == 4 && xhr.status == 200) {
798      // Done. Inform the user
799      showPopUp('','', xhr.responseText);
800    }
801    else if (xhr.readyState == 4 && xhr.status != 200) {
802      // Error. Inform the user
803    }
804  });
805
806  form_data.append('file', file);
807  xhr.send(form_data);
808}
809
810
811
812
813function uploadWorkFile(file, media_typeID, orderID, index, type) { // <- Add `index` parameter
814
815  var url = 'ajax/ajax-save-work-file/';
816  var xhr = new XMLHttpRequest();
817  var form_data = new FormData();
818
819  var form = document.getElementById('fileMedia'+index);
820  var form_inputs = form.querySelectorAll('input, select, textarea');
821
822  for (var i = 0; form_inputs.length > i; i++) {
823    if (form_inputs[i].getAttribute('type') == 'checkbox') {
824      if (form_inputs[i].checked) {
825        form_data.append(form_inputs[i].name, form_inputs[i].value);
826      }
827    } else if (form_inputs[i].getAttribute('type') == 'radio') {
828      if (form_inputs[i].checked) {
829        form_data.append(form_inputs[i].name, form_inputs[i].files[0]);
830      }
831    } else if (form_inputs[i].getAttribute('type') == 'file') {
832      form_data.append(form_inputs[i].name, form_inputs[i].value);
833    } else {
834      form_data.append(form_inputs[i].name, form_inputs[i].value);
835    }
836  }
837
838  form_data.append('database', site);
839  form_data.append('lang', lang);
840  form_data.append('media_typeID', media_typeID);
841  form_data.append('orderID', orderID);
842  form_data.append('type', type);
843
844  xhr.open('POST', url, true);
845
846  // Add following event listener
847  xhr.upload.addEventListener("progress", function(e) {
848    console.log('loaded:'+e.loaded);
849    console.log('total:'+e.total);
850    updateProgress(index, (e.loaded * 100.0 / e.total) || 100);
851  })
852
853  xhr.addEventListener('readystatechange', function(e) {
854    if (xhr.readyState == 4 && xhr.status == 200) {
855      // Done. Inform the user
856      showPopUp('','', xhr.responseText);
857    }
858    else if (xhr.readyState == 4 && xhr.status != 200) {
859      // Error. Inform the user
860    }
861  });
862
863  form_data.append('file', file);
864  xhr.send(form_data);
865}
866
867
868
869function handleFiles(elem, media_typeID, itemID) {
870
871  var files = elem.files;
872  initializeProgress(files.length);
873  if (files.length > 0) {
874    ([...files]).forEach(function (file, i) {
875      uploadFile(file, media_typeID, itemID, i);
876    });
877  } else {
878    showMessage('Select file first', 'message-error');
879  }
880}
881
882
883function handleWorkFiles(elem, media_typeID, orderID, type) {
884
885  var files = elem.files;
886  initializeProgress(files.length);
887  if (files.length > 0) {
888    ([...files]).forEach(function (file, i) {
889      uploadWorkFile(file, media_typeID, orderID, i, type);
890    });
891  } else {
892    showMessage('Select file first', 'message-error');
893  }
894}
895
896
897function previewFiles(files, media_typeID) {
898  // ([...files]).forEach(previewFile);
899  ([...files]).forEach(function (file, i) {
900    previewFile(file, media_typeID, i);
901  });
902}
903
904function initializeProgress(numFiles) {
905  if (typeof progressBar === "undefined") {
906      progressBar = document.getElementById('fsagaProgressBar');
907  }
908
909  document.getElementById('fsagaProgressBarContainer').classList.remove('fsagaHide');
910
911  progressBar.value = 0
912  uploadProgress = []
913
914  for(let i = numFiles; i > 0; i--) {
915    uploadProgress.push(0)
916  }
917}
918
919function updateProgress(fileNumber, percent) {
920  uploadProgress[fileNumber] = percent;
921  let total = uploadProgress.reduce((tot, curr) => tot + curr, 0) / uploadProgress.length;
922  progressBar.value = total;
923}
924
925function dragOverHandler(elem, ev) {
926  elem.classList.add('fsagaDropHighlight')
927  // Prevent default behavior (Prevent file from being opened)
928  ev.preventDefault();
929}
930
931function unhighlight(elem, ev) {
932  elem.classList.remove('fsagaDropHighlight');
933  ev.preventDefault();
934}
935/** MEDIA END **/

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.