function setupInfinityScroll(options) {
// Uudet valinnaiset asetukset:
// - lastIdSelector: selektori, josta luetaan viimeisen elementin id (jos eri kuin itemSelector)
// - appendAfterSelector: jos annettu, lisätään response tämän selektorin viimeisen elementin jälkeen (.last().after(...))
let isLoading = false;
let allResultsLoaded = false;
const triggerElement = $(options.triggerSelector);
if (!triggerElement.length) {
return;
}
function loadMore(params = {}) {
if (isLoading || (allResultsLoaded && !params.limit)) {
return;
}
isLoading = true;
const originalHtml = triggerElement.html();
if (!params.limit) {
triggerElement.html('
');
}
// Mistä haetaan viimeisen kohteen id?
const idSourceSelector = options.lastIdSelector || options.itemSelector;
const lastItem = $(idSourceSelector).last();
const lastId = params.limit ? '' : (lastItem.length ? lastItem.attr('id') : '');
const stype = triggerElement.attr('stype');
const squery = triggerElement.attr('squery');
const url = triggerElement.attr('url');
let ajaxUrl = `/search-more.php?stype=${stype}&squery=${squery}&id=${lastId}`;
if (url) ajaxUrl += `&url=${url}`;
if (params.limit) ajaxUrl += `&limit=${params.limit}`;
$.ajax({
url: ajaxUrl,
type: 'GET',
success: function(response) {
if (response && $.trim(response) !== "") {
if (params.limit) {
// Tilapalautus: korvataan nykyinen sisältö
if (options.appendAfterSelector) {
// Tyhjennetään container, jos sellainen on annettu
if (options.containerSelector) {
$(options.containerSelector).empty();
} else {
// Jos containeria ei ole, poistetaan listaelementit turvallisesti
$(options.itemSelector).remove();
}
} else if (options.containerSelector) {
$(options.containerSelector).empty();
}
}
// Mihin lisätään uudet rivit?
if (options.appendAfterSelector) {
$(options.appendAfterSelector).last().after(response);
} else if (options.containerSelector) {
$(options.containerSelector).append(response);
}
triggerElement.html(originalHtml);
} else {
allResultsLoaded = true;
triggerElement.html('Ei enempää tuloksia').show();
}
},
error: function() {
triggerElement.html('Latausvirhe.').show();
},
complete: function() {
isLoading = false;
if (typeof params.onComplete === 'function') {
params.onComplete();
}
}
});
}
$(document).on('click', options.triggerSelector, function(e) {
e.preventDefault();
loadMore();
});
$(window).on('scroll', function() {
if (window.isRestoring || isLoading || allResultsLoaded) return;
if (triggerElement.is(':visible') && (triggerElement.offset().top < $(window).scrollTop() + $(window).height())) {
loadMore();
}
});
(function restoreState() {
const lastUrl = sessionStorage.getItem('lastSearchUrl');
const itemsLoaded = sessionStorage.getItem('itemsLoaded');
const scrollPosition = sessionStorage.getItem('scrollPosition');
const normalizeUrl = (url) => {
if (!url) return '';
try {
return (new URL(url).host + new URL(url).pathname).replace(/\/$/, '');
} catch (e) { return url; }
};
if (!lastUrl || normalizeUrl(lastUrl) !== normalizeUrl(window.location.href) || !itemsLoaded) {
return;
}
const requiredItems = parseInt(itemsLoaded, 10);
if (requiredItems <= $(options.itemSelector).length) {
window.scrollTo(0, parseFloat(scrollPosition));
return;
}
window.isRestoring = true;
$('#page-loader-overlay').fadeIn(150);
triggerElement.hide();
loadMore({
limit: requiredItems,
onComplete: function() {
$('#page-loader-overlay').fadeOut(150, function() {
window.scrollTo(0, parseFloat(scrollPosition));
window.isRestoring = false;
if (!allResultsLoaded) {
triggerElement.show();
}
});
}
});
})();
}
$(document).ready( function() {
preload_image_object = new Image();
image_url = new Array();
image_url[0] = "/images/waiting.gif";
image_url[1] = "/images/flag-FI.png";
image_url[2] = "/images/flag-SE.png";
var i = 0;
for(i=0; i<=2; i++) {
preload_image_object.src = image_url[i];
}
if (window.location.pathname != '/register_info.php' && window.location.pathname.match(/^\/admin/) === null && window.location.pathname.match(/^\/tilha/) === null && window.location.pathname.match(/^\/manager/) === null && window.location.pathname.match(/^\/lainaa/) === null){
//if (!getPrivacy()){
//privacyPopup();
//}
}
$('.img_replace_source').live('click', function(){
let target_src = $(this).attr("data-img-replace-target-src");
let target_id = $(this).attr("data-img-replace-target-id");
replace_image_src_to_id(target_id,target_src);
});
function replace_image_src_to_id(id,src) {
element = document.getElementById(id);
if(element) {
element.src=src;
}
}
$('.a_replace_href').live('click', function(){
let target_href = $(this).attr("data-a-replace-target-href");
let target_id = $(this).attr("data-a-replace-target-id");
replace_link_href_to_id(target_id,target_href);
});
function replace_link_href_to_id(id,href) {
element = document.getElementById(id);
if(element) {
element.href=href;
}
}
if ( window.location.hash.substring(0,13) == "#!product_id=" ) {
var ean = window.location.hash.substring(13);
$('#book_div').animate({ opacity: 0.0 }, 50, function () {
var position = $(window).scrollTop()-$("#inner").offset().top;
if ( position < 0 ) {
position = 0;
}
if (position > 0 && $('#search_bar').hasClass('sticky')){
$("#book_div_top").attr('class', 'sticky_compensate');
}else{
$("#book_div_top").attr('class', null);
}
$("#book_div_top").css("height", position);
$("#book_div").load("/book_load.php?ean="+encodeURIComponent(ean), {}, function(data) {
$("#book_div").html(data);
$('#book_div').animate({ opacity: 1.0 }, 75);
refresh_description_expansions();
});
});
}
var selected = 'search-id-0';
$("#shoppingcart-id").load("/shoppingcart.php", {}, function(data) {
$("#shoppingcart-id").html(data);
});
$('div.search-result').live('click', function () {
$('#'+selected).css("background-color", "#ffffff");
$(this).css("background-color", "#e6e6e6" );
selected = $(this).attr('id');
var ean = $(this).attr('ean');
window.location.hash = '!product_id='+encodeURIComponent(ean);
$('#book_div').animate({ opacity: 0.0 }, 75, function () {
var position = $(window).scrollTop()-$("#inner").offset().top;
if ( position < 0 ) {
position = 0;
}
if (position > 0 && $('#search_bar').hasClass('sticky')){
$("#book_div_top").attr('class', 'sticky_compensate');
}else{
$("#book_div_top").attr('class', null);
}
$("#book_div_top").css("height", position);
$("#book_div").load("/book_load.php?ean="+encodeURIComponent(ean), {}, function(data) {
$("#book_div").html(data);
$('#book_div').animate({ opacity: 1.0 }, 250);
refresh_description_expansions();
cookieConsent.useAllowedCookies('trackProduct')
});
});
});
$("div.search-result").live('mouseover', function () {
if ( selected != $(this).attr('id') ) {
$(this).css("background-color", "#f8f8f8");
}
});
$("div.search-result").live('mouseout', function () {
if ( selected != $(this).attr('id') ) {
$(this).css("background-color", "#ffffff");
}
});
$('#print_book').live('click', function(){
console.log("print");
PrintElem('#book_div');
return false;
});
$('#item-info-header').live('click', function () {
$('.item-info-header-on').each(function(index) {
$(this).removeClass("item-info-header-on").addClass("item-info-header-off");
});
$(this).removeClass("item-info-header-off").addClass("item-info-header-on");
var url = $(this).attr('url');
$('#item-info').html('

