{"id":849,"date":"2025-12-13T01:58:08","date_gmt":"2025-12-13T01:58:08","guid":{"rendered":"https:\/\/southsunindustries.com\/?page_id=849"},"modified":"2025-12-13T02:01:12","modified_gmt":"2025-12-13T02:01:12","slug":"tinyhaulz-hauling-calculator","status":"publish","type":"page","link":"https:\/\/southsunindustries.com\/index.php\/tinyhaulz-hauling-calculator\/","title":{"rendered":"TinyHaulz | Hauling Calculator"},"content":{"rendered":"\n<!doctype html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"utf-8\" \/>\n  <meta name=\"viewport\" content=\"width=device-width,initial-scale=1\" \/>\n  <title>Hauling Calculator<\/title>\n  <style>\n    body{font-family:system-ui,-apple-system,Segoe UI,Roboto,Arial,sans-serif;max-width:620px;margin:0 auto;padding:24px}\n    h1{margin:0 0 16px;font-size:22px}\n    .card{border:1px solid #ddd;border-radius:14px;padding:16px}\n    .row{display:flex;gap:12px;align-items:center;flex-wrap:wrap;margin:10px 0}\n    label{font-weight:650}\n    input[type=\"number\"]{width:200px;padding:10px;border:1px solid #ccc;border-radius:10px}\n    input[type=\"checkbox\"]{transform:scale(1.1)}\n    .hint{color:#666;font-size:13px}\n    .error{color:#b00020;font-size:13px;display:none;margin-top:6px}\n    .result{margin-top:14px;padding:12px;border-radius:10px;background:#f6f7f8}\n    .big{font-size:20px;font-weight:800}\n    .small{margin-top:6px;color:#666;font-size:13px;line-height:1.35}\n  <\/style>\n<\/head>\n<body>\n  <h1>Route &#8211; Jita &lt;-&gt; UALX-3<\/h1>\n\n  <div class=\"card\">\n    <div class=\"row\">\n      <label for=\"m3\">Cargo (m\u00b3)<\/label>\n      <input id=\"m3\" type=\"number\" min=\"0\" max=\"2500\" step=\"1\" placeholder=\"0\" \/>\n      <span class=\"hint\">(max 2,500 m\u00b3)<\/span>\n    <\/div>\n\n    <div class=\"row\">\n      <input id=\"fastTrack\" type=\"checkbox\" \/>\n      <label for=\"fastTrack\">Fast Track (+50%)<\/label>\n    <\/div>\n\n    <div id=\"error\" class=\"error\"><\/div>\n\n    <div class=\"result\">\n      <div class=\"big\" id=\"total\">Total: 0 ISK<\/div>\n      <div class=\"small\" id=\"breakdown\"><\/div>\n    <\/div>\n  <\/div>\n\n  <script>\n    (function () {\n      \/\/ Rules:\n      \/\/ - Input cargo capped at 2,500 m\u00b3\n      \/\/ - 0 m\u00b3 => 0 ISK\n      \/\/ - 1..500 m\u00b3 => 2,000,000 ISK (minimum price; \"capped at 500m\u00b3\")\n      \/\/ - 501..2,500 m\u00b3 => linear increase up to 3,900,000 ISK at 2,500 m\u00b3\n      \/\/ - Fast Track multiplies total by 1.5 (+50%)\n\n      const MAX_M3 = 2500;\n      const MIN_PRICE = 2_000_000;\n      const MIN_PRICE_CAP_M3 = 500;\n      const MAX_PRICE = 3_900_000;\n\n      const FAST_TRACK_MULT = 1.5;\n\n      const m3El = document.getElementById(\"m3\");\n      const fastEl = document.getElementById(\"fastTrack\");\n      const totalEl = document.getElementById(\"total\");\n      const breakdownEl = document.getElementById(\"breakdown\");\n      const errorEl = document.getElementById(\"error\");\n\n      const fmtISK = (n) =>\n        Math.round(n).toLocaleString(\"en-GB\", { maximumFractionDigits: 0 }) + \" ISK\";\n\n      function basePriceForM3(m3) {\n        if (m3 <= 0) return 0;\n\n        if (m3 <= MIN_PRICE_CAP_M3) return MIN_PRICE;\n\n        \/\/ Linear interpolation from 501..2500:\n        \/\/ price = MIN_PRICE + (m3 - 500) * (MAX_PRICE - MIN_PRICE) \/ (2500 - 500)\n        const spanM3 = MAX_M3 - MIN_PRICE_CAP_M3; \/\/ 2000\n        const t = (m3 - MIN_PRICE_CAP_M3) \/ spanM3; \/\/ 0..1\n        return MIN_PRICE + t * (MAX_PRICE - MIN_PRICE);\n      }\n\n      function calc() {\n        errorEl.style.display = \"none\";\n        errorEl.textContent = \"\";\n\n        let m3 = Number(m3El.value || 0);\n        if (!Number.isFinite(m3) || m3 < 0) m3 = 0;\n\n        if (m3 > MAX_M3) {\n          m3 = MAX_M3;\n          m3El.value = String(MAX_M3);\n          errorEl.textContent = \"Cargo capped at 2,500 m\u00b3.\";\n          errorEl.style.display = \"block\";\n        }\n\n        let base = basePriceForM3(m3);\n        let total = base;\n\n        if (fastEl.checked) total *= FAST_TRACK_MULT;\n\n        totalEl.textContent = \"Total: \" + fmtISK(total);\n\n        let ruleLine = \"\";\n        if (m3 === 0) {\n          ruleLine = \"0 m\u00b3 \u2192 0 ISK.\";\n        } else if (m3 <= MIN_PRICE_CAP_M3) {\n          ruleLine = `1\u2013${MIN_PRICE_CAP_M3.toLocaleString(\"en-GB\")} m\u00b3 \u2192 minimum ${fmtISK(MIN_PRICE)}.`;\n        } else {\n          ruleLine = `501\u20132,500 m\u00b3 scales up to ${fmtISK(MAX_PRICE)} at 2,500 m\u00b3.`;\n        }\n\n        breakdownEl.textContent =\n          `Base: ${fmtISK(base)}${fastEl.checked ? \" \u2022 Fast Track: +50%\" : \"\"} \u2022 ` + ruleLine;\n      }\n\n      m3El.addEventListener(\"input\", calc);\n      fastEl.addEventListener(\"change\", calc);\n      calc();\n    })();\n  <\/script>\n<\/body>\n<\/html>\n\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<!doctype html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"utf-8\" \/>\n  <meta name=\"viewport\" content=\"width=device-width,initial-scale=1\" \/>\n  <title>Hauling Calculator<\/title>\n\n  <style>\n    :root {\n      --bg-main: #0f1115;\n      --bg-card: #1b1f27;\n      --bg-input: #232834;\n      --border: #2f3545;\n      --text-main: #ffffff;\n      --text-muted: #b6bcc9;\n      --accent: #4fa3ff;\n      --error: #ff6b6b;\n    }\n\n    \/* Explicitly ban Comic Sans *\/\n    * {\n      font-family:\n        system-ui,\n        -apple-system,\n        BlinkMacSystemFont,\n        \"Segoe UI\",\n        Roboto,\n        Helvetica,\n        Arial,\n        sans-serif !important;\n    }\n\n    body {\n      background: var(--bg-main);\n      color: var(--text-main);\n      max-width: 640px;\n      margin: 0 auto;\n      padding: 24px;\n    }\n\n    h1 {\n      font-size: 22px;\n      margin: 0 0 18px;\n      font-weight: 700;\n    }\n\n    .card {\n      background: var(--bg-card);\n      border: 1px solid var(--border);\n      border-radius: 14px;\n      padding: 18px;\n    }\n\n    .row {\n      display: flex;\n      align-items: center;\n      gap: 12px;\n      flex-wrap: wrap;\n      margin-bottom: 14px;\n    }\n\n    label {\n      font-weight: 600;\n    }\n\n    input[type=\"number\"] {\n      background: var(--bg-input);\n      color: var(--text-main);\n      border: 1px solid var(--border);\n      border-radius: 10px;\n      padding: 10px;\n      width: 200px;\n    }\n\n    input[type=\"number\"]::placeholder {\n      color: var(--text-muted);\n    }\n\n    input[type=\"checkbox\"] {\n      transform: scale(1.1);\n      accent-color: var(--accent);\n    }\n\n    .hint {\n      font-size: 13px;\n      color: var(--text-muted);\n    }\n\n    .error {\n      font-size: 13px;\n      color: var(--error);\n      display: none;\n      margin-bottom: 10px;\n    }\n\n    .result {\n      background: #161a22;\n      border: 1px solid var(--border);\n      border-radius: 12px;\n      padding: 14px;\n      margin-top: 10px;\n    }\n\n    .big {\n      font-size: 20px;\n      font-weight: 800;\n    }\n\n    .small {\n      font-size: 13px;\n      color: var(--text-muted);\n      margin-top: 6px;\n      line-height: 1.4;\n    }\n  <\/style>\n<\/head>\n<body>\n\n  <h1>Route \u2013 Jita &lt;-&gt; UALX-3<\/h1>\n\n  <div class=\"card\">\n    <div class=\"row\">\n      <label for=\"m3\">Cargo (m\u00b3)<\/label>\n      <input id=\"m3\" type=\"number\" min=\"0\" max=\"2500\" placeholder=\"0\" \/>\n      <span class=\"hint\">Max 2,500 m\u00b3<\/span>\n    <\/div>\n\n    <div class=\"row\">\n      <input id=\"fastTrack\" type=\"checkbox\" \/>\n      <label for=\"fastTrack\">Fast Track (+50%)<\/label>\n    <\/div>\n\n    <div id=\"error\" class=\"error\"><\/div>\n\n    <div class=\"result\">\n      <div class=\"big\" id=\"total\">Total: 0 ISK<\/div>\n      <div class=\"small\" id=\"breakdown\"><\/div>\n    <\/div>\n  <\/div>\n\n  <script>\n    const MAX_M3 = 2500;\n    const MIN_PRICE = 2_000_000;\n    const MIN_PRICE_CAP_M3 = 500;\n    const MAX_PRICE = 3_900_000;\n    const FAST_TRACK_MULT = 1.5;\n\n    const m3El = document.getElementById(\"m3\");\n    const fastEl = document.getElementById(\"fastTrack\");\n    const totalEl = document.getElementById(\"total\");\n    const breakdownEl = document.getElementById(\"breakdown\");\n    const errorEl = document.getElementById(\"error\");\n\n    const fmtISK = n =>\n      Math.round(n).toLocaleString(\"en-GB\") + \" ISK\";\n\n    function basePrice(m3) {\n      if (m3 <= 0) return 0;\n      if (m3 <= MIN_PRICE_CAP_M3) return MIN_PRICE;\n\n      const span = MAX_M3 - MIN_PRICE_CAP_M3; \/\/ 2000\n      const t = (m3 - MIN_PRICE_CAP_M3) \/ span;\n      return MIN_PRICE + t * (MAX_PRICE - MIN_PRICE);\n    }\n\n    function calc() {\n      let m3 = Number(m3El.value || 0);\n\n      if (m3 > MAX_M3) {\n        m3 = MAX_M3;\n        m3El.value = MAX_M3;\n        errorEl.textContent = \"Cargo capped at 2,500 m\u00b3.\";\n        errorEl.style.display = \"block\";\n      } else {\n        errorEl.style.display = \"none\";\n      }\n\n      let price = basePrice(m3);\n      if (fastEl.checked) price *= FAST_TRACK_MULT;\n\n      totalEl.textContent = \"Total: \" + fmtISK(price);\n\n      if (m3 === 0) {\n        breakdownEl.textContent = \"No cargo entered.\";\n      } else if (m3 <= MIN_PRICE_CAP_M3) {\n        breakdownEl.textContent =\n          `Minimum fee applies up to ${MIN_PRICE_CAP_M3} m\u00b3 (${fmtISK(MIN_PRICE)}).`;\n      } else {\n        breakdownEl.textContent =\n          `Price scales up to ${fmtISK(MAX_PRICE)} at 2,500 m\u00b3.` +\n          (fastEl.checked ? \" Fast Track applied.\" : \"\");\n      }\n    }\n\n    m3El.addEventListener(\"input\", calc);\n    fastEl.addEventListener(\"change\", calc);\n    calc();\n  <\/script>\n\n<\/body>\n<\/html>\n\n","protected":false},"excerpt":{"rendered":"<p> [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_price":"","_stock":"","_tribe_ticket_header":"","_tribe_default_ticket_provider":"","_ticket_start_date":"","_ticket_end_date":"","_tribe_ticket_show_description":"","_tribe_ticket_show_not_going":false,"_tribe_ticket_use_global_stock":"","_tribe_ticket_global_stock_level":"","_global_stock_mode":"","_global_stock_cap":"","_tribe_rsvp_for_event":"","_tribe_ticket_going_count":"","_tribe_ticket_not_going_count":"","_tribe_tickets_list":"[]","_tribe_ticket_has_attendee_info_fields":false,"footnotes":"","_tec_slr_enabled":"","_tec_slr_layout":""},"class_list":["post-849","page","type-page","status-publish","hentry"],"ticketed":false,"_links":{"self":[{"href":"https:\/\/southsunindustries.com\/index.php\/wp-json\/wp\/v2\/pages\/849","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/southsunindustries.com\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/southsunindustries.com\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/southsunindustries.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/southsunindustries.com\/index.php\/wp-json\/wp\/v2\/comments?post=849"}],"version-history":[{"count":3,"href":"https:\/\/southsunindustries.com\/index.php\/wp-json\/wp\/v2\/pages\/849\/revisions"}],"predecessor-version":[{"id":853,"href":"https:\/\/southsunindustries.com\/index.php\/wp-json\/wp\/v2\/pages\/849\/revisions\/853"}],"wp:attachment":[{"href":"https:\/\/southsunindustries.com\/index.php\/wp-json\/wp\/v2\/media?parent=849"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}