Terms of Use

By accessing this website you agree to use it lawfully and in good faith.

All content is provided for general information and may change without notice. Primetime International is not liable for decisions made solely on the basis of website content.

This is a general placeholder and will be updated with Primetime International's finalised policy.

(function(){ var d=document; d.documentElement.classList.add('js-on'); function onReady(fn){ if(d.readyState!=='loading'){fn();} else {d.addEventListener('DOMContentLoaded',fn);} } function setupReveal(){ var items=d.querySelectorAll('.reveal,[data-count],.skill'); if(!('IntersectionObserver' in window)){ items.forEach(function(el){el.classList.add('in'); if(el.hasAttribute('data-count'))countUp(el); fillSkill(el);}); return; } var io=new IntersectionObserver(function(es){ es.forEach(function(e){ if(e.isIntersecting){ e.target.classList.add('in'); if(e.target.hasAttribute('data-count')) countUp(e.target); if(e.target.classList.contains('skill')) fillSkill(e.target); io.unobserve(e.target); } }); },{threshold:0.15}); items.forEach(function(el){io.observe(el);}); } function countUp(el){ var to=parseFloat(el.getAttribute('data-count'))||0; var suf=el.getAttribute('data-suffix')||''; var dur=1400,start=null; function step(t){ if(!start)start=t; var p=Math.min((t-start)/dur,1); el.textContent=Math.round(p*to)+suf; if(p<1)requestAnimationFrame(step); else el.textContent=to+suf; } requestAnimationFrame(step); } function fillSkill(el){ var f=el.querySelector('.sb-fill'); if(f){ var w=f.getAttribute('data-w')||'0%'; requestAnimationFrame(function(){ f.style.width=w; }); } } function setupLightbox(){ var ov=d.createElement('div'); ov.className='sb-lightbox'; ov.innerHTML='×'; d.body.appendChild(ov); var img=ov.querySelector('img'); d.body.addEventListener('click',function(e){ var hit=e.target.closest('[data-lightbox] img, .lightbox img, .pf-card img, .gallery-grid img, .masonry img, .insta img'); if(hit){ var src=hit.getAttribute('src'); if(src){ img.src=src; ov.classList.add('open'); } return; } if(e.target.classList.contains('sb-lb-close')||e.target.classList.contains('sb-lightbox')){ ov.classList.remove('open'); } }); d.addEventListener('keydown',function(e){ if(e.key==='Escape') ov.classList.remove('open'); }); } function setupFilter(){ d.querySelectorAll('[data-filter-group]').forEach(function(g){ var tabs=g.querySelectorAll('.pf-tab'); tabs.forEach(function(tab){ tab.addEventListener('click',function(){ tabs.forEach(function(t){t.classList.remove('on');}); tab.classList.add('on'); var f=tab.getAttribute('data-filter'); g.querySelectorAll('.pf-item').forEach(function(it){ var show=(f==='*'||it.getAttribute('data-cat')===f); it.style.display=show?'':'none'; }); }); }); }); } function setupSliders(){ d.querySelectorAll('.sb-slider').forEach(function(s){ var track=s.querySelector('.sb-slides'); if(!track||!track.children.length) return; var n=track.children.length, i=0, timer; // dot indicators var dotsWrap=d.createElement('div'); dotsWrap.className='sb-dots'; for(var k=0;k1) s.appendChild(dotsWrap); function sync(){ var bs=dotsWrap.children; for(var j=0;j1) timer=setInterval(function(){ go(i+1); },5000); } sync(); reset(); s.addEventListener('mouseenter',function(){ clearInterval(timer); }); s.addEventListener('mouseleave',reset); }); } function esc(s){ return String(s==null?'':s).replace(/[&<>"]/g,function(c){return {'&':'&','<':'<','>':'>','"':'"'}[c];}); } function setupMusic(){ var M = window.__MUSIC__; if(!M) return; // render the homepage roster from the data var roster = d.querySelector('[data-music-roster]'); if(roster && M.artists){ roster.innerHTML = M.artists.map(function(a){ return '
'+esc(a.name)+'
'+esc(a.genre)+' · '+esc(a.city)+''+esc(a.name)+'▶ View songs
'; }).join(''); } var bar = d.querySelector('.np-bar'); var audio = new Audio(); audio.preload='auto'; var current=null; function fmt(s){ s=Math.floor(s||0); if(!isFinite(s))s=0; var m=Math.floor(s/60); return m+':'+('0'+(s%60)).slice(-2); } function setLabel(){ if(bar&¤t){ var b=bar.querySelector('.meta b'); if(b) b.textContent=current.title+' — '+current.artist; } } function play(){ var p=audio.play(); if(p&&p.catch) p.then(function(){ if(bar)bar.classList.add('playing'); }).catch(function(){ if(bar)bar.classList.remove('playing'); }); } function pause(){ audio.pause(); if(bar)bar.classList.remove('playing'); } function load(track, autoplay){ current=track; audio.src=track.audio; setLabel(); if(autoplay) play(); } audio.addEventListener('timeupdate', function(){ if(bar){ var t=bar.querySelector('.time'); if(t) t.textContent=fmt(audio.currentTime)+' / '+fmt(audio.duration); } }); audio.addEventListener('play', function(){ if(bar)bar.classList.add('playing'); }); audio.addEventListener('pause', function(){ if(bar)bar.classList.remove('playing'); }); if(bar){ var disc=bar.querySelector('.np-disc'); if(disc){ var pp=d.createElement('span'); pp.className='pp'; disc.appendChild(pp); var sync=function(){ pp.textContent = audio.paused ? '▶' : '❚❚'; }; audio.addEventListener('play',sync); audio.addEventListener('pause',sync); sync(); } bar.addEventListener('click', function(e){ e.stopPropagation(); if(audio.paused) play(); else pause(); }); } // featured track loaded + autoplay attempt; if blocked, start on first interaction if(M.featured){ load(M.featured, false); play(); } function firstInteract(){ if(audio.paused && current) play(); d.removeEventListener('pointerdown', firstInteract); d.removeEventListener('keydown', firstInteract); } d.addEventListener('pointerdown', firstInteract); d.addEventListener('keydown', firstInteract); // artist modal var modal=d.createElement('div'); modal.className='sb-modal'; modal.innerHTML='
'; d.body.appendChild(modal); function openArtist(id){ var a=(M.artists||[]).filter(function(x){return x.id===id;})[0]; if(!a) return; modal.querySelector('img').src=a.image||''; modal.querySelector('.sb-modal-head b').textContent=a.name; modal.querySelector('.sb-modal-head span').textContent=(a.genre||'')+' · '+(a.city||''); var list=modal.querySelector('.sb-songs'); list.innerHTML=''; (a.songs||[]).forEach(function(s){ var row=d.createElement('div'); row.className='sb-song'; row.innerHTML='
'; row.querySelector('.t b').textContent=s.title; row.querySelector('.t span').textContent=a.name; row.querySelector('.dur').textContent=s.duration||''; row.querySelector('.play').addEventListener('click', function(){ load({title:s.title, artist:a.name, audio:s.audio}, true); list.querySelectorAll('.sb-song').forEach(function(r){ r.classList.remove('playing'); }); row.classList.add('playing'); }); list.appendChild(row); }); modal.classList.add('open'); } d.body.addEventListener('click', function(e){ var card=e.target.closest('[data-artist-id]'); if(card){ openArtist(card.getAttribute('data-artist-id')); return; } if(e.target.classList.contains('sb-modal')||e.target.classList.contains('sb-modal-close')) modal.classList.remove('open'); }); d.addEventListener('keydown', function(e){ if(e.key==='Escape') modal.classList.remove('open'); }); } function setupTimers(){ d.querySelectorAll('.sb-timer').forEach(function(t){ var mins=parseInt(t.getAttribute('data-mins'),10)||60; var deadline=Date.now()+mins*60000; var h=t.querySelector('[data-h]'), m=t.querySelector('[data-m]'), s=t.querySelector('[data-s]'); function pad(n){ return (n<10?'0':'')+n; } function tick(){ var diff=Math.max(0, deadline-Date.now()), sec=Math.floor(diff/1000); if(h) h.textContent=pad(Math.floor(sec/3600)); if(m) m.textContent=pad(Math.floor((sec%3600)/60)); if(s) s.textContent=pad(sec%60); if(diff>0) setTimeout(tick,1000); } tick(); }); } // Lead-capture popup: timed + exit-intent + click triggers. Activates only // when a [data-popup] element exists. Shows once per session per page. function setupPopup(){ var p=d.querySelector('[data-popup]'); if(!p) return; var key='cf_pop_'+(location.pathname||'/'); function seen(){ try{return sessionStorage.getItem(key);}catch(e){return false;} } function mark(){ try{sessionStorage.setItem(key,'1');}catch(e){} } function open(){ p.classList.add('open'); } function close(){ p.classList.remove('open'); } function auto(){ if(seen())return; open(); mark(); } var delay=parseInt(p.getAttribute('data-delay'),10); if(!isFinite(delay))delay=15; setTimeout(auto, delay*1000); d.addEventListener('mouseout', function(e){ if(e.clientY<=0 && !e.relatedTarget) auto(); }); d.addEventListener('click', function(e){ if(e.target.closest('[data-popup-open]')){ e.preventDefault(); open(); } else if(e.target.closest('[data-popup-close]') || e.target===p) close(); }); d.addEventListener('keydown', function(e){ if(e.key==='Escape') close(); }); } // Sticky CTA bar: reveals after the visitor scrolls. Activates if .scta exists. function setupStickyBar(){ var bar=d.querySelector('.scta'); if(!bar) return; function on(){ if(window.pageYOffset>520) bar.classList.add('show'); else bar.classList.remove('show'); } window.addEventListener('scroll', on, {passive:true}); on(); bar.addEventListener('click', function(e){ if(e.target.closest('[data-scta-close]')) bar.classList.add('hide'); }); } // Image resilience: primary photos are real (Unsplash). If a photo can't load // (e.g. the network blocks the image CDN) we swap it for a clean, theme-coloured // image panel — deterministic, never a random stock photo, never a broken icon. function setupImgFallback(){ function soft(w,h){ var c=(getComputedStyle(d.body).getPropertyValue('--primary')||'#3b66d9').trim()||'#3b66d9'; var cw=Math.round(w*0.42), ch=Math.round(h*0.42), cx=Math.round((w-cw)/2), cy=Math.round((h-ch)/2); var s="" +"" +"" +"" +"" +"" +"" +""; return "data:image/svg+xml,"+encodeURIComponent(s); } [].forEach.call(d.querySelectorAll('img'),function(im){ var src=String(im.getAttribute('src')||''); if(!src || src.indexOf('data:')===0) return; // skip empty-src imgs (e.g. the lightbox) if(im.closest && im.closest('.sb-lightbox')) return; var w=(im.getAttribute('width')|0)||im.clientWidth||800; var h=(im.getAttribute('height')|0)||im.clientHeight||600; function fail(){ im.onerror=null; im.src=soft(Math.max(200,w),Math.max(150,h)); } im.addEventListener('error',fail); if(im.complete && im.naturalWidth===0) fail(); }); } // Make every contact / newsletter / enquiry form actually work. Any form that // isn't already natively posting to /lead (e.g. starter blocks with // onsubmit="return false") is captured and submitted to /lead via fetch, so // the message lands in the Leads inbox. Fixes older saved pages too. function setupForms(){ [].forEach.call(d.querySelectorAll('form'), function(f){ var action=(f.getAttribute('action')||'').trim(); var inlineBlocked=f.getAttribute('onsubmit'); // Leave true native lead forms alone — they post and redirect on their own. if(action.indexOf('/lead')===0 && !inlineBlocked) return; if(!f.querySelector('input,textarea')) return; f.setAttribute('action','/lead'); f.setAttribute('method','post'); f.removeAttribute('onsubmit'); f.addEventListener('submit', function(e){ e.preventDefault(); var body=new URLSearchParams(); [].forEach.call(f.querySelectorAll('input,textarea,select'), function(el){ if(el.type==='submit'||el.type==='button') return; var key=el.getAttribute('name'); if(!key){ var ph=((el.getAttribute('placeholder')||el.getAttribute('aria-label')||'')+'').toLowerCase(); var ty=(el.type||'').toLowerCase(); if(ty==='email'||/email|e-mail/.test(ph)) key='email'; else if(ty==='tel'||/phone|mobile|number|whatsapp/.test(ph)) key='phone'; else if(el.tagName==='TEXTAREA'||/message|help|comment|enquir|inquir|tell us/.test(ph)) key='message'; else if(/name/.test(ph)) key='name'; else key='message'; } if(el.value) body.append(key, el.value); }); if(!body.has('source')) body.append('source', (d.title||'Website')+' — contact form'); var btn=f.querySelector('button,[type=submit]'); var orig=btn?btn.innerHTML:''; if(btn){ btn.disabled=true; btn.innerHTML='Sending…'; } fetch('/lead',{method:'POST',headers:{'Content-Type':'application/x-www-form-urlencoded'},body:body.toString()}) .then(function(r){ return r.ok||r.status<400 ? true : Promise.reject(); }) .then(function(){ f.innerHTML='
Thanks — we've received your message and will be in touch shortly.
'; }) .catch(function(){ if(btn){btn.disabled=false;btn.innerHTML=orig;} alert('Sorry, something went wrong. Please try again.'); }); }); }); } // Donation widget: amount chips + one-time/monthly toggle + PAN (for 80G). Composes // a message/source then submits natively to /lead so the donation intent is captured. function setupDonate(){ [].forEach.call(d.querySelectorAll('[data-donate]'), function(f){ var amtInput=f.querySelector('[name=amount]'), freqInput=f.querySelector('[name=frequency]'), custom=f.querySelector('[data-custom]'); f.addEventListener('click', function(e){ var a=e.target.closest&&e.target.closest('[data-amt]'); if(a){ e.preventDefault(); [].forEach.call(f.querySelectorAll('[data-amt]'),function(b){b.classList.remove('on');}); a.classList.add('on'); var v=a.getAttribute('data-amt'); if(v==='custom'){ if(custom){ custom.style.display=''; custom.focus(); } if(amtInput) amtInput.value=''; } else { if(custom) custom.style.display='none'; if(amtInput) amtInput.value=v; } return; } var fr=e.target.closest&&e.target.closest('[data-freq]'); if(fr){ e.preventDefault(); [].forEach.call(f.querySelectorAll('[data-freq]'),function(b){b.classList.remove('on');}); fr.classList.add('on'); if(freqInput) freqInput.value=fr.getAttribute('data-freq'); } }); if(custom) custom.addEventListener('input', function(){ if(amtInput) amtInput.value=custom.value; }); f.addEventListener('submit', function(){ var amt=(amtInput&&amtInput.value)||'', freq=(freqInput&&freqInput.value)||'one-time'; var panEl=f.querySelector('[name=pan]'), pan=(panEl&&panEl.value)||''; var msg=f.querySelector('[name=message]'); if(msg) msg.value='Donation: \u20b9'+amt+' ('+freq+')'+(pan?' \u00b7 PAN: '+pan:''); var src=f.querySelector('[name=source]'); if(src) src.value='Donation \u20b9'+amt+' ('+freq+')'; }); }); } onReady(function(){ setupReveal(); setupLightbox(); setupFilter(); setupSliders(); setupMusic(); setupTimers(); setupPopup(); setupStickyBar(); setupImgFallback(); setupForms(); setupDonate(); }); })();