{"webLayers":[{"_id":"6548d4ad8c0a2e246d2a7fc8","date_filter":{"enabled":false,"from_date":null,"to_date":null},"trigger":{"include_pages":[{"url":"photospecialist.at","type":"contains"}],"exclude_pages":[{"url":"warenkorb","type":"contains"},{"url":"bestellen-konto","type":"contains"},{"url":"exponea.start","type":"contains"}]},"device_target":{"type":"any"},"frequency":"once_per_visit","uses_personalization":true,"data":"","variables_target":null,"page_vars":[]},{"_id":"6548d725c2c413fe1a839593","date_filter":{"enabled":false,"from_date":null,"to_date":null},"trigger":{"include_pages":[{"url":"photospecialist.com","type":"contains"}],"exclude_pages":[{"url":"shoppingcart","type":"contains"},{"url":"order-account","type":"contains"}]},"device_target":{"type":"any"},"frequency":"once_per_visit","uses_personalization":true,"data":"","variables_target":null,"page_vars":[]},{"_id":"6548d837454d9c9715ea4846","date_filter":{"enabled":false,"from_date":null,"to_date":null},"trigger":{"include_pages":[{"url":"photospecialist.co.uk","type":"contains"}],"exclude_pages":[{"url":"shoppingcart","type":"contains"},{"url":"order-account","type":"contains"}]},"device_target":{"type":"any"},"frequency":"once_per_visit","uses_personalization":true,"data":"","variables_target":null,"page_vars":[]},{"_id":"6548d9b75b782fd752e8fa63","date_filter":{"enabled":false,"from_date":null,"to_date":null},"trigger":{"include_pages":[{"url":"photospecialist.ie","type":"contains"}],"exclude_pages":[{"url":"shoppingcart","type":"contains"},{"url":"order-account","type":"contains"},{"url":"acc.kamera","type":"contains"}]},"device_target":{"type":"any"},"frequency":"once_per_visit","uses_personalization":true,"data":"","variables_target":null,"page_vars":[]},{"_id":"6548db25454d9c9715ea4926","date_filter":{"enabled":false,"from_date":null,"to_date":null},"trigger":{"include_pages":[{"url":"photospecialist.es","type":"contains"}],"exclude_pages":[{"url":"carrito-de-compras","type":"contains"},{"url":"ordenar-cuenta","type":"contains"},{"url":"acc.kamera","type":"contains"}]},"device_target":{"type":"any"},"frequency":"once_per_visit","uses_personalization":true,"data":"","variables_target":null,"page_vars":[]},{"_id":"6548dc6c5b782fd752e8fe89","date_filter":{"enabled":false,"from_date":null,"to_date":null},"trigger":{"include_pages":[{"url":"photospecialist.fr","type":"contains"}],"exclude_pages":[{"url":"panier","type":"contains"},{"url":"commander-compte","type":"contains"},{"url":"acc.kamera","type":"contains"}]},"device_target":{"type":"any"},"frequency":"once_per_visit","uses_personalization":true,"data":"","variables_target":null,"page_vars":[]},{"_id":"6548dd1a454d9c9715ea497f","date_filter":{"enabled":false,"from_date":null,"to_date":null},"trigger":{"include_pages":[{"url":"photospecialist.it","type":"contains"}],"exclude_pages":[{"url":"carrello-della-spesa","type":"contains"},{"url":"ordina-account","type":"contains"},{"url":"acc.kamera","type":"contains"}]},"device_target":{"type":"any"},"frequency":"once_per_visit","uses_personalization":true,"data":"","variables_target":null,"page_vars":[]},{"_id":"6578429a16f28f96b3295d8a","date_filter":{"enabled":true,"from_date":null,"to_date":null},"trigger":{"include_pages":[{"url":"kamera-express.nl","type":"contains"}],"exclude_pages":[{"url":"winkelwagen","type":"contains"},{"url":"bestellen-account","type":"contains"},{"url":"acc.kamera","type":"contains"},{"url":"checkout-registratie","type":"contains"}]},"device_target":{"type":"mobile"},"frequency":"until_visitor_interacts","uses_personalization":true,"data":"","variables_target":null,"page_vars":[]},{"_id":"65e6d173d7a5e4fbf77c3a6a","date_filter":{"enabled":false,"from_date":null,"to_date":null},"trigger":{"include_pages":[{"url":".nl/","type":"contains"},{"url":".be/","type":"contains"}],"exclude_pages":[{"url":".be/fr/","type":"contains"},{"url":"r5-mark-ii","type":"contains"}]},"device_target":{"type":"any"},"frequency":"always","uses_personalization":true,"data":"","variables_target":null,"page_vars":[]},{"_id":"65f9a0ec3335cb12fa05ddb0","date_filter":{"enabled":false,"from_date":null,"to_date":null},"trigger":{"include_pages":[{"url":"?sebasket","type":"contains"}],"exclude_pages":null},"device_target":{"type":"any"},"frequency":"always","uses_personalization":true,"data":"","variables_target":null,"page_vars":[]},{"_id":"661e7e363d759534d20b5d65","date_filter":{"enabled":false,"from_date":null,"to_date":null},"trigger":{"include_pages":[{"url":"https://www.kamera-express.nl/","type":"contains"}],"exclude_pages":[{"url":"https://www.kamera-express.nl/checkout","type":"contains"},{"url":"https://www.kamera-express.nl/bedankt/thank/you","type":"contains"},{"url":"winkelwagen","type":"contains"},{"url":"account","type":"contains"}]},"device_target":{"type":"desktop"},"frequency":"once_per_visit","uses_personalization":true,"data":"","variables_target":null,"page_vars":[]},{"_id":"6620f27b4929d1ee66f654e6","date_filter":{"enabled":false,"from_date":null,"to_date":null},"trigger":{"include_pages":[{"url":"express.de/","type":"contains"},{"url":"express.lu/de/","type":"contains"},{"url":"foto-gregor.de/","type":"contains"}],"exclude_pages":null},"device_target":{"type":"any"},"frequency":"always","uses_personalization":true,"data":"","variables_target":null,"page_vars":[]},{"_id":"6620ff25f957b87b5d3739c5","date_filter":{"enabled":false,"from_date":null,"to_date":null},"trigger":{"include_pages":[{"url":"express.be/fr/","type":"contains"},{"url":"photogalerie.com/","type":"contains"},{"url":"express.lu/","type":"contains"},{"url":"express.fr/","type":"contains"}],"exclude_pages":[{"url":"express.lu/de/","type":"contains"}]},"device_target":{"type":"any"},"frequency":"always","uses_personalization":true,"data":"","variables_target":null,"page_vars":[]},{"_id":"66aa2c405067135f6557a451","date_filter":{"enabled":false,"from_date":null,"to_date":null},"trigger":{"include_pages":[{"url":"https://www.kamera-express.nl/winkelwagen?care-plan-test","type":"contains"}],"exclude_pages":null},"device_target":{"type":"any"},"frequency":"always","uses_personalization":true,"data":"","variables_target":null,"page_vars":[]},{"_id":"6734b33c4984f8e82f80fa6d","date_filter":{"enabled":false,"from_date":null,"to_date":null},"trigger":{"include_pages":[{"url":"www.kamera-express.nl/checkout","type":"exact"},{"url":"?testcareplan","type":"contains"}],"exclude_pages":null},"device_target":{"type":"any"},"frequency":"always","uses_personalization":true,"data":"","variables_target":{"conditions":[{"attribute":{"id":"684c45c5f0f60525b1f460ae","type":"page_variable"},"constraint":{"operands":[{"type":"constant","value":"true"}],"operator":"equals","type":"string"}}]},"page_vars":[]},{"_id":"682b06c4017f41a92cfdd70d","date_filter":{"enabled":false,"from_date":null,"to_date":null},"trigger":{"include_pages":[{"url":"www.kamera-express.nl/winkelwagen","type":"contains"}],"exclude_pages":[{"url":"test-new-recos=true","type":"contains"}]},"device_target":{"type":"any"},"frequency":"always","uses_personalization":true,"data":"","variables_target":null,"page_vars":[]},{"_id":"6891c7e9224931425b0fdc06","date_filter":{"enabled":false,"from_date":null,"to_date":null},"trigger":{"include_pages":[{"url":"kamera-express.de/warenkorb","type":"contains"}],"exclude_pages":[{"url":"?test-de-recos=true","type":"contains"}]},"device_target":{"type":"any"},"frequency":"always","uses_personalization":true,"data":"","variables_target":null,"page_vars":[]},{"_id":"689317003486469a5da30adf","date_filter":{"enabled":false,"from_date":null,"to_date":null},"trigger":{"include_pages":[{"url":"kamera-express.be/fr/panier","type":"contains"},{"url":"kamera-express.be/winkelwagen","type":"contains"}],"exclude_pages":[{"url":"test-be-recos=true","type":"contains"}]},"device_target":{"type":"any"},"frequency":"always","uses_personalization":true,"data":"","variables_target":null,"page_vars":[]},{"_id":"694a69f052b6d92f54d3214c","date_filter":{"enabled":false,"from_date":null,"to_date":null},"trigger":{"include_pages":[{"url":"?backorder-stop","type":"contains"}],"exclude_pages":null},"device_target":{"type":"any"},"frequency":"always","uses_personalization":true,"data":"","variables_target":null,"page_vars":[]},{"_id":"698733c319032aa04f19f5ae","date_filter":{"enabled":false,"from_date":null,"to_date":null},"trigger":{"include_pages":[{"url":"https://www.kamera-express.nl/winkelwagen","type":"exact"}],"exclude_pages":null},"device_target":{"type":"any"},"frequency":"always","uses_personalization":true,"data":"","variables_target":{"conditions":[{"attribute":{"id":"684c45c5f0f60525b1f460ae","type":"page_variable"},"constraint":{"operands":[{"type":"constant","value":"true"}],"operator":"equals","type":"string"}}]},"page_vars":[]},{"_id":"698f2b194db6ce0fa0756a80","date_filter":{"enabled":false,"from_date":1714514400,"to_date":1725141599},"trigger":{"include_pages":[{"url":"https://www.kamera-express.nl/sony","type":"contains"},{"url":"https://www.kamera-express.nl/canon","type":"contains"},{"url":"https://www.kamera-express.nl/nikon","type":"contains"},{"url":"https://www.kamera-express.nl/bresser","type":"contains"},{"url":"https://www.kamera-express.nl/sigma","type":"contains"},{"url":"https://www.kamera-express.nl/panasonic","type":"contains"},{"url":"https://www.kamera-express.nl/fujifilm","type":"contains"},{"url":"https://www.kamera-express.nl/dji","type":"contains"},{"url":"https://www.kamera-express.nl/godox","type":"contains"}],"exclude_pages":[{"url":"/winkelwagen","type":"contains"},{"url":"/checkout","type":"contains"},{"url":"/login","type":"contains"},{"url":"registratie","type":"contains"},{"url":"google_ads","type":"contains"}]},"device_target":{"type":"any"},"frequency":"once_per_visit","uses_personalization":true,"data":"","variables_target":null,"page_vars":[]},{"_id":"6992fcc702ba6f509de2c041","date_filter":{"enabled":false,"from_date":1714514400,"to_date":1725141599},"trigger":{"include_pages":[{"url":"https://www.kamera-express.be/sony","type":"contains"},{"url":"https://www.kamera-express.be/canon","type":"contains"},{"url":"https://www.kamera-express.be/nikon","type":"contains"},{"url":"https://www.kamera-express.be/bresser","type":"contains"},{"url":"https://www.kamera-express.be/sigma","type":"contains"},{"url":"https://www.kamera-express.be/panasonic","type":"contains"},{"url":"https://www.kamera-express.be/fujifilm","type":"contains"},{"url":"https://www.kamera-express.be/dji","type":"contains"},{"url":"https://www.kamera-express.be/godox","type":"contains"}],"exclude_pages":[{"url":"/winkelwagen","type":"contains"},{"url":"/checkout","type":"contains"},{"url":"/login","type":"contains"},{"url":"registratie","type":"contains"},{"url":"google_ads","type":"contains"}]},"device_target":{"type":"any"},"frequency":"once_per_visit","uses_personalization":true,"data":"","variables_target":null,"page_vars":[]},{"_id":"699309eed426d0e7fc5dca9c","date_filter":{"enabled":false,"from_date":1714514400,"to_date":1725141599},"trigger":{"include_pages":[{"url":"https://www.kamera-express.de/sony","type":"contains"},{"url":"https://www.kamera-express.de/canon","type":"contains"},{"url":"https://www.kamera-express.de/nikon","type":"contains"},{"url":"https://www.kamera-express.de/bresser","type":"contains"},{"url":"https://www.kamera-express.de/sigma","type":"contains"},{"url":"https://www.kamera-express.de/panasonic","type":"contains"},{"url":"https://www.kamera-express.de/fujifilm","type":"contains"},{"url":"https://www.kamera-express.de/dji","type":"contains"},{"url":"https://www.kamera-express.de/godox","type":"contains"}],"exclude_pages":[{"url":"/warenkorb","type":"contains"},{"url":"/checkout","type":"contains"},{"url":"/einloggen","type":"contains"},{"url":"/registrieren","type":"contains"},{"url":"google_ads","type":"contains"}]},"device_target":{"type":"any"},"frequency":"once_per_visit","uses_personalization":true,"data":"","variables_target":null,"page_vars":[]},{"_id":"6993126971aa325dd843b845","date_filter":{"enabled":false,"from_date":1714514400,"to_date":1725141599},"trigger":{"include_pages":[{"url":"https://www.kamera-express.be/fr/sony","type":"contains"},{"url":"https://www.kamera-express.be/fr/canon","type":"contains"},{"url":"https://www.kamera-express.be/fr/nikon","type":"contains"},{"url":"https://www.kamera-express.be/fr/bresser","type":"contains"},{"url":"https://www.kamera-express.be/fr/sigma","type":"contains"},{"url":"https://www.kamera-express.be/fr/panasonic","type":"contains"},{"url":"https://www.kamera-express.be/fr/fujifilm","type":"contains"},{"url":"https://www.kamera-express.be/fr/dji","type":"contains"},{"url":"https://www.kamera-express.be/fr/godox","type":"contains"}],"exclude_pages":[{"url":"/panier","type":"contains"},{"url":"/checkout","type":"contains"},{"url":"/connecter","type":"contains"},{"url":"/registration","type":"contains"},{"url":"google_ads","type":"contains"}]},"device_target":{"type":"any"},"frequency":"once_per_visit","uses_personalization":true,"data":"","variables_target":null,"page_vars":[]},{"_id":"699318915393d9353008b436","date_filter":{"enabled":false,"from_date":1714514400,"to_date":1725141599},"trigger":{"include_pages":[{"url":"https://www.kamera-express.fr/sony","type":"contains"},{"url":"https://www.kamera-express.fr/canon","type":"contains"},{"url":"https://www.kamera-express.fr/nikon","type":"contains"},{"url":"https://www.kamera-express.fr/bresser","type":"contains"},{"url":"https://www.kamera-express.fr/sigma","type":"contains"},{"url":"https://www.kamera-express.fr/panasonic","type":"contains"},{"url":"https://www.kamera-express.fr/fujifilm","type":"contains"},{"url":"https://www.kamera-express.fr/dji","type":"contains"},{"url":"https://www.kamera-express.fr/godox","type":"contains"}],"exclude_pages":[{"url":"/panier","type":"contains"},{"url":"/checkout","type":"contains"},{"url":"/connecter","type":"contains"},{"url":"/registration","type":"contains"},{"url":"google_ads","type":"contains"}]},"device_target":{"type":"any"},"frequency":"once_per_visit","uses_personalization":true,"data":"","variables_target":null,"page_vars":[]},{"_id":"699319a676cec48f04f50c87","date_filter":{"enabled":false,"from_date":1714514400,"to_date":1725141599},"trigger":{"include_pages":[{"url":"https://www.kamera-express.lu/sony","type":"contains"},{"url":"https://www.kamera-express.lu/canon","type":"contains"},{"url":"https://www.kamera-express.lu/nikon","type":"contains"},{"url":"https://www.kamera-express.lu/bresser","type":"contains"},{"url":"https://www.kamera-express.lu/sigma","type":"contains"},{"url":"https://www.kamera-express.lu/panasonic","type":"contains"},{"url":"https://www.kamera-express.lu/fujifilm","type":"contains"},{"url":"https://www.kamera-express.lu/dji","type":"contains"},{"url":"https://www.kamera-express.lu/godox","type":"contains"}],"exclude_pages":[{"url":"/panier","type":"contains"},{"url":"/checkout","type":"contains"},{"url":"/connecter","type":"contains"},{"url":"/registration","type":"contains"},{"url":"google_ads","type":"contains"}]},"device_target":{"type":"any"},"frequency":"once_per_visit","uses_personalization":true,"data":"","variables_target":null,"page_vars":[]},{"_id":"69931ab2986f0e65cb996a71","date_filter":{"enabled":false,"from_date":1714514400,"to_date":1725141599},"trigger":{"include_pages":[{"url":"https://www.kamera-express.lu/de/sony","type":"contains"},{"url":"https://www.kamera-express.lu/de/canon","type":"contains"},{"url":"https://www.kamera-express.lu/de/nikon","type":"contains"},{"url":"https://www.kamera-express.lu/de/bresser","type":"contains"},{"url":"https://www.kamera-express.lu/de/sigma","type":"contains"},{"url":"https://www.kamera-express.lu/de/panasonic","type":"contains"},{"url":"https://www.kamera-express.lu/de/fujifilm","type":"contains"},{"url":"https://www.kamera-express.lu/de/dji","type":"contains"},{"url":"https://www.kamera-express.lu/de/godox","type":"contains"}],"exclude_pages":[{"url":"/warenkorb","type":"contains"},{"url":"/checkout","type":"contains"},{"url":"/einloggen","type":"contains"},{"url":"/registrieren","type":"contains"},{"url":"google_ads","type":"contains"}]},"device_target":{"type":"any"},"frequency":"once_per_visit","uses_personalization":true,"data":"","variables_target":null,"page_vars":[]},{"_id":"69957275531a53fcf92e5f9a","date_filter":{"enabled":false,"from_date":1714514400,"to_date":1725141599},"trigger":{"include_pages":[{"url":"https://www.foto-gregor.de/sony","type":"contains"},{"url":"https://www.foto-gregor.de/canon","type":"contains"},{"url":"https://www.foto-gregor.de/nikon","type":"contains"},{"url":"https://www.foto-gregor.de/bresser","type":"contains"},{"url":"https://www.foto-gregor.de/sigma","type":"contains"},{"url":"https://www.foto-gregor.de/panasonic","type":"contains"},{"url":"https://www.foto-gregor.de/fujifilm","type":"contains"},{"url":"https://www.foto-gregor.de/dji","type":"contains"},{"url":"https://www.foto-gregor.de/godox","type":"contains"}],"exclude_pages":[{"url":"/warenkorb","type":"contains"},{"url":"/checkout","type":"contains"},{"url":"/einloggen","type":"contains"},{"url":"/registrieren","type":"contains"},{"url":"google_ads","type":"contains"}]},"device_target":{"type":"any"},"frequency":"once_per_visit","uses_personalization":true,"data":"","variables_target":null,"page_vars":[]},{"_id":"69957d2ee98e070a8e4b7c2d","date_filter":{"enabled":false,"from_date":1714514400,"to_date":1725141599},"trigger":{"include_pages":[{"url":"https://www.photospecialist.fr/sony","type":"contains"},{"url":"https://www.photospecialist.fr/canon","type":"contains"},{"url":"https://www.photospecialist.fr/nikon","type":"contains"},{"url":"https://www.photospecialist.fr/bresser","type":"contains"},{"url":"https://www.photospecialist.fr/sigma","type":"contains"},{"url":"https://www.photospecialist.fr/panasonic","type":"contains"},{"url":"https://www.photospecialist.fr/fujifilm","type":"contains"},{"url":"https://www.photospecialist.fr/dji","type":"contains"},{"url":"https://www.photospecialist.fr/godox","type":"contains"}],"exclude_pages":[{"url":"/panier","type":"contains"},{"url":"/checkout","type":"contains"},{"url":"/connecter","type":"contains"},{"url":"/registration","type":"contains"},{"url":"google_ads","type":"contains"}]},"device_target":{"type":"any"},"frequency":"once_per_visit","uses_personalization":true,"data":"","variables_target":null,"page_vars":[]},{"_id":"6995b8d3e52a365974f4bb4b","date_filter":{"enabled":false,"from_date":1714514400,"to_date":1725141599},"trigger":{"include_pages":[{"url":"https://www.photogalerie.com/sony","type":"contains"},{"url":"https://www.photogalerie.com/canon","type":"contains"},{"url":"https://www.photogalerie.com/nikon","type":"contains"},{"url":"https://www.photogalerie.com/bresser","type":"contains"},{"url":"https://www.photogalerie.com/sigma","type":"contains"},{"url":"https://www.photogalerie.com/panasonic","type":"contains"},{"url":"https://www.photogalerie.com/fujifilm","type":"contains"},{"url":"https://www.photogalerie.com/dji","type":"contains"},{"url":"https://www.photogalerie.com/godox","type":"contains"}],"exclude_pages":[{"url":"/panier","type":"contains"},{"url":"/checkout","type":"contains"},{"url":"/connecter","type":"contains"},{"url":"/registration","type":"contains"},{"url":"google_ads","type":"contains"}]},"device_target":{"type":"any"},"frequency":"once_per_visit","uses_personalization":true,"data":"","variables_target":null,"page_vars":[]},{"_id":"69ca7020e11834ffa1495b52","date_filter":{"enabled":false,"from_date":null,"to_date":null},"trigger":{"include_pages":[{"url":"?marlena","type":"contains"}],"exclude_pages":[{"url":"test-new-recos=true","type":"contains"}]},"device_target":{"type":"any"},"frequency":"always","uses_personalization":true,"data":"","variables_target":null,"page_vars":[]}],"experiments":[{"_id":"66d5985c867c79984b0f8a4e","date_filter":{"enabled":true,"from_date":1725141600,"to_date":1727042399},"trigger":{"include_pages":[{"url":"https://www.kamera-express.nl/","type":"contains"}],"exclude_pages":null},"trigger_event":{"type":"page_load"},"device_target":{"type":"any"},"frequency":"always","variables_target":null,"page_vars":[]},{"_id":"678791281e7adb95aa67b7bc","date_filter":{"enabled":false,"from_date":null,"to_date":null},"trigger":{"include_pages":[{"url":"https://www.kamera-express.nl/zoomlens","type":"exact"},{"url":"https://www.kamera-express.nl/prime-lens","type":"exact"},{"url":"https://www.kamera-express.nl/groothoek","type":"exact"},{"url":"https://www.kamera-express.nl/fisheye-lens","type":"exact"},{"url":"https://www.kamera-express.nl/fisheye-lens","type":"exact"},{"url":"https://www.kamera-express.nl/macro-lens","type":"exact"},{"url":"https://www.kamera-express.nl/macro-lens","type":"exact"},{"url":"https://www.kamera-express.nl/telelens","type":"exact"},{"url":"https://www.kamera-express.nl/spiegellens","type":"exact"},{"url":"https://www.kamera-express.nl/tilt-shift","type":"exact"},{"url":"https://www.kamera-express.nl/video-objectief","type":"exact"}],"exclude_pages":null},"trigger_event":{"type":"page_load"},"device_target":{"type":"any"},"frequency":"always","variables_target":{"conditions":[{"attribute":{"id":"684c45c5f0f60525b1f460ae","type":"page_variable"},"constraint":{"operands":[{"type":"constant","value":"true"}],"operator":"equals","type":"string"}}]},"page_vars":[]},{"_id":"6836edd4be33ebf090c5e9bc","date_filter":{"enabled":true,"from_date":null,"to_date":1748541600},"trigger":{"include_pages":[{"url":"https://www.kamera-express.nl/winkels","type":"exact"}],"exclude_pages":null},"trigger_event":{"type":"page_load"},"device_target":{"type":"any"},"frequency":"always","variables_target":null,"page_vars":[]},{"_id":"68b7fd8ca993049e76973f2a","date_filter":{"enabled":true,"from_date":null,"to_date":1759787999},"trigger":{"include_pages":[{"url":"kamera-express.de","type":"contains"},{"url":"foto-gregor.de","type":"contains"}],"exclude_pages":null},"trigger_event":{"type":"page_load"},"device_target":{"type":"any"},"frequency":"always","variables_target":{"conditions":[{"attribute":{"id":"684c45c5f0f60525b1f460ae","type":"page_variable"},"constraint":{"operands":[{"type":"constant","value":"true"}],"operator":"equals","type":"string"}}]},"page_vars":[]},{"_id":"68d11c4661ae9a4674f63b35","date_filter":{"enabled":true,"from_date":null,"to_date":1759183199},"trigger":{"include_pages":[{"url":"kamera-express.nl/winkelwagen","type":"contains"}],"exclude_pages":null},"trigger_event":{"type":"page_load"},"device_target":{"type":"any"},"frequency":"always","variables_target":{"conditions":[{"attribute":{"id":"684c45c5f0f60525b1f460ae","type":"page_variable"},"constraint":{"operands":[{"type":"constant","value":"true"}],"operator":"equals","type":"string"}}]},"page_vars":[]},{"_id":"697a25c0d8502e18064b0a48","date_filter":{"enabled":true,"from_date":null,"to_date":null},"trigger":{"include_pages":[{"url":"kamera-express.nl/winkelwagen","type":"contains"},{"url":"kamera-express.nl/checkout","type":"contains"}],"exclude_pages":null},"trigger_event":{"type":"page_load"},"device_target":{"type":"any"},"frequency":"always","variables_target":{"conditions":[{"attribute":{"id":"684c45c5f0f60525b1f460ae","type":"page_variable"},"constraint":{"operands":[{"type":"constant","value":"true"}],"operator":"equals","type":"string"}}]},"page_vars":[]},{"_id":"697b454c27d50458c5d95119","date_filter":{"enabled":true,"from_date":null,"to_date":null},"trigger":{"include_pages":[{"url":"kamera-express.nl/checkout","type":"contains"}],"exclude_pages":[{"url":"kamera-express.nl/checkout-registratie","type":"contains"}]},"trigger_event":{"type":"page_load"},"device_target":{"type":"any"},"frequency":"always","variables_target":{"conditions":[{"attribute":{"id":"684c45c5f0f60525b1f460ae","type":"page_variable"},"constraint":{"operands":[{"type":"constant","value":"true"}],"operator":"equals","type":"string"}}]},"page_vars":[]},{"_id":"69a6d9bbb4a9b52c9202feba","date_filter":{"enabled":false,"from_date":null,"to_date":null},"trigger":{"include_pages":[{"url":"https://www.kamera-express.de/alle-gebrauchtartikel","type":"contains"}],"exclude_pages":null},"trigger_event":{"type":"page_load"},"device_target":{"type":"mobile"},"frequency":"always","variables_target":null,"page_vars":[]},{"_id":"69a6f3a987580ae6b75a69ce","date_filter":{"enabled":false,"from_date":null,"to_date":null},"trigger":{"include_pages":[{"url":"https://www.kamera-express.nl/systeemcamera","type":"contains"}],"exclude_pages":null},"trigger_event":{"type":"page_load"},"device_target":{"type":"any"},"frequency":"always","variables_target":null,"page_vars":[]},{"_id":"69a7e4d4ad4c9875bb9eb8b6","date_filter":{"enabled":false,"from_date":null,"to_date":null},"trigger":{"include_pages":[{"url":"https://www.kamera-express.nl/compact-camera","type":"contains"}],"exclude_pages":null},"trigger_event":{"type":"page_load"},"device_target":{"type":"any"},"frequency":"always","variables_target":null,"page_vars":[]},{"_id":"69a8295fc1d37e7ba3ede448","date_filter":{"enabled":false,"from_date":null,"to_date":null},"trigger":{"include_pages":[{"url":"https://www.kamera-express.nl/alle-tweedehands-cameras","type":"contains"}],"exclude_pages":null},"trigger_event":{"type":"page_load"},"device_target":{"type":"any"},"frequency":"always","variables_target":null,"page_vars":[]},{"_id":"69a83b286aa5fd227052ea6a","date_filter":{"enabled":false,"from_date":null,"to_date":null},"trigger":{"include_pages":[{"url":"https://www.kamera-express.nl/alle-objectieven","type":"contains"},{"url":"https://www.kamera-express.nl/prime-lens","type":"contains"},{"url":"https://www.kamera-express.nl/zoomlens","type":"contains"},{"url":"https://www.kamera-express.nl/groothoek","type":"contains"},{"url":"https://www.kamera-express.nl/fisheye-lens","type":"contains"},{"url":"https://www.kamera-express.nl/macro-lens","type":"contains"},{"url":"https://www.kamera-express.nl/telelens","type":"contains"},{"url":"https://www.kamera-express.nl/spiegellens","type":"contains"},{"url":"https://www.kamera-express.nl/tilt-shift","type":"contains"},{"url":"https://www.kamera-express.nl/cine-lenzen","type":"contains"}],"exclude_pages":null},"trigger_event":{"type":"page_load"},"device_target":{"type":"any"},"frequency":"always","variables_target":null,"page_vars":[]},{"_id":"69b2ab9e286da3cd5c4c69e6","date_filter":{"enabled":false,"from_date":null,"to_date":null},"trigger":{"include_pages":[{"url":"kamera-express.nl/systeemcamera","type":"contains"}],"exclude_pages":null},"trigger_event":{"type":"page_load"},"device_target":{"type":"any"},"frequency":"always","variables_target":{"conditions":[{"attribute":{"id":"684c45c5f0f60525b1f460ae","type":"page_variable"},"constraint":{"operands":[{"type":"constant","value":"true"}],"operator":"equals","type":"string"}}]},"page_vars":[]},{"_id":"69ce25e3b7c03fe9105a0afd","date_filter":{"enabled":false,"from_date":null,"to_date":null},"trigger":{"include_pages":[{"url":"/tweedehands","type":"contains"},{"url":"/winkels","type":"contains"},{"url":"/systeemcamera","type":"contains"},{"url":"/compact-camera","type":"contains"},{"url":"/alle-tweedehands-cameras","type":"contains"},{"url":"/producten/fotocamera","type":"contains"},{"url":"/alle-objectieven","type":"contains"},{"url":"/zoomlens","type":"contains"},{"url":"/tweedehands-systeemcamera","type":"contains"},{"url":"/spiegelreflexcamera","type":"contains"},{"url":"/alle-tweedehands-objectieven","type":"contains"}],"exclude_pages":null},"trigger_event":{"type":"page_load"},"device_target":{"type":"any"},"frequency":"always","variables_target":null,"page_vars":[]},{"_id":"69de39d34fb4e1ea7b7e225f","date_filter":{"enabled":false,"from_date":null,"to_date":null},"trigger":{"include_pages":[{"url":"kamera-express.be/","type":"contains"}],"exclude_pages":[{"url":"kamera-express.be/fr","type":"contains"}]},"trigger_event":{"type":"page_load"},"device_target":{"type":"any"},"frequency":"always","variables_target":{"conditions":[{"attribute":{"id":"684c45c5f0f60525b1f460ae","type":"page_variable"},"constraint":{"operands":[{"type":"constant","value":"true"}],"operator":"equals","type":"string"}}]},"page_vars":[]}],"constantManagedTags":[{"uses_overlay":false,"type":"js","parametrized_definition":"// cart load \n// panier, winkelwagen, warenkorb, shoppingcart, carrito-de-compras, carrello-della-spesa\n\nconst getCookie = (name) =\u003e{\n  const value = `; ${document.cookie}`;\n  const parts = value.split(`; ${name}=`);\n  if (parts.length === 2) return parts.pop().split(';').shift();\n}\n\nconst checkout_success_pathnames = ['bedankt', 'merci', 'danke', 'gracias', 'grazie', 'thanks'];\n\nconst isInclude = (str, arr) =\u003e arr.some(item =\u003e str.includes(item));\n\nconst getData = () =\u003e {\n\tif(dataLayer) return dataLayer.filter(event =\u003e event.event === 'novuloEcommerce').pop();\n}\n\nconst getProductIds = (data) =\u003e {\n\tif(data) return data.ecommerce.purchase.products.map(elm =\u003e elm.id);\n}\n\nconst getTotalPrice = (data) =\u003e {\n\tif(data) return data.ecommerce.purchase.products.reduce((acc, item) =\u003e{ return acc + item.price; }, 0)\n}\n\nconst getTotalQty = (data) =\u003e {\n\tif(data) return data.ecommerce.purchase.products.reduce((acc, item) =\u003e{ return acc + item.quantity; }, 0)\n}\n\nconst getProductDetails = (data) =\u003e {\n\tif(data) return data.ecommerce.purchase.products.map(({brand, category, id, name, price, quantity, variant}) =\u003e ({\n\t\tbrand : brand,\n\t\tcategory : category,\n\t\titem_id : id,\n\t\ttitle : name,\n\t\ttotal_price : price,\n\t\tquantity : quantity,\n\t}));\n}\n\nconst defineLabel = (hostname) =\u003e {\n    if(hostname) {\n        if(hostname.includes('kamera-express')) return 'Kamera Express';\n        else if(hostname.includes('foto-gregor')) return 'Foto Gregor';\n        else if(hostname.includes('photogalerie')) return 'Photogalerie';\n        else if(hostname.includes('photospecialist')) return 'Photospecialist';\n    }\n    else {\n    \treturn '';\n    }\n}\n\nconst defineLocale = (language, country) =\u003e {\n\tif(language \u0026\u0026 country) return language + '_' + country.toUpperCase();\n}\n\nconst defineLanguage = () =\u003e {\n\tconst host = window.location.host;\n\tconst path = window.location.pathname;\n\tif(host.includes('kamera-express')){\n\t\tif((host.includes('.be') \u0026\u0026 !path.includes('/fr')) || host.includes('.nl')) return 'nl';\n\t\telse if((host.includes('.lu') \u0026\u0026 !path.includes('/de')) || host.includes('.fr') || (host.includes('.be') \u0026\u0026 path.includes('/fr') )) return 'fr';\n\t\telse if(host.includes('.lu') \u0026\u0026 path.includes('/de') || host.includes('.de')) return 'de';\n\t\t\n\t}\n\telse if(host.includes('photogalerie')){\n\t\treturn 'fr';\n\t}\n\telse if(host.includes('photospecialist')){\n\t\tif(host.includes('.uk') || host.includes('.com') || host.includes('.ie')) return 'en'\n\t\telse {\n\t\t\treturn host.split('.').pop();\n\t\t}\n\t\t\n\t}\n\telse if(host.includes('foto-gregor')){\n\t\treturn 'de'\n\t}\n};\n\nconst defineCountry = () =\u003e {\n\tconst host = window.location.host;\n\tif(host.split('.').pop() === 'uk') return 'gb';\n\tif(host.split('.').pop() === 'com' \u0026\u0026 host.includes('photogalerie')) return 'be';\n\tif(host.split('.').pop() === 'com' \u0026\u0026 host.includes('photospecialist')) return 'com';\n\treturn host.split('.').pop();\n\t\n}\n\nif(isInclude(window.location.pathname, checkout_success_pathnames)) {\n\tconst data = getData();\n\tconst country = defineCountry();\n\tconst language = defineLanguage();\n\tconst locale = defineLocale(language, country);\n\tif(data){\n\t\texponea.track('checkout_temp', {\n\t\t\tdomain : window.location.hostname,\n\t\t\taction : 'success',\n\t\t\titem_ids : getProductIds(data) ?? [],\n\t\t\titem_details : getProductDetails(data) ?? [],\n\t\t\ttotal_price : parseFloat(parseFloat(getTotalPrice(data)).toFixed(2)) ?? 0,\n\t\t\ttotal_qty : getTotalQty(data) ?? 0,\n\t\t\tpath : window.location.pathname,\n\t\t\tlabel : defineLabel(window.location.host),\n\t\t\tcountry : country,\n\t\t\temail : data?.customer?.email,\n\t\t\tpurchase_id : data?.ecommerce?.purchase?.actionField?.id,\n\t\t\tlanguage : language,\n\t\t\tlocale : defineLocale(language, country),\n\t\t\tcart_id : getCookie('n_shopping_cart') ?? ''\n\t\t})\n\t}\n}","trigger":{"include_pages":[{"url":"/bedankt","type":"contains"},{"url":"/merci","type":"contains"},{"url":"/danke","type":"contains"},{"url":"/gracias","type":"contains"},{"url":"/grazie","type":"contains"},{"url":"/thanks","type":"contains"}],"exclude_pages":null},"_id":"6554a4154daa6edb3d5416d7"},{"uses_overlay":false,"type":"js","parametrized_definition":"(function () {\n\t/* ---------- helpers ---------- */\n\n\tconst checkAvailability = () =\u003e {\n\t\tconst list_of_options = [\n\t\t\t'Vorübergehend ausverkauft',\n\t\t\t'Tijdelijk uitverkocht',\n\t\t\t'Epuisé temporairement',\n\t\t\t'Temporarily sold out',\n\t\t\t'Temporalmente agotado',\n\t\t\t'Temporaneamente esaurito'\n\t\t];\n\t\tconst node = document.querySelector('.buy-section-delivery-container');\n\t\tif (node) {\n\t\t\tconst status = node.getAttribute('status');\n\t\t\treturn !list_of_options.includes(status);\n\t\t}\n\t\treturn true;\n\t};\n\n\tconst getPageMetaProperty = (property) =\u003e {\n\t\treturn (\n\t\t\tdocument\n\t\t\t\t.querySelector('meta[data-hid=\"' + property + '\"]')\n\t\t\t\t?.getAttribute('content') ?? undefined\n\t\t);\n\t};\n\n\tconst getCategoryLevels = (level) =\u003e {\n\t\tif (!level) return '';\n\n\t\tconst container =\n\t\t\tdocument.querySelector('.breadcrumbs-container.page-breadcrumbs') ||\n\t\t\tdocument.querySelector('.breadcrumbs-container');\n\n\t\tif (!container) return '';\n\n\t\tconst items = Array.from(container.querySelectorAll('.breadcrumbs-item'))\n\t\t\t.map(el =\u003e (el.textContent || '').replace(/\\s+/g, ' ').trim())\n\t\t\t.filter(Boolean);\n\n\t\tconst categories = items.filter(t =\u003e t.toLowerCase() !== 'home');\n\t\treturn categories[level - 1] ?? '';\n\t};\n\n\tconst getCategoryLevelsNL = (level) =\u003e {\n\t\tif (level) {\n\t\t\treturn (\n\t\t\t\tdocument\n\t\t\t\t\t.querySelectorAll('.breadcrumbs-item')\n\t\t\t\t\t[level]?.getAttribute('data-testid')\n\t\t\t\t\t?.trim() ?? ''\n\t\t\t);\n\t\t}\n\t\treturn '';\n\t};\n\n\tconst getCategoryPath = () =\u003e {\n\t\tconst container =\n\t\t\tdocument.querySelector('.breadcrumbs-container.page-breadcrumbs') ||\n\t\t\tdocument.querySelector('.breadcrumbs-container');\n\n\t\tif (!container) return '';\n\n\t\tconst items = Array.from(container.querySelectorAll('.breadcrumbs-item'))\n\t\t\t.map(el =\u003e (el.textContent || '').replace(/\\s+/g, ' ').trim())\n\t\t\t.filter(Boolean);\n\n\t\tconst categories = items.filter(t =\u003e t.toLowerCase() !== 'home');\n\t\treturn categories.length ? categories.join('\u003e') : '';\n\t};\n\n\tconst getCategoryPathNL = () =\u003e {\n\t\tconst categories = document.querySelectorAll('.breadcrumbs-item');\n\t\tif (categories.length \u003e 0) {\n\t\t\tconst arr = [];\n\t\t\tcategories.forEach(el =\u003e {\n\t\t\t\tif (el.getAttribute('data-testid')) {\n\t\t\t\t\tarr.push(el.getAttribute('data-testid')?.trim());\n\t\t\t\t}\n\t\t\t});\n\t\t\tarr.shift();\n\t\t\treturn arr.join('\u003e');\n\t\t}\n\t\treturn [];\n\t};\n\n\tconst defineLabel = (hostname) =\u003e {\n\t\tif (!hostname) return '';\n\t\tif (hostname.includes('kamera-express')) return 'Kamera Express';\n\t\tif (hostname.includes('foto-gregor')) return 'Foto Gregor';\n\t\tif (hostname.includes('photogalerie')) return 'Photogalerie';\n\t\tif (hostname.includes('photospecialist')) return 'Photospecialist';\n\t\treturn '';\n\t};\n\n\tconst defineLocale = (language, country) =\u003e {\n\t\tif (language \u0026\u0026 country) return language + '_' + country.toUpperCase();\n\t};\n\n\tconst defineLanguage = () =\u003e {\n\t\tconst host = window.location.host;\n\t\tconst path = window.location.pathname;\n\n\t\tif (host.includes('kamera-express')) {\n\t\t\tif ((host.includes('.be') \u0026\u0026 !path.includes('/fr')) || host.includes('.nl')) return 'nl';\n\t\t\tif ((host.includes('.lu') \u0026\u0026 !path.includes('/de')) || host.includes('.fr') || (host.includes('.be') \u0026\u0026 path.includes('/fr'))) return 'fr';\n\t\t\tif ((host.includes('.lu') \u0026\u0026 path.includes('/de')) || host.includes('.de')) return 'de';\n\t\t}\n\n\t\tif (host.includes('photogalerie')) return 'fr';\n\n\t\tif (host.includes('photospecialist')) {\n\t\t\tif (host.includes('.uk') || host.includes('.com') || host.includes('.ie')) return 'en';\n\t\t\tif (host.includes('.at')) return 'de';\n\t\t\treturn host.split('.').pop();\n\t\t}\n\n\t\tif (host.includes('foto-gregor')) return 'de';\n\t};\n\n\tconst defineCountry = () =\u003e {\n\t\tconst host = window.location.host;\n\t\tconst tld = host.split('.').pop();\n\t\tif (tld === 'uk') return 'gb';\n\t\tif (tld === 'com' \u0026\u0026 host.includes('photogalerie')) return 'be';\n\t\tif (tld === 'com' \u0026\u0026 host.includes('photospecialist')) return 'com';\n\t\treturn tld;\n\t};\n\n\tconst getJsonData = () =\u003e {\n\t\tconst data = document.querySelector(\n\t\t\t'script[data-n-head=\"ssr\"][type=\"application/ld+json\"]'\n\t\t)?.text;\n\t\tif (data) return JSON.parse(data);\n\t};\n\n\t/* ---------- DO NOT CHANGE ---------- */\n\tconst trackEvent = () =\u003e {\n\t\tconst country = defineCountry();\n\t\tconst language = defineLanguage();\n\t\tconst locale = defineLocale(language, country);\n\t\tconst data = getJsonData();\n\n\t\tif (window.location) {\n\t\t\texponea.track('view_inspiration', {\n\t\t\t\tdomain: window.location.hostname,\n\t\t\t\ttitle: document.title,\n\t\t\t\turl: window.location.href,\n\t\t\t\tpath: window.location.pathname,\n\t\t\t\tcategory_path: getCategoryPath() ?? '',\n\t\t\t\tcategory_level_1: getCategoryLevels(1),\n\t\t\t\tcategory_level_2: getCategoryLevels(2),\n\t\t\t\tlabel: defineLabel(window.location.host),\n\t\t\t\tcountry: country,\n\t\t\t\tlanguage: language,\n\t\t\t\tlocale: locale\n\t\t\t});\n\t\t}\n\t};\n\n\t/* ---------- run (1s delay) ---------- */\n\tif (window.location.href.indexOf('inspiratie') \u003e -1) {\n\t\tsetTimeout(() =\u003e {\n\t\t\tif (window.jQuery) {\n\t\t\t\t$(document).ready(trackEvent);\n\t\t\t} else {\n\t\t\t\ttrackEvent();\n\t\t\t}\n\t\t}, 1000);\n\t}\n})();\n","trigger":{"include_pages":[{"url":"/inspiratie","type":"contains"}],"exclude_pages":[{"url":"https://www.kamera-express.nl/inspiratie","type":"exact"}]},"_id":"667c3438a7ffb051d53386e5"},{"uses_overlay":true,"type":"js","parametrized_definition":"/**\n * recommendationId: 590ae3bbsample03add10921\n * recommendationBlockCssSelector: #recommendations\n * emptyRecommendationsMessage: Nothing could be recommended for you! \n */\nvar styles = `\n\t.recommendationbox-pdp { border: 0px solid #f0f0f0; width:100%; padding:10px; }\n\t.pdp-reco {border-top:1px solid #f0f0f0; padding-top:3px;padding-bottom:3px;}\n`;\n\nvar styleSheet = document.createElement(\"style\");\nstyleSheet.textContent = styles;\ndocument.head.appendChild(styleSheet);\n\n// Define the trigger buttons\nconst nl_button = document.querySelector('[productstatus=\"Niet meer leverbaar\"]');\nconst fr_button = document.querySelector('[productstatus=\"Epuisé temporairement\"]');\nconst de_button = document.querySelector('[productstatus=\"Vorübergehend ausverkauft\"]');\n\n// Check if any of the buttons exist\nif (nl_button || fr_button || de_button) {\n    // Retrieve the current product's price from the page\n    var currentPriceText = document.querySelector(\"#buySection \u003e div \u003e div.price-container \u003e div.prices-container \u003e div.current-price-container.centered \u003e p \u003e span\").innerText;\n\n    // Convert the price text to a number (assuming the price is in the format \"€1.234,56\")\n    var currentPrice = parseFloat(currentPriceText.replace(/[^\\d,-]/g, '').replace(',', '.'));\n\n    // Function to determine the category based on price\n    function determineCategory(price) {\n        if (price \u003c 1000) {\n            return 'Low';\n        } else if (price \u003e= 1000 \u0026\u0026 price \u003c 2500) {\n            return 'Mid';\n        } else {\n            return 'High';\n        }\n    }\n\n    // Get the category based on the current price\n    var category = determineCategory(currentPrice);\n\n    // Define the price range based on the determined category\n    var lowerBound, upperBound;\n\n    function setPriceRange(category) {\n        switch (category) {\n            case 'Low':\n                lowerBound = currentPrice * 0.6;\n                upperBound = currentPrice * 3.5 ;\n                break;\n            case 'Mid':\n                lowerBound = currentPrice * 0.8;\n                upperBound = currentPrice * 1.8;\n                break;\n            case 'High':\n                lowerBound = currentPrice * 0.8;\n                upperBound = currentPrice * 5.0;\n                break;\n            default:\n                console.error('Unknown category: ' + category);\n                break;\n        }\n    }\n\n    // Set the price range based on the category\n    setPriceRange(category);\n\n    const getJsonitemData = () =\u003e {\n        const itemdata = document.querySelector('script[data-n-head=\"ssr\"][type=\"application/ld+json\"]')?.text;\n        if (itemdata) return JSON.parse(itemdata);\n    };\n\n    const itemdata = getJsonitemData();\n    var item_id = itemdata?.offers?.sku;\n\n    var options = {\n        recommendationId: \"66b617b51258a37cbc45e94c\",\n        callback: onRecommendationsLoaded,\n        size: 20,\n        items: { [item_id]: 1 },\n    };\n\n    const productWrapper = document.querySelector('.sf-gallery__stage');\n    const productImage = document.querySelector('.sf-image--wrapper');\n\n    function addOverlay() {\n        const overlay = document.createElement('div');\n        overlay.innerText = 'Niet meer leverbaar';\n        overlay.style.position = 'absolute';\n        overlay.style.top = '0';\n        overlay.style.fontFamily = 'Barlow';\n        overlay.style.left = '0';\n        overlay.style.width = '100%';\n        overlay.style.height = '100%';\n        overlay.style.backgroundColor = 'rgba(0, 0, 0, 0.2)';\n        overlay.style.display = 'flex';\n        overlay.style.justifyContent = 'center';\n        overlay.style.alignItems = 'center';\n        overlay.style.color = 'white';\n        overlay.style.fontSize = '24px';\n        overlay.style.pointerEvents = 'none';\n        overlay.classList.add('overlay');\n\n        productWrapper.style.position = 'relative';\n        productWrapper.appendChild(overlay);\n\n        productImage.style.filter = 'grayscale(100%)';\n        productImage.style.pointerEvents = 'none';\n    }\n\n    function generateStarsHTML(item) {\n        let starsHTML = '';\n\n        if (parseInt(item.amount_of_reviews) \u003e 1) {\n            if (parseInt(item.average_review_rating) \u003e 0.5) starsHTML += '\u0026#9733;';\n            if (parseInt(item.average_review_rating) \u003e 1.5) starsHTML += '\u0026#9733;';\n            if (parseInt(item.average_review_rating) \u003e 2.5) starsHTML += '\u0026#9733;';\n            if (parseInt(item.average_review_rating) \u003e 3.5) starsHTML += '\u0026#9733;';\n            if (parseInt(item.average_review_rating) \u003e 4.5) starsHTML += '\u0026#9733;';\n            starsHTML += `\u003cspan style=\"color:#2e2d2c; font-size:14px; font-family: 'Rubik', Arial, sans-serif;\"\u003e(${item.amount_of_reviews})\u003c/span\u003e`;\n        }\n\n        return `\n            \u003cdiv class=\"stars\" style=\"text-align:left; margin-left:10px; font-size:18px; color:#FFD339;\"\u003e\n                ${starsHTML}\n            \u003c/div\u003e\n        `;\n    }\n\n    function generateWobbler(item) {\n        if (item.text_wobbler \u0026\u0026 item.text_wobbler.length \u003e 0) {\n            return \"\u003cspan data-v-083af505='' data-v-400330c3='' class='sf-gallery-promotion promotion large sf-badge has-pointer' style='--badge-color: false; --badge-background: false;'\u003e \u003cspan data-v-083af505=''\u003e\" + item.text_wobbler + \"\u003c/span\u003e\u003c/span\u003e\";\n        } else {\n            return \"\";\n        }\n    }\n\n    function onRecommendationsLoaded(data) {\n        if (data \u0026\u0026 data.length \u003e 0) {\n            document.querySelector(\"#buySection \u003e div \u003e div.price-container\").innerText = '';\n            var element = document.querySelector(\"#buySection \u003e div\");\n\n            var div = document.createElement('div');\n\n            div.setAttribute('class', \"recommendationbox-pdp\");\n            element.innerHTML = '\u003cspan data-v-083af505=\"\" data-v-aee04296=\"\" class=\"not-available large sf-badge\" style=\"--badge-color: false; --badge-background: false;margin-bottom:5px;\"\u003e \u003cspan data-v-083af505=\"\"\u003eNiet meer leverbaar\u003c/span\u003e\u003c/span\u003eDit product is helaas niet meer leverbaar. Gelukkig hebben we enkele alternatieven voor jou weten te selecteren: \u003cbr/\u003e\u003cbr/\u003e';\n            element.appendChild(div);\n\n            var o = 0;\n\n            for (var i = 0; i \u003c data.length; i++) {\n                if (o == 2) {\n                    continue;\n                } else {\n\n                    var item = data[i];\n\n                    let cur_price = 0;\n                    let higher_msrp = \"0\";\n                    let is_cashback = \"0\";\n\n                    let suggested_retail_price = item.suggested_retail_price !== null ? parseInt(item.suggested_retail_price) : 0;\n                    let item_price = item.item_price !== null ? parseInt(item.item_price) : 0;\n                    let item_price_with_cashback = item.item_price_with_cashback !== null ? parseInt(item.item_price_with_cashback) : 0;\n\n                    if (suggested_retail_price \u003e item_price) {\n                        higher_msrp = \"1\";\n                    } else {\n                        higher_msrp = \"0\";\n                    }\n\n                    if (item_price_with_cashback \u003c 5) {\n                        cur_price = item_price;\n                    }\n\n                    if (item_price_with_cashback \u003e 5) {\n                        is_cashback = \"1\";\n                        cur_price = item_price_with_cashback;\n                    } else {\n                        is_cashback = \"0\";\n                    }\n\n                    const itemstars = {\n                        amount_of_reviews: item.amount_of_reviews !== null ? item.amount_of_reviews.toString() : '', \n                        average_review_rating: item.average_review_rating !== null ? item.average_review_rating.toString() : '' \n                    };\n\n                    let formattedPrice = new Intl.NumberFormat('nl-NL', {\n                        style: 'currency',\n                        currency: 'EUR',\n                        minimumFractionDigits: 2,\n                        maximumFractionDigits: 2\n                    }).format(cur_price);\n\n                    if (formattedPrice.endsWith(',00')) {\n                        formattedPrice = formattedPrice.slice(0, -3);\n                    }\n\n                    var itemPrice = parseFloat(cur_price);\n\n                    if (itemPrice \u003c lowerBound || itemPrice \u003e upperBound) {\n                        continue;\n                    } else { \n                        o = o + 1; \n                    }\n\n                    const starsHTML = generateStarsHTML(item);\n                    const redWobbler = generateWobbler(item);\n\n                    var innerDiv = document.createElement('div'),\n                        img = document.createElement('img'),\n                        a = document.createElement('a');\n\n                    img.id = item.item_id;\n                    img.setAttribute('width', 110);\n                    img.setAttribute('src', item.image);\n                    innerDiv.setAttribute('class', \"pdp-reco\");\n\n                    a.setAttribute('href', item.url);\n\n                    a.appendChild(img);\n\n                    var html = \"\u003ctable\u003e\u003ctr\u003e\u003ctd style='height:100px; position:relative'\u003e\u003ca href='\" + item.url + \"'\u003e\u003cimg width='100' src='\" + item.image + \"' href='\" + item.url + \"'\u003e\u003c/a\u003e\u003c/td\u003e\u003ctd width='20'\u003e\u0026nbsp;\u003c/td\u003e\u003ctd width='100%' valign='top' style='font-family:\\\"Barlow\\\", arial, sans-serif; font-size:16px; font-weight:400;margin-top:5px;'\u003e\u003ca href='\" + item.url + \"'\u003e\" + item.title + \" \u003c/a\u003e\u003cbr/\u003e\" + starsHTML + \"\u003cbr/\u003e\" + redWobbler + \"\u003ctable width='100%'\u003e\u003ctr\u003e \u003ctd align='left'\u003e\u003cbr/\u003e\u003cb\u003e\" + formattedPrice + \"\u003c/b\u003e\u003c/td\u003e \u003ctd align='right'\u003e\u003ca href='\" + item.url + \"'\u003e\u003cbutton data-v-75a5fd6c='' data-v-12098f7f='' style='float:right;font-size:14px;' class='add-review-button small-button sf-button'\u003eBekijk nu\u003c/button\u003e\u003c/a\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\";\n\n                    innerDiv.innerHTML = html;\n                    div.appendChild(innerDiv);\n                }\n            }\n        } else {\n            document.querySelector(\"#buySection \u003e div \").innerText = 'Dit product is niet meer leverbaar. Helaas hebben we geen geschikt alternatief voor je kunnen vinden.';\n        }\n    }\n\n    exponea.getRecommendation(options);\n\n    addOverlay();\n}","trigger":{"include_pages":[{"url":"https://www.kamera-express.nl/","type":"contains"}],"exclude_pages":[{"url":"https://www.kamera-express.nl/checkout","type":"contains"},{"url":"https://www.kamera-express.nl/bedankt/thank/you","type":"contains"},{"url":"winkelwagen","type":"contains"},{"url":"account","type":"contains"}]},"_id":"66c36028ac1523ef598accba"},{"uses_overlay":false,"type":"js","parametrized_definition":"const checkAvailability = () =\u003e {\r\n\tconst list_of_options = ['Vorübergehend ausverkauft', 'Tijdelijk uitverkocht', 'Epuisé temporairement', 'Temporarily sold out', 'Temporalmente agotado', 'Temporaneamente esaurito'];\r\n\tconst node = document.querySelector('.buy-section-delivery-container')\r\n\tif(node){\r\n\t\tconst status = node.getAttribute('status')\r\n\t\treturn !list_of_options.includes(status) ? true : false\r\n\t}\r\n\treturn true\r\n}\r\n\r\nconst getPageMetaProperty = (property) =\u003e {\r\n\treturn document.querySelector('meta[data-hid=\"' + property + '\"]')?.getAttribute('content') ?? undefined;\r\n}\r\n\r\nconst getCategoryLevels = (level) =\u003e {\r\n\tif(level){\r\n\t\treturn document.querySelectorAll('body \u003e div.K1-header__breadcrumbs-container \u003e div \u003e ul \u003e li')[level].innerText ?? '';\r\n\t}\r\n\treturn '';\r\n}\r\n\r\nconst getCategoryLevelsNL = (level) =\u003e {\r\n\tif(level){\r\n\t\treturn document.querySelectorAll('.breadcrumbs-item')[level]?.getAttribute('data-testid')?.trim() ?? '';\r\n\t}\r\n\treturn '';\r\n}\r\n\r\nconst getCategoryPath = () =\u003e {\r\n\tconst categories = document.querySelectorAll('body \u003e div.K1-header__breadcrumbs-container \u003e div \u003e ul \u003e li');\r\n\tif(categories.length \u003e 0) {\r\n\t\tconst categories_array = [];\r\n\t\tcategories.forEach(element =\u003e {\r\n\t\t\tcategories_array.push(element.textContent?.trim())\r\n\t\t})\r\n\t\tcategories_array.shift();\r\n\t\treturn categories_array.join('\u003e')\r\n\t}\r\n\telse {\r\n\t\treturn [];\r\n\t}\r\n}\r\n\r\nconst getCategoryPathNL = () =\u003e {\r\n\tconst categories = document.querySelectorAll('.breadcrumbs-item');\r\n\tif(categories.length \u003e 0) {\r\n\t\tconst categories_array = [];\r\n\t\tcategories.forEach(element =\u003e {\r\n\t\t\tif(element.getAttribute('data-testid')) categories_array.push(element.getAttribute('data-testid')?.trim())\r\n\t\t})\r\n\t\tcategories_array.shift();\r\n\t\treturn categories_array.join('\u003e')\r\n\t}\r\n\telse {\r\n\t\treturn [];\r\n\t}\r\n}\r\n\r\n\r\nconst defineLabel = (hostname) =\u003e {\r\n    if(hostname) {\r\n        if(hostname.includes('kamera-express')) return 'Kamera Express';\r\n        else if(hostname.includes('foto-gregor')) return 'Foto Gregor';\r\n        else if(hostname.includes('photogalerie')) return 'Photogalerie';\r\n        else if(hostname.includes('photospecialist')) return 'Photospecialist';\r\n    }\r\n    else {\r\n    \treturn '';\r\n    }\r\n}\r\n\r\nconst defineLocale = (language, country) =\u003e {\r\n\tif(language \u0026\u0026 country) return language + '_' + country.toUpperCase();\r\n}\r\n\r\nconst defineLanguage = () =\u003e {\r\n\tconst host = window.location.host;\r\n\tconst path = window.location.pathname;\r\n\tif(host.includes('kamera-express')){\r\n\t\tif((host.includes('.be') \u0026\u0026 !path.includes('/fr')) || host.includes('.nl')) return 'nl';\r\n\t\telse if((host.includes('.lu') \u0026\u0026 !path.includes('/de')) || host.includes('.fr') || (host.includes('.be') \u0026\u0026 path.includes('/fr') )) return 'fr';\r\n\t\telse if(host.includes('.lu') \u0026\u0026 path.includes('/de') || host.includes('.de')) return 'de';\r\n\t\t\r\n\t}\r\n\telse if(host.includes('photogalerie')){\r\n\t\treturn 'fr';\r\n\t}\r\n\telse if(host.includes('photospecialist')){\r\n\t\tif(host.includes('.uk') || host.includes('.com') || host.includes('.ie')) return 'en'\r\n\t\telse if(host.includes('at')) return 'de';\r\n\t\telse {\r\n\t\t\treturn host.split('.').pop();\r\n\t\t}\r\n\t\t\r\n\t}\r\n\telse if(host.includes('foto-gregor')){\r\n\t\treturn 'de'\r\n\t}\r\n};\r\n\r\nconst defineCountry = () =\u003e {\r\n\tconst host = window.location.host;\r\n\tif(host.split('.').pop() === 'uk') return 'gb';\r\n\tif(host.split('.').pop() === 'com' \u0026\u0026 host.includes('photogalerie')) return 'be';\r\n\tif(host.split('.').pop() === 'com' \u0026\u0026 host.includes('photospecialist')) return 'com';\r\n\treturn host.split('.').pop();\r\n\t\r\n};\r\n\r\nconst getJsonData = () =\u003e {\r\n\tconst data = document.querySelector('script[data-n-head=\"ssr\"][type=\"application/ld+json\"]')?.text;\r\n\tif(data) return JSON.parse(data);\r\n};\r\n\r\n\t\r\n\tconst trackEvent = () =\u003e {\r\n\t\tconst country = defineCountry();\r\n\t\tconst language = defineLanguage();\r\n\t\tconst locale = defineLocale(language, country);\r\n\t\tconst data = getJsonData();\r\n\t\tif(window.location){\r\n\t\t\texponea.track('view_inspiration', {\r\n\t\t\tdomain : window.location.hostname,\r\n\t\t\ttitle : document.title,\r\n\t//\t\tbrand: data?.brand?.name ?? '',\r\n\t\t\turl : window.location.href,\r\n\t//\t\timage : data?.image,\r\n\t\t\tpath : window.location.pathname,\r\n\t\t\tcategory_path : getCategoryPath() ?? '',\r\n\t\t\tcategory_level_1 : getCategoryLevels(1),\r\n\t\t\tcategory_level_2 : getCategoryLevels(2),\r\n\t//\t\ttitle_nl : getCategoryLevelsNL(3),\r\n\t//\t\tcategory_path_nl : getCategoryPathNL() ?? '',\r\n\t//\t\tcategory_level_1_nl : getCategoryLevelsNL(2),inde\r\n\t//\t\tcategory_level_2_nl : getCategoryLevelsNL(3),\r\n\t\t\tlabel : defineLabel(window.location.host),\r\n\t\t\tcountry : country,\r\n\t\t\tlanguage : language,\r\n\t\t\tlocale : locale\r\n\t\t});\r\n\t\t}\r\n\t};\r\n\t\r\n\tconst trackEventNoCat = () =\u003e {\r\n\t\tconst country = defineCountry();\r\n\t\tconst language = defineLanguage();\r\n\t\tconst locale = defineLocale(language, country);\r\n\t\tconst data = getJsonData();\r\n\t\tif(window.location){\r\n\t\t\texponea.track('view_inspiration', {\r\n\t\t\tdomain : window.location.hostname,\r\n\t\t\ttitle : document.title,\r\n\t//\t\tbrand: data?.brand?.name ?? '',\r\n\t\t\turl : window.location.href,\r\n\t//\t\timage : data?.image,\r\n\t\t\tpath : window.location.pathname,\r\n\t\t\tcategory_path : '',\r\n\t\t\tcategory_level_1 : '',\r\n\t\t\tcategory_level_2 : '',\r\n\t//\t\ttitle_nl : getCategoryLevelsNL(3),\r\n\t//\t\tcategory_path_nl : getCategoryPathNL() ?? '',\r\n\t//\t\tcategory_level_1_nl : getCategoryLevelsNL(2),inde\r\n\t//\t\tcategory_level_2_nl : getCategoryLevelsNL(3),\r\n\t\t\tlabel : defineLabel(window.location.host),\r\n\t\t\tcountry : country,\r\n\t\t\tlanguage : language,\r\n\t\t\tlocale : locale\r\n\t\t});\r\n\t\t}\r\n\t};\r\n\r\n\r\nconst keywords = [ \"interview\", \"entretien\", \"intervista\", \"expert\", \"experts\", \"experten\", \"experti\", \"meet\", \"ontmoet\",\r\n        \"rencontrez\", \"triff\", \"conozca\", \"tips\", \"conseils\", \"ratschläge\", \"ambassadeur\", \"ambassador\",\r\n        \"botschafter\", \"rencontrer\", \"treffen\"];\r\n\r\nfunction checkUrlForKeywords() {\r\n    const url = window.location.href;\r\n    const containsKeyword = keywords.some(keyword =\u003e url.includes(keyword));\r\n    if (containsKeyword) {\r\n        const event = new Event('keywordFound');\r\n        window.dispatchEvent(event);\r\n    }\r\n}\r\n\r\nwindow.addEventListener('keywordFound', () =\u003e {\r\n    trackEventNoCat();\r\n});\r\n\r\nwindow.addEventListener('load', checkUrlForKeywords);","trigger":{"include_pages":[{"url":"interview","type":"contains"},{"url":"entretien","type":"contains"},{"url":"intervista","type":"contains"},{"url":"expert","type":"contains"},{"url":"ontmoet","type":"contains"},{"url":"rencontrez","type":"contains"},{"url":"triff","type":"contains"},{"url":"conozca","type":"contains"},{"url":"tips","type":"contains"},{"url":"conseils","type":"contains"},{"url":"ratschläge","type":"contains"},{"url":"ambassadeur","type":"contains"},{"url":"ambassador","type":"contains"},{"url":"botschafter","type":"contains"},{"url":"rencontrer","type":"contains"},{"url":"treffen","type":"contains"},{"url":"fotografie","type":"contains"},{"url":"experts","type":"contains"},{"url":"experti","type":"contains"}],"exclude_pages":[{"url":"/inspiratie","type":"contains"}]},"_id":"671ba54b5e0546a5f3604956"},{"uses_overlay":true,"type":"js","parametrized_definition":"// Voeg stijlen toe voor de aanbevelingsbox en overlay\nconst styles = `.ab-rating span{display:block;height:100%;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAAANCAMAAAAJ3xm2AAAAflBMVEX/////0zn///v//vj/0zf/1Ub/1kv/+eX/5I3//PH/+uv/11T/1EH//fT/8s7/1D3/9t3/6qr/55r/2V//11D/+ej/78T/8Mn/7r3/7Lb/4H3/33b/3m7/2Fn/+u3/67H/6ab/5pX/5In/9NX/6KH/9t//8MP/2mf/2mT/0i8kV9qPAAABPUlEQVQ4y32T2ZqCMAxGky5QdmQTFVBcZnn/FxyhbbRO9b/r4TT9khbQqcBNvHsBV+ausw18AqHowYka3QJT8VKgCvgncMbaKdCiODr6jI1TIErxBG8BKwWK3dMGrhCTiD2EsEDcPAsVooyZF5TXoUkRsQh+5vxOWH8eA7xHJofNtIzjpAUMarVdhC9Vk9DCPxBKtCnydfxIqbPlfoIH6BbhiJQk8gDakF4AnO/fXI+ncQ4E6K0wZl4QSa3fwGQnVjDYGWWNFi5W6EwD/A0Y1tXj2ktdcAabve4goleGa87wBqAOFcxNx+SnGkx0ohkY+EH8K8b8IAR1dEJRdQU2tuVIiCbfC9zSTFCorcSU+0GeLM+lPNDvN8wtAO9lZs8Pludy2ysagQoBWCdjP5iYGQSYGI/TpbwKrRG4B/wBeqgQ6mCzYZwAAAAASUVORK5CYII=)}.ab-rating{width:80px;height:13px;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAAANBAMAAADML/S3AAAAMFBMVEX////a2tr8/Pzr6+vv7+/29vb4+Pjd3d3z8/Pc3Nzi4uLf39/m5ubo6Ojk5OTh4eFXKiHAAAABI0lEQVQoz0XOvUoDURAF4ONudgnRBA9JXH8gXFEQrFbRWpPGxsJUipViZRdTW+wTiKkFUaysDNqkNJW1IKYWfAB/XiBzdwYyzcfuzJm5kDqCVmjGuypSc9V8MtuZOtO3QE3FSIloA182cFqzQGIB6ol1/llgPjcYLjkN2ECZXX//jeRlC9FOj7zZBvYvyIVvh7NH8SVDcSSN2xYq9HWHOLcODL2y89zLDGHuszYagDYOgFCDCHoaxIYGURZfoY05aKPhXdMgChpEkdRH/5Idb5usekvyRidGJFNMNkKc9TbJRe8USWeb+mKFW/wRYw7u6yLeq83Eu5xc5adDfvBanN7ESscHB4geRPy7YM+JhxmOU7H0iUJXDAA4M4Z+BCZOYD8xBhhyNtl9yoFfAAAAAElFTkSuQmCC)}.ab-rating-hidden{opacity:0}.ab-rating{width:80px;height:13px;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAAANBAMAAADML/S3AAAAMFBMVEX////a2tr8/Pzr6+vv7+/29vb4+Pjd3d3z8/Pc3Nzi4uLf39/m5ubo6Ojk5OTh4eFXKiHAAAABI0lEQVQoz0XOvUoDURAF4ONudgnRBA9JXH8gXFEQrFbRWpPGxsJUipViZRdTW+wTiKkFUaysDNqkNJW1IKYWfAB/XiBzdwYyzcfuzJm5kDqCVmjGuypSc9V8MtuZOtO3QE3FSIloA182cFqzQGIB6ol1/llgPjcYLjkN2ECZXX//jeRlC9FOj7zZBvYvyIVvh7NH8SVDcSSN2xYq9HWHOLcODL2y89zLDGHuszYagDYOgFCDCHoaxIYGURZfoY05aKPhXdMgChpEkdRH/5Idb5usekvyRidGJFNMNkKc9TbJRe8USWeb+mKFW/wRYw7u6yLeq83Eu5xc5adDfvBanN7ESscHB4geRPy7YM+JhxmOU7H0iUJXDAA4M4Z+BCZOYD8xBhhyNtl9yoFfAAAAAElFTkSuQmCC)}.ab-rating-wrapper{margin-bottom:1rem;display:flex;align-items:center;justify-content:flex-start;gap:.5rem}.ab-rating-votes{font-weight:500;font-size:14px;color:#646363}.pdp-reco{display:flex;align-items:center;justify-content:space-between;border:1px solid #f0f0f0;padding:15px;margin-bottom:-1px;border-radius:5px;background-color:#fff;position:relative}.container-wrapper{display:flex;align-items:center;width:100%}.item-image{flex-shrink:0;}.item-image img{width:80px;height:80px;border-radius:5px;object-fit:cover}.item-info{max-width:47%;flex:1}.item-button{position:absolute;right:20px;top:50%;transform:translateY(-50%)}.orange-button{height:40px;padding:8px 24px;color:#fff;background-color:#ea580c;border:none;font-weight:700;border-radius:4px;font-family:Barlow,sans-serif;font-size:initial;cursor:pointer}.orange-button:hover{background-color:#cc4e0b}button.orange-button{height:40px;padding:8px 24px;color:#fff;background-color:#ea580c;border:none;font-weight:700;border-radius:4px;font-family:Barlow,sans-serif;font-size:initial}.recommendationbox-pdp{background-color:#fff;width:100%;padding:10px;margin-top:0px;border-radius:5px;}.pdp-reco{border: 1px solid #f0f0f0;padding:15px 10px;display:flex;align-items:center}.pdp-reco img{border-radius:5px;margin-right:15px;width:80px;height:80px;object-fit:cover}.pdp-reco p{margin:0;font-size:18px;line-height:1.5;color:#333}.pdp-reco .price{font-weight:700;font-size:20px;color:#000}.overlay{color:#fff;z-index:49;background-color:rgba(0,0,0,0.5);position:absolute;top:0;left:0;width:100%;height:inherit;display:flex;justify-content:center;align-items:center;font-size:24px;font-family:Barlow,sans-serif;pointer-events:none;}@media only screen and (max-width: 767px){}@media only screen and (max-width: 767px){.overlay{height:100%}}`;\nconst styleSheet = document.createElement(\"style\");\nstyleSheet.textContent = styles;\ndocument.head.appendChild(styleSheet);\n \n// Fallback-afbeelding instellen\nconst FALLBACK_IMAGE_URL = \"https://www.kamera-express.nl/_nuxt/img/Kamera_Express_faded_logo.5b851ac.webp\"; // Vervang met de juiste URL\n\nfunction getValidImageUrl(imageUrl) {\n    return imageUrl \u0026\u0026 imageUrl.length \u003e= 32 ? imageUrl : FALLBACK_IMAGE_URL;\n} \n\n \n// Controleer productstatus\nconst nlButton = document.querySelector('[productstatus=\"Niet meer leverbaar\"]');\nconst frButton = document.querySelector('[productstatus=\"Epuisé temporairement\"]');\nconst deButton = document.querySelector('[productstatus=\"Vorübergehend ausverkauft\"]');\n\nconst title = document.querySelector(\"#pdpIntro \u003e div \u003e h1\").innerText;\n \nif (nlButton || frButton || deButton) {\n    console.log(\"Product is niet meer leverbaar. Alternatieven laden...\");\n \n    // Prijs ophalen\n    const priceElement = document.querySelector(\"#buySection .current-price-container p span\");\n    if (!priceElement) {\n        console.error(\"Prijsselector niet gevonden!\");\n    } else {\n        const currentPriceText = priceElement.innerText;\n        const currentPrice = parseFloat(currentPriceText.replace(/[^\\d,-]/g, '').replace(',', '.'));\n \n        if (isNaN(currentPrice)) {\n            console.error(\"Kon prijs niet omzetten naar een geldig getal.\");\n        } else {\n            //console.log(`Huidige prijs: €${currentPrice}`);\n \n            // Prijscategorie bepalen\n            function determineCategory(price) {\n                if (price \u003c 1000) return 'Low';\n                if (price \u003c 2500) return 'Mid';\n                return 'High';\n            }\n \n            const category = determineCategory(currentPrice);\n           // console.log(`Categorie: ${category}`);\n \n            // Prijsbereik instellen\n            let lowerBound, upperBound;\n            switch (category) {\n                case 'Low':\n                    lowerBound = currentPrice * 0.6;\n                    upperBound = currentPrice * 3.0;\n                    break;\n                case 'Mid':\n                    lowerBound = currentPrice * 0.8;\n                    upperBound = currentPrice * 1.8;\n                    break;\n                case 'High':\n                    lowerBound = currentPrice * 0.8;\n                    upperBound = currentPrice * 5.0;\n                    break;\n            }\n           // console.log(`Prijsbereik: €${lowerBound.toFixed(2)} - €${upperBound.toFixed(2)}`);\n \n            // Overlay toevoegen\n            const productWrapper = document.querySelector('.sf-gallery__stage');\n            const productImage = document.querySelector('.sf-image--wrapper');\n \n            if (productWrapper \u0026\u0026 productImage) {\n                const overlay = document.createElement('div');\n                overlay.className = 'overlay';\n                overlay.innerText = 'Dit tweedehands product is reeds verkocht.';\n                // productWrapper.style.position = 'relative';\n                productWrapper.prepend(overlay);\n                // productImage.style.filter = 'grayscale(100%)';\n                // productImage.style.pointerEvents = 'none';\n            } else {\n                console.warn(\"Kon de productwrapper of -afbeelding niet vinden voor overlay.\");\n            }\n \n            // Haal itemgegevens op\n            const getJsonItemData = () =\u003e {\n                const itemData = document.querySelector('script[data-n-head=\"ssr\"][type=\"application/ld+json\"]')?.text;\n                return itemData ? JSON.parse(itemData) : null;\n            };\n            const itemData = getJsonItemData();\n            const itemId = itemData?.offers?.sku;\n            const prodTitleRaw = itemData?.name;\n            const prodTitle = prodTitleRaw.replace(\" occasion\", \"\");\n \n            if (!itemId) {\n                console.error(\"Kon item ID niet ophalen!\");\n            } else {\n              //  console.log(`Item ID: ${itemId}`);\n \n                // Exponea-aanroep instellen\n                const options = {\n                    recommendationId: \"675aac0ab8e5b3f2f6156dfb\",\n                    callback: onRecommendationsLoaded,\n                    size: 20,\n                    items: { [itemId]: 1 },\n                };\n \n                // Callbackfunctie voor aanbevelingen\n                function onRecommendationsLoaded(data) {\n               //     console.log(\"Aanbevelingen ontvangen:\", data);\n \n                    const buySection = document.querySelector(\"#buySection \u003e div\");\n                    if (!buySection) {\n                        console.error(\"BuySection niet gevonden!\");\n                        return;\n                    }\n\n                    buySection.innerHTML = \"\"; \n                    const recommendationsDiv = document.createElement('div');\n                    recommendationsDiv.className = \"icon-usp-label\";\n                    recommendationsDiv.innerHTML = `\n                        \u003cspan class=\"not-available large sf-badge\" data-v-083af505=\"\" data-v-aee04296=\"\" style=\"--badge-color: false; --badge-background: false;\"\u003e \u003cspan data-v-083af505=\"\"\u003e Niet meer leverbaar\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"h7\" style=\"display: block; font-size: 18px;\"\u003e\n\t\t\t\t\t\tDit tweedehands product is helaas al verkocht.\u003c/span\u003e`;\n                    buySection.appendChild(recommendationsDiv);\n\n \n                    let recommendationsShown = 0;\n                   //     console.log(\"occasion gevonden\");\n                        \n                        if (data \u0026\u0026 data.length \u003e 0) {\n                        \t\n                        \trecommendationsDiv.innerHTML += `Goed nieuws, we hebben nog andere tweedehands modellen van de ${prodTitle} beschikbaar. \u003cbr\u003e \u003cbr\u003e`;\n                        \t\n                            for (let item of data) {\n                            \t if (item.title_nl.includes(\"occasion\")) {\n                                const itemPrice = parseFloat(item.item_price_with_cashback || item.item_price || 0);\n                                const productRating = Math.round(100 * item.average_review_rating / 5);\n                                const ratingClass = productRating === 0 ? 'ab-rating-hidden' : '';\n \n                                if (itemPrice \u003e= lowerBound \u0026\u0026 itemPrice \u003c= upperBound) {\n                                    const itemDiv = document.createElement('div');\n                                    itemDiv.className = \"pdp-reco\";\n                                    itemDiv.innerHTML = `\n                                \u003cdiv class=\"container-wrapper\"\u003e\n                                    \u003cdiv class=\"item-image\"\u003e\n                                        \u003ca href=\"${item.url}\" target=\"_blank\" style=\"text-decoration:none;\"\u003e\n                                            \u003cimg src=\"${getValidImageUrl(item.image)}\" alt=\"${item.title}\" class=\"reco-image\" /\u003e\n                                        \u003c/a\u003e\n                                    \u003c/div\u003e\n                                    \u003cdiv class=\"item-info\"\u003e\n                                        \u003cp class=\"item-name\"\u003e\n                                            \u003ca href=\"${item.url}?utm_source=bloomreach\u0026utm_campaign=osr-occ\" target=\"_blank\" style=\"color: #333; text-decoration: none; font-weight: bold;\"\u003e\n                                                ${item.title}\n                                            \u003c/a\u003e\n                                        \u003c/p\u003e\n                                        \u003cp class=\"price\"\u003e€${itemPrice.toFixed(2)}\u003c/p\u003e\n                                        \u003cdiv class=\"ab-rating-wrapper ${ratingClass}\"\u003e\u003cdiv class=\"ab-rating\"\u003e\u003cspan style=\"width: ${productRating}%;\"\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv class=\"ab-rating-votes\"\u003e(${item.amount_of_reviews})\u003c/div\u003e\u003c/div\u003e\n                                    \u003c/div\u003e\n                                    \u003cdiv class=\"item-button\"\u003e\n                                        \u003ca href=\"${item.url}?utm_source=bloomreach\u0026utm_campaign=osr-occ\" target=\"_blank\"\u003e\n                                            \u003cbutton class=\"orange-button\"\u003eBekijk nu\u003c/button\u003e\n                                        \u003c/a\u003e\n                                    \u003c/div\u003e\n                                \u003c/div\u003e\n                                `;\n                                    recommendationsDiv.appendChild(itemDiv);\n \n                                    recommendationsShown++;\n                                    if (recommendationsShown \u003e= 2) break;  // Beperk tot 2 aanbevelingen\n                                }\n                            }\n                            }\n \n                            if (recommendationsShown === 0) {\n                                recommendationsDiv.innerHTML `\u003cp\u003eOp dit moment lijken er geen andere tweedehands modellen van de ${prodTitle} beschikbaar.\u003c/p\u003e`;\n                            }\n                        } else {\n                            recommendationsDiv.innerHTML += `\u003cp\u003eOp dit moment lijken er geen andere tweedehands modellen van de ${prodTitle} beschikbaar.\u003c/p\u003e \u003cbr/\u003e\n                            \u003cdiv class=\"availability-wrapper\" data-v-aee04296=\"\"\u003e\u003cp class=\"body-text-small status-subtext not-available\" data-v-aee04296=\"\"\u003e\n      \u003ca href=\"/contact\"\u003eNeem gerust contact met ons op voor alternatieven \u003c/a\u003e\u003c/p\u003e\u003c/div\u003e`;\n                        }\n                    \n                }\n                // Aanbevelingen ophalen via Exponea\n                if (typeof exponea !== 'undefined') {\n                    exponea.getRecommendation(options);\n                } else {\n                    console.error(\"Exponea SDK is niet geladen!\");\n                }\n            }\n        }\n    }\n} else {\n  //  console.log(\"Product is nog beschikbaar.\");\n}\n ","trigger":{"include_pages":[{"type":"regex","regex":"^https?:\\/\\/(www\\.)?kamera-express\\.nl\\/[a-z0-9-]+-occasion"}],"exclude_pages":[{"url":"https://www.kamera-express.nl/checkout","type":"contains"},{"url":"https://www.kamera-express.nl/bedankt/thank/you","type":"contains"},{"url":"winkelwagen","type":"contains"},{"url":"account","type":"contains"}]},"_id":"675ae69975b5f9896b548aca"},{"uses_overlay":false,"type":"js","parametrized_definition":"(function addTrustedWidget() {\n\n    // Creëer een script element\n    var script = document.createElement('script');\n    script.async = true;\n    script.defer = true;\n    script.src = 'https://integrations.etrusted.com/applications/widget.js/v2';\n\n    // Voeg het script toe aan de head\n    document.head.appendChild(script);\n})();","trigger":{"include_pages":[{"url":"https://www.foto-gregor.de/","type":"contains"},{"url":"https://www.kamera-express.de/","type":"contains"},{"url":"https://www.kamera-express.lu","type":"contains"},{"url":"https://www.kamera-express.nl","type":"contains"},{"url":"https://www.kamera-express.fr","type":"contains"},{"url":"www.photospecialist.ie","type":"contains"},{"url":"www.photospecialist.co.uk","type":"contains"},{"url":"www.photospecialist.fr","type":"contains"},{"url":"www.photospecialist.es","type":"contains"},{"url":"www.photospecialist.at","type":"contains"},{"url":"www.photospecialist.it","type":"contains"},{"url":"https://www.photospecialist.com/","type":"contains"}],"exclude_pages":null},"_id":"676588fce054d3d46106d3a3"},{"uses_overlay":true,"type":"js","parametrized_definition":"/*\r\n * Universal parameters\r\n */\r\n// Fallback-afbeelding instellen\r\nconst FALLBACK_IMAGE_URL = \"https://www.kamera-express.nl/_nuxt/img/Kamera_Express_faded_logo.5b851ac.webp\"; // Vervang met de juiste URL\r\n\r\nfunction getValidImageUrl(imageUrl) {\r\n    return imageUrl \u0026\u0026 imageUrl.length \u003e= 32 ? imageUrl : FALLBACK_IMAGE_URL;\r\n} \r\n\r\n// check meta + status\r\nconst nlButton = document.querySelector('[productstatus=\"Niet meer leverbaar\"]');\r\nconst frButton = document.querySelector('[productstatus=\"Epuisé temporairement\"]');\r\nconst deButton = document.querySelector('[productstatus=\"Vorübergehend ausverkauft\"]');\r\nconst getPageMetaProperty = (property) =\u003e {\r\n\treturn document.querySelector('meta[data-hid=\"' + property + '\"]')?.getAttribute('content') ?? undefined;\r\n\t\r\n\t\r\n}\r\n\r\nif (nlButton || frButton || deButton) {\r\n//console.log(\"Product is niet meer leverbaar.\");\r\n\r\nvar PARAM_showAfter = 0;\r\nvar PARAM_removeAfter = 0;\r\nvar PARAM_trigger = 'On entry';\r\nvar PARAM_parentElement = 'body';\r\n\r\nconst styles = `.ab-rating span{display:block;height:100%;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAAANCAMAAAAJ3xm2AAAAflBMVEX/////0zn///v//vj/0zf/1Ub/1kv/+eX/5I3//PH/+uv/11T/1EH//fT/8s7/1D3/9t3/6qr/55r/2V//11D/+ej/78T/8Mn/7r3/7Lb/4H3/33b/3m7/2Fn/+u3/67H/6ab/5pX/5In/9NX/6KH/9t//8MP/2mf/2mT/0i8kV9qPAAABPUlEQVQ4y32T2ZqCMAxGky5QdmQTFVBcZnn/FxyhbbRO9b/r4TT9khbQqcBNvHsBV+ausw18AqHowYka3QJT8VKgCvgncMbaKdCiODr6jI1TIErxBG8BKwWK3dMGrhCTiD2EsEDcPAsVooyZF5TXoUkRsQh+5vxOWH8eA7xHJofNtIzjpAUMarVdhC9Vk9DCPxBKtCnydfxIqbPlfoIH6BbhiJQk8gDakF4AnO/fXI+ncQ4E6K0wZl4QSa3fwGQnVjDYGWWNFi5W6EwD/A0Y1tXj2ktdcAabve4goleGa87wBqAOFcxNx+SnGkx0ohkY+EH8K8b8IAR1dEJRdQU2tuVIiCbfC9zSTFCorcSU+0GeLM+lPNDvN8wtAO9lZs8Pludy2ysagQoBWCdjP5iYGQSYGI/TpbwKrRG4B/wBeqgQ6mCzYZwAAAAASUVORK5CYII=)}.ab-rating{width:80px;height:13px;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAAANBAMAAADML/S3AAAAMFBMVEX////a2tr8/Pzr6+vv7+/29vb4+Pjd3d3z8/Pc3Nzi4uLf39/m5ubo6Ojk5OTh4eFXKiHAAAABI0lEQVQoz0XOvUoDURAF4ONudgnRBA9JXH8gXFEQrFbRWpPGxsJUipViZRdTW+wTiKkFUaysDNqkNJW1IKYWfAB/XiBzdwYyzcfuzJm5kDqCVmjGuypSc9V8MtuZOtO3QE3FSIloA182cFqzQGIB6ol1/llgPjcYLjkN2ECZXX//jeRlC9FOj7zZBvYvyIVvh7NH8SVDcSSN2xYq9HWHOLcODL2y89zLDGHuszYagDYOgFCDCHoaxIYGURZfoY05aKPhXdMgChpEkdRH/5Idb5usekvyRidGJFNMNkKc9TbJRe8USWeb+mKFW/wRYw7u6yLeq83Eu5xc5adDfvBanN7ESscHB4geRPy7YM+JhxmOU7H0iUJXDAA4M4Z+BCZOYD8xBhhyNtl9yoFfAAAAAElFTkSuQmCC)}.ab-rating-hidden{opacity:0}.ab-rating{width:80px;height:13px;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAAANBAMAAADML/S3AAAAMFBMVEX////a2tr8/Pzr6+vv7+/29vb4+Pjd3d3z8/Pc3Nzi4uLf39/m5ubo6Ojk5OTh4eFXKiHAAAABI0lEQVQoz0XOvUoDURAF4ONudgnRBA9JXH8gXFEQrFbRWpPGxsJUipViZRdTW+wTiKkFUaysDNqkNJW1IKYWfAB/XiBzdwYyzcfuzJm5kDqCVmjGuypSc9V8MtuZOtO3QE3FSIloA182cFqzQGIB6ol1/llgPjcYLjkN2ECZXX//jeRlC9FOj7zZBvYvyIVvh7NH8SVDcSSN2xYq9HWHOLcODL2y89zLDGHuszYagDYOgFCDCHoaxIYGURZfoY05aKPhXdMgChpEkdRH/5Idb5usekvyRidGJFNMNkKc9TbJRe8USWeb+mKFW/wRYw7u6yLeq83Eu5xc5adDfvBanN7ESscHB4geRPy7YM+JhxmOU7H0iUJXDAA4M4Z+BCZOYD8xBhhyNtl9yoFfAAAAAElFTkSuQmCC)}.ab-rating-wrapper{margin-bottom:1rem;display:flex;align-items:center;justify-content:flex-start;gap:.5rem}.ab-rating-votes{font-weight:500;font-size:14px;color:#646363}.pdp-reco{display:flex;align-items:center;justify-content:space-between;border:1px solid #f0f0f0;padding:15px;margin-bottom:-1px;border-radius:5px;background-color:#fff;position:relative}.container-wrapper{display:flex;align-items:center;width:100%}.item-image{flex-shrink:0;}.item-image img{width:80px;height:80px;border-radius:5px;object-fit:cover}.item-info{max-width:47%;flex:1}.item-button{position:absolute;right:20px;top:50%;transform:translateY(-50%)}.orange-button{height:40px;padding:8px 24px;color:#fff;background-color:#ea580c;border:none;font-weight:700;border-radius:4px;font-family:Barlow,sans-serif;font-size:initial;cursor:pointer}.orange-button:hover{background-color:#cc4e0b}button.orange-button{height:40px;padding:8px 24px;color:#fff;background-color:#ea580c;border:none;font-weight:700;border-radius:4px;font-family:Barlow,sans-serif;font-size:initial}.recommendationbox-pdp{background-color:#fff;width:100%;padding:10px;margin-top:0px;border-radius:5px;}.pdp-reco{border: 1px solid #f0f0f0;padding:15px 10px;display:flex;align-items:center}.pdp-reco img{border-radius:5px;margin-right:15px;width:80px;height:80px;object-fit:cover}.pdp-reco p{margin:0;font-size:18px;line-height:1.5;color:#333}.pdp-reco .price{font-weight:700;font-size:20px;color:#000}.overlay{color:#fff;z-index:49;background-color:rgba(0,0,0,0.5);position:absolute;top:0;left:0;width:100%;height:inherit;display:flex;justify-content:center;align-items:center;font-size:24px;font-family:Barlow,sans-serif;pointer-events:none;}.drawer_overlay{box-sizing:border-box;top:0;width:100%;height:100%;position:fixed;left:0;z-index:1000;background:rgba(46,45,44,.5);opacity:1;transition:all .2s ease-in-out;display:flex;flex-direction:column;align-items:end;}.content{box-sizing:inherit;background:white;font-family:'Barlow';padding:0;cursor:default;flex:1;overflow-y:auto;color:#2e2d2c;height:100%;width:100%;display:flex;flex-direction:column;animation:slideInRightVT cubic-bezier(0.56,0.01,0.42,1.04) .20s;}.banner_button_content{width:100%;height:100%;color:white;display:flex;align-items:center;justify-content:center;}.banner_button_content svg{margin-right:4px;}.banner_button_content span{font-size:15px;}`\r\nconst styleSheet = document.createElement(\"style\");\r\nstyleSheet.textContent = styles;\r\ndocument.head.appendChild(styleSheet);\r\n\r\n// Verberg \"section answer-base\"\r\nconst hideAnswerBaseStyle = document.createElement('style');\r\nhideAnswerBaseStyle.textContent = `.section.answer-base { display: none !important; }`;\r\ndocument.head.appendChild(hideAnswerBaseStyle);\r\n\r\n\r\nfunction addCSS() {\r\n    const style = document.createElement('style');\r\n    style.type = 'text/css';\r\n    style.innerHTML = `/* CSS Code Start */\r\n\r\n.drawer_overlay {\r\n\tbox-sizing: border-box;\r\n\ttop: 0;\r\n    width: 100%;\r\n    height: 100%;\r\n    position: fixed;\r\n    left: 0;\r\n    z-index: 1000;\r\n    background: rgba(46,45,44,.5);\r\n    opacity: 1;\r\n    transition: all .2s ease-in-out;\r\n    display: flex;\r\n    flex-direction: column;\r\n    align-items: end;\r\n}\r\n\r\n.content {\r\n\tbox-sizing: inherit;\r\n\tbackground: white;\r\n\tfont-family : 'Barlow';\r\n\tpadding: 0;\r\n\tcursor: default;\r\n\tflex: 1;\r\n\toverflow-y: auto;\r\n\tcolor: #2e2d2c;\r\n\theight: 100%;\r\n\twidth: 100%;\r\n    display: flex;\r\n    flex-direction: column;\r\n\tanimation: slideInRightVT cubic-bezier(0.56, 0.01, 0.42, 1.04) 0.20s;\r\n}\r\n\r\n@keyframes slideInRightVT {\r\n  0% {\r\n    opacity: 0;\r\n    transform: translateX(100%);\r\n  }\r\n  100% {\r\n    opacity: 1;\r\n    transform: translateX(0);\r\n  }\r\n}\r\n\r\n.content_title_wrapper {\r\n\tdisplay: flex;\r\n\tflex-direction: row;\r\n}\r\n\r\n.close { \r\n\tbackground: transparent;\r\n\tcolor: #2e2d2c;\r\n\tborder-width: 0;\r\n\tpadding: 0;\r\n\tpadding-right: 25px;\r\n\talign-self: start;\r\n\tposition: relative;\r\n\ttop: 20px;\r\n}\r\n\r\n.close:hover {\r\n\tcolor: #ea580c;\r\n}\r\n\r\n.h1-slidein {\r\n\tfont-size: 20px;\r\n\tfont-weight: 700;\r\n\tcolor: #000;\r\n\tmargin: 0;\r\n\tmargin-right: auto;\r\n\tpadding: 24px;;\r\n}\r\n\r\n.content_form {\r\n\tbox-sizing: inherit;\r\n\tpadding: 24px;\r\n\twidth: 100%;\r\n    flex-grow: 1;\r\n    display: flex;\r\n    flex-direction: column;\r\n}\r\n\r\n.form_input {\r\n\tbox-sizing: border-box;\r\n\tpadding: 8px 12px;\r\n\twidth: 100%;\r\n\theight: 40px;\r\n\tfont-size: 1rem;\r\n\tcursor: text;\r\n\tborder: 1px solid #dadada;\r\n\tborder-width: 1px;\r\n    border-radius: 4px;\r\n\tbox-shadow: inset 0 0 10px rgba(0,0,0,.05);\r\n    outline: none;\r\n    letter-spacing: 0.5px;\r\n}\r\n\r\n.input_wrapper {\r\n\tmargin-bottom: 16px;\r\n}\r\n\r\n\r\n.input_error {\r\n\tcolor: #bc2323;\r\n\tfont-size: 12px;\r\n\tpadding-top: 5px;\r\n\tdisplay: none;\r\n}\r\n\r\n.content_actions {\r\n\tdisplay: flex;\r\n\tjustify-content: center;\r\n\talign-items: center;\r\n\tpadding: 24px;\r\n\tborder-top: 1px solid #dadada;\r\n}\r\n\r\n.br_submit {\r\n\twidth: 100%;\r\n    padding: 12px 24px;\r\n    font: \"Barlow\", sans-serif;\r\n    box-shadow: none;\r\n    border: 1px solid;\r\n\tborder-radius: 4px;\r\n    border-color:  #ea580c;\r\n    text-transform: none;\r\n    background: #ea580c;\r\n    transition: all .2s ease-in-out;\r\n    overflow: hidden;\r\n    font-weight: 700;\r\n    height: 48px;\r\n    cursor: pointer;\r\n}\r\n\r\n.br_submit:hover {\r\n\topacity: .8;\r\n}\r\n\r\n.br_submit:disabled {\r\n\topacity: .3;\r\n}\r\n\r\n.button_content {\r\n\twidth: 100%;\r\n\theight: 100%;\r\n\tcolor: white;\r\n\tdisplay: flex;\r\n\talign-items: center;\r\n\tjustify-content: center;\r\n}\r\n\r\n.button_content span {\r\n\tfont-size: 15px;\r\n}\r\n\r\n.banner_link {\r\n    font-size: 16px;\r\n    font-weight: 400;\r\n    line-height: 19px;\r\n    text-decoration-line: underline;\r\n    color: #2e2d2c;\r\n}\r\n\r\n.exponea-error, .exponea-email-error {\r\n\tborder: 1px solid #bc2323;\r\n}\r\n\r\n#br-phone-number::-webkit-inner-spin-button, \r\n#br-phone-number::-webkit-outer-spin-button { \r\n    appearance: none;\r\n    margin: 0; \r\n}\r\n\r\n@media (min-width: 768px) {\r\n\t.content_title {\r\n    \tpadding-right: 48px;\r\n\t}\r\n\t.content {\r\n\t\twidth: 485px;\r\n\t}\r\n}\r\n\r\n/* CSS Code End */`;\r\n    document.head.appendChild(style);\r\n\t}\r\naddCSS();\r\n\t\r\n    \r\n    const priceElement = document.querySelector(\"#buySection .current-price-container p span\");\r\n    if (!priceElement) {\r\n//  \tconsole.error(\"Prijsselector niet gevonden!\");\r\n    } else {\r\n\r\n\t    const currentPriceText = priceElement.innerText;\r\n\t    const currentPrice = parseFloat(currentPriceText.replace(/[^\\d,-]/g, '').replace(',', '.'));\r\n\r\n\t        if (isNaN(currentPrice)) {\r\n\t  //    console.error(\"Kon prijs niet omzetten naar een geldig getal.\");\r\n\t        } else {\r\n\t  //    console.log(`Huidige prijs: €${currentPrice}`);\r\n\t\r\n\t        // Prijscategorie bepalen\r\n\t        function determineCategory(price) {\r\n\t            if (price \u003c 1000) return 'Low';\r\n\t            if (price \u003c 2500) return 'Mid';\r\n\t            return 'High';\r\n\t        }\r\n\r\n        const category = determineCategory(currentPrice);\r\n       // console.log(`Categorie: ${category}`);\r\n\r\n        let lowerBound, upperBound;\r\n        switch (category) {\r\n            case 'Low':\r\n                lowerBound = currentPrice * 0.6;\r\n                upperBound = currentPrice * 3.0;\r\n                break;\r\n            case 'Mid':\r\n                lowerBound = currentPrice * 0.8;\r\n                upperBound = currentPrice * 1.8;\r\n                break;\r\n            case 'High':\r\n                lowerBound = currentPrice * 0.8;\r\n                upperBound = currentPrice * 5.0;\r\n                break;\r\n        }\r\n\r\n          //  console.log(`Prijsbereik: €${lowerBound.toFixed(2)} - €${upperBound.toFixed(2)}`);\r\n\r\n            const productWrapper = document.querySelector('.sf-gallery__stage');\r\n\r\n            if (productWrapper) {\r\n                const overlay = document.createElement('div');\r\n                overlay.className = 'overlay';\r\n                overlay.innerText = 'Niet meer leverbaar';\r\n                productWrapper.prepend(overlay);\r\n            } else {\r\n                console.warn(\"Kon de productwrapper niet vinden voor overlay.\");\r\n            }\r\n\r\n            const getJsonItemData = () =\u003e {\r\n                const itemData = document.querySelector('script[data-n-head=\"ssr\"][type=\"application/ld+json\"]')?.text;\r\n                return itemData ? JSON.parse(itemData) : null;\r\n            };\r\n\r\n            const itemData = getJsonItemData();\r\n            const itemId = itemData?.offers?.sku;\r\n            const prodTitle = itemData?.name;\r\n            const prodGroup = itemData?.product_group;\r\n            \r\n            if (!itemId) {\r\n                console.error(\"Kon item ID niet ophalen!\");\r\n            } else {\r\n               // console.log(`Item ID: ${itemId}`);\r\n\r\n\t\tconst text = getPageMetaProperty('og:description').toLowerCase(); // Ensure case-insensitivity\r\n\t\t\r\n        if (text.includes('actioncam') || text.includes('action cam') || text.includes('action camera')) {\r\n           var recommendationEngine = \"67a48e3e70bf9dab8e1354cd\";\r\n        } else if (text.includes('objectief') || text.includes('lens')) {\r\n           var recommendationEngine = \"679c93c7df73b195fa17eace\";\r\n        } else if (text.includes('body') || text.includes('camera')) {\r\n           var recommendationEngine = \"66c35ff125986ba33efdf5fa\";\r\n        } else { recommendationEngine = \"6780ec7cb6730cc01b330e09\";} //677f969ecdd6b3974c86e268 \r\n\r\n        const options = {\r\n            recommendationId: recommendationEngine,\r\n            callback: onRecommendationsLoaded,\r\n            size: 10,\r\n            items: { [itemId]: 1 },\r\n        };\r\n\r\n        function onRecommendationsLoaded(data) {\r\n          //  console.log(\"Aanbevelingen ontvangen:\", data);\r\n\r\n            const buySection = document.querySelector(\"#buySection \u003e div\");\r\n                if (!buySection) {\r\n                    console.error(\"BuySection niet gevonden!\");\r\n                    return;\r\n                }\r\n\r\n            buySection.innerHTML = \"\"; \r\n            const recommendationsDiv = document.createElement('div');\r\n            recommendationsDiv.className = \"icon-usp-label\";\r\n            recommendationsDiv.innerHTML = `\r\n            \t\u003cspan class=\"not-available large sf-badge\" data-v-083af505=\"\" data-v-aee04296=\"\" style=\"--badge-color: false; --badge-background: false;\"\u003e \u003cspan data-v-083af505=\"\"\u003e Niet meer leverbaar\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\r\n                \u003cspan class=\"h7\" style=\"display: block; font-size: 18px;\"\u003eHelaas, dit product is helaas niet meer leverbaar.\u003c/span\u003e`;\r\n            buySection.appendChild(recommendationsDiv);\r\n\r\n            let recommendationsShown = 0;\r\n            const itemIds = [];\r\n\r\n            if (Array.isArray(data) \u0026\u0026 data.length \u003e 0) {\r\n            \t\r\n            \trecommendationsDiv.innerHTML += `Dit product is uit ons assortiment. We hebben enkele alternatieven voor de ${prodTitle} op een rijtje gezet:\u003cbr\u003e \u003cbr\u003e`;\r\n            \t\r\n                for (let item of data) {\r\n                    const itemPrice = parseFloat(item.item_price_with_cashback || item.item_price || 0);\r\n                    const productRating = Math.round(100 * item.average_review_rating / 5);\r\n                    const ratingClass = productRating === 0 ? 'ab-rating-hidden' : '';\r\n\t\t\t\t\tconst itemPic = item.image;\r\n\t\t\t\t\tconst recomProdGroup = item.product_group;\r\n\r\n\t                    if (itemPrice \u003e= lowerBound \u0026\u0026 itemPrice \u003c= upperBound \u0026\u0026 itemPic.includes('/media/')  ) {\r\n\t                        const itemDiv = document.createElement('div');\r\n\t                        itemDiv.className = \"pdp-reco\";\r\n\t                        itemDiv.innerHTML = `\r\n\t                            \u003cdiv class=\"container-wrapper\"\u003e\r\n\t                                \u003cdiv class=\"item-image\"\u003e\r\n\t                                    \u003ca href=\"${item.url}\" target=\"_blank\"\u003e\r\n\t                                        \u003cimg src=\"${getValidImageUrl(item.image)}\" alt=\"${item.title}\" class=\"reco-image\" /\u003e\r\n\t                                    \u003c/a\u003e\r\n\t                                \u003c/div\u003e\r\n\t                                \u003cdiv class=\"item-info\"\u003e\r\n\t                                    \u003cp class=\"item-name\"\u003e\r\n\t                                        \u003ca href=\"${item.url}?utm_source=bloomreach\u0026utm_campaign=osr-occ\" target=\"_blank\" style=\"font-weight: bold;\"\u003e\r\n\t                                            ${item.title}\r\n\t                                        \u003c/a\u003e\r\n\t                                    \u003c/p\u003e\r\n\t                                    \u003cp class=\"price\"\u003e€${itemPrice.toFixed(2)}\u003c/p\u003e\r\n\t                                    \u003cdiv class=\"ab-rating-wrapper ${ratingClass}\"\u003e\r\n\t                                        \u003cdiv class=\"ab-rating\"\u003e\r\n\t                                            \u003cspan style=\"width: ${productRating}%;\"\u003e\u003c/span\u003e\r\n\t                                        \u003c/div\u003e\r\n\t                                        \u003cdiv class=\"ab-rating-votes\"\u003e(${item.amount_of_reviews})\u003c/div\u003e\r\n\t                                    \u003c/div\u003e\r\n\t                                \u003c/div\u003e\r\n\t                                \u003cdiv class=\"item-button\"\u003e\r\n\t                                    \u003ca href=\"${item.url}?utm_source=bloomreach\u0026utm_campaign=osr-occ\" target=\"_blank\"\u003e\r\n\t                                        \u003cbutton class=\"orange-button\"\u003eBekijk nu\u003c/button\u003e\r\n\t                                    \u003c/a\u003e\r\n\t                                \u003c/div\u003e\r\n\t                            \u003c/div\u003e\r\n\t                        `;\r\n\t                        recommendationsDiv.appendChild(itemDiv);\r\n\t                        itemIds.push(item.item_id);\r\n\t\r\n\t                        recommendationsShown++;\r\n\t                        if (recommendationsShown \u003e= 3) break;\r\n\t                        }\r\n                }\r\n\r\n\t\t\t\t// Select the target div by its class name\r\n\t\t\t\tconst targetDiv = document.querySelector('.buy-section-wrapper');\r\n\t\t\t\t\r\n\t\t\t\t// Check if the target div exists\r\n\t\t\t\tif (targetDiv) {\r\n\t\t\t\t    // Create a new element to inject\r\n\t\t\t\t    const newButton = document.createElement('div');\r\n\t\t\t\t    // newButton.setAttribute('data-v-4bb7aa7c', '');\r\n\t\t\t\t    // newButton.setAttribute('data-v-04ed726d', '');\r\n\t\t\t\t    // newButton.setAttribute('link', '#');\r\n\t\t\t\t    // newButton.setAttribute('target', '_blank');\r\n\t\t\t\t    // newButton.className = 'icon-usp-container';\r\n\t\t\t\t\r\n\t\t\t\t    // Inner content for the new button\r\n\r\n\t\t\t\t    // Append the new element to the target div\r\n\t\t\t\t    targetDiv.appendChild(newButton);\r\n\t\t\t\t} \r\n\r\n\t\t\t    if (recommendationsShown === 0) {\r\n\t\t\t            recommendationsDiv.innerHTML += `\u003cp\u003evoor de ${prodTitle} kunnen we momenteel geen goede alternatieven aanbevelen.\u003c/p\u003e\r\n\t\t\t            \u003cdiv class=\"availability-wrapper\" data-v-aee04296=\"\"\u003e\u003cp class=\"body-text-small status-subtext not-available\" data-v-aee04296=\"\"\u003e\r\n\t\t\t\t\t\t\u003ca href=\"/contact\"\u003eNeem gerust contact met ons op voor alternatieven \u003c/a\u003e\u003c/p\u003e\u003c/div\u003e`;\r\n\t\t\t    }\r\n\t    } else {\r\n\t        recommendationsDiv.innerHTML  += `\u003cp\u003eHeb je advies nodig over een goed alternatief voor de ${prodTitle}?\u003c/p\u003e \u003cdiv class=\"availability-wrapper\" data-v-aee04296=\"\"\u003e\u003cp class=\"body-text-small status-subtext not-available\" data-v-aee04296=\"\"\u003e\r\n\t\t\t\u003ca href=\"/contact\"\u003eNeem gerust contact met ons op voor alternatieven \u003c/a\u003e\u003c/p\u003e\u003c/div\u003e`;\r\n\t    }\r\n\r\n\r\n                    if (recommendationsShown \u003e 0 \u0026\u0026 typeof exponea !== 'undefined') {\r\n                        const RECOMMENDATION_ID = options.recommendationId;\r\n\r\n                        exponea.track(\"recommendation\", {\r\n                            action: \"show\",\r\n                            item_ids: itemIds,\r\n                            recommendation_id: RECOMMENDATION_ID,\r\n                        });\r\n                        \r\n                        //\r\n                        //        const buttonContainer = document.createElement('div');\r\n                \t\t//\t\tbuttonContainer.style.textAlign = 'center';\r\n                \t\t//\t\tbuttonContainer.style.marginTop = '15px';\r\n                \t\t//\t\tbuttonContainer.innerHTML = '\u003cbutton class=\"br-exponea-btn sf-button--outline full-width sf-button\" style=\"padding: 10px 20px; font-size: 14px; border: 1px solid #ccc; background: #fff; cursor: pointer;\"\u003eMail mij bij voorraad\u003c/button\u003e';\r\n\t\t\t\t\t\t//\t\tdocument.querySelector(\"#buySection \u003e div \u003e div\").appendChild(buttonContainer);\r\n\t\t\t\t\t\t//\t    document.querySelector('.br-exponea-btn').addEventListener('click', createBanner);\r\n                        \r\n                    } else if (typeof exponea === 'undefined') {\r\n                        console.error(\"Exponea SDK is niet geladen!\");\r\n                    }\r\n                }\r\n                if (typeof exponea !== 'undefined') {\r\n                    exponea.getRecommendation(options);\r\n                } else {\r\n                    console.error(\"Exponea SDK is niet geladen!\");\r\n                }\r\n            }\r\n        }\r\n    }\r\n} else {\r\n  //  console.log(\"Product is nog beschikbaar.\");\r\n}","trigger":{"include_pages":[{"type":"regex","regex":"^https?:\\/\\/(www\\.)?kamera-express\\.nl\\/[a-z0-9-]"}],"exclude_pages":[{"url":"https://www.kamera-express.nl/checkout","type":"contains"},{"url":"https://www.kamera-express.nl/bedankt/thank/you","type":"contains"},{"url":"winkelwagen","type":"contains"},{"url":"account","type":"contains"},{"url":"-occassion","type":"contains"},{"url":"-occasion","type":"contains"}]},"_id":"677e9f5e47b8c5faa6de8c21"},{"uses_overlay":false,"type":"js","parametrized_definition":"(() =\u003e {\n    const getMeta = (hid) =\u003e\n        document.querySelector(`meta[data-hid=\"${hid}\"]`)?.getAttribute(\"content\") || \"\";\n\n    const image = getMeta(\"og:image\"); // niet lowercasen, is een URL\n    const pageTitle = getMeta(\"og:title\").toLowerCase();\n\n    let price = null;\n    let url = null;\n\n    if (pageTitle.includes(\" r7\")) { price = \"69\";  url = \"/advanced-abonnement-canon-eos-r7-18-150mm-l\"; }\n    else if (pageTitle.includes(\" r50\")) { price = \"44\"; url = \"/starter-abonnement-canon-eos-r50-18-45mm-le\"; }\n    else if (pageTitle.includes(\" r6\")) { price = \"159\"; url = \"/ultimate-abonnement-canon-eos-r6-mark-ii-24\"; }\n    else if (pageTitle.includes(\" zv-e10\")) { price = \"44\"; url = \"/sony-vlog-camera-zv-e10-body\"; }\n    else if (pageTitle.includes(\" a6700\")) { price = \"59\"; url = \"/advanced-abonnement-sony-a6700-18-135mm-len\"; }\n    else if (pageTitle.includes(\" a7 iv\")) { price = \"139\"; url = \"/ultimate-abonnement-sony-a7-iv-24-105mm-len\"; }\n\n    if (!price || !url) return;\n\n    // voorkom dubbel toevoegen\n    if (document.querySelector(\".product-abo\")) return;\n\n    // 1) fallback CSS (alleen voor jouw tile; schaadt bestaande tegels niet)\n    if (!document.querySelector(\"#product-abo-fallback-css\")) {\n        const style = document.createElement(\"style\");\n        style.id = \"product-abo-fallback-css\";\n        style.textContent = `\n      /* Alleen jouw abonnement-tegel */\n      .additional-services-container .additional-service.product-abo{\n        display:flex;\n        align-items:center;\n        justify-content:space-between;\n        gap:16px;\n        padding:16px 24px;\n        border-bottom:1px solid #dadada;\n        background:#fff;\n      }\n      .additional-services-container .additional-service.product-abo .service-image-container{\n        width:56px;height:56px;flex:0 0 56px;\n        border-radius:8px; overflow:hidden;\n        display:flex; align-items:center; justify-content:center;\n        background:#f6f6f6;\n      }\n      .additional-services-container .additional-service.product-abo .service-image-container img{\n        width:100%;height:100%;object-fit:cover;display:block;\n      }\n      .additional-services-container .additional-service.product-abo .service-text-container{\n      display:flex;flex:1; min-width:0;align-items:center;gap:4px;\n      }\n      .additional-services-container .additional-service.product-abo .service-type{\n        font-size:18px; font-weight:700; line-height:24px; margin:0px;\n      }\n      .additional-services-container .additional-service.product-abo .service-type-container{\n        font-size:24px; font-weight:400; margin:0 0 6px;\n      }\n      .additional-services-container .additional-service.product-abo p.service-description {\n        color: #646363;font-size: 16px;line-height: 24px;margin: 0px;\n      }\n      .additional-services-container .additional-service.product-abo .price-duration-container{\n        display:flex; flex-direction:column; align-items:flex-end; gap:6px;font-size:24px;line-height:29px;font-weight:700;\n      }\n      p.service-price{\n        font-weight:700;margin:0;\n      }\n      .additional-services-container .additional-service.product-abo .type-description-container{\n        padding-left: 8px;display: flex;flex-direction: column;flex: 1;\n      }\n      .additional-services-container .additional-service.product-abo .service-price p{\n        margin:0; font-size:30px; font-weight:800; line-height:1;\n      }\n      .additional-services-container .additional-service.product-abo .cta-text-container p{\n        margin:0; font-size:16px; opacity:.9;\n      }\n      .additional-services-container .additional-service.product-abo .sf-button{\n        height:40px;padding:8px;background:#ea580c;border-radius:4px;font-weight:700;\n      }\n      .additional-services-container.abo-created-container{\n          margin-left: 24px;\n          border: 1px solid #dadada;\n          overflow: hidden;\n          background: #fff;\n        }\n        .additional-services-container.abo-created-container\n          \u003e .additional-service.product-abo{\n          border-bottom: 1px solid #dadada;\n        }\n        .additional-services-container.abo-created-container\n          \u003e .additional-service.product-abo:last-child{\n          border-bottom: 0;\n        }\n        @media (max-width: 768px){\n          .additional-services-container .additional-service.product-abo{\n            padding:16px;\n          }\n          .additional-services-container .additional-service.product-abo .service-image-container{\n              width: 48px;\n              height: 48px;\n              flex: 0 0 48px;\n          }\n          .additional-services-container .additional-service.product-abo .service-type{\n            font-size:14px; line-height:17px; margin:0px;\n          }\n          .additional-services-container .additional-service.product-abo p.service-description {\n            font-size: 12px;line-height: 14px;\n          }\n          .additional-services-container .additional-service.product-abo .price-duration-container{\n            font-size:18px;line-height:22px;\n          }\n          .additional-services-container .additional-service.product-abo{\n            gap:8px;;\n          }\n        }\n    `;\n        document.head.appendChild(style);\n    }\n\n    // 2) Zorg dat de container er is\n    let container = document.querySelector(\".additional-services-container\");\n\n    if (!container) {\n        // Plaats 'm op dezelfde plek als in je screenshot: in .buy-section-column\n        const host = document.querySelector(\".buy-section-column\");\n        if (!host) return;\n\n        container = document.createElement(\"div\");\n        container.className = \"additional-services-container abo-created-container\";\n        host.appendChild(container);\n\n    }\n\n    // 3) Maak de \u003ca\u003e tegel (zelfde class als bestaande: additional-service)\n    const a = document.createElement(\"a\");\n    a.href = url;\n    a.target = \"_blank\";\n    a.rel = \"noopener\";\n    a.className = \"additional-service product-abo\";\n\n    a.innerHTML = `\n  \u003cdiv class=\"service-image-container\"\u003e\n    \u003cimg src=\"${image}\" width=\"56\" height=\"56\" alt=\"Abonnement\" loading=\"lazy\"\u003e\n  \u003c/div\u003e\n\n  \u003cdiv class=\"service-text-container\"\u003e\n    \u003cdiv class=\"type-description-container\"\u003e\n      \u003cdiv class=\"type-container\"\u003e\n        \u003cp class=\"service-type\"\u003eAbonnement\u003c/p\u003e\n      \u003c/div\u003e\n      \u003cp class=\"service-description\"\u003eBetaal per maand\u003c/p\u003e\n    \u003c/div\u003e\n\n    \u003cdiv class=\"price-duration-container\"\u003e\n      \u003cp class=\"service-price\"\u003e${price},-\u003c/p\u003e\n      \u003c!-- originele heeft vaak lege slots/comments hier; niet nodig --\u003e\n    \u003c/div\u003e\n  \u003c/div\u003e\n\n  \u003cbutton class=\"small-button icon-only sf-button\" type=\"button\" aria-label=\"Bekijk abonnement\"\u003e\n    \u003csvg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\u003e\n      \u003cpath d=\"M20 12L14 6M4 12H20H4ZM20 12L14 18L20 12Z\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\u003e\u003c/path\u003e\n    \u003c/svg\u003e\n  \u003c/button\u003e\n`;\n\n\n    // 4) Bovenaan in de container (zoals jouw gewenste “zelfde blok boven verhuur”)\n    container.insertAdjacentElement(\"afterbegin\", a);\n\n    // 5) tracking (één keer, delegatie)\n    if (!window.__aboTrackBound) {\n        window.__aboTrackBound = true;\n        document.addEventListener(\"click\", (e) =\u003e {\n            if (!e.target.closest(\".additional-service.product-abo\")) return;\n            window.exponea?.track?.(\"experiment\", {\n                action: \"click\",\n                experiment_name: \"subscription_add-on_pdp\",\n            });\n        });\n    }\n})();\n","trigger":{"include_pages":[{"url":"https://www.kamera-express.nl/canon-eos-r6-mark-ii-rf-24-105mm-f-4-7-1-is","type":"contains"},{"url":"https://www.kamera-express.nl/canon-eos-r6-mark-ii-body","type":"contains"},{"url":"https://www.kamera-express.nl/canon-eos-r7-body","type":"contains"},{"url":"https://www.kamera-express.nl/canon-eos-r7-rf-s-18-150mm-f-3-5-6-3-is-stm-12427195","type":"contains"},{"url":"https://www.kamera-express.nl/canon-eos-r50","type":"contains"},{"url":"https://www.kamera-express.nl/canon-eos-r50-zwart-rf-s-18-45mm-is-stm","type":"contains"},{"url":"https://www.kamera-express.nl/sony-zv-e10-16-50mm-f-3-5-5-6-oss-ii","type":"exact"},{"url":"https://www.kamera-express.nl/sony-vlog-camera-zv-e10-body","type":"exact"},{"url":"https://www.kamera-express.nl/sony-a6700-body","type":"exact"},{"url":"https://www.kamera-express.nl/sony-a6700-18-135mm","type":"exact"},{"url":"https://www.kamera-express.nl/sony-a7-iv-body","type":"exact"},{"url":"https://www.kamera-express.nl/sony-a7-iv-24-105mm-f-4-0-g-","type":"exact"}],"exclude_pages":[{"url":"canon-eos-r50-v-","type":"contains"}]},"_id":"67867037f93adaf5a8909142"},{"uses_overlay":true,"type":"js","parametrized_definition":"/*\r\n * Universal parameters\r\n */\r\n// Fallback-afbeelding instellen\r\nconst FALLBACK_IMAGE_URL = \"https://www.kamera-express.nl/_nuxt/img/Kamera_Express_faded_logo.5b851ac.webp\"; // Vervang met de juiste URL\r\n\r\nfunction getValidImageUrl(imageUrl) {\r\n    return imageUrl \u0026\u0026 imageUrl.length \u003e= 32 ? imageUrl : FALLBACK_IMAGE_URL;\r\n} \r\n// check meta + status\r\nconst nlButton = document.querySelector('[productstatus=\"Niet meer leverbaar\"]');\r\nconst frButton = document.querySelector('[productstatus=\"Pas disponible\"]');\r\nconst deButton = document.querySelector('[productstatus=\"Vorübergehend ausverkauft\"]');\r\nconst getPageMetaProperty = (property) =\u003e {\r\n\treturn document.querySelector('meta[data-hid=\"' + property + '\"]')?.getAttribute('content') ?? undefined;\r\n}\r\n\r\nif (nlButton || frButton || deButton) {\r\n////console.log(\"Product is niet meer leverbaar.\");\r\n\r\nvar PARAM_showAfter = 0;\r\nvar PARAM_removeAfter = 0;\r\nvar PARAM_trigger = 'On entry';\r\nvar PARAM_parentElement = 'body';\r\n\r\nconst styles = `.ab-rating span{display:block;height:100%;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAAANCAMAAAAJ3xm2AAAAflBMVEX/////0zn///v//vj/0zf/1Ub/1kv/+eX/5I3//PH/+uv/11T/1EH//fT/8s7/1D3/9t3/6qr/55r/2V//11D/+ej/78T/8Mn/7r3/7Lb/4H3/33b/3m7/2Fn/+u3/67H/6ab/5pX/5In/9NX/6KH/9t//8MP/2mf/2mT/0i8kV9qPAAABPUlEQVQ4y32T2ZqCMAxGky5QdmQTFVBcZnn/FxyhbbRO9b/r4TT9khbQqcBNvHsBV+ausw18AqHowYka3QJT8VKgCvgncMbaKdCiODr6jI1TIErxBG8BKwWK3dMGrhCTiD2EsEDcPAsVooyZF5TXoUkRsQh+5vxOWH8eA7xHJofNtIzjpAUMarVdhC9Vk9DCPxBKtCnydfxIqbPlfoIH6BbhiJQk8gDakF4AnO/fXI+ncQ4E6K0wZl4QSa3fwGQnVjDYGWWNFi5W6EwD/A0Y1tXj2ktdcAabve4goleGa87wBqAOFcxNx+SnGkx0ohkY+EH8K8b8IAR1dEJRdQU2tuVIiCbfC9zSTFCorcSU+0GeLM+lPNDvN8wtAO9lZs8Pludy2ysagQoBWCdjP5iYGQSYGI/TpbwKrRG4B/wBeqgQ6mCzYZwAAAAASUVORK5CYII=)}.ab-rating{width:80px;height:13px;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAAANBAMAAADML/S3AAAAMFBMVEX////a2tr8/Pzr6+vv7+/29vb4+Pjd3d3z8/Pc3Nzi4uLf39/m5ubo6Ojk5OTh4eFXKiHAAAABI0lEQVQoz0XOvUoDURAF4ONudgnRBA9JXH8gXFEQrFbRWpPGxsJUipViZRdTW+wTiKkFUaysDNqkNJW1IKYWfAB/XiBzdwYyzcfuzJm5kDqCVmjGuypSc9V8MtuZOtO3QE3FSIloA182cFqzQGIB6ol1/llgPjcYLjkN2ECZXX//jeRlC9FOj7zZBvYvyIVvh7NH8SVDcSSN2xYq9HWHOLcODL2y89zLDGHuszYagDYOgFCDCHoaxIYGURZfoY05aKPhXdMgChpEkdRH/5Idb5usekvyRidGJFNMNkKc9TbJRe8USWeb+mKFW/wRYw7u6yLeq83Eu5xc5adDfvBanN7ESscHB4geRPy7YM+JhxmOU7H0iUJXDAA4M4Z+BCZOYD8xBhhyNtl9yoFfAAAAAElFTkSuQmCC)}.ab-rating-hidden{opacity:0}.ab-rating{width:80px;height:13px;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAAANBAMAAADML/S3AAAAMFBMVEX////a2tr8/Pzr6+vv7+/29vb4+Pjd3d3z8/Pc3Nzi4uLf39/m5ubo6Ojk5OTh4eFXKiHAAAABI0lEQVQoz0XOvUoDURAF4ONudgnRBA9JXH8gXFEQrFbRWpPGxsJUipViZRdTW+wTiKkFUaysDNqkNJW1IKYWfAB/XiBzdwYyzcfuzJm5kDqCVmjGuypSc9V8MtuZOtO3QE3FSIloA182cFqzQGIB6ol1/llgPjcYLjkN2ECZXX//jeRlC9FOj7zZBvYvyIVvh7NH8SVDcSSN2xYq9HWHOLcODL2y89zLDGHuszYagDYOgFCDCHoaxIYGURZfoY05aKPhXdMgChpEkdRH/5Idb5usekvyRidGJFNMNkKc9TbJRe8USWeb+mKFW/wRYw7u6yLeq83Eu5xc5adDfvBanN7ESscHB4geRPy7YM+JhxmOU7H0iUJXDAA4M4Z+BCZOYD8xBhhyNtl9yoFfAAAAAElFTkSuQmCC)}.ab-rating-wrapper{margin-bottom:1rem;display:flex;align-items:center;justify-content:flex-start;gap:.5rem}.ab-rating-votes{font-weight:500;font-size:14px;color:#646363}.pdp-reco{display:flex;align-items:center;justify-content:space-between;border:1px solid #f0f0f0;padding:15px;margin-bottom:-1px;border-radius:5px;background-color:#fff;position:relative}.container-wrapper{display:flex;align-items:center;width:100%}.item-image{flex-shrink:0;}.item-image img{width:80px;height:80px;border-radius:5px;object-fit:cover}.item-info{max-width:47%;flex:1}.item-button{position:absolute;right:20px;top:50%;transform:translateY(-50%)}.orange-button{height:40px;padding:8px 24px;color:#fff;background-color:#ea580c;border:none;font-weight:700;border-radius:4px;font-family:Barlow,sans-serif;font-size:initial;cursor:pointer}.orange-button:hover{background-color:#cc4e0b}button.orange-button{height:40px;padding:8px 24px;color:#fff;background-color:#ea580c;border:none;font-weight:700;border-radius:4px;font-family:Barlow,sans-serif;font-size:initial}.recommendationbox-pdp{background-color:#fff;width:100%;padding:10px;margin-top:0px;border-radius:5px;}.pdp-reco{border: 1px solid #f0f0f0;padding:15px 10px;display:flex;align-items:center}.pdp-reco img{border-radius:5px;margin-right:15px;width:80px;height:80px;object-fit:cover}.pdp-reco p{margin:0;font-size:18px;line-height:1.5;color:#333}.pdp-reco .price{font-weight:700;font-size:20px;color:#000}.overlay{color:#fff;z-index:49;background-color:rgba(0,0,0,0.5);position:absolute;top:0;left:0;width:100%;height:inherit;display:flex;justify-content:center;align-items:center;font-size:24px;font-family:Barlow,sans-serif;pointer-events:none;}.drawer_overlay{box-sizing:border-box;top:0;width:100%;height:100%;position:fixed;left:0;z-index:1000;background:rgba(46,45,44,.5);opacity:1;transition:all .2s ease-in-out;display:flex;flex-direction:column;align-items:end;}.content{box-sizing:inherit;background:white;font-family:'Barlow';padding:0;cursor:default;flex:1;overflow-y:auto;color:#2e2d2c;height:100%;width:100%;display:flex;flex-direction:column;animation:slideInRightVT cubic-bezier(0.56,0.01,0.42,1.04) .20s;}.banner_button_content{width:100%;height:100%;color:white;display:flex;align-items:center;justify-content:center;}.banner_button_content svg{margin-right:4px;}.banner_button_content span{font-size:15px;}`\r\nconst styleSheet = document.createElement(\"style\");\r\nstyleSheet.textContent = styles;\r\ndocument.head.appendChild(styleSheet);\r\n\r\nfunction addCSS() {\r\n    const style = document.createElement('style');\r\n    style.type = 'text/css';\r\n    style.innerHTML = `/* CSS Code Start */\r\n\r\n.drawer_overlay {\r\n\tbox-sizing: border-box;\r\n\ttop: 0;\r\n    width: 100%;\r\n    height: 100%;\r\n    position: fixed;\r\n    left: 0;\r\n    z-index: 1000;\r\n    background: rgba(46,45,44,.5);\r\n    opacity: 1;\r\n    transition: all .2s ease-in-out;\r\n    display: flex;\r\n    flex-direction: column;\r\n    align-items: end;\r\n}\r\n\r\n.content {\r\n\tbox-sizing: inherit;\r\n\tbackground: white;\r\n\tfont-family : 'Barlow';\r\n\tpadding: 0;\r\n\tcursor: default;\r\n\tflex: 1;\r\n\toverflow-y: auto;\r\n\tcolor: #2e2d2c;\r\n\theight: 100%;\r\n\twidth: 100%;\r\n    display: flex;\r\n    flex-direction: column;\r\n\tanimation: slideInRightVT cubic-bezier(0.56, 0.01, 0.42, 1.04) 0.20s;\r\n}\r\n\r\n@keyframes slideInRightVT {\r\n  0% {\r\n    opacity: 0;\r\n    transform: translateX(100%);\r\n  }\r\n  100% {\r\n    opacity: 1;\r\n    transform: translateX(0);\r\n  }\r\n}\r\n\r\n.content_title_wrapper {\r\n\tdisplay: flex;\r\n\tflex-direction: row;\r\n}\r\n\r\n.close { \r\n\tbackground: transparent;\r\n\tcolor: #2e2d2c;\r\n\tborder-width: 0;\r\n\tpadding: 0;\r\n\tpadding-right: 25px;\r\n\talign-self: start;\r\n\tposition: relative;\r\n\ttop: 20px;\r\n}\r\n\r\n.close:hover {\r\n\tcolor: #ea580c;\r\n}\r\n\r\n.h1-slidein {\r\n\tfont-size: 20px;\r\n\tfont-weight: 700;\r\n\tcolor: #000;\r\n\tmargin: 0;\r\n\tmargin-right: auto;\r\n\tpadding: 24px;;\r\n}\r\n\r\n.content_form {\r\n\tbox-sizing: inherit;\r\n\tpadding: 24px;\r\n\twidth: 100%;\r\n    flex-grow: 1;\r\n    display: flex;\r\n    flex-direction: column;\r\n}\r\n\r\n.form_input {\r\n\tbox-sizing: border-box;\r\n\tpadding: 8px 12px;\r\n\twidth: 100%;\r\n\theight: 40px;\r\n\tfont-size: 1rem;\r\n\tcursor: text;\r\n\tborder: 1px solid #dadada;\r\n\tborder-width: 1px;\r\n    border-radius: 4px;\r\n\tbox-shadow: inset 0 0 10px rgba(0,0,0,.05);\r\n    outline: none;\r\n    letter-spacing: 0.5px;\r\n}\r\n\r\n.input_wrapper {\r\n\tmargin-bottom: 16px;\r\n}\r\n\r\n\r\n.input_error {\r\n\tcolor: #bc2323;\r\n\tfont-size: 12px;\r\n\tpadding-top: 5px;\r\n\tdisplay: none;\r\n}\r\n\r\n.content_actions {\r\n\tdisplay: flex;\r\n\tjustify-content: center;\r\n\talign-items: center;\r\n\tpadding: 24px;\r\n\tborder-top: 1px solid #dadada;\r\n}\r\n\r\n.br_submit {\r\n\twidth: 100%;\r\n    padding: 12px 24px;\r\n    font: \"Barlow\", sans-serif;\r\n    box-shadow: none;\r\n    border: 1px solid;\r\n\tborder-radius: 4px;\r\n    border-color:  #ea580c;\r\n    text-transform: none;\r\n    background: #ea580c;\r\n    transition: all .2s ease-in-out;\r\n    overflow: hidden;\r\n    font-weight: 700;\r\n    height: 48px;\r\n    cursor: pointer;\r\n}\r\n\r\n.br_submit:hover {\r\n\topacity: .8;\r\n}\r\n\r\n.br_submit:disabled {\r\n\topacity: .3;\r\n}\r\n\r\n.button_content {\r\n\twidth: 100%;\r\n\theight: 100%;\r\n\tcolor: white;\r\n\tdisplay: flex;\r\n\talign-items: center;\r\n\tjustify-content: center;\r\n}\r\n\r\n.button_content span {\r\n\tfont-size: 15px;\r\n}\r\n\r\n.banner_link {\r\n    font-size: 16px;\r\n    font-weight: 400;\r\n    line-height: 19px;\r\n    text-decoration-line: underline;\r\n    color: #2e2d2c;\r\n}\r\n\r\n.exponea-error, .exponea-email-error {\r\n\tborder: 1px solid #bc2323;\r\n}\r\n\r\n#br-phone-number::-webkit-inner-spin-button, \r\n#br-phone-number::-webkit-outer-spin-button { \r\n    appearance: none;\r\n    margin: 0; \r\n}\r\n\r\n@media (min-width: 768px) {\r\n\t.content_title {\r\n    \tpadding-right: 48px;\r\n\t}\r\n\t.content {\r\n\t\twidth: 485px;\r\n\t}\r\n}\r\n\r\n/* CSS Code End */`;\r\n    document.head.appendChild(style);\r\n\t}\r\naddCSS();\r\n\t\r\n    \r\n    const priceElement = document.querySelector(\"#buySection .current-price-container p span\");\r\n    if (!priceElement) {\r\n//  \tconsole.error(\"Prijsselector niet gevonden!\");\r\n    } else {\r\n\r\n\t    const currentPriceText = priceElement.innerText;\r\n\t    const currentPrice = parseFloat(currentPriceText.replace(/[^\\d,-]/g, '').replace(',', '.'));\r\n\r\n\t        if (isNaN(currentPrice)) {\r\n\t  //    console.error(\"Kon prijs niet omzetten naar een geldig getal.\");\r\n\t        } else {\r\n\t  //    //console.log(`Huidige prijs: €${currentPrice}`);\r\n\t\r\n\t        // Prijscategorie bepalen\r\n\t        function determineCategory(price) {\r\n\t            if (price \u003c 1000) return 'Low';\r\n\t            if (price \u003c 2500) return 'Mid';\r\n\t            return 'High';\r\n\t        }\r\n\r\n        const category = determineCategory(currentPrice);\r\n        //console.log(`Categorie: ${category}`);\r\n\r\n        let lowerBound, upperBound;\r\n        switch (category) {\r\n            case 'Low':\r\n                lowerBound = currentPrice * 0.6;\r\n                upperBound = currentPrice * 3.0;\r\n                break;\r\n            case 'Mid':\r\n                lowerBound = currentPrice * 0.8;\r\n                upperBound = currentPrice * 1.8;\r\n                break;\r\n            case 'High':\r\n                lowerBound = currentPrice * 0.8;\r\n                upperBound = currentPrice * 5.0;\r\n                break;\r\n        }\r\n\r\n            //console.log(`Prijsbereik: €${lowerBound.toFixed(2)} - €${upperBound.toFixed(2)}`);\r\n\r\n            const productWrapper = document.querySelector('.sf-gallery__stage');\r\n\r\n            if (productWrapper) {\r\n                const overlay = document.createElement('div');\r\n                overlay.className = 'overlay';\r\n                overlay.innerText = \"N'est plus disponible.\";\r\n                productWrapper.prepend(overlay);\r\n            } else {\r\n                console.warn(\"Kon de productwrapper niet vinden voor overlay.\");\r\n            }\r\n\r\n            const getJsonItemData = () =\u003e {\r\n                const itemData = document.querySelector('script[data-n-head=\"ssr\"][type=\"application/ld+json\"]')?.text;\r\n                return itemData ? JSON.parse(itemData) : null;\r\n            };\r\n\r\n            const itemData = getJsonItemData();\r\n            const itemId = itemData?.offers?.sku;\r\n            const prodTitle = itemData?.name;\r\n            const prodGroup = itemData?.product_group;\r\n            \r\n            if (!itemId) {\r\n                console.error(\"Kon item ID niet ophalen!\");\r\n            } else {\r\n                //console.log(`Item ID: ${itemId}`);\r\n\r\n\t\tconst text = getPageMetaProperty('og:description').toLowerCase(); // Ensure case-insensitivity\r\n\t\t\r\n\t\t\r\n\t\tvar webSite = window.location.hostname.includes(\"photogalerie.com\") ? \"PG\" : \"KE\";\r\n\r\n\t\t\r\n        if (text.includes(\"objectif\") \u0026\u0026 webSite === \"KE\" || text.includes('lens') \u0026\u0026 webSite === \"KE\") {\r\n           var recommendationEngine = \"678e02697e5c233e88ec9200\";\r\n        } else if (text.includes('Boîtier') \u0026\u0026 webSite === \"KE\" || text.includes('appareil photo')  \u0026\u0026 webSite === \"KE\" || text.includes('caméra') \u0026\u0026 webSite === \"KE\") {\r\n           var recommendationEngine = \"678dfc0157c4d8592f4277c3\";\r\n        } else if(webSite === \"KE\"){ recommendationEngine = \"6784ddc8a9f18174c1bd3125\";} //677f969ecdd6b3974c86e268 \r\n        else if (text.includes(\"objectif\") || text.includes('lens') \u0026\u0026 webSite === \"PG\") {\r\n           var recommendationEngine = \"679b8901a50a57e433561619\";\r\n        } else if (text.includes('Boîtier') || text.includes('appareil photo')  || text.includes('caméra') \u0026\u0026 webSite === \"PG\") {\r\n           var recommendationEngine = \"679b8c310dbf91d861dcef16\";\r\n        } else if(webSite === \"PG\") { recommendationEngine = \"679b8e0e00e4797eead07e70\";} //677f969ecdd6b3974c86e268 \r\n\r\n        \r\n        \r\n        //console.log(recommendationEngine)\r\n\r\n        const options = {\r\n            recommendationId: recommendationEngine,\r\n            callback: onRecommendationsLoaded,\r\n            size: 10,\r\n            items: { [itemId]: 1 },\r\n        };\r\n\r\n        function onRecommendationsLoaded(data) {\r\n            //console.log(\"Aanbevelingen ontvangen:\", data);\r\n\r\n            const buySection = document.querySelector(\"#buySection \u003e div\");\r\n                if (!buySection) {\r\n                    console.error(\"BuySection niet gevonden!\");\r\n                    return;\r\n                }\r\n\r\n            buySection.innerHTML = \"\"; \r\n            const recommendationsDiv = document.createElement('div');\r\n            recommendationsDiv.className = \"icon-usp-label\";\r\n            recommendationsDiv.innerHTML = `\r\n            \t\u003cspan class=\"not-available large sf-badge\" data-v-083af505=\"\" data-v-aee04296=\"\" style=\"--badge-color: false; --badge-background: false;\"\u003e \u003cspan data-v-083af505=\"\"\u003e Epuisé temporairement\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\r\n                \u003cspan class=\"h7\" style=\"display: block; font-size: 18px;\"\u003eMalheureusement, ce produit n'est plus disponible.\u003c/span\u003e`;\r\n            buySection.appendChild(recommendationsDiv);\r\n\r\n            let recommendationsShown = 0;\r\n            const itemIds = [];\r\n\r\n            if (Array.isArray(data) \u0026\u0026 data.length \u003e 0) {\r\n            \t\r\n            \trecommendationsDiv.innerHTML += `Ce produit n’est plus disponible dans notre assortiment. Nous avons rassemblé quelques alternatives pour le ${prodTitle}.\u003cbr\u003e \u003cbr\u003e`;\r\n            \t\r\n                for (let item of data) {\r\n                    const itemPrice = parseFloat(item.item_price_with_cashback || item.item_price || 0);\r\n                    const productRating = Math.round(100 * item.average_review_rating / 5);\r\n                    const ratingClass = productRating === 0 ? 'ab-rating-hidden' : '';\r\n\t\t\t\t\tconst itemPic = item.image;\r\n\t\t\t\t\tconst recomProdGroup = item.product_group;\r\n\r\n\t                    if (itemPrice \u003e= lowerBound \u0026\u0026 itemPrice \u003c= upperBound \u0026\u0026 itemPic.includes('/media/')  ) {\r\n\t                        const itemDiv = document.createElement('div');\r\n\t                        itemDiv.className = \"pdp-reco\";\r\n\t                        itemDiv.innerHTML = `\r\n\t                            \u003cdiv class=\"container-wrapper\"\u003e\r\n\t                                \u003cdiv class=\"item-image\"\u003e\r\n\t                                    \u003ca href=\"${item.url}\" target=\"_blank\"\u003e\r\n\t                                        \u003cimg src=\"${getValidImageUrl(item.image)}\" alt=\"${item.title}\" class=\"reco-image\" /\u003e\r\n\t                                    \u003c/a\u003e\r\n\t                                \u003c/div\u003e\r\n\t                                \u003cdiv class=\"item-info\"\u003e\r\n\t                                    \u003cp class=\"item-name\"\u003e\r\n\t                                        \u003ca href=\"${item.url}?utm_source=bloomreach\u0026utm_campaign=osr-occ\" target=\"_blank\" style=\"font-weight: bold;\"\u003e\r\n\t                                            ${item.title}\r\n\t                                        \u003c/a\u003e\r\n\t                                    \u003c/p\u003e\r\n\t                                    \u003cp class=\"price\"\u003e€${itemPrice.toFixed(2)}\u003c/p\u003e\r\n\t                                    \u003cdiv class=\"ab-rating-wrapper ${ratingClass}\"\u003e\r\n\t                                        \u003cdiv class=\"ab-rating\"\u003e\r\n\t                                            \u003cspan style=\"width: ${productRating}%;\"\u003e\u003c/span\u003e\r\n\t                                        \u003c/div\u003e\r\n\t                                        \u003cdiv class=\"ab-rating-votes\"\u003e(${item.amount_of_reviews})\u003c/div\u003e\r\n\t                                    \u003c/div\u003e\r\n\t                                \u003c/div\u003e\r\n\t                                \u003cdiv class=\"item-button\"\u003e\r\n\t                                    \u003ca href=\"${item.url}?utm_source=bloomreach\u0026utm_campaign=osr-occ\" target=\"_blank\"\u003e\r\n\t                                        \u003cbutton class=\"orange-button\"\u003eVoir l'offre\u003c/button\u003e\r\n\t                                    \u003c/a\u003e\r\n\t                                \u003c/div\u003e\r\n\t                            \u003c/div\u003e\r\n\t                        `;\r\n\t                        recommendationsDiv.appendChild(itemDiv);\r\n\t                        itemIds.push(item.item_id);\r\n\t\r\n\t                        recommendationsShown++;\r\n\t                        if (recommendationsShown \u003e= 3) break;\r\n\t                        }\r\n                }\r\n\r\n\t\t\t\t// Select the target div by its class name\r\n\t\t\t\tconst targetDiv = document.querySelector('.buy-section-wrapper');\r\n\t\t\t\t\r\n\t\t\t\t// Check if the target div exists\r\n\t\t\t\tif (targetDiv) {\r\n\t\t\t\t    // Create a new element to inject\r\n\t\t\t\t    const newButton = document.createElement('div');\r\n\t\t\t\t    // newButton.setAttribute('data-v-4bb7aa7c', '');\r\n\t\t\t\t    // newButton.setAttribute('data-v-04ed726d', '');\r\n\t\t\t\t    // newButton.setAttribute('link', '#');\r\n\t\t\t\t    // newButton.setAttribute('target', '_blank');\r\n\t\t\t\t    // newButton.className = 'icon-usp-container';\r\n\t\t\t\t\r\n\t\t\t\t    // Inner content for the new button\r\n\r\n\t\t\t\t    // Append the new element to the target div\r\n\t\t\t\t    targetDiv.appendChild(newButton);\r\n\t\t\t\t} \r\n\r\n\t\t\t    if (recommendationsShown === 0) {\r\n\t\t\t            recommendationsDiv.innerHTML += `\u003cp\u003ePour le ${prodTitle}, nous ne pouvons actuellement pas recommander de bonnes alternatives.\u003c/p\u003e\r\n\t\t\t            \u003cdiv class=\"availability-wrapper\" data-v-aee04296=\"\"\u003e\u003cp class=\"body-text-small status-subtext not-available\" data-v-aee04296=\"\"\u003e\r\n\t\t\t\t\t\t\u003ca href=\"/contact\"\u003eN'hésitez pas à nous contacter pour des alternatives.\u003c/a\u003e\u003c/p\u003e\u003c/div\u003e`;\r\n\t\t\t    }\r\n\t    } else {\r\n\t        recommendationsDiv.innerHTML  += `\u003cp\u003eBesoin de conseils pour une bonne alternative au ${prodTitle}?\u003c/p\u003e \u003cdiv class=\"availability-wrapper\" data-v-aee04296=\"\"\u003e\u003cp class=\"body-text-small status-subtext not-available\" data-v-aee04296=\"\"\u003e\r\n\t\t\t\u003ca href=\"/contact\"\u003eN'hésitez pas à nous contacter pour des alternatives. \u003c/a\u003e\u003c/p\u003e\u003c/div\u003e`;\r\n\t    }\r\n\r\n\r\n                    if (recommendationsShown \u003e 0 \u0026\u0026 typeof exponea !== 'undefined') {\r\n                        const RECOMMENDATION_ID = options.recommendationId;\r\n\r\n                        exponea.track(\"recommendation\", {\r\n                            action: \"show\",\r\n                            item_ids: itemIds,\r\n                            recommendation_id: RECOMMENDATION_ID,\r\n                        });\r\n                        \r\n                        //\r\n                        //        const buttonContainer = document.createElement('div');\r\n                \t\t//\t\tbuttonContainer.style.textAlign = 'center';\r\n                \t\t//\t\tbuttonContainer.style.marginTop = '15px';\r\n                \t\t//\t\tbuttonContainer.innerHTML = '\u003cbutton class=\"br-exponea-btn sf-button--outline full-width sf-button\" style=\"padding: 10px 20px; font-size: 14px; border: 1px solid #ccc; background: #fff; cursor: pointer;\"\u003eMail mij bij voorraad\u003c/button\u003e';\r\n\t\t\t\t\t\t//\t\tdocument.querySelector(\"#buySection \u003e div \u003e div\").appendChild(buttonContainer);\r\n\t\t\t\t\t\t//\t    document.querySelector('.br-exponea-btn').addEventListener('click', createBanner);\r\n                        \r\n                    } else if (typeof exponea === 'undefined') {\r\n                        console.error(\"Exponea SDK is niet geladen!\");\r\n                    }\r\n                }\r\n                if (typeof exponea !== 'undefined') {\r\n                    exponea.getRecommendation(options);\r\n                } else {\r\n                    console.error(\"Exponea SDK is niet geladen!\");\r\n                }\r\n            }\r\n        }\r\n    }\r\n} else {\r\n    //console.log(\"Product is nog beschikbaar.\");\r\n}","trigger":{"include_pages":[{"type":"regex","regex":"^https?:\\/\\/(www\\.)?kamera-express\\.be/fr\\/[a-z0-9-]"},{"type":"regex","regex":"^https?:\\/\\/(www\\.)?photogalerie\\.com\\/[a-z0-9-]"}],"exclude_pages":[{"url":"https://www.kamera-express.be/fr/checkout","type":"contains"},{"url":"https://www.kamera-express.be/fr/bedankt/thank/you","type":"contains"},{"url":"panier","type":"contains"},{"url":"account","type":"contains"},{"url":"-occassion","type":"contains"},{"url":"-occasion","type":"contains"}]},"_id":"678f910509a7fdcda7f5942e"},{"uses_overlay":true,"type":"js","parametrized_definition":"/*\r\n * Universal parameters\r\n */\r\n// Fallback-afbeelding instellen\r\nconst FALLBACK_IMAGE_URL = \"https://www.kamera-express.nl/_nuxt/img/Kamera_Express_faded_logo.5b851ac.webp\"; // Vervang met de juiste URL\r\n\r\nfunction getValidImageUrl(imageUrl) {\r\n    return imageUrl \u0026\u0026 imageUrl.length \u003e= 32 ? imageUrl : FALLBACK_IMAGE_URL;\r\n} \r\n\r\n// check meta + status\r\nconst nlButton = document.querySelector('[productstatus=\"Niet meer leverbaar\"]');\r\nconst frButton = document.querySelector('[productstatus=\"Pas disponible\"]');\r\nconst deButton = document.querySelector('[productstatus=\"Nicht mehr verfügbar\"]');\r\nconst getPageMetaProperty = (property) =\u003e {\r\n\treturn document.querySelector('meta[data-hid=\"' + property + '\"]')?.getAttribute('content') ?? undefined;\r\n}\r\n\r\nif (nlButton || frButton || deButton) {\r\n//console.log(\"Product is niet meer leverbaar.\");\r\n\r\nvar PARAM_showAfter = 0;\r\nvar PARAM_removeAfter = 0;\r\nvar PARAM_trigger = 'On entry';\r\nvar PARAM_parentElement = 'body';\r\n\r\nconst styles = `.ab-rating span{display:block;height:100%;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAAANCAMAAAAJ3xm2AAAAflBMVEX/////0zn///v//vj/0zf/1Ub/1kv/+eX/5I3//PH/+uv/11T/1EH//fT/8s7/1D3/9t3/6qr/55r/2V//11D/+ej/78T/8Mn/7r3/7Lb/4H3/33b/3m7/2Fn/+u3/67H/6ab/5pX/5In/9NX/6KH/9t//8MP/2mf/2mT/0i8kV9qPAAABPUlEQVQ4y32T2ZqCMAxGky5QdmQTFVBcZnn/FxyhbbRO9b/r4TT9khbQqcBNvHsBV+ausw18AqHowYka3QJT8VKgCvgncMbaKdCiODr6jI1TIErxBG8BKwWK3dMGrhCTiD2EsEDcPAsVooyZF5TXoUkRsQh+5vxOWH8eA7xHJofNtIzjpAUMarVdhC9Vk9DCPxBKtCnydfxIqbPlfoIH6BbhiJQk8gDakF4AnO/fXI+ncQ4E6K0wZl4QSa3fwGQnVjDYGWWNFi5W6EwD/A0Y1tXj2ktdcAabve4goleGa87wBqAOFcxNx+SnGkx0ohkY+EH8K8b8IAR1dEJRdQU2tuVIiCbfC9zSTFCorcSU+0GeLM+lPNDvN8wtAO9lZs8Pludy2ysagQoBWCdjP5iYGQSYGI/TpbwKrRG4B/wBeqgQ6mCzYZwAAAAASUVORK5CYII=)}.ab-rating{width:80px;height:13px;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAAANBAMAAADML/S3AAAAMFBMVEX////a2tr8/Pzr6+vv7+/29vb4+Pjd3d3z8/Pc3Nzi4uLf39/m5ubo6Ojk5OTh4eFXKiHAAAABI0lEQVQoz0XOvUoDURAF4ONudgnRBA9JXH8gXFEQrFbRWpPGxsJUipViZRdTW+wTiKkFUaysDNqkNJW1IKYWfAB/XiBzdwYyzcfuzJm5kDqCVmjGuypSc9V8MtuZOtO3QE3FSIloA182cFqzQGIB6ol1/llgPjcYLjkN2ECZXX//jeRlC9FOj7zZBvYvyIVvh7NH8SVDcSSN2xYq9HWHOLcODL2y89zLDGHuszYagDYOgFCDCHoaxIYGURZfoY05aKPhXdMgChpEkdRH/5Idb5usekvyRidGJFNMNkKc9TbJRe8USWeb+mKFW/wRYw7u6yLeq83Eu5xc5adDfvBanN7ESscHB4geRPy7YM+JhxmOU7H0iUJXDAA4M4Z+BCZOYD8xBhhyNtl9yoFfAAAAAElFTkSuQmCC)}.ab-rating-hidden{opacity:0}.ab-rating{width:80px;height:13px;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAAANBAMAAADML/S3AAAAMFBMVEX////a2tr8/Pzr6+vv7+/29vb4+Pjd3d3z8/Pc3Nzi4uLf39/m5ubo6Ojk5OTh4eFXKiHAAAABI0lEQVQoz0XOvUoDURAF4ONudgnRBA9JXH8gXFEQrFbRWpPGxsJUipViZRdTW+wTiKkFUaysDNqkNJW1IKYWfAB/XiBzdwYyzcfuzJm5kDqCVmjGuypSc9V8MtuZOtO3QE3FSIloA182cFqzQGIB6ol1/llgPjcYLjkN2ECZXX//jeRlC9FOj7zZBvYvyIVvh7NH8SVDcSSN2xYq9HWHOLcODL2y89zLDGHuszYagDYOgFCDCHoaxIYGURZfoY05aKPhXdMgChpEkdRH/5Idb5usekvyRidGJFNMNkKc9TbJRe8USWeb+mKFW/wRYw7u6yLeq83Eu5xc5adDfvBanN7ESscHB4geRPy7YM+JhxmOU7H0iUJXDAA4M4Z+BCZOYD8xBhhyNtl9yoFfAAAAAElFTkSuQmCC)}.ab-rating-wrapper{margin-bottom:1rem;display:flex;align-items:center;justify-content:flex-start;gap:.5rem}.ab-rating-votes{font-weight:500;font-size:14px;color:#646363}.pdp-reco{display:flex;align-items:center;justify-content:space-between;border:1px solid #f0f0f0;padding:15px;margin-bottom:-1px;border-radius:5px;background-color:#fff;position:relative}.container-wrapper{display:flex;align-items:center;width:100%}.item-image{flex-shrink:0;}.item-image img{width:80px;height:80px;border-radius:5px;object-fit:cover}.item-info{max-width:47%;flex:1}.item-button{position:absolute;right:20px;top:50%;transform:translateY(-50%)}.orange-button{height:40px;padding:8px 24px;color:#fff;background-color:#ea580c;border:none;font-weight:700;border-radius:4px;font-family:Barlow,sans-serif;font-size:initial;cursor:pointer}.orange-button:hover{background-color:#cc4e0b}button.orange-button{height:40px;padding:8px 24px;color:#fff;background-color:#ea580c;border:none;font-weight:700;border-radius:4px;font-family:Barlow,sans-serif;font-size:initial}.recommendationbox-pdp{background-color:#fff;width:100%;padding:10px;margin-top:0px;border-radius:5px;}.pdp-reco{border: 1px solid #f0f0f0;padding:15px 10px;display:flex;align-items:center}.pdp-reco img{border-radius:5px;margin-right:15px;width:80px;height:80px;object-fit:cover}.pdp-reco p{margin:0;font-size:18px;line-height:1.5;color:#333}.pdp-reco .price{font-weight:700;font-size:20px;color:#000}.overlay{color:#fff;z-index:49;background-color:rgba(0,0,0,0.5);position:absolute;top:0;left:0;width:100%;height:inherit;display:flex;justify-content:center;align-items:center;font-size:24px;font-family:Barlow,sans-serif;pointer-events:none;}.drawer_overlay{box-sizing:border-box;top:0;width:100%;height:100%;position:fixed;left:0;z-index:1000;background:rgba(46,45,44,.5);opacity:1;transition:all .2s ease-in-out;display:flex;flex-direction:column;align-items:end;}.content{box-sizing:inherit;background:white;font-family:'Barlow';padding:0;cursor:default;flex:1;overflow-y:auto;color:#2e2d2c;height:100%;width:100%;display:flex;flex-direction:column;animation:slideInRightVT cubic-bezier(0.56,0.01,0.42,1.04) .20s;}.banner_button_content{width:100%;height:100%;color:white;display:flex;align-items:center;justify-content:center;}.banner_button_content svg{margin-right:4px;}.banner_button_content span{font-size:15px;}`\r\nconst styleSheet = document.createElement(\"style\");\r\nstyleSheet.textContent = styles;\r\ndocument.head.appendChild(styleSheet);\r\n\r\nfunction addCSS() {\r\n    const style = document.createElement('style');\r\n    style.type = 'text/css';\r\n    style.innerHTML = `/* CSS Code Start */\r\n\r\n.drawer_overlay {\r\n\tbox-sizing: border-box;\r\n\ttop: 0;\r\n    width: 100%;\r\n    height: 100%;\r\n    position: fixed;\r\n    left: 0;\r\n    z-index: 1000;\r\n    background: rgba(46,45,44,.5);\r\n    opacity: 1;\r\n    transition: all .2s ease-in-out;\r\n    display: flex;\r\n    flex-direction: column;\r\n    align-items: end;\r\n}\r\n\r\n.content {\r\n\tbox-sizing: inherit;\r\n\tbackground: white;\r\n\tfont-family : 'Barlow';\r\n\tpadding: 0;\r\n\tcursor: default;\r\n\tflex: 1;\r\n\toverflow-y: auto;\r\n\tcolor: #2e2d2c;\r\n\theight: 100%;\r\n\twidth: 100%;\r\n    display: flex;\r\n    flex-direction: column;\r\n\tanimation: slideInRightVT cubic-bezier(0.56, 0.01, 0.42, 1.04) 0.20s;\r\n}\r\n\r\n@keyframes slideInRightVT {\r\n  0% {\r\n    opacity: 0;\r\n    transform: translateX(100%);\r\n  }\r\n  100% {\r\n    opacity: 1;\r\n    transform: translateX(0);\r\n  }\r\n}\r\n\r\n.content_title_wrapper {\r\n\tdisplay: flex;\r\n\tflex-direction: row;\r\n}\r\n\r\n.close { \r\n\tbackground: transparent;\r\n\tcolor: #2e2d2c;\r\n\tborder-width: 0;\r\n\tpadding: 0;\r\n\tpadding-right: 25px;\r\n\talign-self: start;\r\n\tposition: relative;\r\n\ttop: 20px;\r\n}\r\n\r\n.close:hover {\r\n\tcolor: #ea580c;\r\n}\r\n\r\n.h1-slidein {\r\n\tfont-size: 20px;\r\n\tfont-weight: 700;\r\n\tcolor: #000;\r\n\tmargin: 0;\r\n\tmargin-right: auto;\r\n\tpadding: 24px;;\r\n}\r\n\r\n.content_form {\r\n\tbox-sizing: inherit;\r\n\tpadding: 24px;\r\n\twidth: 100%;\r\n    flex-grow: 1;\r\n    display: flex;\r\n    flex-direction: column;\r\n}\r\n\r\n.form_input {\r\n\tbox-sizing: border-box;\r\n\tpadding: 8px 12px;\r\n\twidth: 100%;\r\n\theight: 40px;\r\n\tfont-size: 1rem;\r\n\tcursor: text;\r\n\tborder: 1px solid #dadada;\r\n\tborder-width: 1px;\r\n    border-radius: 4px;\r\n\tbox-shadow: inset 0 0 10px rgba(0,0,0,.05);\r\n    outline: none;\r\n    letter-spacing: 0.5px;\r\n}\r\n\r\n.input_wrapper {\r\n\tmargin-bottom: 16px;\r\n}\r\n\r\n\r\n.input_error {\r\n\tcolor: #bc2323;\r\n\tfont-size: 12px;\r\n\tpadding-top: 5px;\r\n\tdisplay: none;\r\n}\r\n\r\n.content_actions {\r\n\tdisplay: flex;\r\n\tjustify-content: center;\r\n\talign-items: center;\r\n\tpadding: 24px;\r\n\tborder-top: 1px solid #dadada;\r\n}\r\n\r\n.br_submit {\r\n\twidth: 100%;\r\n    padding: 12px 24px;\r\n    font: \"Barlow\", sans-serif;\r\n    box-shadow: none;\r\n    border: 1px solid;\r\n\tborder-radius: 4px;\r\n    border-color:  #ea580c;\r\n    text-transform: none;\r\n    background: #ea580c;\r\n    transition: all .2s ease-in-out;\r\n    overflow: hidden;\r\n    font-weight: 700;\r\n    height: 48px;\r\n    cursor: pointer;\r\n}\r\n\r\n.br_submit:hover {\r\n\topacity: .8;\r\n}\r\n\r\n.br_submit:disabled {\r\n\topacity: .3;\r\n}\r\n\r\n.button_content {\r\n\twidth: 100%;\r\n\theight: 100%;\r\n\tcolor: white;\r\n\tdisplay: flex;\r\n\talign-items: center;\r\n\tjustify-content: center;\r\n}\r\n\r\n.button_content span {\r\n\tfont-size: 15px;\r\n}\r\n\r\n.banner_link {\r\n    font-size: 16px;\r\n    font-weight: 400;\r\n    line-height: 19px;\r\n    text-decoration-line: underline;\r\n    color: #2e2d2c;\r\n}\r\n\r\n.exponea-error, .exponea-email-error {\r\n\tborder: 1px solid #bc2323;\r\n}\r\n\r\n#br-phone-number::-webkit-inner-spin-button, \r\n#br-phone-number::-webkit-outer-spin-button { \r\n    appearance: none;\r\n    margin: 0; \r\n}\r\n\r\n@media (min-width: 768px) {\r\n\t.content_title {\r\n    \tpadding-right: 48px;\r\n\t}\r\n\t.content {\r\n\t\twidth: 485px;\r\n\t}\r\n}\r\n\r\n/* CSS Code End */`;\r\n    document.head.appendChild(style);\r\n\t}\r\naddCSS();\r\n\t\r\n    \r\n    const priceElement = document.querySelector(\"#buySection .current-price-container p span\");\r\n    if (!priceElement) {\r\n//  \tconsole.error(\"Prijsselector niet gevonden!\");\r\n    } else {\r\n\r\n\t    const currentPriceText = priceElement.innerText;\r\n\t    const currentPrice = parseFloat(currentPriceText.replace(/[^\\d,-]/g, '').replace(',', '.'));\r\n\r\n\t        if (isNaN(currentPrice)) {\r\n\t  //    console.error(\"Kon prijs niet omzetten naar een geldig getal.\");\r\n\t        } else {\r\n\t  //    console.log(`Huidige prijs: €${currentPrice}`);\r\n\t\r\n\t        // Prijscategorie bepalen\r\n\t        function determineCategory(price) {\r\n\t            if (price \u003c 1000) return 'Low';\r\n\t            if (price \u003c 2500) return 'Mid';\r\n\t            return 'High';\r\n\t        }\r\n\r\n        const category = determineCategory(currentPrice);\r\n        //console.log(`Categorie: ${category}`);\r\n\r\n        let lowerBound, upperBound;\r\n        switch (category) {\r\n            case 'Low':\r\n                lowerBound = currentPrice * 0.6;\r\n                upperBound = currentPrice * 3.0;\r\n                break;\r\n            case 'Mid':\r\n                lowerBound = currentPrice * 0.8;\r\n                upperBound = currentPrice * 1.8;\r\n                break;\r\n            case 'High':\r\n                lowerBound = currentPrice * 0.8;\r\n                upperBound = currentPrice * 5.0;\r\n                break;\r\n        }\r\n\r\n           // console.log(`Prijsbereik: €${lowerBound.toFixed(2)} - €${upperBound.toFixed(2)}`);\r\n\r\n            const productWrapper = document.querySelector('.sf-gallery__stage');\r\n\r\n            if (productWrapper) {\r\n                const overlay = document.createElement('div');\r\n                overlay.className = 'overlay';\r\n                overlay.innerText = \"Nicht mehr lieferbar.\";\r\n                productWrapper.prepend(overlay);\r\n            } else {\r\n                console.warn(\"Kon de productwrapper niet vinden voor overlay.\");\r\n            }\r\n\r\n            const getJsonItemData = () =\u003e {\r\n                const itemData = document.querySelector('script[data-n-head=\"ssr\"][type=\"application/ld+json\"]')?.text;\r\n                return itemData ? JSON.parse(itemData) : null;\r\n            };\r\n\r\n            const itemData = getJsonItemData();\r\n            const itemId = itemData?.offers?.sku;\r\n            const prodTitle = itemData?.name;\r\n            const prodGroup = itemData?.product_group;\r\n            \r\n            if (!itemId) {\r\n                console.error(\"Kon item ID niet ophalen!\");\r\n            } else {\r\n               // console.log(`Item ID: ${itemId}`);\r\n\r\n\t\tconst text = getPageMetaProperty('og:description').toLowerCase(); // Ensure case-insensitivity\r\n\t\t\r\n\t\t\r\n\t\tvar webSite = window.location.hostname.includes(\"foto-gregor.de\") ? \"FG\" : \"KE\";\r\n\r\n\t\t\r\n        if (text.includes(\"objektiv\") \u0026\u0026 webSite === \"KE\" || text.includes('lens') \u0026\u0026 webSite === \"KE\") {\r\n           var recommendationEngine = \"678dfea7d3e9a2eb18dc9bf4\";\r\n        } else if (text.includes('gehäuse')  \u0026\u0026 webSite === \"KE\" || text.includes('kamera') \u0026\u0026 webSite === \"KE\") {\r\n           var recommendationEngine = \"678dfa651cc8858ee51624cb\";\r\n        } else if(webSite === \"KE\"){ recommendationEngine = \"6784cb08f5c685dfd797acd9\";} //677f969ecdd6b3974c86e268 \r\n        else if (text.includes(\"objektiv\") || text.includes('lens') \u0026\u0026 webSite === \"FG\") {\r\n           var recommendationEngine = \"679ca7db08cc30a66ed45e65\";\r\n        } else if (text.includes('gehäuse') || text.includes('kamera') \u0026\u0026 webSite === \"FG\") {\r\n           var recommendationEngine = \"679ca89fc2c594bd3154dba9\";\r\n        } else if(webSite === \"FG\") { recommendationEngine = \"679ca9b5b310b183c60ef101\";} //677f969ecdd6b3974c86e268 \r\n\r\n        \r\n        \r\n        //console.log(recommendationEngine)\r\n\r\n        const options = {\r\n            recommendationId: recommendationEngine,\r\n            callback: onRecommendationsLoaded,\r\n            size: 10,\r\n            items: { [itemId]: 1 },\r\n        };\r\n\r\n        function onRecommendationsLoaded(data) {\r\n           // console.log(\"Aanbevelingen ontvangen:\", data);\r\n\r\n            const buySection = document.querySelector(\"#buySection \u003e div\");\r\n                if (!buySection) {\r\n                    console.error(\"BuySection niet gevonden!\");\r\n                    return;\r\n                }\r\n\r\n            buySection.innerHTML = \"\"; \r\n            const recommendationsDiv = document.createElement('div');\r\n            recommendationsDiv.className = \"icon-usp-label\";\r\n            recommendationsDiv.innerHTML = `\r\n            \t\u003cspan class=\"not-available large sf-badge\" data-v-083af505=\"\" data-v-aee04296=\"\" style=\"--badge-color: false; --badge-background: false;\"\u003e \u003cspan data-v-083af505=\"\"\u003e Nicht mehr verfügbar\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\r\n                \u003cspan class=\"h7\" style=\"display: block; font-size: 18px;\"\u003eLeider ist dieses Produkt nicht mehr lieferbar.\u003c/span\u003e`;\r\n            buySection.appendChild(recommendationsDiv);\r\n\r\n            let recommendationsShown = 0;\r\n            const itemIds = [];\r\n\r\n            if (Array.isArray(data) \u0026\u0026 data.length \u003e 0) {\r\n            \t\r\n            \trecommendationsDiv.innerHTML += `Dieses Produkt ist nicht mehr in unserem Sortiment. Wir haben einige Alternativen für die ${prodTitle}. zusammengestellt.\u003cbr\u003e \u003cbr\u003e`;\r\n            \t\r\n                for (let item of data) {\r\n                    const itemPrice = parseFloat(item.item_price_with_cashback || item.item_price || 0);\r\n                    const productRating = Math.round(100 * item.average_review_rating / 5);\r\n                    const ratingClass = productRating === 0 ? 'ab-rating-hidden' : '';\r\n\t\t\t\t\tconst itemPic = item.image;\r\n\t\t\t\t\tconst recomProdGroup = item.product_group;\r\n\r\n\t                    if (itemPrice \u003e= lowerBound \u0026\u0026 itemPrice \u003c= upperBound \u0026\u0026 itemPic.includes('/media/')  ) {\r\n\t                        const itemDiv = document.createElement('div');\r\n\t                        itemDiv.className = \"pdp-reco\";\r\n\t                        itemDiv.innerHTML = `\r\n\t                            \u003cdiv class=\"container-wrapper\"\u003e\r\n\t                                \u003cdiv class=\"item-image\"\u003e\r\n\t                                    \u003ca href=\"${item.url}\" target=\"_blank\"\u003e\r\n\t                                        \u003cimg src=\"${getValidImageUrl(item.image)}\" alt=\"${item.title}\" class=\"reco-image\" /\u003e\r\n\t                                    \u003c/a\u003e\r\n\t                                \u003c/div\u003e\r\n\t                                \u003cdiv class=\"item-info\"\u003e\r\n\t                                    \u003cp class=\"item-name\"\u003e\r\n\t                                        \u003ca href=\"${item.url}?utm_source=bloomreach\u0026utm_campaign=osr-occ\" target=\"_blank\" style=\"font-weight: bold;\"\u003e\r\n\t                                            ${item.title}\r\n\t                                        \u003c/a\u003e\r\n\t                                    \u003c/p\u003e\r\n\t                                    \u003cp class=\"price\"\u003e€${itemPrice.toFixed(2)}\u003c/p\u003e\r\n\t                                    \u003cdiv class=\"ab-rating-wrapper ${ratingClass}\"\u003e\r\n\t                                        \u003cdiv class=\"ab-rating\"\u003e\r\n\t                                            \u003cspan style=\"width: ${productRating}%;\"\u003e\u003c/span\u003e\r\n\t                                        \u003c/div\u003e\r\n\t                                        \u003cdiv class=\"ab-rating-votes\"\u003e(${item.amount_of_reviews})\u003c/div\u003e\r\n\t                                    \u003c/div\u003e\r\n\t                                \u003c/div\u003e\r\n\t                                \u003cdiv class=\"item-button\"\u003e\r\n\t                                    \u003ca href=\"${item.url}?utm_source=bloomreach\u0026utm_campaign=osr-occ\" target=\"_blank\"\u003e\r\n\t                                        \u003cbutton class=\"orange-button\"\u003eZum Produkt\u003c/button\u003e\r\n\t                                    \u003c/a\u003e\r\n\t                                \u003c/div\u003e\r\n\t                            \u003c/div\u003e\r\n\t                        `;\r\n\t                        recommendationsDiv.appendChild(itemDiv);\r\n\t                        itemIds.push(item.item_id);\r\n\t\r\n\t                        recommendationsShown++;\r\n\t                        if (recommendationsShown \u003e= 3) break;\r\n\t                        }\r\n                }\r\n\r\n\t\t\t\t// Select the target div by its class name\r\n\t\t\t\tconst targetDiv = document.querySelector('.buy-section-wrapper');\r\n\t\t\t\t\r\n\t\t\t\t// Check if the target div exists\r\n\t\t\t\tif (targetDiv) {\r\n\t\t\t\t    // Create a new element to inject\r\n\t\t\t\t    const newButton = document.createElement('div');\r\n\t\t\t\t    // newButton.setAttribute('data-v-4bb7aa7c', '');\r\n\t\t\t\t    // newButton.setAttribute('data-v-04ed726d', '');\r\n\t\t\t\t    // newButton.setAttribute('link', '#');\r\n\t\t\t\t    // newButton.setAttribute('target', '_blank');\r\n\t\t\t\t    // newButton.className = 'icon-usp-container';\r\n\t\t\t\t\r\n\t\t\t\t    // Inner content for the new button\r\n\r\n\t\t\t\t    // Append the new element to the target div\r\n\t\t\t\t    targetDiv.appendChild(newButton);\r\n\t\t\t\t} \r\n\r\n\t\t\t    if (recommendationsShown === 0) {\r\n\t\t\t            recommendationsDiv.innerHTML += `\u003cp\u003eFür die ${prodTitle} können wir derzeit keine geeigneten Alternativen empfehlen.\u003c/p\u003e\r\n\t\t\t            \u003cdiv class=\"availability-wrapper\" data-v-aee04296=\"\"\u003e\u003cp class=\"body-text-small status-subtext not-available\" data-v-aee04296=\"\"\u003e\r\n\t\t\t\t\t\t\u003ca href=\"/contact\"\u003eKontaktiere uns gerne für Alternativen.\u003c/a\u003e\u003c/p\u003e\u003c/div\u003e`;\r\n\t\t\t    }\r\n\t    } else {\r\n\t        recommendationsDiv.innerHTML  += `\u003cp\u003eBrauchst du Beratung zu einer guten Alternative für die ${prodTitle}?\u003c/p\u003e \u003cdiv class=\"availability-wrapper\" data-v-aee04296=\"\"\u003e\u003cp class=\"body-text-small status-subtext not-available\" data-v-aee04296=\"\"\u003e\r\n\t\t\t\u003ca href=\"/contact\"\u003eKontaktiere uns gerne für Alternativen. \u003c/a\u003e\u003c/p\u003e\u003c/div\u003e`;\r\n\t    }\r\n\r\n\r\n                    if (recommendationsShown \u003e 0 \u0026\u0026 typeof exponea !== 'undefined') {\r\n                        const RECOMMENDATION_ID = options.recommendationId;\r\n\r\n                        exponea.track(\"recommendation\", {\r\n                            action: \"show\",\r\n                            item_ids: itemIds,\r\n                            recommendation_id: RECOMMENDATION_ID,\r\n                        });\r\n                        \r\n                        //\r\n                        //        const buttonContainer = document.createElement('div');\r\n                \t\t//\t\tbuttonContainer.style.textAlign = 'center';\r\n                \t\t//\t\tbuttonContainer.style.marginTop = '15px';\r\n                \t\t//\t\tbuttonContainer.innerHTML = '\u003cbutton class=\"br-exponea-btn sf-button--outline full-width sf-button\" style=\"padding: 10px 20px; font-size: 14px; border: 1px solid #ccc; background: #fff; cursor: pointer;\"\u003eMail mij bij voorraad\u003c/button\u003e';\r\n\t\t\t\t\t\t//\t\tdocument.querySelector(\"#buySection \u003e div \u003e div\").appendChild(buttonContainer);\r\n\t\t\t\t\t\t//\t    document.querySelector('.br-exponea-btn').addEventListener('click', createBanner);\r\n                        \r\n                    } else if (typeof exponea === 'undefined') {\r\n                        console.error(\"Exponea SDK is niet geladen!\");\r\n                    }\r\n                }\r\n                if (typeof exponea !== 'undefined') {\r\n                    exponea.getRecommendation(options);\r\n                } else {\r\n                    console.error(\"Exponea SDK is niet geladen!\");\r\n                }\r\n            }\r\n        }\r\n    }\r\n} else {\r\n    //console.log(\"Product is nog beschikbaar.\");\r\n}","trigger":{"include_pages":[{"type":"regex","regex":"^https?:\\/\\/(www\\.)?kamera-express\\.de\\/[a-z0-9-]"},{"type":"regex","regex":"^https?:\\/\\/(www\\.)?foto-gregor.de\\/[a-z0-9-]"}],"exclude_pages":[{"url":"checkout","type":"contains"},{"url":"bedankt/thank/you","type":"contains"},{"url":"warenkorb","type":"contains"},{"url":"account","type":"contains"},{"url":"gebrauchte","type":"contains"},{"url":"gebraucht","type":"contains"}]},"_id":"679ca26d6f7dbdf5409f3f90"},{"uses_overlay":false,"type":"js","parametrized_definition":"console.log('instore pickup tracking [nl]', 'debug')\r\nconst getProductIdUrl = () =\u003e {\r\n\tconst path_array = window.location.pathname.split('/');\r\n\treturn path_array[2] ?? '';\r\n}\r\n\r\nconst getProductStore = () =\u003e {\r\n\tvar e = document.querySelector(\"#fe_shops select\");\r\n\tvar value = e.options[e.selectedIndex]?.value;\r\n\tif(value){\r\n\t\treturn value.split(':')[1];\r\n\t}\r\n}\r\nconst getPageMetaProperty = (property) =\u003e {\r\n\treturn document.querySelector('meta[data-hid=\"' + property + '\"]')?.getAttribute('content') ?? undefined;\r\n}\r\n\r\nconst getJsonData = () =\u003e {\r\n\tconst data = document.querySelector('script[data-n-head=\"ssr\"][type=\"application/ld+json\"]')?.text;\r\n\tif(data) return JSON.parse(data);\r\n}\r\n\r\nconst defineLabel = (hostname) =\u003e {\r\n    if(hostname) {\r\n        if(hostname.includes('kamera-express')) return 'Kamera Express';\r\n        else if(hostname.includes('foto-gregor')) return 'Foto Gregor';\r\n        else if(hostname.includes('photogalerie')) return 'Photogalerie';\r\n        else if(hostname.includes('photospecialist')) return 'Photospecialist';\r\n    }\r\n    else {\r\n    \treturn '';\r\n    }\r\n}\r\n\r\nconst defineLocale = (language, country) =\u003e {\r\n\tif(language \u0026\u0026 country) return language + '_' + country.toUpperCase();\r\n}\r\n\r\nconst defineLanguage = () =\u003e {\r\n\tconst host = window.location.host;\r\n\tconst path = window.location.pathname;\r\n\tif(host.includes('kamera-express')){\r\n\t\tif((host.includes('.be') \u0026\u0026 !path.includes('/fr')) || host.includes('.nl')) return 'nl';\r\n\t\telse if((host.includes('.lu') \u0026\u0026 !path.includes('/de')) || host.includes('.fr') || (host.includes('.be') \u0026\u0026 path.includes('/fr') )) return 'fr';\r\n\t\telse if(host.includes('.lu') \u0026\u0026 path.includes('/de') || host.includes('.de')) return 'de';\r\n\t\t\r\n\t}\r\n\telse if(host.includes('photogalerie')){\r\n\t\treturn 'fr';\r\n\t}\r\n\telse if(host.includes('photospecialist')){\r\n\t\tif(host.includes('.uk') || host.includes('.com') || host.includes('.ie')) return 'en'\r\n\t\telse if(host.includes('at')) return 'de';\r\n\t\telse {\r\n\t\t\treturn host.split('.').pop();\r\n\t\t}\r\n\t\t\r\n\t}\r\n\telse if(host.includes('foto-gregor')){\r\n\t\treturn 'de'\r\n\t}\r\n};\r\n\r\nconst defineCountry = () =\u003e {\r\n\tconst host = window.location.host;\r\n\tif(host.split('.').pop() === 'uk') return 'gb';\r\n\tif(host.split('.').pop() === 'com' \u0026\u0026 host.includes('photogalerie')) return 'be';\r\n\tif(host.split('.').pop() === 'com' \u0026\u0026 host.includes('photospecialist')) return 'com';\r\n\treturn host.split('.').pop();\r\n\t\r\n}\r\n\r\n\r\n//\r\n// kenl-ispj-click-store-reservation - NL button click\r\n// kede-ispj-click-store-reservation - DE button click\r\n//\r\nconst trackEventPDP = () =\u003e {\r\n\tconst country = defineCountry();\r\n\tconst language = defineLanguage();\r\n\tconst locale = defineLocale(language, country);\r\n\tconst data = getJsonData();\r\n\t\r\n\texponea.track('kenl-ispj-click-store-reservation_test', {\r\n\t\tdomain : window.location.hostname,\r\n\t\treferrer : document.referrer,\r\n\t\tlabel : defineLabel(window.location.host),\r\n\t\tcountry : country,\r\n\t\tlanguage : language,\r\n\t\tlocale : locale,\r\n\t\titem_id : data?.offers?.sku ,\r\n\t\ttitle : data?.name,\r\n\t\turl : data?.['@id'],\r\n\t})\r\n}\r\n\r\n// \r\n// kenl-ispj-select-store - NL modal submit\r\n// kede-ispj-select-store - DE modal submit\r\n// \r\nconst trackEventModal = (store) =\u003e {\r\n\tif(store){\r\n\t\tconst country = defineCountry();\r\n\t\tconst language = defineLanguage();\r\n\t\tconst locale = defineLocale(language, country);\r\n\t\tconst data = getJsonData();\r\n\t\t\r\n\t\texponea.track('kenl-ispj-select-store_test', {\r\n\t\t\tdomain : window.location.hostname,\r\n\t\t\treferrer : document.referrer,\r\n\t\t\tlabel : defineLabel(window.location.host),\r\n\t\t\tcountry : country,\r\n\t\t\tlanguage : language,\r\n\t\t\tlocale : locale,\r\n\t\t\titem_id : data?.offers?.sku ,\r\n\t\t\ttitle : data?.name,\r\n\t\t\turl : data?.['@id'],\r\n\t\t\tstore_id : store\r\n\t\t})\r\n\t}\r\n}\r\n\r\n\r\n// \r\n//kenl-ispj-submitform-store-reservation - NL separate page form submission\r\n//kede-ispj-submitform-store-reservation - DE separate page form submission\r\n// \r\n\r\nconst trackFormSubmission = (store) =\u003e {\r\n\tconst country = defineCountry();\r\n\tconst language = defineLanguage();\r\n\tconst locale = defineLocale(language, country);\r\n\t\r\n\texponea.track('kenl-ispj-submitform-store-reservation_test', {\r\n\t\tdomain : window.location.hostname,\r\n\t\treferrer : document.referrer,\r\n\t\tlabel : defineLabel(window.location.host),\r\n\t\tcountry : country,\r\n\t\tlanguage : language,\r\n\t\tlocale : locale,\r\n\t\titem_id : getProductIdUrl(),\r\n\t\tstore_id : getProductStore() ?? ''\r\n\t})\r\n}\r\n\r\nconst waitForElm = (selector) =\u003e {\r\n    return new Promise(resolve =\u003e {\r\n        if (document.querySelector(selector)) {\r\n            return resolve(document.querySelector(selector));\r\n        }\r\n\r\n        const observer = new MutationObserver(mutations =\u003e {\r\n            if (document.querySelector(selector)) {\r\n                observer.disconnect();\r\n                resolve(document.querySelector(selector));\r\n            }\r\n        });\r\n\r\n        // If you get \"parameter 1 is not of type 'Node'\" error, see https://stackoverflow.com/a/77855838/492336\r\n        observer.observe(document.body, {\r\n            childList: true,\r\n            subtree: true\r\n        });\r\n    });\r\n}\r\n\r\n// pdp tracking, click + modal\r\nif(getPageMetaProperty('og:type')?.toLowerCase() === 'product'){\r\n\r\n\twaitForElm('.buy-section-delivery-container.delivery-button button').then(element =\u003e {\r\n\t\tconsole.log('1 found')\r\n\t\tif(!element.getAttribute('br-event-listener')){\r\n\t\t\telement.setAttribute('br-event-listener', true)\r\n\t\t\telement.addEventListener('click', () =\u003e {\r\n\t\t\t\ttrackEventPDP();\r\n\t\t\t\twaitForElm('.reserveren-button').then(modal_elm =\u003e {\r\n\t\t\t\t\tconsole.log('2 found')\r\n\t\t\t\t\tif(!modal_elm.getAttribute('br-event-listener')){\r\n\t\t\t\t\t\tmodal_elm.setAttribute('br-event-listener', true);\r\n\t\t\t\t\t\tmodal_elm.addEventListener('click', () =\u003e {\r\n\t\t\t\t\t\t\tconst store_id = document.querySelector('input[name=\"availables\"]:checked')?.value;\r\n\t\t\t\t\t\t\tif(store_id){\r\n\t\t\t\t\t\t\t\ttrackEventModal(store_id)\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t})\r\n\t\t\t\t\t}\r\n\t\t\t\t})\r\n\t\t\t})\r\n\t\t}\r\n\t})\r\n}\r\n\r\nif(window.location.pathname.includes('reserveren')){\r\n\twaitForElm('#form').then(element =\u003e {\r\n\t\tif(!element.getAttribute('br-submit-listener')){\r\n\t\t\telement.setAttribute('br-submit-listener', true);\r\n\t\t\telement.addEventListener('submit', () =\u003e {\r\n\t\t\t\tif(document.querySelectorAll('.ng-active').length === 0) trackFormSubmission();\r\n\t\t\t})\r\n\t\t}\r\n\t})\r\n}","trigger":{"include_pages":[{"url":"kamera-express.nl","type":"contains"}],"exclude_pages":null},"_id":"67aa06c099bb602cd266ae22"},{"uses_overlay":false,"type":"js","parametrized_definition":"const getProductIdUrl = () =\u003e {\r\n\tconst path_array = window.location.pathname.split('/');\r\n\treturn path_array[2] ?? '';\r\n}\r\n\r\nconst getProductStore = () =\u003e {\r\n\tvar e = document.querySelector(\"#fe_shops select\");\r\n\tvar value = e.options[e.selectedIndex]?.value;\r\n\tif(value){\r\n\t\treturn value.split(':')[1];\r\n\t}\r\n}\r\nconst getPageMetaProperty = (property) =\u003e {\r\n\treturn document.querySelector('meta[data-hid=\"' + property + '\"]')?.getAttribute('content') ?? undefined;\r\n}\r\n\r\nconst getJsonData = () =\u003e {\r\n\tconst data = document.querySelector('script[data-n-head=\"ssr\"][type=\"application/ld+json\"]')?.text;\r\n\tif(data) return JSON.parse(data);\r\n}\r\n\r\nconst defineLabel = (hostname) =\u003e {\r\n    if(hostname) {\r\n        if(hostname.includes('kamera-express')) return 'Kamera Express';\r\n        else if(hostname.includes('foto-gregor')) return 'Foto Gregor';\r\n        else if(hostname.includes('photogalerie')) return 'Photogalerie';\r\n        else if(hostname.includes('photospecialist')) return 'Photospecialist';\r\n    }\r\n    else {\r\n    \treturn '';\r\n    }\r\n}\r\n\r\nconst defineLocale = (language, country) =\u003e {\r\n\tif(language \u0026\u0026 country) return language + '_' + country.toUpperCase();\r\n}\r\n\r\nconst defineLanguage = () =\u003e {\r\n\tconst host = window.location.host;\r\n\tconst path = window.location.pathname;\r\n\tif(host.includes('kamera-express')){\r\n\t\tif((host.includes('.be') \u0026\u0026 !path.includes('/fr')) || host.includes('.nl')) return 'nl';\r\n\t\telse if((host.includes('.lu') \u0026\u0026 !path.includes('/de')) || host.includes('.fr') || (host.includes('.be') \u0026\u0026 path.includes('/fr') )) return 'fr';\r\n\t\telse if(host.includes('.lu') \u0026\u0026 path.includes('/de') || host.includes('.de')) return 'de';\r\n\t\t\r\n\t}\r\n\telse if(host.includes('photogalerie')){\r\n\t\treturn 'fr';\r\n\t}\r\n\telse if(host.includes('photospecialist')){\r\n\t\tif(host.includes('.uk') || host.includes('.com') || host.includes('.ie')) return 'en'\r\n\t\telse if(host.includes('at')) return 'de';\r\n\t\telse {\r\n\t\t\treturn host.split('.').pop();\r\n\t\t}\r\n\t\t\r\n\t}\r\n\telse if(host.includes('foto-gregor')){\r\n\t\treturn 'de'\r\n\t}\r\n};\r\n\r\nconst defineCountry = () =\u003e {\r\n\tconst host = window.location.host;\r\n\tif(host.split('.').pop() === 'uk') return 'gb';\r\n\tif(host.split('.').pop() === 'com' \u0026\u0026 host.includes('photogalerie')) return 'be';\r\n\tif(host.split('.').pop() === 'com' \u0026\u0026 host.includes('photospecialist')) return 'com';\r\n\treturn host.split('.').pop();\r\n\t\r\n}\r\n\r\n\r\n//\r\n// kenl-ispj-click-store-reservation - NL button click\r\n// kede-ispj-click-store-reservation - DE button click\r\n//\r\nconst trackEventPDP = () =\u003e {\r\n\tconst country = defineCountry();\r\n\tconst language = defineLanguage();\r\n\tconst locale = defineLocale(language, country);\r\n\tconst data = getJsonData();\r\n\t\r\n\texponea.track('kede-ispj-click-store-reservation_test', {\r\n\t\tdomain : window.location.hostname,\r\n\t\treferrer : document.referrer,\r\n\t\tlabel : defineLabel(window.location.host),\r\n\t\tcountry : country,\r\n\t\tlanguage : language,\r\n\t\tlocale : locale,\r\n\t\titem_id : data?.offers?.sku ,\r\n\t\ttitle : data?.name,\r\n\t\turl : data?.['@id'],\r\n\t})\r\n}\r\n\r\n// \r\n// kenl-ispj-select-store - NL modal submit\r\n// kede-ispj-select-store - DE modal submit\r\n// \r\nconst trackEventModal = (store) =\u003e {\r\n\tif(store){\r\n\t\tconst country = defineCountry();\r\n\t\tconst language = defineLanguage();\r\n\t\tconst locale = defineLocale(language, country);\r\n\t\tconst data = getJsonData();\r\n\t\t\r\n\t\texponea.track('kede-ispj-select-store_test', {\r\n\t\t\tdomain : window.location.hostname,\r\n\t\t\treferrer : document.referrer,\r\n\t\t\tlabel : defineLabel(window.location.host),\r\n\t\t\tcountry : country,\r\n\t\t\tlanguage : language,\r\n\t\t\tlocale : locale,\r\n\t\t\titem_id : data?.offers?.sku ,\r\n\t\t\ttitle : data?.name,\r\n\t\t\turl : data?.['@id'],\r\n\t\t\tstore_id : store\r\n\t\t})\r\n\t}\r\n}\r\n\r\n\r\n// \r\n//kenl-ispj-submitform-store-reservation - NL separate page form submission\r\n//kede-ispj-submitform-store-reservation - DE separate page form submission\r\n// \r\n\r\nconst trackFormSubmission = (store) =\u003e {\r\n\tconst country = defineCountry();\r\n\tconst language = defineLanguage();\r\n\tconst locale = defineLocale(language, country);\r\n\t\r\n\texponea.track('kede-ispj-submitform-store-reservation_test', {\r\n\t\tdomain : window.location.hostname,\r\n\t\treferrer : document.referrer,\r\n\t\tlabel : defineLabel(window.location.host),\r\n\t\tcountry : country,\r\n\t\tlanguage : language,\r\n\t\tlocale : locale,\r\n\t\titem_id : getProductIdUrl(),\r\n\t\tstore_id : getProductStore() ?? ''\r\n\t})\r\n}\r\n\r\nconst waitForElm = (selector) =\u003e {\r\n    return new Promise(resolve =\u003e {\r\n        if (document.querySelector(selector)) {\r\n            return resolve(document.querySelector(selector));\r\n        }\r\n\r\n        const observer = new MutationObserver(mutations =\u003e {\r\n            if (document.querySelector(selector)) {\r\n                observer.disconnect();\r\n                resolve(document.querySelector(selector));\r\n            }\r\n        });\r\n\r\n        // If you get \"parameter 1 is not of type 'Node'\" error, see https://stackoverflow.com/a/77855838/492336\r\n        observer.observe(document.body, {\r\n            childList: true,\r\n            subtree: true\r\n        });\r\n    });\r\n}\r\n\r\n// pdp tracking, click + modal\r\nif(getPageMetaProperty('og:type')?.toLowerCase() === 'product'){\r\n\r\n\twaitForElm('.buy-section-delivery-container.delivery-button button').then(element =\u003e {\r\n\t\tconsole.log('1 found')\r\n\t\tif(!element.getAttribute('br-event-listener')){\r\n\t\t\telement.setAttribute('br-event-listener', true)\r\n\t\t\telement.addEventListener('click', () =\u003e {\r\n\t\t\t\ttrackEventPDP();\r\n\t\t\t\twaitForElm('.reserveren-button').then(modal_elm =\u003e {\r\n\t\t\t\t\tconsole.log('2 found')\r\n\t\t\t\t\tif(!modal_elm.getAttribute('br-event-listener')){\r\n\t\t\t\t\t\tmodal_elm.setAttribute('br-event-listener', true);\r\n\t\t\t\t\t\tmodal_elm.addEventListener('click', () =\u003e {\r\n\t\t\t\t\t\t\tconst store_id = document.querySelector('input[name=\"availables\"]:checked')?.value;\r\n\t\t\t\t\t\t\tif(store_id){\r\n\t\t\t\t\t\t\t\ttrackEventModal(store_id)\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t})\r\n\t\t\t\t\t}\r\n\t\t\t\t})\r\n\t\t\t})\r\n\t\t}\r\n\t})\r\n}\r\n\r\nif(window.location.pathname.includes('reservieren')){\r\n\twaitForElm('#form').then(element =\u003e {\r\n\t\tif(!element.getAttribute('br-submit-listener')){\r\n\t\t\telement.setAttribute('br-submit-listener', true);\r\n\t\t\telement.addEventListener('submit', () =\u003e {\r\n\t\t\t\tif(document.querySelectorAll('.ng-active').length === 0) trackFormSubmission();\r\n\t\t\t})\r\n\t\t}\r\n\t})\r\n}","trigger":{"include_pages":[{"url":"kamera-express.de","type":"contains"}],"exclude_pages":null},"_id":"67aa186161f831855b26e8da"},{"uses_overlay":false,"type":"js","parametrized_definition":"(function () {\n    function updateCareplanDescription() {\n        // Zoek naar de p met class careplan-description op de hele pagina\n        var careplanDescription = document.querySelector(\"p.careplan-description\");\n        if (careplanDescription) {\n            var currentText = careplanDescription.textContent.trim();\n\n            // Controleer of \"3 Jahre\" al is toegevoegd om duplicaten te voorkomen\n            if (!currentText.startsWith(\"3 Jahre\")) {\n                careplanDescription.textContent = \"3 Jahre \" + currentText;\n            } else {\n            }\n        } else {\n        }\n    }\n\n    function waitForElement(selector, callback) {\n        var element = document.querySelector(selector);\n        if (element) {\n            callback();\n        } else {\n            var observer = new MutationObserver(function (mutations, obs) {\n                var element = document.querySelector(selector);\n                if (element) {\n                    obs.disconnect();\n                    callback();\n                }\n            });\n            observer.observe(document.body, { childList: true, subtree: true });\n        }\n    }\n\n    function init() {\n        // Wacht op #pdpIntro om te zorgen dat de pagina geladen is\n        waitForElement(\"#pdpIntro\", updateCareplanDescription);\n    }\n\n    init();\n})();\n","trigger":{"include_pages":[{"url":"kamera-express.de","type":"contains"},{"url":"foto-gregor.de","type":"contains"},{"url":"photospecialist.at","type":"contains"}],"exclude_pages":[{"url":"gebrauchtware","type":"contains"},{"url":"occasion","type":"contains"}]},"_id":"67d02923203bc2b799ae403d"},{"uses_overlay":false,"type":"js","parametrized_definition":"(function() {\n    const btn = document.querySelector('.add-to-cart-button .sf-button');\n    if (!btn) return console.warn('Knop niet gevonden');\n \n    const contentContainer = btn.querySelector('.button-content');\n    if (contentContainer) {\n      const icon = contentContainer.querySelector('svg');\n      const text = contentContainer.querySelector('.button-text');\n      if (icon) icon.remove();\n      if (text) text.textContent = 'Abonnement aanvragen';\n    }\n \n    btn.classList.remove('is-disabled--button');\n    btn.setAttribute('aria-disabled', 'false');\n \n    // Voeg CSS toe voor oranje hover op X\n    const style = document.createElement('style');\n    style.textContent = `\n      #custom-subscription-overlay .close-btn svg:hover path {\n        stroke: #f05a24;\n      }\n    `;\n    document.head.appendChild(style);\n \n    const overlay = document.createElement('div');\n    overlay.id = 'custom-subscription-overlay';\n    overlay.style.position = 'fixed';\n    overlay.style.top = '0';\n    overlay.style.left = '0';\n    overlay.style.width = '100vw';\n    overlay.style.height = '100vh';\n    overlay.style.background = 'rgba(0, 0, 0, 0.5)';\n    overlay.style.zIndex = '9999';\n    overlay.style.display = 'none';\n \n    const drawer = document.createElement('div');\n    drawer.style.padding = '60px 30px 30px 30px'; // Top 60px, Right 30px, Bottom 30px, Left 30px\n    drawer.style.backgroundColor = '#fff';\n    drawer.style.boxShadow = 'rgba(0, 0, 0, 0.1) 0px 4px 12px';\n    drawer.style.width = '500px';\n    drawer.style.marginLeft = 'auto';\n    drawer.style.height = '100vh';\n    drawer.style.color = '#333';\n    drawer.style.fontFamily = 'Barlow, sans-serif';\n    drawer.style.display = 'flex';\n    drawer.style.flexDirection = 'column';\n    drawer.style.position = 'relative';\n    drawer.style.transform = 'translateX(100%)';\n    drawer.style.transition = 'transform 0.3s ease-in-out';\n \n    const closeBtn = document.createElement('button');\n    closeBtn.setAttribute('aria-label', 'Sluiten');\n    closeBtn.className = 'close-btn';\n    closeBtn.innerHTML = `\n      \u003csvg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\u003e\n        \u003cpath d=\"M6 18L18 6M18 18L6 6\"\n          stroke=\"currentColor\"\n          stroke-width=\"2\"\n          stroke-linecap=\"round\"/\u003e\n      \u003c/svg\u003e\n    `;\n    closeBtn.style.position = 'absolute';\n    closeBtn.style.top = '20px';\n    closeBtn.style.right = '40px';\n    closeBtn.style.background = 'transparent';\n    closeBtn.style.border = 'none';\n    closeBtn.style.cursor = 'pointer';\n    closeBtn.style.padding = '0';\n \n    const iframe = document.createElement('iframe');\n    iframe.src = 'https://eb1jb1q5m1d.typeform.com/to/Q208saER';\n    iframe.style.border = 'none';\n    iframe.style.width = '100%';\n    iframe.style.height = '100%';\n    iframe.style.flex = '1';\n    iframe.allow = 'camera; microphone; autoplay; encrypted-media; fullscreen;';\n    iframe.setAttribute('title', 'Aanvraagformulier Abonnement');\n \n    function closeDrawer() {\n      drawer.style.transform = 'translateX(100%)';\n      setTimeout(() =\u003e overlay.style.display = 'none', 300);\n    }\n \n    closeBtn.addEventListener('click', closeDrawer);\n    overlay.addEventListener('click', (e) =\u003e {\n      if (e.target === overlay) closeDrawer();\n    });\n \n    drawer.appendChild(closeBtn);\n    drawer.appendChild(iframe);\n    overlay.appendChild(drawer);\n    document.body.appendChild(overlay);\n \n    btn.addEventListener('click', (e) =\u003e {\n      e.preventDefault();\n      overlay.style.display = 'flex';\n      overlay.style.justifyContent = 'flex-end';\n      requestAnimationFrame(() =\u003e {\n        drawer.style.transform = 'translateX(0)';\n      });\n    });\n \n    const sluitAfBadge = document.querySelector('.not-available.large.sf-badge');\n    if (sluitAfBadge) {\n      sluitAfBadge.innerHTML = `\n        \u003csvg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\"\n          xmlns=\"http://www.w3.org/2000/svg\"\u003e\n          \u003cpath d=\"M3.33203 9.33203L5.9987 11.9987L12.6654 5.33203\"\n            stroke=\"currentColor\"\n            stroke-width=\"1.33\"\n            stroke-linecap=\"round\"\n            stroke-linejoin=\"round\" /\u003e\n        \u003c/svg\u003e\n        \u003cspan\u003eSluit af in de winkel\u003c/span\u003e\n      `;\n \n      sluitAfBadge.classList.remove('not-available');\n      sluitAfBadge.classList.add('available');\n     \n      sluitAfBadge.style.color = '#00A984';\n      sluitAfBadge.style.backgroundColor = '#CCE6E6';\n      sluitAfBadge.style.padding = '3px 8px 4px';\n      sluitAfBadge.style.fontFamily = 'Barlow, sans-serif';\n      sluitAfBadge.style.fontSize = '18px';\n      sluitAfBadge.style.fontWeight = '700'; // \u003c-- changed from 600 to 700 (heavier)\n      sluitAfBadge.style.lineHeight = '17px';\n      sluitAfBadge.style.display = 'inline-flex';\n      sluitAfBadge.style.alignItems = 'center';\n      sluitAfBadge.style.gap = '8px';\n    } else {\n      console.warn('Element \"Sluit af in de winkel\" niet gevonden');\n    }\n \n // New: Hide \"Bekijk jouw dichtstbijzijnde winkel\" text\n const bekijkWinkelText = document.querySelector('.body-text-small.status-subtext.not-available');\n if (bekijkWinkelText) {\n   bekijkWinkelText.style.display = 'none';\n } else {\n   console.warn('Tekst \"Bekijk jouw dichtstbijzijnde winkel\" niet gevonden');\n }\n \n   // New Part: Fix buttons layout\n  // Fix buttons layout\n  const ophalenButton = document.querySelector('.buy-section-delivery-container');\n  if (ophalenButton) {\n    ophalenButton.style.display = 'none';\n  } else {\n    console.warn('\"Ophalen in de winkel\" knop niet gevonden');\n  }\n \n  const buySectionButtons = document.querySelector('.buy-section-buttons');\n  const aanvragenBtnWrapper = document.querySelector('.add-to-cart-button');\n  const aanvragenBtn = aanvragenBtnWrapper?.querySelector('button');\n  const heartButton = document.querySelector('.favorite-button');\n \n  if (buySectionButtons \u0026\u0026 aanvragenBtnWrapper \u0026\u0026 aanvragenBtn \u0026\u0026 heartButton) {\n    // Set parent to flex and full width\n    buySectionButtons.style.display = 'flex';\n    buySectionButtons.style.gap = '8px';\n    buySectionButtons.style.alignItems = 'center';\n    buySectionButtons.style.width = '100%';\n \n    // Fix width of buttons\n    aanvragenBtnWrapper.style.flex = '1 1 85%';\n    aanvragenBtn.style.width = '100%';\n    heartButton.style.flex = '0 0 56px'; // keep width fixed\n    heartButton.style.height = 'auto'; // allow height to stretch with aanvragen button\n    buySectionButtons.style.alignItems = 'stretch'; // stretch the heights\n   \n    heartButton.style.display = 'flex';\n    heartButton.style.alignItems = 'center';\n    heartButton.style.justifyContent = 'center';\n \n    // Move the heart button next to aanvragen button\n    buySectionButtons.insertBefore(heartButton, ophalenButton);\n  } else {\n    console.warn('Knoppen niet volledig gevonden om layout aan te passen');\n  }\n \n    // Update sticky \"In winkelwagen\" button\n    function openDrawer() {\n        const overlay = document.getElementById('custom-subscription-overlay');\n        const drawer = overlay?.querySelector('div');\n        if (overlay \u0026\u0026 drawer) {\n          overlay.style.display = 'flex';\n          overlay.style.justifyContent = 'flex-end';\n          requestAnimationFrame(() =\u003e {\n            drawer.style.transform = 'translateX(0)';\n          });\n        }\n      }\n   \n      // Function to update the sticky button\n      function updateStickyButton() {\n        const stickyButton = document.querySelector('.sf-button.is-disabled--button, .sf-button[aria-disabled=\"true\"]');\n        if (stickyButton) {\n          // Enable button\n          stickyButton.classList.remove('is-disabled--button');\n          stickyButton.setAttribute('aria-disabled', 'false');\n   \n          // Find content inside button\n          const stickyContentContainer = stickyButton.querySelector('.button-content-container');\n          if (stickyContentContainer) {\n            const stickyIcon = stickyContentContainer.querySelector('svg');\n            const stickyText = stickyContentContainer.querySelector('.button-text');\n   \n            if (stickyIcon) stickyIcon.remove(); // Remove shopping cart icon\n            if (stickyText) stickyText.textContent = 'Abonnement aanvragen';\n        }\n   \n          // Attach event to open drawer\n          stickyButton.removeEventListener('click', openDrawer); // remove if already attached\n          stickyButton.addEventListener('click', (e) =\u003e {\n            e.preventDefault();\n            openDrawer();\n          });\n        }\n      }\n   \n      // Initial run\n      updateStickyButton();\n   \n      // MutationObserver to fix button if re-rendered\n      const observer = new MutationObserver((mutations) =\u003e {\n        for (const mutation of mutations) {\n          if (mutation.type === 'childList' || mutation.type === 'attributes') {\n            updateStickyButton();\n          }\n        }\n      });\n   \n      observer.observe(document.body, {\n        childList: true,\n        subtree: true,\n        attributes: true,\n        attributeFilter: ['class', 'aria-disabled']\n      });\n \n \n      function updateUSPs() {\n        const usps = document.querySelectorAll('.buy-section-usps-container .icon-usp-container .icon-usp-label p');\n     \n        const newTexts = [\n          '\u003cstrong\u003eGeen\u003c/strong\u003e investering vooraf',\n          '\u003cstrong\u003eFlexibel\u003c/strong\u003e opzegbaar',\n          '\u003cstrong\u003eReparatie of vervanging\u003c/strong\u003e bij schade of diefstal',\n          'Apparatuur die met je \u003cstrong\u003emeegroeit\u003c/strong\u003e'\n        ];\n     \n        usps.forEach((usp, index) =\u003e {\n          if (newTexts[index]) {\n            usp.innerHTML = newTexts[index];\n          }\n        });\n      }\n      function disableUSPClicks() {\n        const uspContainers = document.querySelectorAll('.buy-section-usps-container .icon-usp-container');\n     \n        uspContainers.forEach(usp =\u003e {\n          usp.style.cursor = 'default'; // Maakt het visueel geen link/klikbaar\n          usp.addEventListener('click', function (event) {\n            event.preventDefault();      // Voorkom default click-gedrag\n            event.stopPropagation();     // Voorkom bubbling naar parent listeners\n          }, true); // Gebruik capture phase om eerder in te grijpen dan evt. andere listeners\n        });\n      }\n     \n     \n      // Functie om de inhoud van de slide-in bij te werken\n      function updateSlideIn() {\n        let slideInContainer = document.querySelector('.drawer-body');\n     \n        if (slideInContainer \u0026\u0026 slideInContainer.innerHTML.includes('Sorry, er liep iets mis, probeer later opnieuw')) {\n          // Verander de inhoud naar de gewenste tekst\n          slideInContainer.innerHTML = `\n            \u003cdiv data-v-6147ffda=\"\" class=\"drawer-content\" style=\"font-family: 'Barlow', sans-serif; text-align: left; padding-left: 30px; padding-right: 30px;\"\u003e\n             \n              \u003c!-- Title at the top with balanced spacing --\u003e\n              \u003ch1 style=\"font-size: 32px; font-weight: 800; color: #333; margin-bottom: 15px; margin-top: 10px; letter-spacing: 0px; line-height: 1.3;\"\u003e\n                Zo sluit je een Become a pro camera-abonnement af\n              \u003c/h1\u003e\n     \n              \u003c!-- Step 1: Kom naar een van onze winkels --\u003e\n              \u003cdiv style=\"margin-top: 20px; display: flex; align-items: flex-start; margin-bottom: 20px;\"\u003e\n                \u003cimg src=\"media/3dd0621d-bf0b-41c3-8d55-84dcc8cbca32/stores-svg.svg\" alt=\"Stores Icon\" style=\"width: 40px; height: 40px; margin-right: 15px; margin-top: 15px;\"\u003e \u003c!-- Adjust margin-top here --\u003e\n                \u003cdiv style=\"max-width: 400px;\"\u003e\n                  \u003ch3 style=\"font-size: 22px; color: #333; font-weight: 700; margin-bottom: 8px;\"\u003eStap 1: Kom naar de winkel\u003c/h3\u003e\n                  \u003cp style=\"font-size: 16px; color: #333; margin-top: 5px; word-wrap: break-word;\"\u003e\n                    Op dit moment is het alleen mogelijk om een abonnement af te sluiten in een van onze winkels. Het is niet nodig om hiervoor een afspraak te maken. Heb je vragen voor je naar onze winkels komt? Neem dan contact met ons op via \u003ca href=\"mailto:abonnementen@kamera-express.nl\" style=\"color: #333;\"\u003eabonnementen@kamera-express.nl\u003c/a\u003e. Onze experts helpen je graag!\n                  \u003c/p\u003e\n                \u003c/div\u003e\n              \u003c/div\u003e\n     \n              \u003c!-- Step 2: Kies een abonnement --\u003e\n              \u003cdiv style=\"margin-top: 20px; display: flex; align-items: flex-start; margin-bottom: 20px;\"\u003e\n                \u003cimg src=\"media/1595d235-666d-4425-8fde-759c2644697e/b2b-png.png\" alt=\"Subscription Icon\" style=\"width: 40px; height: 40px; margin-right: 15px; margin-top: 15px;\"\u003e\n                \u003cdiv style=\"max-width: 400px;\"\u003e\n                  \u003ch3 style=\"font-size: 22px; color: #333; font-weight: 700; margin-bottom: 8px;\"\u003eStap 2: Kies een abonnement\u003c/h3\u003e\n                  \u003cp style=\"font-size: 16px; color: #333; margin-top: 5px; word-wrap: break-word;\"\u003e\n                    Je kunt kiezen uit drie verschillende camera’s. In onze winkel kun je de apparatuur ervaren en zo kiezen welke camera met bijbehorend abonnement het beste bij jou past.\n                  \u003c/p\u003e\n                  \u003cp style=\"font-size: 16px; color: #333; word-wrap: break-word;\"\u003e\n                    Heb je vragen? Hieronder beantwoorden we veelgestelde vragen, maar onze experts staan ook voor je klaar in onze winkels.\n                  \u003c/p\u003e\n                \u003c/div\u003e\n              \u003c/div\u003e\n     \n              \u003c!-- Step 3: Profiteer van alle voordelen --\u003e\n              \u003cdiv style=\"margin-top: 20px; display: flex; align-items: flex-start; margin-bottom: 20px;\"\u003e\n                \u003cimg src=\"media/b7a4a67b-854d-4090-a7b1-738d6e3793f9/gebruiksklaar-icon.svg\" alt=\"Ready Icon\" style=\"width: 40px; height: 40px; margin-right: 15px; margin-top: 15px;\"\u003e\n                \u003cdiv style=\"max-width: 400px;\"\u003e\n                  \u003ch3 style=\"font-size: 22px; color: #333; font-weight: 700; margin-bottom: 8px;\"\u003eStap 3: Jouw voordelen\u003c/h3\u003e\n                  \u003cp style=\"font-size: 16px; color: #333; margin-top: 5px; word-wrap: break-word;\"\u003e\n                    Je hebt een camera-abonnement afgesloten, gefeliciteerd! Je kunt nu aan de slag met het maken van de mooiste beelden. Wat leg je als eerste vast?\n                  \u003c/p\u003e\n                  \u003cp style=\"font-size: 16px; color: #333; word-wrap: break-word;\"\u003e\n                    Daarnaast krijg je onbeperkt toegang tot onze Kamera Express Academy én word je lid van onze community.\n                  \u003c/p\u003e\n                \u003c/div\u003e\n              \u003c/div\u003e\n            \u003c/div\u003e\n          `;\n     \n          // Voeg de knop toe zoals in het voorbeeld, met de nieuwe link en tekst\n          let ctaContainer = document.createElement('div');\n          ctaContainer.classList.add('drawer-cta');\n          ctaContainer.innerHTML = `\n            \u003cdiv data-v-6147ffda=\"\" class=\"cta-container\" style=\"margin-top: auto; width: 100%; text-align: center;\"\u003e\n              \u003ca href=\"/abonnementen\" class=\"sf-button--outline full-width sf-button\" style=\"display: block; width: 100%; text-align: center; padding: 16px 32px; background-color: #fff; color: #000; text-decoration: none; font-weight: 700; text-transform: none; border-radius: 5px; border: 1px solid #ccc; font-family: 'Barlow', sans-serif; font-size: 16px;\"\u003e\n    Meer informatie over abonnementen           \u003c/a\u003e\n            \u003c/div\u003e\n          `;\n     \n          // Voeg de knop toe aan de slide-in\n          slideInContainer.appendChild(ctaContainer);\n     \n          // Voeg stijlen toe aan de container\n          slideInContainer.style.padding = '30px';\n          slideInContainer.style.backgroundColor = '#fff';\n          slideInContainer.style.borderRadius = '15px';\n          slideInContainer.style.boxShadow = '0 4px 12px rgba(0, 0, 0, 0.1)';\n          slideInContainer.style.maxWidth = '485px';  // Zorgt ervoor dat het overeenkomt met de stijl\n          slideInContainer.style.margin = '0 auto';\n          slideInContainer.style.color = '#333';\n          slideInContainer.style.fontFamily = '\"Barlow\", sans-serif';\n          slideInContainer.style.display = 'flex';\n          slideInContainer.style.flexDirection = 'column';\n          slideInContainer.style.justifyContent = 'space-between';\n          slideInContainer.style.position = 'absolute';\n          slideInContainer.style.right = '0';\n          slideInContainer.style.transition = 'transform .2s ease-in-out';\n          slideInContainer.style.height = '100vh';  // Zorg ervoor dat de container de volledige hoogte heeft\n     \n          // Zorg ervoor dat de knop goed wordt weergegeven zonder extra ruimte onderaan\n          slideInContainer.style.paddingBottom = '0'; // Verwijder onnodige ruimte onderaan\n        }\n      }\n     \n      // Functie om de overlay te controleren en de code toe te passen\n      function checkAndApply() {\n        let overlay = document.querySelector('.drawer'); // De overlay die de slide-in bevat\n     \n        if (overlay \u0026\u0026 overlay.style.display !== 'none') {\n          // Controleer of het de juiste overlay is door te zoeken naar de foutmelding\n          let slideInContainer = document.querySelector('.drawer-body');\n          if (slideInContainer \u0026\u0026 slideInContainer.innerHTML.includes('Sorry, er liep iets mis, probeer later opnieuw')) {\n            // Als de overlay zichtbaar is en de juiste foutmelding bevat, pas dan de code toe\n            updateSlideIn();\n          }\n        }\n      }\n     \n      // Verberg de specifieke USPs zodra de pagina wordt geladen\n      updateUSPs();\n      disableUSPClicks();\n     \n     \n      // Stel een interval in om de aanwezigheid van de slide-in te controleren\n      const observerInterval = setInterval(checkAndApply, 500); // Controleer elke 500ms\n \n  })();\n ","trigger":{"include_pages":[{"url":"https://www.kamera-express.nl/ultimate-abonnement-canon-eos-r6-mark-ii-24","type":"contains"},{"url":"https://www.kamera-express.nl/starter-abonnement-canon-eos-r50-18-45mm-le","type":"contains"},{"url":"https://www.kamera-express.nl/advanced-abonnement-canon-eos-r7-18-150mm-l","type":"contains"},{"url":"https://www.kamera-express.nl/ultimate-abonnement-sony-a7-iv-24-105mm-len","type":"contains"},{"url":"https://www.kamera-express.nl/advanced-abonnement-sony-a6700-18-135mm-len","type":"contains"},{"url":"https://www.kamera-express.nl/starter-abonnement-sony-zv-e10-ii-16-50mm-l","type":"contains"}],"exclude_pages":null},"_id":"6800a801fc1d750aef1f935c"},{"uses_overlay":false,"type":"js","parametrized_definition":"document.querySelectorAll('a').forEach(link =\u003e {\n  if (link.href.includes('howald') || link.href.includes('keuzekamp')) {\n    console.log('Gevonden:', link.href);\n    link.style.display = 'none';\n  }\n});\n","trigger":{"include_pages":[{"url":"/filialen","type":"contains"},{"url":"/winkels","type":"contains"},{"url":"/magasins","type":"contains"}],"exclude_pages":null},"_id":"684280ed2598e3ef26d5ab73"},{"uses_overlay":false,"type":"js","parametrized_definition":"(function () {\r\n  const TYPEFORM_URL = \"https://eb1jb1q5m1d.typeform.com/to/Q208saER?typeform-embed=embed-widget\";\r\n  console.log(\"[abonnementen] slideout init\");\r\n\r\n  function bind() {\r\n    injectStyles();\r\n\r\n    // Neutraliseer bestaande \u0026 toekomstige links naar het formulier\r\n    neutralizeNow();\r\n    observeForLateCtas();\r\n\r\n    // Delegated click (capturing) om ALTIJD vóór andere handlers te zitten\r\n    document.addEventListener(\"click\", function (e) {\r\n      const a = e.target.closest('a,button');\r\n      if (!isCta(a)) return;\r\n      e.preventDefault(); e.stopPropagation(); if (e.stopImmediatePropagation) e.stopImmediatePropagation();\r\n      openSlideout();\r\n    }, true);\r\n  }\r\n\r\n  if (document.readyState === \"loading\") {\r\n    document.addEventListener(\"DOMContentLoaded\", bind);\r\n  } else {\r\n    bind();\r\n  }\r\n\r\n  function isCta(el){\r\n    if (!el) return false;\r\n    const href = (el.getAttribute \u0026\u0026 (el.getAttribute('href')||\"\")) || \"\";\r\n    const txt  = (el.textContent||\"\").trim();\r\n    return /abonnement-?formulier/i.test(href) || /vraag\\s+vrijblijvend\\s+aan/i.test(txt) || el.classList?.contains('abonnementen-cta');\r\n  }\r\n\r\n  function neutralize(el){\r\n    if (!el) return;\r\n    if (el.tagName === 'A') { el.setAttribute('href','#'); el.removeAttribute('target'); }\r\n    el.style.cursor = 'pointer';\r\n  }\r\n\r\n  function neutralizeNow(){\r\n    document.querySelectorAll('a,button').forEach(el =\u003e { if (isCta(el)) neutralize(el); });\r\n  }\r\n\r\n  function observeForLateCtas(){\r\n    const mo = new MutationObserver(muts=\u003e{\r\n      muts.forEach(m=\u003e{\r\n        m.addedNodes \u0026\u0026 [...m.addedNodes].forEach(n=\u003e{\r\n          if (!(n instanceof HTMLElement)) return;\r\n          if (isCta(n)) neutralize(n);\r\n          n.querySelectorAll \u0026\u0026 n.querySelectorAll('a,button').forEach(el=\u003e{ if (isCta(el)) neutralize(el); });\r\n        });\r\n      });\r\n    });\r\n    mo.observe(document.documentElement,{childList:true,subtree:true});\r\n  }\r\n\r\n  function openSlideout(){\r\n    if (document.getElementById('custom-slideout-overlay')) return;\r\n\r\n    const overlay = document.createElement('div');\r\n    overlay.className = 'custom-slideout-overlay';\r\n    overlay.id = 'custom-slideout-overlay';\r\n\r\n    const panel = document.createElement('div');\r\n    panel.className = 'custom-slideout';\r\n\r\n    const closeBtn = document.createElement('button');\r\n    closeBtn.className = 'custom-slideout-close';\r\n    closeBtn.innerHTML = '\u0026times;';\r\n    closeBtn.addEventListener('click', () =\u003e overlay.remove(), { capture: true });\r\n\r\n    overlay.addEventListener('click', e =\u003e { if (!panel.contains(e.target)) overlay.remove(); }, { capture:true });\r\n\r\n    const iframe = document.createElement('iframe');\r\n    iframe.className = 'custom-slideout-iframe';\r\n    iframe.src = TYPEFORM_URL;\r\n    iframe.allow = 'camera; microphone; autoplay; encrypted-media;';\r\n    iframe.title = 'Vraag vrijblijvend aan';\r\n\r\n    panel.appendChild(closeBtn);\r\n    panel.appendChild(iframe);\r\n    overlay.appendChild(panel);\r\n    document.body.appendChild(overlay);\r\n  }\r\n\r\n  function injectStyles(){\r\n    const style = document.createElement('style');\r\n    style.innerHTML = `\r\n      .custom-slideout-overlay{position:fixed;inset:0;width:100%;height:100vh;background:rgba(0,0,0,.4);z-index:9998;display:flex;justify-content:flex-end}\r\n      .custom-slideout{width:540px;max-width:100%;background:#fff;height:100%;overflow:hidden;display:flex;flex-direction:column;position:relative;font-family:\"Barlow\",sans-serif;box-shadow:-2px 0 6px rgba(0,0,0,.1);animation:slideIn .3s ease-out;z-index:1}\r\n      @keyframes slideIn{from{transform:translateX(100%)}to{transform:translateX(0)}}\r\n      .custom-slideout-close{position:absolute;top:8px;right:12px;background:none;border:none;font-size:48px;cursor:pointer;line-height:1;width:56px;height:56px;display:flex;align-items:center;justify-content:center;z-index:9999;color:#111}\r\n      .custom-slideout-close:hover{color:#f26122}\r\n      .custom-slideout-iframe{flex:1;border:none;width:100%;height:100%;z-index:1}\r\n    `;\r\n    document.head.appendChild(style);\r\n  }\r\n})();\r\n","trigger":{"include_pages":[{"url":"https://www.kamera-express.nl/abonnementen","type":"contains"}],"exclude_pages":null},"_id":"686625bba0c326a252d5d6d8"},{"uses_overlay":false,"type":"js","parametrized_definition":"setTimeout(function () {\r\n  (function () {\r\n    function findLastRelevantParagraph() {\r\n      const paragraphs = [...document.querySelectorAll(\"p\")];\r\n\r\n      const matchTexts = [\r\n        // FR\r\n        \"formulaire ci-dessous\",\r\n        \"questions sur nos prix\",\r\n        // NL\r\n        \"vragen hebben over onze prijzen\",\r\n        // DE\r\n        \"fragen zu unseren preisen\",\r\n        // EN\r\n        \"questions about our pricing\",\r\n        \"form below\",\r\n        // IT (PhotoSpecialist pricing block)\r\n        \"domande sui nostri prezzi\",\r\n        \"modulo sottostante\",\r\n        \"il prezzo dei nostri prodotti dipende\",\r\n        \"prezzi migliori per voi\",\r\n        // ES\r\n        \"pregunta sobre nuestros precios\",\r\n        \"rellenando el siguiente formulario\"\r\n      ];\r\n\r\n      // 1) Try keyword match (your original approach)\r\n      const byText = paragraphs\r\n        .slice()\r\n        .reverse()\r\n        .find((p) =\u003e\r\n          matchTexts.some((text) =\u003e\r\n            (p.innerText || \"\").toLowerCase().includes(text.toLowerCase())\r\n          )\r\n        );\r\n      if (byText) return byText;\r\n\r\n      // 2) Fallback for these \"Sempre il miglior prezzo\" pages:\r\n      // the paragraph sits inside the content-highlight block (see your screenshot)\r\n      const highlightP = document.querySelector(\r\n        \".content-highlight-container .body-text p, .content-highlight-container p\"\r\n      );\r\n      if (highlightP \u0026\u0026 (highlightP.innerText || \"\").trim().length \u003e 20) return highlightP;\r\n\r\n      // 3) Last resort: pick the last non-empty paragraph on the page\r\n      const lastNonEmpty = paragraphs\r\n        .slice()\r\n        .reverse()\r\n        .find((p) =\u003e (p.innerText || \"\").trim().length \u003e 20);\r\n      return lastNonEmpty || null;\r\n    }\r\n\r\n    function detectLanguage(text) {\r\n      const lower = (text || \"\").toLowerCase();\r\n\r\n      if (lower.includes(\"formulaire ci-dessous\")) return \"fr\";\r\n      if (lower.includes(\"questions sur nos prix\")) return \"fr\";\r\n      if (lower.includes(\"vragen hebben over onze prijzen\")) return \"nl\";\r\n      if (lower.includes(\"fragen zu unseren preisen\")) return \"de\";\r\n      if (lower.includes(\"questions about our pricing\")) return \"en\";\r\n\r\n      // IT\r\n      if (lower.includes(\"domande sui nostri prezzi\")) return \"it\";\r\n      if (lower.includes(\"modulo sottostante\")) return \"it\";\r\n      if (lower.includes(\"il prezzo dei nostri prodotti dipende\")) return \"it\";\r\n      if (lower.includes(\"prezzi migliori per voi\")) return \"it\";\r\n\r\n      // ES\r\n      if (lower.includes(\"pregunta sobre nuestros precios\")) return \"es\";\r\n\r\n      // Fallback: use \u003chtml lang=\"...\"\u003e\r\n      const htmlLang = (document.documentElement.getAttribute(\"lang\") || \"\").toLowerCase();\r\n      if (htmlLang.startsWith(\"it\")) return \"it\";\r\n      if (htmlLang.startsWith(\"fr\")) return \"fr\";\r\n      if (htmlLang.startsWith(\"de\")) return \"de\";\r\n      if (htmlLang.startsWith(\"en\")) return \"en\";\r\n      if (htmlLang.startsWith(\"es\")) return \"es\";\r\n      if (htmlLang.startsWith(\"nl\")) return \"nl\";\r\n\r\n      return \"nl\";\r\n    }\r\n\r\n    function alreadyInjected() {\r\n      return (\r\n        document.querySelector(\".custom-slideout-btn\") ||\r\n        document.getElementById(\"custom-slideout-overlay\")\r\n      );\r\n    }\r\n\r\n    function init() {\r\n      if (alreadyInjected()) return true;\r\n\r\n      const paragraph = findLastRelevantParagraph();\r\n      if (!paragraph) return false;\r\n\r\n      const lang = detectLanguage(paragraph.innerText);\r\n\r\n      const labels = {\r\n        nl: \"Vul het contactformulier in\",\r\n        fr: \"Remplir le formulaire de contact\",\r\n        de: \"Kontaktformular ausfüllen\",\r\n        en: \"Fill in the contact form\",\r\n        it: \"Compila il modulo di contatto\",\r\n        es: \"Rellena el formulario de contacto\"\r\n      };\r\n\r\n      const style = document.createElement(\"style\");\r\n      style.innerHTML = `\r\n        .custom-slideout-btn {\r\n          font-family: \"Barlow\", sans-serif;\r\n          font-weight: 700;\r\n          font-size: 1rem;\r\n          text-transform: none;\r\n          text-decoration: none;\r\n          border-radius: 4px;\r\n          padding: 8px 24px;\r\n          border: 0;\r\n          cursor: pointer;\r\n          transition: background 0.3s ease;\r\n          height: 40px;\r\n          display: inline-flex;\r\n          align-items: center;\r\n          justify-content: center;\r\n          gap: 4px;\r\n          background: #ea580c;\r\n          color: #fff;\r\n          line-height: 1.2;\r\n          white-space: nowrap;\r\n          box-shadow: none;\r\n          margin-top: 16px;\r\n        }\r\n\r\n        .custom-slideout-btn:hover { background-color: #f26122; }\r\n\r\n        .custom-slideout-overlay {\r\n          position: fixed;\r\n          top: 0;\r\n          right: 0;\r\n          width: 100%;\r\n          height: 100vh;\r\n          background-color: rgba(0, 0, 0, 0.4);\r\n          z-index: 9998;\r\n          display: flex;\r\n          justify-content: flex-end;\r\n        }\r\n\r\n        .custom-slideout {\r\n          width: 540px;\r\n          max-width: 100%;\r\n          background-color: white;\r\n          height: 100%;\r\n          overflow: hidden;\r\n          display: flex;\r\n          flex-direction: column;\r\n          position: relative;\r\n          font-family: \"Barlow\", sans-serif;\r\n          box-shadow: -2px 0 6px rgba(0, 0, 0, 0.1);\r\n          animation: slideIn 0.3s ease-out;\r\n          z-index: 1;\r\n        }\r\n\r\n        @keyframes slideIn {\r\n          from { transform: translateX(100%); }\r\n          to { transform: translateX(0%); }\r\n        }\r\n\r\n        .custom-slideout-close {\r\n          position: absolute;\r\n          top: 8px;\r\n          right: 12px;\r\n          background: none;\r\n          border: none;\r\n          font-size: 48px;\r\n          cursor: pointer;\r\n          line-height: 1;\r\n          width: 56px;\r\n          height: 56px;\r\n          display: flex;\r\n          align-items: center;\r\n          justify-content: center;\r\n          z-index: 9999;\r\n          color: #111;\r\n        }\r\n\r\n        .custom-slideout-close:hover { color: #f26122; }\r\n\r\n        .custom-slideout-iframe {\r\n          flex: 1;\r\n          border: none;\r\n          width: 100%;\r\n          height: 100%;\r\n          z-index: 1;\r\n        }\r\n      `;\r\n      document.head.appendChild(style);\r\n\r\n      const button = document.createElement(\"button\");\r\n      button.innerText = labels[lang] || labels.nl;\r\n      button.className = \"custom-slideout-btn\";\r\n      button.type = \"button\";\r\n\r\n      const wrapper = document.createElement(\"p\");\r\n      wrapper.style.marginTop = \"16px\";\r\n      wrapper.appendChild(button);\r\n\r\n      paragraph.insertAdjacentElement(\"afterend\", wrapper);\r\n\r\n      const createSlideout = () =\u003e {\r\n        const overlay = document.createElement(\"div\");\r\n        overlay.className = \"custom-slideout-overlay\";\r\n        overlay.id = \"custom-slideout-overlay\";\r\n\r\n        const slideout = document.createElement(\"div\");\r\n        slideout.className = \"custom-slideout\";\r\n\r\n        const closeBtn = document.createElement(\"button\");\r\n        closeBtn.className = \"custom-slideout-close\";\r\n        closeBtn.innerHTML = \"\u0026times;\";\r\n        closeBtn.addEventListener(\"click\", () =\u003e overlay.remove());\r\n\r\n        overlay.addEventListener(\"click\", (e) =\u003e {\r\n          if (!slideout.contains(e.target)) overlay.remove();\r\n        });\r\n\r\n        const iframe = document.createElement(\"iframe\");\r\n        iframe.className = \"custom-slideout-iframe\";\r\n        iframe.src = \"https://eb1jb1q5m1d.typeform.com/to/LJ675wfR\";\r\n        iframe.allow = \"camera; microphone; autoplay; encrypted-media;\";\r\n        iframe.title = \"Contactformulier\";\r\n\r\n        slideout.appendChild(closeBtn);\r\n        slideout.appendChild(iframe);\r\n        overlay.appendChild(slideout);\r\n        document.body.appendChild(overlay);\r\n      };\r\n\r\n      button.addEventListener(\"click\", () =\u003e {\r\n        if (!document.getElementById(\"custom-slideout-overlay\")) {\r\n          createSlideout();\r\n        }\r\n      });\r\n\r\n      return true;\r\n    }\r\n\r\n    const maxAttempts = 20; // ~10s\r\n    let attempts = 0;\r\n\r\n    const tryInit = () =\u003e {\r\n      attempts++;\r\n      const ok = init();\r\n      if (ok || attempts \u003e= maxAttempts) clearInterval(timer);\r\n      if (!ok \u0026\u0026 attempts \u003e= maxAttempts) {\r\n        console.error(\"❌ Geen relevante paragraaf gevonden (na retries).\");\r\n      }\r\n    };\r\n\r\n    const timer = setInterval(tryInit, 500);\r\n    tryInit();\r\n  })();\r\n}, 2000);\r\n","trigger":{"include_pages":[{"url":"/altijd-de-beste-prijs","type":"contains"},{"url":"/toujours-le-meilleur-prix","type":"contains"},{"url":"/siempre-el-mejor-precio","type":"contains"},{"url":"/sempre-il-miglior-prezzo","type":"contains"},{"url":"/immer-der-beste-preis","type":"contains"},{"url":"/always-the-best-price","type":"contains"}],"exclude_pages":null},"_id":"686bd8ca71181f8d413e8d66"},{"uses_overlay":false,"type":"js","parametrized_definition":"(function () {\n  const OFFSET = 80;                               // hoogte van de zwarte balk\n  const TRIM   = 20;                               // minder hoog maken (px)\n  const IF_SEL = 'iframe[src*=\"google.com/maps\"]'; // evt. specifieker\n  const FALLBACK_H = 480;\n\n  function measure(el) {\n    return (\n      parseInt(el.getAttribute('height'), 10) ||\n      el.getBoundingClientRect().height ||\n      parseInt(getComputedStyle(el).height, 10) ||\n      0\n    );\n  }\n\n  // Bepaal \"basis\" hoogte. Als hij al gewrapt is, zit OFFSET er al bij → eraf halen.\n  function baseHeight(iframe) {\n    const raw = measure(iframe);\n    const wrapped = iframe.parentElement \u0026\u0026 iframe.parentElement.dataset.keMapWrapper === '1';\n    return Math.max((wrapped ? raw - OFFSET : raw) || 0, FALLBACK_H);\n  }\n\n  function applyHeights(iframe, base) {\n    const visible = Math.max(base - TRIM, 100); // zichtbare hoogte iets kleiner\n    const wrap = iframe.parentElement;\n    if (wrap \u0026\u0026 wrap.dataset.keMapWrapper) wrap.style.height = visible + 'px';\n    iframe.style.height = (visible + OFFSET) + 'px';\n    iframe.dataset.keBase = String(base);\n  }\n\n  function wrapAndCrop(iframe) {\n    if (!iframe || iframe.dataset.keWrapped) return;\n\n    // wrapper\n    const wrap = document.createElement('div');\n    wrap.dataset.keMapWrapper = '1';\n    wrap.style.position = 'relative';\n    wrap.style.overflow = 'hidden';\n    wrap.style.width = '100%';\n\n    const parent = iframe.parentNode;\n    parent.insertBefore(wrap, iframe);\n    wrap.appendChild(iframe);\n\n    // iframe omhoog schuiven\n    iframe.style.position = 'relative';\n    iframe.style.display  = 'block';\n    iframe.style.top      = `-${OFFSET}px`;\n    iframe.style.width    = '100%';\n\n    // hoogte zetten\n    applyHeights(iframe, baseHeight(iframe));\n\n    // één recalibratie (bij load of na 1.5s)\n    const recalibrate = () =\u003e applyHeights(iframe, baseHeight(iframe));\n    iframe.addEventListener('load', recalibrate, { once: true });\n    setTimeout(recalibrate, 1500);\n\n    iframe.dataset.keWrapped = '1';\n  }\n\n  function run() {\n    document.querySelectorAll(IF_SEL).forEach(wrapAndCrop);\n  }\n\n  if (document.readyState === 'complete') run();\n  else window.addEventListener('load', run);\n\n  // lichte observer (lazy/SPAs), stopt na 20s\n  const mo = new MutationObserver((muts) =\u003e {\n    muts.forEach(m =\u003e {\n      m.addedNodes.forEach(n =\u003e {\n        if (n.nodeType !== 1) return;\n        if (n.matches \u0026\u0026 n.matches(IF_SEL)) wrapAndCrop(n);\n        if (n.querySelectorAll) n.querySelectorAll(IF_SEL).forEach(wrapAndCrop);\n      });\n    });\n  });\n  mo.observe(document.documentElement, { childList: true, subtree: true });\n  setTimeout(() =\u003e mo.disconnect(), 20000);\n})();\n","trigger":{"include_pages":[{"url":"/magasins","type":"exact"},{"url":"/filialen","type":"exact"},{"url":"/winkels","type":"exact"}],"exclude_pages":null},"_id":"68999825ccbc4a79022fecbb"},{"uses_overlay":false,"type":"js","parametrized_definition":"(function () {\n    let attempts = 0;\n    const maxAttempts = 10;\n    let observer;\n\n    // 🔑 Configuratie (jouw tabel)\n    const alternatives = [\n        {\n            match: \"leica-19191-d-lux-8-compact-camera\",\n            altUrl: \"leica-19197-d-lux-8-100-years-of-leica\",\n            title: \"Leica 19197 D-Lux 8 100 YEARS OF LEICA\",\n            image: \"media/fcdc7ed9-6fcf-4b99-b797-719dd5486eeb/leica-19197-d-lux-8-100-years-of-leica.jpg\"\n        },\n        {\n            match: \"canon-powershot-g7x-mark-iii\",\n            altUrl: \"canon-powershot-v1\",\n            title: \"Canon Powershot V1\",\n            image: \"media/e815183b-4835-4e8b-b6b4-384433342ca0/canon-powershot-v1.webp\"\n        },\n        {\n            match: \"canon-eos-2000d\",\n            altUrl: \"canon-eos-r100-rf-s-18-45mm-is-stm\",\n            title: \"Canon EOS R100 + RF-S 18-45mm IS STM\",\n            image: \"media/e89962f2-b414-4f6e-9316-49d85576320d/canon-eos-r100-rf-s-18-45mm-is-stm.jpg\"\n        },\n        {\n            match: \"brother-ads-1800w-scanner\",\n            altUrl: \"canon-scanner-imageformula-r10-\",\n            title: \"Canon imageFORMULA R10/P-215II\",\n            image: \"media/08d8b07d-c6a0-4232-bb2e-55df76f2bfda/canon-scanner-imageformula-r10.jpg\"\n        },\n        {\n            match: \"ricoh-fi-8170\",\n            altUrl: \"canon-imageformula-dr-m160ii-a4-scanner\",\n            title: \"Canon imageFORMULA DR-M160II A4 Scanner\",\n            image: \"media/889bb36b-dfbe-46dc-b428-fa28de5cc367/canon-imageformula-dr-m160ii-a4-scanner.jpg\"\n        },\n        {\n            match: \"canon-powershot-sx740-hs-lite-edition-black\",\n            altUrl: \"panasonic-lumix-dc-tz99-black\",\n            title: \"Panasonic Lumix DC-TZ99 Black\",\n            image: \"media/caf624b0-a162-43a6-ac69-ca7f38683759/panasonic-lumix-dc-tz99-black.jpg\"\n        },\n        {\n            match: \"canon-powershot-sx740-hs-lite-edition-silve\",\n            altUrl: \"panasonic-lumix-dc-tz99-silver-black\",\n            title: \"Panasonic Lumix DC-TZ99 Silver/Black\",\n            image: \"media/1c4202ec-8bb6-4f0f-b125-2c03afd49503/panasonic-lumix-dc-tz99-silver-black.jpg\"\n        },\n        {\n            match: \"lacie-rugged-4tb-usb-c-externe-harde-schijf\",\n            altUrl: \"glyph-blackbox-plus-4-tb-5400rpm-bus-powere\",\n            title: \"Glyph Blackbox Plus 4 TB 5400RPM Bus-powered USB-C (3.1Gen2)\",\n            image: \"media/2cd2557e-1be9-449b-9835-5ac06629796a/glyp-atom-plus-1.jpg\"\n        },\n        {\n            match: \"lacie-2tb-rugged-usb-3-1-type-c\",\n            altUrl: \"glyph-blackbox-plus-2-tb-5400rpm-bus-powere\",\n            title: \"Glyph Blackbox Plus 2 TB 5400RPM Bus-powered USB-C (3.1Gen2)\",\n            image: \"media/197325f6-c932-48d5-ae5b-2dfaa7e7a8d2/glyp-atom-plus-1.jpg\"\n        },\n        {\n            match: \"rollei-compact-traveler-mini-m1-statief-zwa\",\n            altUrl: \"sirui-ke-tt-50-tafelstatief-kamera-express-\",\n            title: \"Sirui KE-TT-50 Tafelstatief - Kamera Express Exclusive\",\n            image: \"media/e3beace9-458a-418d-bc25-5c20e1b198a4/sirui-ke-tt-50-tafelstatief-kamera-express-.jpg\"\n        },\n        {\n            match: \"caruba-compactstar51-tafelstatief-zwart-\",\n            altUrl: \"sirui-ke-tt-50-tafelstatief-kamera-express-\",\n            title: \"Sirui KE-TT-50 Tafelstatief - Kamera Express Exclusive\",\n            image: \"media/e3beace9-458a-418d-bc25-5c20e1b198a4/sirui-ke-tt-50-tafelstatief-kamera-express-.jpg\"\n        },\n        {\n            match: \"peli-1514-studiokoffer-zwart-met-verdelerse\",\n            altUrl: \"wcs-protection-520tr-koffer-zwart-incl-verdelerset\",\n            title: \"WCS Protection 520TR koffer zwart incl. verdelerset\",\n            image: \"media/bf867af5-e0a4-4831-954b-fd55d9464af6/wcs-protection-520tr-koffer-zwart-incl-verd.jpg\"\n        }\n    ];\n\n    // 🕵️ Zoek alternatief op basis van \"contains\"\n    function getAlternative() {\n        const currentUrl = window.location.href;\n        return alternatives.find(item =\u003e currentUrl.includes(item.match));\n    }\n\n    function replaceElement() {\n        const targetElement = document.querySelector(\".buy-section-usps-container\");\n\n        // Voorkom dubbel invoegen\n        const alreadyInserted = document.querySelector(\".pdp-reco\");\n        if (alreadyInserted) {\n            if (observer) observer.disconnect();\n            console.log(\"⚠️ Alternatief product is al toegevoegd, niets meer doen.\");\n            return;\n        }\n\n        const alternative = getAlternative();\n        if (!alternative) {\n            console.log(\"ℹ️ Geen alternatief gevonden voor deze PDP.\");\n            if (observer) observer.disconnect();\n            return;\n        }\n\n        if (targetElement) {\n            if (observer) observer.disconnect();\n\n            targetElement.insertAdjacentHTML(\"afterend\", `\n                \u003cspan class=\"h7\" style=\"display: block; font-size: 18px; font-weight: 700; color: #000; margin-top: 20px; margin-bottom:10px;\"\u003eAlternatief product\u003c/span\u003e\n                \u003cdiv class=\"pdp-reco\" style=\"box-sizing: border-box; font-family: 'Barlow', sans-serif; color: #2e2d2c; border-top: none !important;\"\u003e\n                    \u003cdiv class=\"container-wrapper\" style=\"display: flex; align-items: center; padding: 10px 24px; border: 1px solid #dadada; border-radius: 4px; background: white;\"\u003e\n                        \u003cdiv class=\"item-image\" style=\"width: 20%; text-align: center;\"\u003e\n                            \u003ca href=\"/${alternative.altUrl}\"\u003e\n                                \u003cimg src=\"/${alternative.image}\" alt=\"${alternative.title}\" class=\"reco-image\" style=\"max-width: 100%; height: auto; border-radius: 4px;\"\u003e\n                            \u003c/a\u003e\n                        \u003c/div\u003e\n                        \u003cdiv class=\"item-info\" style=\"width: 55%; text-align: left; padding: 0 16px;\"\u003e\n                            \u003cp class=\"item-name\" style=\"font-size: 16px; font-weight: bold; margin-bottom: 8px;\"\u003e\n                                \u003ca href=\"/${alternative.altUrl}\" style=\"color: #2e2d2c; text-decoration: none;\"\u003e\n                                   ${alternative.title}\n                                \u003c/a\u003e\n                            \u003c/p\u003e\n                        \u003c/div\u003e\n                        \u003cdiv class=\"item-button\" style=\"width: 25%; text-align: center;\"\u003e\n                            \u003ca href=\"/${alternative.altUrl}\"\u003e\n                                \u003cbutton class=\"orange-button\" style=\"width: 100%; padding: 12px 24px; font-family: 'Barlow', sans-serif; font-weight: 700; font-size: 16px; border: 1px solid #ea580c; border-radius: 4px; background: #ea580c; color: white; cursor: pointer; transition: opacity .2s ease-in-out;\"\u003e\n                                    Bekijk\n                                \u003c/button\u003e\n                            \u003c/a\u003e\n                        \u003c/div\u003e\n                    \u003c/div\u003e\n                \u003c/div\u003e\n            `);\n\n            console.log(`✅ Alternatief product \"${alternative.title}\" toegevoegd!`);\n        } else {\n            if (attempts \u003c maxAttempts) {\n                console.warn(`⏳ Wachten op element .buy-section-usps-container... (poging ${attempts + 1} van ${maxAttempts})`);\n                attempts++;\n                setTimeout(replaceElement, 500);\n            } else {\n                if (observer) observer.disconnect();\n                console.warn(\"❌ Maximaal aantal pogingen bereikt. Element niet gevonden.\");\n            }\n        }\n    }\n\n    replaceElement();\n\n    observer = new MutationObserver(() =\u003e {\n        replaceElement();\n    });\n\n    observer.observe(document.body, { childList: true, subtree: true });\n})();\n","trigger":{"include_pages":[{"url":"https://www.kamera-express.nl/leica-19191-d-lux-8-compact-camera","type":"contains"},{"url":"https://www.kamera-express.nl/canon-eos-2000d-","type":"contains"},{"url":"https://www.kamera-express.nl/brother-ads-1800w-scanner","type":"contains"},{"url":"https://www.kamera-express.nl/ricoh-fi-8170","type":"contains"},{"url":"https://www.kamera-express.nl/canon-powershot-sx740-hs-lite-edition-black","type":"contains"},{"url":"https://www.kamera-express.nl/canon-powershot-sx740-hs-lite-edition-silve","type":"contains"},{"url":"https://www.kamera-express.nl/lacie-rugged-4tb-usb-c-externe-harde-schijf","type":"contains"},{"url":"https://www.kamera-express.nl/lacie-2tb-rugged-usb-3-1-type-c","type":"contains"},{"url":"https://www.kamera-express.nl/rollei-compact-traveler-mini-m1-statief-zwa","type":"contains"},{"url":"https://www.kamera-express.nl/caruba-compactstar51-tafelstatief-zwart-","type":"contains"},{"url":"https://www.kamera-express.nl/peli-1514-studiokoffer-zwart-met-verdelerse","type":"contains"}],"exclude_pages":null},"_id":"68ac1566e4f44aa4172bf824"},{"uses_overlay":false,"type":"js","parametrized_definition":"(function () {\n\n  const SELECTORS = [\n    '.buyback-widget',\n    'div[data-v-app].buyback-widget',\n    'script[src*=\"widget.reusely.com\"]'\n  ];\n\n  const COPY = {\n    nl: {\n      usps: [\n        'Altijd de beste prijs voor jouw apparatuur',\n        'Snelle uitbetaling bij inruil van je gear',\n        'Gratis opsturen of afleveren in de winkel'\n      ],\n      cta: 'Vraag prijsvoorstel aan',\n    },\n    fr: {\n      usps: [\n        'Toujours le meilleur prix',\n        'Paiement rapide',\n        'Livraison gratuite ou retrait en magasin'\n      ],\n      cta: 'Demander une estimation',\n    },\n    de: {\n      usps: [\n        'Faire und fachkundige Bewertung',\n        'Sofortiger Rabatt auf deinen nächsten Einkauf',\n        'Kostenloser Versand oder Abgabe im Store'\n      ],\n      cta: 'Preisangebot anfordern',\n    }\n  };\n\n  const DESKTOP_BREAKPOINT = 992;\n  const SCROLL_OFFSET = 80;\n  const HIDE_WHEN_IN_VIEWPORT = true;\n  const BAR_ID = 'ke-tradein-sticky';\n\n  const STEP_LABELS = ['Productkeuze', 'Gegevens', 'Prijsvoorstel'];\n  const STEP_STYLE_ID = 'step-tooltip-label-style';\n\n  const once = (fn) =\u003e { let ran=false; return function(){ if(!ran){ran=true; fn.apply(this, arguments);} }; };\n\n  function detectLang() {\n    const h1 = document.querySelector('h1');\n    if (h1) {\n      const norm = (h1.textContent || '')\n        .normalize('NFD')\n        .replace(/[\\u0300-\\u036f]/g, '')\n        .replace(/[\\s\\u00A0]+/g, ' ')\n        .trim()\n        .toLowerCase();\n\n      if (/inruilen\\s*of\\s*verkopen/.test(norm)) return 'nl';\n      if (/echanger\\s*ou\\s*vendre/.test(norm))   return 'fr';\n      if (/inzahlungnahme\\s*oder\\s*verkauf/.test(norm)) return 'de';\n    }\n\n    const htmlLang = (document.documentElement.getAttribute('lang') || '').toLowerCase();\n    if (htmlLang.startsWith('fr')) return 'fr';\n    if (htmlLang.startsWith('de')) return 'de';\n    if (htmlLang.startsWith('nl')) return 'nl';\n\n    const href = location.pathname.toLowerCase();\n    if (href.includes('/fr/')) return 'fr';\n    if (href.includes('/de/')) return 'de';\n    if (href.includes('/nl/')) return 'nl';\n\n    return 'nl';\n  }\n\n  function findWidgetEl() {\n    for (const sel of SELECTORS) {\n      const el = document.querySelector(sel);\n      if (el) return el;\n    }\n    const script = document.querySelector('script[src*=\"widget.reusely.com\"]');\n    return script ? script.parentElement : null;\n  }\n\n  function smoothScrollTo(el) {\n    if (!el) return;\n    const rect = el.getBoundingClientRect();\n    const absoluteY = window.scrollY + rect.top - SCROLL_OFFSET;\n    window.scrollTo({ top: absoluteY \u003e= 0 ? absoluteY : 0, behavior: 'smooth' });\n  }\n\n  function injectBarStyles() {\n    if (document.getElementById(BAR_ID + '-style')) return;\n    const css = `\n      #${BAR_ID} {\n        position: sticky; bottom: 0; left: 0; right: 0;\n        z-index: 2147483000;\n        background: #ffffff;\n        box-shadow: 0 -8px 30px rgba(0,0,0,.08);\n        font-family: inherit;\n        opacity: 0;\n        transform: translateY(12px);\n        transition: transform .28s ease, opacity .28s ease;\n        will-change: transform, opacity;\n      }\n      #${BAR_ID}.show { opacity: 1; transform: translateY(0); }\n      #${BAR_ID}.hide { opacity: 0; transform: translateY(12px); pointer-events: none; visibility: hidden; }\n      @media (prefers-reduced-motion: reduce) {\n        #${BAR_ID} { transition: none !important; }\n      }\n\n      #${BAR_ID} .container {\n        max-width: 1344px; margin: 0 auto;\n        padding: 18px 20px;\n        min-height: 75px;\n        display: flex; align-items: center; gap: 40px;\n      }\n      #${BAR_ID} .usps {\n        display: flex;\n        flex: 1;\n        gap: 24px;\n        justify-content: space-between;\n        align-items: center;\n        flex-wrap: nowrap;\n      }\n      #${BAR_ID} .usp {\n        display: inline-flex; align-items: center; gap: 8px;\n        font-size: 16px; line-height: 1.3; white-space: nowrap;\n      }\n      #${BAR_ID} .usp svg { flex: 0 0 auto; width: 16px; height: 16px; }\n\n      #${BAR_ID} .cta {\n        appearance: none; cursor: pointer; border: 0;\n        background: #ea580c; color: #fff;\n        padding: 11px 28px;\n        border-radius: 4px; font-weight: 700; font-size: 16px; white-space: nowrap;\n        transition: background-color .2s ease;\n      }\n      #${BAR_ID} .cta:hover,\n      #${BAR_ID} .cta:focus-visible {\n        background: rgba(234,88,12,0.8);\n        outline: none;\n      }\n\n      @media (max-width: ${DESKTOP_BREAKPOINT - 1}px) {\n        #${BAR_ID} .container { min-height: unset; padding: 12px 16px; justify-content: center; }\n        #${BAR_ID} .usps { display: none; }\n        #${BAR_ID} .cta { width: 100%; max-width: 520px; }\n      }\n\n      @media (max-width: 1180px) {\n        #${BAR_ID} .usps { gap: 16px; justify-content: flex-start; flex-wrap: wrap; }\n      }\n    `;\n    const style = document.createElement('style');\n    style.id = BAR_ID + '-style';\n    style.textContent = css;\n    document.head.appendChild(style);\n  }\n\n  function svgCheck() {\n    return `\n\u003csvg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\"\n     xmlns=\"http://www.w3.org/2000/svg\" class=\"checkmark-usp-icon\"\n     aria-hidden=\"true\" focusable=\"false\"\u003e\n  \u003cpath d=\"M3.33203 9.33203L5.9987 11.9987L12.6654 5.33203\"\n        stroke=\"#00a984\" stroke-width=\"1.33\"\n        stroke-linecap=\"round\" stroke-linejoin=\"round\"\u003e\u003c/path\u003e\n\u003c/svg\u003e`;\n  }\n\n  function buildBar(copy) {\n    if (document.getElementById(BAR_ID)) return;\n\n    const bar = document.createElement('div');\n    bar.id = BAR_ID;\n    bar.setAttribute('role', 'region');\n    bar.classList.add('hide');\n\n    const container = document.createElement('div');\n    container.className = 'container';\n\n    const usps = document.createElement('div');\n    usps.className = 'usps';\n\n    copy.usps.forEach(text =\u003e {\n      const item = document.createElement('div');\n      item.className = 'usp';\n      item.innerHTML = svgCheck() + `\u003cspan\u003e${text}\u003c/span\u003e`;\n      usps.appendChild(item);\n    });\n\n    const btn = document.createElement('button');\n    btn.className = 'cta';\n    btn.type = 'button';\n    btn.textContent = copy.cta;\n    btn.addEventListener('click', function () {\n      const target = findWidgetEl();\n      if (target) smoothScrollTo(target);\n    });\n\n    container.appendChild(usps);\n    container.appendChild(btn);\n    bar.appendChild(container);\n\n    const spacer = document.createElement('div');\n    spacer.id = BAR_ID + '-spacer';\n    spacer.style.height = '0px';\n\n    document.body.appendChild(spacer);\n    document.body.appendChild(bar);\n\n    const ro = new ResizeObserver(() =\u003e {\n      spacer.style.height = bar.classList.contains('hide') ? '0px' : (bar.offsetHeight + 'px');\n    });\n    ro.observe(bar);\n\n    return bar;\n  }\n\n  // 🔥 aangepaste logica\n  function setupAutoHide(bar, target) {\n    if (!HIDE_WHEN_IN_VIEWPORT || !target) {\n      requestAnimationFrame(() =\u003e { bar.classList.add('show'); });\n      return;\n    }\n\n    const spacer = document.getElementById(BAR_ID + '-spacer');\n\n    const update = () =\u003e {\n      const rect = target.getBoundingClientRect();\n      const vpH = window.innerHeight || document.documentElement.clientHeight;\n\n      // Widget staat nog onder de vouw → hide\n      if (rect.top \u003e= vpH) {\n        bar.classList.remove('show');\n        bar.classList.add('hide');\n        if (spacer) spacer.style.height = '0px';\n        return;\n      }\n\n      // Widget in beeld → hide\n      if (rect.bottom \u003e 0) {\n        bar.classList.remove('show');\n        bar.classList.add('hide');\n        if (spacer) spacer.style.height = '0px';\n        return;\n      }\n\n      // Widget voorbijgescrolld → show\n      bar.classList.remove('hide');\n      bar.classList.add('show');\n      if (spacer) spacer.style.height = bar.offsetHeight + 'px';\n    };\n\n    window.addEventListener('scroll', update);\n    window.addEventListener('resize', update);\n    update();\n  }\n\n  function getCandidateRoots() {\n    return [\n      document,\n      ...Array.from(document.querySelectorAll('*'))\n        .map(el =\u003e el.shadowRoot)\n        .filter(Boolean),\n    ];\n  }\n\n  function ensureStepLabelStyles(root) {\n    const target = root.head || root;\n    if (!target.querySelector?.(`#${STEP_STYLE_ID}`)) {\n      const style = document.createElement('style');\n      style.id = STEP_STYLE_ID;\n      style.textContent = `\n        .step-tooltip { position: relative; }\n        .step-tooltip .step-label {\n          position: absolute;\n          top: calc(100% + 6px);\n          left: 50%;\n          transform: translateX(-50%);\n          font-size: 12px;\n          line-height: 1;\n          white-space: nowrap;\n          color: inherit;\n          pointer-events: none;\n        }\n        .step.step--active .step-tooltip .step-label { font-weight: 600; }\n      `;\n      target.appendChild(style);\n    }\n  }\n\n  function applyStepLabelsToRoot(root) {\n    const tooltips = root.querySelectorAll?.('.step-main .step .step-tooltip');\n    if (!tooltips || !tooltips.length) return false;\n\n    ensureStepLabelStyles(root);\n\n    tooltips.forEach((tt, i) =\u003e {\n      let label = tt.querySelector('.step-label');\n      if (!label) {\n        label = document.createElement('div');\n        label.className = 'step-label';\n        tt.appendChild(label);\n      }\n      label.textContent = STEP_LABELS[i] || `Stap ${i + 1}`;\n    });\n    return true;\n  }\n\n  function applyStepLabels() {\n    const roots = getCandidateRoots();\n    for (const r of roots) {\n      applyStepLabelsToRoot(r);\n    }\n  }\n\n  const init = once(function () {\n    const lang = detectLang();\n    const copy = COPY[lang] || COPY.nl;\n    injectBarStyles();\n    const bar = buildBar(copy);\n    const target = findWidgetEl();\n    if (bar) setupAutoHide(bar, target || null);\n\n    applyStepLabels();\n\n    const mo = new MutationObserver(() =\u003e { applyStepLabels(); });\n    mo.observe(document.documentElement, { childList: true, subtree: true });\n  });\n\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', init, { once: true });\n  } else {\n    init();\n  }\n})();\n","trigger":{"include_pages":[{"url":"/inruilen","type":"contains"}],"exclude_pages":null},"_id":"68ac457174f40e6d1911705e"},{"uses_overlay":false,"type":"js","parametrized_definition":"setTimeout(() =\u003e {\r\n  (() =\u003e {\r\n    const TYPEFORM_SRC =\r\n      \"https://eb1jb1q5m1d.typeform.com/to/tuA4eauh?typeform-embed=embed-widget\";\r\n\r\n    const findClickable = () =\u003e {\r\n      // meest stabiel: match op de daadwerkelijke link van de CTA\r\n      const a = document.querySelector(\r\n        'a.link-container[href=\"https://www.kamera-express.nl/formulier-verzekeringspakket\"]'\r\n      );\r\n      if (a) return a;\r\n\r\n      // fallback: elke \u003ca\u003e met deze href\r\n      return document.querySelector(\r\n        'a[href=\"https://www.kamera-express.nl/formulier-verzekeringspakket\"]'\r\n      );\r\n    };\r\n\r\n    const clickable = findClickable();\r\n    if (!clickable) {\r\n      console.warn(\"Slide-out: CTA link niet gevonden.\");\r\n      return;\r\n    }\r\n\r\n    if (!document.getElementById(\"custom-slideout-style\")) {\r\n      const style = document.createElement(\"style\");\r\n      style.id = \"custom-slideout-style\";\r\n      style.innerHTML = `\r\n        .custom-slideout-overlay{\r\n          position:fixed; inset:0; width:100%; height:100vh;\r\n          background-color:rgba(0,0,0,.4);\r\n          z-index:9998; display:flex; justify-content:flex-end;\r\n        }\r\n        .custom-slideout{\r\n          width:540px; max-width:100%; height:100%;\r\n          background:#fff; display:flex; flex-direction:column;\r\n          position:relative; font-family:\"Barlow\",sans-serif;\r\n          box-shadow:-2px 0 6px rgba(0,0,0,.1);\r\n          animation:slideIn .3s ease-out;\r\n        }\r\n        @keyframes slideIn{from{transform:translateX(100%);}to{transform:translateX(0%);}}\r\n        .custom-slideout-close{\r\n          position:absolute; top:8px; right:12px;\r\n          background:none; border:none; font-size:36px; cursor:pointer;\r\n          line-height:1; width:40px; height:40px;\r\n          display:flex; align-items:center; justify-content:center;\r\n          color:#111; z-index:1;\r\n        }\r\n        .custom-slideout-close:hover{color:#f26122;}\r\n        .custom-slideout-iframe{flex:1; border:none; width:100%; height:100%;}\r\n      `;\r\n      document.head.appendChild(style);\r\n    }\r\n\r\n    const createSlideout = () =\u003e {\r\n      const overlay = document.createElement(\"div\");\r\n      overlay.className = \"custom-slideout-overlay\";\r\n      overlay.id = \"custom-slideout-overlay\";\r\n\r\n      const slideout = document.createElement(\"div\");\r\n      slideout.className = \"custom-slideout\";\r\n\r\n      const closeBtn = document.createElement(\"button\");\r\n      closeBtn.className = \"custom-slideout-close\";\r\n      closeBtn.type = \"button\";\r\n      closeBtn.innerHTML = \"\u0026times;\";\r\n      closeBtn.addEventListener(\"click\", () =\u003e overlay.remove());\r\n\r\n      overlay.addEventListener(\"click\", (e) =\u003e {\r\n        if (!slideout.contains(e.target)) overlay.remove();\r\n      });\r\n\r\n      const iframe = document.createElement(\"iframe\");\r\n      iframe.className = \"custom-slideout-iframe\";\r\n      iframe.src = TYPEFORM_SRC;\r\n      iframe.allow = \"camera; microphone; autoplay; encrypted-media;\";\r\n      iframe.title = \"Verzekering aanvragen\";\r\n\r\n      slideout.appendChild(closeBtn);\r\n      slideout.appendChild(iframe);\r\n      overlay.appendChild(slideout);\r\n      document.body.appendChild(overlay);\r\n    };\r\n\r\n    // attach maar 1x, geen retries/polling\r\n    if (!clickable.dataset.slideoutAttached) {\r\n      clickable.dataset.slideoutAttached = \"1\";\r\n      clickable.addEventListener(\r\n        \"click\",\r\n        (e) =\u003e {\r\n          e.preventDefault();\r\n          if (e.stopImmediatePropagation) e.stopImmediatePropagation();\r\n          e.stopPropagation();\r\n\r\n          if (!document.getElementById(\"custom-slideout-overlay\")) {\r\n            createSlideout();\r\n          }\r\n        },\r\n        { capture: true, passive: false }\r\n      );\r\n    }\r\n  })();\r\n}, 1000);","trigger":{"include_pages":[{"url":"https://www.kamera-express.nl/uitgebreid-zekerheidspakket","type":"contains"}],"exclude_pages":null},"_id":"68c023f21ea1b570f6343446"},{"uses_overlay":false,"type":"js","parametrized_definition":"(function () {\r\n  \"use strict\";\r\n  \r\n  const titleEl =\r\n  document.querySelector(\"h1.pdpintro-title\") ||\r\n  document.querySelector(\"h1.pdpintro__title\") ||\r\n  document.querySelector(\"h1\");\r\n\r\nconst titleText = (titleEl?.textContent || \"\").toLowerCase();\r\n\r\nconst shouldRun = titleText.includes(\"occasion\");\r\nif (!shouldRun) return;\r\n\r\n  // =========================\r\n  // CONFIG\r\n  // =========================\r\n  const DEBUG = false;\r\n  const TAG = \"[2H-PDP]\";\r\n\r\n  const iconURL =\r\n    \"https://www.kamera-express.nl/media/2df505a2-2d5f-42c5-af7a-165584f27481/second-hand-check-png.png\";\r\n  const infoIconURL =\r\n    \"https://kamera-express.nl/media/93b40321-ffd4-41b6-9c21-f815d8f6c8d1/info-icon-png.png\";\r\n\r\n  function log(...a) { if (DEBUG) console.log(TAG, ...a); }\r\n  function warn(...a) { if (DEBUG) console.warn(TAG, ...a); }\r\n  function err(...a) { console.error(TAG, ...a); }\r\n\r\n  let observer = null;\r\n\r\n  // =========================\r\n  // FIX 1: Drawer content\r\n  // - In my trimmed version you had placeholders (\"Uitleg conditie...\")\r\n  // - Also: in your original code you added listeners calling createDrawer(...)\r\n  //   but that function doesn't exist. That can break the click logic.\r\n  // This version uses ONLY createCustomDrawer + your original content HTML.\r\n  // =========================\r\n  const contentConditie = `\r\n    \u003cdiv class=\"drawerInfo\"\u003e\r\n      \u003cp style=\"padding: 10px 0;\"\u003e\r\n        Onze experts lopen elk product dat we innemen na voordat deze in de verkoop gaat. Op basis van deze controle bepalen zij de algemene conditie van het product. Wel zo fijn, want dan weet jij wat je mag verwachten.\r\n      \u003c/p\u003e\r\n\r\n      \u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 16px;\"\u003e\r\n        \u003cdiv style=\"flex: 1 1 calc(50% - 8px); border: 1px solid #ccc; border-radius: 4px; text-align: center;\"\u003e\r\n          \u003cimg src=\"https://www.kamera-express.nl/media/3ee9b0de-bff2-4d59-beda-e63b4d002d9c/tweedehands-conditie-9-webp.webp\" alt=\"Zo goed als nieuw\" style=\"width: 100%; height: auto; object-fit: cover;\" /\u003e\r\n          \u003cstrong style=\"display: block; font-size: 15px; margin-bottom: 10px; padding: 0 3px;\"\u003eZo goed als nieuw\u003c/strong\u003e\r\n        \u003c/div\u003e\r\n\r\n        \u003cdiv style=\"flex: 1 1 calc(50% - 8px); border: 1px solid #ccc; border-radius: 4px; text-align: center;\"\u003e\r\n          \u003cimg src=\"https://www.kamera-express.nl/media/f96dbc3b-e687-4ebb-b65a-c79b54a6d1b7/tweedehands-conditie-8-webp.webp\" alt=\"Nauwelijks gebruikssporen\" style=\"width: 100%; height: auto; object-fit: cover;\" /\u003e\r\n          \u003cstrong style=\"display: block; font-size: 15px; margin-bottom: 10px; padding: 0 3px;\"\u003eNauwelijks gebruikssporen\u003c/strong\u003e\r\n        \u003c/div\u003e\r\n\r\n        \u003cdiv style=\"flex: 1 1 calc(50% - 8px); border: 1px solid #ccc; border-radius: 4px; text-align: center;\"\u003e\r\n          \u003cimg src=\"https://www.kamera-express.nl/media/39bad34a-4e2e-4174-ac7e-e711ef79ea82/tweedehands-conditie-7-webp.webp\" alt=\"Lichte gebruikssporen\" style=\"width: 100%; height: auto; object-fit: cover;\" /\u003e\r\n          \u003cstrong style=\"display: block; font-size: 15px; margin-bottom: 10px; padding: 0 3px;\"\u003eLichte gebruikssporen\u003c/strong\u003e\r\n        \u003c/div\u003e\r\n\r\n        \u003cdiv style=\"flex: 1 1 calc(50% - 8px); border: 1px solid #ccc; border-radius: 4px; text-align: center;\"\u003e\r\n          \u003cimg src=\"https://www.kamera-express.nl/media/45c526c7-3d9e-4ea8-b2a4-7d5c3dda5cad/tweedehands-conditie-6-webp.webp\" alt=\"Normale gebruikssporen\" style=\"width: 100%; height: auto; object-fit: cover;\" /\u003e\r\n          \u003cstrong style=\"display: block; font-size: 15px; margin-bottom: 10px; padding: 0 3px;\"\u003eNormale gebruikssporen\u003c/strong\u003e\r\n        \u003c/div\u003e\r\n      \u003c/div\u003e\r\n    \u003c/div\u003e\r\n  `;\r\n\r\n  const contentClicks = `\r\n    \u003cdiv class=\"drawerInfo\"\u003e\r\n      \u003cp style=\"padding: 10px 0;\"\u003e\r\n        Elke keer dat je een foto maakt met een camera, wordt de sluiter geactiveerd. Dit noemen we een ‘click’. De sluiter is een mechanisch onderdeel en slijt na verloop van tijd, net zoals een auto met kilometers op de teller. Daarom geeft het aantal clicks een goed beeld van hoe intensief een camera gebruikt is. Elke camera heeft een verwachte sluiterlevensduur, meestal tussen de 100.000 en 300.000 clicks, afhankelijk van het type en merk.\r\n      \u003c/p\u003e\r\n      \u003cp style=\"padding: 10px 0;\"\u003e\u003cstrong\u003eWat kun je verwachten per aantal clicks?\u003c/strong\u003e\u003c/p\u003e\r\n\r\n      \u003cdiv\u003e\r\n        \u003cp style=\"padding: 10px 0; margin: 0;\"\u003e\u003cstrong\u003e\u0026lt; 10.000: Zo goed als nieuw\u003c/strong\u003e\u003c/p\u003e\r\n        \u003cp style=\"padding: 10px 0;\"\u003eZeer weinig gebruikt, doorgaans in uitstekende staat.\u003c/p\u003e\r\n      \u003c/div\u003e\r\n\r\n      \u003cdiv\u003e\r\n        \u003cp style=\"padding: 10px 0; margin: 0;\"\u003e\u003cstrong\u003e10.000 – 25.000: Licht gebruikt\u003c/strong\u003e\u003c/p\u003e\r\n        \u003cp style=\"padding: 10px 0;\"\u003eEen paar keer gebruikt maar technisch in uitstekende staat.\u003c/p\u003e\r\n      \u003c/div\u003e\r\n\r\n      \u003cdiv\u003e\r\n        \u003cp style=\"padding: 10px 0; margin: 0;\"\u003e\u003cstrong\u003e25.000 – 50.000: Normaal gebruikt\u003c/strong\u003e\u003c/p\u003e\r\n        \u003cp style=\"padding: 10px 0;\"\u003eTypisch gebruik voor een enthousiaste fotograaf of semi-professional.\u003c/p\u003e\r\n      \u003c/div\u003e\r\n\r\n      \u003cdiv\u003e\r\n        \u003cp style=\"padding: 10px 0; margin: 0;\"\u003e\u003cstrong\u003e50.000 – 75.000: Regelmatig gebruikt\u003c/strong\u003e\u003c/p\u003e\r\n        \u003cp style=\"padding: 10px 0;\"\u003eActief gebruikt, bijvoorbeeld door een semi-professional.\u003c/p\u003e\r\n      \u003c/div\u003e\r\n\r\n      \u003cdiv\u003e\r\n        \u003cp style=\"padding: 10px 0; margin: 0;\"\u003e\u003cstrong\u003e75.000 – 100.000: Intensief gebruikt, nog goed bruikbaar\u003c/strong\u003e\u003c/p\u003e\r\n        \u003cp style=\"padding: 10px 0;\"\u003eIntensief gebruikt, maar professionele modellen zijn hiervoor ontworpen.\u003c/p\u003e\r\n      \u003c/div\u003e\r\n\r\n      \u003cdiv\u003e\r\n        \u003cp style=\"padding: 10px 0; margin: 0;\"\u003e\u003cstrong\u003e100.000 – 150.000: Ervaren maar inzetbaar\u003c/strong\u003e\u003c/p\u003e\r\n        \u003cp style=\"padding: 10px 0;\"\u003ePerfect als back-upcamera of budget technisch een slimme keus.\u003c/p\u003e\r\n      \u003c/div\u003e\r\n\r\n      \u003cdiv\u003e\r\n        \u003cp style=\"padding: 10px 0; margin: 0;\"\u003e\u003cstrong\u003e\u0026gt; 150.000: Voor de slimme koper\u003c/strong\u003e\u003c/p\u003e\r\n        \u003cp style=\"padding: 10px 0;\"\u003eGoed gebruikte camera, maar hij kan nog verrassend lang doorgaan.\u003c/p\u003e\r\n      \u003c/div\u003e\r\n    \u003c/div\u003e\r\n  `;\r\n\r\n  function closeDrawer(drawer, overlay) {\r\n    drawer.style.right = \"-100%\";\r\n    overlay.style.opacity = \"0\";\r\n    overlay.style.visibility = \"hidden\";\r\n    setTimeout(() =\u003e {\r\n      drawer.remove();\r\n      overlay.remove();\r\n    }, 300);\r\n  }\r\n\r\n  function createCustomDrawer(id, title, contentHTML) {\r\n    if (document.getElementById(id)) return;\r\n\r\n    const overlay = document.createElement(\"div\");\r\n    overlay.id = id;\r\n    overlay.style.cssText = `\r\n      position: fixed; top: 0; left: 0; width: 100%; height: 100%;\r\n      background: rgba(0, 0, 0, 0.5);\r\n      z-index: 9998;\r\n      opacity: 0;\r\n      visibility: hidden;\r\n      transition: opacity 0.3s ease;\r\n    `;\r\n\r\n    const drawer = document.createElement(\"div\");\r\n    drawer.className = \"drawer\";\r\n    drawer.style.cssText = `\r\n      position: fixed; top: 0; right: -100%; width: 480px; max-width: 90%; height: 100%;\r\n      background: #fff; box-shadow: -2px 0 5px rgba(0,0,0,0.2);\r\n      z-index: 9999; display: flex; flex-direction: column;\r\n      font-family: 'Barlow', sans-serif; transition: right 0.3s ease-in-out;\r\n    `;\r\n\r\n    drawer.innerHTML = `\r\n      \u003cdiv class=\"drawer-header\" style=\"display:flex;justify-content:space-between;align-items:center;padding:24px 24px 0 24px;\"\u003e\r\n        \u003ch2 style=\"font-size:24px;font-weight:bold;margin:0;\"\u003e${title}\u003c/h2\u003e\r\n        \u003cbutton class=\"drawer-close-button\" style=\"background:none;border:none;cursor:pointer;padding:0;\"\u003e\r\n          \u003csvg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\u003e\r\n            \u003cpath d=\"M6 18L18 6M18 18L6 6\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"/\u003e\r\n          \u003c/svg\u003e\r\n        \u003c/button\u003e\r\n      \u003c/div\u003e\r\n      \u003cdiv class=\"drawer-body\" style=\"flex-grow:1;overflow-y:auto;padding:16px 24px 24px 24px;\"\u003e\r\n        \u003cdiv class=\"drawer-content\"\u003e${contentHTML}\u003c/div\u003e\r\n      \u003c/div\u003e\r\n      \u003cdiv class=\"drawer-cta\" style=\"padding:20px;border-top:1px solid #eee;flex-shrink:0;\"\u003e\r\n        \u003ca href=\"/tweedehands\" class=\"sf-button--outline sf-button\" style=\"\r\n          text-transform:none;display:block;width:100%;padding:14px;text-align:center;\r\n          border:1px solid black;color:black;text-decoration:none;border-radius:4px;\r\n          font-size:16px;font-weight:bold;\"\u003e\r\n          Alles over ons tweedehands aanbod\r\n        \u003c/a\u003e\r\n      \u003c/div\u003e\r\n    `;\r\n\r\n    document.body.appendChild(overlay);\r\n    document.body.appendChild(drawer);\r\n\r\n    requestAnimationFrame(() =\u003e {\r\n      drawer.style.right = \"0\";\r\n      overlay.style.opacity = \"1\";\r\n      overlay.style.visibility = \"visible\";\r\n    });\r\n\r\n    const close = () =\u003e closeDrawer(drawer, overlay);\r\n    overlay.addEventListener(\"click\", close);\r\n    drawer.querySelector(\".drawer-close-button\").addEventListener(\"click\", close);\r\n  }\r\n\r\n  // Event delegation (works even if the blocks are re-rendered)\r\n  document.addEventListener(\"click\", (e) =\u003e {\r\n    if (e.target.closest(\".drawer-trigger-condition\")) {\r\n      createCustomDrawer(\"drawer-conditie\", \"Conditie van het product\", contentConditie);\r\n    }\r\n    if (e.target.closest(\".drawer-trigger-clicks\")) {\r\n      createCustomDrawer(\"drawer-clicks\", \"Aantal clicks\", contentClicks);\r\n    }\r\n  });\r\n\r\n  // =========================\r\n  // FIX 2: clicks parsing supports \"100.000 to 150.000\"\r\n  // =========================\r\n  function parseClicksSubtext(clicksRaw) {\r\n    const cleaned = String(clicksRaw || \"\")\r\n      .toLowerCase()\r\n      .replace(/\\./g, \"\")          // 150.000 -\u003e 150000\r\n      .replace(/\\s+to\\s+/g, \"-\")   // \" to \" -\u003e \"-\"\r\n      .replace(/[–]/g, \"-\")        // en-dash -\u003e hyphen\r\n      .replace(/[^\\d\\-\u003c\u003e]/g, \"\")   // keep only digits, -, \u003c, \u003e\r\n      .trim();\r\n\r\n    const ranges = [\r\n      { match: /^\u003c\\s*10000$/, label: \"Zo goed als nieuw\" },\r\n      { match: /^10000\\s*-\\s*25000$/, label: \"Licht gebruikt\" },\r\n      { match: /^25000\\s*-\\s*50000$/, label: \"Normaal gebruikt\" },\r\n      { match: /^50000\\s*-\\s*75000$/, label: \"Regelmatig gebruikt\" },\r\n      { match: /^75000\\s*-\\s*100000$/, label: \"Intensief gebruikt, nog goed bruikbaar\" },\r\n      { match: /^100000\\s*-\\s*150000$/, label: \"Ervaren maar inzetbaar\" },\r\n      { match: /^\u003e\\s*150000$/, label: \"Voor de slimme koper\" },\r\n    ];\r\n\r\n    for (const r of ranges) if (r.match.test(cleaned)) return r.label;\r\n    return null;\r\n  }\r\n\r\n  // =========================\r\n  // INJECTIONS (same behavior)\r\n  // =========================\r\n  function injectOverlayLabel() {\r\n    const stage = document.querySelector(\".sf-gallery__stage\");\r\n    if (!stage) return;\r\n    if (stage.querySelector(\".custom-check-label\")) return;\r\n\r\n    stage.style.position = \"relative\";\r\n\r\n    const label = document.createElement(\"div\");\r\n    label.className = \"custom-check-label\";\r\n    label.innerHTML = `\r\n      \u003cimg src=\"${iconURL}\" alt=\"\" class=\"check-icon\" /\u003e\r\n      \u003cspan\u003eGecontroleerd door onze tweedehands experts\u003c/span\u003e\r\n    `;\r\n\r\n    Object.assign(label.style, {\r\n      position: \"absolute\",\r\n      bottom: \"15px\",\r\n      right: \"15px\",\r\n      background: \"transparent\",\r\n      color: \"#000\",\r\n      padding: \"4px 8px\",\r\n      display: \"flex\",\r\n      alignItems: \"center\",\r\n      gap: \"6px\",\r\n      zIndex: \"99\",\r\n      pointerEvents: \"none\",\r\n    });\r\n\r\n    if (!document.getElementById(\"custom-check-style\")) {\r\n      const style = document.createElement(\"style\");\r\n      style.id = \"custom-check-style\";\r\n      style.innerHTML = `\r\n        .custom-check-label .check-icon { width:25px; height:25px; object-fit:contain; margin:auto !important; }\r\n        .custom-check-label span { font-size:15px; font-weight:700; }\r\n        .icon-usp-container { pointer-events:none !important; cursor:default !important; }\r\n      `;\r\n      document.head.appendChild(style);\r\n    }\r\n\r\n    stage.appendChild(label);\r\n  }\r\n\r\n  function updateStockSubtext() {\r\n    const wrapper = document.querySelector(\".availability-wrapper\");\r\n    if (!wrapper) return;\r\n\r\n    const badge = wrapper.querySelector(\".sf-badge\");\r\n    const subText = wrapper.querySelector(\"p.body-text-small.status-subtext\");\r\n    if (!badge || !subText) return;\r\n\r\n    const isOpVoorraad = /op\\s+voorraad/i.test((badge.textContent || \"\").trim());\r\n    const desired = \"Elk tweedehands product is uniek – slechts 1 beschikbaar\";\r\n\r\n    if (isOpVoorraad \u0026\u0026 subText.textContent !== desired) {\r\n      subText.textContent = desired;\r\n    }\r\n  }\r\n\r\n  function replaceUSPs() {\r\n    const uspButtons = document.querySelectorAll(\".icon-usp-container\");\r\n    const newUSPs = [\r\n      { strong: \"Gecontroleerd en gereinigd\", text: \" door onze experts\" },\r\n      { strong: \"12 maanden garantie\", text: \" op alle tweedehands producten\" },\r\n      { strong: \"14 dagen bedenktijd\", text: \"Niet zoals verwacht? Altijd \", beforeStrong: true },\r\n      { strong: \"Grootste tweedehands aanbod\", text: \" van Nederland\" },\r\n    ];\r\n\r\n    if (uspButtons.length \u003c newUSPs.length) return;\r\n\r\n    uspButtons.forEach((btn, i) =\u003e {\r\n      if (i \u003e= newUSPs.length) return;\r\n\r\n      const p = btn.querySelector(\"p\");\r\n      if (!p) return;\r\n\r\n      const usp = newUSPs[i];\r\n      const existingText = (p.textContent || \"\").trim();\r\n      if (existingText.includes(usp.strong)) return;\r\n\r\n      p.innerHTML = usp.beforeStrong\r\n        ? `${usp.text}\u003cstrong\u003e${usp.strong}\u003c/strong\u003e`\r\n        : `\u003cstrong\u003e${usp.strong}\u003c/strong\u003e${usp.text}`;\r\n    });\r\n  }\r\n\r\n  function findSpecValue(label) {\r\n    const labelNorm = String(label || \"\").trim().toLowerCase();\r\n    const tds = [...document.querySelectorAll(\"td.sf-table__data\")];\r\n    const hit = tds.find((el) =\u003e (el.textContent || \"\").trim().toLowerCase() === labelNorm);\r\n    return hit?.nextElementSibling?.textContent?.trim() || null;\r\n  }\r\n\r\n  function injectSpecsBlocks() {\r\n    const priceContainer = document.querySelector(\".buy-section-price-container\");\r\n    if (!priceContainer) return;\r\n\r\n    // Insert point differs per PDP =\u003e flexible anchor\r\n    const anchor =\r\n      document.querySelector(\".buy-section-care-plan\") ||\r\n      document.querySelector(\".buy-section-buttons-container\") ||\r\n      document.querySelector(\".product-variations\") ||\r\n      priceContainer.nextElementSibling ||\r\n      null;\r\n\r\n    if (document.querySelector(\".custom-specs-wrapper\")) return;\r\n\r\n    const conditionValue = findSpecValue(\"Conditie\");\r\n    const clicksValue = findSpecValue(\"Aantal clicks\");\r\n\r\n    if (!conditionValue \u0026\u0026 !clicksValue) return;\r\n\r\n    const wrapper = document.createElement(\"div\");\r\n    wrapper.className = \"custom-specs-wrapper\";\r\n    wrapper.style.display = \"flex\";\r\n    wrapper.style.gap = \"24px\";\r\n    wrapper.style.margin = \"0px 0px 20px 0px\";\r\n\r\n    if (conditionValue) {\r\n      const conditionBlock = document.createElement(\"div\");\r\n      conditionBlock.className = \"custom-condition-block\";\r\n      conditionBlock.innerHTML = `\r\n        \u003cdiv class=\"drawer-trigger-condition\" style=\"display:flex;align-items:center;gap:6px;cursor:pointer;\"\u003e\r\n          \u003cspan style=\"font-weight:700;font-size:15px;\"\u003eConditie\u003c/span\u003e\r\n          \u003cimg src=\"${infoIconURL}\" alt=\"Conditie info\" style=\"width:16px;height:16px;\" /\u003e\r\n        \u003c/div\u003e\r\n        \u003cdiv style=\"font-size:14px;margin-top:4px;line-height:1.4;\"\u003e${conditionValue}\u003c/div\u003e\r\n      `;\r\n      wrapper.appendChild(conditionBlock);\r\n    }\r\n\r\n    if (clicksValue \u0026\u0026 clicksValue.toLowerCase() !== \"niet van toepassing / onbekend\") {\r\n      const subtext = parseClicksSubtext(clicksValue);\r\n\r\n      const clicksBlock = document.createElement(\"div\");\r\n      clicksBlock.className = \"custom-clicks-block\";\r\n      clicksBlock.innerHTML = `\r\n        \u003cdiv class=\"drawer-trigger-clicks\" style=\"display:flex;align-items:center;gap:6px;cursor:pointer;\"\u003e\r\n          \u003cspan style=\"font-weight:700;font-size:15px;\"\u003eAantal clicks\u003c/span\u003e\r\n          \u003cimg src=\"${infoIconURL}\" alt=\"Clicks info\" style=\"width:16px;height:16px;\" /\u003e\r\n        \u003c/div\u003e\r\n        \u003cdiv style=\"font-size:14px;margin-top:4px;line-height:1.4;\"\u003e\r\n          ${clicksValue}${subtext ? ` — ${subtext}` : \"\"}\r\n        \u003c/div\u003e\r\n      `;\r\n      wrapper.appendChild(clicksBlock);\r\n    }\r\n\r\n    if (!wrapper.children.length) return;\r\n\r\n    if (anchor \u0026\u0026 anchor.parentNode) anchor.parentNode.insertBefore(wrapper, anchor);\r\n    else priceContainer.insertAdjacentElement(\"afterend\", wrapper);\r\n  }\r\n\r\n  function injectPhotoInfoBlock() {\r\n    const galleryWrapper = document.querySelector(\".sf-gallery\");\r\n    if (!galleryWrapper) return;\r\n    if (document.querySelector(\".photo-info-block\")) return;\r\n\r\n    const infoBlock = document.createElement(\"div\");\r\n    infoBlock.className = \"photo-info-block\";\r\n    infoBlock.style.cssText = `\r\n      display:flex;align-items:center;gap:10px;border:1px solid #ccc;\r\n      padding:12px;margin-top:20px;font-size:15px;font-family:'Barlow', sans-serif;\r\n      background:white;z-index:1;position:relative;\r\n    `;\r\n\r\n    infoBlock.innerHTML = `\r\n      \u003cimg src=\"https://www.kamera-express.nl/media/68c2049a-8516-47dc-9f30-a04a120a6969/camera-icon-png.png\" alt=\"Camera icoon\" style=\"width:30px;height:auto;object-fit:contain;\" /\u003e\r\n      \u003cspan\u003eWe fotograferen elk tweedehands product apart. Je koopt dus het product zoals je het ziet op de foto's\u003c/span\u003e\r\n    `;\r\n\r\n    galleryWrapper.insertAdjacentElement(\"afterend\", infoBlock);\r\n  }\r\n\r\n  // =========================\r\n  // Observer: debounce + ignore own mutations (prevents looping)\r\n  // =========================\r\n  const OWN_SELECTORS = [\r\n    \".custom-check-label\",\r\n    \".custom-specs-wrapper\",\r\n    \".photo-info-block\",\r\n    \".drawer\",\r\n    \"#drawer-conditie\",\r\n    \"#drawer-clicks\",\r\n  ];\r\n\r\n  function isOwnNode(node) {\r\n    if (!node) return false;\r\n    if (node.nodeType === 3) node = node.parentElement;\r\n    if (!node || !node.closest) return false;\r\n    return OWN_SELECTORS.some((sel) =\u003e node.closest(sel));\r\n  }\r\n\r\n  function shouldIgnoreMutations(mutations) {\r\n    let anyRelevant = false;\r\n    for (const m of mutations) {\r\n      if (!isOwnNode(m.target)) anyRelevant = true;\r\n      for (const n of m.addedNodes || []) if (!isOwnNode(n)) anyRelevant = true;\r\n      for (const n of m.removedNodes || []) if (!isOwnNode(n)) anyRelevant = true;\r\n    }\r\n    return !anyRelevant;\r\n  }\r\n\r\n  let scheduled = false;\r\n  let lastRunAt = 0;\r\n\r\n  function runAll(source) {\r\n    log(\"runAll:\", source);\r\n    try { injectOverlayLabel(); } catch (e) { err(\"injectOverlayLabel\", e); }\r\n    try { updateStockSubtext(); } catch (e) { err(\"updateStockSubtext\", e); }\r\n    try { replaceUSPs(); } catch (e) { err(\"replaceUSPs\", e); }\r\n    try { injectSpecsBlocks(); } catch (e) { err(\"injectSpecsBlocks\", e); }\r\n    try { injectPhotoInfoBlock(); } catch (e) { err(\"injectPhotoInfoBlock\", e); }\r\n  }\r\n\r\n  function debounceRun(source) {\r\n    if (scheduled) return;\r\n\r\n    const now = Date.now();\r\n    const minGap = 150;\r\n    const wait = Math.max(0, minGap - (now - lastRunAt));\r\n\r\n    scheduled = true;\r\n    setTimeout(() =\u003e {\r\n      scheduled = false;\r\n      lastRunAt = Date.now();\r\n      runAll(source);\r\n    }, wait);\r\n  }\r\n\r\n  observer = new MutationObserver((mutations) =\u003e {\r\n    if (shouldIgnoreMutations(mutations)) return;\r\n    debounceRun(\"MutationObserver\");\r\n  });\r\n\r\n  observer.observe(document.body, { childList: true, subtree: true });\r\n  runAll(\"initial\");\r\n})();\r\n","trigger":{"include_pages":[{"type":"regex","regex":"kamera-express\\.nl.*occasion"},{"type":"regex","regex":"kamera-express\\.be.*occasion"}],"exclude_pages":[{"url":"kamera-express.be/fr","type":"contains"}]},"_id":"68c28e33fc173e7542a2e434"},{"uses_overlay":false,"type":"js","parametrized_definition":"\r\n(function() {\r\n  // ---------- 1) Helpers ----------\r\n  const byText = (sel, re) =\u003e\r\n    [...document.querySelectorAll(sel)].find(el =\u003e re.test(el.textContent?.trim() || ''));\r\n\r\n  function onDomReady(cb){\r\n    if (document.readyState === 'complete' || document.readyState === 'interactive') cb();\r\n    else document.addEventListener('DOMContentLoaded', cb);\r\n  }\r\n\r\n  function waitFor(fn, {timeout=8000, interval=100} = {}) {\r\n    return new Promise((resolve, reject) =\u003e {\r\n      const start = Date.now();\r\n      const int = setInterval(() =\u003e {\r\n        const el = fn();\r\n        if (el) { clearInterval(int); resolve(el); }\r\n        else if (Date.now() - start \u003e timeout) { clearInterval(int); resolve(null); }\r\n      }, interval);\r\n    });\r\n  }\r\n\r\n  // ---------- 2) Styles (reused from your snippet) ----------\r\n  function injectStylesOnce() {\r\n    if (document.getElementById('custom-slideout-style')) return;\r\n    const style = document.createElement(\"style\");\r\n    style.id = 'custom-slideout-style';\r\n    style.innerHTML = `\r\n      .custom-slideout-btn { background:#ea580c;color:#fff;font-family:\"Barlow\",sans-serif;font-weight:700;font-size:1rem;border-radius:4px;padding:8px 24px;border:0;cursor:pointer;transition:background .3s ease;display:inline-flex;align-items:center;justify-content:center;margin-top:16px }\r\n      .custom-slideout-btn:hover { background-color:#f26122 }\r\n      .custom-slideout-overlay { position:fixed; inset:0; width:100%; height:100vh; background-color:rgba(0,0,0,.4); z-index:9998; display:flex; justify-content:flex-end }\r\n      .custom-slideout { width:540px; max-width:100%; background:#fff; height:100%; display:flex; flex-direction:column; position:relative; font-family:\"Barlow\",sans-serif; box-shadow:-2px 0 6px rgba(0,0,0,.1); animation:slideIn .3s ease-out }\r\n      @keyframes slideIn { from { transform:translateX(100%) } to { transform:translateX(0) } }\r\n      .custom-slideout-close { position:absolute; top:8px; right:12px; background:none; border:none; font-size:36px; cursor:pointer; line-height:1; width:40px; height:40px; display:flex; align-items:center; justify-content:center; color:#111 }\r\n      .custom-slideout-close:hover { color:#f26122 }\r\n      .custom-slideout-iframe { flex:1; border:none; width:100%; height:100% }\r\n    `;\r\n    document.head.appendChild(style);\r\n  }\r\n\r\n  // ---------- 3) Slide-out factory (reused) ----------\r\n  function createSlideout() {\r\n    if (document.getElementById(\"custom-slideout-overlay\")) return;\r\n\r\n    const overlay = document.createElement(\"div\");\r\n    overlay.className = \"custom-slideout-overlay\";\r\n    overlay.id = \"custom-slideout-overlay\";\r\n\r\n    const slideout = document.createElement(\"div\");\r\n    slideout.className = \"custom-slideout\";\r\n\r\n    const closeBtn = document.createElement(\"button\");\r\n    closeBtn.className = \"custom-slideout-close\";\r\n    closeBtn.innerHTML = \"\u0026times;\";\r\n    closeBtn.addEventListener(\"click\", closeSlideout);\r\n\r\n    overlay.addEventListener(\"click\", (e) =\u003e {\r\n      if (!slideout.contains(e.target)) closeSlideout();\r\n    });\r\n\r\n    const iframe = document.createElement(\"iframe\");\r\n    iframe.className = \"custom-slideout-iframe\";\r\n    // ▼ Zet hier je gewenste URL/Typeform/route\r\n    iframe.src = \"https://eb1jb1q5m1d.typeform.com/to/KanxhbSm?typeform-embed=embed-widget\";\r\n    iframe.allow = \"camera; microphone; autoplay; encrypted-media;\";\r\n    iframe.title = \"Verzekering aanvragen\";\r\n\r\n    slideout.appendChild(closeBtn);\r\n    slideout.appendChild(iframe);\r\n    overlay.appendChild(slideout);\r\n    document.body.appendChild(overlay);\r\n\r\n    // lock scroll\r\n    document.documentElement.style.overflow = 'hidden';\r\n    window.addEventListener('keydown', escClose);\r\n  }\r\n\r\n  function closeSlideout() {\r\n    const overlay = document.getElementById(\"custom-slideout-overlay\");\r\n    if (overlay) overlay.remove();\r\n    document.documentElement.style.overflow = '';\r\n    window.removeEventListener('keydown', escClose);\r\n  }\r\n\r\n  function escClose(e){ if (e.key === 'Escape') closeSlideout(); }\r\n\r\n  // ---------- 4) Bind to existing KE button ----------\r\n  function findTriggerButton() {\r\n    // Primair: exacte knop met classes binnen de anchor\r\n    let btn = document.querySelector('a.link-container .small-button.sf-button');\r\n    // Fallback: zoek op tekst (Duits)\r\n    if (!btn) btn = byText('button.small-button.sf-button, a .small-button.sf-button', /Fordern Sie Ihr Sicherheitspaket an/i);\r\n    return btn;\r\n  }\r\n\r\n  function bindOnce(btn){\r\n    if (!btn || btn.dataset.slideoutBound === '1') return;\r\n    btn.dataset.slideoutBound = '1';\r\n\r\n    btn.addEventListener('click', (e) =\u003e {\r\n      // Respecteer Cmd/Ctrl/Shift/Alt (laat originele linkgedrag intact)\r\n      if (e.metaKey || e.ctrlKey || e.shiftKey || e.altKey) return;\r\n      // Intercept default navigation\r\n      e.preventDefault();\r\n      e.stopPropagation();\r\n\r\n      injectStylesOnce();\r\n      createSlideout();\r\n    }, true);\r\n  }\r\n\r\n  // Run after DOM ready, then wait for SPA content if needed\r\n  onDomReady(async () =\u003e {\r\n    // Quick poll\r\n    const btn = await waitFor(findTriggerButton, { timeout: 6000, interval: 100 });\r\n    if (btn) { bindOnce(btn); return; }\r\n\r\n    // Fallback: observe mutations (useful when section is rendered later)\r\n    const obs = new MutationObserver(() =\u003e {\r\n      const b = findTriggerButton();\r\n      if (b) { bindOnce(b); obs.disconnect(); }\r\n    });\r\n    obs.observe(document.documentElement, { childList: true, subtree: true });\r\n    // Auto-stop after 15s to avoid endless observe\r\n    setTimeout(() =\u003e obs.disconnect(), 15000);\r\n  });\r\n})();\r\n\r\n","trigger":{"include_pages":[{"url":"https://www.kamera-express.de/komplettschutz","type":"contains"}],"exclude_pages":null},"_id":"68d2714d71fc8943c763e466"},{"uses_overlay":false,"type":"js","parametrized_definition":"(function moveGuaranteeBadgeOnly() {\n  \"use strict\";\n\n  if (!/\\.de(\\/|$)/.test(location.hostname + \"/\")) return;\n\n  if (window.__keMoveGuaranteeBadgeRan) return;\n  window.__keMoveGuaranteeBadgeRan = true;\n\n  const waitForAll = (selectors, { timeout = 8000, root = document } = {}) =\u003e\n    new Promise((resolve, reject) =\u003e {\n      const getEls = () =\u003e selectors.map(s =\u003e root.querySelector(s));\n      const initial = getEls();\n      if (initial.every(Boolean)) return resolve(initial);\n\n      const obs = new MutationObserver(() =\u003e {\n        const els = getEls();\n        if (els.every(Boolean)) {\n          obs.disconnect();\n          resolve(els);\n        }\n      });\n\n      obs.observe(root.documentElement || root, { childList: true, subtree: true });\n\n      const t = setTimeout(() =\u003e {\n        obs.disconnect();\n        reject(new Error(\"waitForAll timeout: \" + selectors.join(\", \")));\n      }, timeout);\n\n      Promise.resolve().then(() =\u003e {\n        if (initial.every(Boolean)) {\n          clearTimeout(t);\n          obs.disconnect();\n          resolve(initial);\n        }\n      });\n    });\n\n  waitForAll([\n    '#pdpIntro.pdpintro-wrapper.pdp-intro-outer-container',\n    '#pdpIntro .pdpintro-inner-container',\n    '#pdpIntro .pdpintro-title',\n    '#pdpIntro .rating-container'\n  ], { timeout: 8000 }).then(() =\u003e {\n    const gallerySelector = '.image-gallery, .sf-image-gallery, [class*=\"image-gallery\"]';\n    return waitForAll([gallerySelector], { timeout: 10000 });\n  }).then(([imageContainer]) =\u003e {\n    if (!imageContainer) return;\n\n    const promoEl = Array.from(document.querySelectorAll('.sf-gallery-promotion, .sf-badge, [class*=\"badge\"]'))\n      .find(el =\u003e /5\\s*Jahre/i.test((el.textContent || '').trim()));\n    if (!promoEl) return;\n\n    const cs = getComputedStyle(imageContainer);\n    if (cs.position === 'static') {\n      imageContainer.style.position = 'relative';\n    }\n\n    promoEl.style.cssText = [\n      'position:absolute !important',\n      'top:15px !important',\n      'left:15px !important',\n      'height:auto !important',\n      'z-index:99 !important',\n      'margin:0 !important',\n      'padding:0 !important',\n      'background:transparent !important',\n      'border:none !important',\n      'cursor:pointer !important'\n    ].join(';');\n\n    let badgeImg = promoEl.querySelector('img');\n    if (!badgeImg) {\n      badgeImg = document.createElement('img');\n      badgeImg.src = 'https://www.kamera-express.de/media/50ca787d-57b0-4304-9c4e-51fa0d0bddbc/5-jahre-garantie-icon-png.png';\n      badgeImg.alt = '5 Jahre Garantie';\n      badgeImg.className = 'custom-guarantee-badge';\n      badgeImg.style.cssText = [\n        'display:block !important',\n        'width:100px !important',\n        'height:auto !important',\n        'transition: transform 0.3s ease !important'\n      ].join(';');\n      promoEl.textContent = '';\n      promoEl.appendChild(badgeImg);\n    }\n\n    Object.defineProperty(badgeImg, 'rotation', {\n      configurable: true,\n      enumerable: false,\n      get() {\n        const m = badgeImg.style.transform.match(/rotate\\((-?\\d+(?:\\.\\d+)?)deg\\)/);\n        return m ? parseFloat(m[1]) : 0;\n      },\n      set(val) {\n        badgeImg.style.transform = `rotate(${val}deg)`;\n      }\n    });\n\n    badgeImg.rotation = 335;\n\n    if (promoEl.parentElement !== imageContainer) {\n      imageContainer.appendChild(promoEl);\n    }\n\n    window.keBadge = badgeImg;\n\n  }).catch(() =\u003e {\n  });\n})();","trigger":{"include_pages":[{"url":"kamera-express.de","type":"contains"},{"url":"foto-gregor.de","type":"contains"}],"exclude_pages":null},"_id":"68e3cfb47b16ea82b2465a2c"},{"uses_overlay":false,"type":"js","parametrized_definition":"(function () {\r\n  const BTN_SELECTOR = 'a.link-container button.small-button.sf-button';\r\n  const OVERLAY_ID = 'custom-slideout-overlay';\r\n  const STYLE_ID = 'custom-slideout-styles';\r\n\r\n  const TYPEFORM_URL =\r\n    'https://eb1jb1q5m1d.typeform.com/to/KUqNVuKk#domain=xxxxx\u0026country=xxxxx\u0026language=xxxxx\u0026nummer=xxxxx\u0026type=xxxxx';\r\n\r\n  function ensureStyles() {\r\n    if (document.getElementById(STYLE_ID)) return;\r\n\r\n    const style = document.createElement('style');\r\n    style.id = STYLE_ID;\r\n    style.textContent = `\r\n      :root { --brand-orange:#ea580c; --brand-orange-hover:#f26122; }\r\n\r\n      .custom-slideout-overlay {\r\n        position: fixed;\r\n        inset: 0;\r\n        background: rgba(0,0,0,.4);\r\n        z-index: 9998;\r\n        display: flex;\r\n        justify-content: flex-end;\r\n      }\r\n\r\n      .custom-slideout {\r\n        width: 540px;\r\n        max-width: 100%;\r\n        height: 100%;\r\n        background: #fff;\r\n        display: flex;\r\n        flex-direction: column;\r\n        position: relative;\r\n        box-shadow: -2px 0 12px rgba(0,0,0,.2);\r\n        animation: slideIn .3s ease-out both;\r\n      }\r\n\r\n      @keyframes slideIn {\r\n        from { transform: translateX(100%); }\r\n        to { transform: translateX(0); }\r\n      }\r\n\r\n      .custom-slideout-close {\r\n        position: absolute;\r\n        top: 8px;\r\n        right: 12px;\r\n        background: none;\r\n        border: 0;\r\n        font-size: 48px;\r\n        line-height: 1;\r\n        width: 56px;\r\n        height: 56px;\r\n        display: grid;\r\n        place-items: center;\r\n        cursor: pointer;\r\n        color: #111;\r\n      }\r\n\r\n      .custom-slideout-close:hover { color: var(--brand-orange-hover); }\r\n      .custom-slideout-iframe { flex: 1; width: 100%; height: 100%; border: 0; }\r\n    `;\r\n    document.head.appendChild(style);\r\n  }\r\n\r\n  function openSlideout() {\r\n    if (document.getElementById(OVERLAY_ID)) return;\r\n\r\n    const overlay = document.createElement('div');\r\n    overlay.className = 'custom-slideout-overlay';\r\n    overlay.id = OVERLAY_ID;\r\n\r\n    const panel = document.createElement('div');\r\n    panel.className = 'custom-slideout';\r\n\r\n    const close = document.createElement('button');\r\n    close.className = 'custom-slideout-close';\r\n    close.setAttribute('aria-label', 'Sluiten');\r\n    close.innerHTML = '\u0026times;';\r\n    close.addEventListener('click', () =\u003e overlay.remove());\r\n\r\n    overlay.addEventListener('click', (e) =\u003e {\r\n      if (!panel.contains(e.target)) overlay.remove();\r\n    });\r\n\r\n    const iframe = document.createElement('iframe');\r\n    iframe.className = 'custom-slideout-iframe';\r\n    iframe.src = TYPEFORM_URL;\r\n\r\n    panel.appendChild(close);\r\n    panel.appendChild(iframe);\r\n    overlay.appendChild(panel);\r\n    document.body.appendChild(overlay);\r\n  }\r\n\r\n  function bind() {\r\n    const btn = document.querySelector(BTN_SELECTOR);\r\n    if (!btn) return false;\r\n\r\n    // stop navigation by removing/neutralizing the surrounding \u003ca href=\"...\"\u003e\r\n    const link = btn.closest('a');\r\n    if (link) {\r\n      link.setAttribute('role', 'button');\r\n      link.removeAttribute('href'); // key: no href -\u003e no navigation\r\n      link.style.cursor = 'pointer';\r\n    }\r\n\r\n    if (btn.dataset.customSlideoutBound === '1') return true;\r\n    btn.dataset.customSlideoutBound = '1';\r\n\r\n    ensureStyles();\r\n\r\n    // Capture phase so we beat any existing handlers\r\n    const handler = (e) =\u003e {\r\n      e.preventDefault();\r\n      e.stopPropagation();\r\n      e.stopImmediatePropagation();\r\n      openSlideout();\r\n    };\r\n\r\n    // Bind on both link + button, capture phase\r\n    if (link \u0026\u0026 link.dataset.customSlideoutBound !== '1') {\r\n      link.dataset.customSlideoutBound = '1';\r\n      link.addEventListener('click', handler, true);\r\n      link.addEventListener('mousedown', (e) =\u003e e.preventDefault(), true);\r\n    }\r\n    btn.addEventListener('click', handler, true);\r\n\r\n    return true;\r\n  }\r\n\r\n  // try now + watch for late render\r\n  if (!bind()) {\r\n    const obs = new MutationObserver(() =\u003e {\r\n      if (bind()) obs.disconnect();\r\n    });\r\n    obs.observe(document.documentElement, { childList: true, subtree: true });\r\n    setTimeout(() =\u003e obs.disconnect(), 10000);\r\n  }\r\n})();\r\n","trigger":{"include_pages":[{"url":"https://www.kamera-express.de/leasing","type":"contains"}],"exclude_pages":null},"_id":"68e62735a8268edc8f69186d"},{"uses_overlay":false,"type":"js","parametrized_definition":"(function () {\n    const EVENTS = {\n        NEWSLETTER: 'crm_kenl-newsletter-optin-click',\n        RECOMMENDATIONS: 'crm_kenl-recommendations-optin-click'\n    };\n\n    function trackEvent(eventName, label) {\n        const payload = {\n            domain: window.location.hostname,\n            path: window.location.pathname,\n            label: label,\n            country: 'nl',\n            language: 'nl',\n            locale: 'nl_NL'\n        };\n\n        if (typeof exponea !== 'undefined' \u0026\u0026 typeof exponea.track === 'function') {\n            try {\n                exponea.track(eventName, payload);\n                console.log(`Event ${eventName} fired`, payload);\n            } catch (err) {\n                console.error('exponea.track error:', err);\n            }\n        } else {\n            console.warn('exponea niet beschikbaar — zou hebben gefired:', eventName, payload);\n        }\n    }\n\n    if (window.location.hostname.includes('kamera-express.nl') \u0026\u0026 \n        window.location.pathname.includes('/registratie')) {\n\n        document.addEventListener('click', function (e) {\n            const newsletterBox = e.target.closest('input[name=\"newsletter\"]');\n            const recommendationsBox = e.target.closest('input[name=\"recommendations_commerce\"]');\n\n            if (newsletterBox) {\n                trackEvent(EVENTS.NEWSLETTER, 'Nieuwsbrief-optin');\n            }\n\n            if (recommendationsBox) {\n                trackEvent(EVENTS.RECOMMENDATIONS, 'Aanbevelingen-optin');\n            }\n        });\n    }\n})();\n","trigger":{"include_pages":[{"url":"https://www.kamera-express.nl/registratie","type":"contains"}],"exclude_pages":null},"_id":"68f8f87c7594dc3286c8d5fc"},{"uses_overlay":false,"type":"js","parametrized_definition":"const trackWishlistClick = (country, language, locale, label) =\u003e {\n    exponea.track('wishlist-click', {\n        domain: window.location.hostname,\n        path: window.location.pathname,\n        label: label,\n        country: country,\n        language: language,\n        locale: locale\n    });\n    console.log(`Event ${country}-wishlist-click fired`);\n};\n\nconst wishlistTrackingConfig = {\n    'kamera-express.nl': {\n        country: 'nl',\n        language: 'nl',\n        locale: 'nl_NL',\n        label: 'Header – Verlanglijstje'\n    },\n    'kamera-express.be': {\n        country: 'be',\n        language: 'nl',\n        locale: 'nl_BE',\n        label: 'Header – Verlanglijstje'\n    },\n    'kamera-express.be/fr': {\n        country: 'be',\n        language: 'fr',\n        locale: 'fr_BE',\n        label: 'Header – Liste favoris'\n    },\n    'kamera-express.de': {\n        country: 'de',\n        language: 'de',\n        locale: 'de_DE',\n        label: 'Header – Wunschliste'\n    }\n};\n\nconst currentHost = window.location.hostname;\nconst currentPath = window.location.pathname;\n\nlet config = null;\nif (currentHost.includes('kamera-express.be') \u0026\u0026 currentPath.startsWith('/fr')) {\n    config = wishlistTrackingConfig['kamera-express.be/fr'];\n} else {\n    config = Object.entries(wishlistTrackingConfig).find(([domain]) =\u003e\n        currentHost.includes(domain)\n    )?.[1];\n}\n\nif (config) {\n    document.addEventListener('click', (e) =\u003e {\n        if (e.target.closest('.wishlist-button__btn')) {\n            trackWishlistClick(\n                config.country,\n                config.language,\n                config.locale,\n                config.label\n            );\n        }\n    });\n}\n","trigger":{"include_pages":[{"url":"https://www.kamera-express.nl/","type":"contains"},{"url":"https://www.kamera-express.be/","type":"contains"},{"url":"https://www.kamera-express.de/","type":"contains"}],"exclude_pages":null},"_id":"68f9f3a3fef0c2047fa3d678"},{"uses_overlay":false,"type":"js","parametrized_definition":"(function() {\n  // Check of #pdpIntro aanwezig is\n  if (!document.querySelector('#pdpIntro')) {\n    return; // #pdpIntro niet aanwezig → script stopt\n  }\n\n  function insertTradeInBox() {\n    const target = document.querySelector('#relatedAccessories');\n\n    if (!target) {\n      setTimeout(insertTradeInBox, 200);\n      return;\n    }\n\n    // --- Desktop-styling (zoals eerder) ---\n    const box = document.createElement('div');\n    box.style.border = '1px solid #dadada';\n    box.style.borderRadius = '4px';\n    box.style.display = 'flex';\n    box.style.overflow = 'hidden';\n    box.style.marginTop = '40px';\n    box.style.marginBottom = '16px';\n    box.style.flexWrap = 'nowrap';\n    box.style.marginLeft = '0';\n    box.style.marginRight = '0';\n    box.style.boxSizing = 'border-box';\n\n    const imgWrapper = document.createElement('div');\n    imgWrapper.style.flex = '5';\n\n    const img = document.createElement('img');\n    img.src = 'https://www.kamera-express.nl/media/6403a947-1a50-4fa9-9ee0-fcd84393570a/inruilen-apparatuur-inleveren-jpg.jpg';\n    img.style.width = '100%';\n    img.style.height = '100%';\n    img.style.objectFit = 'cover';\n    img.style.display = 'block';\n    imgWrapper.appendChild(img);\n\n    const textWrapper = document.createElement('div');\n    textWrapper.style.flex = '7';\n    textWrapper.style.display = 'flex';\n    textWrapper.style.flexDirection = 'column';\n    textWrapper.style.padding = '26px';\n    textWrapper.style.boxSizing = 'border-box';\n\n    const title = document.createElement('h3');\n    title.textContent = 'Inruilen of verkopen bij Kamera Express';\n    title.style.fontSize = '24px';\n    title.style.fontWeight = '500';\n    title.style.margin = '0 0 6px 0';\n\n    const desc = document.createElement('p');\n    desc.textContent =\n      'Ruil je camera, lens of accessoire in en ontdek direct wat deze waard is. Je camera verkopen zonder iets terug te kopen? Geen probleem. Sluit je aan bij duizenden anderen die maandelijks hun apparatuur inruilen bij Kamera Express.';\n    desc.style.margin = '0 0 10px 0';\n    desc.style.lineHeight = '1.4';\n\n    const button = document.createElement('a');\n    button.textContent = 'Ontdek direct de waarde';\n    button.href = '/inruilen';\n    button.style.display = 'inline-block';\n    button.style.padding = '12px 12px';\n    button.style.backgroundColor = '#ea580c';\n    button.style.color = '#fff';\n    button.style.fontWeight = '600';\n    button.style.textDecoration = 'none';\n    button.style.borderRadius = '4px';\n    button.style.marginTop = 'auto';\n    button.style.alignSelf = 'flex-start';\n\n    textWrapper.append(title, desc, button);\n    box.append(imgWrapper, textWrapper);\n    target.insertAdjacentElement('afterend', box);\n\n    // Mobiel overrides\n    function applyMobileLayout() {\n      if (window.innerWidth \u003c 768) {\n        box.style.flexDirection = 'column';\n        box.style.marginLeft = '16px';\n        box.style.marginRight = '16px';\n        textWrapper.style.padding = '10px';\n        title.style.fontSize = '18px';\n      }\n    }\n\n    applyMobileLayout();\n    window.addEventListener('resize', applyMobileLayout);\n  }\n\n  insertTradeInBox();\n})();\n","trigger":{"include_pages":[{"url":"kamera-express.nl","type":"contains"},{"url":"kamera-express.be","type":"contains"}],"exclude_pages":[{"url":"kamera-express.be/fr","type":"contains"},{"url":"abonnement","type":"contains"}]},"_id":"6908ad2ae8ef935b884aaf4b"},{"uses_overlay":false,"type":"js","parametrized_definition":"(function() {\n    if (!window.exponea || typeof exponea.track !== \"function\") return;\n\n    // ✅ gate: only continue if add-to-cart button is clickable (no logs)\n    const btn = document.querySelector('[data-dd-action-name=\"add-to-cart\"]');\n    if (!btn) return;\n\n    const state = {\n        ariaDisabled: btn.getAttribute('aria-disabled') === 'true',\n        htmlDisabled: btn.disabled,\n        hasDisabledClass: btn.classList.contains('is-disabled--button'),\n        pointerEventsNone: getComputedStyle(btn).pointerEvents === 'none'\n    };\n    if (Object.values(state).some(Boolean)) return;\n\n    // NL price parser\n    const parsePrice = (raw) =\u003e {\n        if (raw == null) return null;\n\n        let s = String(raw);\n\n        // Remove all kinds of spaces\n        s = s.replace(/[\\u0009\\u000A\\u000B\\u000C\\u000D\\u0020\\u00A0\\u1680\\u180E\\u2000-\\u200A\\u2028\\u2029\\u202F\\u205F\\u3000]/g, '');\n\n        // Normalize odd dots\n        s = s.replace(/[．·•‧∙]/g, '.');\n\n        // Keep only digits, dots and commas\n        s = s.replace(/[^0-9.,]/g, '');\n        if (!s) return null;\n\n        const hasComma = s.includes(',');\n        const hasDot   = s.includes('.');\n        const digitsOnly = s.replace(/\\D/g, '');\n        const totalDigits = digitsOnly.length;\n\n        // Case 1: comma present → NL decimal\n        if (hasComma) {\n            s = s.replace(/\\./g, '').replace(',', '.');\n            const v = parseFloat(s);\n            return isNaN(v) ? null : v;\n        }\n\n        // Case 2: dot present\n        if (hasDot) {\n            const parts = s.split('.');\n            const isThousandsPattern =\n                parts.length \u003e 1 \u0026\u0026\n                parts.slice(1).every(p =\u003e /^\\d{3}$/.test(p)) \u0026\u0026\n                totalDigits \u003e 3;\n\n            if (isThousandsPattern) {\n                const v = parseInt(digitsOnly, 10);\n                return isNaN(v) ? null : v;\n            } else {\n                const v = parseFloat(s);\n                return isNaN(v) ? null : v;\n            }\n        }\n\n        // Case 3: plain integer\n        const v = parseInt(s, 10);\n        return isNaN(v) ? null : v;\n    };\n\n    // Only NL environment\n    if (!window.location.hostname.includes(\"kamera-express.nl\")) return;\n\n    // Block price check when product is end-of-life\n    const isEndOfLife = () =\u003e {\n        const el = document.querySelector('.icon-usp-label');\n        if (!el) return false;\n\n        const text = (el.innerText || el.textContent || \"\").toLowerCase();\n\n        const patterns = [\n            \"niet meer leverbaar\",\n            \"helaas, dit product is helaas niet meer leverbaar\"\n        ];\n\n        return patterns.some(p =\u003e text.includes(p));\n    };\n\n    const runCheck = () =\u003e {\n        if (isEndOfLife()) return;\n\n        const productNameEl = document.querySelector('#pdpIntro .pdpintro-title');\n        const productName = productNameEl ? productNameEl.textContent.trim() : null;\n\n        // 1) Try \"Prijs na cashback\" first\n        const cashbackEl = document.querySelector('.cashback-price-container p');\n        let newPrice = null;\n\n        if (cashbackEl) {\n            const cashbackPrice = parsePrice(cashbackEl.textContent);\n            if (cashbackPrice != null) {\n                newPrice = cashbackPrice;\n            }\n        }\n\n        // 2) Fallback to normal new price\n        if (newPrice == null) {\n            const newPriceEl = document.querySelector('.prices-container .current-price span');\n            newPrice = newPriceEl ? parsePrice(newPriceEl.textContent) : null;\n        }\n\n        if (!productName || newPrice == null) return;\n\n        const typeContainers = document.querySelectorAll('.type-description-container');\n        const usedLabelRegex = /tweedehands|second\\s*hand|occasion/i;\n\n        let secondHandContainer = null;\n        typeContainers.forEach(container =\u003e {\n            const typeEl = container.querySelector('.service-type');\n            if (typeEl \u0026\u0026 usedLabelRegex.test(typeEl.textContent)) {\n                secondHandContainer = container;\n            }\n        });\n\n        if (!secondHandContainer) return;\n\n        // Find used price, walking up a few levels if needed\n        let scope = secondHandContainer;\n        let usedPriceEl = null;\n        for (let i = 0; i \u003c 4 \u0026\u0026 scope \u0026\u0026 !usedPriceEl; i++) {\n            usedPriceEl = scope.querySelector('.price-duration-container .service-price span');\n            scope = scope.parentElement;\n        }\n\n        const usedPrice = usedPriceEl ? parsePrice(usedPriceEl.textContent) : null;\n        if (usedPrice == null) return;\n\n        // Trigger event when used price is not cheaper than new price\n        if (usedPrice \u003e= newPrice) {\n            exponea.track('price_inconsistency_detected', {\n                product_name: productName,\n                new_price: newPrice,\n                used_price: usedPrice,\n                product_url: window.location.href,\n                locale: 'nl_NL'\n            });\n        }\n    };\n\n    const start = () =\u003e setTimeout(runCheck, 3000);\n\n    if (document.readyState === 'loading') {\n        document.addEventListener('DOMContentLoaded', start);\n    } else {\n        start();\n    }\n})();\n","trigger":{"include_pages":[{"url":"https://www.kamera-express.nl/","type":"contains"}],"exclude_pages":[{"url":"winkelwagen","type":"contains"},{"url":"checkout","type":"contains"},{"url":"thank-you","type":"contains"}]},"_id":"6916ef9d2a763f73cca1fcc5"},{"uses_overlay":false,"type":"js","parametrized_definition":"const getPageMetaProperty = (property) =\u003e {\n\treturn document\n\t\t.querySelector('meta[data-hid=\"' + property + '\"]')\n\t\t?.getAttribute('content') ?? undefined;\n};\n\nconst getRawBreadcrumbItems = () =\u003e {\n\tconst selectorBase = document.querySelector('#breadcrumbs')\n\t\t? '#breadcrumbs .breadcrumbs__container .breadcrumbs__item'\n\t\t: '.breadcrumbs__container .breadcrumbs__item';\n\n\treturn Array.from(document.querySelectorAll(selectorBase))\n\t\t.filter(el =\u003e el.getAttribute('data-testid'));\n};\n\nconst getBreadcrumbElements = () =\u003e {\n\tconst all = getRawBreadcrumbItems();\n\n\tconst nonCurrent = all.filter(el =\u003e !el.classList.contains('breadcrumbs__current'));\n\tconst nonCurrentTestIds = new Set(\n\t\tnonCurrent.map(el =\u003e el.getAttribute('data-testid'))\n\t);\n\n\treturn all.filter(el =\u003e {\n\t\tif (!el.classList.contains('breadcrumbs__current')) return true;\n\t\tconst tid = el.getAttribute('data-testid');\n\t\treturn !nonCurrentTestIds.has(tid);\n\t});\n};\n\nconst getCategoryLevels = (level) =\u003e {\n\tif (level) {\n\t\tconst categories = getBreadcrumbElements();\n\t\treturn categories[level]?.textContent?.trim() ?? '';\n\t}\n\treturn '';\n};\n\nconst getCategoryLevelsNL = (level) =\u003e {\n\tif (level) {\n\t\tconst categories = getBreadcrumbElements();\n\t\treturn categories[level]?.getAttribute('data-testid')?.trim() ?? '';\n\t}\n\treturn '';\n};\n\nconst getItemIds = () =\u003e {\n\tconst items_node = document.querySelector('#items-ids')?.textContent;\n\treturn items_node ? JSON.parse(items_node) : [];\n};\n\nconst getCategoryPath = () =\u003e {\n\tconst categories = getBreadcrumbElements();\n\tif (categories.length \u003e 0) {\n\t\tconst categories_array = [];\n\t\tcategories.forEach(element =\u003e {\n\t\t\tif (element.getAttribute('data-testid')) {\n\t\t\t\tcategories_array.push(element.textContent?.trim());\n\t\t\t}\n\t\t});\n\t\tcategories_array.shift();\n\t\treturn categories_array.join('\u003e');\n\t}\n\treturn '';\n};\n\nconst getCategoryPathNL = () =\u003e {\n\tconst categories = getBreadcrumbElements();\n\tif (categories.length \u003e 0) {\n\t\tconst categories_array = [];\n\t\tcategories.forEach(element =\u003e {\n\t\t\tif (element.getAttribute('data-testid')) {\n\t\t\t\tcategories_array.push(element.getAttribute('data-testid')?.trim());\n\t\t\t}\n\t\t});\n\n\t\tcategories_array.shift();\n\t\treturn categories_array.join('\u003e');\n\t}\n\treturn '';\n};\n\nconst defineLabel = (hostname) =\u003e {\n\tif (hostname) {\n\t\tif (hostname.includes('kamera-express')) return 'Kamera Express';\n\t\telse if (hostname.includes('foto-gregor')) return 'Foto Gregor';\n\t\telse if (hostname.includes('photogalerie')) return 'Photogalerie';\n\t\telse if (hostname.includes('photospecialist')) return 'Photospecialist';\n\t}\n\treturn '';\n};\n\nconst defineLocale = (language, country) =\u003e {\n\tif (language \u0026\u0026 country) return language + '_' + country.toUpperCase();\n};\n\nconst defineLanguage = () =\u003e {\n\tconst host = window.location.host;\n\tconst path = window.location.pathname;\n\n\tif (host.includes('kamera-express')) {\n\t\tif ((host.includes('.be') \u0026\u0026 !path.includes('/fr')) || host.includes('.nl')) return 'nl';\n\t\telse if ((host.includes('.lu') \u0026\u0026 !path.includes('/de')) || host.includes('.fr') || (host.includes('.be') \u0026\u0026 path.includes('/fr'))) return 'fr';\n\t\telse if ((host.includes('.lu') \u0026\u0026 path.includes('/de')) || host.includes('.de')) return 'de';\n\t}\n\telse if (host.includes('photogalerie')) {\n\t\treturn 'fr';\n\t}\n\telse if (host.includes('photospecialist')) {\n\t\tif (host.includes('.uk') || host.includes('.com') || host.includes('.ie')) return 'en';\n\t\telse return host.split('.').pop();\n\t}\n\telse if (host.includes('foto-gregor')) {\n\t\treturn 'de';\n\t}\n};\n\nconst defineCountry = () =\u003e {\n\tconst host = window.location.host;\n\tif (host.endsWith('.uk')) return 'gb';\n\tif (host.endsWith('.com') \u0026\u0026 host.includes('photogalerie')) return 'be';\n\tif (host.endsWith('.com') \u0026\u0026 host.includes('photospecialist')) return 'com';\n\treturn host.split('.').pop();\n};\n\nconst getJsonData = () =\u003e {\n\tconst data = document.querySelector('script[data-n-head=\"ssr\"][type=\"application/ld+json\"]')?.text;\n\tif (data) return JSON.parse(data);\n};\n\nconst trackEvent = () =\u003e {\n\tconst country = defineCountry();\n\tconst language = defineLanguage();\n\tconst locale = defineLocale(language, country);\n\n\tconst payload = {\n\t\tdomain : window.location.hostname,\n\t\tpath : window.location.pathname,\n\t\tcategory_title : getPageMetaProperty('og:title'),\n\t\tcategory_path : getCategoryPath() ?? '',\n\t\tcategory_level_1 : getCategoryLevels(1),\n\t\tcategory_level_2 : getCategoryLevels(2),\n\t\tcategory_level_3 : getCategoryLevels(3),\n\t\titem_ids: getItemIds() ?? [],\n\t\tcategory_title_nl : '',\n\t\tcategory_path_nl : getCategoryPathNL() ?? '',\n\t\tcategory_level_1_nl : getCategoryLevelsNL(1),\n\t\tcategory_level_2_nl : getCategoryLevelsNL(2),\n\t\tcategory_level_3_nl : getCategoryLevelsNL(3),\n\t\tlabel : defineLabel(window.location.host),\n\t\tcountry : country,\n\t\tlanguage : language,\n\t\tlocale : locale\n\t};\n\n\tif (typeof exponea !== 'undefined' \u0026\u0026 exponea \u0026\u0026 typeof exponea.track === 'function') {\n\t\texponea.track('view_category', payload);\n\t}\n};\n\nif (getPageMetaProperty('og:type')?.toLowerCase() === 'product.group') {\n\ttrackEvent();\n}\n","trigger":{"include_pages":[{"type":"any"}],"exclude_pages":null},"_id":"691750f93e34cc0b2a46b9ea"},{"uses_overlay":false,"type":"js","parametrized_definition":"const checkAvailability = () =\u003e {\n\tconst list_of_options = [\n\t\t'Vorübergehend ausverkauft',\n\t\t'Tijdelijk uitverkocht',\n\t\t'Epuisé temporairement',\n\t\t'Temporarily sold out',\n\t\t'Temporalmente agotado',\n\t\t'Temporaneamente esaurito'\n\t];\n\tconst node = document.querySelector('.buy-section-delivery-container');\n\tif (node) {\n\t\tconst status = node.getAttribute('status');\n\t\treturn !list_of_options.includes(status);\n\t}\n\treturn true;\n};\n\nconst getPageMetaProperty = (property) =\u003e {\n\treturn document\n\t\t.querySelector('meta[data-hid=\"' + property + '\"]')\n\t\t?.getAttribute('content') ?? undefined;\n};\n\n\nconst getRawBreadcrumbItems = () =\u003e {\n\tconst selectorBase = document.querySelector('#breadcrumbs')\n\t\t? '#breadcrumbs .breadcrumbs__container .breadcrumbs__item'\n\t\t: '.breadcrumbs__container .breadcrumbs__item';\n\n\treturn Array.from(document.querySelectorAll(selectorBase))\n\t\t.filter(el =\u003e el.getAttribute('data-testid'));\n};\n\nconst getBreadcrumbElements = () =\u003e {\n\tconst all = getRawBreadcrumbItems();\n\n\tconst nonCurrent = all.filter(el =\u003e !el.classList.contains('breadcrumbs__current'));\n\tconst nonCurrentTestIds = new Set(\n\t\tnonCurrent.map(el =\u003e el.getAttribute('data-testid'))\n\t);\n\n\n\treturn all.filter(el =\u003e {\n\t\tif (!el.classList.contains('breadcrumbs__current')) return true;\n\t\tconst tid = el.getAttribute('data-testid');\n\t\treturn !nonCurrentTestIds.has(tid);\n\t});\n};\n\nconst getCategoryLevels = (level) =\u003e {\n\tif (level) {\n\t\tconst categories = getBreadcrumbElements();\n\t\treturn categories[level]?.textContent?.trim() ?? '';\n\t}\n\treturn '';\n};\n\nconst getCategoryLevelsNL = (level) =\u003e {\n\tif (level) {\n\t\tconst categories = getBreadcrumbElements();\n\t\treturn categories[level]?.getAttribute('data-testid')?.trim() ?? '';\n\t}\n\treturn '';\n};\n\nconst getCategoryPath = () =\u003e {\n\tconst categories = getBreadcrumbElements();\n\tif (categories.length \u003e 0) {\n\t\tconst categories_array = [];\n\t\tcategories.forEach(element =\u003e {\n\t\t\tif (element.getAttribute('data-testid')) {\n\t\t\t\tcategories_array.push(element.textContent?.trim());\n\t\t\t}\n\t\t});\n\t\tcategories_array.shift();\n\t\treturn categories_array.join('\u003e');\n\t}\n\treturn '';\n};\n\nconst getCategoryPathNL = () =\u003e {\n\tconst categories = getBreadcrumbElements();\n\tif (categories.length \u003e 0) {\n\t\tconst categories_array = [];\n\t\tcategories.forEach(element =\u003e {\n\t\t\tif (element.getAttribute('data-testid')) {\n\t\t\t\tcategories_array.push(element.getAttribute('data-testid')?.trim());\n\t\t\t}\n\t\t});\n\t\tcategories_array.shift();\n\t\treturn categories_array.join('\u003e');\n\t}\n\treturn '';\n};\n\n\nconst defineLabel = (hostname) =\u003e {\n\tif (hostname) {\n\t\tif (hostname.includes('kamera-express')) return 'Kamera Express';\n\t\tif (hostname.includes('foto-gregor')) return 'Foto Gregor';\n\t\tif (hostname.includes('photogalerie')) return 'Photogalerie';\n\t\tif (hostname.includes('photospecialist')) return 'Photospecialist';\n\t}\n\treturn '';\n};\n\nconst defineLocale = (language, country) =\u003e {\n\tif (language \u0026\u0026 country) return language + '_' + country.toUpperCase();\n};\n\nconst defineLanguage = () =\u003e {\n\tconst host = window.location.host;\n\tconst path = window.location.pathname;\n\n\tif (host.includes('kamera-express')) {\n\t\tif ((host.includes('.be') \u0026\u0026 !path.includes('/fr')) || host.includes('.nl')) return 'nl';\n\t\tif ((host.includes('.lu') \u0026\u0026 !path.includes('/de')) || host.includes('.fr') || (host.includes('.be') \u0026\u0026 path.includes('/fr'))) return 'fr';\n\t\tif ((host.includes('.lu') \u0026\u0026 path.includes('/de')) || host.includes('.de')) return 'de';\n\t}\n\telse if (host.includes('photogalerie')) {\n\t\treturn 'fr';\n\t}\n\telse if (host.includes('photospecialist')) {\n\t\tif (host.includes('.uk') || host.includes('.com') || host.includes('.ie')) return 'en';\n\t\telse if (host.includes('at')) return 'de';\n\t\treturn host.split('.').pop();\n\t}\n\telse if (host.includes('foto-gregor')) {\n\t\treturn 'de';\n\t}\n};\n\nconst defineCountry = () =\u003e {\n\tconst host = window.location.host;\n\tif (host.split('.').pop() === 'uk') return 'gb';\n\tif (host.split('.').pop() === 'com' \u0026\u0026 host.includes('photogalerie')) return 'be';\n\tif (host.split('.').pop() === 'com' \u0026\u0026 host.includes('photospecialist')) return 'com';\n\treturn host.split('.').pop();\n};\n\nconst getJsonData = () =\u003e {\n\tconst data = document.querySelector('script[data-n-head=\"ssr\"][type=\"application/ld+json\"]')?.text;\n\tif (data) return JSON.parse(data);\n};\n\nconst trackEvent = () =\u003e {\n\tconst data = getJsonData();\n\tif (!data) return;\n\n\tconst country = defineCountry();\n\tconst language = defineLanguage();\n\tconst locale = defineLocale(language, country);\n\n\tconst originalPrice = parseFloat(data?.offers?.price) || 0;\n\tconst salesPrice = parseFloat(data?.offers?.salesPrice);\n\tconst totalPrice = !isNaN(salesPrice) \u0026\u0026 salesPrice \u003c originalPrice\n\t\t? salesPrice\n\t\t: originalPrice;\n\n\tconst payload = {\n\t\tdomain : window.location.hostname,\n\t\titem_id : data?.offers?.sku,\n\t\ttitle : data?.name,\n\t\tbrand: data?.brand?.name ?? '',\n\t\turl : data?.['@id'],\n\t\timage : data?.image,\n\t\tpath : window.location.pathname,\n\t\tcategory_path : getCategoryPath() ?? '',\n\t\tcategory_level_1 : getCategoryLevels(1),\n\t\tcategory_level_2 : getCategoryLevels(2),\n\t\tcategory_level_3 : getCategoryLevels(3),\n\t\ttitle_nl : getCategoryLevelsNL(4),\n\t\tcategory_path_nl : getCategoryPathNL() ?? '',\n\t\tcategory_level_1_nl : getCategoryLevelsNL(1),\n\t\tcategory_level_2_nl : getCategoryLevelsNL(2),\n\t\tcategory_level_3_nl : getCategoryLevelsNL(3),\n\t\tcurrency : data?.offers?.priceCurrency ?? '',\n\t\tin_stock : checkAvailability(),\n\t\toriginal_price : originalPrice,\n\t\ttotal_price : totalPrice,\n\t\tlabel : defineLabel(window.location.host),\n\t\tcountry : country,\n\t\tlanguage : language,\n\t\tlocale : locale\n\t};\n\n\tif (typeof exponea !== 'undefined' \u0026\u0026 exponea \u0026\u0026 typeof exponea.track === 'function') {\n\t\texponea.track('view_item', payload);\n\t}\n};\n\nif (getPageMetaProperty('og:type')?.toLowerCase() === 'product') {\n\ttrackEvent();\n}\n","trigger":{"include_pages":[{"type":"any"}],"exclude_pages":null},"_id":"6917521f7067ac429bcec09c"},{"uses_overlay":false,"type":"js","parametrized_definition":"/** \n * componentID: unique ID, creates namespace for CSS so each carousel \n * can have diferent styles if needed\n * \n * componentClasses: addotional CSS classes if needed\n * \n * recommendationID: recommendation model ID\n * \n * headline: headline title for the component\n * \n * styles: additional inline styles if needed\n * \n * placement {\n *      selector: CSS selector of the element on the page used to position carousel against\n *      action: how to inject carousel against element. possible values:\n *          append, after, before, prepend\n *      \n * }\n */\nfunction setProductRecommendations(options) {\n\n    const COMPONENT_ID = options.componentId\n    console.log(`-- starting ${COMPONENT_ID}`)\n\n    const COMPONENT_CLASSES = options.componentClasses;\n    const RECOMMENDATION_ID = options.recommendationID\n    const HEADLINE = options.headline\n    // this is element that we are using to inject our carousel after\n    const PLACEMENT_ELEMENT = document.querySelector(options.placement.selector);\n\n    const createCarousel = (recievedProductData) =\u003e {\n\n        console.log(recievedProductData);\n\n        // Product Validator:\n        // Rule #1\n        // if category_level_1_nl = \"Tweedehands\" AND stock_level = 0      HIDE\n        // Rule #2\n        // if category_level_1_nl is NOT \"Tweedehands\" AND stock_level = 0 AND EOL = True Hide\n        const validateProduct = (product) =\u003e {\n            let valid = true;\n            if(product.active == false) {\n                valid = false;\n            }\n            if(!product.image || product.image==null || product.item_price==null || product.image == 'https://www.kamera-express.nl/') {\n                valid = false;\n            }\n            if(product.category_level_1_nl == 'Tweedehands' || product.title.match('occasion')) {\n                // console.log('occasion!');\n                if( product.stock_level == 0 ) {\n                    valid = false;\n                }\n            } else {\n                if(product.stock_level == 0 \u0026\u0026 product.eol == true) {\n                    // valid = false;\n                }\n            }\n            return valid;\n        }\n\n        // filter products based on conditions of the validator\n        let productData = [];\n        recievedProductData.map((product) =\u003e {\n            if(validateProduct(product)) {\n                productData.push(product);\n            }\n        })\n\n        if(!productData || productData.length \u003c 4 || !PLACEMENT_ELEMENT) {\n            return;\n        }\n\n        if(document.getElementById(COMPONENT_ID)) {\n            return;\n        }\n\n        const getItemIds = () =\u003e {\n            let ids = [];\n            productData.map((item) =\u003e {\n                ids.push(item.item_id);\n            });\n            return ids;\n        }\n\n        const formatPrice = (n) =\u003e  n.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, \".\");\n\n        const getItemPartial = (item) =\u003e {\n\n            let priceMain = '';\n            let priceReminder = '';\n\n            if(item.item_price) {\n                if(item.item_price % 1 === 0) {\n                    priceMain = `${formatPrice(item.item_price)},-`\n                } else {\n                    const priceSplit = item.item_price.toString().split('.');\n                    priceMain = `${formatPrice(priceSplit[0])},`\n                    priceReminder = priceSplit[1];\n                    if(priceReminder.length == 1) {\n                        priceReminder = `${priceReminder}0`\n                    }\n                }\n            }\n\n            const productRating = Math.round(100*item.average_review_rating/5);\n            const ratingClass = productRating === 0 ? 'ab-rating-hidden' : '';\n        \n            const itemTemplate = `\u003ca class=ab-rcmd-item data-id=\"${item.item_id}\" href=\"${item.url}\"\u003e\u003cdiv class=ab-rcmd-item__img\u003e\u003cimg alt=\"\"data-v-0aa41950=\"\"height=200 loading=lazy src=\"${item.image}\" width=200\u003e ${item.text_wobbler ? ` \u003cspan class=\"promotion-label-container-text\"\u003e${item.text_wobbler}\u003c/span\u003e` : `\u003cspan\u003e\u0026nbsp;\u003c/span\u003e`}\u003c/div\u003e\u003cdiv class=ab-rcmd-item__name\u003e\u003cp\u003e${item.title}\u003c/div\u003e\u003cdiv class=\"ab-rating-wrapper ${ratingClass}\"\u003e\u003cdiv class=\"ab-rating\"\u003e\u003cspan style=\"width: ${productRating}%;\"\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv class=\"ab-rating-votes\"\u003e(${item.amount_of_reviews})\u003c/div\u003e\u003c/div\u003e\u003cdiv class=ab-rcmd-item__price\u003e\u003cp class=current-price\u003e\u003cspan\u003e${priceMain}\u003c/span\u003e \u003cspan class=decimal\u003e${priceReminder}\u003c/span\u003e\u003c/div\u003e\u003c/a\u003e`\n            return itemTemplate;\n        }\n        \n        const getCarouselPartial = (data) =\u003e {\n            let items = '';\n            if(data) {\n                data.map((item) =\u003e {\n                    items += getItemPartial(item);\n                })\n            }\n\n            const carouselTemplate = `\n                \u003cdiv class=\"K1-container K1-mb-container ${COMPONENT_CLASSES}\" id=\"${COMPONENT_ID}\" style=\"${options.styles}\"\u003e\n                    \u003cdiv class=\"ab-rcmd-pdp-headline\"\u003e\n                        \u003ch2\u003e${HEADLINE}\u003c/h2\u003e\n                    \u003c/div\u003e            \n                    \u003cdiv class=\"ab-rcmd-carousel ab-rcmd-noprev\"\u003e\n                        \u003cdiv class=\"ab-rcmd-carousel-slider-wrapper\"\u003e\n                            \u003cdiv class=\"ab-rcmd-carousel-slider\"\u003e\n                                ${items}\n                            \u003c/div\u003e\n                        \u003c/div\u003e\n                        \u003cdiv class=\"ab-rcmd-carousel-buttons\"\u003e\n                            \u003cspan class=\"ab-rcmd-carousel-prev\"\u003e\u003cspan\u003e\u003cimg width=\"14\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB8AAAAdCAMAAABluEcAAAAAP1BMVEXv7+8zMzPq6urg4OBCQkLU1NTOzs49PT3FxcU5OTm/v79HR0dFRUViYmLQ0NDKysrk5OTIyMi4uLi1tbVZWVmrCPKQAAAAYklEQVQoz93ROxKAIAxFUaIoohH87X+tJmPjL6+k4LXnzqSIey8nh5Y9o2ANRNyZPAijYIxUKJhKBc3PtlswkzUN1GGAnQ7snKB7efXSfrfHi3vry5WyfBaxBgGyXlBGwZNPXMAE5AdfHpkAAAAASUVORK5CYII=\"\u003e\u003c/span\u003e\u003c/span\u003e\n                            \u003cspan class=\"ab-rcmd-carousel-next\"\u003e\u003cspan\u003e\u003cimg width=\"14\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB8AAAAdCAMAAABluEcAAAAAP1BMVEXv7+8zMzPq6urg4OBCQkLU1NTOzs49PT3FxcU5OTm/v79HR0dFRUViYmLQ0NDKysrk5OTIyMi4uLi1tbVZWVmrCPKQAAAAYklEQVQoz93ROxKAIAxFUaIoohH87X+tJmPjL6+k4LXnzqSIey8nh5Y9o2ANRNyZPAijYIxUKJhKBc3PtlswkzUN1GGAnQ7snKB7efXSfrfHi3vry5WyfBaxBgGyXlBGwZNPXMAE5AdfHpkAAAAASUVORK5CYII=\"\u003e\u003c/span\u003e\u003c/span\u003e\n                        \u003c/div\u003e\n                    \u003c/div\u003e\n                \u003c/div\u003e\n            `\n            return carouselTemplate;\n        }\n\n        const parser = new DOMParser();\n        const ITEM_WIDTH = 238;\n        const GAP = 11;\n        let OFFSET = 0;\n\n        // returns how many items to scroll\n        // based on viewport width\n        const getItemsToScroll = () =\u003e {\n            const viewportWidth = document.querySelector('.ab-rcmd-carousel').offsetWidth;\n            const itemsToScroll = Math.floor(viewportWidth / (ITEM_WIDTH+GAP));\n            return itemsToScroll;\n        }\n        \n        const getMaxOffset = () =\u003e {\n            const itemsToScroll = getItemsToScroll();\n            const maxOffset = itemsToScroll*Math.floor(productData.length/itemsToScroll) - itemsToScroll;\n            return maxOffset;\n        }\n\n        const controllButtonsVisibility = (slider) =\u003e {\n            const sliderWrapper = slider.closest('.ab-rcmd-carousel');\n\n            if(OFFSET == 0) {\n                sliderWrapper.classList.add('ab-rcmd-noprev')\n                sliderWrapper.classList.remove('ab-rcmd-nonext')\n            } else if(OFFSET \u003e= getMaxOffset()) {\n                sliderWrapper.classList.remove('ab-rcmd-noprev')\n                sliderWrapper.classList.add('ab-rcmd-nonext')\n            } else {\n                sliderWrapper.classList.remove('ab-rcmd-noprev')\n                sliderWrapper.classList.remove('ab-rcmd-nonext')\n            }\n        }\n\n        const getSlider = () =\u003e {\n            return document.getElementById(COMPONENT_ID).querySelector('.ab-rcmd-carousel-slider-wrapper');\n        }\n\n        const scrollSlider = (slider) =\u003e {\n            slider.scroll({left: OFFSET*(ITEM_WIDTH+GAP), behavior: 'smooth'});\n        }\n\n        const goNext = () =\u003e {\n            const slider = getSlider();\n            if(slider) {\n                OFFSET += getItemsToScroll();\n                scrollSlider(slider);\n                controllButtonsVisibility(slider);\n            }\n        }\n        const goPrev = () =\u003e {\n            const slider = getSlider();\n            if(slider) {\n                OFFSET -= getItemsToScroll();\n                scrollSlider(slider);\n                controllButtonsVisibility(slider);\n            }\n        }\n        // inject css styles\n        // @TODO check if we can add class to style to not inject more than once.\n        const styleElement = document.createElement('style');\n        styleElement.textContent = `#${COMPONENT_ID} {.ab-rating-hidden{opacity:0;}.ab-rcmd-carousel-prev img{transform: rotate(180deg);}.ab-rcmd-pdp-headline {margin-bottom: 1rem;}.ab-rcmd-pdp-headline h2{font-size: 24px;line-height: 29px;font-weight: 400;}.ab-rating-wrapper{margin-bottom:1rem;display:flex;align-items:center;justify-content:flex-start;gap:.5rem}.ab-rating-votes{font-weight:500;font-size:14px;color:#646363}.ab-rating{width:80px;height:13px;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAAANBAMAAADML/S3AAAAMFBMVEX////a2tr8/Pzr6+vv7+/29vb4+Pjd3d3z8/Pc3Nzi4uLf39/m5ubo6Ojk5OTh4eFXKiHAAAABI0lEQVQoz0XOvUoDURAF4ONudgnRBA9JXH8gXFEQrFbRWpPGxsJUipViZRdTW+wTiKkFUaysDNqkNJW1IKYWfAB/XiBzdwYyzcfuzJm5kDqCVmjGuypSc9V8MtuZOtO3QE3FSIloA182cFqzQGIB6ol1/llgPjcYLjkN2ECZXX//jeRlC9FOj7zZBvYvyIVvh7NH8SVDcSSN2xYq9HWHOLcODL2y89zLDGHuszYagDYOgFCDCHoaxIYGURZfoY05aKPhXdMgChpEkdRH/5Idb5usekvyRidGJFNMNkKc9TbJRe8USWeb+mKFW/wRYw7u6yLeq83Eu5xc5adDfvBanN7ESscHB4geRPy7YM+JhxmOU7H0iUJXDAA4M4Z+BCZOYD8xBhhyNtl9yoFfAAAAAElFTkSuQmCC)}.ab-rating span{display:block;height:100%;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAAANCAMAAAAJ3xm2AAAAflBMVEX/////0zn///v//vj/0zf/1Ub/1kv/+eX/5I3//PH/+uv/11T/1EH//fT/8s7/1D3/9t3/6qr/55r/2V//11D/+ej/78T/8Mn/7r3/7Lb/4H3/33b/3m7/2Fn/+u3/67H/6ab/5pX/5In/9NX/6KH/9t//8MP/2mf/2mT/0i8kV9qPAAABPUlEQVQ4y32T2ZqCMAxGky5QdmQTFVBcZnn/FxyhbbRO9b/r4TT9khbQqcBNvHsBV+ausw18AqHowYka3QJT8VKgCvgncMbaKdCiODr6jI1TIErxBG8BKwWK3dMGrhCTiD2EsEDcPAsVooyZF5TXoUkRsQh+5vxOWH8eA7xHJofNtIzjpAUMarVdhC9Vk9DCPxBKtCnydfxIqbPlfoIH6BbhiJQk8gDakF4AnO/fXI+ncQ4E6K0wZl4QSa3fwGQnVjDYGWWNFi5W6EwD/A0Y1tXj2ktdcAabve4goleGa87wBqAOFcxNx+SnGkx0ohkY+EH8K8b8IAR1dEJRdQU2tuVIiCbfC9zSTFCorcSU+0GeLM+lPNDvN8wtAO9lZs8Pludy2ysagQoBWCdjP5iYGQSYGI/TpbwKrRG4B/wBeqgQ6mCzYZwAAAAASUVORK5CYII=)}.five-in-row .ab-rcmd-item{width:238px;min-width:238px;max-width:238px;}.ab-rcmd-item{border:1px solid #dadada;background-color:#fff;box-shadow:0 4px 20px rgba(29,31,34,.05);padding:16px;display:flex;flex-direction:column;width:198px;min-width:198px;max-width:198px;grid-gap:8px;gap:8px;color:#2E2D2C}.ab-rcmd-item:hover{text-decoration:none;color:#2E2D2C}.ab-rcmd-item__img{display:block}.ab-rcmd-item__img img{display:block;margin-left:auto;margin-right:auto;width:128px;height:128px;object-fit:cover}.ab-rcmd-item__name{height:48px}.ab-rcmd-item__name p{font-family:Barlow,sans-serif;font-size:18px;font-weight:700;line-height:24px;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;display:-webkit-box}.ab-rcmd-item__price{display:flex;align-items:flex-start;grid-gap:4px;gap:4px;color:#2e2d2c}.ab-rcmd-item__price .current-price{display:flex;align-items:flex-start;font-weight:700;font-size:24px;line-height:24px}.ab-rcmd-item__price .decimal{line-height:14px;margin-left:-4px;font-size:14px}.ab-rcmd-carousel-slider{display:flex;gap:11px}    .ab-rcmd-item__img .promotion-label-container-text{display:inline-block;max-width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-align:left;box-sizing:border-box;color:#fff;background:#ea0c27;font-size:14px;line-height:17px;font-weight:700;padding:3px 8px 4px;border-radius:4px}.ab-rcmd-carousel{width:100%;position:relative;margin-bottom:20px;}.ab-rcmd-carousel-slider-wrapper{overflow-x:scroll}.ab-rcmd-carousel-next,.ab-rcmd-carousel-prev{pointer-events:auto;transition:.25s;justify-content:center;align-items:center;font-family:K1-icomoon!important;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:32px;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-size:14px;width:44px;height:44px;border-radius:50%;border:1px solid #DADADA;box-shadow:1px 2px 24px 4px rgba(0,0,0,.04);text-shadow:none;background:#efefef;display:inline-flex;cursor:pointer}.ab-rcmd-carousel-next{transform:translateX(10px)}.ab-rcmd-carousel-prev{transform:translateX(-10px)}.ab-rcmd-carousel-buttons{width:100%;justify-content:space-between;position:absolute;top:50%;pointer-events:none;transform:translateY(-50%);display:none}.ab-rcmd-noprev .ab-rcmd-carousel-prev{opacity:0}.ab-rcmd-nonext .ab-rcmd-carousel-next{opacity:0}@media(max-width:767px){.ab-rcmd-carousel-slider-wrapper{overflow:hidden}.ab-rcmd-carousel-slider{overflow-x:scroll;scroll-snap-type:x mandatory}.ab-rcmd-item{scroll-snap-align:start}.ab-rcmd-pdp-headline h2{font-size: 20px !important;}.ab-rcmd-pdp-headline{padding: 0 16px;}.ab-rcmd-carousel{padding: 0 0 0 16px;}}@media(min-width:768px){.ab-rcmd-carousel-slider-wrapper{overflow-x:scroll;width:100%;-ms-overflow-style:none;scrollbar-width:none}.ab-rcmd-carousel-slider-wrapper::-webkit-scrollbar{display:none}.ab-rcmd-carousel-buttons{display:flex}}}`;\n        document.querySelector('head').append(styleElement);\n\n        const carouselTemplate = getCarouselPartial(productData);\n        if(carouselTemplate) {\n            const carouselHTML = parser.parseFromString(carouselTemplate, 'text/html').body.firstChild;\n            // console.log('***');\n            // console.log(carouselHTML);\n\n            const injectAction = options.placement.action;\n\n            if(injectAction === 'append') {\n                PLACEMENT_ELEMENT.append(carouselHTML);\n            } else if(injectAction === 'prepend') {\n                PLACEMENT_ELEMENT.prepend(carouselHTML);\n            } else if(injectAction === 'after') {\n                PLACEMENT_ELEMENT.after(carouselHTML);\n            } else if(injectAction === 'before') {\n                PLACEMENT_ELEMENT.before(carouselHTML);\n            }\n\n\n            setTimeout(function() {\n                const btnNext = document.getElementById(COMPONENT_ID).querySelector('.ab-rcmd-carousel-next');\n                const btnPrev = document.getElementById(COMPONENT_ID).querySelector('.ab-rcmd-carousel-prev');\n                if(btnNext) {\n                    btnNext.addEventListener('click', function(e) {\n                        e.preventDefault();\n                        e.stopPropagation();\n                        goNext();\n                    })\n                }\n                if(btnPrev) {\n                    btnPrev.addEventListener('click', function(e) {\n                        e.preventDefault();\n                        e.stopPropagation();\n                        goPrev();\n                    })\n                }\n\n                // add tracking events\n                // Impression event\n                const itemIds = getItemIds();\n                exponea.track(\"recommendation\", {\n                    action: \"show\",\n                    item_ids: itemIds,\n                    recommendation_id: RECOMMENDATION_ID\n                });\n\n                    // Click event\n                const tiles = document.getElementById(COMPONENT_ID).querySelectorAll('.ab-rcmd-item');\n                tiles.forEach((tile) =\u003e {\n                    tile.addEventListener('click', function(e) {\n                        const payload = {\n                            action: \"click\",\n                            item_id: tile.getAttribute('data-id'),\n                            recommendation_id: RECOMMENDATION_ID\n                        }\n                        exponea.track(\"recommendation\", payload);\n                    })\n                })\n\n                // console.log(getItemsToScroll());\n                // console.log(productData.length);\n                if(productData.length \u003c= getItemsToScroll()) {\n\n                    // console.log('remove button right');\n                    const slider = getSlider();\n                    const sliderWrapper = slider.closest('.ab-rcmd-carousel');\n                    sliderWrapper.classList.add('ab-rcmd-nonext');\n                }\n                \n            }, 200);\n        }\n    }\n\n    exponea.getRecommendation({\n        recommendationId: RECOMMENDATION_ID,\n        size: 9,\n        callback: createCarousel,\n        fillWithRandom: false,\n        catalogFilter: [],\n        catalogAttributesWhitelist: []\n    });\n\n    // createCarousel(products);\n}\n\n// =======================================\n// CONFIGURATIE PER WEBSITE\n// =======================================\n\nconst SITE_CONFIG = {\n  \"www.kamera-express.nl\": {\n    rec1: { id: \"668b983ed54ece898afd7fb2\", headline: \"Deze producten heb je eerder bekeken\" }\n  },\n  \"www.kamera-express.be\": {\n    rec1: { id: \"671a23d829e6be26021ab571\", headline: \"Deze producten heb je eerder bekeken\" }\n  },\n  \"www.kamera-express.be:fr\": {\n    rec1: { id: \"671a24b6a2ef71a38a552762\", headline: \"Ces produits, vous les avez déjà consultés\" }\n  },\n  \"www.kamera-express.de\": {\n    rec1: { id: \"671a1b73f3aadb71fb11d40d\", headline: \"Diese Produkte hast du dir bereits angesehen\" }\n  },\n  \"www.kamera-express.lu\": {\n    rec1: { id: \"66ebd10dbeaba7de07b1b377\", headline: \"Ces produits, vous les avez déjà consultés\" }\n  },\n  \"www.kamera-express.lu:de\": {\n    rec1: { id: \"66ebd1189580c25234b23514\", headline: \"Diese Produkte hast du dir bereits angesehen\" }\n  },\n  \"www.kamera-express.fr\": {\n    rec1: { id: \"671fad6d623d0728cd9aa211\", headline: \"Ces produits, vous les avez déjà consultés\" }\n  },\n  \"www.photospecialist.com\": {\n    rec1: { id: \"671a26145c032b32537d1059\", headline: \"These products you viewed earlier\" }\n  },\n  \"www.photospecialist.co.uk\": {\n    rec1: { id: \"671a262a0a18371aeed7b14a\", headline: \"These products you viewed earlier\" }\n  },\n  \"www.photospecialist.ie\": {\n    rec1: { id: \"671a2687a2ef71a38a552bd3\", headline: \"These products you viewed earlier\" }\n  },\n  \"www.photospecialist.fr\": {\n    rec1: { id: \"671a4b76f2d3328c4ae7d071\", headline: \"Ces produits, vous les avez déjà consultés\" }\n  },\n  \"www.photospecialist.at\": {\n    rec1: { id: \"671a25b879b7858834a42988\", headline: \"Diese Produkte hast du dir bereits angesehen\" }\n  },\n  \"www.photospecialist.it\": {\n    rec1: { id: \"671a26ba19fb2286fae058cd\", headline: \"Questi prodotti li hai già visualizzati\" }\n  },\n  \"www.photospecialist.es\": {\n    rec1: { id: \"671a269ca2ef71a38a552be3\", headline: \"Estos productos los has visto antes\" }\n  },\n  \"www.foto-gregor.de\": {\n    rec1: { id: \"671a252f79b7858834a42914\", headline: \"Diese Produkte hast du dir bereits angesehen\" }\n  },\n  \"www.photogalerie.com\": {\n    rec1: { id: \"671a26a979b7858834a429e0\", headline: \"Ces produits, vous les avez déjà consultés\" }\n  }\n};\nfunction getCurrentSiteKey() {\n  const host = window.location.hostname;\n  const path = window.location.pathname.toLowerCase();\n\n  if (path.startsWith('/de') || path === '/de') return `${host}:de`;\n  if (path.startsWith('/fr') || path === '/fr') return `${host}:fr`;\n  if (path.startsWith('/nl') || path === '/nl') return `${host}:nl`;\n  if (path.startsWith('/it') || path === '/it') return `${host}:it`;\n  if (path.startsWith('/es') || path === '/es') return `${host}:es`;\n  return host;\n}\n// =======================================\n// HOOFDFUNCTIE\n// =======================================\nfunction initPDPPersonalization() {\n  if (!document.querySelector('.image-gallery-buy-section')) {\n    return;\n  }\n\n  const siteKey = getCurrentSiteKey();     // \u003c-- hier\n  const config = SITE_CONFIG[siteKey];     // \u003c-- en hier\n\n  if (!config) {\n    console.warn(`[Personalization] Geen configuratie gevonden voor: ${siteKey}`);\n    return;\n  }\n\n  console.log(`[Personalization] Config geladen voor ${siteKey}`);\n\n  setProductRecommendations({\n    componentId: 'hp_personalized_1',\n    componentClasses: '',\n    recommendationID: config.rec1.id,\n    headline: config.rec1.headline,\n    styles: '',\n    placement: { selector: '.slug-page-wrapper.page-container', action: 'append' }\n  });\n}\n\nsetTimeout(initPDPPersonalization, 500);","trigger":{"include_pages":[{"url":"https://www.photospecialist.co.uk","type":"contains"},{"url":"https://www.photospecialist.ie/","type":"contains"},{"url":"https://www.photospecialist.com/","type":"contains"},{"url":"https://www.photospecialist.it/","type":"contains"},{"url":"https://www.photospecialist.es/","type":"contains"},{"url":"https://www.kamera-express.fr/","type":"contains"},{"url":"https://www.photospecialist.fr/","type":"contains"},{"url":"https://www.kamera-express.lu","type":"contains"},{"url":"https://www.kamera-express.lu/de","type":"contains"},{"url":"https://www.photogalerie.com/","type":"contains"},{"url":"https://www.photospecialist.at/","type":"contains"},{"url":"https://www.kamera-express.be/","type":"contains"},{"url":"https://www.foto-gregor.de/","type":"contains"},{"url":"https://www.kamera-express.be/fr","type":"contains"},{"url":"https://www.kamera-express.de/","type":"contains"},{"url":"https://www.kamera-express.nl/","type":"contains"}],"exclude_pages":null},"_id":"691b2b2d0f2809c1da28de20"},{"uses_overlay":false,"type":"js","parametrized_definition":"(function() {\r\n  // ---------- URL-Detectie ----------\r\n  const currentURL = window.location.href;\r\n\r\n  const NL_URL = \"https://www.kamera-express.be/uitgebreid-zekerheidspakket\";\r\n  const FR_URL = \"https://www.kamera-express.be/fr/assurance-complete\";\r\n\r\n  // Typeform-selectie op basis van taal\r\n  let typeformURL = \"https://eb1jb1q5m1d.typeform.com/to/tuA4eauh\"; // default NL (veilig fallback)\r\n\r\n  if (currentURL.includes(FR_URL)) {\r\n    typeformURL = \"https://eb1jb1q5m1d.typeform.com/to/pfp0s6Po?typeform-embed=embed-widget\u0026typeform-source=www.kamera-express.be\";\r\n  } else if (currentURL.includes(NL_URL)) {\r\n    typeformURL = \"https://eb1jb1q5m1d.typeform.com/to/tuA4eauh\";\r\n  }\r\n\r\n  // ---------- 1) Helpers ----------\r\n  const byText = (sel, re) =\u003e\r\n    [...document.querySelectorAll(sel)].find(el =\u003e re.test(el.textContent?.trim() || ''));\r\n\r\n  function onDomReady(cb){\r\n    if (document.readyState === 'complete' || document.readyState === 'interactive') cb();\r\n    else document.addEventListener('DOMContentLoaded', cb);\r\n  }\r\n\r\n  function waitFor(fn, {timeout=8000, interval=100} = {}) {\r\n    return new Promise((resolve, reject) =\u003e {\r\n      const start = Date.now();\r\n      const int = setInterval(() =\u003e {\r\n        const el = fn();\r\n        if (el) { clearInterval(int); resolve(el); }\r\n        else if (Date.now() - start \u003e timeout) { clearInterval(int); resolve(null); }\r\n      }, interval);\r\n    });\r\n  }\r\n\r\n  // ---------- 2) Styles ----------\r\n  function injectStylesOnce() {\r\n    if (document.getElementById('custom-slideout-style')) return;\r\n    const style = document.createElement(\"style\");\r\n    style.id = 'custom-slideout-style';\r\n    style.innerHTML = `\r\n      .custom-slideout-btn { background:#ea580c;color:#fff;font-family:\"Barlow\",sans-serif;font-weight:700;font-size:1rem;border-radius:4px;padding:8px 24px;border:0;cursor:pointer;transition:background .3s ease;display:inline-flex;align-items:center;justify-content:center;margin-top:16px }\r\n      .custom-slideout-btn:hover { background-color:#f26122 }\r\n      .custom-slideout-overlay { position:fixed; inset:0; width:100%; height:100vh; background-color:rgba(0,0,0,.4); z-index:9998; display:flex; justify-content:flex-end }\r\n      .custom-slideout { width:540px; max-width:100%; background:#fff; height:100%; display:flex; flex-direction:column; position:relative; font-family:\"Barlow\",sans-serif; box-shadow:-2px 0 6px rgba(0,0,0,.1); animation:slideIn .3s ease-out }\r\n      @keyframes slideIn { from { transform:translateX(100%) } to { transform:translateX(0) } }\r\n      .custom-slideout-close { position:absolute; top:8px; right:12px; background:none; border:none; font-size:36px; cursor:pointer; line-height:1; width:40px; height:40px; display:flex; align-items:center; justify-content:center; color:#111 }\r\n      .custom-slideout-close:hover { color:#f26122 }\r\n      .custom-slideout-iframe { flex:1; border:none; width:100%; height:100% }\r\n    `;\r\n    document.head.appendChild(style);\r\n  }\r\n\r\n  // ---------- 3) Slide-out ----------\r\n  function createSlideout() {\r\n    if (document.getElementById(\"custom-slideout-overlay\")) return;\r\n\r\n    const overlay = document.createElement(\"div\");\r\n    overlay.className = \"custom-slideout-overlay\";\r\n    overlay.id = \"custom-slideout-overlay\";\r\n\r\n    const slideout = document.createElement(\"div\");\r\n    slideout.className = \"custom-slideout\";\r\n\r\n    const closeBtn = document.createElement(\"button\");\r\n    closeBtn.className = \"custom-slideout-close\";\r\n    closeBtn.innerHTML = \"\u0026times;\";\r\n    closeBtn.addEventListener(\"click\", closeSlideout);\r\n\r\n    overlay.addEventListener(\"click\", (e) =\u003e {\r\n      if (!slideout.contains(e.target)) closeSlideout();\r\n    });\r\n\r\n    const iframe = document.createElement(\"iframe\");\r\n    iframe.className = \"custom-slideout-iframe\";\r\n    iframe.src = typeformURL; // Dynamische keuze op basis van taal\r\n    iframe.allow = \"camera; microphone; autoplay; encrypted-media;\";\r\n    iframe.title = \"Verzekering aanvragen\";\r\n\r\n    slideout.appendChild(closeBtn);\r\n    slideout.appendChild(iframe);\r\n    overlay.appendChild(slideout);\r\n    document.body.appendChild(overlay);\r\n\r\n    document.documentElement.style.overflow = 'hidden';\r\n    window.addEventListener('keydown', escClose);\r\n  }\r\n\r\n  function closeSlideout() {\r\n    const overlay = document.getElementById(\"custom-slideout-overlay\");\r\n    if (overlay) overlay.remove();\r\n    document.documentElement.style.overflow = '';\r\n    window.removeEventListener('keydown', escClose);\r\n  }\r\n\r\n  function escClose(e){ if (e.key === 'Escape') closeSlideout(); }\r\n\r\n  // ---------- 4) Bind to button ----------\r\n  function findTriggerButton() {\r\n    let btn = document.querySelector('a.link-container .small-button.sf-button');\r\n    if (!btn) btn = byText('button.small-button.sf-button, a .small-button.sf-button', /Fordern Sie Ihr Sicherheitspaket an/i);\r\n    return btn;\r\n  }\r\n\r\n  function bindOnce(btn){\r\n    if (!btn || btn.dataset.slideoutBound === '1') return;\r\n    btn.dataset.slideoutBound = '1';\r\n\r\n    btn.addEventListener('click', (e) =\u003e {\r\n      if (e.metaKey || e.ctrlKey || e.shiftKey || e.altKey) return;\r\n      e.preventDefault();\r\n      e.stopPropagation();\r\n\r\n      injectStylesOnce();\r\n      createSlideout();\r\n    }, true);\r\n  }\r\n\r\n  onDomReady(async () =\u003e {\r\n    const btn = await waitFor(findTriggerButton, { timeout: 6000, interval: 100 });\r\n    if (btn) { bindOnce(btn); return; }\r\n\r\n    const obs = new MutationObserver(() =\u003e {\r\n      const b = findTriggerButton();\r\n      if (b) { bindOnce(b); obs.disconnect(); }\r\n    });\r\n    obs.observe(document.documentElement, { childList: true, subtree: true });\r\n    setTimeout(() =\u003e obs.disconnect(), 15000);\r\n  });\r\n\r\n})();\r\n","trigger":{"include_pages":[{"url":"https://www.kamera-express.be/uitgebreid-zekerheidspakket","type":"contains"},{"url":"https://www.kamera-express.be/fr/assurance-complete","type":"contains"}],"exclude_pages":null},"_id":"69398076842f3f00e12454b2"},{"uses_overlay":false,"type":"js","parametrized_definition":"(function () {\r\n\r\n  /* ----------------------------------------------------\r\n     Bloomreach event helper\r\n  ---------------------------------------------------- */\r\n  function trackEvent(eventName) {\r\n    if (!window.location.hostname.includes(\"kamera-express.nl\")) return;\r\n\r\n    try {\r\n      if (typeof exponea !== 'undefined' \u0026\u0026 exponea.track) {\r\n        exponea.track(eventName, {\r\n          domain: window.location.hostname,\r\n          path: window.location.pathname,\r\n          label: 'Kamera Express',\r\n          country: 'nl',\r\n          language: 'nl',\r\n          locale: 'nl_NL'\r\n        });\r\n        console.log(`Event ${eventName} fired`);\r\n      }\r\n    } catch (e) {\r\n      console.error(\"Bloomreach tracking error:\", e);\r\n    }\r\n  }\r\n\r\n\r\n  /* ----------------------------------------------------\r\n     Typeform slide-in direct openen\r\n  ---------------------------------------------------- */\r\n  function openTypeformDirect() {\r\n    if (document.getElementById('custom-slideout-overlay')) return;\r\n\r\n    const overlay = document.createElement('div');\r\n    overlay.id = 'custom-slideout-overlay';\r\n    overlay.className = 'custom-slideout-overlay';\r\n\r\n    const slideout = document.createElement('div');\r\n    slideout.className = 'custom-slideout';\r\n\r\n    const closeBtn = document.createElement('button');\r\n    closeBtn.className = 'custom-slideout-close';\r\n    closeBtn.innerHTML = '\u0026times;';\r\n    closeBtn.addEventListener('click', () =\u003e overlay.remove());\r\n\r\n    overlay.addEventListener('click', (e) =\u003e {\r\n      if (!slideout.contains(e.target)) overlay.remove();\r\n    });\r\n\r\n    const iframe = document.createElement('iframe');\r\n    iframe.className = 'custom-slideout-iframe';\r\n    iframe.src = \"https://eb1jb1q5m1d.typeform.com/to/xgndMbaR#product_url=xxxxx\"; // ← later vervangen\r\n    iframe.allow = \"camera; microphone; autoplay; encrypted-media;\";\r\n    iframe.title = \"Offerteformulier\";\r\n\r\n    slideout.appendChild(closeBtn);\r\n    slideout.appendChild(iframe);\r\n    overlay.appendChild(slideout);\r\n    document.body.appendChild(overlay);\r\n\r\n    // Fire event\r\n    trackEvent('cro_kenl_requestquote-click-text');\r\n  }\r\n\r\n\r\n  /* ----------------------------------------------------\r\n     PDP label – “Vraag scherpe offerte aan”\r\n  ---------------------------------------------------- */\r\n  function initPDPLabel() {\r\n    const priceContainer = document.querySelector('.price-container');\r\n    const currentPriceContainer = document.querySelector('.current-price-container.centered');\r\n\r\n    if (!priceContainer || !currentPriceContainer) return;\r\n\r\n    // voorkomt dubbels\r\n    if (document.querySelector('.br-offerte-label')) return;\r\n\r\n    const label = document.createElement('div');\r\n    label.className = 'br-offerte-label';\r\n    label.innerText = 'Vraag scherpe offerte aan';\r\n\r\n    Object.assign(label.style, {\r\n      position: 'absolute',\r\n      right: '0',\r\n      top: '50%',\r\n      transform: 'translateY(-50%)',\r\n      fontSize: '14px',\r\n      textDecoration: 'underline',\r\n      color: '#2e2d2c',\r\n      fontWeight: '600',\r\n      cursor: 'pointer',\r\n      whiteSpace: 'nowrap',\r\n      zIndex: '2',\r\n\r\n      /* Fade-in */\r\n      opacity: '0',\r\n      transition: 'opacity 0.5s ease'\r\n    });\r\n\r\n    priceContainer.style.position = 'relative';\r\n    priceContainer.appendChild(label);\r\n\r\n    // Fade-in trigger\r\n    requestAnimationFrame(() =\u003e {\r\n      label.style.opacity = '1';\r\n    });\r\n\r\n    // Klik opent direct Typeform slide-in\r\n    label.addEventListener('click', () =\u003e {\r\n      openTypeformDirect();\r\n    });\r\n  }\r\n\r\n\r\n  /* ----------------------------------------------------\r\n     Styles voor Typeform slide-in\r\n  ---------------------------------------------------- */\r\n  const style = document.createElement('style');\r\n  style.innerHTML = `\r\n    .custom-slideout-overlay {\r\n      position: fixed;\r\n      top: 0; right: 0;\r\n      width: 100%; height: 100vh;\r\n      background: rgba(0,0,0,0.4);\r\n      z-index: 9998;\r\n      display: flex;\r\n      justify-content: flex-end;\r\n    }\r\n    .custom-slideout {\r\n      width: 540px;\r\n      max-width: 100%;\r\n      background: #fff;\r\n      height: 100%;\r\n      display: flex;\r\n      flex-direction: column;\r\n      animation: slideIn .3s ease-out;\r\n      position: relative;\r\n    }\r\n    @keyframes slideIn {\r\n      from { transform: translateX(100%); }\r\n      to   { transform: translateX(0%); }\r\n    }\r\n    .custom-slideout-close {\r\n      position: absolute;\r\n      top: 8px; right: 12px;\r\n      font-size: 48px;\r\n      background: none;\r\n      border: none;\r\n      cursor: pointer;\r\n      line-height: 1;\r\n    }\r\n    .custom-slideout-iframe {\r\n      flex: 1;\r\n      border: none;\r\n      width: 100%;\r\n      height: 100%;\r\n    }\r\n  `;\r\n  document.head.appendChild(style);\r\n\r\n\r\n  /* ----------------------------------------------------\r\n     Observer + Init\r\n  ---------------------------------------------------- */\r\n  function init() {\r\n    initPDPLabel();\r\n  }\r\n\r\n  const observer = new MutationObserver(init);\r\n  observer.observe(document.body, { childList: true, subtree: true });\r\n\r\n  init();\r\n\r\n})();\r\n\r\n(function () {\r\n\r\n  /* 1. Bepaal PDP URL */\r\n  const productUrl = encodeURIComponent(window.location.href);\r\n\r\n  /* 2. Functie die het iframe plaatst of aanpast */\r\n  function injectTypeformIframe() {\r\n\r\n    const iframe = document.querySelector(\"iframe[src*='typeform.com/to']\");\r\n\r\n    if (!iframe || iframe.dataset.productUrlInjected) return;\r\n\r\n    let src = iframe.getAttribute(\"src\");\r\n\r\n    // Verwijder hash (belangrijk!)\r\n    src = src.split(\"#\")[0];\r\n\r\n    // Voeg hidden field toe\r\n    const separator = src.includes(\"?\") ? \"\u0026\" : \"?\";\r\n    iframe.src = `${src}${separator}product_url=${productUrl}`;\r\n\r\n    iframe.dataset.productUrlInjected = \"true\";\r\n  }\r\n\r\n  /* 3. Run direct (voor snelle loads) */\r\n  injectTypeformIframe();\r\n\r\n  /* 4. Observeer DOM voor slide-out injectie */\r\n  const observer = new MutationObserver(injectTypeformIframe);\r\n  observer.observe(document.body, {\r\n    childList: true,\r\n    subtree: true\r\n  });\r\n\r\n})();","trigger":{"include_pages":[{"url":"https://www.kamera-express.nl/canon-ef-200-400mm-f-4-0-l-is-usm-extender-","type":"contains"},{"url":"https://www.kamera-express.nl/sony-fe-400mm-f-2-8-gm-oss","type":"contains"},{"url":"https://www.kamera-express.nl/canon-ef-400mm-f-2-8l-is-iii-usm","type":"contains"},{"url":"https://www.kamera-express.nl/sony-fe-600mm-f-4-0-gm","type":"contains"},{"url":"https://www.kamera-express.nl/canon-eos-1dx-mark-iii-body","type":"contains"},{"url":"https://www.kamera-express.nl/sony-fx6-body-cinema-line","type":"contains"},{"url":"https://www.kamera-express.nl/sony-alpha-a1-body-","type":"contains"},{"url":"https://www.kamera-express.nl/canon-rf-400mm-f-2-8l-is-usm","type":"contains"},{"url":"https://www.kamera-express.nl/canon-rf-600mm-f-4l-is-usm","type":"contains"},{"url":"https://www.kamera-express.nl/canon-eos-r3-body","type":"contains"},{"url":"https://www.kamera-express.nl/nikon-z9-body","type":"contains"},{"url":"https://www.kamera-express.nl/canon-eos-r5-c-body","type":"contains"},{"url":"https://www.kamera-express.nl/nikon-z-400mm-f2-8-tc-vr-s","type":"contains"},{"url":"https://www.kamera-express.nl/canon-rf-800mm-f-5-6l-is-usm","type":"contains"},{"url":"https://www.kamera-express.nl/canon-rf-1200mm-f-8l-is-usm","type":"contains"},{"url":"https://www.kamera-express.nl/nikon-nikkor-z-800mm-f-6-3-vr-s","type":"contains"},{"url":"https://www.kamera-express.nl/hasselblad-x2d-100c-body","type":"contains"},{"url":"https://www.kamera-express.nl/nikon-z-600mm-f-4-tc-vr-s","type":"contains"},{"url":"https://www.kamera-express.nl/canon-rf-100-300mm-f-2-8l-is-usm","type":"contains"},{"url":"https://www.kamera-express.nl/nikon-z8-body","type":"contains"},{"url":"https://www.kamera-express.nl/fujifilm-gfx-100-ii","type":"contains"},{"url":"https://www.kamera-express.nl/nikon-nikkor-z-600mm-f-6-3-vr-s","type":"contains"},{"url":"https://www.kamera-express.nl/sony-a9-iii-body","type":"contains"},{"url":"https://www.kamera-express.nl/sony-fe-300mm-f-2-8-gm-oss","type":"contains"},{"url":"https://www.kamera-express.nl/hasselblad-907x-cfv-100c","type":"contains"},{"url":"https://www.kamera-express.nl/fujifilm-gfx-100s-ii","type":"contains"},{"url":"https://www.kamera-express.nl/canon-cinema-eos-c400","type":"contains"},{"url":"https://www.kamera-express.nl/canon-eos-r1-body","type":"contains"},{"url":"https://www.kamera-express.nl/canon-cinema-eos-c80","type":"contains"},{"url":"https://www.kamera-express.nl/sony-a1-ii-body","type":"contains"}],"exclude_pages":[{"url":"occasion","type":"contains"},{"url":"outlet","type":"contains"}]},"_id":"693aa2d208fceabcd1c081bc"},{"uses_overlay":false,"type":"js","parametrized_definition":"(() =\u003e {\n  const run = () =\u003e {\n    setTimeout(() =\u003e {\n      const root = document.querySelector(\".plp-main-content\");\n      if (!root) return;\n\n      // Mobile only\n      if (!window.matchMedia(\"(max-width: 768px)\").matches) return;\n\n      const MAX = 30;\n      const CUT_TOKEN = \"i.W.v.\";\n      const TARGET_WORDS = [\"Weihnachtsangebot\", \"Winterangebot\"];\n\n      const clean = (s) =\u003e (s || \"\").replace(/\\s+/g, \" \").trim();\n\n      const getFont = (el) =\u003e {\n        const cs = getComputedStyle(el);\n        return cs.font || `${cs.fontWeight} ${cs.fontSize} ${cs.fontFamily}`;\n      };\n\n      const measure = (() =\u003e {\n        const c = document.createElement(\"canvas\");\n        const ctx = c.getContext(\"2d\");\n        return (text, font) =\u003e {\n          ctx.font = font;\n          return ctx.measureText(text).width;\n        };\n      })();\n\n      const hyphenate = (word, maxWidth, font) =\u003e {\n        let best = 1;\n        for (let i = 1; i \u003c word.length; i++) {\n          if (measure(word.slice(0, i) + \"-\", font) \u003c= maxWidth) best = i;\n          else break;\n        }\n        return `${word.slice(0, best)}-\u003cbr\u003e${word.slice(best)}`;\n      };\n\n      const fitWithShreddedLastWord = (text) =\u003e {\n        const original = clean(text);\n        if (original.length \u003c= MAX) return original;\n\n        const words = original.split(\" \");\n        if (words.length === 1) {\n          let w = words[0];\n          while (w.length \u003e MAX - 1) w = w.slice(0, -1);\n          return (w + \"…\").slice(0, MAX);\n        }\n\n        const base = words.slice(0, -1).join(\" \");\n        let last = words[words.length - 1];\n        const join = (b, l) =\u003e clean(b + (b \u0026\u0026 l ? \" \" : \"\") + l);\n\n        let candidate = join(base, last);\n        while (candidate.length \u003e MAX \u0026\u0026 last.length \u003e 0) {\n          last = last.slice(0, -1);\n          candidate = join(base, last);\n        }\n\n        if (candidate !== original) {\n          return (\n            candidate.length \u003c= MAX - 1\n              ? candidate + \"…\"\n              : candidate.slice(0, MAX - 1) + \"…\"\n          ).slice(0, MAX);\n        }\n\n        return candidate.slice(0, MAX);\n      };\n\n      const wobblers = root.querySelectorAll(\n        \".promotion-label-container.promotion.sf-badge\"\n      );\n\n      wobblers.forEach((el) =\u003e {\n        if (!el.dataset.originalWobblerText) {\n          el.dataset.originalWobblerText = el.textContent;\n        }\n\n        const source = clean(el.dataset.originalWobblerText);\n\n        if (!TARGET_WORDS.includes(source)) {\n          let text = source;\n\n          if (text.length \u003e MAX) {\n            const idx = text.indexOf(CUT_TOKEN);\n            if (idx !== -1) text = clean(text.slice(0, idx));\n          }\n\n          el.textContent = fitWithShreddedLastWord(text);\n          return;\n        }\n\n        const cs = getComputedStyle(el);\n        const font = getFont(el);\n\n        el.style.whiteSpace = \"normal\";\n\n        const available =\n          el.clientWidth -\n          (parseFloat(cs.paddingLeft) || 0) -\n          (parseFloat(cs.paddingRight) || 0);\n\n        if (available \u003e 0 \u0026\u0026 measure(source, font) \u003e available) {\n          el.innerHTML = hyphenate(source, available, font);\n        } else {\n          el.textContent = source;\n        }\n      });\n    }, 200); // shorter delay for pagination\n  };\n\n  // initial run\n  run();\n\n  // 🔁 rerun when clicking pagination buttons\n  document.addEventListener(\"click\", (e) =\u003e {\n    const btn = e.target.closest(\"a.pagination-btn\");\n    if (!btn) return;\n\n    run();\n  });\n})();\n","trigger":{"include_pages":[{"url":"https://www.kamera-express.de","type":"contains"}],"exclude_pages":[{"url":"warenkorb","type":"contains"},{"url":"checkout","type":"contains"}]},"_id":"6941697a1f54425d808ff95a"},{"uses_overlay":false,"type":"js","parametrized_definition":"(function () {\r\n  const hiddenKey = 'page_url'; // must match the hidden field key in Typeform\r\n  const pageUrl = encodeURIComponent(window.location.href);\r\n\r\n  // Find all Typeform iframes on the page\r\n  const iframes = document.querySelectorAll('iframe[src*=\"typeform.com\"]');\r\n\r\n  iframes.forEach(function (iframe) {\r\n    if (!iframe.src.includes(hiddenKey + '=')) {\r\n      const separator = iframe.src.includes('?') ? '\u0026' : '?';\r\n      iframe.src = iframe.src + separator + hiddenKey + '=' + pageUrl;\r\n    }\r\n  });\r\n})();","trigger":{"include_pages":[{"url":"https://www.photospecialist.com/customer-service/submit-a-question","type":"contains"},{"url":"https://www.photospecialist.co.uk/customer-service/submit-a-question","type":"contains"},{"url":"https://www.photospecialist.ie/customer-service/submit-a-question","type":"contains"}],"exclude_pages":null},"_id":"69526eba2b150eeefd6ce49f"},{"uses_overlay":false,"type":"js","parametrized_definition":"let popularHeadline = null;\nlet popularCarousel = null;\n\nfunction setProductRecommendations(options) {\n\n    const COMPONENT_ID = options.componentId\n    console.log(`-- starting ${COMPONENT_ID}`)\n\n    const COMPONENT_CLASSES = options.componentClasses;\n    const RECOMMENDATION_ID = options.recommendationID\n    const HEADLINE = options.headline\n    // this is element that we are using to inject our carousel after\n    const PLACEMENT_ELEMENT =\n\t\toptions.placement.element || document.querySelector(options.placement.selector);\n\n\n    const createCarousel = (recievedProductData) =\u003e {\n\n        const validateProduct = (product) =\u003e {\n            let valid = true;\n            if(product.active == false) {\n                valid = false;\n            }\n            if(!product.image || product.image==null || product.image == 'https://www.kamera-express.nl/' || product.title == \"\") {\n                valid = false;\n            }\n            if(product.category_level_1_nl == 'Tweedehands' || product.title.match('occasion')) {\n                // console.log('occasion!');\n                if( product.stock_level == 0 ) {\n                    valid = false;\n                }\n            } else {\n                if(product.stock_level == 0 \u0026\u0026 product.eol == true) {\n                    // valid = false;\n                }\n            }\n            return valid;\n        }\n\n        // filter products based on conditions of the validator\n        let productData = [];\n        recievedProductData.map((product) =\u003e {\n            if(validateProduct(product)) {\n                productData.push(product);\n            }\n        })\n\n        if(!productData || productData.length \u003c 4 || !PLACEMENT_ELEMENT) {\n            return;\n        }\n\n        if(document.getElementById(COMPONENT_ID)) {\n            return;\n        }\n\n        const getItemIds = () =\u003e {\n            let ids = [];\n            productData.map((item) =\u003e {\n                ids.push(item.item_id);\n            });\n            return ids;\n        }\n\n        const formatPrice = (n) =\u003e  n.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, \".\");\n\n        const getItemPartial = (item) =\u003e {\n\n            let priceMain = '';\n            let priceReminder = '';\n\n            if(item.item_price) {\n                if(item.item_price % 1 === 0) {\n                    priceMain = `${formatPrice(item.item_price)},-`\n                } else {\n                    const priceSplit = item.item_price.toString().split('.');\n                    priceMain = `${formatPrice(priceSplit[0])},`\n                    priceReminder = priceSplit[1];\n                    if(priceReminder.length == 1) {\n                        priceReminder = `${priceReminder}0`\n                    }\n                }\n            }\n\n            const productRating = Math.round(100*item.average_review_rating/5);\n            const ratingClass = productRating === 0 ? 'ab-rating-hidden' : '';\n        \n            const itemTemplate = `\u003ca class=ab-rcmd-item data-id=\"${item.item_id}\" href=\"${item.url}\"\u003e\u003cdiv class=ab-rcmd-item__img\u003e\u003cimg alt=\"\"data-v-0aa41950=\"\"height=200 loading=lazy src=\"${item.image}\" width=200\u003e ${item.text_wobbler ? ` \u003cspan class=\"promotion-label-container-text\"\u003e${item.text_wobbler}\u003c/span\u003e` : `\u003cspan\u003e\u0026nbsp;\u003c/span\u003e`}\u003c/div\u003e\u003cdiv class=ab-rcmd-item__name\u003e\u003cp\u003e${item.title}\u003c/div\u003e\u003cdiv class=\"ab-rating-wrapper ${ratingClass}\"\u003e\u003cdiv class=\"ab-rating\"\u003e\u003cspan style=\"width: ${productRating}%;\"\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv class=\"ab-rating-votes\"\u003e(${item.amount_of_reviews})\u003c/div\u003e\u003c/div\u003e\u003cdiv class=ab-rcmd-item__price\u003e\u003cp class=current-price\u003e\u003cspan\u003e${priceMain}\u003c/span\u003e \u003cspan class=decimal\u003e${priceReminder}\u003c/span\u003e\u003c/div\u003e\u003c/a\u003e`\n            return itemTemplate;\n        }\n        \n        const getCarouselPartial = (data) =\u003e {\n            let items = '';\n            if(data) {\n                data.map((item) =\u003e {\n                    items += getItemPartial(item);\n                })\n            }\n\n            const carouselTemplate = `\n                \u003cdiv class=\"K1-container K1-mb-container ${COMPONENT_CLASSES}\" id=\"${COMPONENT_ID}\" style=\"${options.styles}\"\u003e\n                    \u003cdiv class=\"ab-rcmd-pdp-headline\"\u003e\n                        \u003ch2\u003e${HEADLINE}\u003c/h2\u003e\n                    \u003c/div\u003e            \n                    \u003cdiv class=\"ab-rcmd-carousel ab-rcmd-noprev\"\u003e\n                        \u003cdiv class=\"ab-rcmd-carousel-slider-wrapper\"\u003e\n                            \u003cdiv class=\"ab-rcmd-carousel-slider\"\u003e\n                                ${items}\n                            \u003c/div\u003e\n                        \u003c/div\u003e\n                        \u003cdiv class=\"ab-rcmd-carousel-buttons\"\u003e\n                            \u003cspan class=\"ab-rcmd-carousel-prev\"\u003e\u003cspan\u003e\u003cimg width=\"14\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB8AAAAdCAMAAABluEcAAAAAP1BMVEXv7+8zMzPq6urg4OBCQkLU1NTOzs49PT3FxcU5OTm/v79HR0dFRUViYmLQ0NDKysrk5OTIyMi4uLi1tbVZWVmrCPKQAAAAYklEQVQoz93ROxKAIAxFUaIoohH87X+tJmPjL6+k4LXnzqSIey8nh5Y9o2ANRNyZPAijYIxUKJhKBc3PtlswkzUN1GGAnQ7snKB7efXSfrfHi3vry5WyfBaxBgGyXlBGwZNPXMAE5AdfHpkAAAAASUVORK5CYII=\"\u003e\u003c/span\u003e\u003c/span\u003e\n                            \u003cspan class=\"ab-rcmd-carousel-next\"\u003e\u003cspan\u003e\u003cimg width=\"14\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB8AAAAdCAMAAABluEcAAAAAP1BMVEXv7+8zMzPq6urg4OBCQkLU1NTOzs49PT3FxcU5OTm/v79HR0dFRUViYmLQ0NDKysrk5OTIyMi4uLi1tbVZWVmrCPKQAAAAYklEQVQoz93ROxKAIAxFUaIoohH87X+tJmPjL6+k4LXnzqSIey8nh5Y9o2ANRNyZPAijYIxUKJhKBc3PtlswkzUN1GGAnQ7snKB7efXSfrfHi3vry5WyfBaxBgGyXlBGwZNPXMAE5AdfHpkAAAAASUVORK5CYII=\"\u003e\u003c/span\u003e\u003c/span\u003e\n                        \u003c/div\u003e\n                    \u003c/div\u003e\n                \u003c/div\u003e\n            `\n            return carouselTemplate;\n        }\n\n        const parser = new DOMParser();\n        const ITEM_WIDTH = 238;\n        const GAP = 11;\n        let OFFSET = 0;\n\n        // returns how many items to scroll\n        // based on viewport width\n        const getItemsToScroll = () =\u003e {\n            const viewportWidth = document.querySelector('.ab-rcmd-carousel').offsetWidth;\n            const itemsToScroll = Math.floor(viewportWidth / (ITEM_WIDTH+GAP));\n            return itemsToScroll;\n        }\n        \n        const getMaxOffset = () =\u003e {\n            const itemsToScroll = getItemsToScroll();\n            const maxOffset = itemsToScroll*Math.floor(productData.length/itemsToScroll) - itemsToScroll;\n            return maxOffset;\n        }\n\n        const controllButtonsVisibility = (slider) =\u003e {\n            const sliderWrapper = slider.closest('.ab-rcmd-carousel');\n\n            if(OFFSET == 0) {\n                sliderWrapper.classList.add('ab-rcmd-noprev')\n                sliderWrapper.classList.remove('ab-rcmd-nonext')\n            } else if(OFFSET \u003e= getMaxOffset()) {\n                sliderWrapper.classList.remove('ab-rcmd-noprev')\n                sliderWrapper.classList.add('ab-rcmd-nonext')\n            } else {\n                sliderWrapper.classList.remove('ab-rcmd-noprev')\n                sliderWrapper.classList.remove('ab-rcmd-nonext')\n            }\n        }\n\n        const getSlider = () =\u003e {\n            return document.getElementById(COMPONENT_ID).querySelector('.ab-rcmd-carousel-slider-wrapper');\n        }\n\n        const scrollSlider = (slider) =\u003e {\n            slider.scroll({left: OFFSET*(ITEM_WIDTH+GAP), behavior: 'smooth'});\n        }\n\n        const goNext = () =\u003e {\n            const slider = getSlider();\n            if(slider) {\n                OFFSET += getItemsToScroll();\n                scrollSlider(slider);\n                controllButtonsVisibility(slider);\n            }\n        }\n        const goPrev = () =\u003e {\n            const slider = getSlider();\n            if(slider) {\n                OFFSET -= getItemsToScroll();\n                scrollSlider(slider);\n                controllButtonsVisibility(slider);\n            }\n        }\n\n        // inject css styles\n        const styleElement = document.createElement('style');\n        styleElement.textContent = `#${COMPONENT_ID} {.ab-rating-hidden{opacity:0;}.ab-rcmd-carousel-prev img{transform: rotate(180deg);}.ab-rcmd-pdp-headline {margin-bottom: 1rem;}.ab-rcmd-pdp-headline h2{font-size: 24px;line-height: 29px;font-weight: 400;}.ab-rating-wrapper{margin-bottom:1rem;display:flex;align-items:center;justify-content:flex-start;gap:.5rem}.ab-rating-votes{font-weight:500;font-size:14px;color:#646363}.ab-rating{width:80px;height:13px;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAAANBAMAAADML/S3AAAAMFBMVEX////a2tr8/Pzr6+vv7+/29vb4+Pjd3d3z8/Pc3Nzi4uLf39/m5ubo6Ojk5OTh4eFXKiHAAAABI0lEQVQoz0XOvUoDURAF4ONudgnRBA9JXH8gXFEQrFbRWpPGxsJUipViZRdTW+wTiKkFUaysDNqkNJW1IKYWfAB/XiBzdwYyzcfuzJm5kDqCVmjGuypSc9V8MtuZOtO3QE3FSIloA182cFqzQGIB6ol1/llgPjcYLjkN2ECZXX//jeRlC9FOj7zZBvYvyIVvh7NH8SVDcSSN2xYq9HWHOLcODL2y89zLDGHuszYagDYOgFCDCHoaxIYGURZfoY05aKPhXdMgChpEkdRH/5Idb5usekvyRidGJFNMNkKc9TbJRe8USWeb+mKFW/wRYw7u6yLeq83Eu5xc5adDfvBanN7ESscHB4geRPy7YM+JhxmOU7H0iUJXDAA4M4Z+BCZOYD8xBhhyNtl9yoFfAAAAAElFTkSuQmCC)}.ab-rating span{display:block;height:100%;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAAANCAMAAAAJ3xm2AAAAflBMVEX/////0zn///v//vj/0zf/1Ub/1kv/+eX/5I3//PH/+uv/11T/1EH//fT/8s7/1D3/9t3/6qr/55r/2V//11D/+ej/78T/8Mn/7r3/7Lb/4H3/33b/3m7/2Fn/+u3/67H/6ab/5pX/5In/9NX/6KH/9t//8MP/2mf/2mT/0i8kV9qPAAABPUlEQVQ4y32T2ZqCMAxGky5QdmQTFVBcZnn/FxyhbbRO9b/r4TT9khbQqcBNvHsBV+ausw18AqHowYka3QJT8VKgCvgncMbaKdCiODr6jI1TIErxBG8BKwWK3dMGrhCTiD2EsEDcPAsVooyZF5TXoUkRsQh+5vxOWH8eA7xHJofNtIzjpAUMarVdhC9Vk9DCPxBKtCnydfxIqbPlfoIH6BbhiJQk8gDakF4AnO/fXI+ncQ4E6K0wZl4QSa3fwGQnVjDYGWWNFi5W6EwD/A0Y1tXj2ktdcAabve4goleGa87wBqAOFcxNx+SnGkx0ohkY+EH8K8b8IAR1dEJRdQU2tuVIiCbfC9zSTFCorcSU+0GeLM+lPNDvN8wtAO9lZs8Pludy2ysagQoBWCdjP5iYGQSYGI/TpbwKrRG4B/wBeqgQ6mCzYZwAAAAASUVORK5CYII=)}.five-in-row .ab-rcmd-item{width:238px;min-width:238px;max-width:238px;}.ab-rcmd-item{border:1px solid #dadada;background-color:#fff;box-shadow:0 4px 20px rgba(29,31,34,.05);padding:16px;display:flex;flex-direction:column;width:198px;min-width:198px;max-width:198px;grid-gap:8px;gap:8px;color:#2E2D2C}.ab-rcmd-item:hover{text-decoration:none;color:#2E2D2C}.ab-rcmd-item__img{display:block}.ab-rcmd-item__img img{display:block;margin-left:auto;margin-right:auto;width:128px;height:128px;object-fit:cover}.ab-rcmd-item__name{height:48px}.ab-rcmd-item__name p{font-family:Barlow,sans-serif;font-size:18px;font-weight:700;line-height:24px;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;display:-webkit-box}.ab-rcmd-item__price{display:flex;align-items:flex-start;grid-gap:4px;gap:4px;color:#2e2d2c}.ab-rcmd-item__price .current-price{display:flex;align-items:flex-start;font-weight:700;font-size:24px;line-height:24px}.ab-rcmd-item__price .decimal{line-height:14px;margin-left:-4px;font-size:14px}.ab-rcmd-carousel-slider{display:flex;gap:11px}    .ab-rcmd-item__img .promotion-label-container-text{display:inline-block;max-width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-align:left;box-sizing:border-box;color:#fff;background:#ea0c27;font-size:14px;line-height:17px;font-weight:700;padding:3px 8px 4px;border-radius:4px}.ab-rcmd-carousel{width:100%;position:relative;margin-bottom:20px;}.ab-rcmd-carousel-slider-wrapper{overflow-x:scroll}.ab-rcmd-carousel-next,.ab-rcmd-carousel-prev{pointer-events:auto;transition:.25s;justify-content:center;align-items:center;font-family:K1-icomoon!important;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:32px;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-size:14px;width:44px;height:44px;border-radius:50%;border:1px solid #DADADA;box-shadow:1px 2px 24px 4px rgba(0,0,0,.04);text-shadow:none;background:#efefef;display:inline-flex;cursor:pointer}.ab-rcmd-carousel-next{transform:translateX(10px)}.ab-rcmd-carousel-prev{transform:translateX(-10px)}.ab-rcmd-carousel-buttons{width:100%;justify-content:space-between;position:absolute;top:50%;pointer-events:none;transform:translateY(-50%);display:none}.ab-rcmd-noprev .ab-rcmd-carousel-prev{opacity:0}.ab-rcmd-nonext .ab-rcmd-carousel-next{opacity:0}@media(max-width:767px){.ab-rcmd-carousel-slider-wrapper{overflow:hidden}.ab-rcmd-carousel-slider{overflow-x:scroll;scroll-snap-type:x mandatory}.ab-rcmd-item{scroll-snap-align:start}.ab-rcmd-pdp-headline h2{font-size: 20px !important;}.ab-rcmd-pdp-headline{padding: 0 16px;}.ab-rcmd-carousel{padding: 0 0 0 16px;}}@media(min-width:768px){.ab-rcmd-carousel-slider-wrapper{overflow-x:scroll;width:100%;-ms-overflow-style:none;scrollbar-width:none}.ab-rcmd-carousel-slider-wrapper::-webkit-scrollbar{display:none}.ab-rcmd-carousel-buttons{display:flex}}}`;\n        document.querySelector('head').append(styleElement);\n\n        const carouselTemplate = getCarouselPartial(productData);\n        if(carouselTemplate) {\n            const carouselHTML = parser.parseFromString(carouselTemplate, 'text/html').body.firstChild;\n\n            const injectAction = options.placement.action;\n\n            if(injectAction === 'append') {\n                PLACEMENT_ELEMENT.append(carouselHTML);\n            } else if(injectAction === 'prepend') {\n                PLACEMENT_ELEMENT.prepend(carouselHTML);\n            } else if(injectAction === 'after') {\n                PLACEMENT_ELEMENT.after(carouselHTML);\n            } else if(injectAction === 'before') {\n                PLACEMENT_ELEMENT.before(carouselHTML);\n            }\n\n            setTimeout(function() {\n                const btnNext = document.getElementById(COMPONENT_ID).querySelector('.ab-rcmd-carousel-next');\n                const btnPrev = document.getElementById(COMPONENT_ID).querySelector('.ab-rcmd-carousel-prev');\n                if(btnNext) {\n                    btnNext.addEventListener('click', function(e) {\n                        e.preventDefault();\n                        e.stopPropagation();\n                        goNext();\n                    })\n                }\n                if(btnPrev) {\n                    btnPrev.addEventListener('click', function(e) {\n                        e.preventDefault();\n                        e.stopPropagation();\n                        goPrev();\n                    })\n                }\n\n                // add tracking events\n                // Impression event\n                const itemIds = getItemIds();\n                exponea.track(\"recommendation\", {\n                    action: \"show\",\n                    item_ids: itemIds,\n                    recommendation_id: RECOMMENDATION_ID\n                });\n\n                // Click event\n                const tiles = document.getElementById(COMPONENT_ID).querySelectorAll('.ab-rcmd-item');\n                tiles.forEach((tile) =\u003e {\n                    tile.addEventListener('click', function(e) {\n                        const payload = {\n                            action: \"click\",\n                            item_id: tile.getAttribute('data-id'),\n                            recommendation_id: RECOMMENDATION_ID\n                        }\n                        exponea.track(\"recommendation\", payload);\n                    })\n                })\n\n                if(productData.length \u003c= getItemsToScroll()) {\n                    const slider = getSlider();\n                    const sliderWrapper = slider.closest('.ab-rcmd-carousel');\n                    sliderWrapper.classList.add('ab-rcmd-nonext');\n                }\n                \n            }, 200);\n        }\n    }\n\n    exponea.getRecommendation({\n        recommendationId: RECOMMENDATION_ID,\n        size: 10,\n        callback: createCarousel,\n        fillWithRandom: false,\n        catalogFilter: [],\n        catalogAttributesWhitelist: []\n    });\n}\n\nconst SITE_CONFIG = {\n  \"www.kamera-express.nl\": {\n  \tanchorTitle: \"Laat je inspireren\",\n    rec1: { id: \"66016997e026b0d3486dae0e\", headline: \"Speciaal voor jou\" }\n  },\n  \"www.kamera-express.be\": {\n  \tanchorTitle: \"Laat je inspireren\",\n    rec1: { id: \"6908cbb618afa39bb37190e0\", headline: \"Speciaal voor jou\" }\n  },\n  \"www.kamera-express.be:fr\": {\n  \tanchorTitle: \"Laissez-vous inspirer\",\n    rec1: { id: \"671a3e2f29e6be26021b07e7\", headline: \"Spécialement pour vous\" }\n  },\n  \"www.kamera-express.de\": {\n  \tanchorTitle: \"Lass dich inspirieren\",\n    rec1: { id: \"671a3e1d176c0d8e4d07e19a\", headline: \"Speziell für dich\" }\n  },\n  \"www.kamera-express.lu\": {\n  \tanchorTitle: \"Laissez-vous inspirer\",\n    rec1: { id: \"66ebd2e335b417dcea57875e\", headline: \"Spécialement pour vous\" }\n  },\n  \"www.kamera-express.lu:de\": {\n  \tanchorTitle: \"Lass dich inspirieren\",\n    rec1: { id: \"66ebd1ff3627c9560289e053\", headline: \"Speziell für dich\" }\n  },\n  \"www.kamera-express.fr\": {\n  \tanchorTitle: \"Laissez-vous inspirer\",\n    rec1: { id: \"671fad58623d0728cd9aa1f0\", headline: \"Spécialement pour vous\" }\n  },\n  \"www.photospecialist.com\": {\n  \tanchorTitle: \"Laat je inspireren\",\n    rec1: { id: \"671a456d392295a7ffae1a59\", headline: \"Just for you\" }\n  },\n  \"www.photospecialist.co.uk\": {\n  \tanchorTitle: \"Laat je inspireren\",\n    rec1: { id: \"671a458e0a18371aeed7f2da\", headline: \"Just for you\" }\n  },\n  \"www.photospecialist.ie\": {\n  \tanchorTitle: \"Laat je inspireren\",\n    rec1: { id: \"671a45815c032b32537d3fb2\", headline: \"Just for you\" }\n  },\n  \"www.photospecialist.fr\": {\n  \tanchorTitle: \"Laat je inspireren\",\n    rec1: { id: \"671a4b6adc25933de6502c3e\", headline: \"Spécialement pour vous\" }\n  },\n  \"www.photospecialist.at\": {\n  \tanchorTitle: \"Laissez-vous inspirer\",\n    rec1: { id: \"671a4561dc25933de64f2a09\", headline: \"Speziell für dich\" }\n  },\n  \"www.photospecialist.it\": {\n  \tanchorTitle: \"Laat je inspireren\",\n    rec1: { id: \"671a45cf728160554d9df4bb\", headline: \"Specialmente per te\" }\n  },\n  \"www.photospecialist.es\": {\n  \tanchorTitle: \"Laat je inspireren\",\n    rec1: { id: \"671a459b0a18371aeed7f2e8\", headline: \"Especialmente para ti\" }\n  },\n  \"www.foto-gregor.de\": {\n  \tanchorTitle: \"Lass dich inspirieren\",\n    rec1: { id: \"671a3e43e16569978629f447\", headline: \"Speziell für dich\" }\n  },\n  \"www.photogalerie.com\": {\n  \tanchorTitle: \"Laissez-vous inspirer\",\n    rec1: { id: \"671a3e5029e6be26021b0800\", headline: \"Spécialement pour vous\" }\n  }\n};\nfunction getGridContainerByTitle(titleText) {\n  const titles = document.querySelectorAll('.regular-title');\n  for (const t of titles) {\n    if (t.textContent.trim() === titleText) {\n      return t.closest('.grid-container');\n    }\n  }\n  return null;\n}\n\nfunction getCurrentSiteKey() {\n  const host = window.location.hostname;\n  const path = window.location.pathname;\n\n  if (path.startsWith('/de')) return `${host}:de`;\n  if (path.startsWith('/fr')) return `${host}:fr`;\n  return host;\n}\n\nfunction initHomePersonalization() {\n  const siteKey = getCurrentSiteKey();\n  const config = SITE_CONFIG[siteKey] || SITE_CONFIG[window.location.hostname];\n\n  if (!config) {\n    console.warn(`[Personalization] Geen configuratie gevonden voor: ${siteKey}`);\n    return;\n  }\n  \n  \n  const inspireTitleContainer = getGridContainerByTitle(config.anchorTitle);\n\n  // 👉 2) fallback als titel niet gevonden is (dan inject vóór expert stories)\n  const fallbackElement = document.querySelector('.expert-stories-container');\n  const fallbackContainer = document.querySelector('.containers-mapper');\n\n  const placement = inspireTitleContainer\n    ? { element: inspireTitleContainer, action: 'before' }\n    : { element: fallbackContainer, action: 'append' };\n\n\n  // -----------------------------\n  // Voeg CSS classes toe op basis van titels (voor placement selector)\n  // -----------------------------\n  function setSyblingClassByParentTitle(title, clazz) {\n    const titlesFr = document.querySelectorAll('.regular-title');\n    titlesFr.forEach(t =\u003e {\n      if (t.textContent.trim() === title) {\n        const gridTitle = t.closest('.grid-container');\n        if (gridTitle) {\n          const syb = gridTitle.nextElementSibling;\n          if (syb) syb.classList.add(clazz);\n        }\n      }\n    });\n  }\n\n  setSyblingClassByParentTitle('Meest verkochte producten', 'home-popular-products');\n  setSyblingClassByParentTitle('Produits les plus vendus', 'home-popular-products');\n  setSyblingClassByParentTitle('Bestseller Produkte', 'home-popular-products');\n  setSyblingClassByParentTitle('Prodotti più venduti', 'home-popular-products');\n  setSyblingClassByParentTitle('Productos más vendidos', 'home-popular-products');\n  setSyblingClassByParentTitle('Best-selling products', 'home-popular-products');\n\n  // -----------------------------\n  // Alleen: Speciaal voor jou (rec1)\n  // -----------------------------\n  setProductRecommendations({\n    componentId: 'hp_personalized_1',\n    componentClasses: '',\n    recommendationID: config.rec1.id,\n    headline: config.rec1.headline,\n    styles: '',\n    placement\n  });\n\n}\n\nsetTimeout(initHomePersonalization, 500);\n","trigger":{"include_pages":[{"url":"/winter-deals","type":"contains"},{"url":"/winterdeals","type":"contains"},{"url":"/offres-d-hiver","type":"contains"},{"url":"/ofertas-de-invierno","type":"contains"},{"url":"/offerte-invernali","type":"contains"}],"exclude_pages":null},"_id":"69806182889f9cdc01bd2648"},{"uses_overlay":false,"type":"js","parametrized_definition":"(function () {\n\n  // Controle: alleen uitvoeren op kamera-express.nl\n  if (!window.location.hostname.includes('kamera-express.be')) return;\n\n  // Controle: alleen op PDP (als #pdpIntro bestaat)\n  function isPDP() {\n    return (document.querySelector('#pdpIntro') ? true : false);\n  }\n\n  if (!isPDP()) return;\n\n  const trackEvent = () =\u003e {\n    const country = 'be';\n    const language = 'nl';\n    const locale = 'nl_BE';\n\n    exponea.track('cro_kebenl_click-secondhand-pdp', {\n      domain: window.location.hostname,\n      path: window.location.pathname,\n      label: 'Tweedehands service click',\n      country: country,\n      language: language,\n      locale: locale\n    });\n\n    console.log('Event cro_kebenl_click-secondhand-pdp fired');\n  };\n\n  document.addEventListener('click', function (e) {\n\n    const serviceLink = e.target.closest('a.additional-service');\n    if (!serviceLink) return;\n\n    const serviceType = serviceLink.querySelector('.service-type');\n    if (!serviceType) return;\n\n    const typeText = serviceType.textContent.trim();\n\n    if (typeText === 'Tweedehands') {\n      trackEvent();\n    }\n\n  });\n\n})();\n","trigger":{"include_pages":[{"url":"kamera-express.be","type":"contains"}],"exclude_pages":[{"url":"kamera-express.be/fr","type":"contains"}]},"_id":"69956454ab6967bf450c440c"},{"uses_overlay":false,"type":"js","parametrized_definition":"setTimeout(() =\u003e {\r\n  (function () {\r\n    // -----------------------------\r\n    // 1) Constants\r\n    // -----------------------------\r\n    const CTA_TEXTS = [\r\n      \"Sluit het Uitgebreid Zekerheidspakket af\", // NL\r\n      \"Schließe das Allianz Komplettschutz ab\",   // DE\r\n      \"Souscris à l’Assurance Complète\",          // FR (curly apostrophe)\r\n      \"Souscris à l'Assurance Complète\",          // FR (straight apostrophe)\r\n    ];\r\n\r\n    const ALLOWED = {\r\n      \"kamera-express.lu\": [\"assurance-complete\", \"komplettschutz\", \"careplan\", \"careplan-allianz\"],\r\n      \"photogalerie.com\":  [\"assurance-complete\", \"komplettschutz\", \"careplan\", \"careplan-allianz\"],\r\n      \"foto-gregor.de\":    [\"assurance-complete\", \"komplettschutz\", \"careplan\", \"careplan-allianz\"],\r\n      \"photospecialist.at\":[\"assurance-complete\", \"komplettschutz\", \"careplan\", \"careplan-allianz\"],\r\n    };\r\n\r\n    const TYPEFORMS = {\r\n      \"photospecialist.at\": { de: \"https://eb1jb1q5m1d.typeform.com/to/PYcOS2Tn\" },\r\n      \"foto-gregor.de\":     { de: \"https://eb1jb1q5m1d.typeform.com/to/F4i0PQ75\" },\r\n      \"photogalerie.com\":   { fr: \"https://eb1jb1q5m1d.typeform.com/to/xs4F2zHJ\" },\r\n      \"kamera-express.lu\":  {\r\n        de: \"https://eb1jb1q5m1d.typeform.com/to/d1Vkz4GC\",\r\n        fr: \"https://eb1jb1q5m1d.typeform.com/to/isFmDmI9\",\r\n      },\r\n    };\r\n\r\n    const STYLE_ID = \"br-slideout-style-master\";\r\n    const OVERLAY_ID = \"br-slideout-overlay-master\";\r\n    const BOUND_ATTR = \"data-br-slideout-bound\";\r\n\r\n    // -----------------------------\r\n    // 2) Environment\r\n    // -----------------------------\r\n    const loc = window.location;\r\n    const hostname = (loc.hostname || \"\").replace(/^www\\./, \"\").toLowerCase();\r\n    const path = (loc.pathname || \"/\").toLowerCase();\r\n\r\n    const allowedSlugs = ALLOWED[hostname];\r\n    if (!allowedSlugs) return;\r\n\r\n    const isAllowedPage = allowedSlugs.some((slug) =\u003e path.includes(`/${slug}`) || path.includes(slug));\r\n    if (!isAllowedPage) return;\r\n\r\n    // -----------------------------\r\n    // 3) Language detection (URL-based)\r\n    // -----------------------------\r\n    const detectLanguage = () =\u003e {\r\n      if (hostname === \"kamera-express.lu\") return path.startsWith(\"/de\") ? \"de\" : \"fr\";\r\n      if (hostname === \"foto-gregor.de\") return \"de\";\r\n      if (hostname === \"photospecialist.at\") return \"de\";\r\n      if (hostname === \"photogalerie.com\") return \"fr\";\r\n\r\n      if (path.startsWith(\"/de\") || path.includes(\"/de/\")) return \"de\";\r\n      if (path.startsWith(\"/fr\") || path.includes(\"/fr/\")) return \"fr\";\r\n      if (path.startsWith(\"/nl\") || path.includes(\"/nl/\")) return \"nl\";\r\n      return \"fr\";\r\n    };\r\n\r\n    const lang = detectLanguage();\r\n\r\n    const typeformBase = (TYPEFORMS[hostname] \u0026\u0026 TYPEFORMS[hostname][lang]) || null;\r\n    if (!typeformBase) return;\r\n\r\n    // -----------------------------\r\n    // 4) Build Typeform iframe src\r\n    // -----------------------------\r\n    const safeEncode = (v) =\u003e encodeURIComponent(String(v ?? \"\").trim());\r\n\r\n    const getQueryParam = (key) =\u003e {\r\n      try {\r\n        return new URLSearchParams(loc.search).get(key);\r\n      } catch {\r\n        return null;\r\n      }\r\n    };\r\n\r\n    const getLabelValue = () =\u003e {\r\n      const fromQuery = getQueryParam(\"label\");\r\n      if (fromQuery) return fromQuery;\r\n\r\n      const found = allowedSlugs.find((s) =\u003e path.includes(`/${s}`) || path.includes(s));\r\n      if (found) return found;\r\n\r\n      const seg = path.split(\"/\").filter(Boolean).pop();\r\n      if (seg) return seg;\r\n\r\n      return document.title || hostname;\r\n    };\r\n\r\n    const iframeSrc = `${typeformBase}#label=${safeEncode(getLabelValue())}\u0026language=${safeEncode(lang)}`;\r\n\r\n    // -----------------------------\r\n    // 5) Find CTA by text (primary) + photogalerie-only fallback (href/class)\r\n    // -----------------------------\r\n    const normalize = (s) =\u003e\r\n      String(s || \"\")\r\n        .replace(/\\u00A0/g, \" \")     // NBSP -\u003e normal space\r\n        .replace(/[’]/g, \"'\")        // curly apostrophe -\u003e straight\r\n        .replace(/\\s+/g, \" \")\r\n        .trim()\r\n        .toLowerCase();\r\n\r\n    const CTA_SET = new Set(CTA_TEXTS.map(normalize));\r\n\r\n    const findCtaByText = () =\u003e {\r\n      const candidates = [\r\n        ...document.querySelectorAll(\"button\"),\r\n        ...document.querySelectorAll(\"a\"),\r\n        ...document.querySelectorAll('[role=\"button\"]'),\r\n      ];\r\n\r\n      for (const el of candidates) {\r\n        if (CTA_SET.has(normalize(el.innerText))) return el;\r\n      }\r\n      for (const el of candidates) {\r\n        if (CTA_SET.has(normalize(el.textContent))) return el;\r\n      }\r\n      return null;\r\n    };\r\n\r\n    // photogalerie-only fallback:\r\n    // \u003ca href=\"https://www.photogalerie.com/formulaire-assurance\" class=\"link-container\"\u003e ... \u003c/a\u003e\r\n    const findCtaPhotogalerieFallback = () =\u003e {\r\n      if (hostname !== \"photogalerie.com\") return null;\r\n\r\n      // 1) Preferred: anchor with href containing /formulaire-assurance\r\n      const a = Array.from(document.querySelectorAll('a[href]')).find((el) =\u003e {\r\n        const href = (el.getAttribute(\"href\") || \"\").toLowerCase();\r\n        return href.includes(\"/formulaire-assurance\");\r\n      });\r\n      if (a) return a;\r\n\r\n      // 2) Backup: the button class shown in devtools\r\n      const btn = document.querySelector(\"button.small-button.sf-button\");\r\n      if (btn) return btn.closest(\"a\") || btn;\r\n\r\n      return null;\r\n    };\r\n\r\n    const ctaEl = findCtaByText() || findCtaPhotogalerieFallback();\r\n    if (!ctaEl) return;\r\n\r\n    const clickTarget = ctaEl.closest(\"a\") || ctaEl;\r\n\r\n    // -----------------------------\r\n    // 6) Inject CSS once\r\n    // -----------------------------\r\n    if (!document.getElementById(STYLE_ID)) {\r\n      const style = document.createElement(\"style\");\r\n      style.id = STYLE_ID;\r\n      style.innerHTML = `\r\n        .br-slideout-overlay {\r\n          position: fixed;\r\n          inset: 0;\r\n          width: 100%;\r\n          height: 100vh;\r\n          background-color: rgba(0,0,0,.4);\r\n          z-index: 9998;\r\n          display: flex;\r\n          justify-content: flex-end;\r\n        }\r\n        .br-slideout {\r\n          width: 540px;\r\n          max-width: 100%;\r\n          background: #fff;\r\n          height: 100%;\r\n          display: flex;\r\n          flex-direction: column;\r\n          position: relative;\r\n          font-family: \"Barlow\", sans-serif;\r\n          box-shadow: -2px 0 6px rgba(0,0,0,.1);\r\n          animation: brSlideIn .3s ease-out;\r\n        }\r\n        @keyframes brSlideIn {\r\n          from { transform: translateX(100%); }\r\n          to   { transform: translateX(0%); }\r\n        }\r\n        .br-slideout-close {\r\n          position: absolute;\r\n          top: 8px;\r\n          right: 12px;\r\n          background: none;\r\n          border: none;\r\n          font-size: 36px;\r\n          cursor: pointer;\r\n          line-height: 1;\r\n          width: 40px;\r\n          height: 40px;\r\n          display: flex;\r\n          align-items: center;\r\n          justify-content: center;\r\n          color: #111;\r\n          z-index: 1;\r\n        }\r\n        .br-slideout-close:hover { color: #f26122; }\r\n        .br-slideout-iframe {\r\n          flex: 1;\r\n          border: none;\r\n          width: 100%;\r\n          height: 100%;\r\n        }\r\n      `;\r\n      document.head.appendChild(style);\r\n    }\r\n\r\n    // -----------------------------\r\n    // 7) Slideout creation\r\n    // -----------------------------\r\n    const createSlideout = () =\u003e {\r\n      if (document.getElementById(OVERLAY_ID)) return;\r\n\r\n      const overlay = document.createElement(\"div\");\r\n      overlay.className = \"br-slideout-overlay\";\r\n      overlay.id = OVERLAY_ID;\r\n\r\n      const slideout = document.createElement(\"div\");\r\n      slideout.className = \"br-slideout\";\r\n\r\n      const closeBtn = document.createElement(\"button\");\r\n      closeBtn.className = \"br-slideout-close\";\r\n      closeBtn.innerHTML = \"\u0026times;\";\r\n      closeBtn.addEventListener(\"click\", () =\u003e overlay.remove());\r\n\r\n      overlay.addEventListener(\"click\", (e) =\u003e {\r\n        if (!slideout.contains(e.target)) overlay.remove();\r\n      });\r\n\r\n      const iframe = document.createElement(\"iframe\");\r\n      iframe.className = \"br-slideout-iframe\";\r\n      iframe.src = iframeSrc;\r\n      iframe.allow = \"camera; microphone; autoplay; encrypted-media;\";\r\n      iframe.title = \"Insurance form\";\r\n\r\n      slideout.appendChild(closeBtn);\r\n      slideout.appendChild(iframe);\r\n      overlay.appendChild(slideout);\r\n      document.body.appendChild(overlay);\r\n    };\r\n\r\n    // -----------------------------\r\n    // 8) Replace CTA click behavior\r\n    // -----------------------------\r\n    if (clickTarget.getAttribute(BOUND_ATTR) === \"1\") return;\r\n    clickTarget.setAttribute(BOUND_ATTR, \"1\");\r\n    clickTarget.style.cursor = \"pointer\";\r\n\r\n    clickTarget.addEventListener(\r\n      \"click\",\r\n      (e) =\u003e {\r\n        e.preventDefault();\r\n        e.stopPropagation();\r\n        createSlideout();\r\n      },\r\n      true\r\n    );\r\n  })();\r\n}, 800);","trigger":{"include_pages":[{"url":"https://www.kamera-express.lu/assurance-complete","type":"contains"},{"url":"https://www.kamera-express.lu/de/komplettschutz","type":"contains"},{"url":"https://www.foto-gregor.de/komplettschutz","type":"contains"},{"url":"https://www.photogalerie.com/assurance-complete","type":"contains"},{"url":"https://www.photospecialist.at/komplettschutz","type":"contains"}],"exclude_pages":null},"_id":"6996db60dcd036cf8c43aff5"},{"uses_overlay":false,"type":"js","parametrized_definition":"(function () {\n\n  // Alleen uitvoeren op juiste domeinen\n  if (\n    !window.location.hostname.includes('kamera-express.de') \u0026\u0026\n    !window.location.hostname.includes('foto-gregor.de')\n  ) return;\n\n  // Alleen op PDP\n  function isPDP() {\n    return document.querySelector('#pdpIntro') ? true : false;\n  }\n\n  if (!isPDP()) return;\n\n  const trackEvent = () =\u003e {\n    const domain = window.location.hostname;\n\n    exponea.track('cro_kede-fg_click-checkbox-insurance', {\n      domain: domain,\n      path: window.location.pathname,\n      label: 'Insurance checkbox click'\n    });\n\n    console.log('Event cro_kede-fg_click-checkbox-insurance fired');\n  };\n\n  document.addEventListener('click', function (e) {\n\n    // check of er geklikt is op (of binnen) de checkbox wrapper\n    const checkboxWrapper = e.target.closest('.careplan-card-container .careplan-checkbox');\n    if (!checkboxWrapper) return;\n\n    trackEvent();\n\n  });\n\n})();","trigger":{"include_pages":[{"url":"kamera-express.de","type":"contains"},{"url":"foto-gregor.de","type":"contains"}],"exclude_pages":null},"_id":"69ba67438e29dbba6a916ab8"},{"uses_overlay":false,"type":"js","parametrized_definition":"setTimeout(() =\u003e {\n  const btn = document.querySelector('button.add-review-button.small-button.sf-button');\n\n  btn.scrollIntoView({ block: 'center', behavior: 'smooth' });\n\n  btn.click();\n}, 1000);","trigger":{"include_pages":[{"url":"/sony-a7-v-body?review","type":"contains"},{"url":"kamera-express.be/fr/sony-a7-v?review","type":"contains"},{"url":"/bo-tier-canon-eos-r6-mark-iii-?review","type":"contains"},{"url":"/canon-eos-r6-mark-iii-body?review","type":"contains"}],"exclude_pages":null},"_id":"69d616f3c34bf03b31db7088"},{"uses_overlay":false,"type":"js","parametrized_definition":"document.querySelector('.buy-section-care-plan').style.display = 'none';","trigger":{"include_pages":[{"url":"https://www.photogalerie.com/","type":"contains"},{"url":"https://www.kamera-express.be/","type":"contains"}],"exclude_pages":null},"_id":"69d782ee7a87b368e5a4d710"},{"uses_overlay":false,"type":"js","parametrized_definition":"setTimeout(() =\u003e {\n  const toggleBtn = [...document.querySelectorAll('button.reviews-toggle')]\n    .find(btn =\u003e btn.textContent.trim() === 'Allgemeine Bewertungen');\n\n  if (toggleBtn) {\n    toggleBtn.scrollIntoView({ block: 'center', behavior: 'smooth' });\n\n    setTimeout(() =\u003e {\n      if (!toggleBtn.classList.contains('active')) {\n        toggleBtn.click();\n      }\n\n      setTimeout(() =\u003e {\n        const reviewBtn = document.querySelector('button.add-review-button.small-button.sf-button');\n\n        if (reviewBtn) {\n          reviewBtn.scrollIntoView({ block: 'center', behavior: 'smooth' });\n          reviewBtn.click();\n        }\n      }, 500);\n\n    }, 400);\n  }\n}, 500);","trigger":{"include_pages":[{"url":"kamera-express.de/sony-a7-v?review","type":"contains"},{"url":"/canon-eos-r6-mark-iii-geh-use?review","type":"contains"}],"exclude_pages":null},"_id":"69dcd992b90358c8ef489ef0"},{"uses_overlay":false,"type":"js","parametrized_definition":"(function () {\r\n  \"use strict\";\r\n\r\n  const titleEl =\r\n    document.querySelector(\"h1.pdpintro-title\") ||\r\n    document.querySelector(\"h1.pdpintro__title\") ||\r\n    document.querySelector(\"h1\");\r\n\r\n  const titleText = (titleEl?.textContent || \"\").toLowerCase();\r\n  const pathText = (window.location.pathname || \"\").toLowerCase();\r\n  const breadcrumbText = (document.querySelector(\"#breadcrumbs\")?.textContent || \"\").toLowerCase();\r\n\r\n  const shouldRun =\r\n    titleText.includes(\"occasion\") ||\r\n    pathText.includes(\"occasion\") ||\r\n    breadcrumbText.includes(\"occasion\");\r\n\r\n  if (!shouldRun) return;\r\n\r\n  const DEBUG = false;\r\n  const TAG = \"[2H-PDP-FR-KE_FR]\";\r\n\r\n  const iconURL =\r\n    \"https://www.kamera-express.nl/media/2df505a2-2d5f-42c5-af7a-165584f27481/second-hand-check-png.png\";\r\n  const infoIconURL =\r\n    \"https://kamera-express.nl/media/93b40321-ffd4-41b6-9c21-f815d8f6c8d1/info-icon-png.png\";\r\n\r\n  function log(...args) {\r\n    if (DEBUG) console.log(TAG, ...args);\r\n  }\r\n\r\n  function err(...args) {\r\n    console.error(TAG, ...args);\r\n  }\r\n\r\n  const contentCondition = `\r\n    \u003cdiv class=\"drawerInfo\"\u003e\r\n      \u003cp style=\"padding: 10px 0;\"\u003e\r\n        Nos experts contrôlent chaque produit repris avant sa mise en vente. Sur base de cette vérification, ils déterminent l'état général du produit. Ainsi, vous savez exactement à quoi vous attendre.\r\n      \u003c/p\u003e\r\n\r\n      \u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 16px;\"\u003e\r\n        \u003cdiv style=\"flex: 1 1 calc(50% - 8px); border: 1px solid #ccc; border-radius: 4px; text-align: center;\"\u003e\r\n          \u003cimg src=\"https://www.kamera-express.nl/media/3ee9b0de-bff2-4d59-beda-e63b4d002d9c/tweedehands-conditie-9-webp.webp\" alt=\"Comme neuf\" style=\"width: 100%; height: auto; object-fit: cover;\" /\u003e\r\n          \u003cstrong style=\"display: block; font-size: 15px; margin-bottom: 10px; padding: 0 3px;\"\u003eComme neuf\u003c/strong\u003e\r\n        \u003c/div\u003e\r\n\r\n        \u003cdiv style=\"flex: 1 1 calc(50% - 8px); border: 1px solid #ccc; border-radius: 4px; text-align: center;\"\u003e\r\n          \u003cimg src=\"https://www.kamera-express.nl/media/f96dbc3b-e687-4ebb-b65a-c79b54a6d1b7/tweedehands-conditie-8-webp.webp\" alt=\"Très légères traces d'utilisation\" style=\"width: 100%; height: auto; object-fit: cover;\" /\u003e\r\n          \u003cstrong style=\"display: block; font-size: 15px; margin-bottom: 10px; padding: 0 3px;\"\u003eTrès légères traces d'utilisation\u003c/strong\u003e\r\n        \u003c/div\u003e\r\n\r\n        \u003cdiv style=\"flex: 1 1 calc(50% - 8px); border: 1px solid #ccc; border-radius: 4px; text-align: center;\"\u003e\r\n          \u003cimg src=\"https://www.kamera-express.nl/media/39bad34a-4e2e-4174-ac7e-e711ef79ea82/tweedehands-conditie-7-webp.webp\" alt=\"Légères traces d'utilisation\" style=\"width: 100%; height: auto; object-fit: cover;\" /\u003e\r\n          \u003cstrong style=\"display: block; font-size: 15px; margin-bottom: 10px; padding: 0 3px;\"\u003eLégères traces d'utilisation\u003c/strong\u003e\r\n        \u003c/div\u003e\r\n\r\n        \u003cdiv style=\"flex: 1 1 calc(50% - 8px); border: 1px solid #ccc; border-radius: 4px; text-align: center;\"\u003e\r\n          \u003cimg src=\"https://www.kamera-express.nl/media/45c526c7-3d9e-4ea8-b2a4-7d5c3dda5cad/tweedehands-conditie-6-webp.webp\" alt=\"Traces d'utilisation normales\" style=\"width: 100%; height: auto; object-fit: cover;\" /\u003e\r\n          \u003cstrong style=\"display: block; font-size: 15px; margin-bottom: 10px; padding: 0 3px;\"\u003eTraces d'utilisation normales\u003c/strong\u003e\r\n        \u003c/div\u003e\r\n      \u003c/div\u003e\r\n    \u003c/div\u003e\r\n  `;\r\n\r\n  const contentClicks = `\r\n    \u003cdiv class=\"drawerInfo\"\u003e\r\n      \u003cp style=\"padding: 10px 0;\"\u003e\r\n        Chaque fois que vous prenez une photo avec un appareil photo, l'obturateur est activé. C'est ce qu'on appelle un \"clic\". L'obturateur est une pièce mécanique qui s'use avec le temps, un peu comme une voiture avec des kilomètres au compteur. Le nombre de clics donne donc une bonne indication de l'intensité d'utilisation de l'appareil. Chaque appareil a une durée de vie estimée de l'obturateur, généralement entre 100.000 et 300.000 clics selon le type et la marque.\r\n      \u003c/p\u003e\r\n      \u003cp style=\"padding: 10px 0;\"\u003e\u003cstrong\u003eÀ quoi pouvez-vous vous attendre selon le nombre de clics ?\u003c/strong\u003e\u003c/p\u003e\r\n\r\n      \u003cdiv\u003e\r\n        \u003cp style=\"padding: 10px 0; margin: 0;\"\u003e\u003cstrong\u003e\u0026lt; 10.000 : Comme neuf\u003c/strong\u003e\u003c/p\u003e\r\n        \u003cp style=\"padding: 10px 0;\"\u003eTrès peu utilisé, généralement en excellent état.\u003c/p\u003e\r\n      \u003c/div\u003e\r\n\r\n      \u003cdiv\u003e\r\n        \u003cp style=\"padding: 10px 0; margin: 0;\"\u003e\u003cstrong\u003e10.000 – 25.000 : Légèrement utilisé\u003c/strong\u003e\u003c/p\u003e\r\n        \u003cp style=\"padding: 10px 0;\"\u003eUtilisé quelques fois, mais techniquement en excellent état.\u003c/p\u003e\r\n      \u003c/div\u003e\r\n\r\n      \u003cdiv\u003e\r\n        \u003cp style=\"padding: 10px 0; margin: 0;\"\u003e\u003cstrong\u003e25.000 – 50.000 : Utilisation normale\u003c/strong\u003e\u003c/p\u003e\r\n        \u003cp style=\"padding: 10px 0;\"\u003eUsage typique pour un photographe passionné ou semi-professionnel.\u003c/p\u003e\r\n      \u003c/div\u003e\r\n\r\n      \u003cdiv\u003e\r\n        \u003cp style=\"padding: 10px 0; margin: 0;\"\u003e\u003cstrong\u003e50.000 – 75.000 : Utilisé régulièrement\u003c/strong\u003e\u003c/p\u003e\r\n        \u003cp style=\"padding: 10px 0;\"\u003eUtilisé activement, par exemple par un semi-professionnel.\u003c/p\u003e\r\n      \u003c/div\u003e\r\n\r\n      \u003cdiv\u003e\r\n        \u003cp style=\"padding: 10px 0; margin: 0;\"\u003e\u003cstrong\u003e75.000 – 100.000 : Utilisé intensivement, encore très fiable\u003c/strong\u003e\u003c/p\u003e\r\n        \u003cp style=\"padding: 10px 0;\"\u003eUtilisation intensive, mais les modèles professionnels sont conçus pour cela.\u003c/p\u003e\r\n      \u003c/div\u003e\r\n\r\n      \u003cdiv\u003e\r\n        \u003cp style=\"padding: 10px 0; margin: 0;\"\u003e\u003cstrong\u003e100.000 – 150.000 : Expérimenté mais toujours exploitable\u003c/strong\u003e\u003c/p\u003e\r\n        \u003cp style=\"padding: 10px 0;\"\u003eParfait comme boîtier de secours ou comme choix malin à petit budget.\u003c/p\u003e\r\n      \u003c/div\u003e\r\n\r\n      \u003cdiv\u003e\r\n        \u003cp style=\"padding: 10px 0; margin: 0;\"\u003e\u003cstrong\u003e\u0026gt; 150.000 : Pour l'acheteur averti\u003c/strong\u003e\u003c/p\u003e\r\n        \u003cp style=\"padding: 10px 0;\"\u003eAppareil bien utilisé, mais qui peut encore durer étonnamment longtemps.\u003c/p\u003e\r\n      \u003c/div\u003e\r\n    \u003c/div\u003e\r\n  `;\r\n\r\n  function closeDrawer(drawer, overlay) {\r\n    drawer.style.right = \"-100%\";\r\n    overlay.style.opacity = \"0\";\r\n    overlay.style.visibility = \"hidden\";\r\n    setTimeout(() =\u003e {\r\n      drawer.remove();\r\n      overlay.remove();\r\n    }, 300);\r\n  }\r\n\r\n  function createCustomDrawer(id, title, contentHTML) {\r\n    if (document.getElementById(id)) return;\r\n\r\n    const overlay = document.createElement(\"div\");\r\n    overlay.id = id;\r\n    overlay.style.cssText = `\r\n      position: fixed; top: 0; left: 0; width: 100%; height: 100%;\r\n      background: rgba(0, 0, 0, 0.5);\r\n      z-index: 9998;\r\n      opacity: 0;\r\n      visibility: hidden;\r\n      transition: opacity 0.3s ease;\r\n    `;\r\n\r\n    const drawer = document.createElement(\"div\");\r\n    drawer.className = \"drawer\";\r\n    drawer.style.cssText = `\r\n      position: fixed; top: 0; right: -100%; width: 480px; max-width: 90%; height: 100%;\r\n      background: #fff; box-shadow: -2px 0 5px rgba(0,0,0,0.2);\r\n      z-index: 9999; display: flex; flex-direction: column;\r\n      font-family: 'Barlow', sans-serif; transition: right 0.3s ease-in-out;\r\n    `;\r\n\r\n    drawer.innerHTML = `\r\n      \u003cdiv class=\"drawer-header\" style=\"display:flex;justify-content:space-between;align-items:center;padding:24px 24px 0 24px;\"\u003e\r\n        \u003ch2 style=\"font-size:24px;font-weight:bold;margin:0;\"\u003e${title}\u003c/h2\u003e\r\n        \u003cbutton class=\"drawer-close-button\" style=\"background:none;border:none;cursor:pointer;padding:0;\"\u003e\r\n          \u003csvg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\u003e\r\n            \u003cpath d=\"M6 18L18 6M18 18L6 6\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"/\u003e\r\n          \u003c/svg\u003e\r\n        \u003c/button\u003e\r\n      \u003c/div\u003e\r\n      \u003cdiv class=\"drawer-body\" style=\"flex-grow:1;overflow-y:auto;padding:16px 24px 24px 24px;\"\u003e\r\n        \u003cdiv class=\"drawer-content\"\u003e${contentHTML}\u003c/div\u003e\r\n      \u003c/div\u003e\r\n      \u003cdiv class=\"drawer-cta\" style=\"padding:20px;border-top:1px solid #eee;flex-shrink:0;\"\u003e\r\n        \u003ca href=\"/produits/occasion\" class=\"sf-button--outline sf-button\" style=\"\r\n          text-transform:none;display:block;width:100%;padding:14px;text-align:center;\r\n          border:1px solid black;color:black;text-decoration:none;border-radius:4px;\r\n          font-size:16px;font-weight:bold;\"\u003e\r\n          Tout savoir sur notre offre d'occasion\r\n        \u003c/a\u003e\r\n      \u003c/div\u003e\r\n    `;\r\n\r\n    document.body.appendChild(overlay);\r\n    document.body.appendChild(drawer);\r\n\r\n    requestAnimationFrame(() =\u003e {\r\n      drawer.style.right = \"0\";\r\n      overlay.style.opacity = \"1\";\r\n      overlay.style.visibility = \"visible\";\r\n    });\r\n\r\n    const close = () =\u003e closeDrawer(drawer, overlay);\r\n    overlay.addEventListener(\"click\", close);\r\n    drawer.querySelector(\".drawer-close-button\").addEventListener(\"click\", close);\r\n  }\r\n\r\n  document.addEventListener(\"click\", (event) =\u003e {\r\n    if (event.target.closest(\".drawer-trigger-condition\")) {\r\n      createCustomDrawer(\"drawer-condition\", \"État du produit\", contentCondition);\r\n    }\r\n    if (event.target.closest(\".drawer-trigger-clicks\")) {\r\n      createCustomDrawer(\"drawer-clicks\", \"Nombre de clics\", contentClicks);\r\n    }\r\n  });\r\n\r\n  function normalizeLabel(text) {\r\n    return String(text || \"\")\r\n      .trim()\r\n      .toLowerCase()\r\n      .normalize(\"NFD\")\r\n      .replace(/[\\u0300-\\u036f]/g, \"\");\r\n  }\r\n\r\n  function parseClicksSubtext(clicksRaw) {\r\n    const cleaned = String(clicksRaw || \"\")\r\n      .toLowerCase()\r\n      .replace(/\\./g, \"\")\r\n      .replace(/\\s+to\\s+/g, \"-\")\r\n      .replace(/\\s+à\\s+/g, \"-\")\r\n      .replace(/\\s+au\\s+/g, \"-\")\r\n      .replace(/[–—]/g, \"-\")\r\n      .replace(/[^\\d\\-\u003c\u003e]/g, \"\")\r\n      .trim();\r\n\r\n    const ranges = [\r\n      { match: /^\u003c\\s*10000$/, label: \"Comme neuf\" },\r\n      { match: /^10000\\s*-\\s*25000$/, label: \"Légèrement utilisé\" },\r\n      { match: /^25000\\s*-\\s*50000$/, label: \"Utilisation normale\" },\r\n      { match: /^50000\\s*-\\s*75000$/, label: \"Utilisé régulièrement\" },\r\n      { match: /^75000\\s*-\\s*100000$/, label: \"Utilisé intensivement, encore très fiable\" },\r\n      { match: /^100000\\s*-\\s*150000$/, label: \"Expérimenté mais toujours exploitable\" },\r\n      { match: /^\u003e\\s*150000$/, label: \"Pour l'acheteur averti\" },\r\n    ];\r\n\r\n    for (const range of ranges) {\r\n      if (range.match.test(cleaned)) return range.label;\r\n    }\r\n\r\n    return null;\r\n  }\r\n\r\n  function findSpecValue(labels) {\r\n    const labelList = Array.isArray(labels) ? labels : [labels];\r\n    const labelSet = new Set(labelList.map(normalizeLabel));\r\n    const cells = [...document.querySelectorAll(\"#specificationsSection td.sf-table__data\")];\r\n    const match = cells.find((cell) =\u003e labelSet.has(normalizeLabel(cell.textContent || \"\")));\r\n    return match?.nextElementSibling?.textContent?.trim() || null;\r\n  }\r\n\r\n  function ensureSharedStyles() {\r\n    if (document.getElementById(\"custom-second-hand-styles\")) return;\r\n\r\n    const style = document.createElement(\"style\");\r\n    style.id = \"custom-second-hand-styles\";\r\n    style.textContent = `\r\n      .custom-check-label .check-icon { width:25px; height:25px; object-fit:contain; margin:auto !important; }\r\n      .custom-check-label span { font-size:15px; font-weight:700; }\r\n      #buySection .icon-usp-container { pointer-events:none !important; cursor:default !important; }\r\n      #buySection .custom-specs-wrapper {\r\n        display:flex;\r\n        gap:24px;\r\n        margin:0 0 20px 0;\r\n        align-items:flex-start;\r\n        flex-wrap:wrap;\r\n      }\r\n      #buySection .custom-specs-wrapper \u003e div {\r\n        min-width:0;\r\n      }\r\n      #buySection .custom-specs-wrapper .custom-spec-value {\r\n        font-size:14px;\r\n        margin-top:4px;\r\n        line-height:1.4;\r\n        word-break:break-word;\r\n      }\r\n    `;\r\n    document.head.appendChild(style);\r\n  }\r\n\r\n  function injectOverlayLabel() {\r\n    const stage = document.querySelector(\"#imageGallerySection .sf-gallery__stage\");\r\n    if (!stage || stage.querySelector(\".custom-check-label\")) return;\r\n\r\n    ensureSharedStyles();\r\n    stage.style.position = \"relative\";\r\n\r\n    const label = document.createElement(\"div\");\r\n    label.className = \"custom-check-label\";\r\n    label.innerHTML = `\r\n      \u003cimg src=\"${iconURL}\" alt=\"\" class=\"check-icon\" /\u003e\r\n      \u003cspan\u003eContrôlé par nos experts de l'occasion\u003c/span\u003e\r\n    `;\r\n\r\n    Object.assign(label.style, {\r\n      position: \"absolute\",\r\n      bottom: \"15px\",\r\n      right: \"15px\",\r\n      background: \"transparent\",\r\n      color: \"#000\",\r\n      padding: \"4px 8px\",\r\n      display: \"flex\",\r\n      alignItems: \"center\",\r\n      gap: \"6px\",\r\n      zIndex: \"99\",\r\n      pointerEvents: \"none\",\r\n    });\r\n\r\n    stage.appendChild(label);\r\n  }\r\n\r\n  function updateStockSubtext() {\r\n    const wrapper = document.querySelector(\"#buySection .availability-wrapper\");\r\n    if (!wrapper) return;\r\n\r\n    const badge = wrapper.querySelector(\".sf-badge\");\r\n    const subText = wrapper.querySelector(\"p.body-text-small.status-subtext\");\r\n    if (!badge || !subText) return;\r\n\r\n    const isEnStock = /en\\s+stock/i.test((badge.textContent || \"\").trim());\r\n    const desired = \"Chaque produit d'occasion est unique – un seul exemplaire disponible\";\r\n\r\n    if (isEnStock \u0026\u0026 subText.textContent.trim() !== desired) {\r\n      subText.textContent = desired;\r\n    }\r\n  }\r\n\r\n  function replaceUSPs() {\r\n    const uspButtons = document.querySelectorAll(\"#buySection .icon-usp-container\");\r\n    const newUSPs = [\r\n      { strong: \"Contrôlé et nettoyé\", text: \" par nos experts\" },\r\n      { strong: \"12 mois de garantie\", text: \" sur tous les produits d'occasion\" },\r\n      { strong: \"14 jours de réflexion\", text: \"Pas comme prévu ? Toujours \", beforeStrong: true },\r\n      { strong: \"Large choix d'occasion\", text: \"\" },\r\n    ];\r\n\r\n    if (uspButtons.length \u003c newUSPs.length) return;\r\n\r\n    uspButtons.forEach((btn, index) =\u003e {\r\n      if (index \u003e= newUSPs.length) return;\r\n\r\n      const p = btn.querySelector(\"p\");\r\n      if (!p) return;\r\n\r\n      const usp = newUSPs[index];\r\n      const existingText = (p.textContent || \"\").trim();\r\n      if (existingText.includes(usp.strong)) return;\r\n\r\n      p.innerHTML = usp.beforeStrong\r\n        ? `${usp.text}\u003cstrong\u003e${usp.strong}\u003c/strong\u003e`\r\n        : `\u003cstrong\u003e${usp.strong}\u003c/strong\u003e${usp.text}`;\r\n    });\r\n  }\r\n\r\n  function injectSpecsBlocks() {\r\n    const buySection = document.querySelector(\"#buySection .buy-section-wrapper\");\r\n    const priceContainer = buySection?.querySelector(\".buy-section-price-container\");\r\n    if (!buySection || !priceContainer) return;\r\n\r\n    ensureSharedStyles();\r\n\r\n    const conditionValue = findSpecValue([\"Etat\", \"État\"]);\r\n    const clicksValue = findSpecValue([\"Nombre de clics\"]);\r\n\r\n    if (!conditionValue \u0026\u0026 !clicksValue) return;\r\n\r\n    let wrapper = buySection.querySelector(\".custom-specs-wrapper\");\r\n    if (!wrapper) {\r\n      wrapper = document.createElement(\"div\");\r\n      wrapper.className = \"custom-specs-wrapper\";\r\n    } else {\r\n      wrapper.innerHTML = \"\";\r\n    }\r\n\r\n    if (conditionValue) {\r\n      const conditionBlock = document.createElement(\"div\");\r\n      conditionBlock.className = \"custom-condition-block\";\r\n      conditionBlock.innerHTML = `\r\n        \u003cdiv class=\"drawer-trigger-condition\" style=\"display:flex;align-items:center;gap:6px;cursor:pointer;\"\u003e\r\n          \u003cspan style=\"font-weight:700;font-size:15px;\"\u003eÉtat\u003c/span\u003e\r\n          \u003cimg src=\"${infoIconURL}\" alt=\"Info état\" style=\"width:16px;height:16px;\" /\u003e\r\n        \u003c/div\u003e\r\n        \u003cdiv class=\"custom-spec-value\"\u003e${conditionValue}\u003c/div\u003e\r\n      `;\r\n      wrapper.appendChild(conditionBlock);\r\n    }\r\n\r\n    if (clicksValue \u0026\u0026 !/non applicable|inconnu/i.test(clicksValue)) {\r\n      const subtext = parseClicksSubtext(clicksValue);\r\n      const clicksBlock = document.createElement(\"div\");\r\n      clicksBlock.className = \"custom-clicks-block\";\r\n      clicksBlock.innerHTML = `\r\n        \u003cdiv class=\"drawer-trigger-clicks\" style=\"display:flex;align-items:center;gap:6px;cursor:pointer;\"\u003e\r\n          \u003cspan style=\"font-weight:700;font-size:15px;\"\u003eNombre de clics\u003c/span\u003e\r\n          \u003cimg src=\"${infoIconURL}\" alt=\"Info clics\" style=\"width:16px;height:16px;\" /\u003e\r\n        \u003c/div\u003e\r\n        \u003cdiv class=\"custom-spec-value\"\u003e${clicksValue}${subtext ? ` — ${subtext}` : \"\"}\u003c/div\u003e\r\n      `;\r\n      wrapper.appendChild(clicksBlock);\r\n    }\r\n\r\n    if (!wrapper.children.length) return;\r\n\r\n    if (priceContainer.nextElementSibling !== wrapper) {\r\n      priceContainer.insertAdjacentElement(\"afterend\", wrapper);\r\n    }\r\n  }\r\n\r\n  function injectPhotoInfoBlock() {\r\n    const galleryWrapper =\r\n      document.querySelector(\"#imageGallerySection .sf-gallery\") ||\r\n      document.querySelector(\"#imageGallerySection .image-gallery\");\r\n    if (!galleryWrapper || document.querySelector(\".photo-info-block\")) return;\r\n\r\n    const infoBlock = document.createElement(\"div\");\r\n    infoBlock.className = \"photo-info-block\";\r\n    infoBlock.style.cssText = `\r\n      display:flex;align-items:center;gap:10px;border:1px solid #ccc;\r\n      padding:12px;margin-top:20px;font-size:15px;font-family:'Barlow', sans-serif;\r\n      background:white;z-index:1;position:relative;\r\n    `;\r\n\r\n    infoBlock.innerHTML = `\r\n      \u003cimg src=\"https://www.kamera-express.nl/media/68c2049a-8516-47dc-9f30-a04a120a6969/camera-icon-png.png\" alt=\"Icône appareil photo\" style=\"width:30px;height:auto;object-fit:contain;\" /\u003e\r\n      \u003cspan\u003eNous photographions chaque produit d'occasion séparément. Vous achetez donc exactement le produit visible sur les photos.\u003c/span\u003e\r\n    `;\r\n\r\n    galleryWrapper.insertAdjacentElement(\"afterend\", infoBlock);\r\n  }\r\n\r\n  const OWN_SELECTORS = [\r\n    \".custom-check-label\",\r\n    \".custom-specs-wrapper\",\r\n    \".photo-info-block\",\r\n    \".drawer\",\r\n    \"#drawer-condition\",\r\n    \"#drawer-clicks\",\r\n  ];\r\n\r\n  function isOwnNode(node) {\r\n    if (!node) return false;\r\n    if (node.nodeType === 3) node = node.parentElement;\r\n    if (!node || !node.closest) return false;\r\n    return OWN_SELECTORS.some((selector) =\u003e node.closest(selector));\r\n  }\r\n\r\n  function shouldIgnoreMutations(mutations) {\r\n    let anyRelevant = false;\r\n    for (const mutation of mutations) {\r\n      if (!isOwnNode(mutation.target)) anyRelevant = true;\r\n      for (const node of mutation.addedNodes || []) {\r\n        if (!isOwnNode(node)) anyRelevant = true;\r\n      }\r\n      for (const node of mutation.removedNodes || []) {\r\n        if (!isOwnNode(node)) anyRelevant = true;\r\n      }\r\n    }\r\n    return !anyRelevant;\r\n  }\r\n\r\n  let observer = null;\r\n  let scheduled = false;\r\n  let lastRunAt = 0;\r\n\r\n  function runAll(source) {\r\n    log(\"runAll:\", source);\r\n    try {\r\n      injectOverlayLabel();\r\n    } catch (e) {\r\n      err(\"injectOverlayLabel\", e);\r\n    }\r\n    try {\r\n      updateStockSubtext();\r\n    } catch (e) {\r\n      err(\"updateStockSubtext\", e);\r\n    }\r\n    try {\r\n      replaceUSPs();\r\n    } catch (e) {\r\n      err(\"replaceUSPs\", e);\r\n    }\r\n    try {\r\n      injectSpecsBlocks();\r\n    } catch (e) {\r\n      err(\"injectSpecsBlocks\", e);\r\n    }\r\n    try {\r\n      injectPhotoInfoBlock();\r\n    } catch (e) {\r\n      err(\"injectPhotoInfoBlock\", e);\r\n    }\r\n  }\r\n\r\n  function debounceRun(source) {\r\n    if (scheduled) return;\r\n\r\n    const now = Date.now();\r\n    const minGap = 150;\r\n    const wait = Math.max(0, minGap - (now - lastRunAt));\r\n\r\n    scheduled = true;\r\n    setTimeout(() =\u003e {\r\n      scheduled = false;\r\n      lastRunAt = Date.now();\r\n      runAll(source);\r\n    }, wait);\r\n  }\r\n\r\n  observer = new MutationObserver((mutations) =\u003e {\r\n    if (shouldIgnoreMutations(mutations)) return;\r\n    debounceRun(\"MutationObserver\");\r\n  });\r\n\r\n  observer.observe(document.body, { childList: true, subtree: true });\r\n  runAll(\"initial\");\r\n})();\r\n","trigger":{"include_pages":[{"type":"regex","regex":"kamera-express\\.fr.*occasion"}],"exclude_pages":null},"_id":"69de43340c763eda35e8cdfc"},{"uses_overlay":false,"type":"js","parametrized_definition":"(function () {\r\n  \"use strict\";\r\n\r\n  const titleEl =\r\n    document.querySelector(\"h1.pdpintro-title\") ||\r\n    document.querySelector(\"h1.pdpintro__title\") ||\r\n    document.querySelector(\"h1\");\r\n\r\n  const titleText = (titleEl?.textContent || \"\").toLowerCase();\r\n  const pathText = (window.location.pathname || \"\").toLowerCase();\r\n  const breadcrumbText = (document.querySelector(\"#breadcrumbs\")?.textContent || \"\").toLowerCase();\r\n\r\n  const shouldRun =\r\n    titleText.includes(\"occasion\") ||\r\n    pathText.includes(\"occasion\") ||\r\n    pathText.includes(\"gebraucht\") ||\r\n    breadcrumbText.includes(\"gebraucht\");\r\n\r\n  if (!shouldRun) return;\r\n\r\n  const DEBUG = false;\r\n  const TAG = \"[2H-PDP-DE]\";\r\n\r\n  const iconURL =\r\n    \"https://www.kamera-express.nl/media/2df505a2-2d5f-42c5-af7a-165584f27481/second-hand-check-png.png\";\r\n  const infoIconURL =\r\n    \"https://kamera-express.nl/media/93b40321-ffd4-41b6-9c21-f815d8f6c8d1/info-icon-png.png\";\r\n\r\n  function log(...args) {\r\n    if (DEBUG) console.log(TAG, ...args);\r\n  }\r\n\r\n  function err(...args) {\r\n    console.error(TAG, ...args);\r\n  }\r\n\r\n  const contentCondition = `\r\n    \u003cdiv class=\"drawerInfo\"\u003e\r\n      \u003cp style=\"padding: 10px 0;\"\u003e\r\n        Unsere Experten prüfen jedes angekaufte Produkt, bevor es in den Verkauf geht. Auf Basis dieser Kontrolle bestimmen sie den allgemeinen Zustand des Produkts. So weißt du genau, was du erwarten kannst.\r\n      \u003c/p\u003e\r\n\r\n      \u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 16px;\"\u003e\r\n        \u003cdiv style=\"flex: 1 1 calc(50% - 8px); border: 1px solid #ccc; border-radius: 4px; text-align: center;\"\u003e\r\n          \u003cimg src=\"https://www.kamera-express.nl/media/3ee9b0de-bff2-4d59-beda-e63b4d002d9c/tweedehands-conditie-9-webp.webp\" alt=\"Wie neu\" style=\"width: 100%; height: auto; object-fit: cover;\" /\u003e\r\n          \u003cstrong style=\"display: block; font-size: 15px; margin-bottom: 10px; padding: 0 3px;\"\u003eWie neu\u003c/strong\u003e\r\n        \u003c/div\u003e\r\n\r\n        \u003cdiv style=\"flex: 1 1 calc(50% - 8px); border: 1px solid #ccc; border-radius: 4px; text-align: center;\"\u003e\r\n          \u003cimg src=\"https://www.kamera-express.nl/media/f96dbc3b-e687-4ebb-b65a-c79b54a6d1b7/tweedehands-conditie-8-webp.webp\" alt=\"Sehr leichte Gebrauchsspuren\" style=\"width: 100%; height: auto; object-fit: cover;\" /\u003e\r\n          \u003cstrong style=\"display: block; font-size: 15px; margin-bottom: 10px; padding: 0 3px;\"\u003eSehr leichte Gebrauchsspuren\u003c/strong\u003e\r\n        \u003c/div\u003e\r\n\r\n        \u003cdiv style=\"flex: 1 1 calc(50% - 8px); border: 1px solid #ccc; border-radius: 4px; text-align: center;\"\u003e\r\n          \u003cimg src=\"https://www.kamera-express.nl/media/39bad34a-4e2e-4174-ac7e-e711ef79ea82/tweedehands-conditie-7-webp.webp\" alt=\"Leichte Gebrauchsspuren\" style=\"width: 100%; height: auto; object-fit: cover;\" /\u003e\r\n          \u003cstrong style=\"display: block; font-size: 15px; margin-bottom: 10px; padding: 0 3px;\"\u003eLeichte Gebrauchsspuren\u003c/strong\u003e\r\n        \u003c/div\u003e\r\n\r\n        \u003cdiv style=\"flex: 1 1 calc(50% - 8px); border: 1px solid #ccc; border-radius: 4px; text-align: center;\"\u003e\r\n          \u003cimg src=\"https://www.kamera-express.nl/media/45c526c7-3d9e-4ea8-b2a4-7d5c3dda5cad/tweedehands-conditie-6-webp.webp\" alt=\"Normale Gebrauchsspuren\" style=\"width: 100%; height: auto; object-fit: cover;\" /\u003e\r\n          \u003cstrong style=\"display: block; font-size: 15px; margin-bottom: 10px; padding: 0 3px;\"\u003eNormale Gebrauchsspuren\u003c/strong\u003e\r\n        \u003c/div\u003e\r\n      \u003c/div\u003e\r\n    \u003c/div\u003e\r\n  `;\r\n\r\n  const contentClicks = `\r\n    \u003cdiv class=\"drawerInfo\"\u003e\r\n      \u003cp style=\"padding: 10px 0;\"\u003e\r\n        Jedes Mal, wenn du mit einer Kamera ein Foto machst, wird der Verschluss ausgelöst. Das nennt man einen Auslösevorgang. Der Verschluss ist ein mechanisches Bauteil und nutzt sich mit der Zeit ab, ähnlich wie ein Auto mit Kilometern auf dem Tacho. Deshalb gibt die Anzahl der Auslösungen einen guten Hinweis darauf, wie intensiv eine Kamera genutzt wurde. Jede Kamera hat eine erwartete Lebensdauer des Verschlusses, meist zwischen 100.000 und 300.000 Auslösungen, abhängig von Typ und Marke.\r\n      \u003c/p\u003e\r\n      \u003cp style=\"padding: 10px 0;\"\u003e\u003cstrong\u003eWas kannst du je nach Anzahl der Auslösungen erwarten?\u003c/strong\u003e\u003c/p\u003e\r\n\r\n      \u003cdiv\u003e\r\n        \u003cp style=\"padding: 10px 0; margin: 0;\"\u003e\u003cstrong\u003e\u0026lt; 10.000: Wie neu\u003c/strong\u003e\u003c/p\u003e\r\n        \u003cp style=\"padding: 10px 0;\"\u003eSehr wenig genutzt, in der Regel in ausgezeichnetem Zustand.\u003c/p\u003e\r\n      \u003c/div\u003e\r\n\r\n      \u003cdiv\u003e\r\n        \u003cp style=\"padding: 10px 0; margin: 0;\"\u003e\u003cstrong\u003e10.000 – 25.000: Leicht genutzt\u003c/strong\u003e\u003c/p\u003e\r\n        \u003cp style=\"padding: 10px 0;\"\u003eEinige Male genutzt, technisch aber in sehr gutem Zustand.\u003c/p\u003e\r\n      \u003c/div\u003e\r\n\r\n      \u003cdiv\u003e\r\n        \u003cp style=\"padding: 10px 0; margin: 0;\"\u003e\u003cstrong\u003e25.000 – 50.000: Normal genutzt\u003c/strong\u003e\u003c/p\u003e\r\n        \u003cp style=\"padding: 10px 0;\"\u003eTypische Nutzung für ambitionierte Fotografen oder Semiprofis.\u003c/p\u003e\r\n      \u003c/div\u003e\r\n\r\n      \u003cdiv\u003e\r\n        \u003cp style=\"padding: 10px 0; margin: 0;\"\u003e\u003cstrong\u003e50.000 – 75.000: Regelmäßig genutzt\u003c/strong\u003e\u003c/p\u003e\r\n        \u003cp style=\"padding: 10px 0;\"\u003eAktiv genutzt, zum Beispiel von einem Semiprofi.\u003c/p\u003e\r\n      \u003c/div\u003e\r\n\r\n      \u003cdiv\u003e\r\n        \u003cp style=\"padding: 10px 0; margin: 0;\"\u003e\u003cstrong\u003e75.000 – 100.000: Intensiv genutzt, weiterhin gut einsetzbar\u003c/strong\u003e\u003c/p\u003e\r\n        \u003cp style=\"padding: 10px 0;\"\u003eStark genutzt, aber dafür sind viele Profi-Modelle ausgelegt.\u003c/p\u003e\r\n      \u003c/div\u003e\r\n\r\n      \u003cdiv\u003e\r\n        \u003cp style=\"padding: 10px 0; margin: 0;\"\u003e\u003cstrong\u003e100.000 – 150.000: Erfahren, aber noch zuverlässig\u003c/strong\u003e\u003c/p\u003e\r\n        \u003cp style=\"padding: 10px 0;\"\u003eIdeal als Backup-Kamera oder als clevere Wahl mit kleinerem Budget.\u003c/p\u003e\r\n      \u003c/div\u003e\r\n\r\n      \u003cdiv\u003e\r\n        \u003cp style=\"padding: 10px 0; margin: 0;\"\u003e\u003cstrong\u003e\u0026gt; 150.000: Für den cleveren Käufer\u003c/strong\u003e\u003c/p\u003e\r\n        \u003cp style=\"padding: 10px 0;\"\u003eDeutlich genutzt, kann aber trotzdem noch überraschend lange halten.\u003c/p\u003e\r\n      \u003c/div\u003e\r\n    \u003c/div\u003e\r\n  `;\r\n\r\n  function closeDrawer(drawer, overlay) {\r\n    drawer.style.right = \"-100%\";\r\n    overlay.style.opacity = \"0\";\r\n    overlay.style.visibility = \"hidden\";\r\n    setTimeout(() =\u003e {\r\n      drawer.remove();\r\n      overlay.remove();\r\n    }, 300);\r\n  }\r\n\r\n  function createCustomDrawer(id, title, contentHTML) {\r\n    if (document.getElementById(id)) return;\r\n\r\n    const overlay = document.createElement(\"div\");\r\n    overlay.id = id;\r\n    overlay.style.cssText = `\r\n      position: fixed; top: 0; left: 0; width: 100%; height: 100%;\r\n      background: rgba(0, 0, 0, 0.5);\r\n      z-index: 9998;\r\n      opacity: 0;\r\n      visibility: hidden;\r\n      transition: opacity 0.3s ease;\r\n    `;\r\n\r\n    const drawer = document.createElement(\"div\");\r\n    drawer.className = \"drawer\";\r\n    drawer.style.cssText = `\r\n      position: fixed; top: 0; right: -100%; width: 480px; max-width: 90%; height: 100%;\r\n      background: #fff; box-shadow: -2px 0 5px rgba(0,0,0,0.2);\r\n      z-index: 9999; display: flex; flex-direction: column;\r\n      font-family: 'Barlow', sans-serif; transition: right 0.3s ease-in-out;\r\n    `;\r\n\r\n    drawer.innerHTML = `\r\n      \u003cdiv class=\"drawer-header\" style=\"display:flex;justify-content:space-between;align-items:center;padding:24px 24px 0 24px;\"\u003e\r\n        \u003ch2 style=\"font-size:24px;font-weight:bold;margin:0;\"\u003e${title}\u003c/h2\u003e\r\n        \u003cbutton class=\"drawer-close-button\" style=\"background:none;border:none;cursor:pointer;padding:0;\"\u003e\r\n          \u003csvg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\u003e\r\n            \u003cpath d=\"M6 18L18 6M18 18L6 6\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"/\u003e\r\n          \u003c/svg\u003e\r\n        \u003c/button\u003e\r\n      \u003c/div\u003e\r\n      \u003cdiv class=\"drawer-body\" style=\"flex-grow:1;overflow-y:auto;padding:16px 24px 24px 24px;\"\u003e\r\n        \u003cdiv class=\"drawer-content\"\u003e${contentHTML}\u003c/div\u003e\r\n      \u003c/div\u003e\r\n      \u003cdiv class=\"drawer-cta\" style=\"padding:20px;border-top:1px solid #eee;flex-shrink:0;\"\u003e\r\n        \u003ca href=\"/gebraucht\" class=\"sf-button--outline sf-button\" style=\"\r\n          text-transform:none;display:block;width:100%;padding:14px;text-align:center;\r\n          border:1px solid black;color:black;text-decoration:none;border-radius:4px;\r\n          font-size:16px;font-weight:bold;\"\u003e\r\n          Alles über unser Gebrauchtangebot\r\n        \u003c/a\u003e\r\n      \u003c/div\u003e\r\n    `;\r\n\r\n    document.body.appendChild(overlay);\r\n    document.body.appendChild(drawer);\r\n\r\n    requestAnimationFrame(() =\u003e {\r\n      drawer.style.right = \"0\";\r\n      overlay.style.opacity = \"1\";\r\n      overlay.style.visibility = \"visible\";\r\n    });\r\n\r\n    const close = () =\u003e closeDrawer(drawer, overlay);\r\n    overlay.addEventListener(\"click\", close);\r\n    drawer.querySelector(\".drawer-close-button\").addEventListener(\"click\", close);\r\n  }\r\n\r\n  document.addEventListener(\"click\", (event) =\u003e {\r\n    if (event.target.closest(\".drawer-trigger-condition\")) {\r\n      createCustomDrawer(\"drawer-condition\", \"Zustand des Produkts\", contentCondition);\r\n    }\r\n    if (event.target.closest(\".drawer-trigger-clicks\")) {\r\n      createCustomDrawer(\"drawer-clicks\", \"Anzahl der Auslösungen\", contentClicks);\r\n    }\r\n  });\r\n\r\n  function normalizeLabel(text) {\r\n    return String(text || \"\")\r\n      .trim()\r\n      .toLowerCase()\r\n      .normalize(\"NFD\")\r\n      .replace(/[\\u0300-\\u036f]/g, \"\");\r\n  }\r\n\r\n  function parseClicksSubtext(clicksRaw) {\r\n    const cleaned = String(clicksRaw || \"\")\r\n      .toLowerCase()\r\n      .replace(/\\./g, \"\")\r\n      .replace(/\\s+to\\s+/g, \"-\")\r\n      .replace(/\\s+bis\\s+/g, \"-\")\r\n      .replace(/[–—]/g, \"-\")\r\n      .replace(/[^\\d\\-\u003c\u003e]/g, \"\")\r\n      .trim();\r\n\r\n    const ranges = [\r\n      { match: /^\u003c\\s*10000$/, label: \"Wie neu\" },\r\n      { match: /^10000\\s*-\\s*25000$/, label: \"Leicht genutzt\" },\r\n      { match: /^25000\\s*-\\s*50000$/, label: \"Normal genutzt\" },\r\n      { match: /^50000\\s*-\\s*75000$/, label: \"Regelmäßig genutzt\" },\r\n      { match: /^75000\\s*-\\s*100000$/, label: \"Intensiv genutzt, weiterhin gut einsetzbar\" },\r\n      { match: /^100000\\s*-\\s*150000$/, label: \"Erfahren, aber noch zuverlässig\" },\r\n      { match: /^\u003e\\s*150000$/, label: \"Für den cleveren Käufer\" },\r\n    ];\r\n\r\n    for (const range of ranges) {\r\n      if (range.match.test(cleaned)) return range.label;\r\n    }\r\n\r\n    return null;\r\n  }\r\n\r\n  function findSpecValue(labels) {\r\n    const labelList = Array.isArray(labels) ? labels : [labels];\r\n    const labelSet = new Set(labelList.map(normalizeLabel));\r\n    const cells = [...document.querySelectorAll(\"#specificationsSection td.sf-table__data\")];\r\n    const match = cells.find((cell) =\u003e labelSet.has(normalizeLabel(cell.textContent || \"\")));\r\n    return match?.nextElementSibling?.textContent?.trim() || null;\r\n  }\r\n\r\n  function ensureSharedStyles() {\r\n    if (document.getElementById(\"custom-second-hand-styles-de\")) return;\r\n\r\n    const style = document.createElement(\"style\");\r\n    style.id = \"custom-second-hand-styles-de\";\r\n    style.textContent = `\r\n      .custom-check-label .check-icon { width:25px; height:25px; object-fit:contain; margin:auto !important; }\r\n      .custom-check-label span { font-size:15px; font-weight:700; }\r\n      #buySection .icon-usp-container { pointer-events:none !important; cursor:default !important; }\r\n      #buySection .custom-specs-wrapper {\r\n        display:flex;\r\n        gap:24px;\r\n        margin:0 0 20px 0;\r\n        align-items:flex-start;\r\n        flex-wrap:wrap;\r\n      }\r\n      #buySection .custom-specs-wrapper \u003e div {\r\n        min-width:0;\r\n      }\r\n      #buySection .custom-specs-wrapper .custom-spec-value {\r\n        font-size:14px;\r\n        margin-top:4px;\r\n        line-height:1.4;\r\n        word-break:break-word;\r\n      }\r\n    `;\r\n    document.head.appendChild(style);\r\n  }\r\n\r\n  function injectOverlayLabel() {\r\n    const stage = document.querySelector(\"#imageGallerySection .sf-gallery__stage\");\r\n    if (!stage || stage.querySelector(\".custom-check-label\")) return;\r\n\r\n    ensureSharedStyles();\r\n    stage.style.position = \"relative\";\r\n\r\n    const label = document.createElement(\"div\");\r\n    label.className = \"custom-check-label\";\r\n    label.innerHTML = `\r\n      \u003cimg src=\"${iconURL}\" alt=\"\" class=\"check-icon\" /\u003e\r\n      \u003cspan\u003eGeprüft von unseren Gebraucht-Experten\u003c/span\u003e\r\n    `;\r\n\r\n    Object.assign(label.style, {\r\n      position: \"absolute\",\r\n      bottom: \"15px\",\r\n      right: \"15px\",\r\n      background: \"transparent\",\r\n      color: \"#000\",\r\n      padding: \"4px 8px\",\r\n      display: \"flex\",\r\n      alignItems: \"center\",\r\n      gap: \"6px\",\r\n      zIndex: \"99\",\r\n      pointerEvents: \"none\",\r\n    });\r\n\r\n    stage.appendChild(label);\r\n  }\r\n\r\n  function updateStockSubtext() {\r\n    const wrapper = document.querySelector(\"#buySection .availability-wrapper\");\r\n    if (!wrapper) return;\r\n\r\n    const badge = wrapper.querySelector(\".sf-badge\");\r\n    const subText = wrapper.querySelector(\"p.body-text-small.status-subtext\");\r\n    if (!badge || !subText) return;\r\n\r\n    const isInStock = /auf\\s+lager/i.test((badge.textContent || \"\").trim());\r\n    const desired = \"Jedes Gebrauchtprodukt ist einzigartig – nur 1 Exemplar verfügbar\";\r\n\r\n    if (isInStock \u0026\u0026 subText.textContent.trim() !== desired) {\r\n      subText.textContent = desired;\r\n    }\r\n  }\r\n\r\n  function replaceUSPs() {\r\n    const uspButtons = document.querySelectorAll(\"#buySection .icon-usp-container\");\r\n    const newUSPs = [\r\n      { strong: \"Geprüft und gereinigt\", text: \" von unseren Experten\" },\r\n      { strong: \"12 Monate Garantie\", text: \" auf alle Gebrauchtprodukte\" },\r\n      { strong: \"14 Tage Bedenkzeit\", text: \"Nicht wie erwartet? Immer \", beforeStrong: true },\r\n      { strong: \"Großes Gebrauchtangebot\", text: \"\" },\r\n    ];\r\n\r\n    if (uspButtons.length \u003c newUSPs.length) return;\r\n\r\n    uspButtons.forEach((btn, index) =\u003e {\r\n      if (index \u003e= newUSPs.length) return;\r\n\r\n      const p = btn.querySelector(\"p\");\r\n      if (!p) return;\r\n\r\n      const usp = newUSPs[index];\r\n      const existingText = (p.textContent || \"\").trim();\r\n      if (existingText.includes(usp.strong)) return;\r\n\r\n      p.innerHTML = usp.beforeStrong\r\n        ? `${usp.text}\u003cstrong\u003e${usp.strong}\u003c/strong\u003e`\r\n        : `\u003cstrong\u003e${usp.strong}\u003c/strong\u003e${usp.text}`;\r\n    });\r\n  }\r\n\r\n  function injectSpecsBlocks() {\r\n    const buySection = document.querySelector(\"#buySection .buy-section-wrapper\");\r\n    const priceContainer = buySection?.querySelector(\".buy-section-price-container\");\r\n    if (!buySection || !priceContainer) return;\r\n\r\n    ensureSharedStyles();\r\n\r\n    const conditionValue = findSpecValue([\"Zustand\"]);\r\n    const clicksValue = findSpecValue([\"Anzahl der Auslösungen\"]);\r\n\r\n    if (!conditionValue \u0026\u0026 !clicksValue) return;\r\n\r\n    let wrapper = buySection.querySelector(\".custom-specs-wrapper\");\r\n    if (!wrapper) {\r\n      wrapper = document.createElement(\"div\");\r\n      wrapper.className = \"custom-specs-wrapper\";\r\n    } else {\r\n      wrapper.innerHTML = \"\";\r\n    }\r\n\r\n    if (conditionValue) {\r\n      const conditionBlock = document.createElement(\"div\");\r\n      conditionBlock.className = \"custom-condition-block\";\r\n      conditionBlock.innerHTML = `\r\n        \u003cdiv class=\"drawer-trigger-condition\" style=\"display:flex;align-items:center;gap:6px;cursor:pointer;\"\u003e\r\n          \u003cspan style=\"font-weight:700;font-size:15px;\"\u003eZustand\u003c/span\u003e\r\n          \u003cimg src=\"${infoIconURL}\" alt=\"Info Zustand\" style=\"width:16px;height:16px;\" /\u003e\r\n        \u003c/div\u003e\r\n        \u003cdiv class=\"custom-spec-value\"\u003e${conditionValue}\u003c/div\u003e\r\n      `;\r\n      wrapper.appendChild(conditionBlock);\r\n    }\r\n\r\n    if (clicksValue \u0026\u0026 !/nicht anwendbar|unbekannt/i.test(clicksValue)) {\r\n      const subtext = parseClicksSubtext(clicksValue);\r\n      const clicksBlock = document.createElement(\"div\");\r\n      clicksBlock.className = \"custom-clicks-block\";\r\n      clicksBlock.innerHTML = `\r\n        \u003cdiv class=\"drawer-trigger-clicks\" style=\"display:flex;align-items:center;gap:6px;cursor:pointer;\"\u003e\r\n          \u003cspan style=\"font-weight:700;font-size:15px;\"\u003eAnzahl der Auslösungen\u003c/span\u003e\r\n          \u003cimg src=\"${infoIconURL}\" alt=\"Info Auslösungen\" style=\"width:16px;height:16px;\" /\u003e\r\n        \u003c/div\u003e\r\n        \u003cdiv class=\"custom-spec-value\"\u003e${clicksValue}${subtext ? ` — ${subtext}` : \"\"}\u003c/div\u003e\r\n      `;\r\n      wrapper.appendChild(clicksBlock);\r\n    }\r\n\r\n    if (!wrapper.children.length) return;\r\n\r\n    if (priceContainer.nextElementSibling !== wrapper) {\r\n      priceContainer.insertAdjacentElement(\"afterend\", wrapper);\r\n    }\r\n  }\r\n\r\n  function injectPhotoInfoBlock() {\r\n    const galleryWrapper =\r\n      document.querySelector(\"#imageGallerySection .sf-gallery\") ||\r\n      document.querySelector(\"#imageGallerySection .image-gallery\");\r\n    if (!galleryWrapper || document.querySelector(\".photo-info-block\")) return;\r\n\r\n    const infoBlock = document.createElement(\"div\");\r\n    infoBlock.className = \"photo-info-block\";\r\n    infoBlock.style.cssText = `\r\n      display:flex;align-items:center;gap:10px;border:1px solid #ccc;\r\n      padding:12px;margin-top:20px;font-size:15px;font-family:'Barlow', sans-serif;\r\n      background:white;z-index:1;position:relative;\r\n    `;\r\n\r\n    infoBlock.innerHTML = `\r\n      \u003cimg src=\"https://www.kamera-express.nl/media/68c2049a-8516-47dc-9f30-a04a120a6969/camera-icon-png.png\" alt=\"Kamera Icon\" style=\"width:30px;height:auto;object-fit:contain;\" /\u003e\r\n      \u003cspan\u003eWir fotografieren jedes Gebrauchtprodukt einzeln. Du kaufst also genau das Produkt, das du auf den Fotos siehst.\u003c/span\u003e\r\n    `;\r\n\r\n    galleryWrapper.insertAdjacentElement(\"afterend\", infoBlock);\r\n  }\r\n\r\n  const OWN_SELECTORS = [\r\n    \".custom-check-label\",\r\n    \".custom-specs-wrapper\",\r\n    \".photo-info-block\",\r\n    \".drawer\",\r\n    \"#drawer-condition\",\r\n    \"#drawer-clicks\",\r\n  ];\r\n\r\n  function isOwnNode(node) {\r\n    if (!node) return false;\r\n    if (node.nodeType === 3) node = node.parentElement;\r\n    if (!node || !node.closest) return false;\r\n    return OWN_SELECTORS.some((selector) =\u003e node.closest(selector));\r\n  }\r\n\r\n  function shouldIgnoreMutations(mutations) {\r\n    let anyRelevant = false;\r\n    for (const mutation of mutations) {\r\n      if (!isOwnNode(mutation.target)) anyRelevant = true;\r\n      for (const node of mutation.addedNodes || []) {\r\n        if (!isOwnNode(node)) anyRelevant = true;\r\n      }\r\n      for (const node of mutation.removedNodes || []) {\r\n        if (!isOwnNode(node)) anyRelevant = true;\r\n      }\r\n    }\r\n    return !anyRelevant;\r\n  }\r\n\r\n  let observer = null;\r\n  let scheduled = false;\r\n  let lastRunAt = 0;\r\n\r\n  function runAll(source) {\r\n    log(\"runAll:\", source);\r\n    try {\r\n      injectOverlayLabel();\r\n    } catch (e) {\r\n      err(\"injectOverlayLabel\", e);\r\n    }\r\n    try {\r\n      updateStockSubtext();\r\n    } catch (e) {\r\n      err(\"updateStockSubtext\", e);\r\n    }\r\n    try {\r\n      replaceUSPs();\r\n    } catch (e) {\r\n      err(\"replaceUSPs\", e);\r\n    }\r\n    try {\r\n      injectSpecsBlocks();\r\n    } catch (e) {\r\n      err(\"injectSpecsBlocks\", e);\r\n    }\r\n    try {\r\n      injectPhotoInfoBlock();\r\n    } catch (e) {\r\n      err(\"injectPhotoInfoBlock\", e);\r\n    }\r\n  }\r\n\r\n  function debounceRun(source) {\r\n    if (scheduled) return;\r\n\r\n    const now = Date.now();\r\n    const minGap = 150;\r\n    const wait = Math.max(0, minGap - (now - lastRunAt));\r\n\r\n    scheduled = true;\r\n    setTimeout(() =\u003e {\r\n      scheduled = false;\r\n      lastRunAt = Date.now();\r\n      runAll(source);\r\n    }, wait);\r\n  }\r\n\r\n  observer = new MutationObserver((mutations) =\u003e {\r\n    if (shouldIgnoreMutations(mutations)) return;\r\n    debounceRun(\"MutationObserver\");\r\n  });\r\n\r\n  observer.observe(document.body, { childList: true, subtree: true });\r\n  runAll(\"initial\");\r\n})();\r\n","trigger":{"include_pages":[{"type":"regex","regex":"kamera-express\\.de.*gebrauchtware"},{"type":"regex","regex":"kamera-express\\.de.*occasion"}],"exclude_pages":null},"_id":"69de44dc44739852c8f9dc4a"},{"uses_overlay":false,"type":"js","parametrized_definition":"(function () {\r\n  \"use strict\";\r\n\r\n  const titleEl =\r\n    document.querySelector(\"h1.pdpintro-title\") ||\r\n    document.querySelector(\"h1.pdpintro__title\") ||\r\n    document.querySelector(\"h1\");\r\n\r\n  const titleText = (titleEl?.textContent || \"\").toLowerCase();\r\n  const pathText = (window.location.pathname || \"\").toLowerCase();\r\n  const breadcrumbText = (document.querySelector(\"#breadcrumbs\")?.textContent || \"\").toLowerCase();\r\n\r\n  const shouldRun =\r\n    titleText.includes(\"occasion\") ||\r\n    pathText.includes(\"occasion\") ||\r\n    pathText.includes(\"gebraucht\") ||\r\n    breadcrumbText.includes(\"gebraucht\");\r\n\r\n  if (!shouldRun) return;\r\n\r\n  const DEBUG = false;\r\n  const TAG = \"[2H-PDP-AT]\";\r\n\r\n  const iconURL =\r\n    \"https://www.kamera-express.nl/media/2df505a2-2d5f-42c5-af7a-165584f27481/second-hand-check-png.png\";\r\n  const infoIconURL =\r\n    \"https://kamera-express.nl/media/93b40321-ffd4-41b6-9c21-f815d8f6c8d1/info-icon-png.png\";\r\n\r\n  function log(...args) {\r\n    if (DEBUG) console.log(TAG, ...args);\r\n  }\r\n\r\n  function err(...args) {\r\n    console.error(TAG, ...args);\r\n  }\r\n\r\n  const contentCondition = `\r\n    \u003cdiv class=\"drawerInfo\"\u003e\r\n      \u003cp style=\"padding: 10px 0;\"\u003e\r\n        Unsere Experten prüfen jedes angekaufte Produkt, bevor es in den Verkauf geht. Auf Basis dieser Kontrolle bestimmen sie den allgemeinen Zustand des Produkts. So weißt du genau, was du erwarten kannst.\r\n      \u003c/p\u003e\r\n\r\n      \u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 16px;\"\u003e\r\n        \u003cdiv style=\"flex: 1 1 calc(50% - 8px); border: 1px solid #ccc; border-radius: 4px; text-align: center;\"\u003e\r\n          \u003cimg src=\"https://www.kamera-express.nl/media/3ee9b0de-bff2-4d59-beda-e63b4d002d9c/tweedehands-conditie-9-webp.webp\" alt=\"Wie neu\" style=\"width: 100%; height: auto; object-fit: cover;\" /\u003e\r\n          \u003cstrong style=\"display: block; font-size: 15px; margin-bottom: 10px; padding: 0 3px;\"\u003eWie neu\u003c/strong\u003e\r\n        \u003c/div\u003e\r\n\r\n        \u003cdiv style=\"flex: 1 1 calc(50% - 8px); border: 1px solid #ccc; border-radius: 4px; text-align: center;\"\u003e\r\n          \u003cimg src=\"https://www.kamera-express.nl/media/f96dbc3b-e687-4ebb-b65a-c79b54a6d1b7/tweedehands-conditie-8-webp.webp\" alt=\"Sehr leichte Gebrauchsspuren\" style=\"width: 100%; height: auto; object-fit: cover;\" /\u003e\r\n          \u003cstrong style=\"display: block; font-size: 15px; margin-bottom: 10px; padding: 0 3px;\"\u003eSehr leichte Gebrauchsspuren\u003c/strong\u003e\r\n        \u003c/div\u003e\r\n\r\n        \u003cdiv style=\"flex: 1 1 calc(50% - 8px); border: 1px solid #ccc; border-radius: 4px; text-align: center;\"\u003e\r\n          \u003cimg src=\"https://www.kamera-express.nl/media/39bad34a-4e2e-4174-ac7e-e711ef79ea82/tweedehands-conditie-7-webp.webp\" alt=\"Leichte Gebrauchsspuren\" style=\"width: 100%; height: auto; object-fit: cover;\" /\u003e\r\n          \u003cstrong style=\"display: block; font-size: 15px; margin-bottom: 10px; padding: 0 3px;\"\u003eLeichte Gebrauchsspuren\u003c/strong\u003e\r\n        \u003c/div\u003e\r\n\r\n        \u003cdiv style=\"flex: 1 1 calc(50% - 8px); border: 1px solid #ccc; border-radius: 4px; text-align: center;\"\u003e\r\n          \u003cimg src=\"https://www.kamera-express.nl/media/45c526c7-3d9e-4ea8-b2a4-7d5c3dda5cad/tweedehands-conditie-6-webp.webp\" alt=\"Normale Gebrauchsspuren\" style=\"width: 100%; height: auto; object-fit: cover;\" /\u003e\r\n          \u003cstrong style=\"display: block; font-size: 15px; margin-bottom: 10px; padding: 0 3px;\"\u003eNormale Gebrauchsspuren\u003c/strong\u003e\r\n        \u003c/div\u003e\r\n      \u003c/div\u003e\r\n    \u003c/div\u003e\r\n  `;\r\n\r\n  const contentClicks = `\r\n    \u003cdiv class=\"drawerInfo\"\u003e\r\n      \u003cp style=\"padding: 10px 0;\"\u003e\r\n        Jedes Mal, wenn du mit einer Kamera ein Foto machst, wird der Verschluss ausgelöst. Das nennt man einen Auslösevorgang. Der Verschluss ist ein mechanisches Bauteil und nutzt sich mit der Zeit ab, ähnlich wie ein Auto mit Kilometern auf dem Tacho. Deshalb gibt die Anzahl der Auslösungen einen guten Hinweis darauf, wie intensiv eine Kamera genutzt wurde. Jede Kamera hat eine erwartete Lebensdauer des Verschlusses, meist zwischen 100.000 und 300.000 Auslösungen, abhängig von Typ und Marke.\r\n      \u003c/p\u003e\r\n      \u003cp style=\"padding: 10px 0;\"\u003e\u003cstrong\u003eWas kannst du je nach Anzahl der Auslösungen erwarten?\u003c/strong\u003e\u003c/p\u003e\r\n\r\n      \u003cdiv\u003e\r\n        \u003cp style=\"padding: 10px 0; margin: 0;\"\u003e\u003cstrong\u003e\u0026lt; 10.000: Wie neu\u003c/strong\u003e\u003c/p\u003e\r\n        \u003cp style=\"padding: 10px 0;\"\u003eSehr wenig genutzt, in der Regel in ausgezeichnetem Zustand.\u003c/p\u003e\r\n      \u003c/div\u003e\r\n\r\n      \u003cdiv\u003e\r\n        \u003cp style=\"padding: 10px 0; margin: 0;\"\u003e\u003cstrong\u003e10.000 – 25.000: Leicht genutzt\u003c/strong\u003e\u003c/p\u003e\r\n        \u003cp style=\"padding: 10px 0;\"\u003eEinige Male genutzt, technisch aber in sehr gutem Zustand.\u003c/p\u003e\r\n      \u003c/div\u003e\r\n\r\n      \u003cdiv\u003e\r\n        \u003cp style=\"padding: 10px 0; margin: 0;\"\u003e\u003cstrong\u003e25.000 – 50.000: Normal genutzt\u003c/strong\u003e\u003c/p\u003e\r\n        \u003cp style=\"padding: 10px 0;\"\u003eTypische Nutzung für ambitionierte Fotografen oder Semiprofis.\u003c/p\u003e\r\n      \u003c/div\u003e\r\n\r\n      \u003cdiv\u003e\r\n        \u003cp style=\"padding: 10px 0; margin: 0;\"\u003e\u003cstrong\u003e50.000 – 75.000: Regelmäßig genutzt\u003c/strong\u003e\u003c/p\u003e\r\n        \u003cp style=\"padding: 10px 0;\"\u003eAktiv genutzt, zum Beispiel von einem Semiprofi.\u003c/p\u003e\r\n      \u003c/div\u003e\r\n\r\n      \u003cdiv\u003e\r\n        \u003cp style=\"padding: 10px 0; margin: 0;\"\u003e\u003cstrong\u003e75.000 – 100.000: Intensiv genutzt, weiterhin gut einsetzbar\u003c/strong\u003e\u003c/p\u003e\r\n        \u003cp style=\"padding: 10px 0;\"\u003eStark genutzt, aber dafür sind viele Profi-Modelle ausgelegt.\u003c/p\u003e\r\n      \u003c/div\u003e\r\n\r\n      \u003cdiv\u003e\r\n        \u003cp style=\"padding: 10px 0; margin: 0;\"\u003e\u003cstrong\u003e100.000 – 150.000: Erfahren, aber noch zuverlässig\u003c/strong\u003e\u003c/p\u003e\r\n        \u003cp style=\"padding: 10px 0;\"\u003eIdeal als Backup-Kamera oder als clevere Wahl mit kleinerem Budget.\u003c/p\u003e\r\n      \u003c/div\u003e\r\n\r\n      \u003cdiv\u003e\r\n        \u003cp style=\"padding: 10px 0; margin: 0;\"\u003e\u003cstrong\u003e\u0026gt; 150.000: Für den cleveren Käufer\u003c/strong\u003e\u003c/p\u003e\r\n        \u003cp style=\"padding: 10px 0;\"\u003eDeutlich genutzt, kann aber trotzdem noch überraschend lange halten.\u003c/p\u003e\r\n      \u003c/div\u003e\r\n    \u003c/div\u003e\r\n  `;\r\n\r\n  function closeDrawer(drawer, overlay) {\r\n    drawer.style.right = \"-100%\";\r\n    overlay.style.opacity = \"0\";\r\n    overlay.style.visibility = \"hidden\";\r\n    setTimeout(() =\u003e {\r\n      drawer.remove();\r\n      overlay.remove();\r\n    }, 300);\r\n  }\r\n\r\n  function createCustomDrawer(id, title, contentHTML) {\r\n    if (document.getElementById(id)) return;\r\n\r\n    const overlay = document.createElement(\"div\");\r\n    overlay.id = id;\r\n    overlay.style.cssText = `\r\n      position: fixed; top: 0; left: 0; width: 100%; height: 100%;\r\n      background: rgba(0, 0, 0, 0.5);\r\n      z-index: 9998;\r\n      opacity: 0;\r\n      visibility: hidden;\r\n      transition: opacity 0.3s ease;\r\n    `;\r\n\r\n    const drawer = document.createElement(\"div\");\r\n    drawer.className = \"drawer\";\r\n    drawer.style.cssText = `\r\n      position: fixed; top: 0; right: -100%; width: 480px; max-width: 90%; height: 100%;\r\n      background: #fff; box-shadow: -2px 0 5px rgba(0,0,0,0.2);\r\n      z-index: 9999; display: flex; flex-direction: column;\r\n      font-family: 'Barlow', sans-serif; transition: right 0.3s ease-in-out;\r\n    `;\r\n\r\n    drawer.innerHTML = `\r\n      \u003cdiv class=\"drawer-header\" style=\"display:flex;justify-content:space-between;align-items:center;padding:24px 24px 0 24px;\"\u003e\r\n        \u003ch2 style=\"font-size:24px;font-weight:bold;margin:0;\"\u003e${title}\u003c/h2\u003e\r\n        \u003cbutton class=\"drawer-close-button\" style=\"background:none;border:none;cursor:pointer;padding:0;\"\u003e\r\n          \u003csvg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\u003e\r\n            \u003cpath d=\"M6 18L18 6M18 18L6 6\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"/\u003e\r\n          \u003c/svg\u003e\r\n        \u003c/button\u003e\r\n      \u003c/div\u003e\r\n      \u003cdiv class=\"drawer-body\" style=\"flex-grow:1;overflow-y:auto;padding:16px 24px 24px 24px;\"\u003e\r\n        \u003cdiv class=\"drawer-content\"\u003e${contentHTML}\u003c/div\u003e\r\n      \u003c/div\u003e\r\n      \u003cdiv class=\"drawer-cta\" style=\"padding:20px;border-top:1px solid #eee;flex-shrink:0;\"\u003e\r\n        \u003ca href=\"/gebraucht\" class=\"sf-button--outline sf-button\" style=\"\r\n          text-transform:none;display:block;width:100%;padding:14px;text-align:center;\r\n          border:1px solid black;color:black;text-decoration:none;border-radius:4px;\r\n          font-size:16px;font-weight:bold;\"\u003e\r\n          Alles über unser Gebrauchtangebot\r\n        \u003c/a\u003e\r\n      \u003c/div\u003e\r\n    `;\r\n\r\n    document.body.appendChild(overlay);\r\n    document.body.appendChild(drawer);\r\n\r\n    requestAnimationFrame(() =\u003e {\r\n      drawer.style.right = \"0\";\r\n      overlay.style.opacity = \"1\";\r\n      overlay.style.visibility = \"visible\";\r\n    });\r\n\r\n    const close = () =\u003e closeDrawer(drawer, overlay);\r\n    overlay.addEventListener(\"click\", close);\r\n    drawer.querySelector(\".drawer-close-button\").addEventListener(\"click\", close);\r\n  }\r\n\r\n  document.addEventListener(\"click\", (event) =\u003e {\r\n    if (event.target.closest(\".drawer-trigger-condition\")) {\r\n      createCustomDrawer(\"drawer-condition\", \"Zustand des Produkts\", contentCondition);\r\n    }\r\n    if (event.target.closest(\".drawer-trigger-clicks\")) {\r\n      createCustomDrawer(\"drawer-clicks\", \"Anzahl der Auslösungen\", contentClicks);\r\n    }\r\n  });\r\n\r\n  function normalizeLabel(text) {\r\n    return String(text || \"\")\r\n      .trim()\r\n      .toLowerCase()\r\n      .normalize(\"NFD\")\r\n      .replace(/[\\u0300-\\u036f]/g, \"\");\r\n  }\r\n\r\n  function parseClicksSubtext(clicksRaw) {\r\n    const cleaned = String(clicksRaw || \"\")\r\n      .toLowerCase()\r\n      .replace(/\\./g, \"\")\r\n      .replace(/\\s+to\\s+/g, \"-\")\r\n      .replace(/\\s+bis\\s+/g, \"-\")\r\n      .replace(/[–—]/g, \"-\")\r\n      .replace(/[^\\d\\-\u003c\u003e]/g, \"\")\r\n      .trim();\r\n\r\n    const ranges = [\r\n      { match: /^\u003c\\s*10000$/, label: \"Wie neu\" },\r\n      { match: /^10000\\s*-\\s*25000$/, label: \"Leicht genutzt\" },\r\n      { match: /^25000\\s*-\\s*50000$/, label: \"Normal genutzt\" },\r\n      { match: /^50000\\s*-\\s*75000$/, label: \"Regelmäßig genutzt\" },\r\n      { match: /^75000\\s*-\\s*100000$/, label: \"Intensiv genutzt, weiterhin gut einsetzbar\" },\r\n      { match: /^100000\\s*-\\s*150000$/, label: \"Erfahren, aber noch zuverlässig\" },\r\n      { match: /^\u003e\\s*150000$/, label: \"Für den cleveren Käufer\" },\r\n    ];\r\n\r\n    for (const range of ranges) {\r\n      if (range.match.test(cleaned)) return range.label;\r\n    }\r\n\r\n    return null;\r\n  }\r\n\r\n  function findSpecValue(labels) {\r\n    const labelList = Array.isArray(labels) ? labels : [labels];\r\n    const labelSet = new Set(labelList.map(normalizeLabel));\r\n    const cells = [...document.querySelectorAll(\"#specificationsSection td.sf-table__data\")];\r\n    const match = cells.find((cell) =\u003e labelSet.has(normalizeLabel(cell.textContent || \"\")));\r\n    return match?.nextElementSibling?.textContent?.trim() || null;\r\n  }\r\n\r\n  function ensureSharedStyles() {\r\n    if (document.getElementById(\"custom-second-hand-styles-at\")) return;\r\n\r\n    const style = document.createElement(\"style\");\r\n    style.id = \"custom-second-hand-styles-at\";\r\n    style.textContent = `\r\n      .custom-check-label .check-icon { width:25px; height:25px; object-fit:contain; margin:auto !important; }\r\n      .custom-check-label span { font-size:15px; font-weight:700; }\r\n      #buySection .icon-usp-container { pointer-events:none !important; cursor:default !important; }\r\n      #buySection .custom-specs-wrapper {\r\n        display:flex;\r\n        gap:24px;\r\n        margin:0 0 20px 0;\r\n        align-items:flex-start;\r\n        flex-wrap:wrap;\r\n      }\r\n      #buySection .custom-specs-wrapper \u003e div {\r\n        min-width:0;\r\n      }\r\n      #buySection .custom-specs-wrapper .custom-spec-value {\r\n        font-size:14px;\r\n        margin-top:4px;\r\n        line-height:1.4;\r\n        word-break:break-word;\r\n      }\r\n    `;\r\n    document.head.appendChild(style);\r\n  }\r\n\r\n  function injectOverlayLabel() {\r\n    const stage = document.querySelector(\"#imageGallerySection .sf-gallery__stage\");\r\n    if (!stage || stage.querySelector(\".custom-check-label\")) return;\r\n\r\n    ensureSharedStyles();\r\n    stage.style.position = \"relative\";\r\n\r\n    const label = document.createElement(\"div\");\r\n    label.className = \"custom-check-label\";\r\n    label.innerHTML = `\r\n      \u003cimg src=\"${iconURL}\" alt=\"\" class=\"check-icon\" /\u003e\r\n      \u003cspan\u003eGeprüft von unseren Gebraucht-Experten\u003c/span\u003e\r\n    `;\r\n\r\n    Object.assign(label.style, {\r\n      position: \"absolute\",\r\n      bottom: \"15px\",\r\n      right: \"15px\",\r\n      background: \"transparent\",\r\n      color: \"#000\",\r\n      padding: \"4px 8px\",\r\n      display: \"flex\",\r\n      alignItems: \"center\",\r\n      gap: \"6px\",\r\n      zIndex: \"99\",\r\n      pointerEvents: \"none\",\r\n    });\r\n\r\n    stage.appendChild(label);\r\n  }\r\n\r\n  function updateStockSubtext() {\r\n    const wrapper = document.querySelector(\"#buySection .availability-wrapper\");\r\n    if (!wrapper) return;\r\n\r\n    const badge = wrapper.querySelector(\".sf-badge\");\r\n    const subText = wrapper.querySelector(\"p.body-text-small.status-subtext\");\r\n    if (!badge || !subText) return;\r\n\r\n    const isInStock = /auf\\s+lager/i.test((badge.textContent || \"\").trim());\r\n    const desired = \"Jedes Gebrauchtprodukt ist einzigartig – nur 1 Exemplar verfügbar\";\r\n\r\n    if (isInStock \u0026\u0026 subText.textContent.trim() !== desired) {\r\n      subText.textContent = desired;\r\n    }\r\n  }\r\n\r\n  function replaceUSPs() {\r\n    const uspButtons = document.querySelectorAll(\"#buySection .icon-usp-container\");\r\n    const newUSPs = [\r\n      { strong: \"Geprüft und gereinigt\", text: \" von unseren Experten\" },\r\n      { strong: \"12 Monate Garantie\", text: \" auf alle Gebrauchtprodukte\" },\r\n      { strong: \"14 Tage Bedenkzeit\", text: \"Nicht wie erwartet? Immer \", beforeStrong: true },\r\n      { strong: \"Großes Gebrauchtangebot\", text: \"\" },\r\n    ];\r\n\r\n    if (uspButtons.length \u003c newUSPs.length) return;\r\n\r\n    uspButtons.forEach((btn, index) =\u003e {\r\n      if (index \u003e= newUSPs.length) return;\r\n\r\n      const p = btn.querySelector(\"p\");\r\n      if (!p) return;\r\n\r\n      const usp = newUSPs[index];\r\n      const existingText = (p.textContent || \"\").trim();\r\n      if (existingText.includes(usp.strong)) return;\r\n\r\n      p.innerHTML = usp.beforeStrong\r\n        ? `${usp.text}\u003cstrong\u003e${usp.strong}\u003c/strong\u003e`\r\n        : `\u003cstrong\u003e${usp.strong}\u003c/strong\u003e${usp.text}`;\r\n    });\r\n  }\r\n\r\n  function injectSpecsBlocks() {\r\n    const buySection = document.querySelector(\"#buySection .buy-section-wrapper\");\r\n    const priceContainer = buySection?.querySelector(\".buy-section-price-container\");\r\n    if (!buySection || !priceContainer) return;\r\n\r\n    ensureSharedStyles();\r\n\r\n    const conditionValue = findSpecValue([\"Zustand\"]);\r\n    const clicksValue = findSpecValue([\"Anzahl der Auslösungen\", \"Exakte Anzahl der Auslösungen\"]);\r\n\r\n    if (!conditionValue \u0026\u0026 !clicksValue) return;\r\n\r\n    let wrapper = buySection.querySelector(\".custom-specs-wrapper\");\r\n    if (!wrapper) {\r\n      wrapper = document.createElement(\"div\");\r\n      wrapper.className = \"custom-specs-wrapper\";\r\n    } else {\r\n      wrapper.innerHTML = \"\";\r\n    }\r\n\r\n    if (conditionValue) {\r\n      const conditionBlock = document.createElement(\"div\");\r\n      conditionBlock.className = \"custom-condition-block\";\r\n      conditionBlock.innerHTML = `\r\n        \u003cdiv class=\"drawer-trigger-condition\" style=\"display:flex;align-items:center;gap:6px;cursor:pointer;\"\u003e\r\n          \u003cspan style=\"font-weight:700;font-size:15px;\"\u003eZustand\u003c/span\u003e\r\n          \u003cimg src=\"${infoIconURL}\" alt=\"Info Zustand\" style=\"width:16px;height:16px;\" /\u003e\r\n        \u003c/div\u003e\r\n        \u003cdiv class=\"custom-spec-value\"\u003e${conditionValue}\u003c/div\u003e\r\n      `;\r\n      wrapper.appendChild(conditionBlock);\r\n    }\r\n\r\n    if (clicksValue \u0026\u0026 !/nicht anwendbar|unbekannt/i.test(clicksValue)) {\r\n      const subtext = parseClicksSubtext(clicksValue);\r\n      const clicksBlock = document.createElement(\"div\");\r\n      clicksBlock.className = \"custom-clicks-block\";\r\n      clicksBlock.innerHTML = `\r\n        \u003cdiv class=\"drawer-trigger-clicks\" style=\"display:flex;align-items:center;gap:6px;cursor:pointer;\"\u003e\r\n          \u003cspan style=\"font-weight:700;font-size:15px;\"\u003eAnzahl der Auslösungen\u003c/span\u003e\r\n          \u003cimg src=\"${infoIconURL}\" alt=\"Info Auslösungen\" style=\"width:16px;height:16px;\" /\u003e\r\n        \u003c/div\u003e\r\n        \u003cdiv class=\"custom-spec-value\"\u003e${clicksValue}${subtext ? ` — ${subtext}` : \"\"}\u003c/div\u003e\r\n      `;\r\n      wrapper.appendChild(clicksBlock);\r\n    }\r\n\r\n    if (!wrapper.children.length) return;\r\n\r\n    if (priceContainer.nextElementSibling !== wrapper) {\r\n      priceContainer.insertAdjacentElement(\"afterend\", wrapper);\r\n    }\r\n  }\r\n\r\n  function injectPhotoInfoBlock() {\r\n    const galleryWrapper =\r\n      document.querySelector(\"#imageGallerySection .sf-gallery\") ||\r\n      document.querySelector(\"#imageGallerySection .image-gallery\");\r\n    if (!galleryWrapper || document.querySelector(\".photo-info-block\")) return;\r\n\r\n    const infoBlock = document.createElement(\"div\");\r\n    infoBlock.className = \"photo-info-block\";\r\n    infoBlock.style.cssText = `\r\n      display:flex;align-items:center;gap:10px;border:1px solid #ccc;\r\n      padding:12px;margin-top:20px;font-size:15px;font-family:'Barlow', sans-serif;\r\n      background:white;z-index:1;position:relative;\r\n    `;\r\n\r\n    infoBlock.innerHTML = `\r\n      \u003cimg src=\"https://www.kamera-express.nl/media/68c2049a-8516-47dc-9f30-a04a120a6969/camera-icon-png.png\" alt=\"Kamera Icon\" style=\"width:30px;height:auto;object-fit:contain;\" /\u003e\r\n      \u003cspan\u003eWir fotografieren jedes Gebrauchtprodukt einzeln. Du kaufst also genau das Produkt, das du auf den Fotos siehst.\u003c/span\u003e\r\n    `;\r\n\r\n    galleryWrapper.insertAdjacentElement(\"afterend\", infoBlock);\r\n  }\r\n\r\n  const OWN_SELECTORS = [\r\n    \".custom-check-label\",\r\n    \".custom-specs-wrapper\",\r\n    \".photo-info-block\",\r\n    \".drawer\",\r\n    \"#drawer-condition\",\r\n    \"#drawer-clicks\",\r\n  ];\r\n\r\n  function isOwnNode(node) {\r\n    if (!node) return false;\r\n    if (node.nodeType === 3) node = node.parentElement;\r\n    if (!node || !node.closest) return false;\r\n    return OWN_SELECTORS.some((selector) =\u003e node.closest(selector));\r\n  }\r\n\r\n  function shouldIgnoreMutations(mutations) {\r\n    let anyRelevant = false;\r\n    for (const mutation of mutations) {\r\n      if (!isOwnNode(mutation.target)) anyRelevant = true;\r\n      for (const node of mutation.addedNodes || []) {\r\n        if (!isOwnNode(node)) anyRelevant = true;\r\n      }\r\n      for (const node of mutation.removedNodes || []) {\r\n        if (!isOwnNode(node)) anyRelevant = true;\r\n      }\r\n    }\r\n    return !anyRelevant;\r\n  }\r\n\r\n  let observer = null;\r\n  let scheduled = false;\r\n  let lastRunAt = 0;\r\n\r\n  function runAll(source) {\r\n    log(\"runAll:\", source);\r\n    try {\r\n      injectOverlayLabel();\r\n    } catch (e) {\r\n      err(\"injectOverlayLabel\", e);\r\n    }\r\n    try {\r\n      updateStockSubtext();\r\n    } catch (e) {\r\n      err(\"updateStockSubtext\", e);\r\n    }\r\n    try {\r\n      replaceUSPs();\r\n    } catch (e) {\r\n      err(\"replaceUSPs\", e);\r\n    }\r\n    try {\r\n      injectSpecsBlocks();\r\n    } catch (e) {\r\n      err(\"injectSpecsBlocks\", e);\r\n    }\r\n    try {\r\n      injectPhotoInfoBlock();\r\n    } catch (e) {\r\n      err(\"injectPhotoInfoBlock\", e);\r\n    }\r\n  }\r\n\r\n  function debounceRun(source) {\r\n    if (scheduled) return;\r\n\r\n    const now = Date.now();\r\n    const minGap = 150;\r\n    const wait = Math.max(0, minGap - (now - lastRunAt));\r\n\r\n    scheduled = true;\r\n    setTimeout(() =\u003e {\r\n      scheduled = false;\r\n      lastRunAt = Date.now();\r\n      runAll(source);\r\n    }, wait);\r\n  }\r\n\r\n  observer = new MutationObserver((mutations) =\u003e {\r\n    if (shouldIgnoreMutations(mutations)) return;\r\n    debounceRun(\"MutationObserver\");\r\n  });\r\n\r\n  observer.observe(document.body, { childList: true, subtree: true });\r\n  runAll(\"initial\");\r\n})();\r\n","trigger":{"include_pages":[{"type":"regex","regex":"photospecialist\\.at.*gebrauchtware"},{"type":"regex","regex":"photospecialist\\.at.*occasion"}],"exclude_pages":null},"_id":"69de45a44e4a3a103ab466ea"},{"uses_overlay":false,"type":"js","parametrized_definition":"(function () {\r\n  \"use strict\";\r\n\r\n  const titleEl =\r\n    document.querySelector(\"h1.pdpintro-title\") ||\r\n    document.querySelector(\"h1.pdpintro__title\") ||\r\n    document.querySelector(\"h1\");\r\n\r\n  const titleText = (titleEl?.textContent || \"\").toLowerCase();\r\n  const shouldRun = titleText.includes(\"occasion\");\r\n  if (!shouldRun) return;\r\n\r\n  // =========================\r\n  // CONFIG\r\n  // =========================\r\n  const DEBUG = false;\r\n  const TAG = \"[2H-PDP-FR]\";\r\n\r\n  const iconURL =\r\n    \"https://www.kamera-express.nl/media/2df505a2-2d5f-42c5-af7a-165584f27481/second-hand-check-png.png\";\r\n  const infoIconURL =\r\n    \"https://kamera-express.nl/media/93b40321-ffd4-41b6-9c21-f815d8f6c8d1/info-icon-png.png\";\r\n\r\n  function log(...a) {\r\n    if (DEBUG) console.log(TAG, ...a);\r\n  }\r\n  function warn(...a) {\r\n    if (DEBUG) console.warn(TAG, ...a);\r\n  }\r\n  function err(...a) {\r\n    console.error(TAG, ...a);\r\n  }\r\n\r\n  let observer = null;\r\n\r\n  // =========================\r\n  // DRAWER CONTENT - FR\r\n  // =========================\r\n  const contentConditie = `\r\n    \u003cdiv class=\"drawerInfo\"\u003e\r\n      \u003cp style=\"padding: 10px 0;\"\u003e\r\n        Nos experts contrôlent chaque produit repris avant sa mise en vente. Sur base de cette vérification, ils déterminent l’état général du produit. Ainsi, vous savez exactement à quoi vous attendre.\r\n      \u003c/p\u003e\r\n\r\n      \u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 16px;\"\u003e\r\n        \u003cdiv style=\"flex: 1 1 calc(50% - 8px); border: 1px solid #ccc; border-radius: 4px; text-align: center;\"\u003e\r\n          \u003cimg src=\"https://www.kamera-express.nl/media/3ee9b0de-bff2-4d59-beda-e63b4d002d9c/tweedehands-conditie-9-webp.webp\" alt=\"Comme neuf\" style=\"width: 100%; height: auto; object-fit: cover;\" /\u003e\r\n          \u003cstrong style=\"display: block; font-size: 15px; margin-bottom: 10px; padding: 0 3px;\"\u003eComme neuf\u003c/strong\u003e\r\n        \u003c/div\u003e\r\n\r\n        \u003cdiv style=\"flex: 1 1 calc(50% - 8px); border: 1px solid #ccc; border-radius: 4px; text-align: center;\"\u003e\r\n          \u003cimg src=\"https://www.kamera-express.nl/media/f96dbc3b-e687-4ebb-b65a-c79b54a6d1b7/tweedehands-conditie-8-webp.webp\" alt=\"Très légères traces d'utilisation\" style=\"width: 100%; height: auto; object-fit: cover;\" /\u003e\r\n          \u003cstrong style=\"display: block; font-size: 15px; margin-bottom: 10px; padding: 0 3px;\"\u003eTrès légères traces d'utilisation\u003c/strong\u003e\r\n        \u003c/div\u003e\r\n\r\n        \u003cdiv style=\"flex: 1 1 calc(50% - 8px); border: 1px solid #ccc; border-radius: 4px; text-align: center;\"\u003e\r\n          \u003cimg src=\"https://www.kamera-express.nl/media/39bad34a-4e2e-4174-ac7e-e711ef79ea82/tweedehands-conditie-7-webp.webp\" alt=\"Légères traces d'utilisation\" style=\"width: 100%; height: auto; object-fit: cover;\" /\u003e\r\n          \u003cstrong style=\"display: block; font-size: 15px; margin-bottom: 10px; padding: 0 3px;\"\u003eLégères traces d'utilisation\u003c/strong\u003e\r\n        \u003c/div\u003e\r\n\r\n        \u003cdiv style=\"flex: 1 1 calc(50% - 8px); border: 1px solid #ccc; border-radius: 4px; text-align: center;\"\u003e\r\n          \u003cimg src=\"https://www.kamera-express.nl/media/45c526c7-3d9e-4ea8-b2a4-7d5c3dda5cad/tweedehands-conditie-6-webp.webp\" alt=\"Traces d'utilisation normales\" style=\"width: 100%; height: auto; object-fit: cover;\" /\u003e\r\n          \u003cstrong style=\"display: block; font-size: 15px; margin-bottom: 10px; padding: 0 3px;\"\u003eTraces d'utilisation normales\u003c/strong\u003e\r\n        \u003c/div\u003e\r\n      \u003c/div\u003e\r\n    \u003c/div\u003e\r\n  `;\r\n\r\n  const contentClicks = `\r\n    \u003cdiv class=\"drawerInfo\"\u003e\r\n      \u003cp style=\"padding: 10px 0;\"\u003e\r\n        Chaque fois que vous prenez une photo avec un appareil photo, l’obturateur est activé. C’est ce qu’on appelle un “clic”. L’obturateur est une pièce mécanique qui s’use avec le temps, un peu comme une voiture avec des kilomètres au compteur. Le nombre de clics donne donc une bonne indication de l’intensité d’utilisation de l’appareil. Chaque appareil a une durée de vie estimée de l’obturateur, généralement entre 100.000 et 300.000 clics selon le type et la marque.\r\n      \u003c/p\u003e\r\n      \u003cp style=\"padding: 10px 0;\"\u003e\u003cstrong\u003eÀ quoi pouvez-vous vous attendre selon le nombre de clics ?\u003c/strong\u003e\u003c/p\u003e\r\n\r\n      \u003cdiv\u003e\r\n        \u003cp style=\"padding: 10px 0; margin: 0;\"\u003e\u003cstrong\u003e\u0026lt; 10.000 : Comme neuf\u003c/strong\u003e\u003c/p\u003e\r\n        \u003cp style=\"padding: 10px 0;\"\u003eTrès peu utilisé, généralement en excellent état.\u003c/p\u003e\r\n      \u003c/div\u003e\r\n\r\n      \u003cdiv\u003e\r\n        \u003cp style=\"padding: 10px 0; margin: 0;\"\u003e\u003cstrong\u003e10.000 – 25.000 : Légèrement utilisé\u003c/strong\u003e\u003c/p\u003e\r\n        \u003cp style=\"padding: 10px 0;\"\u003eUtilisé quelques fois, mais techniquement en excellent état.\u003c/p\u003e\r\n      \u003c/div\u003e\r\n\r\n      \u003cdiv\u003e\r\n        \u003cp style=\"padding: 10px 0; margin: 0;\"\u003e\u003cstrong\u003e25.000 – 50.000 : Utilisation normale\u003c/strong\u003e\u003c/p\u003e\r\n        \u003cp style=\"padding: 10px 0;\"\u003eUsage typique pour un photographe passionné ou semi-professionnel.\u003c/p\u003e\r\n      \u003c/div\u003e\r\n\r\n      \u003cdiv\u003e\r\n        \u003cp style=\"padding: 10px 0; margin: 0;\"\u003e\u003cstrong\u003e50.000 – 75.000 : Utilisé régulièrement\u003c/strong\u003e\u003c/p\u003e\r\n        \u003cp style=\"padding: 10px 0;\"\u003eUtilisé activement, par exemple par un semi-professionnel.\u003c/p\u003e\r\n      \u003c/div\u003e\r\n\r\n      \u003cdiv\u003e\r\n        \u003cp style=\"padding: 10px 0; margin: 0;\"\u003e\u003cstrong\u003e75.000 – 100.000 : Utilisé intensivement, encore très fiable\u003c/strong\u003e\u003c/p\u003e\r\n        \u003cp style=\"padding: 10px 0;\"\u003eUtilisation intensive, mais les modèles professionnels sont conçus pour cela.\u003c/p\u003e\r\n      \u003c/div\u003e\r\n\r\n      \u003cdiv\u003e\r\n        \u003cp style=\"padding: 10px 0; margin: 0;\"\u003e\u003cstrong\u003e100.000 – 150.000 : Expérimenté mais toujours exploitable\u003c/strong\u003e\u003c/p\u003e\r\n        \u003cp style=\"padding: 10px 0;\"\u003eParfait comme boîtier de secours ou comme choix malin à petit budget.\u003c/p\u003e\r\n      \u003c/div\u003e\r\n\r\n      \u003cdiv\u003e\r\n        \u003cp style=\"padding: 10px 0; margin: 0;\"\u003e\u003cstrong\u003e\u0026gt; 150.000 : Pour l’acheteur averti\u003c/strong\u003e\u003c/p\u003e\r\n        \u003cp style=\"padding: 10px 0;\"\u003eAppareil bien utilisé, mais qui peut encore durer étonnamment longtemps.\u003c/p\u003e\r\n      \u003c/div\u003e\r\n    \u003c/div\u003e\r\n  `;\r\n\r\n  function closeDrawer(drawer, overlay) {\r\n    drawer.style.right = \"-100%\";\r\n    overlay.style.opacity = \"0\";\r\n    overlay.style.visibility = \"hidden\";\r\n    setTimeout(() =\u003e {\r\n      drawer.remove();\r\n      overlay.remove();\r\n    }, 300);\r\n  }\r\n\r\n  function createCustomDrawer(id, title, contentHTML) {\r\n    if (document.getElementById(id)) return;\r\n\r\n    const overlay = document.createElement(\"div\");\r\n    overlay.id = id;\r\n    overlay.style.cssText = `\r\n      position: fixed; top: 0; left: 0; width: 100%; height: 100%;\r\n      background: rgba(0, 0, 0, 0.5);\r\n      z-index: 9998;\r\n      opacity: 0;\r\n      visibility: hidden;\r\n      transition: opacity 0.3s ease;\r\n    `;\r\n\r\n    const drawer = document.createElement(\"div\");\r\n    drawer.className = \"drawer\";\r\n    drawer.style.cssText = `\r\n      position: fixed; top: 0; right: -100%; width: 480px; max-width: 90%; height: 100%;\r\n      background: #fff; box-shadow: -2px 0 5px rgba(0,0,0,0.2);\r\n      z-index: 9999; display: flex; flex-direction: column;\r\n      font-family: 'Barlow', sans-serif; transition: right 0.3s ease-in-out;\r\n    `;\r\n\r\n    drawer.innerHTML = `\r\n      \u003cdiv class=\"drawer-header\" style=\"display:flex;justify-content:space-between;align-items:center;padding:24px 24px 0 24px;\"\u003e\r\n        \u003ch2 style=\"font-size:24px;font-weight:bold;margin:0;\"\u003e${title}\u003c/h2\u003e\r\n        \u003cbutton class=\"drawer-close-button\" style=\"background:none;border:none;cursor:pointer;padding:0;\"\u003e\r\n          \u003csvg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\u003e\r\n            \u003cpath d=\"M6 18L18 6M18 18L6 6\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"/\u003e\r\n          \u003c/svg\u003e\r\n        \u003c/button\u003e\r\n      \u003c/div\u003e\r\n      \u003cdiv class=\"drawer-body\" style=\"flex-grow:1;overflow-y:auto;padding:16px 24px 24px 24px;\"\u003e\r\n        \u003cdiv class=\"drawer-content\"\u003e${contentHTML}\u003c/div\u003e\r\n      \u003c/div\u003e\r\n      \u003cdiv class=\"drawer-cta\" style=\"padding:20px;border-top:1px solid #eee;flex-shrink:0;\"\u003e\r\n        \u003ca href=\"/fr/occasion\" class=\"sf-button--outline sf-button\" style=\"\r\n          text-transform:none;display:block;width:100%;padding:14px;text-align:center;\r\n          border:1px solid black;color:black;text-decoration:none;border-radius:4px;\r\n          font-size:16px;font-weight:bold;\"\u003e\r\n          Tout savoir sur notre offre d’occasion\r\n        \u003c/a\u003e\r\n      \u003c/div\u003e\r\n    `;\r\n\r\n    document.body.appendChild(overlay);\r\n    document.body.appendChild(drawer);\r\n\r\n    requestAnimationFrame(() =\u003e {\r\n      drawer.style.right = \"0\";\r\n      overlay.style.opacity = \"1\";\r\n      overlay.style.visibility = \"visible\";\r\n    });\r\n\r\n    const close = () =\u003e closeDrawer(drawer, overlay);\r\n    overlay.addEventListener(\"click\", close);\r\n    drawer.querySelector(\".drawer-close-button\").addEventListener(\"click\", close);\r\n  }\r\n\r\n  document.addEventListener(\"click\", (e) =\u003e {\r\n    if (e.target.closest(\".drawer-trigger-condition\")) {\r\n      createCustomDrawer(\"drawer-conditie\", \"État du produit\", contentConditie);\r\n    }\r\n    if (e.target.closest(\".drawer-trigger-clicks\")) {\r\n      createCustomDrawer(\"drawer-clicks\", \"Nombre de clics\", contentClicks);\r\n    }\r\n  });\r\n\r\n  // =========================\r\n  // CLICKS PARSING - FR\r\n  // supports:\r\n  // 25.000 à 50.000\r\n  // 25.000 - 50.000\r\n  // \u003c 10.000\r\n  // \u003e 150.000\r\n  // =========================\r\n  function parseClicksSubtext(clicksRaw) {\r\n    const cleaned = String(clicksRaw || \"\")\r\n      .toLowerCase()\r\n      .replace(/\\./g, \"\")\r\n      .replace(/\\s+to\\s+/g, \"-\")\r\n      .replace(/\\s+à\\s+/g, \"-\")\r\n      .replace(/\\s+au\\s+/g, \"-\")\r\n      .replace(/[–—]/g, \"-\")\r\n      .replace(/[^\\d\\-\u003c\u003e]/g, \"\")\r\n      .trim();\r\n\r\n    const ranges = [\r\n      { match: /^\u003c\\s*10000$/, label: \"Comme neuf\" },\r\n      { match: /^10000\\s*-\\s*25000$/, label: \"Légèrement utilisé\" },\r\n      { match: /^25000\\s*-\\s*50000$/, label: \"Utilisation normale\" },\r\n      { match: /^50000\\s*-\\s*75000$/, label: \"Utilisé régulièrement\" },\r\n      { match: /^75000\\s*-\\s*100000$/, label: \"Utilisé intensivement, encore très fiable\" },\r\n      { match: /^100000\\s*-\\s*150000$/, label: \"Expérimenté mais toujours exploitable\" },\r\n      { match: /^\u003e\\s*150000$/, label: \"Pour l’acheteur averti\" },\r\n    ];\r\n\r\n    for (const r of ranges) {\r\n      if (r.match.test(cleaned)) return r.label;\r\n    }\r\n\r\n    return null;\r\n  }\r\n\r\n  // =========================\r\n  // INJECTIONS - FR\r\n  // =========================\r\n  function injectOverlayLabel() {\r\n    const stage = document.querySelector(\".sf-gallery__stage\");\r\n    if (!stage) return;\r\n    if (stage.querySelector(\".custom-check-label\")) return;\r\n\r\n    stage.style.position = \"relative\";\r\n\r\n    const label = document.createElement(\"div\");\r\n    label.className = \"custom-check-label\";\r\n    label.innerHTML = `\r\n      \u003cimg src=\"${iconURL}\" alt=\"\" class=\"check-icon\" /\u003e\r\n      \u003cspan\u003eContrôlé par nos experts de l’occasion\u003c/span\u003e\r\n    `;\r\n\r\n    Object.assign(label.style, {\r\n      position: \"absolute\",\r\n      bottom: \"15px\",\r\n      right: \"15px\",\r\n      background: \"transparent\",\r\n      color: \"#000\",\r\n      padding: \"4px 8px\",\r\n      display: \"flex\",\r\n      alignItems: \"center\",\r\n      gap: \"6px\",\r\n      zIndex: \"99\",\r\n      pointerEvents: \"none\",\r\n    });\r\n\r\n    if (!document.getElementById(\"custom-check-style\")) {\r\n      const style = document.createElement(\"style\");\r\n      style.id = \"custom-check-style\";\r\n      style.innerHTML = `\r\n        .custom-check-label .check-icon { width:25px; height:25px; object-fit:contain; margin:auto !important; }\r\n        .custom-check-label span { font-size:15px; font-weight:700; }\r\n        .icon-usp-container { pointer-events:none !important; cursor:default !important; }\r\n      `;\r\n      document.head.appendChild(style);\r\n    }\r\n\r\n    stage.appendChild(label);\r\n  }\r\n\r\n  function updateStockSubtext() {\r\n    const wrapper = document.querySelector(\".availability-wrapper\");\r\n    if (!wrapper) return;\r\n\r\n    const badge = wrapper.querySelector(\".sf-badge\");\r\n    const subText = wrapper.querySelector(\"p.body-text-small.status-subtext\");\r\n    if (!badge || !subText) return;\r\n\r\n    const isEnStock = /en\\s+stock/i.test((badge.textContent || \"\").trim());\r\n    const desired = \"Chaque produit d’occasion est unique – un seul exemplaire disponible\";\r\n\r\n    if (isEnStock \u0026\u0026 subText.textContent !== desired) {\r\n      subText.textContent = desired;\r\n    }\r\n  }\r\n\r\n  function replaceUSPs() {\r\n    const uspButtons = document.querySelectorAll(\".icon-usp-container\");\r\n    const newUSPs = [\r\n      { strong: \"Contrôlé et nettoyé\", text: \" par nos experts\" },\r\n      { strong: \"12 mois de garantie\", text: \" sur tous les produits d’occasion\" },\r\n      { strong: \"14 jours de réflexion\", text: \"Pas comme prévu ? Toujours \", beforeStrong: true },\r\n      { strong: \"Large choix d’occasion\", text: \"\" },\r\n    ];\r\n\r\n    if (uspButtons.length \u003c newUSPs.length) return;\r\n\r\n    uspButtons.forEach((btn, i) =\u003e {\r\n      if (i \u003e= newUSPs.length) return;\r\n\r\n      const p = btn.querySelector(\"p\");\r\n      if (!p) return;\r\n\r\n      const usp = newUSPs[i];\r\n      const existingText = (p.textContent || \"\").trim();\r\n      if (existingText.includes(usp.strong)) return;\r\n\r\n      p.innerHTML = usp.beforeStrong\r\n        ? `${usp.text}\u003cstrong\u003e${usp.strong}\u003c/strong\u003e`\r\n        : `\u003cstrong\u003e${usp.strong}\u003c/strong\u003e${usp.text}`;\r\n    });\r\n  }\r\n\r\n  function normalizeLabel(text) {\r\n    return String(text || \"\")\r\n      .trim()\r\n      .toLowerCase()\r\n      .normalize(\"NFD\")\r\n      .replace(/[\\u0300-\\u036f]/g, \"\");\r\n  }\r\n\r\n  function findSpecValue(labels) {\r\n    const labelList = Array.isArray(labels) ? labels : [labels];\r\n    const labelSet = new Set(labelList.map(normalizeLabel));\r\n    const tds = [...document.querySelectorAll(\"td.sf-table__data\")];\r\n\r\n    const hit = tds.find((el) =\u003e labelSet.has(normalizeLabel(el.textContent || \"\")));\r\n    return hit?.nextElementSibling?.textContent?.trim() || null;\r\n  }\r\n\r\n  function injectSpecsBlocks() {\r\n    const priceContainer = document.querySelector(\".buy-section-price-container\");\r\n    if (!priceContainer) return;\r\n\r\n    let wrapper = document.querySelector(\".custom-specs-wrapper\");\r\n\r\n    const conditionValue = findSpecValue([\"État\", \"Conditie\", \"Condition\"]);\r\n    const clicksValue = findSpecValue([\"Nombre de clics\", \"Aantal clicks\", \"Clicks\"]);\r\n\r\n    if (!conditionValue \u0026\u0026 !clicksValue) return;\r\n\r\n    if (!wrapper) {\r\n      wrapper = document.createElement(\"div\");\r\n      wrapper.className = \"custom-specs-wrapper\";\r\n      wrapper.style.display = \"flex\";\r\n      wrapper.style.gap = \"24px\";\r\n      wrapper.style.margin = \"0px 0px 20px 0px\";\r\n    } else {\r\n      wrapper.innerHTML = \"\";\r\n    }\r\n\r\n    if (conditionValue) {\r\n      const conditionBlock = document.createElement(\"div\");\r\n      conditionBlock.className = \"custom-condition-block\";\r\n      conditionBlock.innerHTML = `\r\n        \u003cdiv class=\"drawer-trigger-condition\" style=\"display:flex;align-items:center;gap:6px;cursor:pointer;\"\u003e\r\n          \u003cspan style=\"font-weight:700;font-size:15px;\"\u003eÉtat\u003c/span\u003e\r\n          \u003cimg src=\"${infoIconURL}\" alt=\"Info état\" style=\"width:16px;height:16px;\" /\u003e\r\n        \u003c/div\u003e\r\n        \u003cdiv style=\"font-size:14px;margin-top:4px;line-height:1.4;\"\u003e${conditionValue}\u003c/div\u003e\r\n      `;\r\n      wrapper.appendChild(conditionBlock);\r\n    }\r\n\r\n    if (clicksValue \u0026\u0026 !/non applicable|inconnu/i.test(clicksValue)) {\r\n      const subtext = parseClicksSubtext(clicksValue);\r\n\r\n      const clicksBlock = document.createElement(\"div\");\r\n      clicksBlock.className = \"custom-clicks-block\";\r\n      clicksBlock.innerHTML = `\r\n        \u003cdiv class=\"drawer-trigger-clicks\" style=\"display:flex;align-items:center;gap:6px;cursor:pointer;\"\u003e\r\n          \u003cspan style=\"font-weight:700;font-size:15px;\"\u003eNombre de clics\u003c/span\u003e\r\n          \u003cimg src=\"${infoIconURL}\" alt=\"Info clics\" style=\"width:16px;height:16px;\" /\u003e\r\n        \u003c/div\u003e\r\n        \u003cdiv style=\"font-size:14px;margin-top:4px;line-height:1.4;\"\u003e\r\n          ${clicksValue}${subtext ? ` — ${subtext}` : \"\"}\r\n        \u003c/div\u003e\r\n      `;\r\n      wrapper.appendChild(clicksBlock);\r\n    }\r\n\r\n    if (!wrapper.children.length) return;\r\n\r\n    if (priceContainer.nextElementSibling !== wrapper) {\r\n      priceContainer.insertAdjacentElement(\"afterend\", wrapper);\r\n    }\r\n  }\r\n\r\n  function injectPhotoInfoBlock() {\r\n    const galleryWrapper = document.querySelector(\".sf-gallery\");\r\n    if (!galleryWrapper) return;\r\n    if (document.querySelector(\".photo-info-block\")) return;\r\n\r\n    const infoBlock = document.createElement(\"div\");\r\n    infoBlock.className = \"photo-info-block\";\r\n    infoBlock.style.cssText = `\r\n      display:flex;align-items:center;gap:10px;border:1px solid #ccc;\r\n      padding:12px;margin-top:20px;font-size:15px;font-family:'Barlow', sans-serif;\r\n      background:white;z-index:1;position:relative;\r\n    `;\r\n\r\n    infoBlock.innerHTML = `\r\n      \u003cimg src=\"https://www.kamera-express.nl/media/68c2049a-8516-47dc-9f30-a04a120a6969/camera-icon-png.png\" alt=\"Icône appareil photo\" style=\"width:30px;height:auto;object-fit:contain;\" /\u003e\r\n      \u003cspan\u003eNous photographions chaque produit d’occasion séparément. Vous achetez donc exactement le produit visible sur les photos.\u003c/span\u003e\r\n    `;\r\n\r\n    galleryWrapper.insertAdjacentElement(\"afterend\", infoBlock);\r\n  }\r\n\r\n  // =========================\r\n  // Observer\r\n  // =========================\r\n  const OWN_SELECTORS = [\r\n    \".custom-check-label\",\r\n    \".custom-specs-wrapper\",\r\n    \".photo-info-block\",\r\n    \".drawer\",\r\n    \"#drawer-conditie\",\r\n    \"#drawer-clicks\",\r\n  ];\r\n\r\n  function isOwnNode(node) {\r\n    if (!node) return false;\r\n    if (node.nodeType === 3) node = node.parentElement;\r\n    if (!node || !node.closest) return false;\r\n    return OWN_SELECTORS.some((sel) =\u003e node.closest(sel));\r\n  }\r\n\r\n  function shouldIgnoreMutations(mutations) {\r\n    let anyRelevant = false;\r\n    for (const m of mutations) {\r\n      if (!isOwnNode(m.target)) anyRelevant = true;\r\n      for (const n of m.addedNodes || []) {\r\n        if (!isOwnNode(n)) anyRelevant = true;\r\n      }\r\n      for (const n of m.removedNodes || []) {\r\n        if (!isOwnNode(n)) anyRelevant = true;\r\n      }\r\n    }\r\n    return !anyRelevant;\r\n  }\r\n\r\n  let scheduled = false;\r\n  let lastRunAt = 0;\r\n\r\n  function runAll(source) {\r\n    log(\"runAll:\", source);\r\n    try {\r\n      injectOverlayLabel();\r\n    } catch (e) {\r\n      err(\"injectOverlayLabel\", e);\r\n    }\r\n    try {\r\n      updateStockSubtext();\r\n    } catch (e) {\r\n      err(\"updateStockSubtext\", e);\r\n    }\r\n    try {\r\n      replaceUSPs();\r\n    } catch (e) {\r\n      err(\"replaceUSPs\", e);\r\n    }\r\n    try {\r\n      injectSpecsBlocks();\r\n    } catch (e) {\r\n      err(\"injectSpecsBlocks\", e);\r\n    }\r\n    try {\r\n      injectPhotoInfoBlock();\r\n    } catch (e) {\r\n      err(\"injectPhotoInfoBlock\", e);\r\n    }\r\n  }\r\n\r\n  function debounceRun(source) {\r\n    if (scheduled) return;\r\n\r\n    const now = Date.now();\r\n    const minGap = 150;\r\n    const wait = Math.max(0, minGap - (now - lastRunAt));\r\n\r\n    scheduled = true;\r\n    setTimeout(() =\u003e {\r\n      scheduled = false;\r\n      lastRunAt = Date.now();\r\n      runAll(source);\r\n    }, wait);\r\n  }\r\n\r\n  observer = new MutationObserver((mutations) =\u003e {\r\n    if (shouldIgnoreMutations(mutations)) return;\r\n    debounceRun(\"MutationObserver\");\r\n  });\r\n\r\n  observer.observe(document.body, { childList: true, subtree: true });\r\n  runAll(\"initial\");\r\n})();\r\n","trigger":{"include_pages":[{"type":"regex","regex":"kamera-express\\.be/fr/.*occasion.*"}],"exclude_pages":null},"_id":"69de46aafcfa30ef23bab334"}],"vars":{"data":[{"id":"668d0430e67282c2980a4aed","name":"Pagetype","variable":{"type":"custom_function","custom_function":{"body":"const getPageMetaProperty = (property) =\u003e {\n\treturn document.querySelector('meta[data-hid=\"' + property + '\"]')?.getAttribute('content') ?? undefined;\n}\nreturn getPageMetaProperty('og:type')?.toLowerCase()"}}},{"id":"684c45c5f0f60525b1f460ae","name":"ignoreDataDog","variable":{"type":"custom_function","custom_function":{"body":"if(!document.cookie.includes('datadog-agent')) return 'true'"}}},{"id":"68e51aa275184705e2b45de0","name":"ignoreDataDog","variable":{"type":"custom_function","custom_function":{"body":"if(!document.cookie.includes('datadog-agent')) return 'true'"}}},{"id":"68e51b561589312869a65ec0","name":"ignoreDataDog","variable":{"type":"custom_function","custom_function":{"body":"if(!document.cookie.includes('datadog-agent')) return 'true'"}}},{"id":"6992deb23f12057cc2fcecdb","name":"ignoreDataDog","variable":{"type":"custom_function","custom_function":{"body":"if(!document.cookie.includes('datadog-agent')) return 'true'"}}}]}}