HMS og SHA
Vi hjelper virksomheter og byggeprosjekter med systematisk HMS- og SHA-arbeid. Våre rådgivere bistår med risikovurderinger, internkontroll, koordinering og praktisk oppfølging av lovpålagte krav. Målet er å skape trygge arbeidsplasser, redusere risiko og bidra til en sikker og effektiv gjennomføring av virksomhetens aktiviteter og prosjekter.
Sikkerhet gjennom systematisk arbeid
Godt HMS- og SHA-arbeid handler om mer enn etterlevelse av lovkrav. Det handler om å identifisere risiko, forebygge hendelser og skape en kultur hvor sikkerhet, helse og arbeidsmiljø er en naturlig del av hverdagen. Gjennom rådgivning, oppfølging og praktisk støtte hjelper vi virksomheter og byggherrer med å ivareta mennesker, verdier og prosjektgjennomføring.
Våre tjenester innen HMS og SHA
Kontakt oss
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); })();