// ==========================================
// CRIADO POR ANTONIO PEDRO - 2025
// ==========================================
(async function() {
// CONFIGURAÇÃO INICIAL
let prefix = prompt('Qual prefixo você quer usar para os nomes? (ex: XSS)', 'XSS') || 'XSS';
prefix = prefix.toUpperCase().trim();
const mode = confirm('Clique OK para renomear TODOS os aviões (sobrescreve existentes).\nClique Cancelar para renomear SÓ os não nomeados (continua a numeração).');
const renameAll = mode;
console.log(`🚀 Iniciando rename com prefixo: ${prefix}`);
console.log(`Modo: ${renameAll ? 'Renomear TODOS' : 'Só não nomeados (continuar numeração)'}`);
// Função para aguardar elemento
function waitForElement(selector, timeout = 5000) {
return new Promise((resolve, reject) => {
if (document.querySelector(selector)) {
return resolve(document.querySelector(selector));
}
const observer = new MutationObserver(() => {
if (document.querySelector(selector)) {
resolve(document.querySelector(selector));
observer.disconnect();
}
});
observer.observe(document.body, { childList: true, subtree: true });
setTimeout(() => {
observer.disconnect();
reject(new Error(`Timeout waiting for ${selector}`));
}, timeout);
});
}
// Função para encontrar botão "Frota" (CORRIGIDA)
function findFleetButton() {
console.log('🔍 Procurando botão "Frota"...');
// Buscar todos os botões
const allButtons = document.querySelectorAll('button, [class*="btn"], .listBtns');
console.log(`📊 Total de botões encontrados: ${allButtons.length}`);
for (let btn of allButtons) {
const text = (btn.textContent || btn.innerText || '').trim();
const onclick = btn.getAttribute('onclick') || '';
console.log(`🔍 Verificando botão: "${text.substring(0, 30)}..." | onclick: ${onclick.substring(0, 50)}...`);
// Verificar texto
if (text.toLowerCase().includes('frota') || text.includes('Fleet')) {
console.log(`🎯 BOTÃO FROTA ENCONTRADO! Texto: "${text}"`);
return btn;
}
// Verificar onclick
if (onclick.includes('fleet.php') && !onclick.includes('parked')) {
console.log(`🎯 BOTÃO FROTA ENCONTRADO! onclick: ${onclick}`);
return btn;
}
}
console.log('❌ Botão "Frota" não encontrado automaticamente.');
return null;
}
// Verificar se já está na lista de frota
console.log('🔍 Verificando se a lista de frota está carregada...');
let fleetDetailList = document.querySelector('#fleetDetailList');
if (!fleetDetailList) {
console.log('📂 Lista não carregada. Tentando clicar no botão "Frota"...');
const fleetButton = findFleetButton();
if (fleetButton) {
console.log('🎯 Clicando no botão "Frota"...');
fleetButton.click();
// Aguardar o #fleetDetailList aparecer
try {
await waitForElement('#fleetDetailList', 10000);
console.log('✅ Lista de frota carregada com sucesso!');
fleetDetailList = document.querySelector('#fleetDetailList');
} catch (e) {
console.error('❌ Erro ao aguardar lista: ', e);
alert('❌ Não conseguiu carregar a lista de frota. Clique manualmente no botão "Frota" e execute o script novamente.');
return;
}
} else {
console.error('❌ Botão "Frota" não encontrado!');
alert('❌ Botão "Frota" não encontrado. Execute o script de diagnóstico para encontrar o botão correto.');
return;
}
} else {
console.log('✅ Lista de frota já carregada.');
}
// Extrair aviões
const rows = document.querySelectorAll('#fleetDetailList .row.border');
console.log(`📊 Número de aviões encontrados: ${rows.length}`);
if (rows.length === 0) {
console.error('❌ Nenhum avião encontrado na lista!');
console.log('💡 Execute o diagnóstico para ver a estrutura:');
console.log('document.querySelectorAll("#fleetDetailList > div").length');
alert('❌ Nenhum avião na lista. Compre aviões ou clique em "Frota" primeiro.');
return;
}
const planes = [];
let maxNumber = 0;
rows.forEach((row, index) => {
const a = row.querySelector('a[href="#"]');
if (a) {
const onclick = a.getAttribute('onclick');
if (!onclick) return;
const idMatch = onclick.match(/id=(\d+)/);
if (!idMatch) return;
const planeId = idMatch[1];
const currentName = a.textContent.trim();
// Verificar se já tem o formato correto
const match = currentName.match(new RegExp(`^${prefix}-(\\d{4})$`));
if (match) {
const num = parseInt(match[1], 10);
if (num > maxNumber) maxNumber = num;
}
planes.push({ planeId, currentName, row, a });
console.log(`✈️ Avião ${index + 1}: ID=${planeId}, Nome="${currentName}"`);
}
});
console.log(`🔍 Aviões válidos extraídos: ${planes.length}`);
if (planes.length === 0) {
console.error('❌ Nenhum avião válido encontrado!');
return;
}
let nextNumber = renameAll ? 1 : (maxNumber + 1);
console.log(`📊 Iniciando numeração a partir de: ${prefix}-${String(nextNumber).padStart(4, '0')}`);
const toRename = renameAll
? planes
: planes.filter(p => !p.currentName.match(new RegExp(`^${prefix}-\\d{4}$`)));
console.log(`✈️ Aviões a renomear: ${toRename.length}`);
if (toRename.length === 0) {
console.log('✅ Nada para renomear! Todos já estão no formato correto.');
return;
}
// Confirmar antes de começar
const confirmStart = confirm(`🚀 Preparado para renomear ${toRename.length} aviões?\nPrefixo: ${prefix}\nIniciando de: ${prefix}-${String(nextNumber).padStart(4, '0')}`);
if (!confirmStart) {
console.log('❌ Rename cancelado pelo usuário.');
return;
}
// Função de rename individual
async function renameOne(plane, newName) {
const timestamp = Date.now();
const planeId = plane.planeId;
// Tentar encontrar routeId
let routeId = null;
try {
if (typeof flightData !== 'undefined' && Array.isArray(flightData)) {
const flight = flightData.find(f => f.id == planeId);
routeId = flight ? flight.routeId : null;
}
} catch (e) {
console.warn('⚠️ flightData não disponível, pulando rename de rotas.');
}
console.log(`🔄 Renomeando ${planeId} de "${plane.currentName}" → "${newName}"`);
// Rename do avião
const regUrl = `https://www.airlinemanager.com/fleet_details.php?id=${planeId}&mode=reg®=${encodeURIComponent(newName)}&fbSig=false&_${timestamp}`;
try {
const response = await fetch(regUrl);
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(`✅ Registro renomeado: ${newName}`);
} catch (e) {
console.error(`❌ Erro no registro ${newName}: ${e.message}`);
}
// Rename da rota (se existir)
if (routeId) {
const routeUrl = `https://www.airlinemanager.com/fleet_details.php?id=${routeId}&mode=routeReg®=${encodeURIComponent(newName)}&fbSig=false&_${timestamp + 1}`;
try {
const response = await fetch(routeUrl);
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(`✅ Rota renomeada: ${newName}`);
} catch (e) {
console.error(`❌ Erro na rota ${newName}: ${e.message}`);
}
} else {
console.log(`ℹ️ Sem rota para ${newName}`);
}
// Atualizar interface
plane.a.textContent = newName;
// Atualizar flightData se existir
if (typeof flightData !== 'undefined' && Array.isArray(flightData)) {
const flight = flightData.find(f => f.id == planeId);
if (flight) flight.routeReg = newName;
}
// Delay de 1 segundo
await new Promise(resolve => setTimeout(resolve, 1000));
}
// Executar renames
console.log('🚀 === INICIANDO PROCESSO DE RENAME ===');
for (let i = 0; i < toRename.length; i++) {
const plane = toRename[i];
const newName = `${prefix}-${String(nextNumber).padStart(4, '0')}`;
nextNumber++;
console.log(`📊 Progresso: ${i + 1}/${toRename.length} (${Math.round((i + 1) / toRename.length * 100)}%)`);
console.log(` ${plane.currentName} → ${newName}`);
await renameOne(plane, newName);
}
console.log(`🎉 === CONCLUÍDO! ===`);
console.log(`✅ Sua frota agora usa "${prefix}-XXXX" de ${prefix}-0001 até ${prefix}-${String(nextNumber - 1).padStart(4, '0')}`);
alert(`✅ Rename concluído! ${toRename.length} aviões renomeados com sucesso!`);
})();