// ==UserScript==
// @name Platesmania Lookup Toolbox
// @version 1.6.0
// @description Shows one lookup button per site (if multiple) on Platesmania upload pages.
// @match https://platesmania.com/*/add*
// @grant GM_setValue
// @license MIT
// @namespace https://greasyfork.org/users/976031
// ==/UserScript==
(function () {
'use strict';
const lookupSites = {
nl: [
{ name: 'finnik.nl', base: 'https://finnik.nl/kenteken/' },
{ name: 'rdwdata.nl', base: 'https://www.rdwdata.nl/kenteken/' },
{ name: 'autoweek.nl', base: 'https://www.autoweek.nl/kentekencheck/' },
],
se: [
{ name: 'car.info', base: 'https://www.car.info/?s=' },
{ name: 'biluppgifter.se', base: 'https://biluppgifter.se/fordon/' },
{ name: 'transportstyrelsen', base: 'https://fordon-fu-regnr.transportstyrelsen.se/?ts-regnr-sok=' },
],
ua: [
{ name: 'carplates.app', base: 'https://ua.carplates.app/en/number/' },
{ name: 'baza-gai.com.ua', base: 'https://baza-gai.com.ua/nomer/' },
{ name: 'auto-inform.com.ua', base: 'https://auto-inform.com.ua/search/' },
],
uk: [
{ name: 'checkcardetails.co.uk', base: 'https://www.checkcardetails.co.uk/cardetails/' },
{ name: 'totalcarcheck.co.uk', base: 'https://totalcarcheck.co.uk/FreeCheck?regno=' },
{ name: 'checkhistory.co.uk', base: 'https://checkhistory.uk/vehicle/' },
],
no: [{ name: 'vegvesen.no', base: 'https://www.vegvesen.no/en/vehicles/buy-and-sell/vehicle-information/check-vehicle-information/?registreringsnummer=' }],
dk: [{ name: 'digitalservicebog.dk', base: 'https://app.digitalservicebog.dk/search?country=dk&Registration=' }],
fr: [{ name: 'immatriculation-auto.info', base: 'https://immatriculation-auto.info/vehicle/' }],
fi: [{ name: 'motonet.fi (API)', base: 'https://www.motonet.fi/api/vehicleInfo/registrationNumber/FI?locale=fi®istrationNumber=' }],
cz: [{ name: 'uniqa.cz', base: 'https://www.uniqa.cz/online/pojisteni-vozidla/#ecvId=' }],
};
const url = window.location.href;
const is = (code) => url.includes(`platesmania.com/${code}/add`);
const supportedCodes = ['nl','ua','no','dk','fr','uk','fi','pl','lt','cz','se'];
function isLookupSiteAvailable() {
return supportedCodes.some(is);
}
function areFieldsFilled() {
if (is('nl')) return document.getElementById('nomer').value !== '';
if (is('ua')) {
const region = document.getElementById('region1').value;
const digits = document.getElementById('digit1').value;
return region !== '' && digits !== '';
}
if (is('no') || is('dk') || is('se'))
return document.getElementById('let').value !== '' && document.getElementById('digit').value !== '';
if (is('fr')) {
const b1 = document.getElementById('b1').value;
const d2 = document.getElementById('digit2').value;
const b2 = document.getElementById('b2').value;
return b1 !== '' && d2 !== '' && b2 !== '';
}
if (is('de') || is('ch')) return document.getElementById('digit').value !== '';
if (is('pl') || is('uk')) return document.getElementById('nomerpl').value !== '';
if (is('fi')) return document.getElementById('digit').value !== '';
if (is('lt')) return document.getElementById('digit2').value !== '';
if (is('cz')) {
const d1 = document.getElementById('digit1').value;
const d2 = document.getElementById('digit2').value;
const d3 = document.getElementById('digit3').value;
const nomer = document.getElementById('nomer').value;
return d1 !== '' || d2 !== '' || d3 !== '' || nomer !== '';
}
return false;
}
function buildPlateForCurrentPage() {
if (is('nl')) return document.getElementById('nomer').value;
if (is('ua')) {
const region = document.getElementById('region1').value;
const digits = document.getElementById('digit1').value;
const b1 = document.getElementById('b1').value;
const b2 = document.getElementById('b2').value;
return `${region}${digits}${b1}${b2}`;
}
if (is('no') || is('dk') || is('se')) {
const letField = document.getElementById('let').value;
const digitField = document.getElementById('digit').value;
return `${letField}${digitField}`;
}
if (is('fr')) {
const b1 = document.getElementById('b1').value;
const digit2 = document.getElementById('digit2').value;
const b2 = document.getElementById('b2').value;
return `${b1}${digit2}${b2}`;
}
if (is('fi')) {
const letField = document.getElementById('let1').value;
const digitField = document.getElementById('digit').value;
return `${letField}-${digitField}`;
}
if (is('uk')) {
return document.getElementById('nomerpl').value;
}
if (is('pl')) {
const regionField = document.getElementById('region');
const selectedRegionText = regionField.options[regionField.selectedIndex].text;
const digitField = document.getElementById('nomerpl').value;
return `${selectedRegionText}${digitField}`;
}
if (is('lt')) {
const b1 = document.getElementById('b1');
const b2 = document.getElementById('b2');
const b3 = document.getElementById('b3');
const d1 = document.getElementById('digit1');
const d2 = document.getElementById('digit2');
const d3 = document.getElementById('digit3');
const vanity = document.getElementById('nomer');
const ctype = document.getElementById('ctype').value;
if (ctype === '1') return b1.value + b2.value + b3.value + d2.value;
if (ctype === '2') return d1.value + b1.value + b2.value;
if (ctype === '3') return b1.value + b2.value + d2.value;
if (ctype === '4') return d1.value + b1.value + b2.value + b3.value;
if (['5','6','7','9'].includes(ctype)) return vanity.value;
if (ctype === '8') return d3.value + b1.value + b2.value;
return '';
}
if (is('cz')) {
const q = (id) => document.getElementById(id)?.value || '';
const category = q('ctype');
const regionField = document.getElementById('region');
const selectedRegionText = regionField.options[regionField.selectedIndex].text;
const b1 = q('b1'), b2 = q('b2'), b3 = q('b3');
const d1 = q('digit1'), d2 = q('digit2'), d3 = q('digit3');
const nomer = q('nomer'), el = q('el');
switch (category) {
case '1': return `${b1}${selectedRegionText}${b2}${d1}`;
case '2': return `${b1}${selectedRegionText}${d1}`;
case '4': return `${selectedRegionText}${b2}${d1}`;
case '5': return `${selectedRegionText}${b2}${d1}`;
case '6': return `${selectedRegionText}${b2}${d1}`;
case '7': return `${selectedRegionText}${b2}${d2}`;
case '8': return `${selectedRegionText}${b2}${d2}`;
case '9': return `${selectedRegionText}${b2}${d2}`;
case '10': return `${selectedRegionText}${b2}${d2}`;
case '11': return nomer;
case '3': return nomer;
case '12': return `${el}${b3}${d3}`;
case '13': return `${d1}${d3}`;
default: return '';
}
}
return '';
}
function createOrUpdateLookupButtons() {
const host = document.getElementById('zoomimgid');
if (!host) return;
let container = document.getElementById('lookupButtonsContainer');
if (!isLookupSiteAvailable()) {
if (container) container.remove();
return;
}
if (!container) {
container = document.createElement('div');
container.id = 'lookupButtonsContainer';
container.style.display = 'grid';
container.style.gap = '6px';
host.parentNode.insertBefore(container, host);
} else {
container.innerHTML = '';
}
const fieldsOk = areFieldsFilled();
const plate = fieldsOk ? buildPlateForCurrentPage() : '';
const code = supportedCodes.find(is);
// Countries with special flows
const specialPL = is('pl');
const specialLT = is('lt');
const sites = lookupSites[code] || [];
// PL special flow (POST via query param)
if (specialPL) {
const btn = makeBtn('Lookup', !fieldsOk, () => {
const plateNumber = buildPlateForCurrentPage();
const targetUrl =
`https://moj.gov.pl/nforms/engine/ng/index?nfWidReset=true&xFormsAppName=NormaEuro&xFormsOrigin=EXTERNAL&plateNumber=${encodeURIComponent(plateNumber)}#/search`;
window.open(targetUrl, '_blank');
});
container.appendChild(btn);
return;
}
// LT special POST form
if (specialLT) {
const btn = makeBtn('Lookup', !fieldsOk, () => {
const plateNumber = buildPlateForCurrentPage();
let form = document.createElement('form');
form.action = 'https://www.cab.lt/draustumo-patikra/';
form.method = 'POST';
form.target = '_blank';
let inputCountry = document.createElement('input');
inputCountry.type = 'hidden'; inputCountry.name = 'country'; inputCountry.value = 'LT';
let inputPlate = document.createElement('input');
inputPlate.type = 'hidden'; inputPlate.name = 'plate'; inputPlate.value = plateNumber;
form.appendChild(inputCountry); form.appendChild(inputPlate);
document.body.appendChild(form); form.submit(); document.body.removeChild(form);
});
container.appendChild(btn);
return;
}
// Standard flow: if no configured sites -> nothing to show
if (!sites.length) return;
if (sites.length === 1) {
const only = sites[0];
const btn = makeBtn('Lookup', !fieldsOk, () => {
const plateNumber = buildPlateForCurrentPage();
if (!plateNumber) return;
window.open(only.base + plateNumber, '_blank');
});
container.appendChild(btn);
} else {
for (const site of sites) {
const btn = makeBtn(site.name, !fieldsOk, () => {
const plateNumber = buildPlateForCurrentPage();
if (!plateNumber) return;
window.open(site.base + plateNumber, '_blank');
});
container.appendChild(btn);
}
}
}
function createOrUpdateGoogleImagesButton() {
const host = document.getElementById('zoomimgid');
if (!host) return;
let googleBtn = document.getElementById('googleImagesButton');
if (!googleBtn) {
googleBtn = makeBtn('Search combination on Google Images', true, null);
googleBtn.id = 'googleImagesButton';
host.parentNode.insertBefore(googleBtn, host);
}
const fieldsOk = areFieldsFilled();
googleBtn.disabled = !fieldsOk;
googleBtn.onclick = !fieldsOk ? null : function () {
let plateNumber = '';
if (is('nl')) plateNumber = document.getElementById('nomer').value;
else if (is('ua')) {
const region = document.getElementById('region1').value;
const digits = document.getElementById('digit1').value;
const b1 = document.getElementById('b1').value;
const b2 = document.getElementById('b2').value;
plateNumber = `${region} ${digits} ${b1}${b2}`;
} else if (is('no') || is('dk') || is('se')) {
plateNumber = document.getElementById('let').value + ' ' + document.getElementById('digit').value;
} else if (is('fr')) {
const b1 = document.getElementById('b1').value;
const d2 = document.getElementById('digit2').value;
const b2 = document.getElementById('b2').value;
plateNumber = `${b1} ${d2} ${b2}`;
} else if (is('de')) {
const regionField = document.getElementById('region').value;
const letField = document.getElementById('b1').value;
const letField2 = document.getElementById('b2').value;
const digitField = document.getElementById('digit').value;
plateNumber = `${regionField} ${letField} ${digitField}${letField2}`;
} else if (is('ch')) {
const regionField = document.getElementById('region').value;
const digitField = document.getElementById('digit').value;
plateNumber = `${regionField} ${digitField}`;
} else if (is('fi')) {
plateNumber = document.getElementById('let1').value + '-' + document.getElementById('digit').value;
} else if (is('pl')) {
const regionField = document.getElementById('region');
const selectedRegionText = regionField.options[regionField.selectedIndex].text;
const digitField = document.getElementById('nomerpl').value;
plateNumber = selectedRegionText + ' ' + digitField;
} else if (is('uk')) {
plateNumber = document.getElementById('nomerpl').value;
} else if (is('lt')) {
plateNumber = buildPlateForCurrentPage();
} else if (is('cz')) {
plateNumber = buildPlateForCurrentPage();
}
window.open('https://www.google.com/search?tbm=isch&q="' + plateNumber + '"', '_blank');
};
}
function makeBtn(label, disabled, onclick) {
const btn = document.createElement('button');
btn.innerText = label;
btn.disabled = !!disabled;
btn.style.marginBottom = '10px';
btn.style.width = '100%';
btn.style.backgroundColor = disabled ? '#95a5a6' : '#3498db';
btn.style.color = '#ffffff';
btn.style.border = 'none';
btn.style.cursor = disabled ? 'default' : 'pointer';
btn.style.height = '23px';
btn.style.borderRadius = '4px';
if (onclick && !disabled) btn.onclick = onclick;
return btn;
}
// --- Initial render + live updates ---
function render() {
createOrUpdateLookupButtons();
createOrUpdateGoogleImagesButton();
}
render();
setInterval(render, 1000);
})();