diff --git a/server-data/resources/[esx_addons]/esx_banking/LICENSE b/server-data/resources/[bpt_addons]/bpt_banking/LICENSE similarity index 98% rename from server-data/resources/[esx_addons]/esx_banking/LICENSE rename to server-data/resources/[bpt_addons]/bpt_banking/LICENSE index 7c2c49f9f..62f066311 100644 --- a/server-data/resources/[esx_addons]/esx_banking/LICENSE +++ b/server-data/resources/[bpt_addons]/bpt_banking/LICENSE @@ -1,7 +1,7 @@ GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 - Copyright (C) 2007 Free Software Foundation, Inc. + Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. @@ -631,8 +631,8 @@ to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. - esx_banking - Copyright (C) 2015-2023 Jérémie N'gadi + + Copyright (C) 2024 bitpredator This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -645,14 +645,14 @@ the "copyright" line and a pointer to where the full notice is found. GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program. If not, see . + along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: - esx_banking Copyright (C) 2015-2023 Jérémie N'gadi + Copyright (C) 2024 bitpredator This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. @@ -664,11 +664,11 @@ might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see -. +. The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read -. \ No newline at end of file +. diff --git a/server-data/resources/[bpt_addons]/bpt_banking/README.md b/server-data/resources/[bpt_addons]/bpt_banking/README.md new file mode 100644 index 000000000..bdb9e3162 --- /dev/null +++ b/server-data/resources/[bpt_addons]/bpt_banking/README.md @@ -0,0 +1,19 @@ +

bpt_banking

+

Discord + +Copyright (C) 2024 bitpredator + +This program Is free software: you can redistribute it And/Or modify it under the terms Of the GNU General Public License As published by the Free Software Foundation, either version 3 Of the License, Or (at your option) any later version. + +This program Is distributed In the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty Of MERCHANTABILITY Or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License For more details. + +ATTENTION: +You are not authorized to change the name of the resource and the resources within it. + +If you want to contribute you can open a pull request. + +You are not authorized to sell this software (this is free project). + +This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. \ No newline at end of file diff --git a/server-data/resources/[esx_addons]/esx_banking/banking.sql b/server-data/resources/[bpt_addons]/bpt_banking/bpt_banking.sql similarity index 87% rename from server-data/resources/[esx_addons]/esx_banking/banking.sql rename to server-data/resources/[bpt_addons]/bpt_banking/bpt_banking.sql index 596c44532..0ef466382 100644 --- a/server-data/resources/[esx_addons]/esx_banking/banking.sql +++ b/server-data/resources/[bpt_addons]/bpt_banking/bpt_banking.sql @@ -9,4 +9,4 @@ CREATE TABLE IF NOT EXISTS `banking` ( PRIMARY KEY (`ID`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4; -ALTER TABLE `users` ADD COLUMN `pincode` INT NULL; +ALTER TABLE `users` ADD COLUMN `pincode` INT NULL; \ No newline at end of file diff --git a/server-data/resources/[bpt_addons]/bpt_banking/client/main.lua b/server-data/resources/[bpt_addons]/bpt_banking/client/main.lua new file mode 100644 index 000000000..11751d25a --- /dev/null +++ b/server-data/resources/[bpt_addons]/bpt_banking/client/main.lua @@ -0,0 +1,262 @@ +local BANK = { + Data = {} +} + +local activeBlips, bankPoints, atmPoints, markerPoints = {}, {}, {}, {} +local playerLoaded, uiActive, inMenu = false, false, false + +--Functions +-- General data collecting thread +function BANK:Thread() + self:CreateBlips() + local data = self.Data + data.ped = PlayerPedId() + data.coord = GetEntityCoords(data.Ped) + playerLoaded = true + + CreateThread(function() + while playerLoaded do + data.coord = GetEntityCoords(data.ped) + data.ped = PlayerPedId() + bankPoints, atmPoints, markerPoints = {}, {}, {} + + if (IsPedOnFoot(data.ped) and not ESX.PlayerData.dead) and not inMenu then + for i = 1, #Config.AtmModels do + local atm = GetClosestObjectOfType(data.coord.x, data.coord.y, data.coord.z, 0.7, Config.AtmModels + [i], false, false, false) + if atm ~= 0 then + atmPoints[#atmPoints + 1] = GetEntityCoords(atm) + end + end + + for i = 1, #Config.Banks do + local bankDistance = #(data.coord - Config.Banks[i].Position.xyz) + if bankDistance <= 0.7 then + bankPoints[#bankPoints + 1] = Config.Banks[i].Position.xyz + end + if Config.ShowMarker and bankDistance <= (Config.DrawMarker or 10) then + markerPoints[#markerPoints + 1] = Config.Banks[i].Position.xyz + end + end + end + + if next(bankPoints) and not uiActive then + self:TextUi(true) + end + + if next(atmPoints) and not uiActive then + self:TextUi(true, true) + end + + if not next(bankPoints) and not next(atmPoints) and uiActive then + self:TextUi(false) + end + + Wait(1000) + end + end) + + if not Config.ShowMarker then return end + + CreateThread(function() + local wait = 1000 + while playerLoaded do + if next(markerPoints) then + for i = 1, #markerPoints do + DrawMarker(20, markerPoints[i].x, markerPoints[i].y, markerPoints[i].z, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.3, 0.2, 0.2, 187, 255, 0, 255, false, true, 2, false, nil, nil, false) + end + wait = 0 + end + Wait(wait) + end + end) +end + +-- Handle text ui / Keypress +function BANK:TextUi(state, atm) + uiActive = state + if not state then + return ESX.HideUI() + end + ESX.TextUI(TranslateCap('press_e_banking')) + CreateThread(function() + while uiActive do + if IsControlJustReleased(0, 38) then + self:HandleUi(true, atm) + self:TextUi(false) + end + Wait(0) + end + end) +end + +-- Create Blips +function BANK:CreateBlips() + local tmpActiveBlips = {} + for i = 1, #Config.Banks do + if type(Config.Banks[i].Blip) == 'table' and Config.Banks[i].Blip.Enabled then + local position = Config.Banks[i].Position + local bInfo = Config.Banks[i].Blip + local blip = AddBlipForCoord(position.x, position.y, position.z) + SetBlipSprite(blip, bInfo.Sprite) + SetBlipScale(blip, bInfo.Scale) + SetBlipColour(blip, bInfo.Color) + SetBlipAsShortRange(blip, true) + BeginTextCommandSetBlipName('STRING') + AddTextComponentSubstringPlayerName(bInfo.Label) + EndTextCommandSetBlipName(blip) + tmpActiveBlips[#tmpActiveBlips + 1] = blip + end + end + + activeBlips = tmpActiveBlips +end + +-- Remove blips +function BANK:RemoveBlips() + for i = 1, #activeBlips do + if DoesBlipExist(activeBlips[i]) then + RemoveBlip(activeBlips[i]) + end + end + activeBlips = {} +end + +-- Open / Close ui +function BANK:HandleUi(state, atm) + atm = atm or false + SetNuiFocus(state, state) + inMenu = state + ClearPedTasks(PlayerPedId()) + if not state then + SendNUIMessage({ + showMenu = false + }) + return + end + ESX.TriggerServerCallback('bpt_banking:getPlayerData', function(data) + SendNUIMessage({ + showMenu = true, + openATM = atm, + datas = { + your_money_panel = { + accountsData = { { + name = "cash", + amount = data.money + }, { + name = "bank", + amount = data.bankMoney + } } + }, + bankCardData = { + bankName = TranslateCap('bank_name'), + cardNumber = "2232 2222 2222 2222", + createdDate = "08/08", + name = data.playerName + }, + transactionsData = data.transactionHistory + } + }) + end) +end + +function BANK:LoadNpc(index, netID) + CreateThread(function() + while not NetworkDoesEntityExistWithNetworkId(netID) do + Wait(200) + end + local npc = NetworkGetEntityFromNetworkId(netID) + TaskStartScenarioInPlace(npc, Config.Peds[index].Scenario, 0, true) + SetEntityProofs(npc, true, true, true, true, true, true, true, true) + SetBlockingOfNonTemporaryEvents(npc, true) + FreezeEntityPosition(npc, true) + SetPedCanRagdollFromPlayerImpact(npc, false) + SetPedCanRagdoll(npc, false) + SetEntityAsMissionEntity(npc, true, true) + SetEntityDynamic(npc, false) + end) +end + +-- Events +RegisterNetEvent('bpt_banking:closebanking', function() + BANK:HandleUi(false) +end) + +RegisterNetEvent('bpt_banking:pedHandler', function(netIdTable) + for i = 1, #netIdTable do + BANK:LoadNpc(i, netIdTable[i]) + end +end) + +RegisterNetEvent('bpt_banking:updateMoneyInUI', function(doingType, bankMoney, money) + SendNUIMessage({ + updateData = true, + data = { + type = doingType, + bankMoney = bankMoney, + money = money + } + }) +end) + +-- Handlers +-- Resource starting +AddEventHandler('onResourceStart', function(resource) + if resource ~= GetCurrentResourceName() then return end + BANK:Thread() +end) + +-- Enable the script on player loaded +RegisterNetEvent('esx:playerLoaded', function() + BANK:Thread() +end) + +-- Disable the script on player logout +RegisterNetEvent('esx:onPlayerLogout', function() + playerLoaded = false +end) + +-- Resource stopping +AddEventHandler('onResourceStop', function(resource) + if resource ~= GetCurrentResourceName() then return end + BANK:RemoveBlips() + if uiActive then BANK:TextUi(false) end +end) + +RegisterNetEvent('esx:onPlayerDeath', function() BANK:TextUi(false) end) + +-- Nui Callbacks +RegisterNUICallback('close', function(data, cb) + BANK:HandleUi(false) + cb('ok') +end) + +RegisterNUICallback('clickButton', function(data, cb) + if not data or not inMenu then + return cb('ok') + end + + TriggerServerEvent("bpt_banking:doingType", data) + cb('ok') +end) + +RegisterNUICallback('checkPincode', function(data, cb) + if not data or not inMenu then + return cb('ok') + end + + ESX.TriggerServerCallback("bpt_banking:checkPincode", function(pincode) + if pincode then + cb({ + success = true + }) + ESX.ShowNotification(TranslateCap('pincode_found'), "success") + else + cb({ + error = true + }) + ESX.ShowNotification(TranslateCap('pincode_not_found'), "error") + end + end, data) +end) diff --git a/server-data/resources/[bpt_addons]/bpt_banking/config.lua b/server-data/resources/[bpt_addons]/bpt_banking/config.lua new file mode 100644 index 000000000..e76e47f3c --- /dev/null +++ b/server-data/resources/[bpt_addons]/bpt_banking/config.lua @@ -0,0 +1,131 @@ +Config = { + Debug = false, + DrawMarker = 10, + Locale = GetConvar('esx:locale', 'en'), + EnablePeds = true, + AtmModels = { `prop_fleeca_atm`, `prop_atm_01`, `prop_atm_02`, `prop_atm_03` }, + Banks = { + { + Position = vector4(149.91, -1040.74, 29.374, 160), + Blip = { + Enabled = true, + Color = 69, + Label = 'Bank', + Sprite = 108, + Scale = 0.7 + } + }, + { + Position = vector4(-1212.63, -330.78, 37.59, 210), + Blip = { + Enabled = true, + Color = 69, + Label = 'Bank', + Sprite = 108, + Scale = 0.7 + } + }, + { + Position = vector4(-2962.47, 482.93, 15.5, 270), + Blip = { + Enabled = true, + Color = 69, + Label = 'Bank', + Sprite = 108, + Scale = 0.7 + } + }, + { + Position = vector4(-113.01, 6470.24, 31.43, 315), + Blip = { + Enabled = true, + Color = 69, + Label = 'Bank', + Sprite = 108, + Scale = 0.7 + } + }, + { + Position = vector4(314.16, -279.09, 53.97, 160), + Blip = { + Enabled = true, + Color = 69, + Label = 'Bank', + Sprite = 108, + Scale = 0.7 + } + }, + { + Position = vector4(-350.99, -49.99, 48.84, 160), + Blip = { + Enabled = true, + Color = 69, + Label = 'Bank', + Sprite = 108, + Scale = 0.7 + } + }, + { + Position = vector4(1175.02, 2706.87, 37.89, 0), + Blip = { + Enabled = true, + Color = 69, + Label = 'Bank', + Sprite = 108, + Scale = 0.7 + } + }, + { + Position = vector4(246.63, 223.62, 106.0, 160), + Blip = { + Enabled = true, + Color = 69, + Label = 'Bank', + Sprite = 108, + Scale = 0.7 + } + }, + }, + Peds = { + { + Position = vector4(149.5513, -1042.1570, 29.3680, 341.6520), + Model = `U_M_M_BankMan`, + Scenario = 'WORLD_HUMAN_CLIPBOARD' + }, + { + Position = vector4(-1211.8585, -331.9854, 37.7809, 28.5983), + Model = `U_M_M_BankMan`, + Scenario = 'WORLD_HUMAN_CLIPBOARD' + }, + { + Position = vector4(-2961.0720, 483.1107, 15.6970, 88.1986), + Model = `U_M_M_BankMan`, + Scenario = 'WORLD_HUMAN_CLIPBOARD' + }, + { + Position = vector4(-112.2223, 6471.1128, 31.6267, 132.7517), + Model = `U_M_M_BankMan`, + Scenario = 'WORLD_HUMAN_CLIPBOARD' + }, + { + Position = vector4(313.8176, -280.5338, 54.1647, 339.1609), + Model = `U_M_M_BankMan`, + Scenario = 'WORLD_HUMAN_CLIPBOARD' + }, + { + Position = vector4(-351.3247, -51.3466, 49.0365, 339.3305), + Model = `U_M_M_BankMan`, + Scenario = 'WORLD_HUMAN_CLIPBOARD' + }, + { + Position = vector4(1174.9718, 2708.2034, 38.0879, 178.2974), + Model = `U_M_M_BankMan`, + Scenario = 'WORLD_HUMAN_CLIPBOARD' + }, + { + Position = vector4(247.0348, 225.1851, 106.2875, 158.7528), + Model = `U_M_M_BankMan`, + Scenario = 'WORLD_HUMAN_CLIPBOARD' + } + } +} diff --git a/server-data/resources/[bpt_addons]/bpt_banking/fxmanifest.lua b/server-data/resources/[bpt_addons]/bpt_banking/fxmanifest.lua new file mode 100644 index 000000000..aa1ac1d34 --- /dev/null +++ b/server-data/resources/[bpt_addons]/bpt_banking/fxmanifest.lua @@ -0,0 +1,31 @@ +fx_version 'cerulean' + +game 'gta5' + +description 'A banking system that adds interactable banks and ATMs' +lua54 'yes' +version '1.0.1' + +shared_scripts { + '@es_extended/imports.lua', + '@es_extended/locale.lua', + 'locales/*.lua', + 'config.lua' +} + +server_scripts { + '@oxmysql/lib/MySQL.lua', + 'server/main.lua' +} + +client_scripts { + 'client/main.lua' +} + +ui_page 'html/ui.html' + +files { + 'html/**', +} + +dependency 'es_extended' diff --git a/server-data/resources/[bpt_addons]/bpt_banking/html/config.json b/server-data/resources/[bpt_addons]/bpt_banking/html/config.json new file mode 100644 index 000000000..c69f82a88 --- /dev/null +++ b/server-data/resources/[bpt_addons]/bpt_banking/html/config.json @@ -0,0 +1,198 @@ +{ + "lang": "EN", + "__comment": "On DYNAMIC_FORM_DATA do not change 'componentName', 'elementID'!", + "EN": { + "DYNAMIC_FORM_DATA": [ + { + "componentName": "moreGraph", + "elementID": "#wrapper", + "title": "", + "closeButtonText": "Close", + "bankTitle": "Fleeca Bank", + "mainExitButtonText": "Log out" + }, + { + "elementID": "#cpincode", + "name": "cpincode", + "buttonText": "Approve", + "inputPlaceholder": "Enter 4 digit...", + "title": "PIN CODE SETUP", + "description": "Here you can set or change the PIN code.", + "type": "password" + }, + { + "elementID": "#withdraw", + "name": "withdraw", + "buttonText": "Approve", + "inputPlaceholder": "Amount", + "title": "WITHDRAW", + "description": "Here you can withdraw your money from the bank.", + "type": "number" + }, + { + "elementID": "#deposit", + "name": "deposit", + "buttonText": "Approval", + "inputPlaceholder": "Amount", + "title": "DEPOSIT", + "description": "Here, you can deposit your money to the bank.", + "type": "number" + }, + { + "elementID": "#transfer", + "name": "transfer", + "buttonText": "Transfer", + "inputPlaceholder": "Amount", + "inputPlaceholder2": "Player ID", + "title": "TRANSFER", + "description": "Here you can transfer your money to someone else." + }, + { + "componentName": "trans", + "elementID": "#third-column", + "title": "TRANSACTION HISTORY", + "description": "Here you can see your transaction history.", + "moreHistoryText": "Show more history", + "moreGraphText": "Show more graph" + }, + { + "componentName": "pincodePanel", + "elementID": "#wrapper", + "title": "Enter PIN", + "deleteButtonText": "", + "loginButtonText": "", + "closeButtonText": "Close" + }, + { + "componentName": "atmComponent", + "elementID": "#wrapper", + "title": "Fleeca Bank", + "closeButtonText": "Log out" + } + ], + "LAUNGAGE": { + "your_money_title": "Balance", + "your_money_desc": "Here you can see your current balance and cash.", + "your_money_cash_label": "Your cash", + "your_money_bank_label": "Your bank balance", + "withdraw": "WITHDRAW", + "deposit": "DEPOSIT", + "transfer": "TRANSFER", + "transferReceive": "RECEIVED TRANSFER", + "moneyFormat": "$__replaceData__", + "graphTitle": "Your balance", + "moreGraphTitle": "Big Graph", + "moreHistoryTitle": "Show more history", + "inputErrorTitle": "Data is incorrect", + "inputErrorMessage": "It cannot be empty or a value less than 1!", + "showPincodeErrorTitle": "PIN incorrect", + "showPincodeErrorMessage": "The pin must have at least 4 characters!", + "tableLang": { + "typeLabel": "Transaction type", + "transactionLabel": "Transaction Label", + "balanceLabel": "Balance", + "amountLabel": "Amount", + "timeLabel": "Time", + "searchInputPlaceholder": "Search ...", + "tableFullLanguage": "English" + } + } + }, + "IT": { + "DYNAMIC_FORM_DATA": [ + { + "componentName": "moreGraph", + "elementID": "#wrapper", + "title": "", + "closeButtonText": "Close", + "bankTitle": "Fleeca Bank", + "mainExitButtonText": "Disconnettersi" + }, + { + "elementID": "#cpincode", + "name": "cpincode", + "buttonText": "conferma", + "inputPlaceholder": "4 cifre...", + "title": "IMPOSTAZIONE CODICE PIN", + "description": "Qui puoi impostare o modificare il codice PIN.", + "type": "password" + }, + { + "elementID": "#withdraw", + "name": "withdraw", + "buttonText": "conferma", + "inputPlaceholder": "Quantità", + "title": "RITIRARE", + "description": "Qui puoi prelevare i tuoi soldi dalla banca.", + "type": "number" + }, + { + "elementID": "#deposit", + "name": "deposit", + "buttonText": "conferma", + "inputPlaceholder": "Quantità", + "title": "DEPOSITARE", + "description": "Qui puoi depositare i tuoi soldi in banca.", + "type": "number" + }, + { + "elementID": "#transfer", + "name": "transfer", + "buttonText": "trasferisci", + "inputPlaceholder": "Quantità", + "inputPlaceholder2": "Giocatore ID", + "title": "TRASFERIMENTO", + "description": "Qui puoi trasferire i tuoi soldi a qualcun altro." + }, + { + "componentName": "trans", + "elementID": "#third-column", + "title": "CRONOLOGIA DELLE TRANSAZIONI", + "description": "Qui puoi vedere la cronologia delle tue operazioni.", + "moreHistoryText": "Mostra più cronologia", + "moreGraphText": "Mostra tutto il grafico" + }, + { + "componentName": "pincodePanel", + "elementID": "#wrapper", + "title": "Enter PIN", + "deleteButtonText": "", + "loginButtonText": "", + "closeButtonText": "Close" + }, + { + "componentName": "atmComponent", + "elementID": "#wrapper", + "title": "Fleeca Bank", + "closeButtonText": "Disconnettersi" + } + ], + "LAUNGAGE": { + "your_money_title": "saldo", + "your_money_desc": "qui puoi vedere il saldo attuale e contanti.", + "your_money_cash_label": "i tuoi soldi", + "your_money_bank_label": "il tuo saldo bancario", + "withdraw": "RITIRARE", + "deposit": "DEPOSITARE", + "transfer": "TRASFERIMENTO", + "transferReceive": "TRASFERIMENTO RICEVUTO", + "moneyFormat": "$__replaceData__", + "graphTitle": "Il tuo bilancio", + "moreGraphTitle": "grafico", + "moreHistoryTitle": "Mostra la cronologia", + "inputErrorTitle": "I dati non sono corretti", + "inputErrorMessage": "Non può essere vuoto o un valore inferiore a 1!", + "showPincodeErrorTitle": "PIN errato", + "showPincodeErrorMessage": "Il pin deve contenere almeno 4 caratteri!", + "tableLang": { + "typeLabel": "Tipo di transazione", + "transactionLabel": "Transaction Label", + "balanceLabel": "bilancio", + "amountLabel": "quantità", + "timeLabel": "tempo", + "searchInputPlaceholder": "Cerca ...", + "tableFullLanguage": "Italian" + } + } + } +} \ No newline at end of file diff --git a/server-data/resources/[bpt_addons]/bpt_banking/html/css/app.css b/server-data/resources/[bpt_addons]/bpt_banking/html/css/app.css new file mode 100644 index 000000000..263eaeb0b --- /dev/null +++ b/server-data/resources/[bpt_addons]/bpt_banking/html/css/app.css @@ -0,0 +1,791 @@ +:root { + --primary-color: #2e69d5; + --secondary-color: #378cbf; + --text-color: #ffff; + --background-light: #232934; + --background-light-2: #202020; + --background-dark: #0a0e19; + --accent-red: #378cbf; + --accent-green: #45b157; + --accent-gray: #474e57; + --accent-gray-2: #545457; + + --columnsBackground: var(--background-dark); + --allTitleColor: var(--text-color); + --yourMoneyPriceTextColor: var(--accent-green); + --bankCardBackgroundColor: linear-gradient(110deg, + var(--primary-color) 0%, + var(--secondary-color) 100%); + --buttonBackgroundColor: var(--background-light); + --inputBackgroundColor: var(--background-light); + --inputTextColor: var(--text-color); + --inputPlaceholderColor: var(--accent-gray-2); + --checkmarkColor: var(--text-color); + --acceptExitButtonColorText: var(--text-color); + --exitButtonHoverBackgroundColor: var(--primary-color); + --acceptButtonHoverBackgroundColor: var(--secondary-color); + --bankCardTextColor: var(--text-color); + --bankCardNumberColor: var(--text-color); + --moneyContainerBackgroundColor: var(--background-light); + --moneyAndTransactionContainer: var(--background-light); + --transactionContainerBackgroundColor: var(--background-light); + --moneyAndTransactionallTitleColorText: var(--text-color); + --transactionDataTextColor: var(--text-color); + --cardSubtitleTextColor: var(--accent-gray); + --depositColorText: var(--accent-green); + --withDrawColorText: var(--primary-color); + --moreHistoryButtonHoverColor: var(--secondary-color); + --moreGraphButtonHoverColor: var(--secondary-color); + --hrRowColor: var(--accent-gray); + --loadingCircle: var(--secondary-color); + --tableAllTextColor: var(--text-color); + --tableBackgroundColorPaginationButton: var(--secondary-color); + --tableBackgroundColorPaginationButtonHover: var(--secondary-color); + --tableRowHoverBackgroundColor: var(--secondary-color); + --tableScrollBarBackgroundColor: var(--background-light); + --tableScrollBarBackgroundColorHover: var(--secondary-color); + --tableSelectBoxBackgroundColor: var(--background-light); + --tableSearchInputBackgroundColor: var(--background-light); + --tableScrollBarBackgroundColor2: var(--background-light); + --disableButtonBackgroundColor: var(--background-light-2); + --graphLineColor: var(--secondary-color); + --graphLineBackgroundColor: var(--secondary-color); +} + +@import url("https://fonts.googleapis.com/css2?family=Raleway:wght@100;400;500;800&display=swap"); + +* { + margin: 0; + padding: 0; +} + +#wrapper { + width: 100%; + height: 93.24vmin; + display: flex; + justify-content: center; + align-items: center; + font-family: "Raleway", sans-serif; + user-select: none; + min-width: 42vmin; + font-size: 2vmin; + display: none; +} + +#container { + height: 73vmin; + width: 139.41vmin; + cursor: default; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + max-width: 150vmin; + flex-wrap: wrap; + margin: 2vmin; + position: relative; + display: none; +} + +#menu { + display: flex; + flex-direction: row; + gap: 3vmin; + flex-wrap: wrap; + height: 68.15vmin; +} + +/* FIRST COLUMN START */ + +#menu #first-column { + width: 36vmin; + background: var(--columnsBackground); + padding: 1.85vmin; + display: flex; + flex-direction: column; + gap: 1.79vmin; + border-radius: 1.38vmin; + flex: 1 1 27.7vmin; + height: 72.56vmin; +} + +#menu #first-column hr { + border: 1px solid var(--hrRowColor); + width: 80%; + margin: 0 auto; +} + +#bankcard { + height: 16.6vmin; + width: 25vmin; + margin: 0 auto; + background: var(--bankCardBackgroundColor); + border-radius: 1.38vmin; + padding: 1.85vmin 1.6vmin 0px 1.85vmin; + position: relative; +} + +#bankcard .content p { + margin: 0; + color: var(--bankCardTextColor); + font-size: 0.92vmin; +} + +#bankcard .title { + display: flex; + justify-content: space-between; +} + +#bankcard .title span { + color: var(--bankCardTextColor); +} + +#bankcard .title svg { + width: 4.16vmin; + height: 4.16vmin; +} + +#bankcard .content { + position: absolute; + bottom: 1.66vmin; +} + +#bankcard .content .card-data { + display: flex; + justify-content: space-between; +} + +#bankcard .content .cardnumber { + color: var(--bankCardNumberColor); + font-size: 1.85vmin; + letter-spacing: 0.37vmin; + margin-bottom: 0.46vmin; +} + +#bankcard .content .card-data:nth-child(2) { + margin-right: 0.27vmin; +} + +#bankcard .content .card-data p { + font-size: 1.48vmin; +} + +#your-money-panel #money-containers { + display: flex; + flex-direction: column; + gap: 0.92vmin; +} + +.exit-button, +.accept-button, +#pincode-container .button-groups button { + background-color: var(--buttonBackgroundColor); + padding: 1.85vmin 1.85vmin; + /*width: 35vmin;*/ + width: 100%; + outline: none; + border: none; + color: var(--acceptExitButtonColorText); + display: flex; + align-items: center; + justify-content: center; + transition: all 0.3s ease; + font-weight: bold; + border-radius: 0.27vmin; + font-family: "Raleway", sans-serif; + font-size: 1.5vmin; +} + +.exit-button:hover, +#modal-container #title-container button:hover { + background-color: var(--exitButtonHoverBackgroundColor); + box-shadow: -1vmin 1vmin 1vmin -1vmin var(--exitButtonHoverBackgroundColor); +} + +.accept-button:hover { + background-color: var(--acceptButtonHoverBackgroundColor); + box-shadow: -1vmin 1vmin 1vmin -1vmin var(--acceptButtonHoverBackgroundColor); +} + +/* FIRST COLUMN END */ + +/* SECOND COLUMN START*/ + +#menu #second-column { + width: 35.18vmin; + border-radius: 1.38vmin; + display: flex; + align-items: center; + flex-direction: column; + gap: 0.92vmin; + flex: 1 1 27.77vmin; + padding-right: 1.85vmin; + padding-left: 1.85vmin; +} + +#withdraw, +#deposit, +#transfer { + background: var(--columnsBackground); + padding: 1.85vmin; + border-radius: 1.38vmin; + width: 35.18vmin; +} + +#menu #second-column #withdraw { + height: 18.48vmin; +} + +#menu #second-column #deposit { + height: 18.48vmin; +} + +#menu #second-column #transfer { + height: 26.63vmin; +} + +/* SECOND COLUMN END*/ + +/* THIRD COLUMN START*/ + +#menu #third-column { + width: 32.77vmin; + background: var(--columnsBackground); + border-radius: 1.38vmin; + padding: 1.85vmin; + flex: 1 1 37.03vmin; +} + +#menu #third-column #graph-container { + width: calc(100% - 0.46vmin); + height: 38vmin; +} + +#menu #third-column #buttons-container { + display: flex; + justify-content: center; + align-items: center; + margin: 0px 1.9vmin; + margin-top: 1.48vmin; + gap: 0.92vmin; +} + +#menu #third-column #buttons-container button { + padding: 0.92vmin; + width: 20.92vmin; +} + +#menu #third-column #buttons-container #more_history:hover { + background-color: var(--moreHistoryButtonHoverColor); + box-shadow: 0px 3.42vmin 9.25vmin -1.2vmin var(--moreHistoryButtonHoverColor); +} + +#menu #third-column #buttons-container #more_graph:hover { + background-color: var(--moreGraphButtonHoverColor); + box-shadow: 0px 3.42vmin 9.25vmin -1.2vmin var(--moreGraphButtonHoverColor); +} + +#menu #third-column #transactions-container { + display: flex; + flex-direction: column; + align-items: center; + gap: 0.92vmin; + padding: 1.85vmin; +} + +#menu #third-column #transactions-container .transaction-container { + /* width: 40.37vmin; */ + width: 100%; + background-color: var(--transactionContainerBackgroundColor); + padding: 0.92vmin 0.92vmin 0.92vmin 1.85vmin; + font-size: 1.8vmin; +} + +#menu #third-column #transactions-container .transaction-container .transaction { + display: flex; + justify-content: space-between; + align-items: center; + font-size: 1.5vmin; + margin-bottom: 0.8vmin; +} + +#menu #third-column #transactions-container .transaction-container .transaction span { + color: var(--transactionDataTextColor); + background: var(--columnsBackground); + border-radius: 0.27vmin; + padding: 0.46vmin; + font-size: 1.2vmin; +} + +/* THIRD COLUMN END*/ + +/* GENERAL START*/ + +.money-container, +.transaction-container { + background-color: var(--moneyAndTransactionContainer); + padding: 0.92vmin 0.92vmin 0.92vmin 1.85vmin; + border-radius: 0.27vmin; +} + +.money-container { + background-color: var(--moneyContainerBackgroundColor); +} + +.money-container h4 { + margin-bottom: 0.5vmin; +} + +.money-container h4, +.transaction h4 { + color: var(--moneyAndTransactionallTitleColorText); + text-shadow: 0.09vmin 0.09vmin 0.18vmin black; + font-size: 1.5vmin; + width: 25vmin; +} + +.money-container span, +.transaction-container span { + color: var(--yourMoneyPriceTextColor); + text-shadow: 0.09vmin 0.09vmin 0.18vmin black; + font-size: 1.5vmin; +} + +.accept-button svg { + height: 1.38vmin; + fill: var(--checkmarkColor); +} + +.green-text { + color: var(--depositColorText) !important; +} + +.red-text { + color: var(--withDrawColorText) !important; +} + +.disable-button { + background-color: var(--disableButtonBackgroundColor) !important; + pointer-events: none; +} + +h3 { + color: #ecedef; + color: var(--allTitleColor); + font-size: 2.31vmin; + text-shadow: 0.09vmin 0.09vmin 0.92vmin rgb(255 255 255 / 47%); + text-transform: uppercase; +} + +p { + color: var(--cardSubtitleTextColor); + margin-bottom: 0.92vmin; + font-size: 1.5vmin; +} + +input { + width: 100%; + font-family: "Raleway", sans-serif; + font-size: 1.38vmin; + background-color: var(--inputBackgroundColor); + padding: 1.85vmin 1.85vmin; + outline: none; + border: none; + color: var(--inputTextColor); + margin-bottom: 1.85vmin; + border-radius: 0.46vmin; +} + +input::placeholder { + color: var(--inputPlaceholderColor); + opacity: 1; +} + +input::-webkit-outer-spin-button, +input::-webkit-inner-spin-button { + -webkit-appearance: none; + margin: 0; +} + +/* GENERAL END*/ + +#modal-container { + background-color: var(--columnsBackground); + position: absolute; + top: 50%; + height: 100%; + width: 100%; + z-index: 2; + transform: translateY(-50%); + display: none; + border-radius: 1.38vmin; +} + +#more-modal-container { + height: 93%; + padding: 0 6vmin; +} + +#modal-container h3 { + text-align: center; + width: 100%; + margin-top: 1vmin; +} + +#modal-container #title-container button { + background-color: var(--buttonBackgroundColor); + padding: 1.85vmin 1.85vmin; + transition: all 0.3s ease; + font-weight: bold; + border-radius: 0.27vmin 0.27vmin 0.27vmin 1.27vmin; + font-family: "Raleway", sans-serif; + font-size: 1.5vmin; + border: none; + color: var(--inputTextColor); + margin-left: auto; + position: absolute; + right: 0vmin; + top: 0vmin; + width: 14vmin; +} + +/*DATA TABLES DESIGN */ + +.dataTables_wrapper .dataTables_info { + clear: both; + float: left; + padding-top: 0.755em; + color: var(--tableAllTextColor) !important; +} + +#example_wrapper { + margin-top: 4vmin; + color: var(--tableAllTextColor) !important; + padding: 1vmin; + font-family: "Raleway", sans-serif !important; +} + +#example_filter input { + display: flex; + gap: 1vmin; + border: none; + padding: 2vmin; + background-color: var(--tableSearchInputBackgroundColor); +} + +.dataTables_wrapper .dataTables_length, +.dataTables_wrapper .dataTables_filter, +.dataTables_wrapper .dataTables_info, +.dataTables_wrapper .dataTables_processing, +.dataTables_wrapper .dataTables_paginate { + color: var(--tableAllTextColor) !important; +} + +table.dataTable thead>tr>th.sorting, +table.dataTable thead>tr>th.sorting_asc, +table.dataTable thead>tr>th.sorting_desc, +table.dataTable thead>tr>th.sorting_asc_disabled, +table.dataTable thead>tr>th.sorting_desc_disabled, +table.dataTable thead>tr>td.sorting, +table.dataTable thead>tr>td.sorting_asc, +table.dataTable thead>tr>td.sorting_desc, +table.dataTable thead>tr>td.sorting_asc_disabled, +table.dataTable thead>tr>td.sorting_desc_disabled, +table.dataTable thead>tr>td.sorting_disabled { + cursor: pointer; + position: relative; + padding-right: 26px; + color: var(--tableAllTextColor) !important; +} + +table.dataTable tbody tr td { + color: var(--tableAllTextColor); + font-weight: 500; +} + +.greenTableText { + color: var(--depositColorText) !important; +} + +.redTableText { + color: var(--withDrawColorText) !important; +} + +table.dataTable.no-footer { + border-bottom: 1px solid rgba(0, 0, 0, 0.3); +} + +.dataTables_wrapper .dataTables_paginate .paginate_button.disabled, +.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover, +.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:active { + cursor: default; + color: var(--tableAllTextColor) !important; + border: 1px solid #828282; + background: transparent; + box-shadow: none; +} + +.dataTables_wrapper .dataTables_paginate .paginate_button { + background: none; + color: var(--tableAllTextColor) !important; + border-radius: 4px; + border: 1px solid #828282; +} + +.dataTables_wrapper .dataTables_paginate .paginate_button:hover { + color: white !important; + background: var(--tableBackgroundColorPaginationButtonHover) !important; + background: var(--tableBackgroundColorPaginationButtonHover) !important; + background: var(--tableBackgroundColorPaginationButtonHover) !important; + background: var(--tableBackgroundColorPaginationButtonHover) !important; + box-shadow: 0px 3.42vmin 9.25vmin -1.2vmin var(--tableBackgroundColorPaginationButtonHover) !important; +} + +.dataTables_wrapper .dataTables_paginate .paginate_button.current, +.dataTables_wrapper .dataTables_paginate .paginate_button.current:hover { + background: var(--tableBackgroundColorPaginationButton) !important; + background: var(--tableBackgroundColorPaginationButton) !important; + background: var(--tableBackgroundColorPaginationButton) !important; + background: var(--tableBackgroundColorPaginationButton) !important; + box-shadow: 0px 3.42vmin 9.25vmin -1.2vmin var(--tableBackgroundColorPaginationButton) !important; + color: var(--tableAllTextColor) !important; +} + +.dataTables_wrapper .dataTables_length select { + border-radius: 3px; + padding: 5px; + background-color: var(--tableSelectBoxBackgroundColor) !important; + padding: 4px; + color: var(--tableAllTextColor) !important; + padding: 1vmin; + border: none; + outline: none; +} + +table.dataTable tbody tr { + height: 50px !important; +} + +table.dataTable tbody tr:hover { + background-color: var(--tableRowHoverBackgroundColor) !important; +} + +#example_wrapper>div.dataTables_scroll>div.dataTables_scrollHead>div>table>thead>tr>th.sorting_disabled { + color: var(--tableAllTextColor) !important; +} + +/*DATA TABLE DESIGN END*/ + +/*SCROLLBAR DESIGN*/ +::-webkit-scrollbar { + width: 5px; +} + +::-webkit-scrollbar-track { + background: var(--tableScrollBarBackgroundColor2); +} + +::-webkit-scrollbar-thumb { + background: var(--tableScrollBarBackgroundColor); +} + +::-webkit-scrollbar-thumb:hover { + background: var(--tableScrollBarBackgroundColorHover); +} + +/* LOADING CIRCLE*/ + +:root { + --rotation-animation-speed: 2s; + --rotation-animation-easing: linear; + --stroke-animation-speed: 1.5s; + --stroke-animation-easing: ease-in-out; + --stroke-width: 3px; + --stroke-start-dasharray: 1, 200; + --stroke-end-dasharray: 89, 200; +} + +.loader { + margin: 0px auto; + width: 23.14vmin; + height: 23.14vmin; + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + z-index: 2; + display: none; +} + +.circular-loader { + animation: rotate var(--rotation-animation-speed) var(--rotation-animation-easing) infinite; +} + +.loader-path { + fill: none; + stroke-width: var(--stroke-width); + animation: animate-stroke var(--stroke-animation-speed) var(--stroke-animation-easing) infinite; + stroke-linecap: round; +} + +@keyframes rotate { + 100% { + transform: rotate(360deg); + } +} + +@keyframes animate-stroke { + 0% { + stroke-dasharray: var(--stroke-start-dasharray); + stroke-dashoffset: 0; + stroke: var(--columnsBackground); + } + + 50% { + stroke-dasharray: var(--stroke-end-dasharray); + stroke-dashoffset: -35; + stroke: var(--loadingCircle); + } + + 100% { + stroke-dasharray: var(--stroke-end-dasharray); + stroke-dashoffset: -124; + stroke: var(--loadingCircle); + } +} + +#pincode-container { + background-color: var(--columnsBackground); + height: 80%; + width: 40vmin; + color: white; + display: flex; + border-radius: 3vmin; + flex-direction: column; + justify-content: center; + gap: 5vmin; +} + +#pincode-container h4 { + text-align: center; + margin-top: 2vmin; +} + +#pincode-container .pincode-input { + display: flex; + justify-content: center; + align-items: center; + height: 15vmin; + width: 100%; + gap: 10px; +} + +#pincode-container .pincode-input span { + display: block; + width: 3vmin; + height: 3vmin; + border-radius: 50%; + border: 2px solid var(--secondary-color); + transition: all 0.2s ease; +} + +#pincode-container .pincode-numbers { + display: grid; + grid-template-columns: 10vmin 10vmin 10vmin; + grid-template-rows: 10vmin 10vmin 10vmin; + place-items: center; + justify-content: center; +} + +#pincode-container .pincode-numbers div { + background-color: var(--background-light); + padding: 2vmin 2vmin; + border-radius: 50%; + width: 3vmin; + height: 3vmin; + display: flex; + justify-content: center; + align-items: center; + transition: all 0.3s ease; +} + +#pincode-container .pincode-numbers div:hover { + background-color: var(--secondary-color); + box-shadow: 0px 3.42vmin 9.25vmin -1.2vmin var(--secondary-color); +} + +#pincode-container .pincode-numbers div:nth-child(11):hover { + background-color: var(--exitButtonHoverBackgroundColor); + box-shadow: 0px 3.42vmin 9.25vmin -1.2vmin var(--exitButtonHoverBackgroundColor); +} + +#pincode-container .pincode-numbers div:nth-child(12):hover { + background-color: var(--acceptButtonHoverBackgroundColor); + box-shadow: 0px 3.42vmin 9.25vmin -1.2vmin var(--acceptButtonHoverBackgroundColor); +} + +#pincode-container .button-groups { + display: flex; + flex-direction: column; + align-items: center; + gap: 2vmin; + margin-top: 2vmin; +} + +#pincode-container .button-groups button { + width: 80%; +} + +#pincode-container .button-groups button:hover { + background-color: var(--exitButtonHoverBackgroundColor); + box-shadow: 0px 3.42vmin 9.25vmin -1.2vmin var(--exitButtonHoverBackgroundColor); +} + +#pincode-container .button-groups .login:hover { + background-color: var(--acceptButtonHoverBackgroundColor); + box-shadow: 0px 3.42vmin 9.25vmin -1.2vmin var(--acceptButtonHoverBackgroundColor); +} + +.circleBackground { + background-color: var(--secondary-color); +} + +/* ATM DESIGNS*/ + +#atm-container { + display: grid; + grid-template-columns: 60% 60%; + gap: 3vmin; + height: 58vh; +} + +.firstGridColumn, +.secondGridColumn { + display: flex; + flex-direction: column; + padding: 1.85vmin; +} + +.firstGridColumn { + gap: 1.79vmin; + border-radius: 1.38vmin; + background: var(--columnsBackground); +} + +.secondGridColumn { + gap: 3vmin; + justify-content: center; +} + +.secondGridColumn div { + background: var(--columnsBackground); + padding: 3vmin; + border-radius: 1.38vmin; +} + +/*MEDIA QUERY*/ +@media only screen and (max-width: 1280px) { + .dataTables_scrollBody { + max-height: 310px !important; + } +} \ No newline at end of file diff --git a/server-data/resources/[esx_addons]/esx_banking/html/jquery-3.6.4.min.js b/server-data/resources/[bpt_addons]/bpt_banking/html/jquery-3.6.4.min.js similarity index 99% rename from server-data/resources/[esx_addons]/esx_banking/html/jquery-3.6.4.min.js rename to server-data/resources/[bpt_addons]/bpt_banking/html/jquery-3.6.4.min.js index cab780c70..dfeeeb049 100644 --- a/server-data/resources/[esx_addons]/esx_banking/html/jquery-3.6.4.min.js +++ b/server-data/resources/[bpt_addons]/bpt_banking/html/jquery-3.6.4.min.js @@ -1,2 +1,2 @@ /*! jQuery v3.6.4 | (c) OpenJS Foundation and other contributors | jquery.org/license */ -!function (e, t) { "use strict"; "object" == typeof module && "object" == typeof module.exports ? module.exports = e.document ? t(e, !0) : function (e) { if (!e.document) throw new Error("jQuery requires a window with a document"); return t(e) } : t(e) }("undefined" != typeof window ? window : this, function (C, e) { "use strict"; var t = [], r = Object.getPrototypeOf, s = t.slice, g = t.flat ? function (e) { return t.flat.call(e) } : function (e) { return t.concat.apply([], e) }, u = t.push, i = t.indexOf, n = {}, o = n.toString, y = n.hasOwnProperty, a = y.toString, l = a.call(Object), v = {}, m = function (e) { return "function" == typeof e && "number" != typeof e.nodeType && "function" != typeof e.item }, x = function (e) { return null != e && e === e.window }, E = C.document, c = { type: !0, src: !0, nonce: !0, noModule: !0 }; function b(e, t, n) { var r, i, o = (n = n || E).createElement("script"); if (o.text = e, t) for (r in c) (i = t[r] || t.getAttribute && t.getAttribute(r)) && o.setAttribute(r, i); n.head.appendChild(o).parentNode.removeChild(o) } function w(e) { return null == e ? e + "" : "object" == typeof e || "function" == typeof e ? n[o.call(e)] || "object" : typeof e } var f = "3.6.4", S = function (e, t) { return new S.fn.init(e, t) }; function p(e) { var t = !!e && "length" in e && e.length, n = w(e); return !m(e) && !x(e) && ("array" === n || 0 === t || "number" == typeof t && 0 < t && t - 1 in e) } S.fn = S.prototype = { jquery: f, constructor: S, length: 0, toArray: function () { return s.call(this) }, get: function (e) { return null == e ? s.call(this) : e < 0 ? this[e + this.length] : this[e] }, pushStack: function (e) { var t = S.merge(this.constructor(), e); return t.prevObject = this, t }, each: function (e) { return S.each(this, e) }, map: function (n) { return this.pushStack(S.map(this, function (e, t) { return n.call(e, t, e) })) }, slice: function () { return this.pushStack(s.apply(this, arguments)) }, first: function () { return this.eq(0) }, last: function () { return this.eq(-1) }, even: function () { return this.pushStack(S.grep(this, function (e, t) { return (t + 1) % 2 })) }, odd: function () { return this.pushStack(S.grep(this, function (e, t) { return t % 2 })) }, eq: function (e) { var t = this.length, n = +e + (e < 0 ? t : 0); return this.pushStack(0 <= n && n < t ? [this[n]] : []) }, end: function () { return this.prevObject || this.constructor() }, push: u, sort: t.sort, splice: t.splice }, S.extend = S.fn.extend = function () { var e, t, n, r, i, o, a = arguments[0] || {}, s = 1, u = arguments.length, l = !1; for ("boolean" == typeof a && (l = a, a = arguments[s] || {}, s++), "object" == typeof a || m(a) || (a = {}), s === u && (a = this, s--); s < u; s++)if (null != (e = arguments[s])) for (t in e) r = e[t], "__proto__" !== t && a !== r && (l && r && (S.isPlainObject(r) || (i = Array.isArray(r))) ? (n = a[t], o = i && !Array.isArray(n) ? [] : i || S.isPlainObject(n) ? n : {}, i = !1, a[t] = S.extend(l, o, r)) : void 0 !== r && (a[t] = r)); return a }, S.extend({ expando: "jQuery" + (f + Math.random()).replace(/\D/g, ""), isReady: !0, error: function (e) { throw new Error(e) }, noop: function () { }, isPlainObject: function (e) { var t, n; return !(!e || "[object Object]" !== o.call(e)) && (!(t = r(e)) || "function" == typeof (n = y.call(t, "constructor") && t.constructor) && a.call(n) === l) }, isEmptyObject: function (e) { var t; for (t in e) return !1; return !0 }, globalEval: function (e, t, n) { b(e, { nonce: t && t.nonce }, n) }, each: function (e, t) { var n, r = 0; if (p(e)) { for (n = e.length; r < n; r++)if (!1 === t.call(e[r], r, e[r])) break } else for (r in e) if (!1 === t.call(e[r], r, e[r])) break; return e }, makeArray: function (e, t) { var n = t || []; return null != e && (p(Object(e)) ? S.merge(n, "string" == typeof e ? [e] : e) : u.call(n, e)), n }, inArray: function (e, t, n) { return null == t ? -1 : i.call(t, e, n) }, merge: function (e, t) { for (var n = +t.length, r = 0, i = e.length; r < n; r++)e[i++] = t[r]; return e.length = i, e }, grep: function (e, t, n) { for (var r = [], i = 0, o = e.length, a = !n; i < o; i++)!t(e[i], i) !== a && r.push(e[i]); return r }, map: function (e, t, n) { var r, i, o = 0, a = []; if (p(e)) for (r = e.length; o < r; o++)null != (i = t(e[o], o, n)) && a.push(i); else for (o in e) null != (i = t(e[o], o, n)) && a.push(i); return g(a) }, guid: 1, support: v }), "function" == typeof Symbol && (S.fn[Symbol.iterator] = t[Symbol.iterator]), S.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "), function (e, t) { n["[object " + t + "]"] = t.toLowerCase() }); var d = function (n) { var e, d, b, o, i, h, f, g, w, u, l, T, C, a, E, y, s, c, v, S = "sizzle" + 1 * new Date, p = n.document, k = 0, r = 0, m = ue(), x = ue(), A = ue(), N = ue(), j = function (e, t) { return e === t && (l = !0), 0 }, D = {}.hasOwnProperty, t = [], q = t.pop, L = t.push, H = t.push, O = t.slice, P = function (e, t) { for (var n = 0, r = e.length; n < r; n++)if (e[n] === t) return n; return -1 }, R = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", M = "[\\x20\\t\\r\\n\\f]", I = "(?:\\\\[\\da-fA-F]{1,6}" + M + "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+", W = "\\[" + M + "*(" + I + ")(?:" + M + "*([*^$|!~]?=)" + M + "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + I + "))|)" + M + "*\\]", F = ":(" + I + ")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|" + W + ")*)|.*)\\)|)", $ = new RegExp(M + "+", "g"), B = new RegExp("^" + M + "+|((?:^|[^\\\\])(?:\\\\.)*)" + M + "+$", "g"), _ = new RegExp("^" + M + "*," + M + "*"), z = new RegExp("^" + M + "*([>+~]|" + M + ")" + M + "*"), U = new RegExp(M + "|>"), X = new RegExp(F), V = new RegExp("^" + I + "$"), G = { ID: new RegExp("^#(" + I + ")"), CLASS: new RegExp("^\\.(" + I + ")"), TAG: new RegExp("^(" + I + "|[*])"), ATTR: new RegExp("^" + W), PSEUDO: new RegExp("^" + F), CHILD: new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + M + "*(even|odd|(([+-]|)(\\d*)n|)" + M + "*(?:([+-]|)" + M + "*(\\d+)|))" + M + "*\\)|)", "i"), bool: new RegExp("^(?:" + R + ")$", "i"), needsContext: new RegExp("^" + M + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + M + "*((?:-\\d)?\\d*)" + M + "*\\)|)(?=[^-]|$)", "i") }, Y = /HTML$/i, Q = /^(?:input|select|textarea|button)$/i, J = /^h\d$/i, K = /^[^{]+\{\s*\[native \w/, Z = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, ee = /[+~]/, te = new RegExp("\\\\[\\da-fA-F]{1,6}" + M + "?|\\\\([^\\r\\n\\f])", "g"), ne = function (e, t) { var n = "0x" + e.slice(1) - 65536; return t || (n < 0 ? String.fromCharCode(n + 65536) : String.fromCharCode(n >> 10 | 55296, 1023 & n | 56320)) }, re = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, ie = function (e, t) { return t ? "\0" === e ? "\ufffd" : e.slice(0, -1) + "\\" + e.charCodeAt(e.length - 1).toString(16) + " " : "\\" + e }, oe = function () { T() }, ae = be(function (e) { return !0 === e.disabled && "fieldset" === e.nodeName.toLowerCase() }, { dir: "parentNode", next: "legend" }); try { H.apply(t = O.call(p.childNodes), p.childNodes), t[p.childNodes.length].nodeType } catch (e) { H = { apply: t.length ? function (e, t) { L.apply(e, O.call(t)) } : function (e, t) { var n = e.length, r = 0; while (e[n++] = t[r++]); e.length = n - 1 } } } function se(t, e, n, r) { var i, o, a, s, u, l, c, f = e && e.ownerDocument, p = e ? e.nodeType : 9; if (n = n || [], "string" != typeof t || !t || 1 !== p && 9 !== p && 11 !== p) return n; if (!r && (T(e), e = e || C, E)) { if (11 !== p && (u = Z.exec(t))) if (i = u[1]) { if (9 === p) { if (!(a = e.getElementById(i))) return n; if (a.id === i) return n.push(a), n } else if (f && (a = f.getElementById(i)) && v(e, a) && a.id === i) return n.push(a), n } else { if (u[2]) return H.apply(n, e.getElementsByTagName(t)), n; if ((i = u[3]) && d.getElementsByClassName && e.getElementsByClassName) return H.apply(n, e.getElementsByClassName(i)), n } if (d.qsa && !N[t + " "] && (!y || !y.test(t)) && (1 !== p || "object" !== e.nodeName.toLowerCase())) { if (c = t, f = e, 1 === p && (U.test(t) || z.test(t))) { (f = ee.test(t) && ve(e.parentNode) || e) === e && d.scope || ((s = e.getAttribute("id")) ? s = s.replace(re, ie) : e.setAttribute("id", s = S)), o = (l = h(t)).length; while (o--) l[o] = (s ? "#" + s : ":scope") + " " + xe(l[o]); c = l.join(",") } try { return H.apply(n, f.querySelectorAll(c)), n } catch (e) { N(t, !0) } finally { s === S && e.removeAttribute("id") } } } return g(t.replace(B, "$1"), e, n, r) } function ue() { var r = []; return function e(t, n) { return r.push(t + " ") > b.cacheLength && delete e[r.shift()], e[t + " "] = n } } function le(e) { return e[S] = !0, e } function ce(e) { var t = C.createElement("fieldset"); try { return !!e(t) } catch (e) { return !1 } finally { t.parentNode && t.parentNode.removeChild(t), t = null } } function fe(e, t) { var n = e.split("|"), r = n.length; while (r--) b.attrHandle[n[r]] = t } function pe(e, t) { var n = t && e, r = n && 1 === e.nodeType && 1 === t.nodeType && e.sourceIndex - t.sourceIndex; if (r) return r; if (n) while (n = n.nextSibling) if (n === t) return -1; return e ? 1 : -1 } function de(t) { return function (e) { return "input" === e.nodeName.toLowerCase() && e.type === t } } function he(n) { return function (e) { var t = e.nodeName.toLowerCase(); return ("input" === t || "button" === t) && e.type === n } } function ge(t) { return function (e) { return "form" in e ? e.parentNode && !1 === e.disabled ? "label" in e ? "label" in e.parentNode ? e.parentNode.disabled === t : e.disabled === t : e.isDisabled === t || e.isDisabled !== !t && ae(e) === t : e.disabled === t : "label" in e && e.disabled === t } } function ye(a) { return le(function (o) { return o = +o, le(function (e, t) { var n, r = a([], e.length, o), i = r.length; while (i--) e[n = r[i]] && (e[n] = !(t[n] = e[n])) }) }) } function ve(e) { return e && "undefined" != typeof e.getElementsByTagName && e } for (e in d = se.support = {}, i = se.isXML = function (e) { var t = e && e.namespaceURI, n = e && (e.ownerDocument || e).documentElement; return !Y.test(t || n && n.nodeName || "HTML") }, T = se.setDocument = function (e) { var t, n, r = e ? e.ownerDocument || e : p; return r != C && 9 === r.nodeType && r.documentElement && (a = (C = r).documentElement, E = !i(C), p != C && (n = C.defaultView) && n.top !== n && (n.addEventListener ? n.addEventListener("unload", oe, !1) : n.attachEvent && n.attachEvent("onunload", oe)), d.scope = ce(function (e) { return a.appendChild(e).appendChild(C.createElement("div")), "undefined" != typeof e.querySelectorAll && !e.querySelectorAll(":scope fieldset div").length }), d.cssHas = ce(function () { try { return C.querySelector(":has(*,:jqfake)"), !1 } catch (e) { return !0 } }), d.attributes = ce(function (e) { return e.className = "i", !e.getAttribute("className") }), d.getElementsByTagName = ce(function (e) { return e.appendChild(C.createComment("")), !e.getElementsByTagName("*").length }), d.getElementsByClassName = K.test(C.getElementsByClassName), d.getById = ce(function (e) { return a.appendChild(e).id = S, !C.getElementsByName || !C.getElementsByName(S).length }), d.getById ? (b.filter.ID = function (e) { var t = e.replace(te, ne); return function (e) { return e.getAttribute("id") === t } }, b.find.ID = function (e, t) { if ("undefined" != typeof t.getElementById && E) { var n = t.getElementById(e); return n ? [n] : [] } }) : (b.filter.ID = function (e) { var n = e.replace(te, ne); return function (e) { var t = "undefined" != typeof e.getAttributeNode && e.getAttributeNode("id"); return t && t.value === n } }, b.find.ID = function (e, t) { if ("undefined" != typeof t.getElementById && E) { var n, r, i, o = t.getElementById(e); if (o) { if ((n = o.getAttributeNode("id")) && n.value === e) return [o]; i = t.getElementsByName(e), r = 0; while (o = i[r++]) if ((n = o.getAttributeNode("id")) && n.value === e) return [o] } return [] } }), b.find.TAG = d.getElementsByTagName ? function (e, t) { return "undefined" != typeof t.getElementsByTagName ? t.getElementsByTagName(e) : d.qsa ? t.querySelectorAll(e) : void 0 } : function (e, t) { var n, r = [], i = 0, o = t.getElementsByTagName(e); if ("*" === e) { while (n = o[i++]) 1 === n.nodeType && r.push(n); return r } return o }, b.find.CLASS = d.getElementsByClassName && function (e, t) { if ("undefined" != typeof t.getElementsByClassName && E) return t.getElementsByClassName(e) }, s = [], y = [], (d.qsa = K.test(C.querySelectorAll)) && (ce(function (e) { var t; a.appendChild(e).innerHTML = "", e.querySelectorAll("[msallowcapture^='']").length && y.push("[*^$]=" + M + "*(?:''|\"\")"), e.querySelectorAll("[selected]").length || y.push("\\[" + M + "*(?:value|" + R + ")"), e.querySelectorAll("[id~=" + S + "-]").length || y.push("~="), (t = C.createElement("input")).setAttribute("name", ""), e.appendChild(t), e.querySelectorAll("[name='']").length || y.push("\\[" + M + "*name" + M + "*=" + M + "*(?:''|\"\")"), e.querySelectorAll(":checked").length || y.push(":checked"), e.querySelectorAll("a#" + S + "+*").length || y.push(".#.+[+~]"), e.querySelectorAll("\\\f"), y.push("[\\r\\n\\f]") }), ce(function (e) { e.innerHTML = ""; var t = C.createElement("input"); t.setAttribute("type", "hidden"), e.appendChild(t).setAttribute("name", "D"), e.querySelectorAll("[name=d]").length && y.push("name" + M + "*[*^$|!~]?="), 2 !== e.querySelectorAll(":enabled").length && y.push(":enabled", ":disabled"), a.appendChild(e).disabled = !0, 2 !== e.querySelectorAll(":disabled").length && y.push(":enabled", ":disabled"), e.querySelectorAll("*,:x"), y.push(",.*:") })), (d.matchesSelector = K.test(c = a.matches || a.webkitMatchesSelector || a.mozMatchesSelector || a.oMatchesSelector || a.msMatchesSelector)) && ce(function (e) { d.disconnectedMatch = c.call(e, "*"), c.call(e, "[s!='']:x"), s.push("!=", F) }), d.cssHas || y.push(":has"), y = y.length && new RegExp(y.join("|")), s = s.length && new RegExp(s.join("|")), t = K.test(a.compareDocumentPosition), v = t || K.test(a.contains) ? function (e, t) { var n = 9 === e.nodeType && e.documentElement || e, r = t && t.parentNode; return e === r || !(!r || 1 !== r.nodeType || !(n.contains ? n.contains(r) : e.compareDocumentPosition && 16 & e.compareDocumentPosition(r))) } : function (e, t) { if (t) while (t = t.parentNode) if (t === e) return !0; return !1 }, j = t ? function (e, t) { if (e === t) return l = !0, 0; var n = !e.compareDocumentPosition - !t.compareDocumentPosition; return n || (1 & (n = (e.ownerDocument || e) == (t.ownerDocument || t) ? e.compareDocumentPosition(t) : 1) || !d.sortDetached && t.compareDocumentPosition(e) === n ? e == C || e.ownerDocument == p && v(p, e) ? -1 : t == C || t.ownerDocument == p && v(p, t) ? 1 : u ? P(u, e) - P(u, t) : 0 : 4 & n ? -1 : 1) } : function (e, t) { if (e === t) return l = !0, 0; var n, r = 0, i = e.parentNode, o = t.parentNode, a = [e], s = [t]; if (!i || !o) return e == C ? -1 : t == C ? 1 : i ? -1 : o ? 1 : u ? P(u, e) - P(u, t) : 0; if (i === o) return pe(e, t); n = e; while (n = n.parentNode) a.unshift(n); n = t; while (n = n.parentNode) s.unshift(n); while (a[r] === s[r]) r++; return r ? pe(a[r], s[r]) : a[r] == p ? -1 : s[r] == p ? 1 : 0 }), C }, se.matches = function (e, t) { return se(e, null, null, t) }, se.matchesSelector = function (e, t) { if (T(e), d.matchesSelector && E && !N[t + " "] && (!s || !s.test(t)) && (!y || !y.test(t))) try { var n = c.call(e, t); if (n || d.disconnectedMatch || e.document && 11 !== e.document.nodeType) return n } catch (e) { N(t, !0) } return 0 < se(t, C, null, [e]).length }, se.contains = function (e, t) { return (e.ownerDocument || e) != C && T(e), v(e, t) }, se.attr = function (e, t) { (e.ownerDocument || e) != C && T(e); var n = b.attrHandle[t.toLowerCase()], r = n && D.call(b.attrHandle, t.toLowerCase()) ? n(e, t, !E) : void 0; return void 0 !== r ? r : d.attributes || !E ? e.getAttribute(t) : (r = e.getAttributeNode(t)) && r.specified ? r.value : null }, se.escape = function (e) { return (e + "").replace(re, ie) }, se.error = function (e) { throw new Error("Syntax error, unrecognized expression: " + e) }, se.uniqueSort = function (e) { var t, n = [], r = 0, i = 0; if (l = !d.detectDuplicates, u = !d.sortStable && e.slice(0), e.sort(j), l) { while (t = e[i++]) t === e[i] && (r = n.push(i)); while (r--) e.splice(n[r], 1) } return u = null, e }, o = se.getText = function (e) { var t, n = "", r = 0, i = e.nodeType; if (i) { if (1 === i || 9 === i || 11 === i) { if ("string" == typeof e.textContent) return e.textContent; for (e = e.firstChild; e; e = e.nextSibling)n += o(e) } else if (3 === i || 4 === i) return e.nodeValue } else while (t = e[r++]) n += o(t); return n }, (b = se.selectors = { cacheLength: 50, createPseudo: le, match: G, attrHandle: {}, find: {}, relative: { ">": { dir: "parentNode", first: !0 }, " ": { dir: "parentNode" }, "+": { dir: "previousSibling", first: !0 }, "~": { dir: "previousSibling" } }, preFilter: { ATTR: function (e) { return e[1] = e[1].replace(te, ne), e[3] = (e[3] || e[4] || e[5] || "").replace(te, ne), "~=" === e[2] && (e[3] = " " + e[3] + " "), e.slice(0, 4) }, CHILD: function (e) { return e[1] = e[1].toLowerCase(), "nth" === e[1].slice(0, 3) ? (e[3] || se.error(e[0]), e[4] = +(e[4] ? e[5] + (e[6] || 1) : 2 * ("even" === e[3] || "odd" === e[3])), e[5] = +(e[7] + e[8] || "odd" === e[3])) : e[3] && se.error(e[0]), e }, PSEUDO: function (e) { var t, n = !e[6] && e[2]; return G.CHILD.test(e[0]) ? null : (e[3] ? e[2] = e[4] || e[5] || "" : n && X.test(n) && (t = h(n, !0)) && (t = n.indexOf(")", n.length - t) - n.length) && (e[0] = e[0].slice(0, t), e[2] = n.slice(0, t)), e.slice(0, 3)) } }, filter: { TAG: function (e) { var t = e.replace(te, ne).toLowerCase(); return "*" === e ? function () { return !0 } : function (e) { return e.nodeName && e.nodeName.toLowerCase() === t } }, CLASS: function (e) { var t = m[e + " "]; return t || (t = new RegExp("(^|" + M + ")" + e + "(" + M + "|$)")) && m(e, function (e) { return t.test("string" == typeof e.className && e.className || "undefined" != typeof e.getAttribute && e.getAttribute("class") || "") }) }, ATTR: function (n, r, i) { return function (e) { var t = se.attr(e, n); return null == t ? "!=" === r : !r || (t += "", "=" === r ? t === i : "!=" === r ? t !== i : "^=" === r ? i && 0 === t.indexOf(i) : "*=" === r ? i && -1 < t.indexOf(i) : "$=" === r ? i && t.slice(-i.length) === i : "~=" === r ? -1 < (" " + t.replace($, " ") + " ").indexOf(i) : "|=" === r && (t === i || t.slice(0, i.length + 1) === i + "-")) } }, CHILD: function (h, e, t, g, y) { var v = "nth" !== h.slice(0, 3), m = "last" !== h.slice(-4), x = "of-type" === e; return 1 === g && 0 === y ? function (e) { return !!e.parentNode } : function (e, t, n) { var r, i, o, a, s, u, l = v !== m ? "nextSibling" : "previousSibling", c = e.parentNode, f = x && e.nodeName.toLowerCase(), p = !n && !x, d = !1; if (c) { if (v) { while (l) { a = e; while (a = a[l]) if (x ? a.nodeName.toLowerCase() === f : 1 === a.nodeType) return !1; u = l = "only" === h && !u && "nextSibling" } return !0 } if (u = [m ? c.firstChild : c.lastChild], m && p) { d = (s = (r = (i = (o = (a = c)[S] || (a[S] = {}))[a.uniqueID] || (o[a.uniqueID] = {}))[h] || [])[0] === k && r[1]) && r[2], a = s && c.childNodes[s]; while (a = ++s && a && a[l] || (d = s = 0) || u.pop()) if (1 === a.nodeType && ++d && a === e) { i[h] = [k, s, d]; break } } else if (p && (d = s = (r = (i = (o = (a = e)[S] || (a[S] = {}))[a.uniqueID] || (o[a.uniqueID] = {}))[h] || [])[0] === k && r[1]), !1 === d) while (a = ++s && a && a[l] || (d = s = 0) || u.pop()) if ((x ? a.nodeName.toLowerCase() === f : 1 === a.nodeType) && ++d && (p && ((i = (o = a[S] || (a[S] = {}))[a.uniqueID] || (o[a.uniqueID] = {}))[h] = [k, d]), a === e)) break; return (d -= y) === g || d % g == 0 && 0 <= d / g } } }, PSEUDO: function (e, o) { var t, a = b.pseudos[e] || b.setFilters[e.toLowerCase()] || se.error("unsupported pseudo: " + e); return a[S] ? a(o) : 1 < a.length ? (t = [e, e, "", o], b.setFilters.hasOwnProperty(e.toLowerCase()) ? le(function (e, t) { var n, r = a(e, o), i = r.length; while (i--) e[n = P(e, r[i])] = !(t[n] = r[i]) }) : function (e) { return a(e, 0, t) }) : a } }, pseudos: { not: le(function (e) { var r = [], i = [], s = f(e.replace(B, "$1")); return s[S] ? le(function (e, t, n, r) { var i, o = s(e, null, r, []), a = e.length; while (a--) (i = o[a]) && (e[a] = !(t[a] = i)) }) : function (e, t, n) { return r[0] = e, s(r, null, n, i), r[0] = null, !i.pop() } }), has: le(function (t) { return function (e) { return 0 < se(t, e).length } }), contains: le(function (t) { return t = t.replace(te, ne), function (e) { return -1 < (e.textContent || o(e)).indexOf(t) } }), lang: le(function (n) { return V.test(n || "") || se.error("unsupported lang: " + n), n = n.replace(te, ne).toLowerCase(), function (e) { var t; do { if (t = E ? e.lang : e.getAttribute("xml:lang") || e.getAttribute("lang")) return (t = t.toLowerCase()) === n || 0 === t.indexOf(n + "-") } while ((e = e.parentNode) && 1 === e.nodeType); return !1 } }), target: function (e) { var t = n.location && n.location.hash; return t && t.slice(1) === e.id }, root: function (e) { return e === a }, focus: function (e) { return e === C.activeElement && (!C.hasFocus || C.hasFocus()) && !!(e.type || e.href || ~e.tabIndex) }, enabled: ge(!1), disabled: ge(!0), checked: function (e) { var t = e.nodeName.toLowerCase(); return "input" === t && !!e.checked || "option" === t && !!e.selected }, selected: function (e) { return e.parentNode && e.parentNode.selectedIndex, !0 === e.selected }, empty: function (e) { for (e = e.firstChild; e; e = e.nextSibling)if (e.nodeType < 6) return !1; return !0 }, parent: function (e) { return !b.pseudos.empty(e) }, header: function (e) { return J.test(e.nodeName) }, input: function (e) { return Q.test(e.nodeName) }, button: function (e) { var t = e.nodeName.toLowerCase(); return "input" === t && "button" === e.type || "button" === t }, text: function (e) { var t; return "input" === e.nodeName.toLowerCase() && "text" === e.type && (null == (t = e.getAttribute("type")) || "text" === t.toLowerCase()) }, first: ye(function () { return [0] }), last: ye(function (e, t) { return [t - 1] }), eq: ye(function (e, t, n) { return [n < 0 ? n + t : n] }), even: ye(function (e, t) { for (var n = 0; n < t; n += 2)e.push(n); return e }), odd: ye(function (e, t) { for (var n = 1; n < t; n += 2)e.push(n); return e }), lt: ye(function (e, t, n) { for (var r = n < 0 ? n + t : t < n ? t : n; 0 <= --r;)e.push(r); return e }), gt: ye(function (e, t, n) { for (var r = n < 0 ? n + t : n; ++r < t;)e.push(r); return e }) } }).pseudos.nth = b.pseudos.eq, { radio: !0, checkbox: !0, file: !0, password: !0, image: !0 }) b.pseudos[e] = de(e); for (e in { submit: !0, reset: !0 }) b.pseudos[e] = he(e); function me() { } function xe(e) { for (var t = 0, n = e.length, r = ""; t < n; t++)r += e[t].value; return r } function be(s, e, t) { var u = e.dir, l = e.next, c = l || u, f = t && "parentNode" === c, p = r++; return e.first ? function (e, t, n) { while (e = e[u]) if (1 === e.nodeType || f) return s(e, t, n); return !1 } : function (e, t, n) { var r, i, o, a = [k, p]; if (n) { while (e = e[u]) if ((1 === e.nodeType || f) && s(e, t, n)) return !0 } else while (e = e[u]) if (1 === e.nodeType || f) if (i = (o = e[S] || (e[S] = {}))[e.uniqueID] || (o[e.uniqueID] = {}), l && l === e.nodeName.toLowerCase()) e = e[u] || e; else { if ((r = i[c]) && r[0] === k && r[1] === p) return a[2] = r[2]; if ((i[c] = a)[2] = s(e, t, n)) return !0 } return !1 } } function we(i) { return 1 < i.length ? function (e, t, n) { var r = i.length; while (r--) if (!i[r](e, t, n)) return !1; return !0 } : i[0] } function Te(e, t, n, r, i) { for (var o, a = [], s = 0, u = e.length, l = null != t; s < u; s++)(o = e[s]) && (n && !n(o, r, i) || (a.push(o), l && t.push(s))); return a } function Ce(d, h, g, y, v, e) { return y && !y[S] && (y = Ce(y)), v && !v[S] && (v = Ce(v, e)), le(function (e, t, n, r) { var i, o, a, s = [], u = [], l = t.length, c = e || function (e, t, n) { for (var r = 0, i = t.length; r < i; r++)se(e, t[r], n); return n }(h || "*", n.nodeType ? [n] : n, []), f = !d || !e && h ? c : Te(c, s, d, n, r), p = g ? v || (e ? d : l || y) ? [] : t : f; if (g && g(f, p, n, r), y) { i = Te(p, u), y(i, [], n, r), o = i.length; while (o--) (a = i[o]) && (p[u[o]] = !(f[u[o]] = a)) } if (e) { if (v || d) { if (v) { i = [], o = p.length; while (o--) (a = p[o]) && i.push(f[o] = a); v(null, p = [], i, r) } o = p.length; while (o--) (a = p[o]) && -1 < (i = v ? P(e, a) : s[o]) && (e[i] = !(t[i] = a)) } } else p = Te(p === t ? p.splice(l, p.length) : p), v ? v(null, t, p, r) : H.apply(t, p) }) } function Ee(e) { for (var i, t, n, r = e.length, o = b.relative[e[0].type], a = o || b.relative[" "], s = o ? 1 : 0, u = be(function (e) { return e === i }, a, !0), l = be(function (e) { return -1 < P(i, e) }, a, !0), c = [function (e, t, n) { var r = !o && (n || t !== w) || ((i = t).nodeType ? u(e, t, n) : l(e, t, n)); return i = null, r }]; s < r; s++)if (t = b.relative[e[s].type]) c = [be(we(c), t)]; else { if ((t = b.filter[e[s].type].apply(null, e[s].matches))[S]) { for (n = ++s; n < r; n++)if (b.relative[e[n].type]) break; return Ce(1 < s && we(c), 1 < s && xe(e.slice(0, s - 1).concat({ value: " " === e[s - 2].type ? "*" : "" })).replace(B, "$1"), t, s < n && Ee(e.slice(s, n)), n < r && Ee(e = e.slice(n)), n < r && xe(e)) } c.push(t) } return we(c) } return me.prototype = b.filters = b.pseudos, b.setFilters = new me, h = se.tokenize = function (e, t) { var n, r, i, o, a, s, u, l = x[e + " "]; if (l) return t ? 0 : l.slice(0); a = e, s = [], u = b.preFilter; while (a) { for (o in n && !(r = _.exec(a)) || (r && (a = a.slice(r[0].length) || a), s.push(i = [])), n = !1, (r = z.exec(a)) && (n = r.shift(), i.push({ value: n, type: r[0].replace(B, " ") }), a = a.slice(n.length)), b.filter) !(r = G[o].exec(a)) || u[o] && !(r = u[o](r)) || (n = r.shift(), i.push({ value: n, type: o, matches: r }), a = a.slice(n.length)); if (!n) break } return t ? a.length : a ? se.error(e) : x(e, s).slice(0) }, f = se.compile = function (e, t) { var n, y, v, m, x, r, i = [], o = [], a = A[e + " "]; if (!a) { t || (t = h(e)), n = t.length; while (n--) (a = Ee(t[n]))[S] ? i.push(a) : o.push(a); (a = A(e, (y = o, m = 0 < (v = i).length, x = 0 < y.length, r = function (e, t, n, r, i) { var o, a, s, u = 0, l = "0", c = e && [], f = [], p = w, d = e || x && b.find.TAG("*", i), h = k += null == p ? 1 : Math.random() || .1, g = d.length; for (i && (w = t == C || t || i); l !== g && null != (o = d[l]); l++) { if (x && o) { a = 0, t || o.ownerDocument == C || (T(o), n = !E); while (s = y[a++]) if (s(o, t || C, n)) { r.push(o); break } i && (k = h) } m && ((o = !s && o) && u--, e && c.push(o)) } if (u += l, m && l !== u) { a = 0; while (s = v[a++]) s(c, f, t, n); if (e) { if (0 < u) while (l--) c[l] || f[l] || (f[l] = q.call(r)); f = Te(f) } H.apply(r, f), i && !e && 0 < f.length && 1 < u + v.length && se.uniqueSort(r) } return i && (k = h, w = p), c }, m ? le(r) : r))).selector = e } return a }, g = se.select = function (e, t, n, r) { var i, o, a, s, u, l = "function" == typeof e && e, c = !r && h(e = l.selector || e); if (n = n || [], 1 === c.length) { if (2 < (o = c[0] = c[0].slice(0)).length && "ID" === (a = o[0]).type && 9 === t.nodeType && E && b.relative[o[1].type]) { if (!(t = (b.find.ID(a.matches[0].replace(te, ne), t) || [])[0])) return n; l && (t = t.parentNode), e = e.slice(o.shift().value.length) } i = G.needsContext.test(e) ? 0 : o.length; while (i--) { if (a = o[i], b.relative[s = a.type]) break; if ((u = b.find[s]) && (r = u(a.matches[0].replace(te, ne), ee.test(o[0].type) && ve(t.parentNode) || t))) { if (o.splice(i, 1), !(e = r.length && xe(o))) return H.apply(n, r), n; break } } } return (l || f(e, c))(r, t, !E, n, !t || ee.test(e) && ve(t.parentNode) || t), n }, d.sortStable = S.split("").sort(j).join("") === S, d.detectDuplicates = !!l, T(), d.sortDetached = ce(function (e) { return 1 & e.compareDocumentPosition(C.createElement("fieldset")) }), ce(function (e) { return e.innerHTML = "", "#" === e.firstChild.getAttribute("href") }) || fe("type|href|height|width", function (e, t, n) { if (!n) return e.getAttribute(t, "type" === t.toLowerCase() ? 1 : 2) }), d.attributes && ce(function (e) { return e.innerHTML = "", e.firstChild.setAttribute("value", ""), "" === e.firstChild.getAttribute("value") }) || fe("value", function (e, t, n) { if (!n && "input" === e.nodeName.toLowerCase()) return e.defaultValue }), ce(function (e) { return null == e.getAttribute("disabled") }) || fe(R, function (e, t, n) { var r; if (!n) return !0 === e[t] ? t.toLowerCase() : (r = e.getAttributeNode(t)) && r.specified ? r.value : null }), se }(C); S.find = d, S.expr = d.selectors, S.expr[":"] = S.expr.pseudos, S.uniqueSort = S.unique = d.uniqueSort, S.text = d.getText, S.isXMLDoc = d.isXML, S.contains = d.contains, S.escapeSelector = d.escape; var h = function (e, t, n) { var r = [], i = void 0 !== n; while ((e = e[t]) && 9 !== e.nodeType) if (1 === e.nodeType) { if (i && S(e).is(n)) break; r.push(e) } return r }, T = function (e, t) { for (var n = []; e; e = e.nextSibling)1 === e.nodeType && e !== t && n.push(e); return n }, k = S.expr.match.needsContext; function A(e, t) { return e.nodeName && e.nodeName.toLowerCase() === t.toLowerCase() } var N = /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i; function j(e, n, r) { return m(n) ? S.grep(e, function (e, t) { return !!n.call(e, t, e) !== r }) : n.nodeType ? S.grep(e, function (e) { return e === n !== r }) : "string" != typeof n ? S.grep(e, function (e) { return -1 < i.call(n, e) !== r }) : S.filter(n, e, r) } S.filter = function (e, t, n) { var r = t[0]; return n && (e = ":not(" + e + ")"), 1 === t.length && 1 === r.nodeType ? S.find.matchesSelector(r, e) ? [r] : [] : S.find.matches(e, S.grep(t, function (e) { return 1 === e.nodeType })) }, S.fn.extend({ find: function (e) { var t, n, r = this.length, i = this; if ("string" != typeof e) return this.pushStack(S(e).filter(function () { for (t = 0; t < r; t++)if (S.contains(i[t], this)) return !0 })); for (n = this.pushStack([]), t = 0; t < r; t++)S.find(e, i[t], n); return 1 < r ? S.uniqueSort(n) : n }, filter: function (e) { return this.pushStack(j(this, e || [], !1)) }, not: function (e) { return this.pushStack(j(this, e || [], !0)) }, is: function (e) { return !!j(this, "string" == typeof e && k.test(e) ? S(e) : e || [], !1).length } }); var D, q = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/; (S.fn.init = function (e, t, n) { var r, i; if (!e) return this; if (n = n || D, "string" == typeof e) { if (!(r = "<" === e[0] && ">" === e[e.length - 1] && 3 <= e.length ? [null, e, null] : q.exec(e)) || !r[1] && t) return !t || t.jquery ? (t || n).find(e) : this.constructor(t).find(e); if (r[1]) { if (t = t instanceof S ? t[0] : t, S.merge(this, S.parseHTML(r[1], t && t.nodeType ? t.ownerDocument || t : E, !0)), N.test(r[1]) && S.isPlainObject(t)) for (r in t) m(this[r]) ? this[r](t[r]) : this.attr(r, t[r]); return this } return (i = E.getElementById(r[2])) && (this[0] = i, this.length = 1), this } return e.nodeType ? (this[0] = e, this.length = 1, this) : m(e) ? void 0 !== n.ready ? n.ready(e) : e(S) : S.makeArray(e, this) }).prototype = S.fn, D = S(E); var L = /^(?:parents|prev(?:Until|All))/, H = { children: !0, contents: !0, next: !0, prev: !0 }; function O(e, t) { while ((e = e[t]) && 1 !== e.nodeType); return e } S.fn.extend({ has: function (e) { var t = S(e, this), n = t.length; return this.filter(function () { for (var e = 0; e < n; e++)if (S.contains(this, t[e])) return !0 }) }, closest: function (e, t) { var n, r = 0, i = this.length, o = [], a = "string" != typeof e && S(e); if (!k.test(e)) for (; r < i; r++)for (n = this[r]; n && n !== t; n = n.parentNode)if (n.nodeType < 11 && (a ? -1 < a.index(n) : 1 === n.nodeType && S.find.matchesSelector(n, e))) { o.push(n); break } return this.pushStack(1 < o.length ? S.uniqueSort(o) : o) }, index: function (e) { return e ? "string" == typeof e ? i.call(S(e), this[0]) : i.call(this, e.jquery ? e[0] : e) : this[0] && this[0].parentNode ? this.first().prevAll().length : -1 }, add: function (e, t) { return this.pushStack(S.uniqueSort(S.merge(this.get(), S(e, t)))) }, addBack: function (e) { return this.add(null == e ? this.prevObject : this.prevObject.filter(e)) } }), S.each({ parent: function (e) { var t = e.parentNode; return t && 11 !== t.nodeType ? t : null }, parents: function (e) { return h(e, "parentNode") }, parentsUntil: function (e, t, n) { return h(e, "parentNode", n) }, next: function (e) { return O(e, "nextSibling") }, prev: function (e) { return O(e, "previousSibling") }, nextAll: function (e) { return h(e, "nextSibling") }, prevAll: function (e) { return h(e, "previousSibling") }, nextUntil: function (e, t, n) { return h(e, "nextSibling", n) }, prevUntil: function (e, t, n) { return h(e, "previousSibling", n) }, siblings: function (e) { return T((e.parentNode || {}).firstChild, e) }, children: function (e) { return T(e.firstChild) }, contents: function (e) { return null != e.contentDocument && r(e.contentDocument) ? e.contentDocument : (A(e, "template") && (e = e.content || e), S.merge([], e.childNodes)) } }, function (r, i) { S.fn[r] = function (e, t) { var n = S.map(this, i, e); return "Until" !== r.slice(-5) && (t = e), t && "string" == typeof t && (n = S.filter(t, n)), 1 < this.length && (H[r] || S.uniqueSort(n), L.test(r) && n.reverse()), this.pushStack(n) } }); var P = /[^\x20\t\r\n\f]+/g; function R(e) { return e } function M(e) { throw e } function I(e, t, n, r) { var i; try { e && m(i = e.promise) ? i.call(e).done(t).fail(n) : e && m(i = e.then) ? i.call(e, t, n) : t.apply(void 0, [e].slice(r)) } catch (e) { n.apply(void 0, [e]) } } S.Callbacks = function (r) { var e, n; r = "string" == typeof r ? (e = r, n = {}, S.each(e.match(P) || [], function (e, t) { n[t] = !0 }), n) : S.extend({}, r); var i, t, o, a, s = [], u = [], l = -1, c = function () { for (a = a || r.once, o = i = !0; u.length; l = -1) { t = u.shift(); while (++l < s.length) !1 === s[l].apply(t[0], t[1]) && r.stopOnFalse && (l = s.length, t = !1) } r.memory || (t = !1), i = !1, a && (s = t ? [] : "") }, f = { add: function () { return s && (t && !i && (l = s.length - 1, u.push(t)), function n(e) { S.each(e, function (e, t) { m(t) ? r.unique && f.has(t) || s.push(t) : t && t.length && "string" !== w(t) && n(t) }) }(arguments), t && !i && c()), this }, remove: function () { return S.each(arguments, function (e, t) { var n; while (-1 < (n = S.inArray(t, s, n))) s.splice(n, 1), n <= l && l-- }), this }, has: function (e) { return e ? -1 < S.inArray(e, s) : 0 < s.length }, empty: function () { return s && (s = []), this }, disable: function () { return a = u = [], s = t = "", this }, disabled: function () { return !s }, lock: function () { return a = u = [], t || i || (s = t = ""), this }, locked: function () { return !!a }, fireWith: function (e, t) { return a || (t = [e, (t = t || []).slice ? t.slice() : t], u.push(t), i || c()), this }, fire: function () { return f.fireWith(this, arguments), this }, fired: function () { return !!o } }; return f }, S.extend({ Deferred: function (e) { var o = [["notify", "progress", S.Callbacks("memory"), S.Callbacks("memory"), 2], ["resolve", "done", S.Callbacks("once memory"), S.Callbacks("once memory"), 0, "resolved"], ["reject", "fail", S.Callbacks("once memory"), S.Callbacks("once memory"), 1, "rejected"]], i = "pending", a = { state: function () { return i }, always: function () { return s.done(arguments).fail(arguments), this }, "catch": function (e) { return a.then(null, e) }, pipe: function () { var i = arguments; return S.Deferred(function (r) { S.each(o, function (e, t) { var n = m(i[t[4]]) && i[t[4]]; s[t[1]](function () { var e = n && n.apply(this, arguments); e && m(e.promise) ? e.promise().progress(r.notify).done(r.resolve).fail(r.reject) : r[t[0] + "With"](this, n ? [e] : arguments) }) }), i = null }).promise() }, then: function (t, n, r) { var u = 0; function l(i, o, a, s) { return function () { var n = this, r = arguments, e = function () { var e, t; if (!(i < u)) { if ((e = a.apply(n, r)) === o.promise()) throw new TypeError("Thenable self-resolution"); t = e && ("object" == typeof e || "function" == typeof e) && e.then, m(t) ? s ? t.call(e, l(u, o, R, s), l(u, o, M, s)) : (u++, t.call(e, l(u, o, R, s), l(u, o, M, s), l(u, o, R, o.notifyWith))) : (a !== R && (n = void 0, r = [e]), (s || o.resolveWith)(n, r)) } }, t = s ? e : function () { try { e() } catch (e) { S.Deferred.exceptionHook && S.Deferred.exceptionHook(e, t.stackTrace), u <= i + 1 && (a !== M && (n = void 0, r = [e]), o.rejectWith(n, r)) } }; i ? t() : (S.Deferred.getStackHook && (t.stackTrace = S.Deferred.getStackHook()), C.setTimeout(t)) } } return S.Deferred(function (e) { o[0][3].add(l(0, e, m(r) ? r : R, e.notifyWith)), o[1][3].add(l(0, e, m(t) ? t : R)), o[2][3].add(l(0, e, m(n) ? n : M)) }).promise() }, promise: function (e) { return null != e ? S.extend(e, a) : a } }, s = {}; return S.each(o, function (e, t) { var n = t[2], r = t[5]; a[t[1]] = n.add, r && n.add(function () { i = r }, o[3 - e][2].disable, o[3 - e][3].disable, o[0][2].lock, o[0][3].lock), n.add(t[3].fire), s[t[0]] = function () { return s[t[0] + "With"](this === s ? void 0 : this, arguments), this }, s[t[0] + "With"] = n.fireWith }), a.promise(s), e && e.call(s, s), s }, when: function (e) { var n = arguments.length, t = n, r = Array(t), i = s.call(arguments), o = S.Deferred(), a = function (t) { return function (e) { r[t] = this, i[t] = 1 < arguments.length ? s.call(arguments) : e, --n || o.resolveWith(r, i) } }; if (n <= 1 && (I(e, o.done(a(t)).resolve, o.reject, !n), "pending" === o.state() || m(i[t] && i[t].then))) return o.then(); while (t--) I(i[t], a(t), o.reject); return o.promise() } }); var W = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; S.Deferred.exceptionHook = function (e, t) { C.console && C.console.warn && e && W.test(e.name) && C.console.warn("jQuery.Deferred exception: " + e.message, e.stack, t) }, S.readyException = function (e) { C.setTimeout(function () { throw e }) }; var F = S.Deferred(); function $() { E.removeEventListener("DOMContentLoaded", $), C.removeEventListener("load", $), S.ready() } S.fn.ready = function (e) { return F.then(e)["catch"](function (e) { S.readyException(e) }), this }, S.extend({ isReady: !1, readyWait: 1, ready: function (e) { (!0 === e ? --S.readyWait : S.isReady) || (S.isReady = !0) !== e && 0 < --S.readyWait || F.resolveWith(E, [S]) } }), S.ready.then = F.then, "complete" === E.readyState || "loading" !== E.readyState && !E.documentElement.doScroll ? C.setTimeout(S.ready) : (E.addEventListener("DOMContentLoaded", $), C.addEventListener("load", $)); var B = function (e, t, n, r, i, o, a) { var s = 0, u = e.length, l = null == n; if ("object" === w(n)) for (s in i = !0, n) B(e, t, s, n[s], !0, o, a); else if (void 0 !== r && (i = !0, m(r) || (a = !0), l && (a ? (t.call(e, r), t = null) : (l = t, t = function (e, t, n) { return l.call(S(e), n) })), t)) for (; s < u; s++)t(e[s], n, a ? r : r.call(e[s], s, t(e[s], n))); return i ? e : l ? t.call(e) : u ? t(e[0], n) : o }, _ = /^-ms-/, z = /-([a-z])/g; function U(e, t) { return t.toUpperCase() } function X(e) { return e.replace(_, "ms-").replace(z, U) } var V = function (e) { return 1 === e.nodeType || 9 === e.nodeType || !+e.nodeType }; function G() { this.expando = S.expando + G.uid++ } G.uid = 1, G.prototype = { cache: function (e) { var t = e[this.expando]; return t || (t = {}, V(e) && (e.nodeType ? e[this.expando] = t : Object.defineProperty(e, this.expando, { value: t, configurable: !0 }))), t }, set: function (e, t, n) { var r, i = this.cache(e); if ("string" == typeof t) i[X(t)] = n; else for (r in t) i[X(r)] = t[r]; return i }, get: function (e, t) { return void 0 === t ? this.cache(e) : e[this.expando] && e[this.expando][X(t)] }, access: function (e, t, n) { return void 0 === t || t && "string" == typeof t && void 0 === n ? this.get(e, t) : (this.set(e, t, n), void 0 !== n ? n : t) }, remove: function (e, t) { var n, r = e[this.expando]; if (void 0 !== r) { if (void 0 !== t) { n = (t = Array.isArray(t) ? t.map(X) : (t = X(t)) in r ? [t] : t.match(P) || []).length; while (n--) delete r[t[n]] } (void 0 === t || S.isEmptyObject(r)) && (e.nodeType ? e[this.expando] = void 0 : delete e[this.expando]) } }, hasData: function (e) { var t = e[this.expando]; return void 0 !== t && !S.isEmptyObject(t) } }; var Y = new G, Q = new G, J = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, K = /[A-Z]/g; function Z(e, t, n) { var r, i; if (void 0 === n && 1 === e.nodeType) if (r = "data-" + t.replace(K, "-$&").toLowerCase(), "string" == typeof (n = e.getAttribute(r))) { try { n = "true" === (i = n) || "false" !== i && ("null" === i ? null : i === +i + "" ? +i : J.test(i) ? JSON.parse(i) : i) } catch (e) { } Q.set(e, t, n) } else n = void 0; return n } S.extend({ hasData: function (e) { return Q.hasData(e) || Y.hasData(e) }, data: function (e, t, n) { return Q.access(e, t, n) }, removeData: function (e, t) { Q.remove(e, t) }, _data: function (e, t, n) { return Y.access(e, t, n) }, _removeData: function (e, t) { Y.remove(e, t) } }), S.fn.extend({ data: function (n, e) { var t, r, i, o = this[0], a = o && o.attributes; if (void 0 === n) { if (this.length && (i = Q.get(o), 1 === o.nodeType && !Y.get(o, "hasDataAttrs"))) { t = a.length; while (t--) a[t] && 0 === (r = a[t].name).indexOf("data-") && (r = X(r.slice(5)), Z(o, r, i[r])); Y.set(o, "hasDataAttrs", !0) } return i } return "object" == typeof n ? this.each(function () { Q.set(this, n) }) : B(this, function (e) { var t; if (o && void 0 === e) return void 0 !== (t = Q.get(o, n)) ? t : void 0 !== (t = Z(o, n)) ? t : void 0; this.each(function () { Q.set(this, n, e) }) }, null, e, 1 < arguments.length, null, !0) }, removeData: function (e) { return this.each(function () { Q.remove(this, e) }) } }), S.extend({ queue: function (e, t, n) { var r; if (e) return t = (t || "fx") + "queue", r = Y.get(e, t), n && (!r || Array.isArray(n) ? r = Y.access(e, t, S.makeArray(n)) : r.push(n)), r || [] }, dequeue: function (e, t) { t = t || "fx"; var n = S.queue(e, t), r = n.length, i = n.shift(), o = S._queueHooks(e, t); "inprogress" === i && (i = n.shift(), r--), i && ("fx" === t && n.unshift("inprogress"), delete o.stop, i.call(e, function () { S.dequeue(e, t) }, o)), !r && o && o.empty.fire() }, _queueHooks: function (e, t) { var n = t + "queueHooks"; return Y.get(e, n) || Y.access(e, n, { empty: S.Callbacks("once memory").add(function () { Y.remove(e, [t + "queue", n]) }) }) } }), S.fn.extend({ queue: function (t, n) { var e = 2; return "string" != typeof t && (n = t, t = "fx", e--), arguments.length < e ? S.queue(this[0], t) : void 0 === n ? this : this.each(function () { var e = S.queue(this, t, n); S._queueHooks(this, t), "fx" === t && "inprogress" !== e[0] && S.dequeue(this, t) }) }, dequeue: function (e) { return this.each(function () { S.dequeue(this, e) }) }, clearQueue: function (e) { return this.queue(e || "fx", []) }, promise: function (e, t) { var n, r = 1, i = S.Deferred(), o = this, a = this.length, s = function () { --r || i.resolveWith(o, [o]) }; "string" != typeof e && (t = e, e = void 0), e = e || "fx"; while (a--) (n = Y.get(o[a], e + "queueHooks")) && n.empty && (r++, n.empty.add(s)); return s(), i.promise(t) } }); var ee = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source, te = new RegExp("^(?:([+-])=|)(" + ee + ")([a-z%]*)$", "i"), ne = ["Top", "Right", "Bottom", "Left"], re = E.documentElement, ie = function (e) { return S.contains(e.ownerDocument, e) }, oe = { composed: !0 }; re.getRootNode && (ie = function (e) { return S.contains(e.ownerDocument, e) || e.getRootNode(oe) === e.ownerDocument }); var ae = function (e, t) { return "none" === (e = t || e).style.display || "" === e.style.display && ie(e) && "none" === S.css(e, "display") }; function se(e, t, n, r) { var i, o, a = 20, s = r ? function () { return r.cur() } : function () { return S.css(e, t, "") }, u = s(), l = n && n[3] || (S.cssNumber[t] ? "" : "px"), c = e.nodeType && (S.cssNumber[t] || "px" !== l && +u) && te.exec(S.css(e, t)); if (c && c[3] !== l) { u /= 2, l = l || c[3], c = +u || 1; while (a--) S.style(e, t, c + l), (1 - o) * (1 - (o = s() / u || .5)) <= 0 && (a = 0), c /= o; c *= 2, S.style(e, t, c + l), n = n || [] } return n && (c = +c || +u || 0, i = n[1] ? c + (n[1] + 1) * n[2] : +n[2], r && (r.unit = l, r.start = c, r.end = i)), i } var ue = {}; function le(e, t) { for (var n, r, i, o, a, s, u, l = [], c = 0, f = e.length; c < f; c++)(r = e[c]).style && (n = r.style.display, t ? ("none" === n && (l[c] = Y.get(r, "display") || null, l[c] || (r.style.display = "")), "" === r.style.display && ae(r) && (l[c] = (u = a = o = void 0, a = (i = r).ownerDocument, s = i.nodeName, (u = ue[s]) || (o = a.body.appendChild(a.createElement(s)), u = S.css(o, "display"), o.parentNode.removeChild(o), "none" === u && (u = "block"), ue[s] = u)))) : "none" !== n && (l[c] = "none", Y.set(r, "display", n))); for (c = 0; c < f; c++)null != l[c] && (e[c].style.display = l[c]); return e } S.fn.extend({ show: function () { return le(this, !0) }, hide: function () { return le(this) }, toggle: function (e) { return "boolean" == typeof e ? e ? this.show() : this.hide() : this.each(function () { ae(this) ? S(this).show() : S(this).hide() }) } }); var ce, fe, pe = /^(?:checkbox|radio)$/i, de = /<([a-z][^\/\0>\x20\t\r\n\f]*)/i, he = /^$|^module$|\/(?:java|ecma)script/i; ce = E.createDocumentFragment().appendChild(E.createElement("div")), (fe = E.createElement("input")).setAttribute("type", "radio"), fe.setAttribute("checked", "checked"), fe.setAttribute("name", "t"), ce.appendChild(fe), v.checkClone = ce.cloneNode(!0).cloneNode(!0).lastChild.checked, ce.innerHTML = "", v.noCloneChecked = !!ce.cloneNode(!0).lastChild.defaultValue, ce.innerHTML = "", v.option = !!ce.lastChild; var ge = { thead: [1, "", "
"], col: [2, "", "
"], tr: [2, "", "
"], td: [3, "", "
"], _default: [0, "", ""] }; function ye(e, t) { var n; return n = "undefined" != typeof e.getElementsByTagName ? e.getElementsByTagName(t || "*") : "undefined" != typeof e.querySelectorAll ? e.querySelectorAll(t || "*") : [], void 0 === t || t && A(e, t) ? S.merge([e], n) : n } function ve(e, t) { for (var n = 0, r = e.length; n < r; n++)Y.set(e[n], "globalEval", !t || Y.get(t[n], "globalEval")) } ge.tbody = ge.tfoot = ge.colgroup = ge.caption = ge.thead, ge.th = ge.td, v.option || (ge.optgroup = ge.option = [1, ""]); var me = /<|&#?\w+;/; function xe(e, t, n, r, i) { for (var o, a, s, u, l, c, f = t.createDocumentFragment(), p = [], d = 0, h = e.length; d < h; d++)if ((o = e[d]) || 0 === o) if ("object" === w(o)) S.merge(p, o.nodeType ? [o] : o); else if (me.test(o)) { a = a || f.appendChild(t.createElement("div")), s = (de.exec(o) || ["", ""])[1].toLowerCase(), u = ge[s] || ge._default, a.innerHTML = u[1] + S.htmlPrefilter(o) + u[2], c = u[0]; while (c--) a = a.lastChild; S.merge(p, a.childNodes), (a = f.firstChild).textContent = "" } else p.push(t.createTextNode(o)); f.textContent = "", d = 0; while (o = p[d++]) if (r && -1 < S.inArray(o, r)) i && i.push(o); else if (l = ie(o), a = ye(f.appendChild(o), "script"), l && ve(a), n) { c = 0; while (o = a[c++]) he.test(o.type || "") && n.push(o) } return f } var be = /^([^.]*)(?:\.(.+)|)/; function we() { return !0 } function Te() { return !1 } function Ce(e, t) { return e === function () { try { return E.activeElement } catch (e) { } }() == ("focus" === t) } function Ee(e, t, n, r, i, o) { var a, s; if ("object" == typeof t) { for (s in "string" != typeof n && (r = r || n, n = void 0), t) Ee(e, s, n, r, t[s], o); return e } if (null == r && null == i ? (i = n, r = n = void 0) : null == i && ("string" == typeof n ? (i = r, r = void 0) : (i = r, r = n, n = void 0)), !1 === i) i = Te; else if (!i) return e; return 1 === o && (a = i, (i = function (e) { return S().off(e), a.apply(this, arguments) }).guid = a.guid || (a.guid = S.guid++)), e.each(function () { S.event.add(this, t, i, r, n) }) } function Se(e, i, o) { o ? (Y.set(e, i, !1), S.event.add(e, i, { namespace: !1, handler: function (e) { var t, n, r = Y.get(this, i); if (1 & e.isTrigger && this[i]) { if (r.length) (S.event.special[i] || {}).delegateType && e.stopPropagation(); else if (r = s.call(arguments), Y.set(this, i, r), t = o(this, i), this[i](), r !== (n = Y.get(this, i)) || t ? Y.set(this, i, !1) : n = {}, r !== n) return e.stopImmediatePropagation(), e.preventDefault(), n && n.value } else r.length && (Y.set(this, i, { value: S.event.trigger(S.extend(r[0], S.Event.prototype), r.slice(1), this) }), e.stopImmediatePropagation()) } })) : void 0 === Y.get(e, i) && S.event.add(e, i, we) } S.event = { global: {}, add: function (t, e, n, r, i) { var o, a, s, u, l, c, f, p, d, h, g, y = Y.get(t); if (V(t)) { n.handler && (n = (o = n).handler, i = o.selector), i && S.find.matchesSelector(re, i), n.guid || (n.guid = S.guid++), (u = y.events) || (u = y.events = Object.create(null)), (a = y.handle) || (a = y.handle = function (e) { return "undefined" != typeof S && S.event.triggered !== e.type ? S.event.dispatch.apply(t, arguments) : void 0 }), l = (e = (e || "").match(P) || [""]).length; while (l--) d = g = (s = be.exec(e[l]) || [])[1], h = (s[2] || "").split(".").sort(), d && (f = S.event.special[d] || {}, d = (i ? f.delegateType : f.bindType) || d, f = S.event.special[d] || {}, c = S.extend({ type: d, origType: g, data: r, handler: n, guid: n.guid, selector: i, needsContext: i && S.expr.match.needsContext.test(i), namespace: h.join(".") }, o), (p = u[d]) || ((p = u[d] = []).delegateCount = 0, f.setup && !1 !== f.setup.call(t, r, h, a) || t.addEventListener && t.addEventListener(d, a)), f.add && (f.add.call(t, c), c.handler.guid || (c.handler.guid = n.guid)), i ? p.splice(p.delegateCount++, 0, c) : p.push(c), S.event.global[d] = !0) } }, remove: function (e, t, n, r, i) { var o, a, s, u, l, c, f, p, d, h, g, y = Y.hasData(e) && Y.get(e); if (y && (u = y.events)) { l = (t = (t || "").match(P) || [""]).length; while (l--) if (d = g = (s = be.exec(t[l]) || [])[1], h = (s[2] || "").split(".").sort(), d) { f = S.event.special[d] || {}, p = u[d = (r ? f.delegateType : f.bindType) || d] || [], s = s[2] && new RegExp("(^|\\.)" + h.join("\\.(?:.*\\.|)") + "(\\.|$)"), a = o = p.length; while (o--) c = p[o], !i && g !== c.origType || n && n.guid !== c.guid || s && !s.test(c.namespace) || r && r !== c.selector && ("**" !== r || !c.selector) || (p.splice(o, 1), c.selector && p.delegateCount--, f.remove && f.remove.call(e, c)); a && !p.length && (f.teardown && !1 !== f.teardown.call(e, h, y.handle) || S.removeEvent(e, d, y.handle), delete u[d]) } else for (d in u) S.event.remove(e, d + t[l], n, r, !0); S.isEmptyObject(u) && Y.remove(e, "handle events") } }, dispatch: function (e) { var t, n, r, i, o, a, s = new Array(arguments.length), u = S.event.fix(e), l = (Y.get(this, "events") || Object.create(null))[u.type] || [], c = S.event.special[u.type] || {}; for (s[0] = u, t = 1; t < arguments.length; t++)s[t] = arguments[t]; if (u.delegateTarget = this, !c.preDispatch || !1 !== c.preDispatch.call(this, u)) { a = S.event.handlers.call(this, u, l), t = 0; while ((i = a[t++]) && !u.isPropagationStopped()) { u.currentTarget = i.elem, n = 0; while ((o = i.handlers[n++]) && !u.isImmediatePropagationStopped()) u.rnamespace && !1 !== o.namespace && !u.rnamespace.test(o.namespace) || (u.handleObj = o, u.data = o.data, void 0 !== (r = ((S.event.special[o.origType] || {}).handle || o.handler).apply(i.elem, s)) && !1 === (u.result = r) && (u.preventDefault(), u.stopPropagation())) } return c.postDispatch && c.postDispatch.call(this, u), u.result } }, handlers: function (e, t) { var n, r, i, o, a, s = [], u = t.delegateCount, l = e.target; if (u && l.nodeType && !("click" === e.type && 1 <= e.button)) for (; l !== this; l = l.parentNode || this)if (1 === l.nodeType && ("click" !== e.type || !0 !== l.disabled)) { for (o = [], a = {}, n = 0; n < u; n++)void 0 === a[i = (r = t[n]).selector + " "] && (a[i] = r.needsContext ? -1 < S(i, this).index(l) : S.find(i, this, null, [l]).length), a[i] && o.push(r); o.length && s.push({ elem: l, handlers: o }) } return l = this, u < t.length && s.push({ elem: l, handlers: t.slice(u) }), s }, addProp: function (t, e) { Object.defineProperty(S.Event.prototype, t, { enumerable: !0, configurable: !0, get: m(e) ? function () { if (this.originalEvent) return e(this.originalEvent) } : function () { if (this.originalEvent) return this.originalEvent[t] }, set: function (e) { Object.defineProperty(this, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) } }) }, fix: function (e) { return e[S.expando] ? e : new S.Event(e) }, special: { load: { noBubble: !0 }, click: { setup: function (e) { var t = this || e; return pe.test(t.type) && t.click && A(t, "input") && Se(t, "click", we), !1 }, trigger: function (e) { var t = this || e; return pe.test(t.type) && t.click && A(t, "input") && Se(t, "click"), !0 }, _default: function (e) { var t = e.target; return pe.test(t.type) && t.click && A(t, "input") && Y.get(t, "click") || A(t, "a") } }, beforeunload: { postDispatch: function (e) { void 0 !== e.result && e.originalEvent && (e.originalEvent.returnValue = e.result) } } } }, S.removeEvent = function (e, t, n) { e.removeEventListener && e.removeEventListener(t, n) }, S.Event = function (e, t) { if (!(this instanceof S.Event)) return new S.Event(e, t); e && e.type ? (this.originalEvent = e, this.type = e.type, this.isDefaultPrevented = e.defaultPrevented || void 0 === e.defaultPrevented && !1 === e.returnValue ? we : Te, this.target = e.target && 3 === e.target.nodeType ? e.target.parentNode : e.target, this.currentTarget = e.currentTarget, this.relatedTarget = e.relatedTarget) : this.type = e, t && S.extend(this, t), this.timeStamp = e && e.timeStamp || Date.now(), this[S.expando] = !0 }, S.Event.prototype = { constructor: S.Event, isDefaultPrevented: Te, isPropagationStopped: Te, isImmediatePropagationStopped: Te, isSimulated: !1, preventDefault: function () { var e = this.originalEvent; this.isDefaultPrevented = we, e && !this.isSimulated && e.preventDefault() }, stopPropagation: function () { var e = this.originalEvent; this.isPropagationStopped = we, e && !this.isSimulated && e.stopPropagation() }, stopImmediatePropagation: function () { var e = this.originalEvent; this.isImmediatePropagationStopped = we, e && !this.isSimulated && e.stopImmediatePropagation(), this.stopPropagation() } }, S.each({ altKey: !0, bubbles: !0, cancelable: !0, changedTouches: !0, ctrlKey: !0, detail: !0, eventPhase: !0, metaKey: !0, pageX: !0, pageY: !0, shiftKey: !0, view: !0, "char": !0, code: !0, charCode: !0, key: !0, keyCode: !0, button: !0, buttons: !0, clientX: !0, clientY: !0, offsetX: !0, offsetY: !0, pointerId: !0, pointerType: !0, screenX: !0, screenY: !0, targetTouches: !0, toElement: !0, touches: !0, which: !0 }, S.event.addProp), S.each({ focus: "focusin", blur: "focusout" }, function (t, e) { S.event.special[t] = { setup: function () { return Se(this, t, Ce), !1 }, trigger: function () { return Se(this, t), !0 }, _default: function (e) { return Y.get(e.target, t) }, delegateType: e } }), S.each({ mouseenter: "mouseover", mouseleave: "mouseout", pointerenter: "pointerover", pointerleave: "pointerout" }, function (e, i) { S.event.special[e] = { delegateType: i, bindType: i, handle: function (e) { var t, n = e.relatedTarget, r = e.handleObj; return n && (n === this || S.contains(this, n)) || (e.type = r.origType, t = r.handler.apply(this, arguments), e.type = i), t } } }), S.fn.extend({ on: function (e, t, n, r) { return Ee(this, e, t, n, r) }, one: function (e, t, n, r) { return Ee(this, e, t, n, r, 1) }, off: function (e, t, n) { var r, i; if (e && e.preventDefault && e.handleObj) return r = e.handleObj, S(e.delegateTarget).off(r.namespace ? r.origType + "." + r.namespace : r.origType, r.selector, r.handler), this; if ("object" == typeof e) { for (i in e) this.off(i, t, e[i]); return this } return !1 !== t && "function" != typeof t || (n = t, t = void 0), !1 === n && (n = Te), this.each(function () { S.event.remove(this, e, n, t) }) } }); var ke = /\s*$/g; function je(e, t) { return A(e, "table") && A(11 !== t.nodeType ? t : t.firstChild, "tr") && S(e).children("tbody")[0] || e } function De(e) { return e.type = (null !== e.getAttribute("type")) + "/" + e.type, e } function qe(e) { return "true/" === (e.type || "").slice(0, 5) ? e.type = e.type.slice(5) : e.removeAttribute("type"), e } function Le(e, t) { var n, r, i, o, a, s; if (1 === t.nodeType) { if (Y.hasData(e) && (s = Y.get(e).events)) for (i in Y.remove(t, "handle events"), s) for (n = 0, r = s[i].length; n < r; n++)S.event.add(t, i, s[i][n]); Q.hasData(e) && (o = Q.access(e), a = S.extend({}, o), Q.set(t, a)) } } function He(n, r, i, o) { r = g(r); var e, t, a, s, u, l, c = 0, f = n.length, p = f - 1, d = r[0], h = m(d); if (h || 1 < f && "string" == typeof d && !v.checkClone && Ae.test(d)) return n.each(function (e) { var t = n.eq(e); h && (r[0] = d.call(this, e, t.html())), He(t, r, i, o) }); if (f && (t = (e = xe(r, n[0].ownerDocument, !1, n, o)).firstChild, 1 === e.childNodes.length && (e = t), t || o)) { for (s = (a = S.map(ye(e, "script"), De)).length; c < f; c++)u = e, c !== p && (u = S.clone(u, !0, !0), s && S.merge(a, ye(u, "script"))), i.call(n[c], u, c); if (s) for (l = a[a.length - 1].ownerDocument, S.map(a, qe), c = 0; c < s; c++)u = a[c], he.test(u.type || "") && !Y.access(u, "globalEval") && S.contains(l, u) && (u.src && "module" !== (u.type || "").toLowerCase() ? S._evalUrl && !u.noModule && S._evalUrl(u.src, { nonce: u.nonce || u.getAttribute("nonce") }, l) : b(u.textContent.replace(Ne, ""), u, l)) } return n } function Oe(e, t, n) { for (var r, i = t ? S.filter(t, e) : e, o = 0; null != (r = i[o]); o++)n || 1 !== r.nodeType || S.cleanData(ye(r)), r.parentNode && (n && ie(r) && ve(ye(r, "script")), r.parentNode.removeChild(r)); return e } S.extend({ htmlPrefilter: function (e) { return e }, clone: function (e, t, n) { var r, i, o, a, s, u, l, c = e.cloneNode(!0), f = ie(e); if (!(v.noCloneChecked || 1 !== e.nodeType && 11 !== e.nodeType || S.isXMLDoc(e))) for (a = ye(c), r = 0, i = (o = ye(e)).length; r < i; r++)s = o[r], u = a[r], void 0, "input" === (l = u.nodeName.toLowerCase()) && pe.test(s.type) ? u.checked = s.checked : "input" !== l && "textarea" !== l || (u.defaultValue = s.defaultValue); if (t) if (n) for (o = o || ye(e), a = a || ye(c), r = 0, i = o.length; r < i; r++)Le(o[r], a[r]); else Le(e, c); return 0 < (a = ye(c, "script")).length && ve(a, !f && ye(e, "script")), c }, cleanData: function (e) { for (var t, n, r, i = S.event.special, o = 0; void 0 !== (n = e[o]); o++)if (V(n)) { if (t = n[Y.expando]) { if (t.events) for (r in t.events) i[r] ? S.event.remove(n, r) : S.removeEvent(n, r, t.handle); n[Y.expando] = void 0 } n[Q.expando] && (n[Q.expando] = void 0) } } }), S.fn.extend({ detach: function (e) { return Oe(this, e, !0) }, remove: function (e) { return Oe(this, e) }, text: function (e) { return B(this, function (e) { return void 0 === e ? S.text(this) : this.empty().each(function () { 1 !== this.nodeType && 11 !== this.nodeType && 9 !== this.nodeType || (this.textContent = e) }) }, null, e, arguments.length) }, append: function () { return He(this, arguments, function (e) { 1 !== this.nodeType && 11 !== this.nodeType && 9 !== this.nodeType || je(this, e).appendChild(e) }) }, prepend: function () { return He(this, arguments, function (e) { if (1 === this.nodeType || 11 === this.nodeType || 9 === this.nodeType) { var t = je(this, e); t.insertBefore(e, t.firstChild) } }) }, before: function () { return He(this, arguments, function (e) { this.parentNode && this.parentNode.insertBefore(e, this) }) }, after: function () { return He(this, arguments, function (e) { this.parentNode && this.parentNode.insertBefore(e, this.nextSibling) }) }, empty: function () { for (var e, t = 0; null != (e = this[t]); t++)1 === e.nodeType && (S.cleanData(ye(e, !1)), e.textContent = ""); return this }, clone: function (e, t) { return e = null != e && e, t = null == t ? e : t, this.map(function () { return S.clone(this, e, t) }) }, html: function (e) { return B(this, function (e) { var t = this[0] || {}, n = 0, r = this.length; if (void 0 === e && 1 === t.nodeType) return t.innerHTML; if ("string" == typeof e && !ke.test(e) && !ge[(de.exec(e) || ["", ""])[1].toLowerCase()]) { e = S.htmlPrefilter(e); try { for (; n < r; n++)1 === (t = this[n] || {}).nodeType && (S.cleanData(ye(t, !1)), t.innerHTML = e); t = 0 } catch (e) { } } t && this.empty().append(e) }, null, e, arguments.length) }, replaceWith: function () { var n = []; return He(this, arguments, function (e) { var t = this.parentNode; S.inArray(this, n) < 0 && (S.cleanData(ye(this)), t && t.replaceChild(e, this)) }, n) } }), S.each({ appendTo: "append", prependTo: "prepend", insertBefore: "before", insertAfter: "after", replaceAll: "replaceWith" }, function (e, a) { S.fn[e] = function (e) { for (var t, n = [], r = S(e), i = r.length - 1, o = 0; o <= i; o++)t = o === i ? this : this.clone(!0), S(r[o])[a](t), u.apply(n, t.get()); return this.pushStack(n) } }); var Pe = new RegExp("^(" + ee + ")(?!px)[a-z%]+$", "i"), Re = /^--/, Me = function (e) { var t = e.ownerDocument.defaultView; return t && t.opener || (t = C), t.getComputedStyle(e) }, Ie = function (e, t, n) { var r, i, o = {}; for (i in t) o[i] = e.style[i], e.style[i] = t[i]; for (i in r = n.call(e), t) e.style[i] = o[i]; return r }, We = new RegExp(ne.join("|"), "i"), Fe = "[\\x20\\t\\r\\n\\f]", $e = new RegExp("^" + Fe + "+|((?:^|[^\\\\])(?:\\\\.)*)" + Fe + "+$", "g"); function Be(e, t, n) { var r, i, o, a, s = Re.test(t), u = e.style; return (n = n || Me(e)) && (a = n.getPropertyValue(t) || n[t], s && a && (a = a.replace($e, "$1") || void 0), "" !== a || ie(e) || (a = S.style(e, t)), !v.pixelBoxStyles() && Pe.test(a) && We.test(t) && (r = u.width, i = u.minWidth, o = u.maxWidth, u.minWidth = u.maxWidth = u.width = a, a = n.width, u.width = r, u.minWidth = i, u.maxWidth = o)), void 0 !== a ? a + "" : a } function _e(e, t) { return { get: function () { if (!e()) return (this.get = t).apply(this, arguments); delete this.get } } } !function () { function e() { if (l) { u.style.cssText = "position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0", l.style.cssText = "position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%", re.appendChild(u).appendChild(l); var e = C.getComputedStyle(l); n = "1%" !== e.top, s = 12 === t(e.marginLeft), l.style.right = "60%", o = 36 === t(e.right), r = 36 === t(e.width), l.style.position = "absolute", i = 12 === t(l.offsetWidth / 3), re.removeChild(u), l = null } } function t(e) { return Math.round(parseFloat(e)) } var n, r, i, o, a, s, u = E.createElement("div"), l = E.createElement("div"); l.style && (l.style.backgroundClip = "content-box", l.cloneNode(!0).style.backgroundClip = "", v.clearCloneStyle = "content-box" === l.style.backgroundClip, S.extend(v, { boxSizingReliable: function () { return e(), r }, pixelBoxStyles: function () { return e(), o }, pixelPosition: function () { return e(), n }, reliableMarginLeft: function () { return e(), s }, scrollboxSize: function () { return e(), i }, reliableTrDimensions: function () { var e, t, n, r; return null == a && (e = E.createElement("table"), t = E.createElement("tr"), n = E.createElement("div"), e.style.cssText = "position:absolute;left:-11111px;border-collapse:separate", t.style.cssText = "border:1px solid", t.style.height = "1px", n.style.height = "9px", n.style.display = "block", re.appendChild(e).appendChild(t).appendChild(n), r = C.getComputedStyle(t), a = parseInt(r.height, 10) + parseInt(r.borderTopWidth, 10) + parseInt(r.borderBottomWidth, 10) === t.offsetHeight, re.removeChild(e)), a } })) }(); var ze = ["Webkit", "Moz", "ms"], Ue = E.createElement("div").style, Xe = {}; function Ve(e) { var t = S.cssProps[e] || Xe[e]; return t || (e in Ue ? e : Xe[e] = function (e) { var t = e[0].toUpperCase() + e.slice(1), n = ze.length; while (n--) if ((e = ze[n] + t) in Ue) return e }(e) || e) } var Ge = /^(none|table(?!-c[ea]).+)/, Ye = { position: "absolute", visibility: "hidden", display: "block" }, Qe = { letterSpacing: "0", fontWeight: "400" }; function Je(e, t, n) { var r = te.exec(t); return r ? Math.max(0, r[2] - (n || 0)) + (r[3] || "px") : t } function Ke(e, t, n, r, i, o) { var a = "width" === t ? 1 : 0, s = 0, u = 0; if (n === (r ? "border" : "content")) return 0; for (; a < 4; a += 2)"margin" === n && (u += S.css(e, n + ne[a], !0, i)), r ? ("content" === n && (u -= S.css(e, "padding" + ne[a], !0, i)), "margin" !== n && (u -= S.css(e, "border" + ne[a] + "Width", !0, i))) : (u += S.css(e, "padding" + ne[a], !0, i), "padding" !== n ? u += S.css(e, "border" + ne[a] + "Width", !0, i) : s += S.css(e, "border" + ne[a] + "Width", !0, i)); return !r && 0 <= o && (u += Math.max(0, Math.ceil(e["offset" + t[0].toUpperCase() + t.slice(1)] - o - u - s - .5)) || 0), u } function Ze(e, t, n) { var r = Me(e), i = (!v.boxSizingReliable() || n) && "border-box" === S.css(e, "boxSizing", !1, r), o = i, a = Be(e, t, r), s = "offset" + t[0].toUpperCase() + t.slice(1); if (Pe.test(a)) { if (!n) return a; a = "auto" } return (!v.boxSizingReliable() && i || !v.reliableTrDimensions() && A(e, "tr") || "auto" === a || !parseFloat(a) && "inline" === S.css(e, "display", !1, r)) && e.getClientRects().length && (i = "border-box" === S.css(e, "boxSizing", !1, r), (o = s in e) && (a = e[s])), (a = parseFloat(a) || 0) + Ke(e, t, n || (i ? "border" : "content"), o, r, a) + "px" } function et(e, t, n, r, i) { return new et.prototype.init(e, t, n, r, i) } S.extend({ cssHooks: { opacity: { get: function (e, t) { if (t) { var n = Be(e, "opacity"); return "" === n ? "1" : n } } } }, cssNumber: { animationIterationCount: !0, columnCount: !0, fillOpacity: !0, flexGrow: !0, flexShrink: !0, fontWeight: !0, gridArea: !0, gridColumn: !0, gridColumnEnd: !0, gridColumnStart: !0, gridRow: !0, gridRowEnd: !0, gridRowStart: !0, lineHeight: !0, opacity: !0, order: !0, orphans: !0, widows: !0, zIndex: !0, zoom: !0 }, cssProps: {}, style: function (e, t, n, r) { if (e && 3 !== e.nodeType && 8 !== e.nodeType && e.style) { var i, o, a, s = X(t), u = Re.test(t), l = e.style; if (u || (t = Ve(s)), a = S.cssHooks[t] || S.cssHooks[s], void 0 === n) return a && "get" in a && void 0 !== (i = a.get(e, !1, r)) ? i : l[t]; "string" === (o = typeof n) && (i = te.exec(n)) && i[1] && (n = se(e, t, i), o = "number"), null != n && n == n && ("number" !== o || u || (n += i && i[3] || (S.cssNumber[s] ? "" : "px")), v.clearCloneStyle || "" !== n || 0 !== t.indexOf("background") || (l[t] = "inherit"), a && "set" in a && void 0 === (n = a.set(e, n, r)) || (u ? l.setProperty(t, n) : l[t] = n)) } }, css: function (e, t, n, r) { var i, o, a, s = X(t); return Re.test(t) || (t = Ve(s)), (a = S.cssHooks[t] || S.cssHooks[s]) && "get" in a && (i = a.get(e, !0, n)), void 0 === i && (i = Be(e, t, r)), "normal" === i && t in Qe && (i = Qe[t]), "" === n || n ? (o = parseFloat(i), !0 === n || isFinite(o) ? o || 0 : i) : i } }), S.each(["height", "width"], function (e, u) { S.cssHooks[u] = { get: function (e, t, n) { if (t) return !Ge.test(S.css(e, "display")) || e.getClientRects().length && e.getBoundingClientRect().width ? Ze(e, u, n) : Ie(e, Ye, function () { return Ze(e, u, n) }) }, set: function (e, t, n) { var r, i = Me(e), o = !v.scrollboxSize() && "absolute" === i.position, a = (o || n) && "border-box" === S.css(e, "boxSizing", !1, i), s = n ? Ke(e, u, n, a, i) : 0; return a && o && (s -= Math.ceil(e["offset" + u[0].toUpperCase() + u.slice(1)] - parseFloat(i[u]) - Ke(e, u, "border", !1, i) - .5)), s && (r = te.exec(t)) && "px" !== (r[3] || "px") && (e.style[u] = t, t = S.css(e, u)), Je(0, t, s) } } }), S.cssHooks.marginLeft = _e(v.reliableMarginLeft, function (e, t) { if (t) return (parseFloat(Be(e, "marginLeft")) || e.getBoundingClientRect().left - Ie(e, { marginLeft: 0 }, function () { return e.getBoundingClientRect().left })) + "px" }), S.each({ margin: "", padding: "", border: "Width" }, function (i, o) { S.cssHooks[i + o] = { expand: function (e) { for (var t = 0, n = {}, r = "string" == typeof e ? e.split(" ") : [e]; t < 4; t++)n[i + ne[t] + o] = r[t] || r[t - 2] || r[0]; return n } }, "margin" !== i && (S.cssHooks[i + o].set = Je) }), S.fn.extend({ css: function (e, t) { return B(this, function (e, t, n) { var r, i, o = {}, a = 0; if (Array.isArray(t)) { for (r = Me(e), i = t.length; a < i; a++)o[t[a]] = S.css(e, t[a], !1, r); return o } return void 0 !== n ? S.style(e, t, n) : S.css(e, t) }, e, t, 1 < arguments.length) } }), ((S.Tween = et).prototype = { constructor: et, init: function (e, t, n, r, i, o) { this.elem = e, this.prop = n, this.easing = i || S.easing._default, this.options = t, this.start = this.now = this.cur(), this.end = r, this.unit = o || (S.cssNumber[n] ? "" : "px") }, cur: function () { var e = et.propHooks[this.prop]; return e && e.get ? e.get(this) : et.propHooks._default.get(this) }, run: function (e) { var t, n = et.propHooks[this.prop]; return this.options.duration ? this.pos = t = S.easing[this.easing](e, this.options.duration * e, 0, 1, this.options.duration) : this.pos = t = e, this.now = (this.end - this.start) * t + this.start, this.options.step && this.options.step.call(this.elem, this.now, this), n && n.set ? n.set(this) : et.propHooks._default.set(this), this } }).init.prototype = et.prototype, (et.propHooks = { _default: { get: function (e) { var t; return 1 !== e.elem.nodeType || null != e.elem[e.prop] && null == e.elem.style[e.prop] ? e.elem[e.prop] : (t = S.css(e.elem, e.prop, "")) && "auto" !== t ? t : 0 }, set: function (e) { S.fx.step[e.prop] ? S.fx.step[e.prop](e) : 1 !== e.elem.nodeType || !S.cssHooks[e.prop] && null == e.elem.style[Ve(e.prop)] ? e.elem[e.prop] = e.now : S.style(e.elem, e.prop, e.now + e.unit) } } }).scrollTop = et.propHooks.scrollLeft = { set: function (e) { e.elem.nodeType && e.elem.parentNode && (e.elem[e.prop] = e.now) } }, S.easing = { linear: function (e) { return e }, swing: function (e) { return .5 - Math.cos(e * Math.PI) / 2 }, _default: "swing" }, S.fx = et.prototype.init, S.fx.step = {}; var tt, nt, rt, it, ot = /^(?:toggle|show|hide)$/, at = /queueHooks$/; function st() { nt && (!1 === E.hidden && C.requestAnimationFrame ? C.requestAnimationFrame(st) : C.setTimeout(st, S.fx.interval), S.fx.tick()) } function ut() { return C.setTimeout(function () { tt = void 0 }), tt = Date.now() } function lt(e, t) { var n, r = 0, i = { height: e }; for (t = t ? 1 : 0; r < 4; r += 2 - t)i["margin" + (n = ne[r])] = i["padding" + n] = e; return t && (i.opacity = i.width = e), i } function ct(e, t, n) { for (var r, i = (ft.tweeners[t] || []).concat(ft.tweeners["*"]), o = 0, a = i.length; o < a; o++)if (r = i[o].call(n, t, e)) return r } function ft(o, e, t) { var n, a, r = 0, i = ft.prefilters.length, s = S.Deferred().always(function () { delete u.elem }), u = function () { if (a) return !1; for (var e = tt || ut(), t = Math.max(0, l.startTime + l.duration - e), n = 1 - (t / l.duration || 0), r = 0, i = l.tweens.length; r < i; r++)l.tweens[r].run(n); return s.notifyWith(o, [l, n, t]), n < 1 && i ? t : (i || s.notifyWith(o, [l, 1, 0]), s.resolveWith(o, [l]), !1) }, l = s.promise({ elem: o, props: S.extend({}, e), opts: S.extend(!0, { specialEasing: {}, easing: S.easing._default }, t), originalProperties: e, originalOptions: t, startTime: tt || ut(), duration: t.duration, tweens: [], createTween: function (e, t) { var n = S.Tween(o, l.opts, e, t, l.opts.specialEasing[e] || l.opts.easing); return l.tweens.push(n), n }, stop: function (e) { var t = 0, n = e ? l.tweens.length : 0; if (a) return this; for (a = !0; t < n; t++)l.tweens[t].run(1); return e ? (s.notifyWith(o, [l, 1, 0]), s.resolveWith(o, [l, e])) : s.rejectWith(o, [l, e]), this } }), c = l.props; for (!function (e, t) { var n, r, i, o, a; for (n in e) if (i = t[r = X(n)], o = e[n], Array.isArray(o) && (i = o[1], o = e[n] = o[0]), n !== r && (e[r] = o, delete e[n]), (a = S.cssHooks[r]) && "expand" in a) for (n in o = a.expand(o), delete e[r], o) n in e || (e[n] = o[n], t[n] = i); else t[r] = i }(c, l.opts.specialEasing); r < i; r++)if (n = ft.prefilters[r].call(l, o, c, l.opts)) return m(n.stop) && (S._queueHooks(l.elem, l.opts.queue).stop = n.stop.bind(n)), n; return S.map(c, ct, l), m(l.opts.start) && l.opts.start.call(o, l), l.progress(l.opts.progress).done(l.opts.done, l.opts.complete).fail(l.opts.fail).always(l.opts.always), S.fx.timer(S.extend(u, { elem: o, anim: l, queue: l.opts.queue })), l } S.Animation = S.extend(ft, { tweeners: { "*": [function (e, t) { var n = this.createTween(e, t); return se(n.elem, e, te.exec(t), n), n }] }, tweener: function (e, t) { m(e) ? (t = e, e = ["*"]) : e = e.match(P); for (var n, r = 0, i = e.length; r < i; r++)n = e[r], ft.tweeners[n] = ft.tweeners[n] || [], ft.tweeners[n].unshift(t) }, prefilters: [function (e, t, n) { var r, i, o, a, s, u, l, c, f = "width" in t || "height" in t, p = this, d = {}, h = e.style, g = e.nodeType && ae(e), y = Y.get(e, "fxshow"); for (r in n.queue || (null == (a = S._queueHooks(e, "fx")).unqueued && (a.unqueued = 0, s = a.empty.fire, a.empty.fire = function () { a.unqueued || s() }), a.unqueued++, p.always(function () { p.always(function () { a.unqueued--, S.queue(e, "fx").length || a.empty.fire() }) })), t) if (i = t[r], ot.test(i)) { if (delete t[r], o = o || "toggle" === i, i === (g ? "hide" : "show")) { if ("show" !== i || !y || void 0 === y[r]) continue; g = !0 } d[r] = y && y[r] || S.style(e, r) } if ((u = !S.isEmptyObject(t)) || !S.isEmptyObject(d)) for (r in f && 1 === e.nodeType && (n.overflow = [h.overflow, h.overflowX, h.overflowY], null == (l = y && y.display) && (l = Y.get(e, "display")), "none" === (c = S.css(e, "display")) && (l ? c = l : (le([e], !0), l = e.style.display || l, c = S.css(e, "display"), le([e]))), ("inline" === c || "inline-block" === c && null != l) && "none" === S.css(e, "float") && (u || (p.done(function () { h.display = l }), null == l && (c = h.display, l = "none" === c ? "" : c)), h.display = "inline-block")), n.overflow && (h.overflow = "hidden", p.always(function () { h.overflow = n.overflow[0], h.overflowX = n.overflow[1], h.overflowY = n.overflow[2] })), u = !1, d) u || (y ? "hidden" in y && (g = y.hidden) : y = Y.access(e, "fxshow", { display: l }), o && (y.hidden = !g), g && le([e], !0), p.done(function () { for (r in g || le([e]), Y.remove(e, "fxshow"), d) S.style(e, r, d[r]) })), u = ct(g ? y[r] : 0, r, p), r in y || (y[r] = u.start, g && (u.end = u.start, u.start = 0)) }], prefilter: function (e, t) { t ? ft.prefilters.unshift(e) : ft.prefilters.push(e) } }), S.speed = function (e, t, n) { var r = e && "object" == typeof e ? S.extend({}, e) : { complete: n || !n && t || m(e) && e, duration: e, easing: n && t || t && !m(t) && t }; return S.fx.off ? r.duration = 0 : "number" != typeof r.duration && (r.duration in S.fx.speeds ? r.duration = S.fx.speeds[r.duration] : r.duration = S.fx.speeds._default), null != r.queue && !0 !== r.queue || (r.queue = "fx"), r.old = r.complete, r.complete = function () { m(r.old) && r.old.call(this), r.queue && S.dequeue(this, r.queue) }, r }, S.fn.extend({ fadeTo: function (e, t, n, r) { return this.filter(ae).css("opacity", 0).show().end().animate({ opacity: t }, e, n, r) }, animate: function (t, e, n, r) { var i = S.isEmptyObject(t), o = S.speed(e, n, r), a = function () { var e = ft(this, S.extend({}, t), o); (i || Y.get(this, "finish")) && e.stop(!0) }; return a.finish = a, i || !1 === o.queue ? this.each(a) : this.queue(o.queue, a) }, stop: function (i, e, o) { var a = function (e) { var t = e.stop; delete e.stop, t(o) }; return "string" != typeof i && (o = e, e = i, i = void 0), e && this.queue(i || "fx", []), this.each(function () { var e = !0, t = null != i && i + "queueHooks", n = S.timers, r = Y.get(this); if (t) r[t] && r[t].stop && a(r[t]); else for (t in r) r[t] && r[t].stop && at.test(t) && a(r[t]); for (t = n.length; t--;)n[t].elem !== this || null != i && n[t].queue !== i || (n[t].anim.stop(o), e = !1, n.splice(t, 1)); !e && o || S.dequeue(this, i) }) }, finish: function (a) { return !1 !== a && (a = a || "fx"), this.each(function () { var e, t = Y.get(this), n = t[a + "queue"], r = t[a + "queueHooks"], i = S.timers, o = n ? n.length : 0; for (t.finish = !0, S.queue(this, a, []), r && r.stop && r.stop.call(this, !0), e = i.length; e--;)i[e].elem === this && i[e].queue === a && (i[e].anim.stop(!0), i.splice(e, 1)); for (e = 0; e < o; e++)n[e] && n[e].finish && n[e].finish.call(this); delete t.finish }) } }), S.each(["toggle", "show", "hide"], function (e, r) { var i = S.fn[r]; S.fn[r] = function (e, t, n) { return null == e || "boolean" == typeof e ? i.apply(this, arguments) : this.animate(lt(r, !0), e, t, n) } }), S.each({ slideDown: lt("show"), slideUp: lt("hide"), slideToggle: lt("toggle"), fadeIn: { opacity: "show" }, fadeOut: { opacity: "hide" }, fadeToggle: { opacity: "toggle" } }, function (e, r) { S.fn[e] = function (e, t, n) { return this.animate(r, e, t, n) } }), S.timers = [], S.fx.tick = function () { var e, t = 0, n = S.timers; for (tt = Date.now(); t < n.length; t++)(e = n[t])() || n[t] !== e || n.splice(t--, 1); n.length || S.fx.stop(), tt = void 0 }, S.fx.timer = function (e) { S.timers.push(e), S.fx.start() }, S.fx.interval = 13, S.fx.start = function () { nt || (nt = !0, st()) }, S.fx.stop = function () { nt = null }, S.fx.speeds = { slow: 600, fast: 200, _default: 400 }, S.fn.delay = function (r, e) { return r = S.fx && S.fx.speeds[r] || r, e = e || "fx", this.queue(e, function (e, t) { var n = C.setTimeout(e, r); t.stop = function () { C.clearTimeout(n) } }) }, rt = E.createElement("input"), it = E.createElement("select").appendChild(E.createElement("option")), rt.type = "checkbox", v.checkOn = "" !== rt.value, v.optSelected = it.selected, (rt = E.createElement("input")).value = "t", rt.type = "radio", v.radioValue = "t" === rt.value; var pt, dt = S.expr.attrHandle; S.fn.extend({ attr: function (e, t) { return B(this, S.attr, e, t, 1 < arguments.length) }, removeAttr: function (e) { return this.each(function () { S.removeAttr(this, e) }) } }), S.extend({ attr: function (e, t, n) { var r, i, o = e.nodeType; if (3 !== o && 8 !== o && 2 !== o) return "undefined" == typeof e.getAttribute ? S.prop(e, t, n) : (1 === o && S.isXMLDoc(e) || (i = S.attrHooks[t.toLowerCase()] || (S.expr.match.bool.test(t) ? pt : void 0)), void 0 !== n ? null === n ? void S.removeAttr(e, t) : i && "set" in i && void 0 !== (r = i.set(e, n, t)) ? r : (e.setAttribute(t, n + ""), n) : i && "get" in i && null !== (r = i.get(e, t)) ? r : null == (r = S.find.attr(e, t)) ? void 0 : r) }, attrHooks: { type: { set: function (e, t) { if (!v.radioValue && "radio" === t && A(e, "input")) { var n = e.value; return e.setAttribute("type", t), n && (e.value = n), t } } } }, removeAttr: function (e, t) { var n, r = 0, i = t && t.match(P); if (i && 1 === e.nodeType) while (n = i[r++]) e.removeAttribute(n) } }), pt = { set: function (e, t, n) { return !1 === t ? S.removeAttr(e, n) : e.setAttribute(n, n), n } }, S.each(S.expr.match.bool.source.match(/\w+/g), function (e, t) { var a = dt[t] || S.find.attr; dt[t] = function (e, t, n) { var r, i, o = t.toLowerCase(); return n || (i = dt[o], dt[o] = r, r = null != a(e, t, n) ? o : null, dt[o] = i), r } }); var ht = /^(?:input|select|textarea|button)$/i, gt = /^(?:a|area)$/i; function yt(e) { return (e.match(P) || []).join(" ") } function vt(e) { return e.getAttribute && e.getAttribute("class") || "" } function mt(e) { return Array.isArray(e) ? e : "string" == typeof e && e.match(P) || [] } S.fn.extend({ prop: function (e, t) { return B(this, S.prop, e, t, 1 < arguments.length) }, removeProp: function (e) { return this.each(function () { delete this[S.propFix[e] || e] }) } }), S.extend({ prop: function (e, t, n) { var r, i, o = e.nodeType; if (3 !== o && 8 !== o && 2 !== o) return 1 === o && S.isXMLDoc(e) || (t = S.propFix[t] || t, i = S.propHooks[t]), void 0 !== n ? i && "set" in i && void 0 !== (r = i.set(e, n, t)) ? r : e[t] = n : i && "get" in i && null !== (r = i.get(e, t)) ? r : e[t] }, propHooks: { tabIndex: { get: function (e) { var t = S.find.attr(e, "tabindex"); return t ? parseInt(t, 10) : ht.test(e.nodeName) || gt.test(e.nodeName) && e.href ? 0 : -1 } } }, propFix: { "for": "htmlFor", "class": "className" } }), v.optSelected || (S.propHooks.selected = { get: function (e) { var t = e.parentNode; return t && t.parentNode && t.parentNode.selectedIndex, null }, set: function (e) { var t = e.parentNode; t && (t.selectedIndex, t.parentNode && t.parentNode.selectedIndex) } }), S.each(["tabIndex", "readOnly", "maxLength", "cellSpacing", "cellPadding", "rowSpan", "colSpan", "useMap", "frameBorder", "contentEditable"], function () { S.propFix[this.toLowerCase()] = this }), S.fn.extend({ addClass: function (t) { var e, n, r, i, o, a; return m(t) ? this.each(function (e) { S(this).addClass(t.call(this, e, vt(this))) }) : (e = mt(t)).length ? this.each(function () { if (r = vt(this), n = 1 === this.nodeType && " " + yt(r) + " ") { for (o = 0; o < e.length; o++)i = e[o], n.indexOf(" " + i + " ") < 0 && (n += i + " "); a = yt(n), r !== a && this.setAttribute("class", a) } }) : this }, removeClass: function (t) { var e, n, r, i, o, a; return m(t) ? this.each(function (e) { S(this).removeClass(t.call(this, e, vt(this))) }) : arguments.length ? (e = mt(t)).length ? this.each(function () { if (r = vt(this), n = 1 === this.nodeType && " " + yt(r) + " ") { for (o = 0; o < e.length; o++) { i = e[o]; while (-1 < n.indexOf(" " + i + " ")) n = n.replace(" " + i + " ", " ") } a = yt(n), r !== a && this.setAttribute("class", a) } }) : this : this.attr("class", "") }, toggleClass: function (t, n) { var e, r, i, o, a = typeof t, s = "string" === a || Array.isArray(t); return m(t) ? this.each(function (e) { S(this).toggleClass(t.call(this, e, vt(this), n), n) }) : "boolean" == typeof n && s ? n ? this.addClass(t) : this.removeClass(t) : (e = mt(t), this.each(function () { if (s) for (o = S(this), i = 0; i < e.length; i++)r = e[i], o.hasClass(r) ? o.removeClass(r) : o.addClass(r); else void 0 !== t && "boolean" !== a || ((r = vt(this)) && Y.set(this, "__className__", r), this.setAttribute && this.setAttribute("class", r || !1 === t ? "" : Y.get(this, "__className__") || "")) })) }, hasClass: function (e) { var t, n, r = 0; t = " " + e + " "; while (n = this[r++]) if (1 === n.nodeType && -1 < (" " + yt(vt(n)) + " ").indexOf(t)) return !0; return !1 } }); var xt = /\r/g; S.fn.extend({ val: function (n) { var r, e, i, t = this[0]; return arguments.length ? (i = m(n), this.each(function (e) { var t; 1 === this.nodeType && (null == (t = i ? n.call(this, e, S(this).val()) : n) ? t = "" : "number" == typeof t ? t += "" : Array.isArray(t) && (t = S.map(t, function (e) { return null == e ? "" : e + "" })), (r = S.valHooks[this.type] || S.valHooks[this.nodeName.toLowerCase()]) && "set" in r && void 0 !== r.set(this, t, "value") || (this.value = t)) })) : t ? (r = S.valHooks[t.type] || S.valHooks[t.nodeName.toLowerCase()]) && "get" in r && void 0 !== (e = r.get(t, "value")) ? e : "string" == typeof (e = t.value) ? e.replace(xt, "") : null == e ? "" : e : void 0 } }), S.extend({ valHooks: { option: { get: function (e) { var t = S.find.attr(e, "value"); return null != t ? t : yt(S.text(e)) } }, select: { get: function (e) { var t, n, r, i = e.options, o = e.selectedIndex, a = "select-one" === e.type, s = a ? null : [], u = a ? o + 1 : i.length; for (r = o < 0 ? u : a ? o : 0; r < u; r++)if (((n = i[r]).selected || r === o) && !n.disabled && (!n.parentNode.disabled || !A(n.parentNode, "optgroup"))) { if (t = S(n).val(), a) return t; s.push(t) } return s }, set: function (e, t) { var n, r, i = e.options, o = S.makeArray(t), a = i.length; while (a--) ((r = i[a]).selected = -1 < S.inArray(S.valHooks.option.get(r), o)) && (n = !0); return n || (e.selectedIndex = -1), o } } } }), S.each(["radio", "checkbox"], function () { S.valHooks[this] = { set: function (e, t) { if (Array.isArray(t)) return e.checked = -1 < S.inArray(S(e).val(), t) } }, v.checkOn || (S.valHooks[this].get = function (e) { return null === e.getAttribute("value") ? "on" : e.value }) }), v.focusin = "onfocusin" in C; var bt = /^(?:focusinfocus|focusoutblur)$/, wt = function (e) { e.stopPropagation() }; S.extend(S.event, { trigger: function (e, t, n, r) { var i, o, a, s, u, l, c, f, p = [n || E], d = y.call(e, "type") ? e.type : e, h = y.call(e, "namespace") ? e.namespace.split(".") : []; if (o = f = a = n = n || E, 3 !== n.nodeType && 8 !== n.nodeType && !bt.test(d + S.event.triggered) && (-1 < d.indexOf(".") && (d = (h = d.split(".")).shift(), h.sort()), u = d.indexOf(":") < 0 && "on" + d, (e = e[S.expando] ? e : new S.Event(d, "object" == typeof e && e)).isTrigger = r ? 2 : 3, e.namespace = h.join("."), e.rnamespace = e.namespace ? new RegExp("(^|\\.)" + h.join("\\.(?:.*\\.|)") + "(\\.|$)") : null, e.result = void 0, e.target || (e.target = n), t = null == t ? [e] : S.makeArray(t, [e]), c = S.event.special[d] || {}, r || !c.trigger || !1 !== c.trigger.apply(n, t))) { if (!r && !c.noBubble && !x(n)) { for (s = c.delegateType || d, bt.test(s + d) || (o = o.parentNode); o; o = o.parentNode)p.push(o), a = o; a === (n.ownerDocument || E) && p.push(a.defaultView || a.parentWindow || C) } i = 0; while ((o = p[i++]) && !e.isPropagationStopped()) f = o, e.type = 1 < i ? s : c.bindType || d, (l = (Y.get(o, "events") || Object.create(null))[e.type] && Y.get(o, "handle")) && l.apply(o, t), (l = u && o[u]) && l.apply && V(o) && (e.result = l.apply(o, t), !1 === e.result && e.preventDefault()); return e.type = d, r || e.isDefaultPrevented() || c._default && !1 !== c._default.apply(p.pop(), t) || !V(n) || u && m(n[d]) && !x(n) && ((a = n[u]) && (n[u] = null), S.event.triggered = d, e.isPropagationStopped() && f.addEventListener(d, wt), n[d](), e.isPropagationStopped() && f.removeEventListener(d, wt), S.event.triggered = void 0, a && (n[u] = a)), e.result } }, simulate: function (e, t, n) { var r = S.extend(new S.Event, n, { type: e, isSimulated: !0 }); S.event.trigger(r, null, t) } }), S.fn.extend({ trigger: function (e, t) { return this.each(function () { S.event.trigger(e, t, this) }) }, triggerHandler: function (e, t) { var n = this[0]; if (n) return S.event.trigger(e, t, n, !0) } }), v.focusin || S.each({ focus: "focusin", blur: "focusout" }, function (n, r) { var i = function (e) { S.event.simulate(r, e.target, S.event.fix(e)) }; S.event.special[r] = { setup: function () { var e = this.ownerDocument || this.document || this, t = Y.access(e, r); t || e.addEventListener(n, i, !0), Y.access(e, r, (t || 0) + 1) }, teardown: function () { var e = this.ownerDocument || this.document || this, t = Y.access(e, r) - 1; t ? Y.access(e, r, t) : (e.removeEventListener(n, i, !0), Y.remove(e, r)) } } }); var Tt = C.location, Ct = { guid: Date.now() }, Et = /\?/; S.parseXML = function (e) { var t, n; if (!e || "string" != typeof e) return null; try { t = (new C.DOMParser).parseFromString(e, "text/xml") } catch (e) { } return n = t && t.getElementsByTagName("parsererror")[0], t && !n || S.error("Invalid XML: " + (n ? S.map(n.childNodes, function (e) { return e.textContent }).join("\n") : e)), t }; var St = /\[\]$/, kt = /\r?\n/g, At = /^(?:submit|button|image|reset|file)$/i, Nt = /^(?:input|select|textarea|keygen)/i; function jt(n, e, r, i) { var t; if (Array.isArray(e)) S.each(e, function (e, t) { r || St.test(n) ? i(n, t) : jt(n + "[" + ("object" == typeof t && null != t ? e : "") + "]", t, r, i) }); else if (r || "object" !== w(e)) i(n, e); else for (t in e) jt(n + "[" + t + "]", e[t], r, i) } S.param = function (e, t) { var n, r = [], i = function (e, t) { var n = m(t) ? t() : t; r[r.length] = encodeURIComponent(e) + "=" + encodeURIComponent(null == n ? "" : n) }; if (null == e) return ""; if (Array.isArray(e) || e.jquery && !S.isPlainObject(e)) S.each(e, function () { i(this.name, this.value) }); else for (n in e) jt(n, e[n], t, i); return r.join("&") }, S.fn.extend({ serialize: function () { return S.param(this.serializeArray()) }, serializeArray: function () { return this.map(function () { var e = S.prop(this, "elements"); return e ? S.makeArray(e) : this }).filter(function () { var e = this.type; return this.name && !S(this).is(":disabled") && Nt.test(this.nodeName) && !At.test(e) && (this.checked || !pe.test(e)) }).map(function (e, t) { var n = S(this).val(); return null == n ? null : Array.isArray(n) ? S.map(n, function (e) { return { name: t.name, value: e.replace(kt, "\r\n") } }) : { name: t.name, value: n.replace(kt, "\r\n") } }).get() } }); var Dt = /%20/g, qt = /#.*$/, Lt = /([?&])_=[^&]*/, Ht = /^(.*?):[ \t]*([^\r\n]*)$/gm, Ot = /^(?:GET|HEAD)$/, Pt = /^\/\//, Rt = {}, Mt = {}, It = "*/".concat("*"), Wt = E.createElement("a"); function Ft(o) { return function (e, t) { "string" != typeof e && (t = e, e = "*"); var n, r = 0, i = e.toLowerCase().match(P) || []; if (m(t)) while (n = i[r++]) "+" === n[0] ? (n = n.slice(1) || "*", (o[n] = o[n] || []).unshift(t)) : (o[n] = o[n] || []).push(t) } } function $t(t, i, o, a) { var s = {}, u = t === Mt; function l(e) { var r; return s[e] = !0, S.each(t[e] || [], function (e, t) { var n = t(i, o, a); return "string" != typeof n || u || s[n] ? u ? !(r = n) : void 0 : (i.dataTypes.unshift(n), l(n), !1) }), r } return l(i.dataTypes[0]) || !s["*"] && l("*") } function Bt(e, t) { var n, r, i = S.ajaxSettings.flatOptions || {}; for (n in t) void 0 !== t[n] && ((i[n] ? e : r || (r = {}))[n] = t[n]); return r && S.extend(!0, e, r), e } Wt.href = Tt.href, S.extend({ active: 0, lastModified: {}, etag: {}, ajaxSettings: { url: Tt.href, type: "GET", isLocal: /^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(Tt.protocol), global: !0, processData: !0, async: !0, contentType: "application/x-www-form-urlencoded; charset=UTF-8", accepts: { "*": It, text: "text/plain", html: "text/html", xml: "application/xml, text/xml", json: "application/json, text/javascript" }, contents: { xml: /\bxml\b/, html: /\bhtml/, json: /\bjson\b/ }, responseFields: { xml: "responseXML", text: "responseText", json: "responseJSON" }, converters: { "* text": String, "text html": !0, "text json": JSON.parse, "text xml": S.parseXML }, flatOptions: { url: !0, context: !0 } }, ajaxSetup: function (e, t) { return t ? Bt(Bt(e, S.ajaxSettings), t) : Bt(S.ajaxSettings, e) }, ajaxPrefilter: Ft(Rt), ajaxTransport: Ft(Mt), ajax: function (e, t) { "object" == typeof e && (t = e, e = void 0), t = t || {}; var c, f, p, n, d, r, h, g, i, o, y = S.ajaxSetup({}, t), v = y.context || y, m = y.context && (v.nodeType || v.jquery) ? S(v) : S.event, x = S.Deferred(), b = S.Callbacks("once memory"), w = y.statusCode || {}, a = {}, s = {}, u = "canceled", T = { readyState: 0, getResponseHeader: function (e) { var t; if (h) { if (!n) { n = {}; while (t = Ht.exec(p)) n[t[1].toLowerCase() + " "] = (n[t[1].toLowerCase() + " "] || []).concat(t[2]) } t = n[e.toLowerCase() + " "] } return null == t ? null : t.join(", ") }, getAllResponseHeaders: function () { return h ? p : null }, setRequestHeader: function (e, t) { return null == h && (e = s[e.toLowerCase()] = s[e.toLowerCase()] || e, a[e] = t), this }, overrideMimeType: function (e) { return null == h && (y.mimeType = e), this }, statusCode: function (e) { var t; if (e) if (h) T.always(e[T.status]); else for (t in e) w[t] = [w[t], e[t]]; return this }, abort: function (e) { var t = e || u; return c && c.abort(t), l(0, t), this } }; if (x.promise(T), y.url = ((e || y.url || Tt.href) + "").replace(Pt, Tt.protocol + "//"), y.type = t.method || t.type || y.method || y.type, y.dataTypes = (y.dataType || "*").toLowerCase().match(P) || [""], null == y.crossDomain) { r = E.createElement("a"); try { r.href = y.url, r.href = r.href, y.crossDomain = Wt.protocol + "//" + Wt.host != r.protocol + "//" + r.host } catch (e) { y.crossDomain = !0 } } if (y.data && y.processData && "string" != typeof y.data && (y.data = S.param(y.data, y.traditional)), $t(Rt, y, t, T), h) return T; for (i in (g = S.event && y.global) && 0 == S.active++ && S.event.trigger("ajaxStart"), y.type = y.type.toUpperCase(), y.hasContent = !Ot.test(y.type), f = y.url.replace(qt, ""), y.hasContent ? y.data && y.processData && 0 === (y.contentType || "").indexOf("application/x-www-form-urlencoded") && (y.data = y.data.replace(Dt, "+")) : (o = y.url.slice(f.length), y.data && (y.processData || "string" == typeof y.data) && (f += (Et.test(f) ? "&" : "?") + y.data, delete y.data), !1 === y.cache && (f = f.replace(Lt, "$1"), o = (Et.test(f) ? "&" : "?") + "_=" + Ct.guid++ + o), y.url = f + o), y.ifModified && (S.lastModified[f] && T.setRequestHeader("If-Modified-Since", S.lastModified[f]), S.etag[f] && T.setRequestHeader("If-None-Match", S.etag[f])), (y.data && y.hasContent && !1 !== y.contentType || t.contentType) && T.setRequestHeader("Content-Type", y.contentType), T.setRequestHeader("Accept", y.dataTypes[0] && y.accepts[y.dataTypes[0]] ? y.accepts[y.dataTypes[0]] + ("*" !== y.dataTypes[0] ? ", " + It + "; q=0.01" : "") : y.accepts["*"]), y.headers) T.setRequestHeader(i, y.headers[i]); if (y.beforeSend && (!1 === y.beforeSend.call(v, T, y) || h)) return T.abort(); if (u = "abort", b.add(y.complete), T.done(y.success), T.fail(y.error), c = $t(Mt, y, t, T)) { if (T.readyState = 1, g && m.trigger("ajaxSend", [T, y]), h) return T; y.async && 0 < y.timeout && (d = C.setTimeout(function () { T.abort("timeout") }, y.timeout)); try { h = !1, c.send(a, l) } catch (e) { if (h) throw e; l(-1, e) } } else l(-1, "No Transport"); function l(e, t, n, r) { var i, o, a, s, u, l = t; h || (h = !0, d && C.clearTimeout(d), c = void 0, p = r || "", T.readyState = 0 < e ? 4 : 0, i = 200 <= e && e < 300 || 304 === e, n && (s = function (e, t, n) { var r, i, o, a, s = e.contents, u = e.dataTypes; while ("*" === u[0]) u.shift(), void 0 === r && (r = e.mimeType || t.getResponseHeader("Content-Type")); if (r) for (i in s) if (s[i] && s[i].test(r)) { u.unshift(i); break } if (u[0] in n) o = u[0]; else { for (i in n) { if (!u[0] || e.converters[i + " " + u[0]]) { o = i; break } a || (a = i) } o = o || a } if (o) return o !== u[0] && u.unshift(o), n[o] }(y, T, n)), !i && -1 < S.inArray("script", y.dataTypes) && S.inArray("json", y.dataTypes) < 0 && (y.converters["text script"] = function () { }), s = function (e, t, n, r) { var i, o, a, s, u, l = {}, c = e.dataTypes.slice(); if (c[1]) for (a in e.converters) l[a.toLowerCase()] = e.converters[a]; o = c.shift(); while (o) if (e.responseFields[o] && (n[e.responseFields[o]] = t), !u && r && e.dataFilter && (t = e.dataFilter(t, e.dataType)), u = o, o = c.shift()) if ("*" === o) o = u; else if ("*" !== u && u !== o) { if (!(a = l[u + " " + o] || l["* " + o])) for (i in l) if ((s = i.split(" "))[1] === o && (a = l[u + " " + s[0]] || l["* " + s[0]])) { !0 === a ? a = l[i] : !0 !== l[i] && (o = s[0], c.unshift(s[1])); break } if (!0 !== a) if (a && e["throws"]) t = a(t); else try { t = a(t) } catch (e) { return { state: "parsererror", error: a ? e : "No conversion from " + u + " to " + o } } } return { state: "success", data: t } }(y, s, T, i), i ? (y.ifModified && ((u = T.getResponseHeader("Last-Modified")) && (S.lastModified[f] = u), (u = T.getResponseHeader("etag")) && (S.etag[f] = u)), 204 === e || "HEAD" === y.type ? l = "nocontent" : 304 === e ? l = "notmodified" : (l = s.state, o = s.data, i = !(a = s.error))) : (a = l, !e && l || (l = "error", e < 0 && (e = 0))), T.status = e, T.statusText = (t || l) + "", i ? x.resolveWith(v, [o, l, T]) : x.rejectWith(v, [T, l, a]), T.statusCode(w), w = void 0, g && m.trigger(i ? "ajaxSuccess" : "ajaxError", [T, y, i ? o : a]), b.fireWith(v, [T, l]), g && (m.trigger("ajaxComplete", [T, y]), --S.active || S.event.trigger("ajaxStop"))) } return T }, getJSON: function (e, t, n) { return S.get(e, t, n, "json") }, getScript: function (e, t) { return S.get(e, void 0, t, "script") } }), S.each(["get", "post"], function (e, i) { S[i] = function (e, t, n, r) { return m(t) && (r = r || n, n = t, t = void 0), S.ajax(S.extend({ url: e, type: i, dataType: r, data: t, success: n }, S.isPlainObject(e) && e)) } }), S.ajaxPrefilter(function (e) { var t; for (t in e.headers) "content-type" === t.toLowerCase() && (e.contentType = e.headers[t] || "") }), S._evalUrl = function (e, t, n) { return S.ajax({ url: e, type: "GET", dataType: "script", cache: !0, async: !1, global: !1, converters: { "text script": function () { } }, dataFilter: function (e) { S.globalEval(e, t, n) } }) }, S.fn.extend({ wrapAll: function (e) { var t; return this[0] && (m(e) && (e = e.call(this[0])), t = S(e, this[0].ownerDocument).eq(0).clone(!0), this[0].parentNode && t.insertBefore(this[0]), t.map(function () { var e = this; while (e.firstElementChild) e = e.firstElementChild; return e }).append(this)), this }, wrapInner: function (n) { return m(n) ? this.each(function (e) { S(this).wrapInner(n.call(this, e)) }) : this.each(function () { var e = S(this), t = e.contents(); t.length ? t.wrapAll(n) : e.append(n) }) }, wrap: function (t) { var n = m(t); return this.each(function (e) { S(this).wrapAll(n ? t.call(this, e) : t) }) }, unwrap: function (e) { return this.parent(e).not("body").each(function () { S(this).replaceWith(this.childNodes) }), this } }), S.expr.pseudos.hidden = function (e) { return !S.expr.pseudos.visible(e) }, S.expr.pseudos.visible = function (e) { return !!(e.offsetWidth || e.offsetHeight || e.getClientRects().length) }, S.ajaxSettings.xhr = function () { try { return new C.XMLHttpRequest } catch (e) { } }; var _t = { 0: 200, 1223: 204 }, zt = S.ajaxSettings.xhr(); v.cors = !!zt && "withCredentials" in zt, v.ajax = zt = !!zt, S.ajaxTransport(function (i) { var o, a; if (v.cors || zt && !i.crossDomain) return { send: function (e, t) { var n, r = i.xhr(); if (r.open(i.type, i.url, i.async, i.username, i.password), i.xhrFields) for (n in i.xhrFields) r[n] = i.xhrFields[n]; for (n in i.mimeType && r.overrideMimeType && r.overrideMimeType(i.mimeType), i.crossDomain || e["X-Requested-With"] || (e["X-Requested-With"] = "XMLHttpRequest"), e) r.setRequestHeader(n, e[n]); o = function (e) { return function () { o && (o = a = r.onload = r.onerror = r.onabort = r.ontimeout = r.onreadystatechange = null, "abort" === e ? r.abort() : "error" === e ? "number" != typeof r.status ? t(0, "error") : t(r.status, r.statusText) : t(_t[r.status] || r.status, r.statusText, "text" !== (r.responseType || "text") || "string" != typeof r.responseText ? { binary: r.response } : { text: r.responseText }, r.getAllResponseHeaders())) } }, r.onload = o(), a = r.onerror = r.ontimeout = o("error"), void 0 !== r.onabort ? r.onabort = a : r.onreadystatechange = function () { 4 === r.readyState && C.setTimeout(function () { o && a() }) }, o = o("abort"); try { r.send(i.hasContent && i.data || null) } catch (e) { if (o) throw e } }, abort: function () { o && o() } } }), S.ajaxPrefilter(function (e) { e.crossDomain && (e.contents.script = !1) }), S.ajaxSetup({ accepts: { script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript" }, contents: { script: /\b(?:java|ecma)script\b/ }, converters: { "text script": function (e) { return S.globalEval(e), e } } }), S.ajaxPrefilter("script", function (e) { void 0 === e.cache && (e.cache = !1), e.crossDomain && (e.type = "GET") }), S.ajaxTransport("script", function (n) { var r, i; if (n.crossDomain || n.scriptAttrs) return { send: function (e, t) { r = S(" + + + + + + + \ No newline at end of file diff --git a/server-data/resources/[bpt_addons]/bpt_banking/locales/en.lua b/server-data/resources/[bpt_addons]/bpt_banking/locales/en.lua new file mode 100644 index 000000000..2a9d97e6f --- /dev/null +++ b/server-data/resources/[bpt_addons]/bpt_banking/locales/en.lua @@ -0,0 +1,16 @@ +Locales['en'] = { + ['invalid_amount'] = 'That\'s an invalid amount of money', + ['deposit_money'] = 'you have deposited $%s', + ['withdraw_money'] = 'you have withdrawn $%s', + ['pincode_money'] = 'you have new pincode %s', + ['transfer_money'] = 'you success transfer money $%s ID: %s', + ['receive_transfer'] = 'you receive transfer money $%s ID: %s', + ['press_e_banking'] = 'press [E] to access the bank', + ['access_bank'] = 'Access the bank', + ['banking_blip'] = 'Bank', + ['cant_do_it'] = "Can't do it!", + ['not_enough_money'] = "Not enough money! You need %s money!", + ['pincode_not_found'] = "Invalid PIN code", + ['pincode_found'] = "Valid PIN code...", + ['bank_name'] = "Fleeca Bank" +} diff --git a/server-data/resources/[bpt_addons]/bpt_banking/locales/it.lua b/server-data/resources/[bpt_addons]/bpt_banking/locales/it.lua new file mode 100644 index 000000000..8f4662ee7 --- /dev/null +++ b/server-data/resources/[bpt_addons]/bpt_banking/locales/it.lua @@ -0,0 +1,16 @@ +Locales['it'] = { + ['invalid_amount'] = 'questa è una somma di denaro non valida', + ['deposit_money'] = 'hai depositato $%s', + ['withdraw_money'] = 'hai prelevato $%s', + ['pincode_money'] = 'hai un nuovo codice pin %s', + ['transfer_money'] = 'hai trasferito con successo il denaro a $%s ID: %s', + ['receive_transfer'] = 'hai ricevuto un trasferimento di denaro da $%s ID: %s', + ['press_e_banking'] = 'premi [E] per accedere alla banca', + ['access_bank'] = 'accedi alla banca', + ['banking_blip'] = 'Banca', + ['cant_do_it'] = "non puoi farlo!", + ['not_enough_money'] = "non hai abbastanza soldi! hai bisogno di %s soldi!", + ['pincode_not_found'] = "codice PIN errato", + ['pincode_found'] = "codice PIN valido...", + ['bank_name'] = "Banca Fleeca", +} diff --git a/server-data/resources/[esx_addons]/esx_banking/README.md b/server-data/resources/[esx_addons]/esx_banking/README.md deleted file mode 100644 index 7eef2b254..000000000 --- a/server-data/resources/[esx_addons]/esx_banking/README.md +++ /dev/null @@ -1,66 +0,0 @@ -

[ESX] Banking

Discord - Website - Documentation - -A beautiful and Easy-To-Use Banking & ATM system for ESX - - -## BANK UI -![esx_banking_pic1](https://user-images.githubusercontent.com/22717950/189738189-375101ac-c86b-4ce8-8df3-19d740c3809c.png) -## ATM UI -![esx_banking_pic2](https://user-images.githubusercontent.com/22717950/189738199-a325092b-5f1d-4c7f-8950-d660d053ed0f.png) -![esx_banking_pic3](https://user-images.githubusercontent.com/22717950/189738210-7af2c7d5-7fa1-4f70-8460-743ee9258f88.png) - - -## Special thanks: Gellipapa#9186,Rav3n95#2849,Csoki, csontvazharcos, Füsti, Pécé - -## Download & Installation - -- Download https://github.com/esx-framework/esx-legacy/tree/main/%5Besx_addons%5D/esx_banking -- Put it in the `[esx-addons]` directory - -## Installation -- Add this to your `server.cfg`: - -``` -ensure esx_banking -``` - -# Database -``` -Run the banking.sql into your database. Done. -``` - -# If you want to create a bank log in another script, you can do it this way! -# IMPORTANT this is only log, these method not handle full bank service -# I recommend to use the money logic after. -``` -client side - -TriggerServerEvent("esx_banking:logTransaction",label,logType,amount) - -The list of client-side parameters is the same as the server-side parameters, only the first parameter is different because the client-side has no source. - -For example: TriggerServerEvent("esx_banking:logTransaction","TAX", "DEPOSIT", 2000) - -server side - -exports["esx_banking"]:logTransaction(source,label,logType,amount) - -- First param: source - player source -- Second param: label - Only text for example: CAR PURCHASE -- Third param: logType - WITHDRAW,DEPOSIT,TRANSFER_RECEIVE you can only use these log types! -- Fourth param: amount - The amount to be logged - -For example: exports["esx_banking"]:logTransaction(source,"CAR PURCHASE","WITHDRAW",200) -``` - -# Legal -### License -esx_banking - banking script for ESX - -Copyright (C) 2023 ESX-Framework - -This program Is free software: you can redistribute it And/Or modify it under the terms Of the GNU General Public License As published by the Free Software Foundation, either version 3 Of the License, Or (at your option) any later version. - -This program Is distributed In the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty Of MERCHANTABILITY Or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License For more details. - -You should have received a copy Of the GNU General Public License along with this program. If Not, see http://www.gnu.org/licenses/. diff --git a/server-data/resources/[esx_addons]/esx_banking/client/main.lua b/server-data/resources/[esx_addons]/esx_banking/client/main.lua deleted file mode 100644 index 931cbb6b2..000000000 --- a/server-data/resources/[esx_addons]/esx_banking/client/main.lua +++ /dev/null @@ -1,307 +0,0 @@ -local BANK = { - Data = {}, -} - -local activeBlips, bankPoints, atmPoints, markerPoints = {}, {}, {}, {} -local playerLoaded, uiActive, inMenu = false, false, false - ---Functions --- General data collecting thread -function BANK:Thread() - self:CreateBlips() - local data = self.Data - data.ped = PlayerPedId() - data.coord = GetEntityCoords(data.Ped) - playerLoaded = true - - CreateThread(function() - while playerLoaded do - data.coord = GetEntityCoords(data.ped) - data.ped = PlayerPedId() - bankPoints, atmPoints, markerPoints = {}, {}, {} - - if (IsPedOnFoot(data.ped) and not ESX.PlayerData.dead) and not inMenu then - for i = 1, #Config.AtmModels do - local atm = GetClosestObjectOfType( - data.coord.x, - data.coord.y, - data.coord.z, - 0.7, - Config.AtmModels[i], - false, - false, - false - ) - if atm ~= 0 then - atmPoints[#atmPoints + 1] = GetEntityCoords(atm) - end - end - - for i = 1, #Config.Banks do - local bankDistance = #(data.coord - Config.Banks[i].Position.xyz) - if bankDistance <= 0.7 then - bankPoints[#bankPoints + 1] = Config.Banks[i].Position.xyz - end - if Config.ShowMarker and bankDistance <= (Config.DrawMarker or 10) then - markerPoints[#markerPoints + 1] = Config.Banks[i].Position.xyz - end - end - end - - if next(bankPoints) and not uiActive then - self:TextUi(true) - end - - if next(atmPoints) and not uiActive then - self:TextUi(true, true) - end - - if not next(bankPoints) and not next(atmPoints) and uiActive then - self:TextUi(false) - end - - Wait(1000) - end - end) - - if not Config.ShowMarker then - return - end - - CreateThread(function() - local wait = 1000 - while playerLoaded do - if next(markerPoints) then - for i = 1, #markerPoints do - DrawMarker( - 20, - markerPoints[i].x, - markerPoints[i].y, - markerPoints[i].z, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.3, - 0.2, - 0.2, - 187, - 255, - 0, - 255, - false, - true, - 2, - false, - nil, - nil, - false - ) - end - wait = 0 - end - Wait(wait) - end - end) -end - --- Handle text ui / Keypress -function BANK:TextUi(state, atm) - uiActive = state - if not state then - return ESX.HideUI() - end - ESX.TextUI(_U("press_e_banking")) - CreateThread(function() - while uiActive do - if IsControlJustReleased(0, 38) then - self:HandleUi(true, atm) - self:TextUi(false) - end - Wait(0) - end - end) -end - --- Create Blips -function BANK:CreateBlips() - local tmpActiveBlips = {} - for i = 1, #Config.Banks do - if type(Config.Banks[i].Blip) == "table" and Config.Banks[i].Blip.Enabled then - local position = Config.Banks[i].Position - local bInfo = Config.Banks[i].Blip - local blip = AddBlipForCoord(position.x, position.y, position.z) - SetBlipSprite(blip, bInfo.Sprite) - SetBlipScale(blip, bInfo.Scale) - SetBlipColour(blip, bInfo.Color) - SetBlipAsShortRange(blip, true) - BeginTextCommandSetBlipName("STRING") - AddTextComponentSubstringPlayerName(bInfo.Label) - EndTextCommandSetBlipName(blip) - tmpActiveBlips[#tmpActiveBlips + 1] = blip - end - end - - activeBlips = tmpActiveBlips -end - --- Remove blips -function BANK:RemoveBlips() - for i = 1, #activeBlips do - if DoesBlipExist(activeBlips[i]) then - RemoveBlip(activeBlips[i]) - end - end - activeBlips = {} -end - --- Open / Close ui -function BANK:HandleUi(state, atm) - atm = atm or false - SetNuiFocus(state, state) - inMenu = state - ClearPedTasks(PlayerPedId()) - if not state then - SendNUIMessage({ - showMenu = false, - }) - return - end - ESX.TriggerServerCallback("esx_banking:getPlayerData", function(data) - SendNUIMessage({ - showMenu = true, - openATM = atm, - datas = { - your_money_panel = { - accountsData = { - { - name = "cash", - amount = data.money, - }, - { - name = "bank", - amount = data.bankMoney, - }, - }, - }, - bankCardData = { - bankName = _U("bank_name"), - cardNumber = "2232 2222 2222 2222", - createdDate = "08/08", - name = data.playerName, - }, - transactionsData = data.transactionHistory, - }, - }) - end) -end - -function BANK:LoadNpc(index, netID) - CreateThread(function() - while not NetworkDoesEntityExistWithNetworkId(netID) do - Wait(200) - end - local npc = NetworkGetEntityFromNetworkId(netID) - TaskStartScenarioInPlace(npc, Config.Peds[index].Scenario, 0, true) - SetEntityProofs(npc, true, true, true, true, true, true, true, true) - SetBlockingOfNonTemporaryEvents(npc, true) - FreezeEntityPosition(npc, true) - SetPedCanRagdollFromPlayerImpact(npc, false) - SetPedCanRagdoll(npc, false) - SetEntityAsMissionEntity(npc, true, true) - SetEntityDynamic(npc, false) - end) -end - --- Events -RegisterNetEvent("esx_banking:closebanking", function() - BANK:HandleUi(false) -end) - -RegisterNetEvent("esx_banking:pedHandler", function(netIdTable) - for i = 1, #netIdTable do - BANK:LoadNpc(i, netIdTable[i]) - end -end) - -RegisterNetEvent("esx_banking:updateMoneyInUI", function(doingType, bankMoney, money) - SendNUIMessage({ - updateData = true, - data = { - type = doingType, - bankMoney = bankMoney, - money = money, - }, - }) -end) - --- Handlers --- Resource starting -AddEventHandler("onResourceStart", function(resource) - if resource ~= GetCurrentResourceName() then - return - end - BANK:Thread() -end) - --- Enable the script on player loaded -RegisterNetEvent("esx:playerLoaded", function() - BANK:Thread() -end) - --- Disable the script on player logout -RegisterNetEvent("esx:onPlayerLogout", function() - playerLoaded = false -end) - --- Resource stopping -AddEventHandler("onResourceStop", function(resource) - if resource ~= GetCurrentResourceName() then - return - end - BANK:RemoveBlips() - if uiActive then - BANK:TextUi(false) - end -end) - -RegisterNetEvent("esx:onPlayerDeath", function() - BANK:TextUi(false) -end) - --- Nui Callbacks -RegisterNUICallback("close", function(_, cb) - BANK:HandleUi(false) - cb("ok") -end) - -RegisterNUICallback("clickButton", function(data, cb) - if not data or not inMenu then - return cb("ok") - end - - TriggerServerEvent("esx_banking:doingType", data) - cb("ok") -end) - -RegisterNUICallback("checkPincode", function(data, cb) - if not data or not inMenu then - return cb("ok") - end - - ESX.TriggerServerCallback("esx_banking:checkPincode", function(pincode) - if pincode then - cb({ - success = true, - }) - ESX.ShowNotification(_U("pincode_found"), "success") - else - cb({ - error = true, - }) - ESX.ShowNotification(_U("pincode_not_found"), "error") - end - end, data) -end) diff --git a/server-data/resources/[esx_addons]/esx_banking/config.lua b/server-data/resources/[esx_addons]/esx_banking/config.lua deleted file mode 100644 index 37b55518f..000000000 --- a/server-data/resources/[esx_addons]/esx_banking/config.lua +++ /dev/null @@ -1,131 +0,0 @@ -Config = { - Debug = false, - DrawMarker = 10, - Locale = "en", - EnablePeds = true, - AtmModels = { `prop_fleeca_atm`, `prop_atm_01`, `prop_atm_02`, `prop_atm_03` }, - Banks = { - { - Position = vector4(149.91, -1040.74, 29.374, 160), - Blip = { - Enabled = true, - Color = 69, - Label = "Bank", - Sprite = 108, - Scale = 0.7, - }, - }, - { - Position = vector4(-1212.63, -330.78, 37.59, 210), - Blip = { - Enabled = true, - Color = 69, - Label = "Bank", - Sprite = 108, - Scale = 0.7, - }, - }, - { - Position = vector4(-2962.47, 482.93, 15.5, 270), - Blip = { - Enabled = true, - Color = 69, - Label = "Bank", - Sprite = 108, - Scale = 0.7, - }, - }, - { - Position = vector4(-113.01, 6470.24, 31.43, 315), - Blip = { - Enabled = true, - Color = 69, - Label = "Bank", - Sprite = 108, - Scale = 0.7, - }, - }, - { - Position = vector4(314.16, -279.09, 53.97, 160), - Blip = { - Enabled = true, - Color = 69, - Label = "Bank", - Sprite = 108, - Scale = 0.7, - }, - }, - { - Position = vector4(-350.99, -49.99, 48.84, 160), - Blip = { - Enabled = true, - Color = 69, - Label = "Bank", - Sprite = 108, - Scale = 0.7, - }, - }, - { - Position = vector4(1175.02, 2706.87, 37.89, 0), - Blip = { - Enabled = true, - Color = 69, - Label = "Bank", - Sprite = 108, - Scale = 0.7, - }, - }, - { - Position = vector4(246.63, 223.62, 106.0, 160), - Blip = { - Enabled = true, - Color = 69, - Label = "Bank", - Sprite = 108, - Scale = 0.7, - }, - }, - }, - Peds = { - { - Position = vector4(149.5513, -1042.1570, 29.3680, 341.6520), - Model = `U_M_M_BankMan`, - Scenario = "WORLD_HUMAN_CLIPBOARD", - }, - { - Position = vector4(-1211.8585, -331.9854, 37.7809, 28.5983), - Model = `U_M_M_BankMan`, - Scenario = "WORLD_HUMAN_CLIPBOARD", - }, - { - Position = vector4(-2961.0720, 483.1107, 15.6970, 88.1986), - Model = `U_M_M_BankMan`, - Scenario = "WORLD_HUMAN_CLIPBOARD", - }, - { - Position = vector4(-112.2223, 6471.1128, 31.6267, 132.7517), - Model = `U_M_M_BankMan`, - Scenario = "WORLD_HUMAN_CLIPBOARD", - }, - { - Position = vector4(313.8176, -280.5338, 54.1647, 339.1609), - Model = `U_M_M_BankMan`, - Scenario = "WORLD_HUMAN_CLIPBOARD", - }, - { - Position = vector4(-351.3247, -51.3466, 49.0365, 339.3305), - Model = `U_M_M_BankMan`, - Scenario = "WORLD_HUMAN_CLIPBOARD", - }, - { - Position = vector4(1174.9718, 2708.2034, 38.0879, 178.2974), - Model = `U_M_M_BankMan`, - Scenario = "WORLD_HUMAN_CLIPBOARD", - }, - { - Position = vector4(247.0348, 225.1851, 106.2875, 158.7528), - Model = `U_M_M_BankMan`, - Scenario = "WORLD_HUMAN_CLIPBOARD", - }, - }, -} diff --git a/server-data/resources/[esx_addons]/esx_banking/fxmanifest.lua b/server-data/resources/[esx_addons]/esx_banking/fxmanifest.lua deleted file mode 100644 index 9986e724e..000000000 --- a/server-data/resources/[esx_addons]/esx_banking/fxmanifest.lua +++ /dev/null @@ -1,31 +0,0 @@ -fx_version("cerulean") - -game("gta5") - -description("ESX banking") -lua54("yes") -version("1.0.0") - -shared_scripts({ - "@es_extended/imports.lua", - "@es_extended/locale.lua", - "locales/*.lua", - "config.lua", -}) - -server_scripts({ - "@oxmysql/lib/MySQL.lua", - "server/main.lua", -}) - -client_scripts({ - "client/main.lua", -}) - -ui_page("html/ui.html") - -files({ - "html/**", -}) - -dependency("es_extended") diff --git a/server-data/resources/[esx_addons]/esx_banking/html/config.json b/server-data/resources/[esx_addons]/esx_banking/html/config.json deleted file mode 100644 index daae81cca..000000000 --- a/server-data/resources/[esx_addons]/esx_banking/html/config.json +++ /dev/null @@ -1,787 +0,0 @@ -{ - "lang": "EN", - "__comment": "On DYNAMIC_FORM_DATA do not change 'componentName', 'elementID'!", - "EN": { - "DYNAMIC_FORM_DATA": [ - { - "componentName": "moreGraph", - "elementID": "#wrapper", - "title": "", - "closeButtonText": "Close", - "bankTitle": "Fleeca Bank", - "mainExitButtonText": "Log out" - }, - { - "elementID": "#cpincode", - "name": "cpincode", - "buttonText": "Approve", - "inputPlaceholder": "Enter 4 digit...", - "title": "PIN CODE SETUP", - "description": "Here you can set or change the PIN code.", - "type": "password" - }, - { - "elementID": "#withdraw", - "name": "withdraw", - "buttonText": "Approve", - "inputPlaceholder": "Amount", - "title": "WITHDRAW", - "description": "Here you can withdraw your money from the bank.", - "type": "number" - }, - { - "elementID": "#deposit", - "name": "deposit", - "buttonText": "Approval", - "inputPlaceholder": "Amount", - "title": "DEPOSIT", - "description": "Here, you can deposit your money to the bank.", - "type": "number" - }, - { - "elementID": "#transfer", - "name": "transfer", - "buttonText": "Transfer", - "inputPlaceholder": "Amount", - "inputPlaceholder2": "Player ID", - "title": "TRANSFER", - "description": "Here you can transfer your money to someone else." - }, - { - "componentName": "trans", - "elementID": "#third-column", - "title": "TRANSACTION HISTORY", - "description": "Here you can see your transaction history.", - "moreHistoryText": "Show more history", - "moreGraphText": "Show more graph" - }, - { - "componentName": "pincodePanel", - "elementID": "#wrapper", - "title": "Enter PIN", - "deleteButtonText": "", - "loginButtonText": "", - "closeButtonText": "Close" - }, - { - "componentName": "atmComponent", - "elementID": "#wrapper", - "title": "Fleeca Bank", - "closeButtonText": "Log out" - } - ], - "LAUNGAGE": { - "your_money_title": "Balance", - "your_money_desc": "Here you can see your current balance and cash.", - "your_money_cash_label": "Your cash", - "your_money_bank_label": "Your bank balance", - "withdraw": "WITHDRAW", - "deposit": "DEPOSIT", - "transfer": "TRANSFER", - "transferReceive": "RECEIVED TRANSFER", - "moneyFormat": "$__replaceData__", - "graphTitle": "Your balance", - "moreGraphTitle": "Big Graph", - "moreHistoryTitle": "Show more history", - "inputErrorTitle": "Data is incorrect", - "inputErrorMessage": "It cannot be empty or a value less than 1!", - "showPincodeErrorTitle": "PIN incorrect", - "showPincodeErrorMessage": "The pin must have at least 4 characters!", - "tableLang": { - "typeLabel": "Transaction type", - "transactionLabel": "Transaction Label", - "balanceLabel": "Balance", - "amountLabel": "Amount", - "timeLabel": "Time", - "searchInputPlaceholder": "Search ...", - "_comment": "tableFullLanguage options: English, Hungarian, Italian, Spanish, French, you can find here all lang: https://cdn.datatables.net/plug-ins/9dcbecd42ad/i18n/", - "tableFullLanguage": "English" - } - } - }, - "HU": { - "DYNAMIC_FORM_DATA": [ - { - "componentName": "moreGraph", - "elementID": "#wrapper", - "title": "", - "closeButtonText": "Bezárás", - "bankTitle": "OTP BANK FELÜLET", - "mainExitButtonText": "Kijelentkezés" - }, - { - "elementID": "#cpincode", - "name": "cpincode", - "buttonText": "Jóváhagyás", - "inputPlaceholder": "Írj be 4 számot...", - "title": "PIN KÓD BEÁLLÍTÁS", - "description": "Itt tudod beállítani vagy cserélni pinkódodat.", - "type": "password" - }, - { - "elementID": "#withdraw", - "name": "withdraw", - "buttonText": "Jóváhagyás", - "inputPlaceholder": "Összeg", - "title": "PÉNZ KIVÉTEL", - "description": "Itt tudsz pénzt kivenni a számládról.", - "type": "number" - }, - { - "elementID": "#deposit", - "name": "deposit", - "buttonText": "Jóváhagyás", - "inputPlaceholder": "Összeg", - "title": "PÉNZ BETÉTEL", - "description": "Itt tudsz pénzt be tenni a számládra.", - "type": "number" - }, - { - "elementID": "#transfer", - "name": "transfer", - "buttonText": "Utalás", - "inputPlaceholder": "Összeg", - "inputPlaceholder2": "Játékos azonosító", - "title": "UTALÁS", - "description": "Itt tudsz pénzt utalni egy adott játékosnak." - }, - { - "componentName": "trans", - "elementID": "#third-column", - "title": "SZÁMLA TÖRTÉNET", - "description": "Itt látod a számla történeted.", - "moreHistoryText": "Több számla történet mutatása", - "moreGraphText": "Nagyított diagram mutatása" - }, - { - "componentName": "pincodePanel", - "elementID": "#wrapper", - "title": "Írd be a PIN kódod", - "deleteButtonText": "", - "loginButtonText": "", - "closeButtonText": "Bezárás" - }, - { - "componentName": "atmComponent", - "elementID": "#wrapper", - "title": "OTP BANK", - "closeButtonText": "Kijelentkezés" - } - ], - "LAUNGAGE": { - "your_money_title": "Egyenleged", - "your_money_desc": "Itt láthatod a jelenlegi egyenleged és készpénzed.", - "your_money_cash_label": "Készpénz", - "your_money_bank_label": "Banki egyenleged", - "withdraw": "KIVÉTEL", - "deposit": "BETÉTEL", - "transfer": "UTALÁS", - "transferReceive": "KAPOTT UTALÁS", - "moneyFormat": "__replaceData__ Ft", - "graphTitle": "Egyenleged", - "moreGraphTitle": "Nagyított grafikon", - "moreHistoryTitle": "Teljes számla történet", - "inputErrorTitle": "Adat hibás", - "inputErrorMessage": "Nem lehet üres vagy érték kisebb mint 1!", - "showPincodeErrorTitle": "PIN hibás", - "showPincodeErrorMessage": "Legalább 4 karakternek kell lennie a pinnek!", - "tableLang": { - "typeLabel": "Tranzakció típus", - "transactionLabel": "Tranzakció leírása", - "balanceLabel": "Egyenleged", - "amountLabel": "Összeg", - "timeLabel": "Idő", - "searchInputPlaceholder": "Kereső ...", - "_comment": "tableFullLanguage options: English, Hungarian, Italian, Spanish, French, you can find here all lang: https://cdn.datatables.net/plug-ins/9dcbecd42ad/i18n/", - "tableFullLanguage": "Hungarian" - } - } - }, - "IT": { - "DYNAMIC_FORM_DATA": [ - { - "componentName": "moreGraph", - "elementID": "#wrapper", - "title": "", - "closeButtonText": "Close", - "bankTitle": "Fleeca Bank", - "mainExitButtonText": "Disconnettersi" - }, - { - "elementID": "#cpincode", - "name": "cpincode", - "buttonText": "conferma", - "inputPlaceholder": "4 cifre...", - "title": "IMPOSTAZIONE CODICE PIN", - "description": "Qui puoi impostare o modificare il codice PIN.", - "type": "password" - }, - { - "elementID": "#withdraw", - "name": "withdraw", - "buttonText": "conferma", - "inputPlaceholder": "Quantità", - "title": "RITIRARE", - "description": "Qui puoi prelevare i tuoi soldi dalla banca.", - "type": "number" - }, - { - "elementID": "#deposit", - "name": "deposit", - "buttonText": "conferma", - "inputPlaceholder": "Quantità", - "title": "DEPOSITARE", - "description": "Qui puoi depositare i tuoi soldi in banca.", - "type": "number" - }, - { - "elementID": "#transfer", - "name": "transfer", - "buttonText": "trasferisci", - "inputPlaceholder": "Quantità", - "inputPlaceholder2": "Giocatore ID", - "title": "TRASFERIMENTO", - "description": "Qui puoi trasferire i tuoi soldi a qualcun altro." - }, - { - "componentName": "trans", - "elementID": "#third-column", - "title": "CRONOLOGIA DELLE TRANSAZIONI", - "description": "Qui puoi vedere la cronologia delle tue operazioni.", - "moreHistoryText": "Mostra più cronologia", - "moreGraphText": "Mostra tutto il grafico" - }, - { - "componentName": "pincodePanel", - "elementID": "#wrapper", - "title": "Enter PIN", - "deleteButtonText": "", - "loginButtonText": "", - "closeButtonText": "Close" - }, - { - "componentName": "atmComponent", - "elementID": "#wrapper", - "title": "Fleeca Bank", - "closeButtonText": "Disconnettersi" - } - ], - "LAUNGAGE": { - "your_money_title": "saldo", - "your_money_desc": "qui puoi vedere il saldo attuale e contanti.", - "your_money_cash_label": "i tuoi soldi", - "your_money_bank_label": "il tuo saldo bancario", - "withdraw": "RITIRARE", - "deposit": "DEPOSITARE", - "transfer": "TRASFERIMENTO", - "transferReceive": "TRASFERIMENTO RICEVUTO", - "moneyFormat": "$__replaceData__", - "graphTitle": "Il tuo bilancio", - "moreGraphTitle": "grafico", - "moreHistoryTitle": "Mostra la cronologia", - "inputErrorTitle": "I dati non sono corretti", - "inputErrorMessage": "Non può essere vuoto o un valore inferiore a 1!", - "showPincodeErrorTitle": "PIN errato", - "showPincodeErrorMessage": "Il pin deve contenere almeno 4 caratteri!", - "tableLang": { - "typeLabel": "Tipo di transazione", - "transactionLabel": "Transaction Label", - "balanceLabel": "bilancio", - "amountLabel": "quantità", - "timeLabel": "tempo", - "searchInputPlaceholder": "Cerca ...", - "_comment": "tabella Opzioni complete della lingua: inglese, ungherese, italiana, spagnolo, francese, puoi trovare qui tutte le lingue: https://cdn.datatables.net/plug-ins/9dcbecd42ad/i18n/", - "tableFullLanguage": "Italian" - } - } - }, - "ES": { - "DYNAMIC_FORM_DATA": [ - { - "componentName": "moreGraph", - "elementID": "#wrapper", - "title": "", - "closeButtonText": "Cerrar", - "bankTitle": "Banco Fleeca", - "mainExitButtonText": "Cerrar sesión" - }, - { - "elementID": "#cpincode", - "name": "cpincode", - "buttonText": "Aprobar", - "inputPlaceholder": "Introduzca 4 dígitos...", - "title": "CONFIGURACIÓN DEL PIN", - "description": "Aquí puede establecer o cambiar el código PIN.", - "type": "password" - }, - { - "elementID": "#withdraw", - "name": "withdraw", - "buttonText": "Aprobar", - "inputPlaceholder": "Importe", - "title": "RETIRAR", - "description": "Aquí puede retirar su dinero del banco.", - "type": "number" - }, - { - "elementID": "#deposit", - "name": "deposit", - "buttonText": "Aprobación", - "inputPlaceholder": "Importe", - "title": "DEPOSITO", - "description": "Aquí puede ingresar su dinero en el banco.", - "type": "number" - }, - { - "elementID": "#transfer", - "name": "transfer", - "buttonText": "Transfererir", - "inputPlaceholder": "Importe", - "inputPlaceholder2": "ID del jugador", - "title": "TRANSFERENCIA", - "description": "Aquí puedes transferir tu dinero a otra persona." - }, - { - "componentName": "trans", - "elementID": "#third-column", - "title": "HISTORIAL DE TRANSACCIONES", - "description": "Aquí puede ver su historial de transacciones.", - "moreHistoryText": "Mostrar más historial", - "moreGraphText": "Mostrar el gráfico" - }, - { - "componentName": "pincodePanel", - "elementID": "#wrapper", - "title": "Introducir PIN", - "deleteButtonText": "", - "loginButtonText": "", - "closeButtonText": "Close" - }, - { - "componentName": "atmComponent", - "elementID": "#wrapper", - "title": "Banco Fleeca", - "closeButtonText": "Cerrar sesión" - } - ], - "LAUNGAGE": { - "your_money_title": "Saldo", - "your_money_desc": "Aquí puedes ver tu saldo actual y tu efectivo.", - "your_money_cash_label": "Su dinero en mano", - "your_money_bank_label": "Su saldo bancario", - "withdraw": "RETIRAR", - "deposit": "DEPÓSITO", - "transfer": "TRANSFERENCIA", - "transferReceive": "TRANSFERENCIA RECIBIDA", - "moneyFormat": "$__replaceData__", - "graphTitle": "Su saldo", - "moreGraphTitle": "Gráfico grande", - "moreHistoryTitle": "Mostrar más historial", - "inputErrorTitle": "Data is incorrect", - "inputErrorMessage": "No puede estar vacío ni tener un valor inferior a 1.", - "showPincodeErrorTitle": "PIN incorrecto", - "showPincodeErrorMessage": "El pin debe tener al menos 4 caracteres.", - "tableLang": { - "typeLabel": "Tipo de transacción", - "transactionLabel": "Transaction Label", - "balanceLabel": "Saldo", - "amountLabel": "Importe", - "timeLabel": "Tiempo", - "searchInputPlaceholder": "Buscar...", - "_comment": "tableFullLanguage options: English, Hungarian, Italiano, Spanish, French, you can find here all lang: https://cdn.datatables.net/plug-ins/9dcbecd42ad/i18n/", - "tableFullLanguage": "Spanish" - } - } - }, - "FR": { - "DYNAMIC_FORM_DATA": [ - { - "componentName": "moreGraph", - "elementID": "#wrapper", - "title": "", - "closeButtonText": "Fermer", - "bankTitle": "Banque Fleeca", - "mainExitButtonText": "Déconnexion" - }, - { - "elementID": "#cpincode", - "name": "cpincode", - "buttonText": "Valider", - "inputPlaceholder": "Entrez 4 chiffres...", - "title": "CONFIGURATION DU PIN", - "description": "Ici vous pouvez définir ou changer votre code PIN.", - "type": "password" - }, - { - "elementID": "#withdraw", - "name": "withdraw", - "buttonText": "Valider", - "inputPlaceholder": "Montant", - "title": "RETIRER", - "description": "Ici vous pouvez retirer votre argent de la banque.", - "type": "number" - }, - { - "elementID": "#deposit", - "name": "deposit", - "buttonText": "Valider", - "inputPlaceholder": "Montant", - "title": "DÉPOSER", - "description": "Ici, vous pouvez déposer votre argent à la banque.", - "type": "number" - }, - { - "elementID": "#transfer", - "name": "transfer", - "buttonText": "Transférer", - "inputPlaceholder": "Montant", - "inputPlaceholder2": "ID du joueur", - "title": "TRANSFERT", - "description": "Ici, vous pouvez transférer votre argent à quelqu'un d'autre." - }, - { - "componentName": "trans", - "elementID": "#third-column", - "title": "HISTORIQUE DES TRANSACTIONS", - "description": "Ici, vous pouvez voir votre historique de transactions.", - "moreHistoryText": "Afficher plus d'historique", - "moreGraphText": "Afficher plus de graphique" - }, - { - "componentName": "pincodePanel", - "elementID": "#wrapper", - "title": "Entrer le code PIN", - "deleteButtonText": "", - "loginButtonText": "", - "closeButtonText": "Fermer" - }, - { - "componentName": "atmComponent", - "elementID": "#wrapper", - "title": "Banque Fleeca", - "closeButtonText": "Se déconnecter" - } - ], - "LAUNGAGE": { - "your_money_title": "Solde", - "your_money_desc": "Ici, vous pouvez voir votre solde actuel et votre argent en espèces.", - "your_money_cash_label": "Votre argent en espèces", - "your_money_bank_label": "Votre solde bancaire", - "withdraw": "RETIRER", - "deposit": "DÉPOSER", - "transfer": "TRANSFERT", - "transferReceive": "TRANSFERT REÇU", - "moneyFormat": "$__replaceData__", - "graphTitle": "Votre solde", - "moreGraphTitle": "Grand graphique", - "moreHistoryTitle": "Afficher plus", - "inputErrorTitle": "Les données sont incorrectes", - "inputErrorMessage": "Il ne peut pas être vide ou avoir une valeur inférieure à 1", - "showPincodeErrorTitle": "Code PIN incorrect", - "showPincodeErrorMessage": "Le code PIN doit avoir au moins 4 caractères!", - "tableLang": { - "typeLabel": "Type de transaction", - "transactionLabel": "Transaction Label", - "balanceLabel": "Solde", - "amountLabel": "Montant", - "timeLabel": "Temps", - "searchInputPlaceholder": "Rechercher ...", - "_comment": "Langue complète: Anglais, Hongrois, Italien, Espagnole Français, vous pouvez trouver ici toutes les langues: https://cdn.datatables.net/plug-ins/9dcbecd42ad/i18n/", - "tableFullLanguage": "French" - } - } - }, - "NL": { - "DYNAMIC_FORM_DATA": [ - { - "componentName": "moreGraph", - "elementID": "#wrapper", - "title": "", - "closeButtonText": "Sluit", - "bankTitle": "Fleeca Bank", - "mainExitButtonText": "Log uit" - }, - { - "elementID": "#cpincode", - "name": "cpincode", - "buttonText": "Goedkeuren", - "inputPlaceholder": "Voer 4 cijfers in...", - "title": "PINCODE INSTELLEN", - "description": "Hier kun je je pincode instellen of wijzigen.", - "type": "password" - }, - { - "elementID": "#withdraw", - "name": "withdraw", - "buttonText": "Opnemen", - "inputPlaceholder": "Bedrag", - "title": "OPNEMEN", - "description": "Hier kun je geld opnemen van je bank account.", - "type": "number" - }, - { - "elementID": "#deposit", - "name": "deposit", - "buttonText": "Storten", - "inputPlaceholder": "Bedrag", - "title": "STORTEN", - "description": "Hier kun je geld storten op je bank account.", - "type": "number" - }, - { - "elementID": "#transfer", - "name": "transfer", - "buttonText": "Overschrijven", - "inputPlaceholder": "Bedrag", - "inputPlaceholder2": "Speler ID", - "title": "OVERSCHRIJVEN", - "description": "Hier kun je geld overschrijven naar iemand anders zijn bank account." - }, - { - "componentName": "trans", - "elementID": "#third-column", - "title": "TRANSACTIE GESCHIEDENIS", - "description": "Hier kun je alle transacties zien die op je bank account zijn vericht.", - "moreHistoryText": "Laat meer geschiedenis zien", - "moreGraphText": "Laat meer van de grafiek zien" - }, - { - "componentName": "pincodePanel", - "elementID": "#wrapper", - "title": "Voer pincode in", - "deleteButtonText": "", - "loginButtonText": "", - "closeButtonText": "Sluit" - }, - { - "componentName": "atmComponent", - "elementID": "#wrapper", - "title": "Fleeca Bank", - "closeButtonText": "Log uit" - } - ], - "LAUNGAGE": { - "your_money_title": "Saldo", - "your_money_desc": "Hier kun je je saldo en je cash zien.", - "your_money_cash_label": "Jouw cash", - "your_money_bank_label": "Jouw bank saldo", - "withdraw": "OPNEMEN", - "deposit": "STORTEN", - "transfer": "OVERSCHRIJVEN", - "transferReceive": "ONTVANGEN ONVERSCHRIJVING", - "moneyFormat": "€__replaceData__", - "graphTitle": "Jouw saldo", - "moreGraphTitle": "Grote grafiek", - "moreHistoryTitle": "Laat meer geschiedenis zien", - "inputErrorTitle": "Data is niet correct", - "inputErrorMessage": "Deze input kan niet leeg zijn of een waarde minder dan 1 !", - "showPincodeErrorTitle": "PIN onjuist", - "showPincodeErrorMessage": "Je pincode moet tenminste 4 karakters hebben!", - "tableLang": { - "typeLabel": "Transactie type", - "transactionLabel": "Transaction Label", - "balanceLabel": "Saldo", - "amountLabel": "Bedrag", - "timeLabel": "Tijd", - "searchInputPlaceholder": "Zoeken ...", - "_comment": "tableFullLanguage options: English, Hungarian, Italian, Spanish, French, you can find here all lang: https://cdn.datatables.net/plug-ins/9dcbecd42ad/i18n/", - "tableFullLanguage": "Nederlands" - } - } - }, - "zh-CN": { - "DYNAMIC_FORM_DATA": [ - { - "componentName": "moreGraph", - "elementID": "#wrapper", - "title": "", - "closeButtonText": "关闭 ❌", - "bankTitle": "花园银行", - "mainExitButtonText": "注销" - }, - { - "elementID": "#cpincode", - "name": "cpincode", - "buttonText": "验证密码", - "inputPlaceholder": "请输入4位数字的密码...", - "title": "修改PIN密码", - "description": "在这里您可以编辑/更改您的密码.", - "type": "password" - }, - { - "elementID": "#withdraw", - "name": "withdraw", - "buttonText": "确认", - "inputPlaceholder": "金额数量", - "title": "提现", - "description": "在这里您可以从银行取款.", - "type": "number" - }, - { - "elementID": "#deposit", - "name": "deposit", - "buttonText": "确认", - "inputPlaceholder": "金额数量", - "title": "存款", - "description": "在这里您可以将钱存入银行.", - "type": "number" - }, - { - "elementID": "#transfer", - "name": "transfer", - "buttonText": "转账", - "inputPlaceholder": "金额数量", - "inputPlaceholder2": "玩家服务器ID", - "title": "转账", - "description": "在这里您可以将钱转账给他人." - }, - { - "componentName": "trans", - "elementID": "#third-column", - "title": "交易记录", - "description": "在这里您可以查看您的交易记录.", - "moreHistoryText": "显示更多记录", - "moreGraphText": "显示更多图表" - }, - { - "componentName": "pincodePanel", - "elementID": "#wrapper", - "title": "输入 PIN 密码", - "deleteButtonText": "", - "loginButtonText": "", - "closeButtonText": "关闭 ❌" - }, - { - "componentName": "atmComponent", - "elementID": "#wrapper", - "title": "花园银行-ATM", - "closeButtonText": "注销" - } - ], - "LAUNGAGE": { - "your_money_title": "我的信息", - "your_money_desc": "在这里您可以看到您当前的余额和现金.", - "your_money_cash_label": "您的现金", - "your_money_bank_label": "您的银行余额", - "withdraw": "提现", - "deposit": "存款", - "transfer": "转账", - "transferReceive": "已收到转账", - "moneyFormat": "$__replaceData__", - "graphTitle": "您的余额", - "moreGraphTitle": "详情页", - "moreHistoryTitle": "详情页", - "inputErrorTitle": "数据不正确", - "inputErrorMessage": "无法为空空或值小于 1", - "showPincodeErrorTitle": "输入的 PIN 密码不正确", - "showPincodeErrorMessage": "PIN 码必须至少有 4 个字符!", - "tableLang": { - "typeLabel": "交易类型", - "transactionLabel": "Transaction Label", - "balanceLabel": "我的信息", - "amountLabel": "数量", - "timeLabel": "时间", - "searchInputPlaceholder": "研究 ...", - "_comment": "Langue complète: Anglais, Hongrois, Italien, Espagnole Français, vous pouvez trouver ici toutes les langues: https://cdn.datatables.net/plug-ins/9dcbecd42ad/i18n/", - "tableFullLanguage": "Chinese" - } - } - }, - "SR": { - "DYNAMIC_FORM_DATA": [ - { - "componentName": "moreGraph", - "elementID": "#wrapper", - "title": "", - "closeButtonText": "Zatvori", - "bankTitle": "Fleeca Banka", - "mainExitButtonText": "Log out" - }, - { - "elementID": "#cpincode", - "name": "cpincode", - "buttonText": "Potvrdi", - "inputPlaceholder": "Unesi 4 cifre...", - "title": "PIN KOD", - "description": "Ovde možete postaviti ili izmeniti PIN kod.", - "type": "password" - }, - { - "elementID": "#withdraw", - "name": "withdraw", - "buttonText": "Potvrdi", - "inputPlaceholder": "Iznos", - "title": "PODIGNI", - "description": "Ovde možete podići novac sa vašeg računa.", - "type": "number" - }, - { - "elementID": "#deposit", - "name": "deposit", - "buttonText": "Potvrdi", - "inputPlaceholder": "Iznos", - "title": "UPLATA", - "description": "Ovde možete uplatiti novac na vaš račun", - "type": "number" - }, - { - "elementID": "#transfer", - "name": "transfer", - "buttonText": "Transfer", - "inputPlaceholder": "Iznos", - "inputPlaceholder2": "ID Osobe", - "title": "TRANSFER", - "description": "Ovde možete poslati novac nekome." - }, - { - "componentName": "trans", - "elementID": "#third-column", - "title": "ISTORIJA TRANSAKCIJA", - "description": "Ovde možete videti istoriju transakcija.", - "moreHistoryText": "Prikaži više", - "moreGraphText": "Prikaži više grafikona" - }, - { - "componentName": "pincodePanel", - "elementID": "#wrapper", - "title": "Unesite PIN", - "deleteButtonText": "", - "loginButtonText": "", - "closeButtonText": "Zatvori" - }, - { - "componentName": "atmComponent", - "elementID": "#wrapper", - "title": "Fleeca Banka", - "closeButtonText": "Log out" - } - ], - "LAUNGAGE": { - "your_money_title": "Balans", - "your_money_desc": "Ovde možete videti iznos novca na vašem računu i kod vas", - "your_money_cash_label": "Vaš novac", - "your_money_bank_label": "Vaš novac na računu", - "withdraw": "PODIGNI", - "deposit": "UPLATI", - "transfer": "TRANSFER", - "transferReceive": "PRIMLJEN TRANSFER", - "moneyFormat": "$__replaceData__", - "graphTitle": "Vaš balansa", - "moreGraphTitle": "Veliki Grafikon", - "moreHistoryTitle": "Prikaži više", - "inputErrorTitle": "Podaci su nevažeći", - "inputErrorMessage": "Ne može biti prazno ili iznos manji od 1!", - "showPincodeErrorTitle": "PIN netačan", - "showPincodeErrorMessage": "PIN mora imati 4 karaktera!", - "tableLang": { - "typeLabel": "Tip transakcije", - "balanceLabel": "Balans", - "amountLabel": "Iznos", - "timeLabel": "Vreme", - "searchInputPlaceholder": "Pretraži ...", - "_comment": "tableFullLanguage options: English, Hungarian, Italian, Spanish, French, Serbian, you can find here all lang: https://cdn.datatables.net/plug-ins/9dcbecd42ad/i18n/", - "tableFullLanguage": "Serbian" - } - } - } -} \ No newline at end of file diff --git a/server-data/resources/[esx_addons]/esx_banking/html/css/app.css b/server-data/resources/[esx_addons]/esx_banking/html/css/app.css deleted file mode 100644 index a544ba6e9..000000000 --- a/server-data/resources/[esx_addons]/esx_banking/html/css/app.css +++ /dev/null @@ -1,791 +0,0 @@ -:root { - --primary-color: #2e69d5; - --secondary-color: #378cbf; - --text-color: #ffff; - --background-light: #232934; - --background-light-2: #202020; - --background-dark: #0a0e19; - --accent-red: #378cbf; - --accent-green: #45b157; - --accent-gray: #474e57; - --accent-gray-2: #545457; - - --columnsBackground: var(--background-dark); - --allTitleColor: var(--text-color); - --yourMoneyPriceTextColor: var(--accent-green); - --bankCardBackgroundColor: linear-gradient(110deg, - var(--primary-color) 0%, - var(--secondary-color) 100%); - --buttonBackgroundColor: var(--background-light); - --inputBackgroundColor: var(--background-light); - --inputTextColor: var(--text-color); - --inputPlaceholderColor: var(--accent-gray-2); - --checkmarkColor: var(--text-color); - --acceptExitButtonColorText: var(--text-color); - --exitButtonHoverBackgroundColor: var(--primary-color); - --acceptButtonHoverBackgroundColor: var(--secondary-color); - --bankCardTextColor: var(--text-color); - --bankCardNumberColor: var(--text-color); - --moneyContainerBackgroundColor: var(--background-light); - --moneyAndTransactionContainer: var(--background-light); - --transactionContainerBackgroundColor: var(--background-light); - --moneyAndTransactionallTitleColorText: var(--text-color); - --transactionDataTextColor: var(--text-color); - --cardSubtitleTextColor: var(--accent-gray); - --depositColorText: var(--accent-green); - --withDrawColorText: var(--primary-color); - --moreHistoryButtonHoverColor: var(--secondary-color); - --moreGraphButtonHoverColor: var(--secondary-color); - --hrRowColor: var(--accent-gray); - --loadingCircle: var(--secondary-color); - --tableAllTextColor: var(--text-color); - --tableBackgroundColorPaginationButton: var(--secondary-color); - --tableBackgroundColorPaginationButtonHover: var(--secondary-color); - --tableRowHoverBackgroundColor: var(--secondary-color); - --tableScrollBarBackgroundColor: var(--background-light); - --tableScrollBarBackgroundColorHover: var(--secondary-color); - --tableSelectBoxBackgroundColor: var(--background-light); - --tableSearchInputBackgroundColor: var(--background-light); - --tableScrollBarBackgroundColor2: var(--background-light); - --disableButtonBackgroundColor: var(--background-light-2); - --graphLineColor: var(--secondary-color); - --graphLineBackgroundColor: var(--secondary-color); -} - -@import url("https://fonts.googleapis.com/css2?family=Raleway:wght@100;400;500;800&display=swap"); - -* { - margin: 0; - padding: 0; -} - -#wrapper { - width: 100%; - height: 93.24vmin; - display: flex; - justify-content: center; - align-items: center; - font-family: "Raleway", sans-serif; - user-select: none; - min-width: 42vmin; - font-size: 2vmin; - display: none; -} - -#container { - height: 73vmin; - width: 139.41vmin; - cursor: default; - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - max-width: 150vmin; - flex-wrap: wrap; - margin: 2vmin; - position: relative; - display: none; -} - -#menu { - display: flex; - flex-direction: row; - gap: 3vmin; - flex-wrap: wrap; - height: 68.15vmin; -} - -/* FIRST COLUMN START */ - -#menu #first-column { - width: 36vmin; - background: var(--columnsBackground); - padding: 1.85vmin; - display: flex; - flex-direction: column; - gap: 1.79vmin; - border-radius: 1.38vmin; - flex: 1 1 27.7vmin; - height: 72.56vmin; -} - -#menu #first-column hr { - border: 1px solid var(--hrRowColor); - width: 80%; - margin: 0 auto; -} - -#bankcard { - height: 16.6vmin; - width: 25vmin; - margin: 0 auto; - background: var(--bankCardBackgroundColor); - border-radius: 1.38vmin; - padding: 1.85vmin 1.6vmin 0px 1.85vmin; - position: relative; -} - -#bankcard .content p { - margin: 0; - color: var(--bankCardTextColor); - font-size: 0.92vmin; -} - -#bankcard .title { - display: flex; - justify-content: space-between; -} - -#bankcard .title span { - color: var(--bankCardTextColor); -} - -#bankcard .title svg { - width: 4.16vmin; - height: 4.16vmin; -} - -#bankcard .content { - position: absolute; - bottom: 1.66vmin; -} - -#bankcard .content .card-data { - display: flex; - justify-content: space-between; -} - -#bankcard .content .cardnumber { - color: var(--bankCardNumberColor); - font-size: 1.85vmin; - letter-spacing: 0.37vmin; - margin-bottom: 0.46vmin; -} - -#bankcard .content .card-data:nth-child(2) { - margin-right: 0.27vmin; -} - -#bankcard .content .card-data p { - font-size: 1.48vmin; -} - -#your-money-panel #money-containers { - display: flex; - flex-direction: column; - gap: 0.92vmin; -} - -.exit-button, -.accept-button, -#pincode-container .button-groups button { - background-color: var(--buttonBackgroundColor); - padding: 1.85vmin 1.85vmin; - /*width: 35vmin;*/ - width: 100%; - outline: none; - border: none; - color: var(--acceptExitButtonColorText); - display: flex; - align-items: center; - justify-content: center; - transition: all 0.3s ease; - font-weight: bold; - border-radius: 0.27vmin; - font-family: "Raleway", sans-serif; - font-size: 1.5vmin; -} - -.exit-button:hover, -#modal-container #title-container button:hover { - background-color: var(--exitButtonHoverBackgroundColor); - box-shadow: -1vmin 1vmin 1vmin -1vmin var(--exitButtonHoverBackgroundColor); -} - -.accept-button:hover { - background-color: var(--acceptButtonHoverBackgroundColor); - box-shadow: -1vmin 1vmin 1vmin -1vmin var(--acceptButtonHoverBackgroundColor); -} - -/* FIRST COLUMN END */ - -/* SECOND COLUMN START*/ - -#menu #second-column { - width: 35.18vmin; - border-radius: 1.38vmin; - display: flex; - align-items: center; - flex-direction: column; - gap: 0.92vmin; - flex: 1 1 27.77vmin; - padding-right: 1.85vmin; - padding-left: 1.85vmin; -} - -#withdraw, -#deposit, -#transfer { - background: var(--columnsBackground); - padding: 1.85vmin; - border-radius: 1.38vmin; - width: 35.18vmin; -} - -#menu #second-column #withdraw { - height: 18.48vmin; -} - -#menu #second-column #deposit { - height: 18.48vmin; -} - -#menu #second-column #transfer { - height: 26.63vmin; -} - -/* SECOND COLUMN END*/ - -/* THIRD COLUMN START*/ - -#menu #third-column { - width: 32.77vmin; - background: var(--columnsBackground); - border-radius: 1.38vmin; - padding: 1.85vmin; - flex: 1 1 37.03vmin; -} - -#menu #third-column #graph-container { - width: calc(100% - 0.46vmin); - height: 38vmin; -} - -#menu #third-column #buttons-container { - display: flex; - justify-content: center; - align-items: center; - margin: 0px 1.9vmin; - margin-top: 1.48vmin; - gap: 0.92vmin; -} - -#menu #third-column #buttons-container button { - padding: 0.92vmin; - width: 20.92vmin; -} - -#menu #third-column #buttons-container #more_history:hover { - background-color: var(--moreHistoryButtonHoverColor); - box-shadow: 0px 3.42vmin 9.25vmin -1.2vmin var(--moreHistoryButtonHoverColor); -} - -#menu #third-column #buttons-container #more_graph:hover { - background-color: var(--moreGraphButtonHoverColor); - box-shadow: 0px 3.42vmin 9.25vmin -1.2vmin var(--moreGraphButtonHoverColor); -} - -#menu #third-column #transactions-container { - display: flex; - flex-direction: column; - align-items: center; - gap: 0.92vmin; - padding: 1.85vmin; -} - -#menu #third-column #transactions-container .transaction-container { - /* width: 40.37vmin; */ - width: 100%; - background-color: var(--transactionContainerBackgroundColor); - padding: 0.92vmin 0.92vmin 0.92vmin 1.85vmin; - font-size: 1.8vmin; -} - -#menu #third-column #transactions-container .transaction-container .transaction { - display: flex; - justify-content: space-between; - align-items: center; - font-size: 1.5vmin; - margin-bottom: 0.8vmin; -} - -#menu #third-column #transactions-container .transaction-container .transaction span { - color: var(--transactionDataTextColor); - background: var(--columnsBackground); - border-radius: 0.27vmin; - padding: 0.46vmin; - font-size: 1.2vmin; -} - -/* THIRD COLUMN END*/ - -/* GENERAL START*/ - -.money-container, -.transaction-container { - background-color: var(--moneyAndTransactionContainer); - padding: 0.92vmin 0.92vmin 0.92vmin 1.85vmin; - border-radius: 0.27vmin; -} - -.money-container { - background-color: var(--moneyContainerBackgroundColor); -} - -.money-container h4 { - margin-bottom: 0.5vmin; -} - -.money-container h4, -.transaction h4 { - color: var(--moneyAndTransactionallTitleColorText); - text-shadow: 0.09vmin 0.09vmin 0.18vmin black; - font-size: 1.5vmin; - width: 25vmin; -} - -.money-container span, -.transaction-container span { - color: var(--yourMoneyPriceTextColor); - text-shadow: 0.09vmin 0.09vmin 0.18vmin black; - font-size: 1.5vmin; -} - -.accept-button svg { - height: 1.38vmin; - fill: var(--checkmarkColor); -} - -.green-text { - color: var(--depositColorText) !important; -} - -.red-text { - color: var(--withDrawColorText) !important; -} - -.disable-button { - background-color: var(--disableButtonBackgroundColor) !important; - pointer-events: none; -} - -h3 { - color: #ecedef; - color: var(--allTitleColor); - font-size: 2.31vmin; - text-shadow: 0.09vmin 0.09vmin 0.92vmin rgb(255 255 255 / 47%); - text-transform: uppercase; -} - -p { - color: var(--cardSubtitleTextColor); - margin-bottom: 0.92vmin; - font-size: 1.5vmin; -} - -input { - width: 100%; - font-family: "Raleway", sans-serif; - font-size: 1.38vmin; - background-color: var(--inputBackgroundColor); - padding: 1.85vmin 1.85vmin; - outline: none; - border: none; - color: var(--inputTextColor); - margin-bottom: 1.85vmin; - border-radius: 0.46vmin; -} - -input::placeholder { - color: var(--inputPlaceholderColor); - opacity: 1; -} - -input::-webkit-outer-spin-button, -input::-webkit-inner-spin-button { - -webkit-appearance: none; - margin: 0; -} - -/* GENERAL END*/ - -#modal-container { - background-color: var(--columnsBackground); - position: absolute; - top: 50%; - height: 100%; - width: 100%; - z-index: 2; - transform: translateY(-50%); - display: none; - border-radius: 1.38vmin; -} - -#more-modal-container { - height: 93%; - padding: 0 6vmin; -} - -#modal-container h3 { - text-align: center; - width: 100%; - margin-top: 1vmin; -} - -#modal-container #title-container button { - background-color: var(--buttonBackgroundColor); - padding: 1.85vmin 1.85vmin; - transition: all 0.3s ease; - font-weight: bold; - border-radius: 0.27vmin 0.27vmin 0.27vmin 1.27vmin; - font-family: "Raleway", sans-serif; - font-size: 1.5vmin; - border: none; - color: var(--inputTextColor); - margin-left: auto; - position: absolute; - right: 0vmin; - top: 0vmin; - width: 14vmin; -} - -/*DATA TABLES DESIGN */ - -.dataTables_wrapper .dataTables_info { - clear: both; - float: left; - padding-top: 0.755em; - color: var(--tableAllTextColor) !important; -} - -#example_wrapper { - margin-top: 4vmin; - color: var(--tableAllTextColor) !important; - padding: 1vmin; - font-family: "Raleway", sans-serif !important; -} - -#example_filter input { - display: flex; - gap: 1vmin; - border: none; - padding: 2vmin; - background-color: var(--tableSearchInputBackgroundColor); -} - -.dataTables_wrapper .dataTables_length, -.dataTables_wrapper .dataTables_filter, -.dataTables_wrapper .dataTables_info, -.dataTables_wrapper .dataTables_processing, -.dataTables_wrapper .dataTables_paginate { - color: var(--tableAllTextColor) !important; -} - -table.dataTable thead>tr>th.sorting, -table.dataTable thead>tr>th.sorting_asc, -table.dataTable thead>tr>th.sorting_desc, -table.dataTable thead>tr>th.sorting_asc_disabled, -table.dataTable thead>tr>th.sorting_desc_disabled, -table.dataTable thead>tr>td.sorting, -table.dataTable thead>tr>td.sorting_asc, -table.dataTable thead>tr>td.sorting_desc, -table.dataTable thead>tr>td.sorting_asc_disabled, -table.dataTable thead>tr>td.sorting_desc_disabled, -table.dataTable thead>tr>td.sorting_disabled { - cursor: pointer; - position: relative; - padding-right: 26px; - color: var(--tableAllTextColor) !important; -} - -table.dataTable tbody tr td { - color: var(--tableAllTextColor); - font-weight: 500; -} - -.greenTableText { - color: var(--depositColorText) !important; -} - -.redTableText { - color: var(--withDrawColorText) !important; -} - -table.dataTable.no-footer { - border-bottom: 1px solid rgba(0, 0, 0, 0.3); -} - -.dataTables_wrapper .dataTables_paginate .paginate_button.disabled, -.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover, -.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:active { - cursor: default; - color: var(--tableAllTextColor) !important; - border: 1px solid #828282; - background: transparent; - box-shadow: none; -} - -.dataTables_wrapper .dataTables_paginate .paginate_button { - background: none; - color: var(--tableAllTextColor) !important; - border-radius: 4px; - border: 1px solid #828282; -} - -.dataTables_wrapper .dataTables_paginate .paginate_button:hover { - color: white !important; - background: var(--tableBackgroundColorPaginationButtonHover) !important; - background: var(--tableBackgroundColorPaginationButtonHover) !important; - background: var(--tableBackgroundColorPaginationButtonHover) !important; - background: var(--tableBackgroundColorPaginationButtonHover) !important; - box-shadow: 0px 3.42vmin 9.25vmin -1.2vmin var(--tableBackgroundColorPaginationButtonHover) !important; -} - -.dataTables_wrapper .dataTables_paginate .paginate_button.current, -.dataTables_wrapper .dataTables_paginate .paginate_button.current:hover { - background: var(--tableBackgroundColorPaginationButton) !important; - background: var(--tableBackgroundColorPaginationButton) !important; - background: var(--tableBackgroundColorPaginationButton) !important; - background: var(--tableBackgroundColorPaginationButton) !important; - box-shadow: 0px 3.42vmin 9.25vmin -1.2vmin var(--tableBackgroundColorPaginationButton) !important; - color: var(--tableAllTextColor) !important; -} - -.dataTables_wrapper .dataTables_length select { - border-radius: 3px; - padding: 5px; - background-color: var(--tableSelectBoxBackgroundColor) !important; - padding: 4px; - color: var(--tableAllTextColor) !important; - padding: 1vmin; - border: none; - outline: none; -} - -table.dataTable tbody tr { - height: 50px !important; -} - -table.dataTable tbody tr:hover { - background-color: var(--tableRowHoverBackgroundColor) !important; -} - -#example_wrapper>div.dataTables_scroll>div.dataTables_scrollHead>div>table>thead>tr>th.sorting_disabled { - color: var(--tableAllTextColor) !important; -} - -/*DATA TABLE DESIGN END*/ - -/*SCROLLBAR DESIGN*/ -::-webkit-scrollbar { - width: 5px; -} - -::-webkit-scrollbar-track { - background: var(--tableScrollBarBackgroundColor2); -} - -::-webkit-scrollbar-thumb { - background: var(--tableScrollBarBackgroundColor); -} - -::-webkit-scrollbar-thumb:hover { - background: var(--tableScrollBarBackgroundColorHover); -} - -/* LOADING CIRCLE*/ - -:root { - --rotation-animation-speed: 2s; - --rotation-animation-easing: linear; - --stroke-animation-speed: 1.5s; - --stroke-animation-easing: ease-in-out; - --stroke-width: 3px; - --stroke-start-dasharray: 1, 200; - --stroke-end-dasharray: 89, 200; -} - -.loader { - margin: 0px auto; - width: 23.14vmin; - height: 23.14vmin; - position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - z-index: 2; - display: none; -} - -.circular-loader { - animation: rotate var(--rotation-animation-speed) var(--rotation-animation-easing) infinite; -} - -.loader-path { - fill: none; - stroke-width: var(--stroke-width); - animation: animate-stroke var(--stroke-animation-speed) var(--stroke-animation-easing) infinite; - stroke-linecap: round; -} - -@keyframes rotate { - 100% { - transform: rotate(360deg); - } -} - -@keyframes animate-stroke { - 0% { - stroke-dasharray: var(--stroke-start-dasharray); - stroke-dashoffset: 0; - stroke: var(--columnsBackground); - } - - 50% { - stroke-dasharray: var(--stroke-end-dasharray); - stroke-dashoffset: -35; - stroke: var(--loadingCircle); - } - - 100% { - stroke-dasharray: var(--stroke-end-dasharray); - stroke-dashoffset: -124; - stroke: var(--loadingCircle); - } -} - -#pincode-container { - background-color: var(--columnsBackground); - height: 80%; - width: 40vmin; - color: white; - display: flex; - border-radius: 3vmin; - flex-direction: column; - justify-content: center; - gap: 5vmin; -} - -#pincode-container h4 { - text-align: center; - margin-top: 2vmin; -} - -#pincode-container .pincode-input { - display: flex; - justify-content: center; - align-items: center; - height: 15vmin; - width: 100%; - gap: 10px; -} - -#pincode-container .pincode-input span { - display: block; - width: 3vmin; - height: 3vmin; - border-radius: 50%; - border: 2px solid var(--secondary-color); - transition: all 0.2s ease; -} - -#pincode-container .pincode-numbers { - display: grid; - grid-template-columns: 10vmin 10vmin 10vmin; - grid-template-rows: 10vmin 10vmin 10vmin; - place-items: center; - justify-content: center; -} - -#pincode-container .pincode-numbers div { - background-color: var(--background-light); - padding: 2vmin 2vmin; - border-radius: 50%; - width: 3vmin; - height: 3vmin; - display: flex; - justify-content: center; - align-items: center; - transition: all 0.3s ease; -} - -#pincode-container .pincode-numbers div:hover { - background-color: var(--secondary-color); - box-shadow: 0px 3.42vmin 9.25vmin -1.2vmin var(--secondary-color); -} - -#pincode-container .pincode-numbers div:nth-child(11):hover { - background-color: var(--exitButtonHoverBackgroundColor); - box-shadow: 0px 3.42vmin 9.25vmin -1.2vmin var(--exitButtonHoverBackgroundColor); -} - -#pincode-container .pincode-numbers div:nth-child(12):hover { - background-color: var(--acceptButtonHoverBackgroundColor); - box-shadow: 0px 3.42vmin 9.25vmin -1.2vmin var(--acceptButtonHoverBackgroundColor); -} - -#pincode-container .button-groups { - display: flex; - flex-direction: column; - align-items: center; - gap: 2vmin; - margin-top: 2vmin; -} - -#pincode-container .button-groups button { - width: 80%; -} - -#pincode-container .button-groups button:hover { - background-color: var(--exitButtonHoverBackgroundColor); - box-shadow: 0px 3.42vmin 9.25vmin -1.2vmin var(--exitButtonHoverBackgroundColor); -} - -#pincode-container .button-groups .login:hover { - background-color: var(--acceptButtonHoverBackgroundColor); - box-shadow: 0px 3.42vmin 9.25vmin -1.2vmin var(--acceptButtonHoverBackgroundColor); -} - -.circleBackground { - background-color: var(--secondary-color); -} - -/* ATM DESIGNS*/ - -#atm-container { - display: grid; - grid-template-columns: 60% 60%; - gap: 3vmin; - height: 58vh; -} - -.firstGridColumn, -.secondGridColumn { - display: flex; - flex-direction: column; - padding: 1.85vmin; -} - -.firstGridColumn { - gap: 1.79vmin; - border-radius: 1.38vmin; - background: var(--columnsBackground); -} - -.secondGridColumn { - gap: 3vmin; - justify-content: center; -} - -.secondGridColumn div { - background: var(--columnsBackground); - padding: 3vmin; - border-radius: 1.38vmin; -} - -/*MEDIA QUERY*/ -@media only screen and (max-width: 1280px) { - .dataTables_scrollBody { - max-height: 310px !important; - } -} \ No newline at end of file diff --git a/server-data/resources/[esx_addons]/esx_banking/html/scripts/app.js b/server-data/resources/[esx_addons]/esx_banking/html/scripts/app.js deleted file mode 100644 index 561c972aa..000000000 --- a/server-data/resources/[esx_addons]/esx_banking/html/scripts/app.js +++ /dev/null @@ -1,1022 +0,0 @@ -var LOADED = true; -class Components { - static allComponents = []; - static generateAllComponents(generatedData, generateType = "bank") { - $("#wrapper").empty(); - generatedData.forEach((form) => { - let objData = {}; - if (form.elementID.substring(1) == "transfer" && generateType == "bank") { - objData = new MultiComponentsForm(form); - } else if (form.componentName == "trans" && generateType == "bank") { - objData = this.generateTransactionContainer(form); - } else if ( - form.componentName == "pincodePanel" && - generateType == "atm" - ) { - objData = this.generatePincodeContainer(form); - } else if (form.componentName == "moreGraph" && generateType == "bank") { - objData = this.generateMainTemplate(form); - this.generateMenuTemplate(form); - } else if ( - form.componentName == "atmComponent" && - generateType == "atm" - ) { - objData = this.generateAtmTemplate(form); - } else { - if (generateType == "bank") { - if ( - form.componentName == "pincodePanel" || - form.componentName == "atmComponent" - ) { - return; - } - } else if (generateType == "atm") { - if ( - form.componentName == "trans" || - form.componentName == "moreGraph" - ) { - return; - } - } - objData = new SingleComponentsForm(form); - } - if (form.componentName != undefined) { - this.allComponents[form.componentName] = objData; - } else { - this.allComponents[form.elementID.substring(1)] = objData; - } - }); - } - - static getComponent(componentName) { - if (this.allComponents[componentName] != undefined) { - return this.allComponents[componentName]; - } - return false; - } - - static loader(appendedDiv, state) { - $(appendedDiv).empty(); - if (state == "show") { - $(appendedDiv).append(` - - - `); - $(appendedDiv).fadeIn(200); - LOADED = true; - - setTimeout(() => { - $(`${appendedDiv}`).fadeOut(200); - $("#wrapper").fadeIn().css("display", "flex"); - if (appendedDiv == ".loader") - $("#container").fadeIn().css("display", "flex"); - LOADED = false; - }, 2500); - } else if (state == "hide") { - $(`${appendedDiv}`).fadeOut(200); - if (appendedDiv == ".loader") { - $("#wrapper").fadeOut(200); - $("#container").fadeOut(200); - } - } - } - - static generateTransactionContainer(formData) { - $(formData.elementID).empty(); - return $(formData.elementID).html(`

${formData.title}

-

${formData.description}

-
- -
-
- - -
-
`); - } - - static generatePincodeContainer(formData) { - return $(formData.elementID).append(` -
-
-

${formData.title}

-
-
-
${formData.deleteButtonText}
-
${formData.loginButtonText}
-
-
- -
-
-
`); - } - - static generateMainTemplate(formData) { - return $(formData.elementID).append(` -
- -
`); - } - - static generateMenuTemplate(formData) { - $("#container").append(` - `); - } - - static generateAtmTemplate(formData) { - $(formData.elementID).append(` -
-
-

${formData.title}

-
-
-
- -
-
-
- `); - - return $(`${formData.elementID} #atm-container`); - } -} - -class SingleComponentsForm { - elementID = ""; - buttonText = ""; - inputPlaceholder = ""; - title = ""; - description = ""; - type = "number"; - template = ""; - name = ""; - - constructor(form) { - this.elementID = form.elementID; - this.buttonText = form.buttonText; - this.inputPlaceholder = form.inputPlaceholder; - this.title = form.title; - this.description = form.description; - this.type = form.type; - this.name = form.name; - this.renderInputAndButton(); - } - - setElementId(newElementID) { - this.elementID = newElementID; - } - - renderInputAndButton() { - this.template = `

${this.title}

${this.description}

`; - - if (this.type == "password") { - this.template += ``; - } else { - this.template += ``; - } - - this.template += ``; - - $(this.elementID).append(`
${this.template}
`); - } - - show() { - $(this.elementID).fadeIn(); - } - - hide() { - $(this.elementID).fadeOut(); - } -} - -class MultiComponentsForm { - elementID = ""; - buttonText = ""; - inputPlaceholder = ""; - inputPlaceholder2 = ""; - title = ""; - description = ""; - - constructor(form) { - this.elementID = form.elementID; - this.buttonText = form.buttonText; - this.inputPlaceholder = form.inputPlaceholder; - this.inputPlaceholder2 = form.inputPlaceholder2; - this.title = form.title; - this.description = form.description; - this.renderInputAndButtonGroups(); - } - - renderInputAndButtonGroups() { - $(this.elementID).html(`

${this.title}

-

${this.description}

-
- - - -
`); - } - - show() { - $(this.elementID).fadeIn(); - } - - hide() { - $(this.elementID).fadeOut(); - } -} - -class Render { - fullRenderData = {}; - elementID = ""; - language = ""; - constructor(elementID) { - this.elementID = elementID; - } - renderBankCard() { - const bankData = this.fullRenderData; - $("#bankcard").empty(); - let template = `
-

${bankData.bankName}

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-

Debit Card

-
-

${bankData.name}

-

${bankData.createdDate}

-
-

${bankData.cardNumber}

-
`; - $(template).appendTo("#bankcard"); - } - - renderMyMoneySection() { - const moneyData = this.fullRenderData; - $("#your-money-panel").empty(); - let template = `

${this.language.your_money_title}

-

${this.language.your_money_desc}

-
`; - moneyData.accountsData.forEach((data) => { - template += ` -
-

${this.language[`your_money_${data.name}_label`]}

- ${this.language.moneyFormat.replace( - "__replaceData__", - data.amount - )} -
- `; - }); - - template += "
"; - - $(template).appendTo("#your-money-panel"); - } - - renderTransactions() { - const transactionData = this.fullRenderData; - $("#transactions-container").empty(); - if (transactionData.length == 0) { - return; - } - - for (let i = 0; i < transactionData.slice(0, 3).length; i++) { - let oneRow = ` -
-
-

${transactionData[i].label || transactionData[i].type}

- ${Utils.dateFormat(transactionData[i].time)} -
- ${transactionData[i].type == this.language.withdraw || - transactionData[i].type == this.language.transfer - ? "-" - : "+" - }${this.language.moneyFormat.replace( - "__replaceData__", - transactionData[i].amount - )} -
- `; - - $(oneRow).appendTo("#transactions-container"); - } - } - - setData(newData, newLanguage) { - this.fullRenderData = newData; - this.language = newLanguage; - } - - refresh(newData) { - switch (this.elementID) { - case "your_money": - $("#money-cash").html( - `${this.language.moneyFormat.replace( - "__replaceData__", - newData.money - )} ` - ); - $("#money-bank").html( - `${this.language.moneyFormat.replace( - "__replaceData__", - newData.bankMoney - )}` - ); - break; - case "transaction": - this.fullRenderData = newData; - this.renderTransactions(); - break; - default: - break; - } - } -} - -class Pincode { - elementID = ""; - pincode = ""; - constructor(elementID) { - this.elementID = elementID; - this.renderPinInputs(); - this.renderPassCode(); - this.hide(false); - } - - setPincode(newPincode) { - this.pincode += newPincode; - } - - getPincode() { - return this.pincode; - } - - renderPassCode() { - $("#container").fadeOut(); - this.pincode = ""; - $(`${this.elementID} .pincode-input`).empty(); - for (let i = 0; i < 4; i++) { - $(`${this.elementID} .pincode-input`).append(``); - } - $(".pincode-numbers div:nth-child(12)").addClass("disable-button"); - $(".pincode-numbers div:nth-child(12)").prop("disabled", true); - } - - renderPinInputs() { - let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]; - numbers.forEach((number) => { - $(`
${number}
`).insertBefore(`.pincode-numbers .deleteButton`); - }); - } - - show() { - $(this.elementID).fadeIn(100); - } - - hide(anim = true) { - if (anim) { - $(this.elementID).fadeOut(200); - } else { - $(this.elementID).hide(); - } - } -} - -var timeZone = ""; -class Utils { - static dateFormat(date) { - if (typeof date == "number") { - var newDate = new Date(date); - } else { - var newDate = date; - } - return newDate - .toLocaleString([Utils.getTimeZone()], { - weekday: "long", - hour: "2-digit", - minute: "2-digit", - }) - .capitalize(); - } - - static setCardData(value) { - if (localStorage.getItem("CARD_DATA") == null) { - localStorage.setItem("CARD_DATA", JSON.stringify(value)); - } - } - - static getCardData() { - return JSON.parse(localStorage.getItem("CARD_DATA")); - } - - static genMonth() { - var date = new Date(); - var arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]; - var rNum = Math.floor(Math.random() * arr.length); - var year = date.getFullYear().toString(); - year = year.substr(2, year.length); - year = parseInt(parseInt(year) + 2); - return parseInt(rNum + 1) + "/" + year; - } - - static genCardNumber() { - let char = "0123456789"; - let genNum = ""; - for (let i = 0; i < 16; i++) { - var rnum = Math.floor(Math.random() * char.length); - genNum += char.substring(rnum, rnum + 1); - if ((i + 1) % 4 == 0) { - genNum += " "; - } - } - return genNum; - } - - static setTimeZone(newTimeZone) { - timeZone = newTimeZone; - } - - static getTimeZone() { - return timeZone; - } -} - -class Graph { - transData = {}; - graphData = { - type: "line", - data: { - labels: [], - datasets: [ - { - label: "BALANCE", - data: [], - backgroundColor: ["rgba(75, 192, 192, 0.2)"], - borderColor: ["rgba(75, 192, 192, 1)"], - borderWidth: 1, - }, - ], - }, - options: { - responsive: true, - maintainAspectRatio: false, - scales: { - y: { - beginAtZero: true, - }, - }, - }, - }; - - constructor(transData, title, color) { - this.graphData.data.datasets[0].label = title; - this.transData = transData; - this.calculateGraphData(); - } - - refreshGraphData(newTransData) { - this.transData = newTransData; - this.calculateGraphData(); - this.renderSmallGraph(); - } - - renderSmallGraph() { - const ctx = $("#smallGraph"); - let chartStatus = Chart.getChart("smallGraph"); - - if (chartStatus != undefined) { - chartStatus.destroy(); - } - - return new Chart(ctx, this.graphData); - } - - renderBigGraph() { - const ctx = $("#moreGraph"); - let chartStatus = Chart.getChart("moreGraph"); - - if (chartStatus != undefined) { - chartStatus.destroy(); - } - - return new Chart(ctx, this.graphData); - } - - calculateGraphData() { - this.graphData.data.labels = []; - this.graphData.data.datasets[0].data = []; - this.graphData.data.datasets[0].borderColor = [ - getComputedStyle(document.body).getPropertyValue("--graphLineColor"), - ]; - this.graphData.data.datasets[0].backgroundColor = [ - getComputedStyle(document.body).getPropertyValue( - "--graphLineBackgroundColor" - ), - ]; - for (let transaction of [...this.transData].slice(0, 50).reverse()) { - this.graphData.data.labels.push(Utils.dateFormat(transaction.time)); - this.graphData.data.datasets[0].data.push(transaction.balance); - } - } -} - -class GlobalStore { - storedData = {}; - - constructor(newStoredData) { - this.storedData = newStoredData; - } - - setStoredData(newStoredData) { - this.storedData = newStoredData; - } - - getStoredData() { - return this.storedData; - } -} - -Object.defineProperty(String.prototype, "capitalize", { - value: function () { - return this.charAt(0).toUpperCase() + this.slice(1); - }, - enumerable: false, -}); - -$(document).ready(function () { - var formData; - var language; - $.getJSON("config.json", function (data) { - let lang = "EN"; - if (data[data.lang] != null) { - lang = data.lang; - } - Utils.setTimeZone(lang == "HU" ? "hu-HU" : "en-GB"); - formData = new GlobalStore(data[lang]["DYNAMIC_FORM_DATA"]); - language = new GlobalStore(data[lang]["LAUNGAGE"]); - }).fail(function (error) { - console.log("Can't load JSON file! " + error); - }); - - var inputData = new GlobalStore({}); - var transactionData; - - let yourMoney = new Render("your_money"); - let transaction = new Render("transaction"); - let bankcard = new Render("bankcard"); - let graph = ""; - var pincode = ""; - var type = ""; - - Utils.setCardData({ - cardNumber: Utils.genCardNumber(), - cardExpiry: Utils.genMonth(), - }); - - function bankRender() { - Components.generateAllComponents(formData.getStoredData()); - } - - function ATMRender() { - Components.generateAllComponents(formData.getStoredData(), "atm"); - pincode = new Pincode("#pincode-container"); - Components.getComponent("atmComponent").fadeOut(); - Components.getComponent("withdraw").setElementId(".secondGridColumn"); - Components.getComponent("withdraw").renderInputAndButton(); - Components.getComponent("deposit").setElementId(".secondGridColumn"); - Components.getComponent("deposit").renderInputAndButton(); - - pincode.show(); - } - - $(document).on("click", ".pincode-numbers div", function () { - if (pincode.getPincode().length + 1 == 4) { - $(".pincode-numbers div:nth-child(12)").removeClass("disable-button"); - $(".pincode-numbers div:nth-child(12)").prop("disabled", false); - } - - let currentNumber = $(this).text(); - $(".pincode-input span").each(function () { - let spanText = $(this).attr("number"); - if (!spanText) { - $(this).attr("number", currentNumber); - $(this).addClass("circleBackground"); - pincode.setPincode(currentNumber); - return false; - } - }); - }); - - $(document).on("click", ".pincode-numbers div:nth-child(11)", function () { - pincode.renderPassCode(); - }); - - $(document).on("click", ".pincode-numbers div:nth-child(12)", function () { - $.post( - "https://esx_banking/checkPincode", - JSON.stringify(pincode.getPincode()) - ).then((response) => { - if (response.success) { - Components.loader("#pincode-container", "show"); - setTimeout(() => { - Components.getComponent("atmComponent").fadeIn(200); - }, 2800); - } else if (response.error) { - pincode.renderPassCode(); - } - }); - }); - - window.addEventListener("message", ({ data }) => { - const languageText = language.getStoredData(); - if (data.showMenu) { - const datas = data.datas; - - transactionData = new GlobalStore(datas.transactionsData); - const transData = transactionData.getStoredData(); - transData.map((trans) => { - trans.id = trans.time; - trans.time = Utils.dateFormat(trans.time); - switch (trans.type) { - case "WITHDRAW": - trans.type = languageText.withdraw; - break; - case "DEPOSIT": - trans.type = languageText.deposit; - break; - case "TRANSFER_RECEIVE": - trans.type = languageText.transferReceive; - break; - default: - trans.type = languageText.transfer; - break; - } - return trans; - }); - - graph = new Graph(transData, languageText.graphTitle); - - if (data.openATM) { - ATMRender(); - type = "ATM"; - transaction.setData(transData, languageText); - } else { - type = "BANK"; - bankRender(); - graph.renderSmallGraph(); - - transaction.setData(transData, languageText); - transaction.renderTransactions(); - } - - const bankData = Utils.getCardData(); - datas.bankCardData.cardNumber = bankData.cardNumber; - datas.bankCardData.createdDate = bankData.cardExpiry; - bankcard.setData(datas.bankCardData); - bankcard.renderBankCard(); - - yourMoney.setData(datas.your_money_panel, languageText); - yourMoney.renderMyMoneySection(); - - Components.loader(".loader", "show"); - } else if (data.updateData) { - const currentInputValues = inputData.getStoredData(); - const updateTransData = transactionData.getStoredData(); - - let info; - if ((amount = currentInputValues.withdraw)) { - info = { label: languageText.withdraw, amount: amount }; - } else if ((amount = currentInputValues.deposit)) { - info = { label: languageText.deposit, amount: amount }; - } else if ((amount = currentInputValues.transfer?.moneyAmount)) { - info = { label: languageText.transfer, amount: amount }; - } else if (currentInputValues.pincode) { - return; - } - updateTransData.unshift({ - time: Utils.dateFormat(new Date()), - id: new Date().getTime(), - label: info.label.toUpperCase(), - amount: info.amount, - type: info.label.toUpperCase(), - balance: data.data.bankMoney, - }); - yourMoney.refresh(data.data); - transaction.refresh(updateTransData); - if (type == "BANK") graph.refreshGraphData(updateTransData); - } - }); - - function resetContainerAndSetTitle(title) { - $("#menu").fadeOut(); - $("#title-container h3").text(title); - $("#more-modal-container").empty(); - } - - $(document).on("click", "#more_graph", function () { - resetContainerAndSetTitle(language.getStoredData().moreGraphTitle); - $("#modal-container").fadeIn(); - $("#more-modal-container").html(''); - graph.renderBigGraph(); - }); - - $(document).on("click", "#more_history", function () { - const lang = language.getStoredData(); - resetContainerAndSetTitle(lang.moreHistoryTitle); - $("#more-modal-container").html(` - - - - - - - - - - - -
idlabeltypebalanceamounttime
`); - $("#example").DataTable({ - responsive: true, - data: transactionData.getStoredData(), - columns: [ - { data: "id" }, - { data: "label", title: lang.tableLang.transactionLabel }, - { data: "type", title: lang.tableLang.typeLabel }, - { data: "balance", title: lang.tableLang.balanceLabel }, - { data: "amount", title: lang.tableLang.amountLabel }, - { data: "time", title: lang.tableLang.timeLabel }, - ], - columnDefs: [ - { - target: 0, - visible: false, - searchable: false, - }, - { - target: 5, - orderable: false, - }, - ], - createdRow: function (row, data, index) { - let parseType = data.type.replace(/[\$,]/g, ""); - $("td", row).eq(2).text(`$${data.balance}`); - if (parseType == lang.deposit || parseType == lang.transferReceive) { - $("td", row).eq(3).addClass("greenTableText"); - $("td", row) - .eq(3) - .html( - `+${lang.moneyFormat.replace("__replaceData__", data.amount)}` - ); - } else if (parseType == lang.withdraw || parseType == lang.transfer) { - $("td", row).eq(3).addClass("redTableText"); - $("td", row) - .eq(3) - .html( - `-${lang.moneyFormat.replace("__replaceData__", data.amount)}` - ); - } - }, - order: [[0, "desc"]], - scrollY: "450px", - scrollX: true, - scrollCollapse: true, - fixedColumns: { - heightMatch: "none", - }, - language: { - url: `https://cdn.datatables.net/plug-ins/9dcbecd42ad/i18n/${lang.tableLang.tableFullLanguage}.json`, - search: "", - searchPlaceholder: lang.tableLang.searchInputPlaceholder, - }, - }); - - $("#modal-container").fadeIn(); - }); - - let inputs = { - first: false, - second: false, - }; - - $(document).on( - "keyup", - 'input[type="number"] , input[type="password"]', - function () { - let buttonGroup = $(this) - .closest(".input-groups-container") - .find("button"); - - if (buttonGroup.length > 0) { - let name = $(this).attr("name"); - if (name == "moneyAmount") { - inputs.first = $(this).val() != ""; - } else { - inputs.second = $(this).val() != ""; - } - - if (inputs.first && inputs.second) { - buttonGroup.removeClass("disable-button"); - buttonGroup.prop("disabled", false); - } else { - buttonGroup.addClass("disable-button"); - buttonGroup.prop("disabled", true); - } - - return; - } - - let button = $(this).next("button"); - - if ($(this).val() != "") { - if ($(this).attr("name") == "pincode" && $(this).val().length < 4) { - return; - } - - button.removeClass("disable-button"); - button.prop("disabled", false); - } else { - button.addClass("disable-button"); - button.prop("disabled", true); - } - } - ); - - $(document).on("click", ".accept-button", function () { - let buttonGroup = $(this).closest(".input-groups-container").find("button"); - let inputValues = {}; - if (buttonGroup.length > 0) { - inputValues["transfer"] = {}; - $(".input-groups-container input").each(function () { - inputValues["transfer"][$(this).attr("name")] = $(this).val(); - $(this).val(null); - inputs.first = false; - inputs.second = false; - }); - } else { - let inputValue = $(this).prev("input").val(); - if (inputValue == undefined) { - return; - } - if (inputValue.length == 0 && inputValue <= 0) { - return; - } - - inputValues[$(this).prev("input").attr("name")] = inputValue; - - $(this).prev("input").val(null); - } - - inputData.setStoredData(inputValues); - $.post("https://esx_banking/clickButton", JSON.stringify(inputValues)); - - $(this).addClass("disable-button"); - $(this).prop("disabled", true); - }); - - $(document).on("click", "#close-button", function () { - $("#modal-container").fadeOut(); - $("#menu").fadeIn(); - }); - - $(document).on("click", ".exit-button", function () { - Components.loader(".loader", "hide"); - $.post("https://esx_banking/close", JSON.stringify({})); - }); - - $(document).keyup(function (e) { - if (e.which == 27) { - if (!LOADED) { - Components.loader(".loader", "hide"); - $.post("https://esx_banking/close", JSON.stringify({})); - } - } - }); -}); diff --git a/server-data/resources/[esx_addons]/esx_banking/html/ui.html b/server-data/resources/[esx_addons]/esx_banking/html/ui.html deleted file mode 100644 index 5eedc7759..000000000 --- a/server-data/resources/[esx_addons]/esx_banking/html/ui.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - -
-
- - - - - - - - \ No newline at end of file diff --git a/server-data/resources/[esx_addons]/esx_banking/locales/da.lua b/server-data/resources/[esx_addons]/esx_banking/locales/da.lua deleted file mode 100644 index daf1bedd7..000000000 --- a/server-data/resources/[esx_addons]/esx_banking/locales/da.lua +++ /dev/null @@ -1,16 +0,0 @@ -Locales["da"] = { - ["invalid_amount"] = "Det er et ugyldigt beløb", - ["deposit_money"] = "du har indbetalt $%s", - ["withdraw_money"] = "du har udbetalt $%s", - ["pincode_money"] = "du har ny pinkode %s", - ["transfer_money"] = "du har fuldført penge overførelsen af %s DKK til ID: %s", - ["receive_transfer"] = "du modtog en penge overførselse af %s DKK til ID: %s", - ["press_e_banking"] = "tryk [E] for at få adgang til banken", - ["access_bank"] = "Tilgå banken", - ["banking_blip"] = "Bank", - ["cant_do_it"] = "Du kan ikke gøre det!", - ["not_enough_money"] = "Ikke nok penge! Du mangler %s DKK!", - ["pincode_not_found"] = "Ugyldig PIN-kode", - ["pincode_found"] = "Gyldig PIN-kode...", - ["bank_name"] = "Fleeca Bank", -} diff --git a/server-data/resources/[esx_addons]/esx_banking/locales/de.lua b/server-data/resources/[esx_addons]/esx_banking/locales/de.lua deleted file mode 100644 index 2961308f9..000000000 --- a/server-data/resources/[esx_addons]/esx_banking/locales/de.lua +++ /dev/null @@ -1,16 +0,0 @@ -Locales["de"] = { - ["invalid_amount"] = "Das ist eine Ungültige anzahl von Geld", - ["deposit_money"] = "Du zahlst ein %s€", - ["withdraw_money"] = "Du zahlst aus %s€", - ["pincode_money"] = "Dein neuer Pin lautet %s", - ["transfer_money"] = "Du überweist %s€ an ID: %s", - ["receive_transfer"] = "Du erhälst eine überweisung Betrag: %s€ Von: %s", - ["press_e_banking"] = "Drücke [E] um auf die Bank zuzugreifen", - ["access_bank"] = "Auf die Bank zugreifen", - ["banking_blip"] = "Bank", - ["cant_do_it"] = "Kannst du nicht tun!", - ["not_enough_money"] = "Nicht genug Geld! Du benötigst %s Geld!", - ["pincode_not_found"] = "Ungültiger PIN Code", - ["pincode_found"] = "Gültiger PIN Code!", - ["bank_name"] = "Fleeca Bank", -} diff --git a/server-data/resources/[esx_addons]/esx_banking/locales/en.lua b/server-data/resources/[esx_addons]/esx_banking/locales/en.lua deleted file mode 100644 index b4bafb958..000000000 --- a/server-data/resources/[esx_addons]/esx_banking/locales/en.lua +++ /dev/null @@ -1,16 +0,0 @@ -Locales["en"] = { - ["invalid_amount"] = "That's an invalid amount of money", - ["deposit_money"] = "you have deposited $%s", - ["withdraw_money"] = "you have withdrawn $%s", - ["pincode_money"] = "you have new pincode %s", - ["transfer_money"] = "you success transfer money $%s ID: %s", - ["receive_transfer"] = "you receive transfer money $%s ID: %s", - ["press_e_banking"] = "press [E] to access the bank", - ["access_bank"] = "Access the bank", - ["banking_blip"] = "Bank", - ["cant_do_it"] = "Can't do it!", - ["not_enough_money"] = "Not enough money! You need %s money!", - ["pincode_not_found"] = "Invalid PIN code", - ["pincode_found"] = "Valid PIN code...", - ["bank_name"] = "Fleeca Bank", -} diff --git a/server-data/resources/[esx_addons]/esx_banking/locales/es.lua b/server-data/resources/[esx_addons]/esx_banking/locales/es.lua deleted file mode 100644 index cb32e7c4c..000000000 --- a/server-data/resources/[esx_addons]/esx_banking/locales/es.lua +++ /dev/null @@ -1,16 +0,0 @@ -Locales["es"] = { - ["invalid_amount"] = "No es una cantidad válida", - ["deposit_money"] = "Has depositado $%s", - ["withdraw_money"] = "Has retirado $%s", - ["pincode_money"] = "Tienes un nuevo código PIN %s", - ["transfer_money"] = "Transferencia exitosa por $%s al ID: %s", - ["receive_transfer"] = "Recibiste una transferencia por $%s del ID: %s", - ["press_e_banking"] = "Pulsa [E] para acceder al banco", - ["access_bank"] = "Acceder al banco", - ["banking_blip"] = "Banco", - ["cant_do_it"] = "No puedes permitirte esto!", - ["not_enough_money"] = "¡No tienes suficiente dinero! Necesitas %s de dinero!", - ["pincode_not_found"] = "Código PIN invalido", - ["pincode_found"] = "Código PIN válido.. Bienvenido", - ["bank_name"] = "Fleeca", -} diff --git a/server-data/resources/[esx_addons]/esx_banking/locales/et.lua b/server-data/resources/[esx_addons]/esx_banking/locales/et.lua deleted file mode 100644 index f90ad25e8..000000000 --- a/server-data/resources/[esx_addons]/esx_banking/locales/et.lua +++ /dev/null @@ -1,16 +0,0 @@ -Locales["et"] = { - ["invalid_amount"] = "Tundmatu kogus raha", - ["deposit_money"] = "Sa sisestasid $%s", - ["withdraw_money"] = "Sa võtsid välja $%s", - ["pincode_money"] = "Uus PIN kood: %s", - ["transfer_money"] = "Sa tegid ülekande summas: $%s ID: %s", - ["receive_transfer"] = "Sa said ülekande summas: $%s ID: %s", - ["press_e_banking"] = "Vajuta [E], et avada pank", - ["access_bank"] = "Ava pank", - ["banking_blip"] = "Pank", - ["cant_do_it"] = "Ei saa seda teha!", - ["not_enough_money"] = "Pole piisavalt raha! Sul on vaja %s !", - ["pincode_not_found"] = "Vale PIN", - ["pincode_found"] = "Õige PIN...", - ["bank_name"] = "Fleeca Pank", -} diff --git a/server-data/resources/[esx_addons]/esx_banking/locales/fi.lua b/server-data/resources/[esx_addons]/esx_banking/locales/fi.lua deleted file mode 100644 index dba839c1b..000000000 --- a/server-data/resources/[esx_addons]/esx_banking/locales/fi.lua +++ /dev/null @@ -1,16 +0,0 @@ -Locales["fi"] = { - ["invalid_amount"] = "Virheellinen summa", - ["deposit_money"] = "Olet tallettanut $%s", - ["withdraw_money"] = "Olet nostanut $%s", - ["pincode_money"] = "Sinulla on uusi PIN-koodi %s", - ["transfer_money"] = "Siirsit onnistuneesti rahaa $%s ID: %s", - ["receive_transfer"] = "Vastaanotit rahaa $%s ID: %s", - ["press_e_banking"] = "Paina [E] avataksesi pankki", - ["access_bank"] = "Avaa pankki", - ["banking_blip"] = "Pankki", - ["cant_do_it"] = "Ei voida tehdä sitä!", - ["not_enough_money"] = "Ei tarpeeksi rahaa! Tarvitset %s rahaa!", - ["pincode_not_found"] = "Virheellinen PIN-koodi", - ["pincode_found"] = "Kelvollinen PIN-koodi...", - ["bank_name"] = "Pankki", -} diff --git a/server-data/resources/[esx_addons]/esx_banking/locales/fr.lua b/server-data/resources/[esx_addons]/esx_banking/locales/fr.lua deleted file mode 100644 index 2bfe129a6..000000000 --- a/server-data/resources/[esx_addons]/esx_banking/locales/fr.lua +++ /dev/null @@ -1,16 +0,0 @@ -Locales["fr"] = { - ["invalid_amount"] = "Le montant est invalide.", - ["deposit_money"] = "Tu as déposé $%s", - ["withdraw_money"] = "Tu as retiré $%s", - ["pincode_money"] = "Tu as défini un nouveau code PIN : %s", - ["transfer_money"] = "Tu as transféré $%s à ID: %s", - ["receive_transfer"] = "Tu as reçu $%s de ID: %s", - ["press_e_banking"] = "Appuie sur [E] pour accéder a la banque.", - ["access_bank"] = "Accéder à la banque", - ["banking_blip"] = "Banque", - ["cant_do_it"] = "Tu ne peux pas faire ça!", - ["not_enough_money"] = "Tu n'as pas assez d'argent ! Tu as besoin de %s!", - ["pincode_not_found"] = "Code PIN invalide", - ["pincode_found"] = "Code PIN valide...", - ["bank_name"] = "Banque Fleeca", -} diff --git a/server-data/resources/[esx_addons]/esx_banking/locales/hu.lua b/server-data/resources/[esx_addons]/esx_banking/locales/hu.lua deleted file mode 100644 index 813275c6d..000000000 --- a/server-data/resources/[esx_addons]/esx_banking/locales/hu.lua +++ /dev/null @@ -1,16 +0,0 @@ -Locales["hu"] = { - ["invalid_amount"] = "Érvénytelen pénz mennyiség", - ["deposit_money"] = "Befizettél %s$-t", - ["withdraw_money"] = "Kivettél %s$-t", - ["pincode_money"] = "Az új PIN kódod: %s", - ["transfer_money"] = "Sikeres utalás! Összeg: $%s ID: %s", - ["receive_transfer"] = "Utalás érkezett! Összeg: $%s ID: %s", - ["press_e_banking"] = "Nyomd meg a [E] gombot a bank eléréséhez", - ["access_bank"] = "Bank megnyitása", - ["banking_blip"] = "Bank", - ["cant_do_it"] = "Ezt nem lehet!", - ["not_enough_money"] = "Nincs elég pénzed, még szükséged lesz ennyire: %s", - ["pincode_not_found"] = "Érvénytelen PIN kód", - ["pincode_found"] = "Érvényes PIN kód...", - ["bank_name"] = "Fleeca Bank", -} diff --git a/server-data/resources/[esx_addons]/esx_banking/locales/it.lua b/server-data/resources/[esx_addons]/esx_banking/locales/it.lua deleted file mode 100644 index d2cf248af..000000000 --- a/server-data/resources/[esx_addons]/esx_banking/locales/it.lua +++ /dev/null @@ -1,16 +0,0 @@ -Locales["it"] = { - ["invalid_amount"] = "questa è una somma di denaro non valida", - ["deposit_money"] = "hai depositato $%s", - ["withdraw_money"] = "hai prelevato $%s", - ["pincode_money"] = "hai un nuovo codice pin %s", - ["transfer_money"] = "hai trasferito con successo il denaro a $%s ID: %s", - ["receive_transfer"] = "hai ricevuto un trasferimento di denaro da $%s ID: %s", - ["press_e_banking"] = "premi [E] per accedere alla banca", - ["access_bank"] = "accedi alla banca", - ["banking_blip"] = "Banca", - ["cant_do_it"] = "non puoi farlo!", - ["not_enough_money"] = "non hai abbastanza soldi! hai bisogno di %s soldi!", - ["pincode_not_found"] = "codice PIN errato", - ["pincode_found"] = "codice PIN valido...", - ["bank_name"] = "Banca Fleeca", -} diff --git a/server-data/resources/[esx_addons]/esx_banking/locales/nl.lua b/server-data/resources/[esx_addons]/esx_banking/locales/nl.lua deleted file mode 100644 index 33e3324a4..000000000 --- a/server-data/resources/[esx_addons]/esx_banking/locales/nl.lua +++ /dev/null @@ -1,16 +0,0 @@ -Locales["nl"] = { - ["invalid_amount"] = "Ongeldig bedrag", - ["deposit_money"] = "Je hebt €%s gestort", - ["withdraw_money"] = "Je hebt €%s opgenomen", - ["pincode_money"] = "Je nieuwe pincode is %s", - ["transfer_money"] = "Met succes €%s overgemaakt naar ID: %s", - ["receive_transfer"] = "Je hebt €%s ontvangen van ID: %s", - ["press_e_banking"] = "Klik op [E] om de bank te gebruiken", - ["access_bank"] = "Geldautomaat", - ["banking_blip"] = "Bank", - ["cant_do_it"] = "Kan dit niet doen!", - ["not_enough_money"] = "Niet genoeg geld! Je hebt nog %s nodig!", - ["pincode_not_found"] = "Onjuiste PIN", - ["pincode_found"] = "Een moment geduld...", - ["bank_name"] = "Fleeca Bank", -} diff --git a/server-data/resources/[esx_addons]/esx_banking/locales/sl.lua b/server-data/resources/[esx_addons]/esx_banking/locales/sl.lua deleted file mode 100644 index bb84beb26..000000000 --- a/server-data/resources/[esx_addons]/esx_banking/locales/sl.lua +++ /dev/null @@ -1,16 +0,0 @@ -Locales["sl"] = { - ["invalid_amount"] = "Neveljavna količina", - ["deposit_money"] = "Vi ste položili $%s", - ["withdraw_money"] = "Vi ste Dvignili $%s", - ["pincode_money"] = "Vi imate novo PIN Kodo %s", - ["transfer_money"] = "Vi ste uspešno poslali denar $%s TRR: %s", - ["receive_transfer"] = "Vi ste dobili denar $%s TRR: %s", - ["press_e_banking"] = "Pritisnite [E] da odprete Banko", - ["access_bank"] = "Dostop do banke", - ["banking_blip"] = "Banka", - ["cant_do_it"] = "NI možno to narediti!", - ["not_enough_money"] = "Premalo denarja! Vi potrebujete %s denarja!", - ["pincode_not_found"] = "Neveljavna PIN Koda", - ["pincode_found"] = "Pravilna PIN Koda...", - ["bank_name"] = "Delavska Hranilnica", -} diff --git a/server-data/resources/[esx_addons]/esx_banking/locales/sr.lua b/server-data/resources/[esx_addons]/esx_banking/locales/sr.lua deleted file mode 100644 index 88b8d01b8..000000000 --- a/server-data/resources/[esx_addons]/esx_banking/locales/sr.lua +++ /dev/null @@ -1,16 +0,0 @@ -Locales["sr"] = { - ["invalid_amount"] = "Nevazeci iznos novca", - ["deposit_money"] = "Uplatili ste $%s", - ["withdraw_money"] = "Podigli ste $%s", - ["pincode_money"] = "Imate novi PIN kod: %s", - ["transfer_money"] = "Uspesno ste prebacili novac $%s ID: %s", - ["receive_transfer"] = "Primili ste novac od $%s ID: %s", - ["press_e_banking"] = "Pritisnite [E] da pristupite banci", - ["access_bank"] = "Pristupi banci", - ["banking_blip"] = "Banka", - ["cant_do_it"] = "Ne mozete to uraditi!", - ["not_enough_money"] = "Nemate dovoljno novca! Potrebno vam je %s !", - ["pincode_not_found"] = "Pogresan PIN kod", - ["pincode_found"] = "Validni PIN kod...", - ["bank_name"] = "Fleeca Banka", -} diff --git a/server-data/resources/[esx_addons]/esx_banking/locales/zh-cn.lua b/server-data/resources/[esx_addons]/esx_banking/locales/zh-cn.lua deleted file mode 100644 index 4eb827052..000000000 --- a/server-data/resources/[esx_addons]/esx_banking/locales/zh-cn.lua +++ /dev/null @@ -1,16 +0,0 @@ -Locales["zh-cn"] = { - ["invalid_amount"] = "无效的金额输入!", - ["deposit_money"] = "您已存入-$%s", - ["withdraw_money"] = "你已提取-$%s", - ["pincode_money"] = "您配置了新的密码:%s", - ["transfer_money"] = "已将 $%s 转账至ID: %s", - ["receive_transfer"] = "收到转账 $%s, 转账人ID: %s", - ["press_e_banking"] = "键下 [E] 访问银行", - ["access_bank"] = "访问银行", - ["banking_blip"] = "花园银行", - ["cant_do_it"] = "错误的操作!", - ["not_enough_money"] = "暂无足够现金! 您还需要至少 %s 的现金!", - ["pincode_not_found"] = "无效的PIN密码输入", - ["pincode_found"] = "验证PIN密码中...", - ["bank_name"] = "花园银行", -} diff --git a/server-data/resources/[esx_addons]/esx_banking/server/main.lua b/server-data/resources/[esx_addons]/esx_banking/server/main.lua deleted file mode 100644 index 4f790e2cb..000000000 --- a/server-data/resources/[esx_addons]/esx_banking/server/main.lua +++ /dev/null @@ -1,269 +0,0 @@ -local spawnedPeds, netIdTable = {}, {} - --- get keys utils -local function get_key(t) - local key - for k, _ in pairs(t) do - key = k - end - return key -end - --- Resource starting -AddEventHandler("onResourceStart", function(resourceName) - if GetCurrentResourceName() ~= resourceName then - return - end - if Config.EnablePeds then - BANK.CreatePeds() - end - local twoMonthMs = (os.time() - 5259487) * 1000 - MySQL.Sync.fetchScalar("DELETE FROM banking WHERE time < ? ", { twoMonthMs }) -end) - -AddEventHandler("onResourceStop", function(resourceName) - if GetCurrentResourceName() ~= resourceName then - return - end - if Config.EnablePeds then - BANK.DeletePeds() - end -end) - -if Config.EnablePeds then - AddEventHandler("esx:playerLoaded", function(playerId) - TriggerClientEvent("esx_banking:pedHandler", playerId, netIdTable) - end) -end - --- event -RegisterServerEvent("esx_banking:doingType") -AddEventHandler("esx_banking:doingType", function(typeData) - if source == nil then - return - end - if typeData == nil then - return - end - - local source = source - local xPlayer = ESX.GetPlayerFromId(source) - local identifier = xPlayer.getIdentifier() - local money = xPlayer.getAccount("money").money - local bankMoney = xPlayer.getAccount("bank").money - local amount - - local key = get_key(typeData) - if typeData.deposit then - amount = tonumber(typeData.deposit) - elseif typeData.withdraw then - amount = tonumber(typeData.withdraw) - elseif typeData.transfer and typeData.transfer.moneyAmount then - amount = tonumber(typeData.transfer.moneyAmount) - elseif typeData.pincode then - amount = tonumber(typeData.pincode) - end - - if not tonumber(amount) then - return - end - amount = ESX.Math.Round(amount) - - if amount == nil or (not typeData.pincode and amount <= 0) then - TriggerClientEvent("esx:showNotification", source, _U("invalid_amount"), "error") - else - if typeData.deposit and amount <= money then - -- deposit - BANK.Deposit(amount, xPlayer) - elseif typeData.withdraw and bankMoney ~= nil and amount <= bankMoney then - -- withdraw - BANK.Withdraw(amount, xPlayer) - elseif typeData.pincode then - -- pincode - BANK.Pincode(amount, identifier) - elseif typeData.transfer then - -- transfer - if tonumber(typeData.transfer.playerId) <= 0 then - TriggerClientEvent("esx:showNotification", source, _U("cant_do_it"), "error") - return - end - - if bankMoney < amount then - TriggerClientEvent("esx:showNotification", source, _U("not_enough_money", amount), "error") - return - end - - local xTarget = ESX.GetPlayerFromId(tonumber(typeData.transfer.playerId)) - if not BANK.Transfer(xTarget, xPlayer, amount, key) then - return - end - else - TriggerClientEvent("esx:showNotification", source, _U("not_enough_money", amount), "error") - return - end - - money = xPlayer.getAccount("money").money - bankMoney = xPlayer.getAccount("bank").money - if typeData.transfer then - TriggerClientEvent( - "esx:showNotification", - source, - _U(string.format("%s_money", key), amount, typeData.transfer.playerId), - "success" - ) - else - TriggerClientEvent( - "esx:showNotification", - source, - _U(string.format("%s_money", key), typeData.pincode and (string.format("%04d", amount)) or amount), - "success" - ) - end - if not typeData.pincode then - BANK.LogTransaction(source, string.upper(key), string.upper(key), amount, bankMoney) - end - - TriggerClientEvent("esx_banking:updateMoneyInUI", source, key, bankMoney, money) - end -end) - --- register callbacks -ESX.RegisterServerCallback("esx_banking:getPlayerData", function(source, cb) - local xPlayer = ESX.GetPlayerFromId(source) - local identifier = xPlayer.getIdentifier() - local weekAgo = (os.time() - 604800) * 1000 - local transactionHistory = MySQL.Sync.fetchAll( - "SELECT * FROM banking WHERE identifier = ? AND time > ? ORDER BY time DESC LIMIT 10", - { identifier, weekAgo } - ) - local playerData = { - playerName = xPlayer.getName(), - money = xPlayer.getAccount("money").money, - bankMoney = xPlayer.getAccount("bank").money, - transactionHistory = transactionHistory, - } - - cb(playerData) -end) - -ESX.RegisterServerCallback("esx_banking:checkPincode", function(source, cb, inputPincode) - local xPlayer = ESX.GetPlayerFromId(source) - local identifier = xPlayer.getIdentifier() - local pincode = MySQL.Sync.fetchScalar( - "SELECT COUNT(1) AS pincode FROM users WHERE identifier = ? AND pincode = ?", - { identifier, inputPincode } - ) - cb(pincode > 0) -end) - -function logTransaction(targetSource, label, key, amount) - if targetSource == nil then - print("ERROR: TargetSource nil!") - return - end - - if key == nil then - print("ERROR: Do you need use these: WITHDRAW,DEPOSIT,TRANSFER_RECEIVE") - return - end - - if type(key) ~= "string" or key == "" then - print("ERROR: Do you need use these: WITHDRAW,DEPOSIT,TRANSFER_RECEIVE and can only be string type!") - return - end - - if amount == nil then - print("ERROR: Amount value is nil! Add some numeric value to the amount!") - return - end - - if label == nil then - label = "UNKNOW LABEL" - end - - local xPlayer = ESX.GetPlayerFromId(tonumber(targetSource)) - - if xPlayer ~= nil then - local bankCurrentMoney = xPlayer.getAccount("bank").money - BANK.LogTransaction(targetSource, label, string.upper(key), amount, bankCurrentMoney) - else - print("ERROR: xPlayer is nil!") - end -end -exports("logTransaction", logTransaction) - -RegisterServerEvent("esx_banking:logTransaction") -AddEventHandler("esx_banking:logTransaction", function(label, key, amount) - logTransaction(source, label, key, amount) -end) - --- bank functions -BANK = { - CreatePeds = function() - for i = 1, #Config.Peds do - local model = Config.Peds[i].Model - local coords = Config.Peds[i].Position - spawnedPeds[i] = CreatePed(0, model, coords.x, coords.y, coords.z, coords.w, true, true) - netIdTable[i] = NetworkGetNetworkIdFromEntity(spawnedPeds[i]) - while not DoesEntityExist(spawnedPeds[i]) do - Wait(50) - end - end - - Wait(100) - TriggerClientEvent("esx_banking:PedHandler", -1, netIdTable) - end, - DeletePeds = function() - for i = 1, #spawnedPeds do - DeleteEntity(spawnedPeds[i]) - spawnedPeds[i] = nil - end - end, - Withdraw = function(amount, xPlayer) - xPlayer.addAccountMoney("money", amount) - xPlayer.removeAccountMoney("bank", amount) - end, - Deposit = function(amount, xPlayer) - xPlayer.removeAccountMoney("money", amount) - xPlayer.addAccountMoney("bank", amount) - end, - Transfer = function(xTarget, xPlayer, amount) - if xTarget == nil or xPlayer.source == xTarget.source then - TriggerClientEvent("esx:showNotification", source, _U("cant_do_it"), "error") - return false - end - - xPlayer.removeAccountMoney("bank", amount) - xTarget.addAccountMoney("bank", amount) - local bankMoney = xTarget.getAccount("bank").money - BANK.LogTransaction(xTarget.source, "TRANSFER_RECEIVE", amount, bankMoney) - TriggerClientEvent( - "esx:showNotification", - xTarget.source, - _U("receive_transfer", amount, xPlayer.source), - "success" - ) - - return true - end, - Pincode = function(amount, identifier) - MySQL.update("UPDATE users SET pincode = ? WHERE identifier = ? ", { amount, identifier }) - end, - LogTransaction = function(playerId, label, logType, amount, bankMoney) - if playerId == nil then - return - end - - if label == nil then - label = logType - end - - local xPlayer = ESX.GetPlayerFromId(playerId) - local identifier = xPlayer.getIdentifier() - - MySQL.insert( - "INSERT INTO banking (identifier, label, type, amount, time, balance) VALUES (?, ?, ?, ?, ?, ?)", - { identifier, label, logType, amount, os.time() * 1000, bankMoney } - ) - end, -}