Send inn skjemaet under, så tar vi kontakt med deg.
(function () { var form = document.getElementById('kontaktskjema'); if (!form) return; // --- Utfylt-markering --- function updateFilled(el) { if (!el || el.type === 'checkbox' || el.type === 'radio' || el.type === 'hidden') return; var v = (el.value || '').toString(); var valid = typeof el.checkValidity === 'function' ? el.checkValidity() : true; if (v.trim() !== '' && valid) el.classList.add('is-filled'); else el.classList.remove('is-filled'); } function updateFieldsetFilled(fs) { if (!fs) return; var inputs = fs.querySelectorAll('input[type=checkbox], input[type=radio]'); var any = false; for (var i = 0; i < inputs.length; i++) { if (inputs[i].checked) { any = true; break; } } if (any) fs.classList.add('is-filled'); else fs.classList.remove('is-filled'); } function updateCheckFilled(cb) { var wrap = cb.closest('.form-check'); if (!wrap) return; if (cb.checked) wrap.classList.add('is-filled'); else wrap.classList.remove('is-filled'); } var fields = form.querySelectorAll('input, select, textarea'); for (var i = 0; i < fields.length; i++) { (function (f) { // Søkefeltet er ikke et skjemafelt som skal merkes som utfylt – // den grønne tilstanden styres kun av om et firma er valgt fra dropdownen. if (f.id === 'firmasoek') return; if (f.type === 'radio' || f.type === 'checkbox') { f.addEventListener('change', function () { var fs = f.closest('fieldset'); if (fs) updateFieldsetFilled(fs); if (!fs) updateCheckFilled(f); // lone checkbox (personvern) }); } else { f.addEventListener('input', function () { updateFilled(f); }); f.addEventListener('change', function () { updateFilled(f); }); } })(fields[i]); } // --- Navnesøk mot Brønnøysundregistrene via internt API --- var sokInput = document.getElementById('firmasoek'); var sokBoks = document.querySelector('.firma-soek'); var sokClear = document.getElementById('firmasoek-clear'); var dropdown = document.getElementById('firmasoek-dropdown'); var firmaStatus = document.getElementById('firma-status'); var orgnrInput = document.getElementById('orgnr'); var firmanavnInput = document.getElementById('firmanavn'); var adresseInput = document.getElementById('adresse'); var postnrInput = document.getElementById('postnr'); var stedInput = document.getElementById('kommune'); var firmaFelter = document.getElementById('firmafelter'); var kontaktFelter = document.getElementById('kontaktfelter'); var firmaSoekBlokk = document.getElementById('firmasoek-blokk'); var privatpersonCheck = document.getElementById('privatperson'); var henvendelsestype = document.getElementById('henvendelsestype'); var kontaktpersonInput = document.getElementById('kontaktperson'); var telefonInput = document.getElementById('telefon'); var epostInput = document.getElementById('epost'); var meldingInput = document.getElementById('melding'); var autoFilled = {}; // husker hva vi sist auto-fylte, så vi ikke overskriver manuelle endringer var debounceTimer = null; var aktivIndeks = -1; var sisteTreff = []; function setStatus(text, color) { if (!firmaStatus) return; firmaStatus.textContent = text || ''; firmaStatus.style.color = color || ''; } function maybeAutoFill(el, nyVerdi) { if (!el || !nyVerdi) return; var current = (el.value || '').toString(); if (current === '' || current === autoFilled[el.id]) { el.value = nyVerdi; autoFilled[el.id] = nyVerdi; updateFilled(el); } } function maybeAutoSelect(sel, nyVerdi) { if (!sel || !nyVerdi) return; var current = (sel.value || '').toString(); if (current === '' || current === autoFilled[sel.id]) { sel.value = nyVerdi; autoFilled[sel.id] = nyVerdi; updateFilled(sel); } } function escapeHtml(s) { return (s || '').replace(/&/g, '&').replace(//g, '>').replace(/"/g, '"'); } function highlight(text, term) { var safe = escapeHtml(text); if (!term) return safe; var safeTerm = escapeHtml(term); var lower = safe.toLowerCase(); var termLower = safeTerm.toLowerCase(); var idx = lower.indexOf(termLower); if (idx < 0) return safe; return safe.substring(0, idx) + '' + safe.substring(idx, idx + safeTerm.length) + '' + safe.substring(idx + safeTerm.length); } function skjulDropdown() { dropdown.hidden = true; dropdown.innerHTML = ''; aktivIndeks = -1; } function visDropdown() { if (!sisteTreff.length) { skjulDropdown(); return; } dropdown.hidden = false; } function settAktiv(nyIdx) { var items = dropdown.querySelectorAll('li[data-idx]'); if (!items.length) return; if (nyIdx < 0) nyIdx=items.length - 1; if (nyIdx>= items.length) nyIdx = 0; for (var i = 0; i < items.length; i++) items[i].classList.remove('active'); items[nyIdx].classList.add('active'); items[nyIdx].scrollIntoView({ block: 'nearest' }); aktivIndeks = nyIdx; } function settFormDisabled(disabled) { var alle = form.querySelectorAll('input, select, textarea, button'); for (var i = 0; i < alle.length; i++) { var f = alle[i]; if (f.id === 'firmasoek' || f.id === 'firmasoek-clear' || f.id === 'privatperson') continue; if (f.type === 'hidden') continue; f.disabled = disabled; } } function rensFyltFraForrigeValg() { // Tøm felter som ble auto-fylt av forrige valg, slik at nytt valg kan fylle dem ['firmanavn', 'adresse', 'postnr', 'kommune'].forEach(function (id) { var el = document.getElementById(id); if (!el) return; if (el.value && el.value === autoFilled[id]) { el.value = ''; delete autoFilled[id]; updateFilled(el); } }); if (orgnrInput) { orgnrInput.value = ''; } } function velgFirma(enhet) { if (!enhet) return; settFormDisabled(false); rensFyltFraForrigeValg(); if (orgnrInput) orgnrInput.value = enhet.orgnr || ''; if (enhet.navn) maybeAutoFill(firmanavnInput, enhet.navn); var a = enhet.forretningsadresse; if (a) { if (a.linjer && a.linjer.length) maybeAutoFill(adresseInput, a.linjer.join(', ')); if (a.postnummer) maybeAutoFill(postnrInput, a.postnummer); // Fyll «Sted» automatisk med poststed (evt. kommune som reserve) var sted = a.poststed || a.kommune; if (sted) { // Normaliser til pen kapitalisering (Brreg leverer ofte STORE BOKSTAVER) sted = sted.toString().toLowerCase().replace(/(^|[\s\-])([a-zæøå])/g, function (m, p1, p2) { return p1 + p2.toUpperCase(); }); maybeAutoFill(stedInput, sted); } } if (firmaFelter) firmaFelter.hidden = false; if (kontaktFelter) kontaktFelter.hidden = false; sokInput.value = enhet.navn || ''; sokInput.setAttribute('readonly', 'readonly'); sokInput.blur(); if (sokBoks) sokBoks.classList.add('valgt'); if (sokClear) sokClear.hidden = false; setStatus('Valgt: ' + enhet.navn + ' · orgnr. ' + enhet.orgnr + (a && a.poststed ? ' · ' + a.poststed : ''), '#00a870'); skjulDropdown(); sisteTreff = []; } function fjernValg() { rensFyltFraForrigeValg(); if (firmaFelter) firmaFelter.hidden = true; // Skjul kontaktfeltene igjen bare hvis vi IKKE er i privatperson-modus if (kontaktFelter && !(privatpersonCheck && privatpersonCheck.checked)) { kontaktFelter.hidden = true; } sokInput.value = ''; sokInput.removeAttribute('readonly'); if (sokBoks) sokBoks.classList.remove('valgt'); if (sokClear) sokClear.hidden = true; sisteTreff = []; skjulDropdown(); settFormDisabled(true); setStatus('Velg et firma så fyller vi ut firmanavn, adresse og orgnr automatisk.', ''); sokInput.focus(); } function renderDropdown(treff, term) { dropdown.innerHTML = ''; sisteTreff = treff || []; if (!sisteTreff.length) { var empty = document.createElement('li'); empty.className = 'empty'; empty.textContent = 'Ingen treff. Skriv inn firmanavnet manuelt hvis du ikke finner det.'; dropdown.appendChild(empty); dropdown.hidden = false; return; } for (var i = 0; i < sisteTreff.length; i++) { (function (idx, e) { var li = document.createElement('li'); li.setAttribute('data-idx', String(idx)); li.setAttribute('role', 'option'); var dato = e.stiftelsesdato || e.registrertDato; var aar = dato ? (', stiftet ' + dato.substring(0, 4)) : ''; var poststed = (e.forretningsadresse && e.forretningsadresse.poststed) ? e.forretningsadresse.poststed : ''; li.innerHTML = '' + highlight(e.navn, term) + '' + ' orgnr. ' + escapeHtml(e.orgnr) + '' + '' + escapeHtml(e.organisasjonsform || '') + aar + (poststed ? ' · ' + escapeHtml(poststed) : '') + ''; li.addEventListener('mousedown', function (ev) { ev.preventDefault(); // hindre blur før click velgFirma(e); }); dropdown.appendChild(li); })(i, sisteTreff[i]); } dropdown.hidden = false; } function soek(term) { setStatus('Søker…', '#666'); fetch('~/API/BrregSoek?navn=' + encodeURIComponent(term), { headers: { 'Accept': 'application/json' } }) .then(function (r) { return r.json(); }) .then(function (data) { var treff = (data && data.treff) ? data.treff : []; renderDropdown(treff, term); setStatus(treff.length ? (treff.length + ' treff – velg ett for å fylle ut skjemaet') : 'Ingen treff', treff.length ? '' : '#6b7280'); }) .catch(function () { setStatus('Kunne ikke søke nå – prøv igjen senere.', '#b00'); }); } if (sokInput) { sokInput.addEventListener('input', function () { if (sokInput.hasAttribute('readonly')) return; var term = (sokInput.value || '').trim(); if (debounceTimer) clearTimeout(debounceTimer); if (term.length < 2) { skjulDropdown(); setStatus('Velg et firma så fyller vi ut firmanavn, adresse og orgnr automatisk.', ''); return; } debounceTimer=setTimeout(function () { soek(term); }, 300); }); sokInput.addEventListener('focus', function () { if (sokInput.hasAttribute('readonly')) return; if (sisteTreff.length) visDropdown(); }); sokInput.addEventListener('blur', function () { setTimeout(skjulDropdown, 200); }); sokInput.addEventListener('keydown', function (e) { if (sokInput.hasAttribute('readonly')) return; if (dropdown.hidden) return; if (e.key === 'ArrowDown') { e.preventDefault(); settAktiv(aktivIndeks + 1); } else if (e.key === 'ArrowUp') { e.preventDefault(); settAktiv(aktivIndeks - 1); } else if (e.key === 'Enter') { var idx=aktivIndeks>= 0 ? aktivIndeks : 0; if (sisteTreff[idx]) { e.preventDefault(); velgFirma(sisteTreff[idx]); } } else if (e.key === 'Escape') { skjulDropdown(); } }); } if (sokClear) { sokClear.addEventListener('click', fjernValg); } // --- Privatperson / bedrift-veksling --- var firmaPakrevdFelter = [firmanavnInput, adresseInput, postnrInput, stedInput]; function settPrivatperson(erPrivat) { if (henvendelsestype) henvendelsestype.value = erPrivat ? 'Privatperson' : 'Bedrift'; if (erPrivat) { // Skjul alt som har med firma å gjøre if (firmaSoekBlokk) firmaSoekBlokk.hidden = true; if (firmaFelter) firmaFelter.hidden = true; // Fjern «required» og tøm firma-feltene så de ikke blokkerer innsending firmaPakrevdFelter.forEach(function (el) { if (!el) return; el.removeAttribute('required'); el.value = ''; el.disabled = true; updateFilled(el); }); if (orgnrInput) orgnrInput.value = ''; autoFilled = {}; // Vis og aktiver kontaktfeltene + melding for privatperson if (kontaktFelter) kontaktFelter.hidden = false; [kontaktpersonInput, telefonInput, epostInput, meldingInput].forEach(function (el) { if (el) el.disabled = false; }); // Personvern-samtykke må fortsatt kunne krysses av var pv = document.getElementById('personvern'); if (pv) pv.disabled = false; var sendBtn = form.querySelector('button[type=submit]'); if (sendBtn) sendBtn.disabled = false; } else { // Tilbake til bedrift-flyt if (firmaSoekBlokk) firmaSoekBlokk.hidden = false; // Sett «required» tilbake på firma-feltene firmaPakrevdFelter.forEach(function (el) { if (el) el.setAttribute('required', 'required'); }); // Nullstill firmasøk og skjul felter til firma velges på nytt fjernValg(); } } if (privatpersonCheck) { privatpersonCheck.addEventListener('change', function () { settPrivatperson(privatpersonCheck.checked); }); } // Initialtilstand: alt bortsett fra søkefeltet er disablet til et firma er valgt. settFormDisabled(true); })();