Canonical URL: https://natureslens.co.uk/photography-holiday/danube-delta/

# Birds of the Danube Delta [Photography Tour](https://natureslens.co.uk/join-a/wildlife-photography-tour/)

22nd - 29th May 2027 - £2999

- Guided By [NaturesLens](https://natureslens.co.uk/about/natureslens/)

[![A Squacco Heron Takes Flight Typical Of The Kind Of Image You Will Capture During The Danube Delta Bird Photography Trip](https://natureslens.co.uk/wp-content/uploads/2022/08/A-Squacco-Heron-takes-flight-typical-of-the-kind-of-image-you-will-capture-during-the-Danube-Delta-Bird-Photography-trip-1024x683.jpg)](https://natureslens.co.uk/wp-content/uploads/2022/08/A-Squacco-Heron-takes-flight-typical-of-the-kind-of-image-you-will-capture-during-the-Danube-Delta-Bird-Photography-trip.jpg)

## Birds of the Danube Delta - 22nd - 29th May 2027 - £2999 - Single occupancy

Reserve with a deposit of £600

No payment is taken at enquiry stage. We confirm availability first, then send booking forms and deposit payment details. Please read our [booking conditions](https://natureslens.co.uk/wildlife-photography-holidays/about-us/booking-condtions/) and [financial protection information](https://natureslens.co.uk/wildlife-photography-holidays/about-us/financial-protection/) before paying a deposit.

Make A Booking Enquiry

No payment is taken at enquiry stage. We confirm availability first, then send booking forms and deposit payment details. Please read our [booking conditions](https://natureslens.co.uk/wildlife-photography-holidays/about-us/booking-condtions/) and [financial protection information](https://natureslens.co.uk/wildlife-photography-holidays/about-us/financial-protection/) before paying a deposit.

## Book a wildlife photography holiday with NaturesLens

Book a wildlife photography holiday with NaturesLens & capture stunning images of nature's most remarkable wildlife, with experienced photographic guidance & time to make the most of the conditions.

[Worldwide Wildlife Photography HolidaysWildlife Photography Holidays](https://natureslens.co.uk/wildlife-photography-holidays/destinations/)

### Meet Our Guides

### Our Destinations

#### ### Photograph ...

### About NaturesLens

© 2013 - 2026 NaturesLens - All Rights Reserved

NATURESLENS LIMITED Company number 10868180. Registered office: 142-143 Parrock Street, Gravesend, England, DA12 1EY.

'; pop.querySelector('.nl-slp-popover__close').addEventListener('click', closePopover); } function openPreview(trigger){ var p = ensurePopover(); var slug = trigger.getAttribute('data-nl-slp'); openTrigger = trigger; trigger.setAttribute('aria-expanded', 'true'); p.innerHTML = '

Loading…

'; p.classList.add('is-open'); positionPopover(trigger); if ( cache\[slug\] ) { render(cache\[slug\], trigger.href); positionPopover(trigger); return; } fetch(ajaxUrl + '?action=nl_slp_preview&slug=' + encodeURIComponent(slug)) .then(function(r){ return r.json(); }) .then(function(json){ if ( openTrigger !== trigger ) return; if ( json.success ) { cache\[slug\] = json.data; render(json.data, trigger.href); } else { closePopover(); } positionPopover(trigger); }) .catch(function(){ closePopover(); }); } function scheduleClose(){ clearTimeout(closeTimer); closeTimer = setTimeout(closePopover, 200); } document.addEventListener('mouseover', function(e){ var trigger = e.target.closest('\[data-nl-slp\]'); if ( trigger ) { clearTimeout(closeTimer); if ( openTrigger !== trigger ) openPreview(trigger); return; } if ( pop && pop.contains(e.target) ) { clearTimeout(closeTimer); } }); document.addEventListener('mouseout', function(e){ var leavingTrigger = e.target.closest('\[data-nl-slp\]'); var leavingPopover = pop && pop.contains(e.target); if ( ! leavingTrigger && ! leavingPopover ) return; var to = e.relatedTarget; if ( to && ( ( to.closest && to.closest('\[data-nl-slp\]') === openTrigger ) || ( pop && pop.contains(to) ) ) ) { return; } scheduleClose(); }); document.addEventListener('focusin', function(e){ var trigger = e.target.closest('\[data-nl-slp\]'); if ( trigger ) { clearTimeout(closeTimer); if ( openTrigger !== trigger ) openPreview(trigger); } }); document.addEventListener('focusout', function(e){ if ( openTrigger && ! openTrigger.contains(e.relatedTarget) && ( ! pop || ! pop.contains(e.relatedTarget) ) ) { scheduleClose(); } }); document.addEventListener('keydown', function(e){ if ( e.key === 'Escape' && openTrigger ) { var t = openTrigger; closePopover(); t.focus(); } }); window.addEventListener('resize', function(){ if ( openTrigger ) positionPopover(openTrigger); }); })();

'; html += '

Places: ' + d.places + '

'; } html += '

Total before discount: ' + gbp(d.original) + '

'; html += '

Discount applied: \u2013' + gbp(d.amount) + '

'; html += '

**New total: ' + gbp(d.final) + '**

'; html += ''; el.innerHTML = html; } function clearBreakdown() { var el = document.querySelector('.nl-price-breakdown'); if (el) el.innerHTML = ''; } /* ── 4. Local recalculation when places change ── */ function recalcLocal(applied) { var places = getPlaces(); var base = getBase(); var total = base * places; var disc; if (applied.type === 'percentage') { disc = applied.scope === 'one' ? Math.ceil((total / places) * (applied.rate / 100)) : Math.ceil(total * (applied.rate / 100)); } else { disc = applied.scope === 'all' ? Math.ceil(applied.rate * places) : Math.ceil(applied.rate); } disc = Math.min(disc, total); applied.amount = disc; applied.original = total; applied.final = Math.round(total - disc); applied.places = places; setTotal(applied.final); writeBreakdown(applied); syncDiscountFields(applied); } /* ── 5. Modal controller ── */ var M = { el: document.getElementById('nl-dmodal'), input: document.getElementById('nl-dmodal-code'), status: document.getElementById('nl-dmodal-status'), apply: document.getElementById('nl-dmodal-apply'), closeBtn: document.getElementById('nl-dmodal-close'), bd: document.getElementById('nl-dmodal-bd'), open: function() { this.clearStatus(); if (this.input) this.input.value = ''; this.el.classList.add('is-open'); this.el.setAttribute('aria-hidden', 'false'); this.apply.disabled = false; this.apply.classList.remove('is-busy'); setTimeout(function() { if (M.input) M.input.focus(); }, 60); }, close: function() { this.el.classList.remove('is-open'); this.el.setAttribute('aria-hidden', 'true'); }, setStatus: function(msg, type) { this.status.textContent = msg; this.status.className = 'nl-dmodal-status is-' + type; if (this.input) this.input.classList.toggle('is-err', type === 'err'); }, clearStatus: function() { this.status.textContent = ''; this.status.className = 'nl-dmodal-status'; if (this.input) this.input.classList.remove('is-err'); }, setBusy: function(on) { this.apply.disabled = on; this.apply.classList.toggle('is-busy', on); } }; if (M.closeBtn) M.closeBtn.addEventListener('click', function() { M.close(); }); if (M.bd) M.bd.addEventListener('click', function() { M.close(); }); document.addEventListener('keydown', function(e) { if (e.key === 'Escape' && M.el && M.el.classList.contains('is-open')) M.close(); }); /* ── 6b. Sync discount data into hidden form fields ── */ function syncDiscountFields(data) { var codeEl = field('discount_code'); var amtEl = field('discount_amount'); if (codeEl) codeEl.value = data ? data.code : ''; if (amtEl) amtEl.value = data ? data.amount : ''; } /* ── 7. State + trigger rendering ── */ var applied = null; var triggerWrap = null; function renderTrigger() { if (!triggerWrap) return; if (applied) { var tpl = (window.nlDE && window.nlDE.appliedMessage) || 'The discount code **{code}** has been applied \u2014 a discount of **{amount}** will be applied to this booking'; var msg = tpl.replace('{code}', applied.code).replace('{amount}', gbp(applied.amount)); triggerWrap.innerHTML = '' + msg + ''; triggerWrap.querySelector('.nl-discount-remove').addEventListener('click', removeDiscount); } else { var beforeText = (window.nlDE && window.nlDE.beforeText) || 'Have a discount code? | '; var linkText = (window.nlDE && window.nlDE.linkText) || 'Click here to enter your code'; triggerWrap.innerHTML = '' + beforeText + '' + ''; triggerWrap.querySelector('.nl-discount-trigger').addEventListener('click', function(e) { e.stopPropagation(); M.open(); }); } } function removeDiscount() { applied = null; var base = getBase(); setTotal(base * getPlaces()); clearBreakdown(); syncDiscountFields(null); renderTrigger(); } /* ── 8. AJAX apply ── */ function doApply() { var code = M.input ? M.input.value.trim() : ''; if (!code) { M.setStatus('Please enter a discount code.', 'err'); return; } var base = getBase(); if (!isFinite(base) || base <= 0) { M.setStatus('Price could not be determined. Please refresh the page.', 'err'); return; } var fd = new FormData(); fd.append('action', 'nl_validate_discount'); fd.append('code', code); fd.append('email', fieldVal('email', '')); fd.append('price', String(base)); fd.append('places_required', String(getPlaces())); fd.append('price_type', inferPriceType()); fd.append('event_id', fieldVal('event_id', '0')); M.setBusy(true); M.clearStatus(); fetch('https://natureslens.co.uk/wp-admin/admin-ajax.php', { method:'POST', body:fd }) .then(function(r) { return r.json(); }) .then(function(resp) { M.setBusy(false); if (!resp || !resp.success) { M.setStatus((resp && resp.message) ? resp.message : 'Discount unavailable.', 'err'); return; } applied = resp.data; setTotal(applied.final); writeBreakdown(applied); syncDiscountFields(applied); renderTrigger(); M.close(); }) .catch(function() { M.setBusy(false); M.setStatus('Server error \u2014 please try again.', 'err'); }); } if (M.apply) M.apply.addEventListener('click', doApply); if (M.input) M.input.addEventListener('keydown', function(e) { if (e.key === 'Enter') doApply(); }); /* ── 9. Re-calc locally when places change ── */ var placesEl = field('places_required'); if (placesEl) { \['change','input'\].forEach(function(ev) { placesEl.addEventListener(ev, function() { if (applied) { recalcLocal(applied); renderTrigger(); } else { setTotal(getBase() * getPlaces()); } }); }); } /* ── 10. Re-validate discount when email changes ── */ var emailEl = field('email'); if (emailEl) { emailEl.addEventListener('change', function() { if (!applied) return; /* Re-run AJAX validation with the new email */ var base = getBase(); var fd = new FormData(); fd.append('action', 'nl_validate_discount'); fd.append('code', applied.code); fd.append('email', emailEl.value.trim()); fd.append('price', String(base)); fd.append('places_required', String(getPlaces())); fd.append('price_type', inferPriceType()); fd.append('event_id', fieldVal('event_id', '0')); fd.append('revalidate', '1'); fetch('https://natureslens.co.uk/wp-admin/admin-ajax.php', { method:'POST', body:fd }) .then(function(r) { return r.json(); }) .then(function(resp) { if (!resp || !resp.success) { /* Discount no longer valid for this email — remove it */ removeDiscount(); } }) .catch(function() { /* Network error — remove discount to be safe */ removeDiscount(); }); }); } /* ── 11. Diagnostic ── */ function diagnose() { var issues = \[\]; if (!field('places_required')) { issues.push('No places field found — add a form input with name="places_required".'); } if (getBase() <= 0) { issues.push( 'Price could not be determined — ensure a hidden field named "event_cost" is present ' + 'and contains the per-place price (as a plain number), or add an element with ' + 'class="nl-total-price" and a data-original attribute.' ); } return issues; } /* ── 11. Mount ── */ function mount() { var marker = findMarker(); if (!marker) return; triggerWrap = document.createElement('div'); triggerWrap.className = 'nl-discount-trigger-wrap'; marker.parentNode.replaceChild(triggerWrap, marker); var issues = diagnose(); if (issues.length) { triggerWrap.innerHTML = '

**Discount Engine — setup issue:**' + '

' + issues.map(function(i) { return '
- ' + i + '
'; }).join('') + '

'; return; } renderTrigger(); } if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', mount); } else { mount(); } }());
