{"id":611,"date":"2026-08-08T19:54:49","date_gmt":"2026-08-08T17:54:49","guid":{"rendered":"https:\/\/www.dr-reinigingstechniek.eu\/downloads\/"},"modified":"2026-10-31T20:44:04","modified_gmt":"2026-10-31T19:44:04","slug":"downloads","status":"publish","type":"page","link":"https:\/\/www.dr-reinigingstechniek.eu\/en\/downloads\/","title":{"rendered":"Downloads"},"content":{"rendered":"\n<script type=\"application\/ld+json\">{\"@context\":\"https:\/\/schema.org\",\"@type\":\"BreadcrumbList\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/dr-reinigingstechniek.eu\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Downloads\",\"item\":\"https:\/\/dr-reinigingstechniek.eu\/downloads\"}]}<\/script>\n<div id=\"main-content\">\n<div id=\"downloads-content\"><section class=\"machines-page-hero downloads-hero\" aria-labelledby=\"downloads-title\"><div class=\"machines-page-hero-image downloads-hero-image service-category-visual-downloads\" role=\"img\" aria-label=\"Technical documentation, manuals and downloads from DR Reinigingstechniek\"><\/div><div class=\"shell machines-page-hero-inner\"><div class=\"machines-page-hero-copy\"><div class=\"eyebrow\"><span><\/span> Documentation centre<\/div><h1 id=\"downloads-title\">Downloads &amp; documentation<\/h1><p>Find public product information and, after authentication, technical documentation for authorised dealers.<\/p><div class=\"page-breadcrumb\"><a href=\"\/en\/\">Home<\/a><span>\/<\/span><strong>Downloads<\/strong><\/div><\/div><\/div><\/section><section class=\"downloads-section downloads-public-section\" aria-labelledby=\"public-downloads-title\"><div class=\"shell\"><div class=\"catalog-heading downloads-heading\"><div><div class=\"eyebrow\"><span><\/span> Public downloads<\/div><h2 id=\"public-downloads-title\">Documents for customers and users<\/h2><\/div><p>Manuals, brochures and public product information can later be loaded dynamically into this section.<\/p><\/div><div id=\"downloads-filter-tabs\" class=\"filter-tabs\" role=\"tablist\" aria-label=\"Filter by machine\"><\/div><div id=\"downloads-list\" class=\"downloads-grid\" role=\"list\" aria-live=\"polite\" aria-busy=\"false\"><\/div><p id=\"downloads-status\" class=\"downloads-status\" role=\"status\" aria-live=\"polite\"><\/p><\/div><\/section><section class=\"downloads-section downloads-dealer-section\" aria-labelledby=\"dealer-downloads-title\"><div class=\"shell\"><div class=\"dealer-downloads-panel\"><div class=\"dealer-downloads-intro\"><div class=\"dealer-lock-icon\" aria-hidden=\"true\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"5\" y=\"10\" width=\"14\" height=\"11\" rx=\"2\"><\/rect><path d=\"M8 10V7a4 4 0 0 1 8 0v3M12 14v3\"><\/path><\/svg><\/div><div><div class=\"eyebrow\"><span><\/span> Protected dealer area<\/div><h2 id=\"dealer-downloads-title\">Technical dealer documentation<\/h2><p>After valid dealer authentication, the portal can load service manuals, diagnostic documentation and technical files into the empty dealer container via JavaScript.<\/p><\/div><a href=\"\/en\/my-account\/\" class=\"button button-primary\">Log in as a dealer <span class=\"arrow arrow-short\" aria-hidden=\"true\">\u2192<\/span><\/a><\/div><div id=\"dealer-downloads-list\" class=\"downloads-grid dealer-downloads-grid\" role=\"list\" aria-live=\"polite\" aria-busy=\"false\" data-access=\"dealer\"><\/div><p id=\"dealer-downloads-status\" class=\"downloads-status dealer-downloads-status\" role=\"status\" aria-live=\"polite\"><\/p><\/div><\/div><\/section><section class=\"downloads-help-section\" aria-labelledby=\"downloads-help-title\"><div class=\"shell downloads-help-panel\"><div><div class=\"eyebrow\"><span><\/span> Document not found?<\/div><h2 id=\"downloads-help-title\">Request the right file from us<\/h2><p>State the machine, robot or part model and preferably the serial number. That way we can supply the right document version.<\/p><\/div><a href=\"mailto:info@reinigingstechniek.eu?subject=Aanvraag%20documentatie\" class=\"button button-primary\">Request documentation <span class=\"arrow arrow-short\" aria-hidden=\"true\">\u2192<\/span><\/a><\/div><\/section><section class=\"trust-strip\" aria-label=\"Our strengths\"><div class=\"shell trust-grid\"><div class=\"trust-item\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10Z\"><\/path><path d=\"m9 12 2 2 4-5\"><\/path><\/svg><div><strong>26 years of experience<\/strong><span>Family business with expertise<\/span><\/div><\/div><div class=\"trust-item\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M14.7 6.3a4 4 0 0 0-5-5l2.1 2.1-2.4 2.4-2.1-2.1a4 4 0 0 0 5 5L5 16l-2 4 4-2 7.7-7.7Z\"><\/path><\/svg><div><strong>Service in our own workshop<\/strong><span>Mechanics, electronics and R&amp;D<\/span><\/div><\/div><div class=\"trust-item\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"m21 8-9 5-9-5 9-5 9 5Z\"><\/path><path d=\"m3 8 9 5 9-5v9l-9 5-9-5V8Z\"><\/path><path d=\"M12 13v9\"><\/path><\/svg><div><strong>Available immediately<\/strong><span>New and refurbished machines in stock<\/span><\/div><\/div><\/div><\/section><\/div>\n<\/div>\n<script>\n(() => {\n  'use strict';\n  const SITE_ORIGIN = 'https:\/\/dr-reinigingstechniek.eu';\n  const targets = {\n    public: { list: 'downloads-list', status: 'downloads-status' },\n    dealer: { list: 'dealer-downloads-list', status: 'dealer-downloads-status' }\n  };\n\n  const allowedUrl = (value) => {\n    if (typeof value !== 'string' || !value.trim()) return false;\n    if (value.startsWith('\/')) return true;\n    try { return new URL(value).origin === SITE_ORIGIN; } catch { return false; }\n  };\n\n  const text = (value, fallback = '') => typeof value === 'string' && value.trim() ? value.trim() : fallback;\n\n  const createCard = (item) => {\n    if (!item || !allowedUrl(item.url)) return null;\n    const card = document.createElement('article');\n    card.className = 'download-card';\n    card.setAttribute('role', 'listitem');\n\n    const type = document.createElement('span');\n    type.className = 'download-card-type';\n    type.textContent = text(item.type, 'Document');\n\n    const heading = document.createElement('h3');\n    heading.textContent = text(item.title, 'Document');\n\n    const description = document.createElement('p');\n    description.textContent = text(item.description, 'Open het document voor meer informatie.');\n\n    const meta = document.createElement('div');\n    meta.className = 'download-card-meta';\n    meta.textContent = [text(item.language), text(item.version), text(item.size)].filter(Boolean).join(' \u00b7 ');\n    meta.hidden = !meta.textContent;\n\n    const link = document.createElement('a');\n    link.className = 'download-card-link';\n    link.href = item.url;\n    link.target = '_top';\n    link.rel = 'noopener';\n    link.textContent = text(item.linkLabel, 'Download document \u2192');\n    if (item.download === true) link.setAttribute('download', '');\n\n    card.append(type, heading, description, meta, link);\n    return card;\n  };\n\n  const render = (scope, items, options = {}) => {\n    const target = targets[scope];\n    if (!target) throw new Error('Onbekende downloadsectie.');\n    const list = document.getElementById(target.list);\n    const status = document.getElementById(target.status);\n    if (!list || !status) throw new Error('Downloadcontainer ontbreekt.');\n    list.replaceChildren();\n    list.setAttribute('aria-busy', 'false');\n    const collection = Array.isArray(items) ? items : [];\n    const fragment = document.createDocumentFragment();\n    let rendered = 0;\n    collection.forEach((item) => {\n      const card = createCard(item);\n      if (card) { fragment.append(card); rendered += 1; }\n    });\n    list.append(fragment);\n    status.textContent = rendered ? text(options.successMessage, rendered + (rendered === 1 ? ' document beschikbaar.' : ' documenten beschikbaar.')) : text(options.emptyMessage, 'Er zijn momenteel geen documenten beschikbaar.');\n    return rendered;\n  };\n\n  const load = async (scope, endpoint, options = {}) => {\n    if (!allowedUrl(endpoint)) throw new Error('Alleen interne .eu-downloadbronnen zijn toegestaan.');\n    const target = targets[scope];\n    if (!target) throw new Error('Onbekende downloadsectie.');\n    const list = document.getElementById(target.list);\n    const status = document.getElementById(target.status);\n    list.setAttribute('aria-busy', 'true');\n    status.textContent = text(options.loadingMessage, 'Documenten worden geladen\u2026');\n    try {\n      const response = await fetch(endpoint, { credentials: 'same-origin', headers: { Accept: 'application\/json' } });\n      if (!response.ok) throw new Error('Downloadbron antwoordde met status ' + response.status + '.');\n      const payload = await response.json();\n      const items = Array.isArray(payload) ? payload : payload.items;\n      return render(scope, items, options);\n    } catch (error) {\n      list.replaceChildren();\n      list.setAttribute('aria-busy', 'false');\n      status.textContent = text(options.errorMessage, 'De documenten konden niet worden geladen.');\n      throw error;\n    }\n  };\n\n  window.DRDownloads = Object.freeze({\n    renderPublic: (items, options) => render('public', items, options),\n    renderDealer: (items, options) => render('dealer', items, options),\n    loadPublic: (endpoint, options) => load('public', endpoint, options),\n    loadDealer: (endpoint, options) => load('dealer', endpoint, options),\n    clear: () => { render('public', [], { emptyMessage: '' }); render('dealer', [], { emptyMessage: '' }); }\n  });\n})();\n<\/script>\n<script>\n(() => {\n  const ALL_LABEL = 'Alles';\n\n  const text = (value, fallback = '') => typeof value === 'string' && value.trim() ? value.trim() : fallback;\n\n  const allowedUrl = (value) => {\n    if (typeof value !== 'string' || !value.trim()) return false;\n    if (value.startsWith('\/')) return true;\n    try { return new URL(value).origin === window.location.origin; } catch { return false; }\n  };\n\n  const createCard = (item) => {\n    if (!item || !allowedUrl(item.url)) return null;\n    const card = document.createElement('article');\n    card.className = 'download-card';\n    card.setAttribute('role', 'listitem');\n    card.dataset.category = text(item.category, 'Overig');\n\n    const type = document.createElement('span');\n    type.className = 'download-card-type';\n    type.textContent = text(item.type, 'Document');\n\n    const heading = document.createElement('h3');\n    heading.textContent = text(item.title, 'Document');\n\n    const description = document.createElement('p');\n    description.textContent = text(item.description, 'Open het document voor meer informatie.');\n\n    const meta = document.createElement('div');\n    meta.className = 'download-card-meta';\n    meta.textContent = [text(item.language), text(item.version), text(item.size)].filter(Boolean).join(' \u00b7 ');\n    meta.hidden = !meta.textContent;\n\n    const link = document.createElement('a');\n    link.className = 'download-card-link';\n    link.href = item.url;\n    link.target = '_top';\n    link.rel = 'noopener';\n    link.textContent = text(item.linkLabel, 'Download document \u2192');\n    if (item.download === true) link.setAttribute('download', '');\n\n    card.append(type, heading, description, meta, link);\n    return card;\n  };\n\n  const buildTabs = (tabsEl, categories, onSelect) => {\n    tabsEl.replaceChildren();\n    const allBtn = document.createElement('button');\n    allBtn.type = 'button';\n    allBtn.textContent = ALL_LABEL;\n    allBtn.className = 'active';\n    allBtn.setAttribute('aria-pressed', 'true');\n    allBtn.addEventListener('click', () => onSelect(null, allBtn));\n    tabsEl.append(allBtn);\n\n    categories.forEach((cat) => {\n      const btn = document.createElement('button');\n      btn.type = 'button';\n      btn.textContent = cat;\n      btn.setAttribute('aria-pressed', 'false');\n      btn.addEventListener('click', () => onSelect(cat, btn));\n      tabsEl.append(btn);\n    });\n  };\n\n  const loadCategorized = async (endpoint, listId, statusId, tabsId, options = {}) => {\n    const list = document.getElementById(listId);\n    const status = document.getElementById(statusId);\n    const tabsEl = tabsId ? document.getElementById(tabsId) : null;\n    if (!list || !status) return;\n\n    list.setAttribute('aria-busy', 'true');\n    status.textContent = text(options.loadingMessage, 'Documenten worden geladen\u2026');\n\n    try {\n      const response = await fetch(endpoint, { credentials: 'same-origin', headers: { Accept: 'application\/json' } });\n      if (!response.ok) throw new Error('Downloadbron antwoordde met status ' + response.status + '.');\n      const payload = await response.json();\n      const items = Array.isArray(payload) ? payload : payload.items || [];\n\n      list.replaceChildren();\n      list.setAttribute('aria-busy', 'false');\n\n      if (!items.length) {\n        status.textContent = text(options.emptyMessage, 'Er zijn momenteel geen documenten beschikbaar.');\n        if (tabsEl) tabsEl.hidden = true;\n        return;\n      }\n\n      const fragment = document.createDocumentFragment();\n      items.forEach((item) => {\n        const card = createCard(item);\n        if (card) fragment.append(card);\n      });\n      list.append(fragment);\n      status.textContent = text(options.successMessage, items.length + (items.length === 1 ? ' document beschikbaar.' : ' documenten beschikbaar.'));\n\n      if (tabsEl) {\n        const categories = [...new Set(items.map((item) => text(item.category, 'Overig')))];\n        if (categories.length > 1) {\n          tabsEl.hidden = false;\n          buildTabs(tabsEl, categories, (category, activeBtn) => {\n            tabsEl.querySelectorAll('button').forEach((btn) => {\n              btn.classList.toggle('active', btn === activeBtn);\n              btn.setAttribute('aria-pressed', btn === activeBtn ? 'true' : 'false');\n            });\n            list.querySelectorAll('.download-card').forEach((card) => {\n              card.hidden = category !== null && card.dataset.category !== category;\n            });\n          });\n        } else {\n          tabsEl.hidden = true;\n        }\n      }\n    } catch (error) {\n      list.replaceChildren();\n      list.setAttribute('aria-busy', 'false');\n      status.textContent = text(options.errorMessage, 'De documenten konden niet worden geladen.');\n      if (tabsEl) tabsEl.hidden = true;\n    }\n  };\n\n  loadCategorized(\n    '\/wp-content\/uploads\/pages\/downloads-data-public.json',\n    'downloads-list', 'downloads-status', 'downloads-filter-tabs',\n    { emptyMessage: 'Er zijn momenteel nog geen publieke documenten beschikbaar. Neem contact op voor specifieke documentatie.' }\n  );\n  loadCategorized(\n    '\/wp-content\/uploads\/pages\/downloads-data-dealer.json',\n    'dealer-downloads-list', 'dealer-downloads-status', null,\n    { emptyMessage: 'Log in als dealer om technische documentatie te bekijken.' }\n  );\n})();\n<\/script>\n","protected":false},"excerpt":{"rendered":"<p>Documentation centre Downloads &amp; documentation Find public product information and, after authentication, technical documentation for authorised dealers. Home\/Downloads Public downloads Documents for customers and users Manuals, brochures and public product information can later be loaded dynamically into this section. Protected dealer area Technical dealer documentation After valid dealer authentication, the portal can load service manuals, [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"blank-page","meta":{"_dr_native":"1","_dr_lang":"en","_dr_translations":"{\"nl\":123}","footnotes":""},"class_list":["post-611","page","type-page","status-publish","hentry"],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.dr-reinigingstechniek.eu\/en\/wp-json\/wp\/v2\/pages\/611","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.dr-reinigingstechniek.eu\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.dr-reinigingstechniek.eu\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.dr-reinigingstechniek.eu\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dr-reinigingstechniek.eu\/en\/wp-json\/wp\/v2\/comments?post=611"}],"version-history":[{"count":1,"href":"https:\/\/www.dr-reinigingstechniek.eu\/en\/wp-json\/wp\/v2\/pages\/611\/revisions"}],"predecessor-version":[{"id":658,"href":"https:\/\/www.dr-reinigingstechniek.eu\/en\/wp-json\/wp\/v2\/pages\/611\/revisions\/658"}],"wp:attachment":[{"href":"https:\/\/www.dr-reinigingstechniek.eu\/en\/wp-json\/wp\/v2\/media?parent=611"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}