您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Удобное создание лота на рынке
// ==UserScript== // @name HWM_auction_new_lot // @author Мифист // @namespace Мифист // @version 2.1.2 // @description Удобное создание лота на рынке // @match https://www.heroeswm.ru/auction_new_lot.php* // @match https://*.lordswm.com/auction_new_lot.php* // @run-at document-end // @grant none // @license MIT // @noframes // ==/UserScript== (async function initModule(view) { 'use strict'; if (document.visibilityState === 'hidden') { const handler = () => initModule(view); document.addEventListener('visibilitychange', handler, { once: true }); return; } // ==================== const PATH = location.pathname; const allArtsData = { "10scroll": "&", "12hron": "other/&", "13coin": "&", "16amul": "other/&", "17bring": "other/&", "2year_amul_lords": "&", "3year_amul": "&", "3year_art": "3rd", "4year_klever": "&", "5years_star": "5year_star", "6ring": "&", "7ka": "&", "8amul_inf": "8amul", "9amu_let": "other/9amulet", "a_dagger1": "events/&", "a_dagger2": "events/&", "a_mallet": "auc_1lot", "adv_armor1": "events/&", "adv_armor2": "events/&", "adv_boot1": "events/&", "adv_boot2": "events/&", "adv_clk1": "events/&", "adv_clk2": "events/&", "adv_fring1": "events/&", "adv_fring2": "events/&", "adv_hm1": "events/&", "adv_hm2": "events/&", "adv_longbow1": "events/&", "adv_longbow2": "events/&", "adv_neck1": "events/&", "adv_neck2": "events/&", "adv_saber1": "events/&", "adv_saber2": "events/&", "adv_shild1": "events/&", "adv_shild2": "events/&", "adv_sumk1": "events/&", "adv_sumk2": "events/&", "amf_body": "bwar/&", "amf_boot": "bwar/&", "amf_cl": "bwar/&", "amf_helm": "bwar/&", "amf_scroll": "bwar/&", "amf_weap": "bwar/&", "amulet19": "nwamulet19", "amulet_of_luck": "lucknecklace", "ankh1": "events/&", "ankh2": "events/&", "anomal_ring1": "events/&", "anomal_ring2": "events/&", "anomal_ring3": "events/&", "antiair_cape": "&", "antifire_cape": "&", "antimagic_cape": "&", "arm_armor1": "events/&", "arm_armor2": "events/&", "arm_armor3": "events/&", "arm_bts1": "events/&", "arm_bts2": "events/&", "arm_bts3": "events/&", "arm_cap1": "events/&", "arm_cap2": "events/&", "arm_cap3": "events/&", "arm_clk1": "events/&", "arm_clk2": "events/&", "arm_clk3": "events/&", "arm_r1": "events/&", "arm_r2": "events/&", "arm_r3": "events/&", "arm_sekstant1": "events/&", "arm_sekstant2": "events/&", "arm_sekstant3": "events/&", "armor15": "&", "armor17": "anwarmor17", "bafamulet15": "&", "bal_cube": "events/&", "barb_armor": "&", "barb_boots": "&", "barb_club": "&", "barb_helm": "&", "barb_shield": "&", "battlem_cape": "events/&", "bear_statue": "events/medved", "bfly": "gifts/&", "blackring": "other/&", "blacksword": "&", "blacksword1": "blacksword", "bludgeon": "&", "boots13": "&", "boots15": "&", "boots17": "bzbboots17", "boots2": "&", "bow14": "&", "bow17": "bbobow17", "bravery_medal": "braverymedal", "bril_pendant": "gifts/&", "bril_ring": "gifts/&", "bring14": "&", "broad_sword": "broadsword", "brush": "&", "brush_2011y": "brush", "bshield1": "event/&", "bshield2": "event/&", "bshield3": "event/&", "buben1": "events/&", "buben2": "events/&", "buben3": "events/&", "bunt_medal1": "bunt_medal1f", "bunt_medal2": "&", "bunt_medal3": "bunt_medal3f", "bwar1": "bwar/bmedal1", "bwar2": "bwar/bmedal2", "bwar3": "bwar/bmedal3", "bwar4": "bwar/bmedal4", "bwar5": "bwar/bmedal5", "bwar6": "bwar/bmedal6", "bwar7": "bwar/bmedal7", "bwar_splo": "bwar/bmedala1", "bwar_stoj": "bwar/bmedalb1", "bwar_takt": "bwar/bmedalc1", "castle_orden": "events/&", "cat_statue": "events/e_cat", "centaurbow": "&", "chain_coif": "chaincoif", "chains1": "events/&", "chains2": "events/&", "chains3": "events/&", "ciras": "&", "circ_ring": "&", "cloack17": "clscloack17", "cloackwz15": "&", "clover_amul": "&", "cold_shieldn": "&", "cold_sword2014": "&", "coldamul": "&", "coldring_n": "coldring", "commander_ring": "events/&", "compass": "other/&", "composite_bow": "&", "crystal": "events/&", "cubed": "events/&", "cubeg": "events/&", "cubes": "events/&", "d_spray": "gifts/&", "dagger": "&", "dagger16": "&", "dagger20": "&", "dagger_dex": "&", "dagger_myf": "&", "dark_amul": "events/&", "dark_armor": "events/&", "dark_axe": "events/&", "dark_boots": "events/&", "dark_bow": "events/&", "dark_cloak": "events/&", "dark_dagger": "events/&", "dark_helmet": "events/&", "dark_ring": "events/&", "dark_shield": "events/&", "darkelfboots": "&", "darkelfciras": "&", "darkelfcloack": "&", "darkelfkaska": "&", "darkelfpendant": "&", "darkelfstaff": "&", "darkring": "&", "def_sword": "&", "defender_dagger": "gifts/&", "defender_shield": "protectshield", "dem_amulet": "&", "dem_armor": "&", "dem_axe": "&", "dem_bootshields": "&", "dem_dmech": "dmech", "dem_dtopor": "dtopor", "dem_helmet": "&", "dem_kosa": "kosa", "dem_shield": "&", "demwar1": "&", "demwar2": "&", "demwar3": "&", "demwar4": "&", "demwar5": "&", "demwar6": "&", "dering": "event/&", "dog_statue": "events/e_dog", "doubt_ring": "necroring", "dragon_crown": "other/&", "dragon_shield": "&", "dragonstone": "events/&", "drak_armor1": "events/&", "drak_armor2": "events/&", "drak_armor3": "events/&", "drak_crown1": "events/&", "drak_crown2": "events/&", "drak_crown3": "events/&", "dring12": "rings/&", "dring15": "rings/&", "dring18": "rings/&", "dring21": "rings/&", "dring5": "rings/&", "dring9": "rings/&", "druid_amulet": "kwar/dd_amulet", "druid_armor": "kwar/dd_robe", "druid_boots": "kwar/dd_boots", "druid_cloack": "kwar/dd_cloack", "druid_staff": "kwar/dd_staff", "dubina": "&", "dudka": "event/&", "dun_amul1": "events/&", "dun_amul2": "events/&", "dun_amul3": "events/&", "dun_armor1": "events/&", "dun_armor2": "events/&", "dun_armor3": "events/&", "dun_boots1": "events/&", "dun_boots2": "events/&", "dun_boots3": "events/&", "dun_bow1": "events/&", "dun_bow2": "events/&", "dun_bow3": "events/&", "dun_cloak1": "events/&", "dun_cloak2": "events/&", "dun_cloak3": "events/&", "dun_dagger1": "events/&", "dun_dagger2": "events/&", "dun_dagger3": "events/&", "dun_ring1": "events/&", "dun_ring2": "events/&", "dun_ring3": "events/&", "dun_shield1": "events/&", "dun_shield2": "events/&", "dun_shield3": "events/&", "dun_sword1": "events/&", "dun_sword2": "events/&", "dun_sword3": "events/&", "dung_axe1": "events/&", "dung_axe2": "events/&", "dung_axe3": "events/&", "dung_glefa1": "events/&", "dung_glefa2": "events/&", "dung_glefa3": "events/&", "e_shield1": "events/&", "e_shield2": "events/&", "ed_armr1": "events/&", "ed_armr2": "events/&", "ed_armr3": "events/&", "ed_bsword1": "events/&", "ed_bsword2": "events/&", "ed_bsword3": "events/&", "ed_elfbow1": "events/&", "ed_elfbow2": "events/&", "ed_elfbow3": "events/&", "ed_mbook1": "events/&", "ed_mbook2": "events/&", "ed_mbook3": "events/&", "ed_pendant1": "events/&", "ed_pendant2": "events/&", "ed_pendant3": "events/&", "ed_ring1": "events/&", "ed_ring2": "events/&", "ed_ring3": "events/&", "ed_svboots1": "events/&", "ed_svboots2": "events/&", "ed_svboots3": "events/&", "eddem_ring1": "events/&", "eddem_ring2": "events/&", "eddem_ring3": "events/&", "eg_order1": "events/&", "eg_order2": "events/&", "eg_order3": "events/&", "elfamulet": "&", "elfboots": "&", "elfbow": "&", "elfdagger": "event/&", "elfshirt": "&", "elfwar1": "&", "elfwar2": "&", "elfwar3": "&", "elfwar4": "&", "elfwar5": "&", "elfwar6": "&", "energy_scroll": "&", "eye1": "events/&", "eye2": "events/&", "eye3": "events/&", "fear_amulk": "events/&", "fear_bonearmour": "events/&", "fear_boots": "events/&", "fear_cloack": "events/&", "fear_scythe": "events/&", "ffstaff15": "&", "finecl": "&", "firehammer": "events/&", "firsword15": "&", "flower_heart": "gifts/&", "flowers1": "gifts/_&", "flowers2": "gifts/_&", "flowers3": "gifts/_&", "flowers4": "gifts/buk2", "flowers5": "gifts/buk1", "flyaga": "events/&", "forest_armor": "events/&", "forest_blade": "events/&", "forest_bolt": "events/&", "forest_boots": "events/&", "forest_bow": "events/&", "forest_crossbow": "events/&", "forest_dagger": "events/&", "forest_helm": "events/&", "forest_knives": "events/&", "full_plate": "&", "gargoshield": "events/&", "gdubina": "&", "gm_3arrows": "gm/&", "gm_abow": "gm/&", "gm_amul": "gm/&", "gm_arm": "gm/&", "gm_defence": "gm/&", "gm_hat": "gm/&", "gm_kastet": "gm/&", "gm_protect": "gm/&", "gm_rring": "gm/&", "gm_spdb": "gm/&", "gm_sring": "gm/&", "gm_sword": "gm/&", "gmage_armor": "kwar/bm_robe", "gmage_boots": "kwar/bm_boots", "gmage_cloack": "kwar/bm_cloack", "gmage_crown": "kwar/bm_crown", "gmage_scroll": "kwar/bm_scroll", "gmage_staff": "kwar/bm_staff", "gnome_hammer": "onehandaxe", "gnomearmor": "gnomewar/armor1", "gnomeboots": "gnomewar/boots1", "gnomehammer": "gnomewar/hammer1", "gnomehelmet": "gnomewar/helmet1", "gnomem_amulet": "gnomewar/amulet2", "gnomem_armor": "gnomewar/armor2", "gnomem_boots": "gnomewar/gw_boots2", "gnomem_hammer": "gnomewar/hammer2", "gnomem_helmet": "gnomewar/helmet2", "gnomem_shield": "gnomewar/shield2", "gnomeshield": "gnomewar/shield1", "gnomewar1": "gnomewar/medal1", "gnomewar2": "gnomewar/medal2", "gnomewar3": "gnomewar/medal3", "gnomewar4": "gnomewar/medal4", "gnomewar5": "gnomewar/medal5", "gnomewar6": "gnomewar/medal6", "gnomewar7": "gnomewar/medal7", "goblin_bow": "&", "goldciras": "gifts/&", "gring": "events/&", "gringd": "events/&", "half_heart_m": "gifts/&", "half_heart_w": "gifts/&", "hauberk": "chainarmor", "heaven_amlt": "events/&", "heaven_armr": "events/&", "heaven_bow": "events/&", "heaven_bts": "events/&", "heaven_clk": "events/&", "heaven_dagger": "events/&", "heaven_helm": "events/&", "heaven_rn": "events/&", "heaven_shield": "events/&", "heaven_staff": "events/&", "helmet17": "hwmhelmet17", "hm1": "events/&", "hm2": "events/&", "hopesh1": "events/&", "hopesh2": "events/&", "hunter_amulet1": "&", "hunter_armor1": "&", "hunter_arrows1": "&", "hunter_boots": "hunterboots", "hunter_boots1": "&", "hunter_boots2": "&", "hunter_boots3": "&", "hunter_bow1": "&", "hunter_bow2": "&", "hunter_gloves1": "&", "hunter_hat1": "&", "hunter_helm": "&", "hunter_jacket1": "&", "hunter_mask1": "&", "hunter_pendant1": "&", "hunter_ring1": "&", "hunter_ring2": "&", "hunter_roga1": "&", "hunter_shield1": "&", "hunter_sword1": "&", "hunterdagger": "&", "hunterdsword": "&", "huntershield2": "&", "huntersword2": "&", "i_ring": "&", "icebow1": "events/&", "icebow2": "events/&", "icebow3": "events/&", "icecr1": "events/&", "icecr2": "events/&", "icecr3": "events/&", "icesphere1": "events/&", "icesphere2": "events/&", "icesphere3": "events/&", "imp_amul": "events/&", "imp_armor": "events/&", "imp_boots": "events/&", "imp_cloak": "events/&", "imp_crossbow": "events/&", "imp_dagger": "events/&", "imp_helmet": "events/&", "imp_ring": "events/&", "imp_shield": "events/&", "imp_sword": "events/&", "inq_body": "bwar/&", "inq_boot": "bwar/&", "inq_cl": "bwar/&", "inq_helm": "bwar/&", "inq_ring1": "events/&", "inq_ring2": "events/&", "inq_weap": "bwar/&", "kn_body": "bwar/&", "kn_helm": "bwar/&", "kn_shield": "bwar/&", "kn_weap": "bwar/&", "kniga": "events/&", "knightarmor": "kwar/kk_armor", "knightboots": "kwar/kk_boots", "knighthelmet": "kwar/kk_helmet", "knightshield": "kwar/kk_shield", "knightsword": "kwar/kk_sword", "knowledge_hat": "knowlengehat", "koltsou": "&", "kopie": "&", "krest1": "events/&", "krest2": "events/&", "krest3": "events/&", "kwar1": "kwar/kmedal1", "kwar2": "kwar/kmedal2", "kwar3": "kwar/kmedal3", "kwar4": "kwar/kmedal4", "kwar5": "kwar/kmedal5", "kwar6": "kwar/kmedal6", "kwar7": "kwar/kmedal7", "kwar_splo": "kwar/medala", "kwar_stoj": "kwar/medalb", "kwar_takt": "kwar/medalc", "kznamya1": "events/&", "kznamya2": "events/&", "large_shield": "&", "lbow": "&", "leather_helm": "leatherhelmet", "leather_shiled": "leathershield", "leatherboots": "&", "leatherhat": "&", "leatherplate": "&", "les_cl": "events/&", "lizard_helm": "&", "long_bow": "&", "lotus1": "events/&", "lotus2": "events/&", "lotus3": "events/&", "m_amul1": "events/&", "m_amul2": "events/&", "m_amul3": "events/&", "m_armor1": "events/&", "m_armor2": "events/&", "m_armor3": "events/&", "mage_armor": "&", "mage_boots": "war/&", "mage_cape": "war/&", "mage_hat": "war/&", "mage_helm": "&", "mage_robe": "war/&", "mage_scroll": "war/&", "mage_staff": "war/&", "magewar1": "medals/&", "magewar2": "medals/&", "magewar3": "medals/&", "magewar4": "medals/&", "magewar5": "medals/&", "magic_amulet": "&", "magma_arb": "events/&", "magma_armor": "events/&", "magma_boots": "events/&", "magma_clc": "events/&", "magma_dagger": "events/&", "magma_helm": "events/&", "magma_lshield": "events/&", "magma_pend": "events/&", "magma_rd": "events/&", "magma_swrd": "events/&", "magneticarmor": "events/&", "magring13": "&", "mamulet19": "megmamulet19", "marmor17": "mammarmor17", "mart8_flowers1": "_flower1", "mart8_ring1": "_womenring1", "mboots14": "&", "mboots17": "macmboots17", "mechanic_glasses1": "events/mechanics_glasses1", "mechanic_glasses2": "events/mechanics_glasses2", "mechanic_glasses3": "events/mechanics_glasses3", "merc_armor": "&", "merc_boots": "&", "merc_dagger": "&", "merc_sword": "&", "mgear": "events/mgear1", "mh_sword1": "events/&", "mh_sword2": "events/&", "mh_sword3": "events/&", "mhelmet17": "miqmhelmet17", "mhelmetzh13": "&", "mhelmv1": "events/&", "mhelmv2": "events/&", "mhelmv3": "events/&", "mif_hboots": "&", "mif_hhelmet": "&", "mif_lboots": "&", "mif_lhelmet": "&", "mif_light": "&", "mif_staff": "&", "mif_sword": "&", "miff_plate": "&", "mir_am1": "events/&", "mir_am2": "events/&", "mir_am3": "events/&", "mir_armor1": "events/&", "mir_armor2": "events/&", "mir_armor3": "events/&", "mir_boots1": "events/&", "mir_boots2": "events/&", "mir_boots3": "events/&", "mir_cl1": "events/&", "mir_cl2": "events/&", "mir_cl3": "events/&", "mir_helmt1": "events/&", "mir_helmt2": "events/&", "mir_helmt3": "events/&", "mir_shld1": "events/&", "mir_shld2": "events/&", "mir_shld3": "events/&", "mirror": "events/&", "mm_staff": "&", "mm_sword": "&", "mmmring16": "&", "mmzamulet13": "&", "mmzamulet16": "&", "molot_tan": "&", "mring19": "meqmring19", "msphere": "events/&", "mstaff10": "&", "mstaff13": "&", "mstaff8": "&", "mtcloak1": "other/&", "mtcloak2": "other/&", "mtcloak3": "other/&", "myhelmet15": "&", "n_amul": "nset/&", "n_armor": "nset/&", "n_boots": "nset/&", "n_clk": "nset/&", "n_helmet": "nset/&", "n_ringa": "nset/&", "n_ringd": "nset/&", "n_shield": "nset/&", "n_sword": "nset/&", "necr_amulet": "&", "necr_helm": "&", "necr_robe": "necr_cloak", "necr_staff": "&", "necrohelm1": "&", "necrohelm2": "&", "necrohelm3": "&", "necrwar1st": "&", "necrwar2st": "&", "necrwar3st": "&", "necrwar4st": "&", "necrwar5st": "&", "nefrit1": "events/nefrit_1", "nefrit2": "events/nefrit_2", "nefrit3": "events/nefrit_3", "neut_amulet": "sh/sh_amulet", "neut_ring": "events/forest_ring", "nv_body": "bwar/&", "nv_boot": "bwar/&", "nv_helm": "bwar/&", "nv_shield": "bwar/&", "nv_weap": "bwar/&", "obereg": "events/&", "ocean_boots1": "events/&", "ocean_boots2": "events/&", "ocean_boots3": "events/&", "ocean_bw1": "events/&", "ocean_bw2": "events/&", "ocean_bw3": "events/&", "ocean_cl1": "events/&", "ocean_cl2": "events/&", "ocean_cl3": "events/&", "ocean_dgr1": "events/&", "ocean_dgr2": "events/&", "ocean_dgr3": "events/&", "ocean_eye1": "events/&", "ocean_eye2": "events/&", "ocean_eye3": "events/&", "ocean_hlm1": "events/&", "ocean_hlm2": "events/&", "ocean_hlm3": "events/&", "ocean_m_shield1": "events/m_shield1", "ocean_m_shield2": "events/m_shield2", "ocean_m_shield3": "events/m_shield3", "ocean_per1": "events/&", "ocean_per2": "events/&", "ocean_per3": "events/&", "ocean_ring1": "events/&", "ocean_ring2": "events/&", "ocean_ring3": "events/&", "ocean_sword1": "events/&", "ocean_sword2": "events/&", "ocean_sword3": "events/&", "ogre_bum": "&", "ogre_helm": "&", "orc_axe": "&", "orc_hat": "&", "ord_dark": "events/order_dark", "ord_light": "events/order_light", "order_griffin": "events/&", "order_manticore": "events/&", "p_amulet1": "pirate_event/&", "p_amulet2": "pirate_event/&", "p_amulet3": "pirate_event/&", "p_boots1": "pirate_event/&", "p_boots2": "pirate_event/&", "p_boots3": "pirate_event/&", "p_cloak1": "pirate_event/&", "p_cloak2": "pirate_event/&", "p_cloak3": "pirate_event/&", "p_compas1": "pirate_event/p_compass1", "p_compas2": "pirate_event/p_compass2", "p_compas3": "pirate_event/p_compass3", "p_dag1": "events/&", "p_dag2": "events/&", "p_dag3": "events/&", "p_pistol1": "pirate_event/&", "p_pistol2": "pirate_event/&", "p_pistol3": "pirate_event/&", "p_sword1": "pirate_event/&", "p_sword2": "pirate_event/&", "p_sword3": "pirate_event/&", "paladin_armor": "kwar/hc_armor", "paladin_boots": "kwar/hc_boots", "paladin_bow": "kwar/hc_crossbow", "paladin_helmet": "kwar/hc_helmet", "paladin_shield": "kwar/hc_shield", "paladin_sword": "kwar/hc_sword", "pegaskop": "event/&", "pen": "&", "pen_2011y_clan": "pen", "pend_a1": "events/&", "pend_a2": "events/&", "pend_a3": "events/&", "pika": "&", "pir_armor1": "pirate_event/&", "pir_armor2": "pirate_event/&", "pir_armor3": "pirate_event/&", "piratehat1": "pirate_event/&", "piratehat2": "pirate_event/&", "piratehat3": "pirate_event/&", "piring1": "pirate_event/&", "piring2": "pirate_event/&", "piring3": "pirate_event/&", "pit_sword1": "events/&", "pit_sword2": "events/&", "pn_ring1": "pirate_event/&", "pn_ring2": "pirate_event/&", "pn_ring3": "pirate_event/&", "polk__helm1": "&", "polk__helm2": "&", "polk__helm3": "&", "polk_armor1": "events/&", "polk_armor2": "events/&", "polk_armor3": "events/&", "polk_sword1": "events/&", "polk_sword2": "events/&", "polk_sword3": "events/&", "polkboots1": "events/&", "polkboots2": "events/&", "polkboots3": "events/&", "potion01": "potions/zel0001", "potion02": "potions/zel0002", "potion03": "potions/zel0003", "potion04": "potions/zel0004", "potion05": "potions/zel0005", "potion06": "potions/zel0006", "potion07": "potions/zel0007", "potion08": "potions/zel0008", "pouch": "events/&", "power_pendant": "&", "power_sword": "&", "powercape": "&", "powerring": "&", "protazan": "gifts/&", "quest_pendant1": "other/&", "r_bigsword": "ranger/&", "r_bootsmb": "ranger/&", "r_bow": "ranger/&", "r_clck": "ranger/&", "r_dagger": "ranger/&", "r_goodscroll": "ranger/&", "r_helmb": "ranger/&", "r_m_amulet": "ranger/&", "r_magicsring": "ranger/&", "r_magy_staff": "ranger/&", "r_warring": "ranger/&", "r_warriorsamulet": "ranger/&", "r_zarmor": "ranger/&", "ramul1": "events/&", "ramul2": "events/&", "rarmor1": "events/&", "rarmor2": "events/&", "rashness_ring": "hastering", "raxe1": "events/&", "raxe2": "events/&", "rboots1": "events/&", "rboots2": "events/&", "rbow1": "events/&", "rbow2": "events/&", "rcloak1": "events/&", "rcloak2": "events/&", "rdagger1": "events/&", "rdagger2": "events/&", "requital_sword": "requitalsword", "rhelm1": "events/&", "rhelm2": "events/&", "ring19": "rarring19", "ring2013": "snake_ring", "ring_of_thief": "thief_ring", "robewz15": "&", "rog_demon": "&", "rogring1": "events/&", "rogring2": "events/&", "roses": "gifts/&", "round_shiled": "roundshield", "rshield1": "events/&", "rshield2": "events/&", "rsword1": "events/&", "rsword2": "events/&", "ru_statue": "ruru9", "runkam": "events/&", "s_shield": "&", "samul14": "samul141", "samul17": "warsamul17", "samul8": "samul81", "sandglass": "events/&", "sarmor13": "&", "sarmor16": "brsarmor16", "sarmor9": "&", "sboots12": "&", "sboots16": "nmsboots16", "sboots9": "&", "scloack16": "mascloack16", "scloack8": "&", "scoutcloack": "cloack", "scroll18": "shhscroll18", "sea_trident": "trident", "sh_4arrows": "sh/&", "sh_amulet2": "sh/&", "sh_armor": "sh/&", "sh_boots": "sh/&", "sh_bow": "sh/&", "sh_cloak": "sh/&", "sh_helmet": "sh/&", "sh_ring1": "sh/&", "sh_ring2": "sh/&", "sh_shield": "sh/&", "sh_spear": "sh/&", "sh_sword": "sh/&", "sharik": "ny2014/&", "shelm12": "&", "shelm16": "umshelm16", "shelm8": "&", "shield13": "&", "shield16": "&", "shield19": "sioshield19", "shield_14y": "14shield", "shieldofforest": "events/&", "shoe_of_initiative": "initboots", "shortbow": "&", "shpaga": "&", "skill_book11": "other/skill_book", "slayersword": "&", "smamul14": "&", "smamul17": "sekmamul17", "smring10": "&", "smring17": "masmring17", "smstaff16": "ssmstaff16", "sniperbow": "event/&", "sor_staff": "&", "soul_cape": "soulcape", "sph1": "events/&", "sph2": "events/&", "sph3": "events/&", "sring10": "&", "sring17": "fgsring17", "sring4": "&", "sshield11": "&", "sshield14": "zpsshield14", "sshield17": "esshield17", "sshield5": "&", "ssword10": "&", "ssword13": "&", "ssword16": "szzsword16", "ssword8": "&", "staff": "&", "staff18": "smmstaff18", "staff_v1": "events/&", "staff_v2": "events/&", "staff_v3": "events/&", "stalker_aml1": "events/&", "stalker_aml2": "events/&", "stalker_aml3": "events/&", "stalker_armour1": "events/&", "stalker_armour2": "events/&", "stalker_armour3": "events/&", "stalker_boot1": "events/&", "stalker_boot2": "events/&", "stalker_boot3": "events/&", "stalker_cl1": "events/&", "stalker_cl2": "events/&", "stalker_cl3": "events/&", "stalker_crsb1": "events/&", "stalker_crsb2": "events/&", "stalker_crsb3": "events/&", "stalker_dagger1": "events/&", "stalker_dagger2": "events/&", "stalker_dagger3": "events/&", "stalker_hlm1": "events/&", "stalker_hlm2": "events/&", "stalker_hlm3": "events/&", "stalker_shid1": "events/&", "stalker_shid2": "events/&", "stalker_shid3": "events/&", "stalkercl": "event/&", "statue": "events/&", "steel_blade": "steelsword", "steel_boots": "&", "steel_helmet": "&", "student_armor": "quests/&", "sumka": "events/&", "sun_armor": "&", "sun_boots": "&", "sun_helm": "&", "sun_ring": "&", "sun_staff": "&", "sunart1": "&", "sunart2": "&", "sunart3": "&", "sunart4": "&", "super_dagger": "&", "surv_armorsu": "survarts/&", "surv_axes": "survarts/&", "surv_bootsurv": "survarts/&", "surv_cloacksrv": "survarts/&", "surv_crossbowsurv": "survarts/&", "surv_daggermd": "survarts/&", "surv_halberdzg": "survarts/&", "surv_helmetpi": "survarts/&", "surv_mamulka": "survarts/&", "surv_marmoroz": "survarts/&", "surv_mbootsbb": "survarts/&", "surv_mcloacksv": "survarts/&", "surv_mhelmetcv": "survarts/&", "surv_mring1fd": "survarts/&", "surv_mring2fpg": "survarts/&", "surv_scrollcd": "survarts/&", "surv_shieldvv": "survarts/&", "surv_staffik": "survarts/&", "surv_sword2sd": "survarts/&", "surv_sword_surv": "survarts/&", "surv_wamuletik": "survarts/&", "surv_wring1my": "survarts/&", "surv_wring2o": "survarts/&", "sv_arb": "bwar/&", "sv_body": "bwar/&", "sv_boot": "bwar/&", "sv_helm": "bwar/&", "sv_shield": "bwar/&", "sv_weap": "bwar/&", "sword18": "smasword18", "sword5": "&", "tact1w1_wamulet": "tact/&", "tact765_bow": "tact/&", "tactaz_axe": "tact/&", "tactcv1_armor": "tact/&", "tactdff_shield": "tact/&", "tacthapp_helmet": "tact/&", "tactmag_staff": "tact/&", "tactms1_mamulet": "tact/&", "tactpow_cloack": "tact/&", "tactsm0_dagger": "tact/&", "tactspw_mring": "tact/&", "tactwww_wring": "tact/&", "tactzl4_boots": "tact/&", "taskaxe": "event/&", "testring": "&", "thief_arb": "&", "thief_cape": "&", "thief_fastboots": "thief_boots", "thief_goodarmor": "thief_armor", "thief_ml_dagger": "thief_dagger", "thief_msk": "thief_mask", "thief_neckl": "thief_amulet", "thief_paper": "&", "thief_premiumring1": "medals/&", "thief_premiumring2": "medals/&", "thief_premiumring3": "medals/&", "tj-shield1": "&", "tj-shield2": "&", "tj-shield3": "&", "tj_helmet1": "&", "tj_helmet2": "&", "tj_helmet3": "&", "tj_magam1": "events/&", "tj_magam2": "events/&", "tj_magam3": "events/&", "tj_mtuf1": "events/&", "tj_mtuf2": "events/&", "tj_mtuf3": "events/&", "tj_vboots1": "&", "tj_vboots2": "&", "tj_vboots3": "&", "tjam1": "&", "tjam2": "&", "tjam3": "&", "tjarmor1": "&", "tjarmor2": "&", "tjarmor3": "&", "tl_medal1": "tiger_gold", "tl_medal2": "tiger_silver", "tl_medal3": "tiger_bronze", "tm_amulet": "&", "tm_arb": "&", "tm_armor": "&", "tm_boots": "&", "tm_cape": "&", "tm_knife": "&", "tm_mring": "&", "tm_msk": "tm_mask", "tm_wring": "&", "tmarmor1": "events/&", "tmarmor2": "events/&", "tmarmor3": "events/&", "topor_drov": "events/&", "topor_skelet": "&", "torg_boots": "events/&", "totem1": "events/&", "totem2": "events/&", "totem3": "events/&", "trinitypendant": "other/rogue_pendant", "trogloditkop": "event/&", "ttring": "other/&", "tunnel_kirka": "kirka", "v-ring1": "&", "v-ring2": "&", "v-ring3": "&", "v_1armor": "verb/&", "vbolt1": "event/&", "vbolt2": "event/&", "vbolt3": "event/&", "vbow1": "event/&", "vbow2": "event/&", "vbow3": "event/&", "ve_helm": "verb/&", "venok": "gifts/&", "verb11_sword": "verb/&", "verbboots": "verb/&", "verve_ring": "eaglering", "vmring1": "events/mring1", "vmring2": "events/mring2", "vmring3": "events/mring3", "vrb_shild": "verb/&", "vrdagger1": "events/&", "vrdagger2": "events/&", "vrdagger3": "events/&", "vscroll-1": "events/vscroll1", "vscroll-2": "events/vscroll2", "vscroll-3": "events/vscroll3", "vtjcloak1": "other/&", "vtjcloak2": "other/&", "vtjcloak3": "other/&", "vtmaxe1": "events/&", "vtmaxe2": "events/&", "vtmaxe3": "events/&", "vtmsword1": "events/&", "vtmsword2": "events/&", "vtmsword3": "events/&", "wanderer_armor1": "events/&", "wanderer_armor2": "events/&", "wanderer_armor3": "events/&", "wanderer_hat1": "events/&", "wanderer_hat2": "events/&", "wanderer_hat3": "events/&", "warmor": "gifts/&", "warring13": "&", "warrior_pendant": "&", "warriorring": "&", "warthief_medal1": "medals/&", "warthief_medal2": "medals/&", "warthief_medal3": "medals/&", "warthief_medal4": "medals/&", "warthief_medal5": "medals/&", "wboots": "gifts/&", "welfarmor": "kwar/ew_armor", "welfboots": "kwar/ew_bootshields", "welfbow": "kwar/ew_bow", "welfhelmet": "kwar/ew_helmet", "welfshield": "kwar/ew_shield", "welfsword": "kwar/ew_sword", "whelmet": "gifts/&", "wind_armor": "&", "wind_boots": "&", "wind_helm": "&", "windsword": "event/&", "wiz_boots": "&", "wiz_cape": "&", "wiz_robe": "mage_robes", "wizard_cap": "magehat", "wolfjacket": "&", "wood_sword": "woodensword", "wshield": "&", "wwwring16": "&", "wzzamulet13": "&", "wzzamulet16": "&", "xymhelmet15": "&", "znak1": "events/znak0001", "znak2": "events/znak0002", "znak3": "events/znak0003", "znak4": "events/znak0004", "znak5": "events/znak0005", "znak6": "events/znak0006", "znak7": "events/znak0007", "znak8": "events/znak0008", "znak9": "events/znak0009", "znamya1": "events/&", "znamya2": "events/&", "zub": "&", "zxhelmet13": "&", }; // ==================== [[ UTILS ]] const $ = (selector, ctx = document) => ctx.querySelector(selector); const $$ = (selector, ctx = document) => [...ctx.querySelectorAll(selector)]; const formatNum = (num) => num.toLocaleString('en'); function parseNode(html, callback) { let elem = document.createElement('div'); elem.innerHTML = html; elem = elem.firstElementChild.cloneNode(true); callback && callback.call(elem, elem); return elem; } function fetch({ url, method = 'GET', type = 'document', body = null }) { return new Promise(resolve => { const xhr = new XMLHttpRequest(); xhr.open(method, url); xhr.responseType = type; xhr.onload = () => resolve(xhr.response); xhr.send(body); }); } fetch.get = (url) => fetch({ url }); fetch.post = (url, data) => fetch({ url, method: 'POST', body: data }); // ==================== [[ CSS ]] parseNode('<style></style>', function() { this.append(/*css*/` @charset "utf-8"; #hwm_no_zoom { display: none !important; } .container { font-family: Verdana, Arial, sans-serif; font-size: 14px; min-width: 420px; max-width: 1200px; position: relative; margin: 1em auto; padding: 1em; text-align: left; color: #592c08; overflow: hidden; user-select: none; box-sizing: border-box; } main *, main *::before, main *::after { margin: 0; padding: 0; box-sizing: border-box; } main input, main button { font: inherit; color: inherit; outline: none; } /* section */ .section { width: 49%; max-width: 38em; position: relative; float: right; background-color: #e4e4e4; outline: 2px solid #aaa; outline-offset: 1px; } .section:first-child { float: left; z-index: 2; } .section[disabled], [data-state~="locked"] .section { filter: grayscale(.8); pointer-events: none; } .section__heading { font-size: 1.2em; font-weight: bold; line-height: 3.5; position: relative; margin-bottom: 1px; text-align: center; text-transform: uppercase; letter-spacing: 1px; background-color: white; border: 1px solid #ccc; overflow: hidden; } .section__heading::before, .section__heading::after { content: "—"; font-weight: normal; padding: 0 .6em; opacity: .6; } /* block */ .block { counter-reset: options; max-height: 3em; position: relative; margin-bottom: 1px; border: 1px solid #ccc; overflow: hidden; transition: max-height .4s; } .block:last-child { margin-bottom: 0; } .block[data-shown="1"] { max-height: 25em; } .block-res[data-shown="1"] { max-height: 10em; } .block-elements[data-shown="1"] { max-height: 17em; } .block::after { content: "[" counter(options) "]"; min-width: 4em; line-height: 3em; position: absolute; left: 0; top: 0; text-align: center; color: brown; border-right: 1px solid #bbb; pointer-events: none; } .block__title { height: 3em; line-height: 3em; padding: 0 .6em 0 4.5em; color: #2c5061; background-color: #e8e8e8; text-transform: uppercase; overflow: hidden; cursor: pointer; } .block__title:hover, [data-shown="1"] > .block__title { background-color: #ddd; } .block__title::after { content: "+"; float: right; } [data-shown="1"] > .block__title::after { content: "-"; } /* select */ .select { display: flex; flex-wrap: wrap; max-height: 22em; background-color: #f6f6f6; outline: 1px solid #ccc; overflow-x: hidden; overflow-y: auto; scrollbar-width: thin; } .select:empty { display: none; } .select::-webkit-scrollbar { width: 6px; background-color: #eee; } .select::-webkit-scrollbar-thumb { background-color: #ccc; } .select::-webkit-scrollbar-thumb:hover { background-color: #aaa; } .select::-webkit-scrollbar-thumb:active { background-color: gray; } /* options */ .option { counter-increment: options; flex: 1 1 50%; line-height: 2.2em; padding: 0 .4em; background-color: inherit; box-shadow: 0 0 0 1px #ccc; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .option[style] { text-indent: 2.5em; background-repeat: no-repeat; background-position: .4em 50%; background-size: 25px; } .select-res .option { background-size: 24px; } .select-arts .option { flex: 1 1 100%; } .option:hover { background-color: #f6efda; } .option.__selected { background-color: #f8e9bb; pointer-events: none; } .option[data-amount="0"] { color: gray; background-color: #e8e8e8; filter: grayscale(1); pointer-events: none; } .option::before { content: "(" attr(data-amount) ")"; font-size: .9em; float: right; margin-left: .5em; color: #900; } /* form */ .form { background-color: #f6f6f6; border: 1px solid #ccc; } .form-lot { width: 50px; height: 50px; position: absolute; left: .2em; top: 0; bottom: 0; margin: auto; background: no-repeat center / contain; outline: none; } .form__row { display: flex; position: relative; background-color: inherit; border-top: 1px solid #ddd; } .form__row:first-child { border-top: none; } .form__row:last-child { justify-content: flex-end; } .form__cell { width: 50%; min-height: 2.5em; line-height: normal; display: flex; align-items: center; position: relative; padding: 0 .5em; background-color: inherit; outline: 1px solid #ddd; white-space: nowrap; } .form__name { color: #c9870e; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .form__btn { position: relative; text-align: center; color: #555; background-color: #f3e9d1; border: 2px solid #999; border-color: #999 #666 #777 #999; cursor: pointer; } .form__btn:hover, .form__btn:focus { color: #753e3e; background-color: #eadec0; } .form__btn:active { left: 1px; top: 1px; } .form__type { min-width: 5em; padding: .2em; margin-left: .5em; } [data-form*="type=1"] .form__type:first-child, [data-form*="type=2"] .form__type:last-child { background-color: white; border-color: #2aa4d6; pointer-events: none; } .form__input { user-select: auto; } .form__input[type="range"] { cursor: pointer; } .form__count[max="0"], [data-form*="cat=parts"] .form__count { opacity: .7; filter: grayscale(.7); pointer-events: none; } .form__input[type="number"] { font-size: .9em; padding: 2px; background-color: white; border: 1px solid #999; } .form__input[type="number"]:hover, .form__input[type="number"]:focus { background-color: #fff9f1; border-color: #69a0d1; outline: 1px solid skyblue; } .form__input[type="number"]:invalid { outline: 1px solid #d54e4e; box-shadow: 0 0 4px #e7a4b0; } .form[data-form*="type=1"] .form__blizprice { color: gray; background-color: #ddd; border-color: #999; outline: none; pointer-events: none; } .form__output { line-height: normal; position: absolute; left: 100%; top: .3em; margin-left: 1em; padding: .3em; color: #666; background-color: #eee; outline: 2px solid #aaa; white-space: nowrap; opacity: 0; transition: opacity .2s; pointer-events: none; z-index: 2; } .form__output:empty, [data-state~="locked"] .form__output { visibility: hidden; } .form__input:hover + span, .form__input:focus + span { opacity: 1; transition-delay: .15s; } .form__input[type="number"] + span::after { content: ""; width: 22px; height: 22px; margin-left: 3px; display: inline-block; vertical-align: middle; background: url("https://dcdn.heroeswm.ru/i/r/48/gold.png") center / cover; } .form__send { margin: .5em; padding: .5em 1em; } .container[data-state~="locked"] .form__btn { color: gray; background-color: #ddd; border-color: #aaa #bbb #bbb #aaa; pointer-events: none; } .container:not([data-state~="locked"]) .form__btn::after { content: ""; position: absolute; top: 2px; right: 2px; bottom: 2px; left: 2px; border: 1px dashed #999; } @keyframes aucPriceLoading { to { background-position: -150% 0; } } .form__send.__loading::before { content: ""; position: absolute; left: 0; right: 0; top: 0; bottom: 0; background: linear-gradient(120deg, transparent 20%, white 50%, transparent 80%); background-size: 150% 100%; background-position: 150% 0; animation: aucPriceLoading .7s linear infinite; } [data-form*="cat=stuff"] #auc-price-btn { display: none; } .parts-alert { display: none; position: absolute; left: 0; top: 1em; padding: 0 .5em; cursor: help; z-index: 2; } [data-form*="cat=parts"] .parts-alert { display: block; } .parts-alert:hover::after { content: "Вы продаете 20 частей, но покупатель получит только одну; 19 частей списывается как комиссия."; font-size: .9em; width: 18em; position: absolute; left: 100%; bottom: -.8em; padding: .2em .4em; margin-left: 1em; color: gray; background-color: white; outline: 2px solid #aaa; box-shadow: 0 0 4px; pointer-events: none; } /* status */ @keyframes aucStatusSpin { to { transform: rotate(1turn); } } .form-status { font-size: 1.4em; font-weight: bold; line-height: 2.5; position: absolute; top: 0; bottom: 0; right: .4em; margin: auto; color: #519551; opacity: 0; transition: opacity 1s 1s; } [data-state~="process"] .form-status { width: .8em; height: .8em; border: 3px solid gray; border-top-color: transparent; border-radius: 50%; opacity: 1; transition: none; animation: aucStatusSpin .8s linear infinite; } [data-state="success"] .form-status::before { content: "✓"; } /* alert */ .alert { font-size: 1.1em; position: fixed; top: 0; right: 0; bottom: 0; left: 0; background-color: rgba(127, 127, 127, .7); opacity: 0; visibility: hidden; transition: opacity .4s, visibility .4s; z-index: 999; } .alert.__shown { opacity: 1; visibility: visible; } .alert__inner { max-width: 40em; margin: auto; padding: 1em; color: #eee; background-color: #444; border: 1px solid gray; border-top: none; box-shadow: 0 0 6px #666; overflow: hidden; transform: perspective(50em) rotateX(-40deg); transform-origin: 50% 0; transition: transform .3s ease-out; } .alert.__shown .alert__inner { transform: perspective(50em) rotateX(0); } .alert__content { line-height: 1.5; padding: 1em; margin-bottom: 1em; text-align: center; background-color: #555; border: 1px dashed gray; } .alert__content a { font: inherit; color: tan; text-decoration: underline; } .alert__content a:hover, .alert__content a:focus { color: #a4d4e7; } .alert__btn { float: right; padding: .4em 2em; text-align: center; color: #eee; background-color: #8a766f; border: 1px solid #bbb; outline: 1px solid #444; outline-offset: -3px; cursor: pointer; } .alert__btn:hover { background-color: #9e8c86; } .alert__btn:focus { border-color: #dabe99; } @media screen and (max-width: 1100px) { .section { width: 100%; max-width: none; float: none; } .section:first-child { float: none; margin-bottom: 1em; } .form__cell { width: auto; outline: none; } } `.replaceAll(' '.repeat(6), '')); document.head.append(this); }); // ========================= if (document.readyState === 'loading') { await new Promise(resolve => { view.addEventListener('load', resolve, { once: true }); document.addEventListener('DOMContentLoaded', resolve, { once: true }); }); } // ========================= let locked = 0; const hwmSelect = $('#sel'); const sections = [...hwmSelect.options].reduce((that, option) => { const key = option.value; if (!key) return that; const value = option.textContent; const cat = key.startsWith('EL_') ? 'elements' : key.startsWith('ART') ? 'parts' : /^(share|cert|dom)/i.test(key) ? 'stuff' : key.includes('@') ? 'arts' : 'res'; that[cat] = [...(that[cat] || []), [key, value]]; return that; }, {}); const sectionsRus = { res: 'ресурсы', elements: 'элементы гн', arts: 'артефакты', parts: 'части артефактов', stuff: 'дома, акции, сертификаты' }; const resKeys = 'wood ore mercury sulphur crystal gem'.split(' '); const elementsData = { EL_37: 'meteorit', EL_38: 'badgrib', EL_39: 'wind_flower', EL_40: 'fire_crystal', EL_41: 'witch_flower', EL_42: 'abrasive', EL_43: 'snake_poison', EL_44: 'ice_crystal', EL_45: 'moon_stone', EL_46: 'tiger_tusk', EL_78: 'fern_flower' }; const container = parseNode(/*html*/` <main class="container"> <section class="section" disabled> <div class="section__heading"> <a class="form-lot" href="#"></a> Форма продажи <span class="form-status"></span> </div> <div class="form" data-form="type=1"></div> </section> <section class="section"> <div class="section__heading">Выбор товара</div> </section> <section class="alert"> <div class="alert__inner"> <div class="alert__content"></div> <button class="alert__btn">OK</button> </div> </section> </main> `); const formSection = container.firstElementChild; const lotData = ((prev) => ({ target: prev, category: '', href: '#', get amount() { return ~~this.target.dataset.amount; }, get max() { return { res: 50, elements: 10, arts: 3, parts: 20 }[this.category] || 1; }, get id() { return this.target.dataset.id; }, get name() { return this.target.textContent.trim(); }, get imgSrc() { return this.target.style.backgroundImage; }, select() { prev.classList.remove('__selected'); this.target.classList.add('__selected'); prev = this.target; return this; }, fill(data) { return Object.assign(this, data); }, decrease() { const amount = Math.max(0, this.amount - formData.elements.count.value); return this.target.dataset.amount = amount; } }))(document.createElement('div')); const setInputHandlers = ((cache, timeString) => { const time = timeString.split('|'); return function(input, index) { cache.set(input, { index, isRange: input.type === 'range', output: input.nextElementSibling }); input.addEventListener('input', onChange); input.addEventListener('wheel', onWheel); }; function onChange() { if (locked) return; const {value} = this; const {isRange, index, output} = cache.get(this); output.textContent = isRange ? (!index ? value : time[value - 1]) : (value < 1e3 ? +value : formatNum(~~value)); if (index === 1) { const bliz = formData.elements.blizprice; const min = bliz.min = ~~value || 1; if (+bliz.value && bliz.value < min) { bliz.value = min; bliz.nextElementSibling.textContent = formatNum(min); } } if (!this.checkValidity()) this.reportValidity(); } function onWheel(e) { e.preventDefault(); if (locked) return; const factor = e.altKey ? 1e3 : e.ctrlKey ? 100 : e.shiftKey ? 10 : 1; const step = e.deltaY > 0 ? -factor : factor; const min = ~~this.min; const max = ~~this.max || Infinity; const value = Math.max(min, Math.min(step + ~~this.value, max)); this.value = value; onChange.call(this); } })(new Map, '30 мин.|1 час|3 часа|6 часов|12 часов|1 день|2 дня|3 дня'); const formData = ((data) => { const linkElem = $('a', formSection); const formElem = $('.form', formSection); const elems = createFormElems(formElem); const inputs = Object.values(elems).filter(el => el.tagName === 'INPUT'); const priceElems = [ elems.price.parentNode.previousElementSibling, elems.price ]; function setPriceText(value) { priceElems[0].textContent = `${value}:`; priceElems[1].placeholder = `${value}...`; } function updateFormDataset() { const val = Object.entries(data).map(entry => entry.join('=')).join('&'); formElem.dataset.form = val; } inputs.forEach(setInputHandlers); return { get type() { return data.type; }, get isValid() { return inputs.every((el, i) => el.value > 0 || i === 2); }, elements: elems, overflow(test) { if (!test) return; locked = 1; this.setState('locked'); elems.submit.classList.remove('__loading'); userAlert.show( 'Достигнут максимум лотов на <a href="/auction.php">рынке</a>.' ); userAlert.bind(() => { locked = 0; this.setState(''); }); return true; }, setType(type) { data.type = type; updateFormDataset(); return this; }, setCat(cat) { data.cat = cat; updateFormDataset(); return this; }, setName() { elems.name.textContent = lotData.name; return this; }, setImg() { linkElem.setAttribute('href', lotData.href); linkElem.style.backgroundImage = lotData.imgSrc; return this; }, setState(value) { container.dataset.state = value; return this; }, process() { locked = 1; this.setState('locked process'); xForm.submit(); return this; }, refresh() { const countEl = elems.count; const output = countEl.nextElementSibling; let value = countEl.value >> 0; let {amount, max} = lotData; if (max === 20) { countEl.max = max; output.textContent = countEl.value = (amount < max ? 0 : max); setPriceText('Цена за все части'); return this; } if (this.type === 2) { max = 1; setPriceText('Начальная цена'); } else { setPriceText('Цена за единицу'); } if (!amount) value = max = 0; else if (max > amount) max = amount; if (value) value = max === 1 ? 1 : Math.min(value, amount); countEl.max = max; output.textContent = countEl.value = value; return this; } }; })({ type: 1 }); function createFormElems(form) { const entries = [ [ 'name', 'Наименование', `<div class="@">Выберите товар</div>` ], [ 'type', 'Тип продажи', ` <button class="form__btn @">Сразу</button><button class="form__btn @">Торги</button>` ], [ 'count', 'Кол-во', ` <input class="form__input @" type="range" min="0" max="1" value="0"><span class="form__output"></span>` ], [ 'price', 'Цена за единицу', ` <input class="form__input @" type="number" min="1" placeholder="Цена за единицу..."><span class="form__output"></span>` ], [ 'blizprice', 'Блиц-цена', ` <input class="form__input @" type="number" min="1" placeholder="Блиц-цена..."><span class="form__output"></span>` ], [ 'duration', 'Продолжительность торгов', ` <input class="form__input @" type="range" min="1" max="8" value="1"><span class="form__output"></span>` ] ]; const elements = entries.reduce((that, entry) => { that[entry[0]] = createFormRow.call(form, ...entry); return that; }, {}); elements.submit = form.appendChild(parseNode(/*html*/` <div class="form__row"> <span class="parts-alert">❗</span> <button class="form__btn form__send" id="auc-price-btn"> <span style="position: relative;">Узнать цену</span> </button> <button class="form__btn form__send form__submit"> <span style="position: relative;">Выставить на рынок</span> </button> </div> `)).lastElementChild; return elements; } function createFormRow(key, name, html) { html = html.replaceAll('@', `form__${key}`); const createCell = (val) => `<div class="form__cell">${val}</div>`; const rowHTML = [`${name}:`, html].map(createCell).join(''); const row = parseNode(`<div class="form__row">${rowHTML}</div>`); this.appendChild(row); return row.lastChild.firstElementChild; } const xForm = { submit() { const elems = formData.elements; const data = new FormData(); data.append('item', lotData.id); data.append('count', elems.count.value); data.append('atype', formData.type); data.append('price', ~~elems.price.value); if (formData.type === 2) { data.append('bliz_price', ~~elems.blizprice.value); } data.append('duration', elems.duration.value); fetch.post(PATH, data).then(this.send.bind(this)); }, async send(doc) { const check = (cb = Function.prototype) => { const text = $('#hwm_no_zoom', doc).textContent; if (formData.overflow(text.includes('максимальное'))) return cb(); if (text.includes('Неверные данные')) return this.wrong(); return true; }; if (!check()) return; const form = doc.forms.anl_form_ok || doc.forms[0]; if (!(form && $('[type="submit"][onclick]', form))) return this.error(); doc = await fetch.post(form.action, new FormData(form)); if (!check(this.error)) return; locked = 0; const amount = lotData.decrease(); if (amount && lotData.category === 'arts') { fetch.get(PATH).then(this.resetId); } formData.elements.submit.classList.remove('__loading'); formData.setState('success').refresh(); }, resetId(doc) { const {id, name} = lotData; const amountReg = /\s\((\d+).+$/; const oldOption = $(`.option[data-id="${id}"]`, container); const newOption = $$('#sel > option', doc).find(el => { return el.value.includes('@') && name === el.textContent.replace(amountReg, ''); }); if (newOption) lotData.target.dataset.id = newOption.value; }, error() { locked = 0; formData.setState(''); userAlert.show('Что-то пошло не так.'); formData.elements.submit.classList.remove('__loading'); }, wrong() { this.error(); userAlert.show('Неверные данные.'); } }; const setImage = ((path) => { const fixedRes = { sulphur: 'sulfur', crystal: 'crystals', gem: 'gems' }; const stuff = { share: `${path}obj_share_pic.png`, cert: `${path}house_cert.jpg`, dom: `${path}auc_dom.gif` }; const srcData = { res: id => `${path}r/48/${fixedRes[id] || id}.png`, elements: id => `${path}gn_res/${elementsData[id]}.png`, parts: id => `${path}artifacts/parts/part_${id.replace(/^artpart_/i, '')}.png`, stuff: id => stuff[id.toLowerCase().match(/[^_]+/)[0]] }; function setArtImg(style, id) { const name = (allArtsData[id] || '').replace('&', id); if (name) style.backgroundImage = `url("${path}artifacts/${name}.png")`; } return function(elem, key, id) { if (key === 'arts') return setArtImg(elem.style, id.split('@')[0]); elem.style.backgroundImage = `url("${srcData[key](id)}")`; }; })('https://dcdn.heroeswm.ru/i/'); // ========================= container.addEventListener('click', (e) => { if (locked) return; const trg = e.target; if (trg === formData.elements.submit) { if (!lotData.amount) { return userAlert.show('Данный лот помножен на ноль.'); } if (!formData.isValid) { return userAlert.show('Проверьте форму на корректность.'); } trg.classList.add('__loading'); return formData.process(); } if (trg.matches('.block__title')) return toggleBlock.call(trg.parentNode); if (trg.matches('.option')) return selectOption.call(trg); if (trg.matches('.form__type')) { const ind = [...trg.parentNode.children].indexOf(trg); return formData.setType(ind + 1).refresh(); } }); container.children[1].innerHTML += Object.keys(sections).map(key => { return /*html*/` <div class="block block-${key}"> <div class="block__title">${sectionsRus[key]}</div> ${createSelectHTML(key)} </div>`; }).join(''); function createSelectHTML(key) { const amountReg = /\s\((\d+).+$/; const innerHTML = sections[key].map(([id, value]) => { const amount = (value.match(amountReg) || '')[1]; const datasetRaw = `data-id="${id}" data-amount="${amount || 1}"`; let html = !amount ? value : value.replace(amountReg, ''); if (key === 'arts') html = html.replace(' [i]', ''); else if (key === 'parts') html = html.slice(7, -1); return `<div class="option" ${datasetRaw}>${html}</div>`; }).join(''); return `<div class="select select-${key}">${innerHTML}</div>`; } function toggleBlock() { this.dataset.shown ^= 1; if (this.__loaded) return; this.__loaded = true; const cat = this.className.match(/\w+$/)[0]; const options = [...this.lastElementChild.children]; options.forEach(opt => setImage(opt, cat, opt.dataset.id)); } function selectOption() { const {id} = this.dataset; const category = this.parentNode.className.match(/\w+$/)[0]; const href = { res: `/auction.php?cat=res&type=${resKeys.indexOf(id) + 1}`, elements: `/auction.php?cat=elements&art_type=${elementsData[id]}`, arts: `/art_info.php?id=${id.slice(0, id.indexOf('@'))}`, parts: `/auction.php?cat=part&art_type=part_${id.slice(8)}`, }[category] || '#'; formSection.removeAttribute('disabled'); lotData.fill({ target: this, href, category }).select(); formData.setImg().setName().setCat(category); if (id.startsWith('SHARE_')) formData.setType(2); formData.refresh(); } // ==================== [[ ALERT ]] const userAlert = ((target) => { const body = $('.alert__content', target); const btn = body.nextElementSibling; let lastActiveElem = null; let onCloseAction = Function.prototype; return { __init__() { document.addEventListener('keydown', ({code}) => { if (code === 'Escape') this.hide(); }); target.addEventListener('click', (e) => { if ([target, btn].includes(e.target)) this.hide(); }); }, show(html = '') { if (!lastActiveElem) lastActiveElem = document.activeElement; body.innerHTML = html; target.classList.add('__shown'); setTimeout(btn.focus.bind(btn), 50); return this; }, hide() { if (lastActiveElem) { lastActiveElem.focus(); lastActiveElem = null; } target.classList.remove('__shown'); onCloseAction(); onCloseAction = Function.prototype; return this; }, bind(action) { onCloseAction = action; } }; })(container.lastElementChild); userAlert.__init__(); // ========================= $('#hwm_no_zoom').closest('table').replaceWith(container); setTimeout(() => formData.overflow(hwmSelect.disabled), 50); // ==================== [[ SHOW PRICE ]] const aucPriceBtn = formData.elements.submit.previousElementSibling; aucPriceBtn.addEventListener('click', async function(e) { e.stopPropagation(); if (locked) return; const {target, category, href} = lotData; if (category === 'stuff') return; this.classList.add('__loading'); let doc = null; let data = null; if (['res', 'elements', 'parts'].includes(category)) { doc = await fetch.get(`${href}&sbn=1&sau=0`); data = findResOnAuc(doc); } else if (category === 'arts') { doc = await fetch.get(href); const art = $('.art_info_left_block a[href*="auction"]', doc); doc = await fetch.get(`${art.href}&sbn=1&sau=0&snew=1`); const dur = target.textContent.match(/\d\/(\d+)/)[1]; data = findArtOnAuc(doc, +dur); } this.classList.remove('__loading'); showLotAlert(data); }); function findResOnAuc(doc) { const elem = $('td.wbwhite tr.wb', doc); if (!elem) return null; const price = $('div[id^="au"]', elem).textContent; return { name: lotData.name, price }; } function findArtOnAuc(doc, artDur) { const cont = $('td.wbwhite', doc); const rows = $$('tr.wb', cont); if (!rows.length) return null; const durReg = /Прочность: (\d+)/; let elem = rows.find(el => { const dur = +el.textContent.match(durReg)[1]; return dur >= artDur; }); if (!elem) elem = rows.pop(); else if (elem !== rows[0]) elem = elem.previousElementSibling; const name = lotData.name.replace(/ \d+\/\d+$/, ''); const price = $('div[id^="au"]', elem).textContent; const dur = elem.textContent.match(durReg)[1]; return { name, price, dur: [dur, dur].join('/') }; } function showLotAlert(data) { if (!data) return userAlert.show('Лоты такого вида отсутствуют на рынке!'); if (data.hasOwnProperty('dur')) data.name += ` [ ${data.dur} ]`; return userAlert.show(/*html*/` <div style="text-align: left;"> <p><b style="color: #e8ddca;">Лот</b>: ${data.name}</p> <p><b style="color: #e8ddca;">Цена</b>: ${data.price}</p> </div> `); } })(document.defaultView);