{"id":92523,"date":"2025-12-09T23:26:05","date_gmt":"2025-12-09T12:26:05","guid":{"rendered":"https:\/\/www.bcicentral.com\/?page_id=92523"},"modified":"2026-01-07T14:23:55","modified_gmt":"2026-01-07T03:23:55","slug":"get-project","status":"publish","type":"page","link":"https:\/\/www.bcicentral.com\/ms\/get-project\/","title":{"rendered":"Dapatkan Projek"},"content":{"rendered":"<div id=\"cs-content\" class=\"cs-content\"><div class=\"x-section e92523-e1 m1ze3-0 m1ze3-1\"><div class=\"x-row x-container max width e92523-e2 m1ze3-3 m1ze3-4 m1ze3-6\"><div class=\"x-row-inner\"><div class=\"x-col e92523-e3 m1ze3-8 m1ze3-9\"><style>\n    \/* Enhanced styling for better form layout *\/\n    a,p,li,span,label,input,select,button {\n        font-size: 16px;\n    }\n\n    input {\n        height: -webkit-fill-available !important;\n    }\n\n    #custom-form-wrapper {\n        max-width: 800px;\n        margin: auto;\n        font-family: sans-serif;\n        padding: 0px;\n    }\n\n    #state-field {\n        transition: opacity 0.3s ease-in-out;\n    }\n\n    input[type=\"hidden\"] {\n        opacity: 0;\n        position: absolute;\n        left: -9999px;\n    }\n\n    .form-row {\n        display: flex;\n        gap: 15px;\n    }\n\n    .form-field {\n        flex: 1;\n        margin-bottom: 30px;\n    }\n\n    .form-field.full-width {\n        width: 100%;\n    }\n\n    #custom-form-wrapper label {\n        display: block;\n        margin-bottom: 5px;\n        font-weight: bold;\n    }\n\n    #custom-form-wrapper input,\n    #custom-form-wrapper select {\n        width: 100%;\n        padding: 10px;\n        border: 1px solid #ccc;\n        border-radius: 4px;\n        box-sizing: border-box;\n    }\n\n    .phone-container {\n        display: flex;\n        gap: 10px;\n    }\n\n    .country-code-select {\n        flex: 0 0 120px;\n        display: flex;\n        align-items: center;\n    }\n\n    .country-code-select select {\n        width: 100%;\n    }\n\n    .phone-input {\n        flex: 1;\n    }\n\n    .flag-icon {\n        width: 20px;\n        height: 15px;\n        margin-right: 5px;\n        display: inline-block;\n    }\n\n    #custom-form-wrapper button {\n        background-color: #FF0000;\n        color: white;\n        padding: 14px 24px;\n        border: none;\n        border-radius: 1000px;\n        cursor: pointer;\n        font-size: 16px;\n    }\n\n    #custom-form-wrapper button:hover {\n        background-color: #ca0202;\n    }\n\n    .error-message {\n        color: red;\n        background: #ffebee;\n        padding: 10px;\n        margin: 10px 0;\n        border-radius: 4px;\n        border: 1px solid #ffcdd2;\n    }\n\n    .loading {\n        color: #666;\n        font-style: italic;\n    }\n\n    \/* Validation and Status Elements *\/\n    .field_error input,\n    .field_error select {\n        border-color: #FF0000 !important;\n        box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\n    }\n\n    .validation_message {\n        color: #FF0000;\n        font-size: 12px;\n        margin-top: 5px;\n        display: block;\n    }\n\n    .loader {\n        display: none;\n        text-align: start;\n        padding: 0px;\n        font-size: 16px;\n        background: #f8f9fa;\n        border-radius: 8px;\n        margin: 0px 0px 40px 0px;\n        color: #666;\n    }\n\n    .form_hidden {\n        display: none !important;\n    }\n\n\n    .FPN-tool {\n        display: none;\n        padding: 20px;\n        margin: 20px 0;\n        border-radius: 8px;\n    }\n\n    @media (max-width: 600px) {\n        .form-row {\n            flex-direction: column;\n        }\n\n        .phone-container {\n            flex-direction: column;\n        }\n\n        .country-code-select {\n            flex: none;\n        }\n    }\n    #project-limit-header {\n        max-width: 800px;\n        margin: 0 auto 20px auto; \/* Centered, with space below *\/\n        font-family: sans-serif;\n        padding: 0 0px;\n    }\n\n    #project-limit-header h2 {\n        font-size: 32px;\n        color: #333;\n        margin-bottom: 14px;\n        @media screen and (max-width: 767px) {\n            font-size: 28px;\n        }\n    }\n\n    .limit-status-box {\n        display: flex;\n        align-items: center;\n        gap: 8px;\n        font-size: 16px;\n        font-weight: bold;\n        color: #444;\n        margin-bottom: 10px;\n    }\n\n    #remaining-credits {\n        color: #FF0000; \/* Red number to match brand *\/\n        font-size: 18px;\n    }\n\n    \/* --- Tooltip Styles --- *\/\n    .tooltip-container {\n        position: relative;\n        display: inline-block;\n        cursor: pointer;\n    }\n\n    .info-icon {\n        font-size: 16px;\n        color: #666;\n    }\n\n    .tooltip-content {\n        visibility: hidden;\n        width: 280px;\n        background-color: #333;\n        color: #fff;\n        text-align: left;\n        border-radius: 6px;\n        padding: 10px;\n        position: absolute;\n        z-index: 10;\n        bottom: 125%; \/* Position above the icon *\/\n        left: 50%;\n        margin-left: -140px; \/* Center it *\/\n        opacity: 0;\n        transition: opacity 0.3s;\n        font-size: 13px;\n        line-height: 1.4;\n        font-weight: normal;\n        box-shadow: 0px 4px 8px rgba(0,0,0,0.2);\n    }\n\n    .tooltip-container:hover .tooltip-content {\n        visibility: visible;\n        opacity: 1;\n    }\n\n    \/* Subtext *\/\n    .limit-subtext {\n        color: #666;\n        font-size: 16px;\n        margin-top: 5px;\n        display: none;\n    }\n\n    \/* State for 0 credits *\/\n    .limit-reached-text {\n        color: #454550;\n    }\n\n    .btn-book-a-demo {\n        background-color: #FF0000;\n        color: #FFFFFF;\n        border-radius: 10000px;\n        padding: 10px 20px;\n    }\n    .arrowBtn {\n        background-color: #FF0000;\n        padding: 12px 24px;\n        border-radius: 1000px;\n    }\n    .arrowBtn .x-anchor-content {\n        display: flex;\n        align-items: center;\n        gap: 8px;\n    }\n    .arrowBtn span {\n        color: #FFFFFF !important;\n        display: flex;\n        height: fit-content;\n    }\n    .hidden {\n        display: none;\n    }\n<\/style>\n\n<div id=\"project-limit-header\">\n    <h2>Dapatkan Projek<\/h2>\n    <div class=\"limit-status-box\">\n        <span class=\"limit-text limit-display\" style=\"opacity: 0; transition: opacity 0.3s;\">\n            <span id=\"remaining-credits\">...<\/span> out of 3 project samples available.\n        <\/span>\n\n        <div class=\"tooltip-container\">\n            <div class=\"tooltip-content\">\n                Terima sehingga 3 sampel projek setiap tempoh 90 hari.<br>\n                Had anda ditetapkan semula 90 hari selepas menerima sampel projek pertama anda.\n            <\/div>\n        <\/div>\n    <\/div>\n    <p class=\"limit-subtext\">\n        Projek sampel percuma anda hanya dengan satu klik sahaja. Masukkan butiran anda dan kami akan menghantarnya melalui e-mel.\n    <\/p>\n<\/div>\n\n<div class=\"x-div e76086-e10 m1mpi-a m1mpi-c m1mpi-e user_limited\" style=\"display: none; margin-bottom: 40px;\">\n    <div class=\"x-text x-content e76086-e11 m1mpi-g m1mpi-i m1mpi-k m1mpi-m\" style=\"margin-bottom: 20px;\">\n        <span class=\"limited-text\">Nampaknya anda telah mencapai had sampel projek anda. Jika anda berminat untuk mengakses lebih banyak data pembinaan, hubungi untuk mengambil LeadManager untuk pandu uji.<\/span>\n    <\/div>\n    <a class=\"x-anchor x-anchor-button has-graphic e76086-e12 m1mpi-n arrowBtn\" tabindex=\"0\" href=\"\/ms\/leadmanager-contact\/\">\n        <div class=\"x-anchor-content\">\n            <div class=\"x-anchor-text\">\n                <span class=\"x-anchor-text-primary\">Tempah Demo<\/span>\n            <\/div>\n            <span class=\"x-graphic\" aria-hidden=\"true\">\n                <i class=\"x-icon x-graphic-child x-graphic-icon x-graphic-primary\" aria-hidden=\"true\" data-x-icon-l=\"\uf061\"><\/i>\n            <\/span>\n        <\/div>\n    <\/a>\n<\/div>\n\n<div id=\"custom-form-wrapper\">\n    <!-- Loading State -->\n    <div class=\"loader\">\n        <div>Processing your request... Please wait...<\/div>\n    <\/div>\n\n    <form id=\"custom-hs-form\" action=\"\">\n        <input type=\"hidden\" id=\"user_ip\" name=\"user_ip\" value=\"\">\n\n        <!-- First Name and Last Name in 2 columns -->\n        <div class=\"form-row\">\n            <div class=\"form-field\">\n                <label for=\"firstname\">First name <span style=\"color: #FF0000\">*<\/span><\/label>\n                <input type=\"text\" id=\"firstname\" name=\"firstname\" required>\n            <\/div>\n            <div class=\"form-field\">\n                <label for=\"lastname\">Last name <span style=\"color: #FF0000\">*<\/span><\/label>\n                <input type=\"text\" id=\"lastname\" name=\"lastname\" required>\n            <\/div>\n        <\/div>\n\n        <!-- Work Email - Full width -->\n        <div class=\"form-field full-width\">\n            <label for=\"email\">Work email <span style=\"color: #FF0000\">*<\/span><\/label>\n            <input type=\"email\" id=\"email\" name=\"email\" required>\n        <\/div>\n\n        <!-- Work Mobile with Country Code -->\n         <div class=\"form-field full-width\">\n            <label for=\"phone\">Work mobile number <span style=\"color: #FF0000\">*<\/span><\/label>\n            <div class=\"phone-container\">\n                <div class=\"country-code-select\">\n                    <select id=\"country_code\" name=\"country_code\">\n                        <option value=\"+61\">\ud83c\udde6\ud83c\uddfa +61 (Australia)<\/option>\n                    <\/select>\n                <\/div>\n                <div class=\"phone-input\">\n                    <input\n                            type=\"tel\"\n                            id=\"phone\"\n                            name=\"phone\"\n                            required\n placeholder=\"Numbers only\"\n                            class=\"w-full px-3 py-2 border border-input rounded-md\"\n                    >\n                    <p id=\"phone-error\" style=\"color: #FF0000; position: absolute; font-size: 11px;\" class=\"text-red-500 text-xs mt-1 hidden\">\n                        Please enter numbers only.\n                    <\/p>\n                <\/div>\n            <\/div>\n        <\/div>\n\n        <!-- Company Name and Company Type in 2 columns -->\n        <div class=\"form-row\">\n            <div class=\"form-field\">\n                <label for=\"company\">Company name <span style=\"color: #FF0000\">*<\/span><\/label>\n                <input type=\"text\" id=\"company\" name=\"company\" required>\n            <\/div>\n            <div class=\"form-field\">\n                <label for=\"company_type\">Company type <span style=\"color: #FF0000\">*<\/span><\/label>\n                <select id=\"company_type\" name=\"company_type\" required>\n                    <option value=\"\">Please Select<\/option>\n                    <option value=\"Architect\/Engineer\/Consultant\">Architect\/Engineer\/Consultant<\/option>\n                    <option value=\"Manufacturer\/Supplier\">Manufacturer\/Supplier<\/option>\n                    <option value=\"Professional Services\">Professional Services<\/option>\n                    <option value=\"Owner\/Developer\">Owner\/Developer<\/option>\n                    <option value=\"Main Contractor\">Kontraktor utama<\/option>\n                    <option value=\"Subcontractor\">Subkontraktor<\/option>\n                    <option value=\"Software & Technology\">Software & Technology<\/option>\n                    <option value=\"Government\/Association\">Government\/Association<\/option>\n                    <option value=\"Equipment Rental\">Equipment Rental<\/option>\n                    <option value=\"Other\">Lain-lain<\/option>\n                <\/select>\n            <\/div>\n        <\/div>\n\n        <!-- Country Dropdown -->\n        <div class=\"form-field full-width\">\n            <label for=\"bcicontactcountry\">Negara <span style=\"color: #FF0000\">*<\/span><\/label>\n            <select id=\"bcicontactcountry\" name=\"bcicontactcountry\" required>\n                <option value=\"Australia\">Australia<\/option>\n            <\/select>\n        <\/div>\n\n        <!-- State\/Region - Only show for Australia -->\n        <div class=\"form-field full-width\" id=\"state-field\" style=\"display: none;\">\n            <label for=\"bcicontactstate\">State \/ Region <span style=\"color: #FF0000\">*<\/span><\/label>\n            <select id=\"bcicontactstate\" name=\"bcicontactstate\">\n                <option value=\"\">Please Select<\/option>\n            <\/select>\n        <\/div>\n\n        <!-- Project Refid -->\n        <div class=\"form-field full-width\" style=\"visibility: hidden; position: absolute;\">\n            <label for=\"project_refid\">Project Refid <span style=\"color: #FF0000\">*<\/span><\/label>\n            <input type=\"text\" id=\"project_refid\" name=\"project_refid\">\n        <\/div>\n\n        <div class=\"form-field full-width\" style=\"visibility: hidden; position: absolute;\">\n            <label for=\"project_id\">Project Refid <span style=\"color: #FF0000\">*<\/span><\/label>\n            <input type=\"text\" id=\"project_id\" name=\"project_id\">\n        <\/div>\n\n\n        <div class=\"legal-consent-section\" style=\"margin-top: 25px; font-size: 13px; color: #555; line-height: 1.5;\">\n            <p style=\"margin-bottom: 15px;\">\n                LeadManager is committed to protecting and respecting your privacy, and we\u2019ll only use your personal information to administer your account and to provide the products and services you requested from us. From time to time, we would like to contact you about our products and services.\n            <\/p>\n\n            <!-- <div class=\"form-check\" style=\"display: flex; align-items: flex-start; gap: 10px; margin-bottom: 15px;\">\n                <input type=\"checkbox\" id=\"consent_marketing\" name=\"consent_marketing\" style=\"margin-top: 3px; width: fit-content;\">\n                <label for=\"consent_marketing\" style=\"margin: 0; font-weight: normal;\">\n                    I agree to receive other communications from LeadManager Powered by Hubexo.\n                <\/label>\n            <\/div>\n\n            <div class=\"form-check\" style=\"display: flex; align-items: flex-start; gap: 10px; margin-bottom: 15px;\">\n                <input type=\"checkbox\" id=\"consent_processing\" name=\"consent_processing\" required style=\"margin-top: 3px;width: fit-content;\">\n                <label for=\"consent_processing\" style=\"margin: 0; font-weight: normal;\">\n                    I agree to allow bcicentral.com to store and process my personal data.\n                <\/label>\n            <\/div> -->\n\n            <p style=\"font-size: 16px; margin-top: 10px;\">\n                You may unsubscribe from these communications at any time. For more information, please review our <a href=\"https:\/\/www.bcicentral.com\/ms\/policies\/\">Dasar Privasi<\/a>.\n            <\/p>\n        <\/div>\n\n        <script src=\"https:\/\/www.google.com\/recaptcha\/api.js\" async defer><\/script>\n\n        <div class=\"captcha-container\" style=\"margin-bottom: 20px;\">\n            <div class=\"g-recaptcha\" data-sitekey=\"6Lfgym8dAAAAAEEUWMoKnHcwjDUpe4A6CnwAXuHl\"><\/div>\n            <div id=\"captcha-error\" style=\"color: red; font-size: 12px; display: none; margin-top: 5px;\">\n                Please verify you are not a robot.\n            <\/div>\n        <\/div>\n\n        <div style=\"display:none;\">\n            <input type=\"text\" id=\"bot-field\" name=\"bot-field\" value=\"\">\n        <\/div>\n\n        <div>\n            <button type=\"submit\" style=\"color: white !important;\" class=\"btn-get-project\">Hantar<\/button>\n        <\/div>\n    <input type=\"hidden\" name=\"trp-form-language\" value=\"ms\"\/><\/form>\n\n<\/div>\n\n<script>\n    document.addEventListener('DOMContentLoaded', function() {\n        const phoneInput = document.getElementById('phone');\n        const phoneError = document.getElementById('phone-error');\n        phoneInput.addEventListener('input', function(e) {\n            if (\/[^0-9]\/.test(this.value)) {\n                phoneError.classList.remove('hidden');\n                this.value = this.value.replace(\/[^0-9]\/g, '');\n            } else {\n                phoneError.classList.add('hidden');\n            }\n        });\n    });\n<\/script>\n\n<script>\n    (function ($) {\n        \/\/ Cache selectors (moved outside function for better reuse)\n        var $usageCounts = $('.usage-count, #remaining-credits');\n        var $loader = $(\".loader\");\n        var $limitDisplay = $(\".limit-display\");\n        var $fpnTool = $('.FPN-tool');\n        var $userLimited = $(\".user_limited\");\n        var $formWrapper = $(\"#custom-form-wrapper\");\n        var $usageInfo = $('.usage-info');\n        var $infoPopup = $('.info-popup');\n\n        function check_attempts() {\n            var ts = Date.now().toString();\n\n            \/\/ Check if user_email exists in localStorage\n            var userEmail = localStorage.getItem('user_email');\n\n            console.log(\"Email user:\", userEmail);\n\n\n            if (userEmail && userEmail.trim() !== '') {\n                \/\/ Use email-based checking\n                var emailCheckUrl = \"https:\/\/www.bcicentral.com\/bridge\/mail\/check_attempt_by_email.php?email=\" + encodeURIComponent(userEmail) + \"&nocache=\" + ts;\n\n                console.log(\"Email Check URL:\", emailCheckUrl);\n\n\n                $.get(emailCheckUrl, function (data, status) {\n                    var usedCount = 0;\n                    var maxLimit = 3;\n\n                    \/\/ Count how many attempts from the email history\n                    if (Array.isArray(data) && data.length > 0) {\n                        usedCount = data.length;\n                    }\n\n                    var remaining = maxLimit - usedCount;\n\n                    \/\/ Console logging\n                    if (typeof debug_bci === 'function' && debug_bci()) {\n                        console.group(\"BCI Usage Debug (Email-based)\");\n                        console.log(\"User Email:\", userEmail);\n                        console.log(\"Checking URL:\", emailCheckUrl);\n                        console.log(\"Used Count:\", usedCount);\n                        console.log(\"Remaining Credits:\", remaining);\n                        console.log(\"Full History Array:\", data);\n                        console.groupEnd();\n                    }\n\n                    \/\/ Set text\n                    $usageCounts.text(remaining);\n\n                    if (typeof debug_bci === 'function' && debug_bci()) {\n                        remaining = 3;\n                        $usageCounts.html(\"&infin;\");\n                    }\n\n                    \/\/ Optimized UI logic - batch DOM operations\n                    $loader.hide();\n                    $limitDisplay.css({\n                        \"opacity\": 1,\n                        \"display\": \"block\"\n                    });\n\n                    if (remaining > 0) {\n                        \/\/ User HAS credits\n                        $formWrapper.show();\n                        $userLimited.hide();\n                        $fpnTool.css(\"opacity\", 1);\n                    } else {\n                        \/\/ User has NO credits\n                        $formWrapper.hide();\n                        $userLimited.fadeIn();\n                        $fpnTool.css({\n                            \"opacity\": \"0\",\n                            \"height\": \"0\",\n                            \"width\": \"0\"\n                        });\n                    }\n                }).fail(function () {\n                    \/\/ Fallback on error - batch operations\n                    $usageCounts.text(\"?\");\n                    $limitDisplay.css({\n                        \"opacity\": 1,\n                        \"display\": \"block\"\n                    });\n                    $loader.hide();\n                    $formWrapper.show();\n                });\n\n            } else {\n                \/\/ No email in localStorage, use IP-based checking (original method)\n                var url = \"\/bridge\/mail\/get_usage.php?nocache=\" + ts;\n\n                $.get(url, function (data, status) {\n                    var remaining = parseInt(data[\"remaining\"]);\n\n                    \/\/ Console logging\n                    if (typeof debug_bci === 'function' && debug_bci()) {\n                        console.group(\"BCI Usage Debug (IP-based)\");\n                        console.log(\"Checking URL:\", url);\n                        console.log(\"Remaining Credits:\", remaining);\n                        console.log(\"Full History Array:\", data.history || []);\n                        console.groupEnd();\n                    }\n\n                    \/\/ Set text\n                    $usageCounts.text(remaining);\n\n                    if (typeof debug_bci === 'function' && debug_bci()) {\n                        remaining = 3;\n                        $usageCounts.html(\"&infin;\");\n                    }\n\n                    \/\/ Optimized UI logic - batch DOM operations\n                    $loader.hide();\n                    $limitDisplay.css({\n                        \"opacity\": 1,\n                        \"display\": \"block\"\n                    });\n\n                    if (remaining > 0) {\n                        \/\/ User HAS credits\n                        $formWrapper.show();\n                        $userLimited.hide();\n                        $fpnTool.css(\"opacity\", 1);\n                    } else {\n                        \/\/ User has NO credits\n                        $formWrapper.hide();\n                        $userLimited.fadeIn();\n                        $fpnTool.css({\n                            \"opacity\": \"0\",\n                            \"height\": \"0\",\n                            \"width\": \"0\"\n                        });\n                    }\n                }).fail(function () {\n                    \/\/ Fallback on error - batch operations\n                    $usageCounts.text(\"?\");\n                    $limitDisplay.css({\n                        \"opacity\": 1,\n                        \"display\": \"block\"\n                    });\n                    $loader.hide();\n                    $formWrapper.show();\n                });\n            }\n        }\n\n        $(document).ready(function () {\n            check_attempts();\n            \/\/ Optimized hover - single selector, reuse cached elements\n            $usageInfo.hover(function () {\n                $infoPopup.css(\"opacity\", \".8\");\n            }, function () {\n                $infoPopup.css(\"opacity\", \"0\");\n            });\n        });\n    })(jQuery);\n<\/script>\n<script>\n    \/**\n     * BCI Attempt History Checker\n     * Gets IP from PHP-generated variable\n     *\/\n    (function () {\n        \/\/ Get IP from PHP\n        function getUserIP() {\n            var inputIp = document.getElementById('user_ip');\n            if (inputIp && inputIp.value) {\n                return inputIp.value.trim();\n            }\n            return 'Unknown';\n        }\n\n        async function checkHistoryByIP() {\n            const ip = getUserIP();\n            if (ip === 'Unknown') {\n                console.log(\"Could not detect IP from PHP.\");\n                return;\n            }\n            try {\n                const checkUrl = `https:\/\/www.bcicentral.com\/bridge\/mail\/check_attempt_by_email.php?ip=${ip}`;\n                const response = await fetch(checkUrl, {\n                    cache: 'no-cache' \/\/ Always get fresh history\n                });\n                \/\/ Parse as JSON\n                const data = await response.json();\n                console.group(\"BCI Attempt History Log\");\n                console.log(\"User IP:\", ip);\n                if (Array.isArray(data) && data.length > 0) {\n                    console.log(`Total Records: ${data.length}`);\n                    console.log(\"--------------------------------\");\n                    \/\/ Loop through each record\n                    data.forEach((item, index) => {\n                        console.log(`Array = ${index}`);\n                        \/\/ Loop through each key inside the record\n                        for (const key in item) {\n                            console.log(`${key} : ${item[key]}`);\n                        }\n                        console.log(\"--------------------------------\");\n                    });\n                } else {\n                    console.log(\"No history found for IP:\", ip);\n                }\n                console.groupEnd();\n            } catch (error) {\n                console.error(\"Error checking history:\", error);\n            }\n        }\n\n        \/\/ Wait for DOM and give a small delay for PHP to set the value\n        document.addEventListener('DOMContentLoaded', function() {\n            setTimeout(checkHistoryByIP, 100);\n        });\n    })();\n<\/script>\n<script>\n    \/**\n     * Consolidated Form Functionality Script (Optimized)\n     *\/\n    (function() {\n        \/\/ --- CONFIGURATION ---\n        const PORTAL_ID = '8993205';\n        const FORM_GUID = '708fcc6f-384d-49f5-9687-2b031ea0140f';\n        const SUBSCRIPTION_TYPE_ID = 688901095;\n        const debugMode = true;\n        const hasCreditManager = typeof CreditManager !== 'undefined';\n\n        console.log('PORTAL_ID:', PORTAL_ID);\n        console.log('FORM_GUID:', FORM_GUID);\n        console.log('SUBSCRIPTION_TYPE_ID:', SUBSCRIPTION_TYPE_ID);\n\n        \/\/ --- GET IP FROM PHP ---\n        function getUserIP() {\n            var inputIp = document.getElementById('user_ip');\n            if (inputIp && inputIp.value) {\n                return inputIp.value.trim();\n            }\n            return 'Unknown';\n        }\n\n        \/\/ Cache DOM elements\n        const domCache = {};\n        const select = (selector) => {\n            if (!domCache[selector]) {\n                domCache[selector] = document.querySelector(selector);\n            }\n            return domCache[selector];\n        };\n        const getVal = (id) => {\n            const el = document.getElementById(id);\n            return el ? el.value.trim() : \"\";\n        };\n        \/\/ --- UI HELPERS (Optimized) ---\n        function showElement(selector, opacity = null) {\n            const el = select(selector);\n            if (el) {\n                el.style.display = 'block';\n                if (opacity !== null) el.style.opacity = opacity;\n            }\n        }\n\n        function hideElement(selector) {\n            const el = select(selector);\n            if (el) el.style.display = 'none';\n        }\n\n        function addClass(selector, className) {\n            const el = select(selector);\n            if (el) el.classList.add(className);\n        }\n\n        function removeClass(selector, className) {\n            const el = select(selector);\n            if (el) el.classList.remove(className);\n        }\n\n        function toggleSubmitButton(disabled) {\n            const btn = select('input[type=\"submit\"], button[type=\"submit\"], .hs-button');\n            if (btn) {\n                btn.disabled = disabled;\n                \/\/ Batch style changes\n                Object.assign(btn.style, {\n                    opacity: disabled ? \"0.6\" : \"1\",\n                    cursor: disabled ? \"not-allowed\" : \"pointer\"\n                });\n            }\n        }\n        \/\/ --- VALIDATION ---\n        function set_required_validation_message(selector) {\n            const el = select(selector);\n            if (!el || el.value.trim() === \"\") {\n                create_validation_message(el);\n                return false;\n            } else {\n                clear_validation_message(el);\n                return true;\n            }\n        }\n\n        function create_validation_message(el) {\n            if (!el) return;\n            const formField = el.closest(\".form-field\");\n            if (!formField) return;\n            formField.classList.add(\"field_error\");\n            \/\/ Remove existing message first\n            const existingMessage = formField.querySelector(\".validation_message\");\n            if (existingMessage) existingMessage.remove();\n            \/\/ Create new message\n            const messageDiv = document.createElement('div');\n            messageDiv.className = 'validation_message';\n            messageDiv.setAttribute('aria-live', 'polite');\n            messageDiv.textContent = \"This field is required.\";\n            formField.appendChild(messageDiv);\n        }\n\n        function clear_validation_message(el) {\n            if (!el) return;\n            const formField = el.closest(\".form-field\");\n            if (!formField) return;\n            formField.classList.remove(\"field_error\");\n            const validationMessage = formField.querySelector(\".validation_message\");\n            if (validationMessage) validationMessage.remove();\n        }\n\n        function getStateTerritory() {\n            const stateField = document.getElementById('bcicontactstate');\n            const countryField = document.getElementById('bcicontactcountry');\n            if (stateField?.value && stateField.value.trim() !== '') {\n                return stateField.value;\n            }\n            return countryField?.value || '';\n        }\n\n        \/\/ --- SUBMISSION LOGIC (Optimized) ---\n        async function internalDB() {\n            try {\n                const formData = new FormData();\n                const fields = {\n                    first_name: getVal('firstname'),\n                    last_name: getVal('lastname'),\n                    email: getVal('email'),\n                    phone: getVal('phone'),\n                    country: getVal('bcicontactcountry'),\n                    state_territory: getStateTerritory(),\n                    project_ref: getVal('project_refid')\n                };\n                \/\/ Batch append\n                Object.entries(fields).forEach(([key, value]) => formData.append(key, value || ''));\n                if (debugMode) console.log('Sending internal DB webhook...');\n                const response = await fetch('https:\/\/internal.bciasia.com\/schedule\/webhook\/bcicentralform.cfm', {\n                    method: 'POST',\n                    body: formData,\n                    keepalive: true \/\/ Ensure request completes even if page navigates\n                });\n                return response.ok;\n            } catch (error) {\n                console.error('Error internal DB webhook:', error);\n                return false;\n            }\n        }\n\n        async function mailRunWithResponse() {\n            try {\n                const userIP = getUserIP();\n                const formData = new FormData();\n                const fields = {\n                    first_name: getVal('firstname'),\n                    last_name: getVal('lastname'),\n                    email: getVal('email'),\n                    phone: getVal('phone'),\n                    company_name: getVal('company'),\n                    country: getVal('bcicontactcountry'),\n                    state_territory: getStateTerritory(),\n                    user_ip: userIP,\n                    project_ref: getVal('project_refid')\n                };\n                if (!fields.project_ref) return {\n                    status: 'SKIPPED'\n                };\n                \/\/ Batch append\n                Object.entries(fields).forEach(([key, value]) => formData.append(key, value || ''));\n                const response = await fetch('\/bridge\/mail\/run.php', {\n                    method: 'POST',\n                    body: formData,\n                    keepalive: true \/\/ Ensure request completes\n                });\n                if (response.ok) {\n                    const text = await response.text();\n                    try {\n                        return JSON.parse(text);\n                    } catch {\n                        return {\n                            status: 'OK'\n                        };\n                    }\n                } else {\n                    return {\n                        status: 'ERROR',\n                        error_type: 'HTTP_ERROR'\n                    };\n                }\n            } catch (error) {\n                console.error('mailRunWithResponse error:', error);\n                return {\n                    status: 'ERROR',\n                    error_type: 'NETWORK_ERROR'\n                };\n            }\n        }\n\n        function switch_page(page_name) {\n            if (page_name === \"submitform\" || page_name === \"email_not_valid\") {\n                toggleSubmitButton(false);\n            }\n            switch (page_name) {\n                case \"no_attempts_remaining\":\n                    const usageCount = document.querySelector('.usage_count');\n                    if (usageCount) usageCount.textContent = '0';\n                    hideElement(\".loader\");\n                    hideElement(\".limit-subtext\");\n                    showElement(\".limit-display\", '0');\n                    removeClass(\".limit-display\", \"form_hidden\");\n                    const fpnTool = select('.FPN-tool');\n                    if (fpnTool) {\n                        Object.assign(fpnTool.style, {\n                            opacity: '0',\n                            height: '0',\n                            width: '0'\n                        });\n                    }\n                    break;\n                case \"loader\":\n                    showElement(\".loader\");\n                    addClass(\".limit-display\", \"form_hidden\");\n                    addClass(\".FPN-tool\", \"form_hidden\");\n                    hideElement(\"#custom-hs-form\");\n                    break;\n                case \"submitform\":\n                    const fpnToolSubmit = select('.FPN-tool');\n                    if (fpnToolSubmit) fpnToolSubmit.style.opacity = '1';\n                    showElement(\".limit-display\", '1');\n                    hideElement(\".loader\");\n                    removeClass(\".limit-display\", \"form_hidden\");\n                    removeClass(\".FPN-tool\", \"form_hidden\");\n                    showElement(\"#custom-hs-form\");\n                    break;\n                case \"email_not_valid\":\n                    hideElement(\".loader\");\n                    hideElement('.FPN-tool');\n                    hideElement(\"#custom-hs-form\");\n                    break;\n                case \"success\":\n                    hideElement(\".loader\");\n                    let remaining = 1;\n                    try {\n                        const store = localStorage.getItem('bci_project_limit_v1');\n                        if (store) {\n                            const data = JSON.parse(store);\n                            remaining = data.count;\n                        }\n                    } catch (e) {}\n                    \/\/ Immediate redirect based on remaining credits\n                    if (remaining <= 0) {\n                        window.location.href = window.location.href; \/\/ Force reload\n                    } else {\n                        window.location.href = \"\/find-projects-confirmation\/\";\n                    }\n                    break;\n            }\n        }\n\n        \/\/ OPTIMIZED: Parallel execution instead of sequential\n        function submit_get_project() {\n            switch_page(\"loader\");\n            \/\/ Execute both requests in parallel\n            Promise.all([\n                mailRunWithResponse(),\n                internalDB() \/\/ Run in parallel, don't wait for mailRun\n            ]).then(([mailResponse, internalDbSuccess]) => {\n                if (debugMode) {\n                    console.log('Mail response:', mailResponse);\n                    console.log('Internal DB success:', internalDbSuccess);\n                }\n                if (mailResponse.status === \"OK\" || mailResponse.status === \"SKIPPED\") {\n                    \/\/ Immediately redirect - don't wait\n                    switch_page(\"success\");\n                } else if (mailResponse.status === \"ERROR\") {\n                    if (mailResponse.error_type === \"MAX_EMAIL_ATTEMPTS\") {\n                        switch_page(\"no_attempts_remaining\");\n                    } else if (mailResponse.error_type === \"EMAIL_NOT_VALID\") {\n                        alert(mailResponse.message || 'Invalid email address');\n                        switch_page(\"submitform\");\n                    } else {\n                        switch_page(\"submitform\");\n                    }\n                } else {\n                    switch_page(\"submitform\");\n                }\n            }).catch(error => {\n                console.error('Submission error:', error);\n                alert(\"Please check your Internet connection and try again.\");\n                switch_page(\"submitform\");\n            });\n        }\n\n\n        async function processFormSubmission() {\n            const form = document.getElementById('custom-hs-form');\n            \/\/ Validasi khusus Australia\n            const countryVal = getVal('bcicontactcountry');\n            const stateVal = getVal('bcicontactstate');\n            if (countryVal === 'Australia' && stateVal === \"\") {\n                alert(\"Please select a State \/ Region.\");\n                return;\n            }\n\n            \/\/ 1. UI Loading State (Aktifkan loader & disable button)\n            toggleSubmitButton(true);\n            const loader = select('.loader');\n            if (loader) loader.style.display = 'block';\n            if (form) form.style.opacity = '0.5';\n\n            \/\/ --- [START] VALIDASI AWAL EMAIL HISTORY ---\n            try {\n                const emailVal = getVal('email');\n                if (debugMode) console.log(`Checking history for: ${emailVal}`);\n\n                \/\/ Panggil API Cek History dengan POST method\n                const checkRes = await fetch(`https:\/\/www.bcicentral.com\/bridge\/mail\/check_attempt_by_email.php`, {\n                    method: 'POST',\n                    headers: {\n                        'Content-Type': 'application\/x-www-form-urlencoded',\n                    },\n                    body: `email=${encodeURIComponent(emailVal)}`,\n                    cache: 'no-cache'\n                });\n\n                \/\/ Check if response is OK\n                if (!checkRes.ok) {\n                    throw new Error(`HTTP error! status: ${checkRes.status}`);\n                }\n\n                const historyData = await checkRes.json();\n\n                \/\/ Hitung jumlah penggunaan\n                const usedCount = Array.isArray(historyData) ? historyData.length : 0;\n                const maxLimit = 3;\n\n                \/\/ --- SKENARIO A: LIMIT HABIS (>= 3) ---\n                if (usedCount >= maxLimit) {\n                    if (debugMode) console.warn(\"\u26d4 Email limit reached (>=3). Stopping submission.\");\n\n                    \/\/ Matikan Loader & Kembalikan Opacity Form (walaupun nanti di-hide)\n                    if (loader) loader.style.display = 'none';\n                    if (form) form.style.opacity = '1';\n\n                    \/\/ Re-enable submit button since we're stopping\n                    toggleSubmitButton(false);\n\n                    const remainingSpan = document.getElementById('remaining-credits');\n                    if (remainingSpan) remainingSpan.textContent = '0';\n\n                    const limitDisplay = select('.limit-display');\n                    if (limitDisplay) {\n                        limitDisplay.style.opacity = '1';\n                        limitDisplay.style.display = 'block';\n                    }\n\n                    const formWrapper = document.getElementById(\"custom-form-wrapper\");\n                    const userLimited = select(\".user_limited\");\n                    const fpnTool = select('.FPN-tool');\n\n                    if (formWrapper) formWrapper.style.display = 'none';\n                    if (fpnTool) {\n                        fpnTool.style.opacity = '0';\n                        fpnTool.style.height = '0';\n                        fpnTool.style.width = '0';\n                    }\n                    if (userLimited) {\n                        userLimited.style.display = 'block';\n                        userLimited.style.opacity = '1'; \/\/ Pastikan terlihat\n                    }\n\n                    return;\n                } else {\n                    const remaining = maxLimit - usedCount; \/\/ Misal 3 - 1 = 2\n                    if (debugMode) console.log(`\u2705 Access granted. Remaining credits: ${remaining}`);\n\n                    \/\/ Update UI: \"2 out of 3 project samples available\"\n                    const remainingSpan = document.getElementById('remaining-credits');\n                    if (remainingSpan) remainingSpan.textContent = remaining;\n\n                    \/\/ Pastikan limit display terlihat agar user sadar sisa kuota berkurang\n                    const limitDisplay = select('.limit-display');\n                    if (limitDisplay) {\n                        limitDisplay.style.opacity = '1';\n                        limitDisplay.style.display = 'block';\n                    }\n\n                }\n\n            } catch (error) {\n                console.error(\"Error during pre-validation check:\", error);\n                \/\/ Restore UI state on error\n                if (loader) loader.style.display = 'none';\n                if (form) form.style.opacity = '1';\n                toggleSubmitButton(false);\n                alert(\"Error checking email history. Please try again.\");\n                return; \/\/ Stop execution on error\n            }\n            \/\/ --- [END] VALIDASI AWAL EMAIL HISTORY ---\n\n\n            \/\/ 2. Persiapan Data HubSpot\n            \/\/ DISABLE CHECKBOX VALIDATION (COMMENTED OUT)\n            \/\/ const isMarketingChecked = document.getElementById('consent_marketing')?.checked || false;\n            \/\/ const isProcessingChecked = document.getElementById('consent_processing')?.checked || false;\n\n            const fullPhone = getVal('country_code') + getVal('phone');\n\n            \/\/ Validate required fields\n            const email = getVal('email');\n            const firstname = getVal('firstname');\n            const lastname = getVal('lastname');\n\n            if (!email || !firstname || !lastname) {\n                console.error('Missing required fields');\n                toggleSubmitButton(false);\n                if (form) form.style.opacity = '1';\n                if (loader) loader.style.display = 'none';\n                alert(\"Please fill in all required fields.\");\n                return;\n            }\n\n            \/\/ Build fields array with only non-empty values\n            const fields = [{\n                \"name\": \"firstname\",\n                \"value\": firstname\n            },\n                {\n                    \"name\": \"lastname\",\n                    \"value\": lastname\n                },\n                {\n                    \"name\": \"email\",\n                    \"value\": email\n                }\n            ];\n\n            \/\/ Add optional fields only if they have values\n            if (fullPhone && fullPhone.trim()) {\n                fields.push({\n                    \"name\": \"phone\",\n                    \"value\": fullPhone\n                });\n            }\n\n            const company = getVal('company');\n            if (company && company.trim()) {\n                fields.push({\n                    \"name\": \"company\",\n                    \"value\": company\n                });\n            }\n\n            const companyType = getVal('company_type');\n            if (companyType && companyType.trim()) {\n                fields.push({\n                    \"name\": \"company_type\",\n                    \"value\": companyType\n                });\n            }\n\n            const country = getVal('bcicontactcountry');\n            if (country && country.trim()) {\n                fields.push({\n                    \"name\": \"bcicontactcountry\",\n                    \"value\": country\n                });\n            }\n\n            const state = getVal('bcicontactstate');\n            if (state && state.trim()) {\n                fields.push({\n                    \"name\": \"bcicontactstate\",\n                    \"value\": state\n                });\n            }\n\n            \/\/ const projectRefId = getVal('project_refid');\n            \/\/ if (projectRefId && projectRefId.trim()) {\n            \/\/     fields.push({\n            \/\/         \"name\": \"project_refid\",\n            \/\/         \"value\": projectRefId\n            \/\/     });\n            \/\/ }\n\n            const projectIdForHubspot = getVal('project_id');\n\n            if (projectIdForHubspot && projectIdForHubspot.trim()) {\n                fields.push({\n                    \"name\": \"project_refid\",\n                    \"value\": projectIdForHubspot\n                });\n            }\n\n            const data = {\n                \"submittedAt\": Date.now(),\n                \"fields\": fields,\n                \"context\": {\n                    \"pageUri\": window.location.href,\n                    \"pageName\": document.title\n                },\n                \/\/ DISABLE LEGAL CONSENT OPTIONS (COMMENTED OUT)\n                \/\/ Karena variabel isProcessingChecked dan isMarketingChecked di-disable, block ini juga harus di-disable\n                \/\/ \"legalConsentOptions\": {\n                \/\/     \"consent\": {\n                \/\/         \"consentToProcess\": isProcessingChecked,\n                \/\/         \"text\": \"I agree to allow bcicentral.com to store and process my personal data.\",\n                \/\/         \"communications\": [{\n                \/\/             \"value\": isMarketingChecked,\n                \/\/             \"subscriptionTypeId\": SUBSCRIPTION_TYPE_ID,\n                \/\/             \"text\": \"I agree to receive other communications from LeadManager Powered by Hubexo.\"\n                \/\/         }]\n                \/\/     }\n                \/\/ }\n            };\n\n            \/\/ Log payload for debugging\n            if (debugMode) {\n                console.log('\ud83d\udce4 HubSpot Payload:', JSON.stringify(data, null, 2));\n            }\n\n            \/\/ 3. Kirim ke HubSpot\n            const url = `https:\/\/api.hsforms.com\/submissions\/v3\/integration\/submit\/${PORTAL_ID}\/${FORM_GUID}`;\n\n            fetch(url, {\n                method: 'POST',\n                headers: {\n                    'Content-Type': 'application\/json'\n                },\n                body: JSON.stringify(data),\n                keepalive: true\n            }).then(async response => {\n                \/\/ Get response body for debugging\n                const responseData = await response.json().catch(() => ({}));\n\n                if (response.ok) {\n                    if (debugMode) console.log('\u2705 HubSpot Success', responseData);\n\n                    localStorage.setItem('user_email', email);\n\n                    if (hasCreditManager) CreditManager.decrement();\n\n                    \/\/ Lanjut ke proses Internal DB & Mail Run\n                    submit_get_project();\n                } else {\n                    \/\/ Log detailed error from HubSpot\n                    console.error('\u274c HubSpot Error Details:', {\n                        status: response.status,\n                        statusText: response.statusText,\n                        responseData: responseData\n                    });\n                    throw new Error(`HubSpot submission failed: ${JSON.stringify(responseData)}`);\n                }\n            }).catch(error => {\n                console.error('HubSpot error:', error);\n                toggleSubmitButton(false);\n                if (form) form.style.opacity = '1';\n                if (loader) loader.style.display = 'none';\n                alert(\"Error submitting to HubSpot. Please try again.\");\n            });\n        }\n\n        document.addEventListener('DOMContentLoaded', async function() {\n            \/\/ Load countries and phone codes\n            await loadCountriesAndPhoneCodes();\n            setupCountryHandler();\n\n            \/\/ Set project ref from localStorage\n            const selectedProject = localStorage.getItem(\"selected_project\");\n            if (selectedProject && selectedProject != \"0\") {\n                const projectRefField = document.getElementById('project_refid');\n                if (projectRefField) projectRefField.value = selectedProject;\n            }\n\n            const selectedProjectId = localStorage.getItem(\"selected_projectid\");\n            if (selectedProjectId && selectedProjectId != \"0\") {\n                const projectIdField = document.getElementById('project_id');\n                if (projectIdField) projectIdField.value = selectedProjectId;\n            }\n\n            const form = document.getElementById('custom-hs-form');\n            if (form) {\n                form.addEventListener('submit', function(e) {\n                    e.preventDefault();\n                    \/\/ Validate all required fields\n                    const validations = [\n                        set_required_validation_message(\"#firstname\"),\n                        set_required_validation_message(\"#lastname\"),\n                        set_required_validation_message(\"#email\"),\n                        set_required_validation_message(\"#phone\"),\n                        set_required_validation_message(\"#company\"),\n                        set_required_validation_message(\"#bcicontactcountry\")\n                    ];\n                    if (!validations.every(v => v === true)) return;\n                    \/\/ Bot field check\n                    const botField = document.getElementById('bot-field');\n                    if (botField && botField.value) return;\n                    \/\/ reCAPTCHA check\n                    if (typeof grecaptcha !== 'undefined') {\n                        const captchaResponse = grecaptcha.getResponse();\n                        const captchaError = document.getElementById('captcha-error');\n                        if (captchaResponse.length === 0) {\n                            if (captchaError) captchaError.style.display = 'block';\n                            return;\n                        } else {\n                            if (captchaError) captchaError.style.display = 'none';\n                        }\n                    }\n                    \/\/ Submit form\n                    processFormSubmission();\n                });\n            }\n        });\n\n        \/\/ Optimized country\/phone loading with caching\n        let countriesCache = null;\n        async function loadCountriesAndPhoneCodes() {\n            const countrySelect = document.getElementById('bcicontactcountry');\n            const phoneCodeSelect = document.getElementById('country_code');\n\n            \/\/ Ambil data dari Local Storage\n            const userCountryCode = localStorage.getItem('user_country_code'); \/\/ contoh: 'id'\n\n            if (!countrySelect || !phoneCodeSelect) return;\n\n            try {\n                \/\/ Use cache if available\n                if (!countriesCache) {\n                    \/\/ PERUBAHAN 1: Saya menambahkan 'cca2' di parameter fields untuk mendapatkan kode negara 2 digit (ID, AU, dll)\n                    const response = await fetch('https:\/\/restcountries.com\/v3.1\/all?fields=name,flag,idd,cca2', {\n                        cache: 'force-cache'\n                    });\n                    countriesCache = await response.json();\n                }\n\n                \/\/ Build options using DocumentFragment\n                const countryFragment = document.createDocumentFragment();\n                const phoneFragment = document.createDocumentFragment();\n\n                \/\/ --- Bagian Manual Australia (Default) ---\n                \/\/ Kita simpan referensi option Australia untuk jaga-jaga\n                const ausOption = document.createElement('option');\n                ausOption.value = \"Australia\";\n                ausOption.textContent = \"Australia\";\n\n                const ausPhone = document.createElement('option');\n                ausPhone.value = \"+61\";\n                ausPhone.textContent = \"\ud83c\udde6\ud83c\uddfa +61 (Australia)\";\n\n                \/\/ Jika tidak ada data di local storage, atau datanya memang 'au', jadikan Australia selected\n                if (!userCountryCode || userCountryCode.toLowerCase() === 'au') {\n                    ausOption.selected = true;\n                    ausPhone.selected = true;\n                }\n\n                countryFragment.appendChild(ausOption);\n                phoneFragment.appendChild(ausPhone);\n                \/\/ ------------------------------------------\n\n                \/\/ Sort and add other countries\n                const sortedCountries = [...countriesCache].sort((a, b) => a.name.common.localeCompare(b.name.common));\n\n                sortedCountries.forEach(country => {\n                    \/\/ 1. Setup Dropdown Negara (bcicontactcountry)\n                    const opt = document.createElement('option');\n                    opt.value = country.name.common;\n                    opt.textContent = country.name.common;\n\n                    \/\/ 2. Setup Dropdown Telepon (country_code)\n                    if (country.idd?.root) {\n                        const pCode = country.idd.root + (country.idd.suffixes?.[0] || '');\n                        const pOpt = document.createElement('option');\n                        pOpt.value = pCode; \/\/ Value +62\n                        pOpt.textContent = `${country.flag||''} ${pCode} (${country.name.common})`; \/\/ Tampilan: \ud83c\uddee\ud83c\udde9 +62 (Indonesia)\n\n                        \/\/ LOGIC AUTO SELECT:\n                        \/\/ Cek apakah kode negara dari API (misal 'ID') sama dengan kode di localStorage (misal 'id')\n                        if (userCountryCode && country.cca2 && country.cca2.toLowerCase() === userCountryCode.toLowerCase()) {\n                            \/\/ Set phone code selected\n                            pOpt.selected = true;\n                            \/\/ Set country dropdown selected juga (jika perlu)\n                            opt.selected = true;\n\n                            \/\/ Unselect Australia karena kita sudah menemukan match user\n                            ausPhone.selected = false;\n                            ausOption.selected = false;\n                        }\n\n                        phoneFragment.appendChild(pOpt);\n                    }\n\n                    countryFragment.appendChild(opt);\n                });\n\n                \/\/ Batch DOM update\n                countrySelect.innerHTML = '';\n                phoneCodeSelect.innerHTML = '';\n                countrySelect.appendChild(countryFragment);\n                phoneCodeSelect.appendChild(phoneFragment);\n\n            } catch (e) {\n                console.error('Error loading countries:', e);\n            }\n        }\n\n        function setupCountryHandler() {\n            const countrySelect = document.getElementById('bcicontactcountry');\n            const stateSelect = document.getElementById('bcicontactstate');\n            const stateField = document.getElementById('state-field');\n            if (!countrySelect || !stateSelect || !stateField) return;\n            const australianStates = ['New South Wales', 'Victoria', 'Queensland', 'Western Australia', 'South Australia', 'Tasmania', 'Australian Capital Territory', 'Northern Territory'];\n\n            function updateStateVisibility() {\n                const val = countrySelect.value;\n                if (val === 'Australia') {\n                    \/\/ Build options using DocumentFragment\n                    const fragment = document.createDocumentFragment();\n                    const defaultOpt = document.createElement('option');\n                    defaultOpt.value = \"\";\n                    defaultOpt.textContent = \"Please Select\";\n                    fragment.appendChild(defaultOpt);\n                    australianStates.forEach(st => {\n                        const opt = document.createElement('option');\n                        opt.value = st;\n                        opt.textContent = st;\n                        fragment.appendChild(opt);\n                    });\n                    stateSelect.innerHTML = '';\n                    stateSelect.appendChild(fragment);\n                    stateField.style.display = 'block';\n                } else {\n                    stateSelect.innerHTML = '<option value=\"\">Please Select<\/option>';\n                    stateSelect.value = \"\";\n                    stateField.style.display = 'none';\n                }\n            }\n            countrySelect.addEventListener('change', updateStateVisibility);\n            updateStateVisibility();\n        }\n        \/\/ Expose functions to global scope\n        window.submit_get_project = submit_get_project;\n        window.switch_page = switch_page;\n    })();\n<\/script><\/div><\/div><\/div><\/div><div class=\"x-section e92523-e5 m1ze3-1 m1ze3-2 post-submit\"><div class=\"x-row x-container max width e92523-e6 m1ze3-3 m1ze3-5 m1ze3-7\"><div class=\"x-row-inner\"><div class=\"x-col e92523-e7 m1ze3-9 m1ze3-a\"><div class=\"x-text x-content e92523-e8 m1ze3-b\">Terima kasih! Anda akan menerima projek pilihan anda melalui e-mel. Pastikan anda menyemak folder Sampah dan Spam anda jika ia tidak sampai dalam peti masuk anda.<\/div><hr class=\"x-line e92523-e9 m1ze3-c\"\/><a class=\"x-anchor x-anchor-button has-graphic e92523-e10 m1ze3-d arrowBtn\" tabindex=\"0\" href=\"\/ms\/find-projects\/\"><div class=\"x-anchor-content\"><span class=\"x-graphic\" aria-hidden=\"true\"><i class=\"x-icon x-graphic-child x-graphic-icon x-graphic-primary\" aria-hidden=\"true\" data-x-icon-s=\"&#xf061;\"><\/i><\/span><div class=\"x-anchor-text\"><span class=\"x-anchor-text-primary\">Cari Lebih Banyak Projek<\/span><\/div><\/div><\/a><\/div><\/div><\/div><\/div><\/div>","protected":false},"excerpt":{"rendered":"<p>Get Project &#8230; out of 3 project samples available. Receive up to 3 project samples per 90 day period. Your limit resets 90 days after receiving your first project sample. &#8230; <\/p>\n<div><a href=\"https:\/\/www.bcicentral.com\/ms\/get-project\/\" class=\"more-link\">Baca Lagi<\/a><\/div>","protected":false},"author":9927,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"template-blank-4.php","meta":{"_acf_changed":false,"content-type":"","footnotes":""},"class_list":["post-92523","page","type-page","status-publish","hentry","no-post-thumbnail"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Get Sample Project Leads | BCI Central<\/title>\n<meta name=\"description\" content=\"Access exclusive construction information and receive up to 3 project leads every 90 days. Get free sample project leads today!\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.bcicentral.com\/ms\/get-project\/\" \/>\n<meta property=\"og:locale\" content=\"ms_MY\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Get Sample Project Leads | BCI Central\" \/>\n<meta property=\"og:description\" content=\"Access exclusive construction information and receive up to 3 project leads every 90 days. Get free sample project leads today!\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.bcicentral.com\/ms\/get-project\/\" \/>\n<meta property=\"og:site_name\" content=\"LeadManager (formerly BCI Central)\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/bcicentral.group\" \/>\n<meta property=\"article:modified_time\" content=\"2026-01-07T03:23:55+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.bcicentral.com\/wp-content\/uploads\/2024\/11\/cropped-Interim-Brandmark-BCI-Central-small-RGB.png\" \/>\n\t<meta property=\"og:image:width\" content=\"512\" \/>\n\t<meta property=\"og:image:height\" content=\"512\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:site\" content=\"@BCICentralAU\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"13 minit\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.bcicentral.com\\\/get-project\\\/\",\"url\":\"https:\\\/\\\/www.bcicentral.com\\\/get-project\\\/\",\"name\":\"Get Sample Project Leads | BCI Central\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.bcicentral.com\\\/#website\"},\"datePublished\":\"2025-12-09T12:26:05+00:00\",\"dateModified\":\"2026-01-07T03:23:55+00:00\",\"description\":\"Access exclusive construction information and receive up to 3 project leads every 90 days. Get free sample project leads today!\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.bcicentral.com\\\/get-project\\\/#breadcrumb\"},\"inLanguage\":\"ms-MY\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.bcicentral.com\\\/get-project\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.bcicentral.com\\\/get-project\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.bcicentral.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Get Project\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.bcicentral.com\\\/#website\",\"url\":\"https:\\\/\\\/www.bcicentral.com\\\/\",\"name\":\"LeadManager - A Hubexo Product\",\"description\":\"Enabling sales success with construction data &amp; software solutions.\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.bcicentral.com\\\/#organization\"},\"alternateName\":\"LeadManager\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.bcicentral.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"ms-MY\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.bcicentral.com\\\/#organization\",\"name\":\"LeadManager\",\"alternateName\":\"LeadManager\",\"url\":\"https:\\\/\\\/www.bcicentral.com\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ms-MY\",\"@id\":\"https:\\\/\\\/www.bcicentral.com\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.bcicentral.com\\\/wp-content\\\/uploads\\\/2024\\\/11\\\/cropped-Interim-Brandmark-BCI-Central-small-RGB.png\",\"contentUrl\":\"https:\\\/\\\/www.bcicentral.com\\\/wp-content\\\/uploads\\\/2024\\\/11\\\/cropped-Interim-Brandmark-BCI-Central-small-RGB.png\",\"width\":512,\"height\":512,\"caption\":\"LeadManager\"},\"image\":{\"@id\":\"https:\\\/\\\/www.bcicentral.com\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/bcicentral.group\",\"https:\\\/\\\/x.com\\\/BCICentralAU\",\"https:\\\/\\\/www.instagram.com\\\/bcicentral\\\/\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/bcicentral\\\/\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Get Sample Project Leads | BCI Central","description":"Access exclusive construction information and receive up to 3 project leads every 90 days. Get free sample project leads today!","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.bcicentral.com\/ms\/get-project\/","og_locale":"ms_MY","og_type":"article","og_title":"Get Sample Project Leads | BCI Central","og_description":"Access exclusive construction information and receive up to 3 project leads every 90 days. Get free sample project leads today!","og_url":"https:\/\/www.bcicentral.com\/ms\/get-project\/","og_site_name":"LeadManager (formerly BCI Central)","article_publisher":"https:\/\/www.facebook.com\/bcicentral.group","article_modified_time":"2026-01-07T03:23:55+00:00","og_image":[{"width":512,"height":512,"url":"https:\/\/www.bcicentral.com\/wp-content\/uploads\/2024\/11\/cropped-Interim-Brandmark-BCI-Central-small-RGB.png","type":"image\/png"}],"twitter_card":"summary_large_image","twitter_site":"@BCICentralAU","twitter_misc":{"Est. reading time":"13 minit"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.bcicentral.com\/get-project\/","url":"https:\/\/www.bcicentral.com\/get-project\/","name":"Get Sample Project Leads | BCI Central","isPartOf":{"@id":"https:\/\/www.bcicentral.com\/#website"},"datePublished":"2025-12-09T12:26:05+00:00","dateModified":"2026-01-07T03:23:55+00:00","description":"Access exclusive construction information and receive up to 3 project leads every 90 days. Get free sample project leads today!","breadcrumb":{"@id":"https:\/\/www.bcicentral.com\/get-project\/#breadcrumb"},"inLanguage":"ms-MY","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.bcicentral.com\/get-project\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.bcicentral.com\/get-project\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.bcicentral.com\/"},{"@type":"ListItem","position":2,"name":"Get Project"}]},{"@type":"WebSite","@id":"https:\/\/www.bcicentral.com\/#website","url":"https:\/\/www.bcicentral.com\/","name":"LeadManager - A Hubexo Product","description":"Mendayakan kejayaan jualan dengan penyelesaian data &amp; perisian pembinaan.","publisher":{"@id":"https:\/\/www.bcicentral.com\/#organization"},"alternateName":"LeadManager","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.bcicentral.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"ms-MY"},{"@type":"Organization","@id":"https:\/\/www.bcicentral.com\/#organization","name":"LeadManager","alternateName":"LeadManager","url":"https:\/\/www.bcicentral.com\/","logo":{"@type":"ImageObject","inLanguage":"ms-MY","@id":"https:\/\/www.bcicentral.com\/#\/schema\/logo\/image\/","url":"https:\/\/www.bcicentral.com\/wp-content\/uploads\/2024\/11\/cropped-Interim-Brandmark-BCI-Central-small-RGB.png","contentUrl":"https:\/\/www.bcicentral.com\/wp-content\/uploads\/2024\/11\/cropped-Interim-Brandmark-BCI-Central-small-RGB.png","width":512,"height":512,"caption":"LeadManager"},"image":{"@id":"https:\/\/www.bcicentral.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/bcicentral.group","https:\/\/x.com\/BCICentralAU","https:\/\/www.instagram.com\/bcicentral\/","https:\/\/www.linkedin.com\/company\/bcicentral\/"]}]}},"_links":{"self":[{"href":"https:\/\/www.bcicentral.com\/ms\/wp-json\/wp\/v2\/pages\/92523","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.bcicentral.com\/ms\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.bcicentral.com\/ms\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.bcicentral.com\/ms\/wp-json\/wp\/v2\/users\/9927"}],"replies":[{"embeddable":true,"href":"https:\/\/www.bcicentral.com\/ms\/wp-json\/wp\/v2\/comments?post=92523"}],"version-history":[{"count":81,"href":"https:\/\/www.bcicentral.com\/ms\/wp-json\/wp\/v2\/pages\/92523\/revisions"}],"predecessor-version":[{"id":93007,"href":"https:\/\/www.bcicentral.com\/ms\/wp-json\/wp\/v2\/pages\/92523\/revisions\/93007"}],"wp:attachment":[{"href":"https:\/\/www.bcicentral.com\/ms\/wp-json\/wp\/v2\/media?parent=92523"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}