BGBlur = true ActionsOpen = false ChangedKeys = [] DoorNotify = false CurrentKeyPage = 1 let translations = {}; async function loadTranslations(lang) { try { const response = await fetch(`../locales/${lang}.json`); translations = await response.json(); updateText() } catch (error) { console.error("Error loading translation:", error); } } function updateText() { document.querySelectorAll("[data-i18n]").forEach(element => { const key = element.getAttribute("data-i18n"); if (element.hasAttribute("placeholder")) { element.setAttribute("placeholder", translations[key]); } else { element.innerHTML = translations[key]; } }); } function t(key) { return translations[key] || key; } window.addEventListener('message', function(event) { let data = event.data if (data.action == "NUILanguage") { loadTranslations(data.language); } else if (data.action === "OpenKeysMenu") { MyKeys = data.mykeys CreateKeyMenu() BackgroundBlur("plugin_1", 'key_panel') if (ActionsOpen){ BackgroundBlur("plugin_1", 'key_panel', true) MakeKeysDraggable() } else{ BackgroundBlur("plugin_1", 'key_panel') } ChangedKeys = [] } if (data.action === "OpenLostKeyMenu") { MyVehicles = data.myvehicles VehicleKeyPrice = data.price Currency = data.currencyform CreateKeyPurchaseMenu() show('key_purchase_menu') BackgroundBlur("plugin_2", 'key_purchase_panel') } if (data.action === "DoorState") { DoorState = data.status if (DoorState == 'unlocked'){ $(".key_notify .text").html(t('doors_unlocked')) document.getElementById('line').classList.remove("red") } else{ $(".key_notify .text").html(t('doors_locked')) document.getElementById('line').classList.add("red") } $('.key_notify').css('display', 'block') $('.key_notify .container').css('animation', 'container 1s ease both') if (DoorNotify){ clearTimeout(DoorNotify) } DoorNotify = setTimeout(() => { $('.key_notify .container').css('animation', 'reverse_container 1s ease both') setTimeout(() => { $('.key_notify').css('display', 'none') DoorNotify = false }, 800); }, 4000); } else if (data.action === "close") { Close() } }) document.onkeydown = function(data) { if (event.key == 'Escape') { Close() } } function Close(){ CloseKeyMenu() hide('key_purchase_menu') $.post('https://' + GetParentResourceName() + '/UseButton', JSON.stringify({action: "close", table:ChangedKeys})) ChangedKeys = [] } function CreateKeyPurchaseMenu(){ $('.vehicles_container').html('') for (let i = 0; i < MyVehicles.length; i++) { $('.vehicles_container').append(`
${MyVehicles[i].plate}
${VehicleKeyPrice.toLocaleString('hu-HU')+' '+Currency}
`) } } function SendBuyKeyForVehicle(plate){ $.post('https://' + GetParentResourceName() + '/UseButton', JSON.stringify({action: "lostKey", plate})) } function CreateKeyMenu(){ $('.key_menu').css('display', 'block') $('.key_menu .animation_element').css('animation', 'animation_element 1s ease both') $('.key_menu .overflow_container').css('animation', 'overflow_container 1s ease both') $('.key_menu .panel').css('animation', 'panel 1s ease both') CreatePageSelector() InsertDataToPanel() } function SendChangeLock(keyid){ $.post('https://' + GetParentResourceName() + '/UseButton', JSON.stringify({action: "changeLock", keyid, table:ChangedKeys})) ChangedKeys = [] } function SendCopy(keyid){ $.post('https://' + GetParentResourceName() + '/UseButton', JSON.stringify({action: "copyKey", keyid, table:ChangedKeys})) ChangedKeys = [] } function SendDeleteAll(keyid, plate){ $.post('https://' + GetParentResourceName() + '/UseButton', JSON.stringify({action: "deleteAll", keyid, table:ChangedKeys, plate})) ChangedKeys = [] } function CloseKeyMenu(){ $('.key_menu .animation_element').css('animation', 'reverse_animation_element 1s ease both') $('.key_menu .overflow_container').css('animation', 'reverse_overflow_container 1s ease both') $('.key_menu .panel').css('animation', 'reverse_panel 1s ease both') if (ActionsOpen){ document.getElementById('actions_btn').classList.remove("active") $('.key_menu .overflow_container').css('transform', 'translate(0px, -50%)') $('.actions_section #actions_panel').css('animation', 'reverse_actions_panel 0.3s both') MakeKeysNotDraggable() setTimeout(() => { ActionsOpen = false BackgroundBlur("plugin_1", 'key_panel') $('.actions_section').css('display', 'none') }, 400); } setTimeout(() => { $('.key_menu').css('display', 'none') }, 700); } function ChooseKeyPage(element, number){ MakeKeysNotDraggable() CurrentKeyPage = number+1 for (let i = 0; i < NumberOfPages; i++) { document.getElementById("page_"+i).classList.remove("choosed") } element.classList.add("choosed") InsertDataToPanel() if (ActionsOpen){ MakeKeysDraggable() } } function CreatePageSelector(){ BiggestSlot = 1 for (let i = 0; i < MyKeys.length; i++) { if (MyKeys[i].slot > BiggestSlot){ BiggestSlot = MyKeys[i].slot } } NumberOfPages = (BiggestSlot-(BiggestSlot%24))/24+1 $(".page_selector_container").html('') if (NumberOfPages > 1){ for (let i = 0; i < NumberOfPages; i++) { if (CurrentKeyPage-1 == i){ $(".page_selector_container").append(`
`) } else{ $(".page_selector_container").append(`
`) } } } } function InsertDataToPanel(){ $('.keys_container').html('') for (let i = (CurrentKeyPage*24)-24; i < CurrentKeyPage*24; i++) { if (MyKeys.length != 0){ for (let _i = 0; _i < MyKeys.length; _i++) { if (MyKeys[_i] != undefined && MyKeys[_i].slot-1 == i){ let options = {year: "numeric", month: "2-digit", day: "2-digit", hour: "2-digit", minute: "2-digit"}; let date = new Date(MyKeys[_i].time * 1000); $('.keys_container').append(`
${MyKeys[_i].quantity>1?MyKeys[_i].quantity:''}
${MyKeys[_i].label}
${MyKeys[_i].type == 'temporary_key'?`
`:''}
`) break } else if(_i+1 == MyKeys.length){ $('.keys_container').append(`
`) break } } } else{ $('.keys_container').append(`
`) } } document.querySelectorAll(".key_image").forEach(el => { const dropdownMenu = new bootstrap.Dropdown(el); el.addEventListener("contextmenu", function (event) { event.preventDefault(); document.querySelectorAll(".key_image").forEach(otherEl => { if (otherEl !== el) { new bootstrap.Dropdown(otherEl).hide(); } }); dropdownMenu.show(); }); document.addEventListener("click", function () { dropdownMenu.hide(); }); }); } function MakeKeysDraggable(){ for (let i = (CurrentKeyPage*24)-24; i < CurrentKeyPage*24; i++) { for (let _i = 0; _i < MyKeys.length; _i++) { if (MyKeys[_i] != undefined && MyKeys[_i].slot-1 == i){ dragElement(document.getElementById('key_'+i), 'key_'+i, MyKeys[_i].id, _i) } } } } function MakeKeysNotDraggable(){ for (let i = (CurrentKeyPage*24)-24; i < CurrentKeyPage*24; i++) { for (let _i = 0; _i < MyKeys.length; _i++) { if (MyKeys[_i] != undefined && MyKeys[_i].slot-1 == i){ document.getElementById('key_'+i).onmousedown = null } } } } function CreateActionPage(){ if (!ActionsOpen){ ActionsOpen = true document.getElementById('actions_btn').classList.add("active") $('.key_menu .overflow_container').css('transform', 'translate(-100px, -50%)') BackgroundBlur("plugin_1", 'key_panel', true) $('#actions_panel').css('height', $('.key_menu .panel').height()+'px') $('.actions_section #actions_panel').css('animation', 'actions_panel 0.3s ease both') $('.actions_section').css('display', 'block') MakeKeysDraggable() TriggerCallback('getClosestPlayers', {}).done((cb) => { ClosestPlayers = cb $('.people_container').html('') if (ClosestPlayers.length > 0){ for (let i = 0; i < ClosestPlayers.length; i++) { $('.people_container').append(`
ID ${ClosestPlayers[i].id}
`) } } else{ $('.people_container').append(`
x
`) } }); } else{ document.getElementById('actions_btn').classList.remove("active") $('.key_menu .overflow_container').css('transform', 'translate(0px, -50%)') $('.actions_section #actions_panel').css('animation', 'reverse_actions_panel 0.3s both') MakeKeysNotDraggable() setTimeout(() => { ActionsOpen = false BackgroundBlur("plugin_1", 'key_panel') $('.actions_section').css('display', 'none') }, 400); } } function TriggerCallback(event, data) { data.action = event; return $.post('https://' + GetParentResourceName() + '/UseButton', JSON.stringify(data)).promise(); } function BackgroundBlur(element, target, value) { if (BGBlur){ var bodyRect = document.body.getBoundingClientRect(); let elemRect = getTotalBoundingBox(target); if (!elemRect) return; let offset = []; if (value){ offset = [ (elemRect.top - bodyRect.top)-2, ((elemRect.right - bodyRect.right) * (-1))-150, (elemRect.bottom - bodyRect.bottom)+2, (elemRect.left - bodyRect.left)-100 ]; } else{ offset = [ (elemRect.top - bodyRect.top)-2, ((elemRect.right - bodyRect.right) * (-1))-1, (elemRect.bottom - bodyRect.bottom)+2, (elemRect.left - bodyRect.left)-1 ]; } $('#' + element).css('clip-path', `inset(${offset[0]}px ${offset[1]}px calc(100% - ${offset[2]}px) ${offset[3]}px)`); } else{ $('#' + element).css('display', 'none') } } function getTotalBoundingBox(target) { const elem = document.getElementById(target); if (!elem) return null; let elemRect = elem.getBoundingClientRect(); let minX = elemRect.left; let minY = elemRect.top; let maxX = elemRect.right; let maxY = elemRect.bottom; Array.from(elem.children).forEach(child => { let childRect = child.getBoundingClientRect(); minX = Math.min(minX, childRect.left!=0?childRect.left:99999); minY = Math.min(minY, childRect.top!=0?childRect.top:99999); maxX = Math.max(maxX, childRect.right); maxY = Math.max(maxY, childRect.bottom); }); return { width: maxX - minX, height: maxY - minY, left: minX, top: minY, right: maxX, bottom: maxY }; } function show(element) { $("#" + element).css("display", "block") document.getElementById(element).style.animation = "showmenu 0.35s ease"; } function hide(element) { document.getElementById(element).style.animation = "hidemenu 0.3s ease"; setTimeout(function() { $("#" + element).css("display", "none") }, 300) } function isNumber(evt) { evt = (evt) ? evt : window.event var charCode = (evt.which) ? evt.which : evt.keyCode if (charCode > 31 && (charCode < 48 || charCode > 57)) { return false } return true } ////////////////////////////////////////////// DRAGGING ////////////////////////////////////////////////// OGPos = {} function dragElement(elmnt, item, keyid, index) { var pos1 = 0, pos2 = 0, pos3 = 0, pos4 = 0; if (OGPos[item] == null){ OGPos[item] = { x: null, y: null } OGPos[item].x = elmnt.offsetLeft OGPos[item].y = elmnt.offsetTop } elmnt.onmousedown = dragMouseDown function dragMouseDown(e) { e = e || window.event; e.preventDefault(); pos3 = e.clientX; pos4 = e.clientY; document.onmouseup = closeDragElement; document.onmousemove = elementDrag; } function elementDrag(e) { e = e || window.event e.preventDefault() pos1 = pos3 - e.clientX pos2 = pos4 - e.clientY pos3 = e.clientX pos4 = e.clientY elmnt.style.opacity = "0.8" elmnt.style.top = (elmnt.offsetTop - pos2) + "px" elmnt.style.left = (elmnt.offsetLeft - pos1) + "px" if (elementsOverlap(elmnt, document.getElementById("key_panel"), true) == false && elementsOverlap(elmnt, document.getElementById("actions_panel")) == false){ closeDragElement(e) } for (let i = (CurrentKeyPage*24)-24; i < CurrentKeyPage*24; i++) { if (document.getElementById("empty_"+i) != undefined){ if (elementsOverlapPrecise(document.getElementById("empty_"+i), e.clientX, e.clientY) == false){ document.getElementById('empty_'+i).classList.remove("hovered") } else{ document.getElementById('empty_'+i).classList.add("hovered") } } } for (let i = 0; i < ClosestPlayers.length; i++) { if (elementsOverlapPrecise(document.getElementById("player_"+i), e.clientX, e.clientY) == false){ document.getElementById('player_'+i).classList.remove("hovered") } else{ document.getElementById('player_'+i).classList.add("hovered") } } if (elementsOverlapPrecise(document.getElementById("key_delete"), e.clientX, e.clientY) == false){ document.getElementById('key_delete').classList.remove("hovered") } else{ document.getElementById('key_delete').classList.add("hovered") } } function closeDragElement(e) { UseElement(elmnt, item, e.clientX, e.clientY, keyid, index) elmnt.style.opacity = "1" document.onmouseup = null; document.onmousemove = null; } } function UseElement(elmnt, item, X, Y, keyid, index){ let elm = elmnt for (let i = (CurrentKeyPage*24)-24; i < CurrentKeyPage*24; i++) { if (document.getElementById("empty_"+i) != undefined){ if (elementsOverlapPrecise(document.getElementById("empty_"+i), X, Y) == false){ document.getElementById('empty_'+i).classList.remove("hovered") } else{ for (const key in ChangedKeys) { if (ChangedKeys[key].keyid == keyid){ ChangedKeys.splice(key, 1) } } for (const key in MyKeys) { if (MyKeys[key].id == keyid){ if (MyKeys[key].oldSlot == undefined || MyKeys[key].oldSlot != i+1){ ChangedKeys.push({keyid: keyid, slot:i+1, plate:MyKeys[key].plate}) break } } } MakeKeysNotDraggable() if (MyKeys[index].oldSlot == undefined){ MyKeys[index].oldSlot = MyKeys[index].slot } MyKeys[index].slot = i+1 InsertDataToPanel() MakeKeysDraggable() return } } } for (let i = 0; i < ClosestPlayers.length; i++) { if (elementsOverlapPrecise(document.getElementById("player_"+i), X, Y)){ $.post('https://' + GetParentResourceName() + '/UseButton', JSON.stringify({action: "giveKey", playerid:ClosestPlayers[i].id, keyid, table:ChangedKeys})) document.getElementById('player_'+i).classList.remove("hovered") ChangedKeys = [] return } } if (elementsOverlapPrecise(document.getElementById("key_delete"), X, Y)){ $.post('https://' + GetParentResourceName() + '/UseButton', JSON.stringify({action: "deleteKey", keyid, table:ChangedKeys, plate:MyKeys[index].plate})) document.getElementById('key_delete').classList.remove("hovered") ChangedKeys = [] return } /* if (elementsOverlap(elm, document.getElementById("head_box")) && Damages.head){ ItemAnim(elm, item) } else if(elementsOverlap(elm, document.getElementById("head_box")) && Damages.head == false){ WrongItemAnim(elm, item) } else{ elm.style.top = OGPos[item].y + "px" elm.style.left = OGPos[item].x + "px" }*/ elm.style.top = OGPos[item].y + "px" elm.style.left = OGPos[item].x + "px" } function ItemAnim(elm, item, part){ elm.style.animation = 'none'; elm.offsetHeight; elm.style.animation = "itemuseanim 1.2s"; setTimeout(function(){ elm.style.top = OGPos[item].y + "px" elm.style.left = OGPos[item].x + "px" elm.style.animation = 'none'; Close() },1200) $.post('https://'+GetParentResourceName()+'/UseButton', JSON.stringify({action:"MedicerMenu", type:"useitem", item, you:Mediceryou, part})) } function WrongItemAnim(elm, item){ elm.style.animation = 'none'; elm.offsetHeight; elm.style.animation = "itemnotuseanim 0.8s"; setTimeout(function(){ elm.style.top = OGPos[item].y + "px" elm.style.left = OGPos[item].x + "px" elm.style.animation = 'none'; },800) } function elementsOverlap(el1, el2, value) { const domRect1 = el1.getBoundingClientRect(); const domRect2 = el2.getBoundingClientRect(); if (value){ return !( domRect1.top+50 > domRect2.bottom || domRect1.right-50 < domRect2.left || domRect1.bottom-50 < domRect2.top || domRect1.left-50 > domRect2.right ); } else{ return !( domRect1.top+50 > domRect2.bottom || domRect1.right-50 < domRect2.left || domRect1.bottom-50 < domRect2.top || domRect1.left+50 > domRect2.right ); } } function elementsOverlapPrecise(el1, X, Y) { const domRect1 = el1.getBoundingClientRect(); return !( domRect1.top > Y || domRect1.right < X || domRect1.bottom < Y || domRect1.left > X ); }