{"id":17030,"date":"2026-05-22T01:39:17","date_gmt":"2026-05-22T01:39:17","guid":{"rendered":"https:\/\/www.dgcrane.com\/?p=17030"},"modified":"2026-05-22T01:59:01","modified_gmt":"2026-05-22T01:59:01","slug":"crane-dynamic-loading-calculator","status":"publish","type":"post","link":"https:\/\/www.dgcrane.com\/ur\/crane-dynamic-loading-calculator\/","title":{"rendered":"\u06a9\u0631\u06cc\u0646 \u0645\u062a\u062d\u0631\u06a9 \u0644\u0648\u0688\u0646\u06af \u06a9\u06cc\u0644\u06a9\u0648\u0644\u06cc\u0679\u0631"},"content":{"rendered":"<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, user-scalable=yes\">\n    <title>\u06a9\u0631\u06cc\u0646 \u0688\u0627\u0626\u0646\u0627\u0645\u06a9 \u0644\u0648\u0688 \u06a9\u06cc\u0644\u06a9\u0648\u0644\u06cc\u0679\u0631 | P_d = \u03c6\u00b7(Q+Q_h+G_t)<\/title>\n    <style>\n        \/* all styles are strictly scoped inside #calculator *\/\n        #calculator {\n            --primary-color: #0a3487;\n            --primary-hover: #F58423;\n            --error-color: #e53935;\n            --bg-color: #EAEEF7;\n            --text-color: #4a4a4a;\n            \n            display: block;\n            width: 100%;\n            background: var(--bg-color);\n            font-family: 'Segoe UI', Roboto, 'Helvetica Neue', sans-serif;\n            color: var(--text-color);\n        }\n        \n        \/* container for PC max-width & padding *\/\n        #calculator .calculator-container {\n            max-width: 545px;\n            padding: 30px;\n            margin: 0 auto;\n            background: var(--bg-color);\n            box-sizing: border-box;\n        }\n        \n        \/* typography *\/\n        #calculator .calculator-title {\n            font-size: 24px;\n            font-weight: 600;\n            margin: 0 0 4px 0;\n            color: var(--primary-color);\n            letter-spacing: -0.2px;\n        }\n        \n        #calculator .calculator-subtitle {\n            font-size: 14px;\n            margin: 0 0 24px 0;\n            font-family: monospace;\n            background: rgba(10,52,135,0.08);\n            display: inline-block;\n            padding: 4px 12px;\n            border-radius: 0;\n            color: var(--primary-color);\n        }\n        \n        \/* input groups *\/\n        #calculator .input-group {\n            margin-bottom: 20px;\n            width: 100%;\n            position: relative;\n        }\n        \n        #calculator label {\n            display: block;\n            font-size: 14px;\n            font-weight: 500;\n            margin-bottom: 6px;\n            color: var(--text-color);\n        }\n        \n        #calculator .var-symbol {\n            font-family: monospace;\n            font-weight: 700;\n            background: rgba(0,0,0,0.04);\n            padding: 0px 4px;\n            border-radius: 0;\n            margin-left: 4px;\n        }\n        \n        \/* wrapper for input + inline unit (unit placed inside input field on the right) *\/\n        #calculator .input-unit-wrapper {\n            position: relative;\n            width: 100%;\n        }\n        \n        #calculator .input-unit-wrapper .calculator-input {\n            width: 100%;\n            padding-right: 104px;\n        }\n        \n        #calculator .inline-unit {\n            position: absolute;\n            right: 1px;\n            top: 1px;\n            bottom: 1px;\n            display: flex;\n            align-items: center;\n            justify-content: center;\n            font-size: 14px;\n            font-weight: 500;\n            color: #aaaaaa;\n            background: transparent;\n            padding: 0 8px;\n            height: auto;\n            line-height: 1;\n            white-space: nowrap;\n            font-family: monospace;\n            pointer-events: none;\n            box-sizing: border-box;\n        }\n        \n        \/* select styling \u2014 no unit after select *\/\n        #calculator .calculator-input,\n        #calculator .calculator-select {\n            width: 100%;\n            height: 36px;\n            padding: 0 12px;\n            font-size: 16px;\n            border: 1px solid #ccc;\n            border-radius: 0;\n            background: white;\n            font-family: 'Segoe UI', 'SF Mono', monospace;\n            color: #333;\n            transition: all 0.2s ease;\n            box-sizing: border-box;\n        }\n        \n        #calculator .calculator-select {\n            cursor: pointer;\n            appearance: none;\n            background-image: url('data:image\/svg+xml;utf8,<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"%234a4a4a\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"6 9 12 15 18 9\"><\/polyline><\/svg>');\n            background-repeat: no-repeat;\n            background-position: right 12px center;\n            background-size: 14px;\n        }\n        \n        \/* ensure dropdown options have consistent font and spacing *\/\n        #calculator .calculator-select option {\n            font-size: 14px;\n            padding: 8px;\n            font-family: 'Segoe UI', 'SF Mono', monospace;\n            line-height: 1.4;\n            color: #333;\n        }\n        \n        #calculator .calculator-input:focus,\n        #calculator .calculator-select:focus {\n            outline: none;\n            border: 2px solid var(--primary-color);\n            padding: 0 11px;\n            height: 36px;\n        }\n        \n        #calculator .input-unit-wrapper .calculator-input:focus {\n            padding-right: 103px;\n        }\n        \n        \/* error state: border 2px solid error-color *\/\n        #calculator .calculator-input.error-input,\n        #calculator .calculator-select.error-input {\n            border: 2px solid var(--error-color);\n            padding: 0 11px;\n            height: 36px;\n        }\n        \n        #calculator .input-unit-wrapper .calculator-input.error-input {\n            padding-right: 103px;\n        }\n        \n        \/* error message styling *\/\n        #calculator .error-msg {\n            font-size: 12px;\n            color: var(--error-color);\n            margin-top: 5px;\n            display: none;\n            line-height: 1.2;\n        }\n        \n        #calculator .error-msg.visible {\n            display: block;\n        }\n        \n        \/* result area *\/\n        #calculator .result-area {\n            background: white;\n            margin: 20px 0 24px 0;\n            padding: 18px 16px;\n            text-align: center;\n            border-left: 4px solid var(--primary-color);\n            box-shadow: 0 1px 3px rgba(0,0,0,0.05);\n        }\n        \n        #calculator .result-label {\n            font-size: 14px;\n            font-weight: 500;\n            text-transform: uppercase;\n            letter-spacing: 1px;\n            color: var(--text-color);\n            margin-bottom: 8px;\n        }\n        \n        #calculator .result-value {\n            font-size: 40px;\n            font-weight: 800;\n            font-family: 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;\n            color: var(--primary-color);\n            line-height: 1.1;\n            word-break: break-word;\n        }\n        \n        #calculator .calculation-detail {\n            font-size: 12px;\n            font-family: monospace;\n            color: #6b7280;\n            margin-top: 8px;\n            border-top: 1px solid #ececec;\n            padding-top: 6px;\n        }\n        \n        \/* button group: horizontal flex on PC *\/\n        #calculator .button-group {\n            display: flex;\n            flex-direction: row;\n            gap: 16px;\n            margin-top: 8px;\n        }\n        \n        #calculator button {\n            flex: 1;\n            height: 36px;\n            font-size: 14px;\n            font-weight: 600;\n            border: none;\n            border-radius: 0;\n            cursor: pointer;\n            transition: all 0.2s ease;\n            font-family: inherit;\n        }\n        \n        #calculator .btn-primary {\n            background: var(--primary-color);\n            color: white;\n        }\n        \n        #calculator .btn-primary:hover {\n            background: var(--primary-hover);\n        }\n        \n        #calculator .btn-secondary {\n            background: #6c757d;\n            color: white;\n        }\n        \n        #calculator .btn-secondary:hover {\n            background: #5a6268;\n        }\n        \n        \/* mobile responsiveness (rem based, following spec) *\/\n        @media (max-width: 768px) {\n            #calculator .calculator-container {\n                padding: 20px;\n                max-width: 100%;\n            }\n            #calculator .calculator-input,\n            #calculator .calculator-select,\n            #calculator button,\n            #calculator .inline-unit {\n                height: 0.7rem;\n                font-size: 0.28rem;\n                line-height: 0.7rem;\n            }\n            #calculator .calculator-input,\n            #calculator .calculator-select {\n                height: 0.7rem;\n                padding: 0 0.2rem;\n                font-size: 0.28rem;\n            }\n            #calculator .input-unit-wrapper .calculator-input {\n                padding-right: 1.8rem;\n            }\n            #calculator .calculator-input:focus,\n            #calculator .calculator-select:focus {\n                padding: 0 0.18rem;\n                height: 0.7rem;\n            }\n            #calculator .input-unit-wrapper .calculator-input:focus {\n                padding-right: 1.78rem;\n            }\n            #calculator .calculator-input.error-input,\n            #calculator .calculator-select.error-input {\n                padding: 0 0.18rem;\n                height: 0.7rem;\n            }\n            #calculator .input-unit-wrapper .calculator-input.error-input {\n                padding-right: 1.78rem;\n            }\n            #calculator label {\n                font-size: 0.28rem;\n            }\n            #calculator .result-value {\n                font-size: 0.7rem;\n            }\n            #calculator .result-label,\n            #calculator .calculation-detail {\n                font-size: 0.24rem;\n            }\n            #calculator .btn-primary,\n            #calculator .btn-secondary {\n                font-size: 0.28rem;\n                height: 0.7rem;\n            }\n            #calculator .button-group {\n                flex-direction: column;\n                gap: 12px;\n            }\n            #calculator button {\n                width: 100%;\n            }\n            #calculator .calculator-title {\n                font-size: 0.5rem;\n            }\n            #calculator .calculator-subtitle {\n                font-size: 0.24rem;\n            }\n            #calculator .inline-unit {\n                font-size: 0.28rem;\n                padding: 0 0.2rem;\n            }\n            \/* option text slightly smaller on mobile but consistent *\/\n            #calculator .calculator-select option {\n                font-size: 0.28rem;\n            }\n        }\n        \n        \/* error priority: error border overrides focus *\/\n        #calculator .calculator-input.error-input:focus,\n        #calculator .calculator-select.error-input:focus {\n            border: 2px solid var(--error-color);\n        }\n        \n        \/* remove any default spinner on number input *\/\n        #calculator .calculator-input[type=\"number\"] {\n            -moz-appearance: textfield;\n        }\n        #calculator .calculator-input[type=\"number\"]::-webkit-inner-spin-button,\n        #calculator .calculator-input[type=\"number\"]::-webkit-outer-spin-button {\n            -webkit-appearance: none;\n            margin: 0;\n        }\n    <\/style>\n<\/head>\n<body>\n<div id=\"calculator\">\n    <div class=\"calculator-container\">\n        \n        \n        <!-- \u03c6 factor selection: Using ASCII symbols [+], [-], [!] for perfect size consistency -->\n        <div class=\"input-group\">\n            <label for=\"calculator-phi\">\u0645\u062a\u062d\u0631\u06a9 \u0639\u0646\u0635\u0631 <span class=\"var-symbol\">\u03c6<\/span><\/label>\n            <select id=\"calculator-phi\" class=\"calculator-select\">\n                <option value=\"1.1\">\ud83d\udd38 \u06a9\u0645 \u0631\u0641\u062a\u0627\u0631 \/ \u0644\u0627\u0626\u0679 \u0688\u06cc\u0648\u0679\u06cc \/ \u062f\u0631\u0633\u062a\u06af\u06cc \u06a9\u0646\u0679\u0631\u0648\u0644 \u2192 \u03c6 = 1.10<\/option>\n                <option value=\"1.2\">\ud83d\udd38 \u0631\u0648\u0627\u06cc\u062a\u06cc \u0635\u0646\u0639\u062a\u06cc (\u0631\u0648\u0634\u0646\u06cc) \u2192 \u03c6 = 1.20<\/option>\n                <option value=\"1.25\" selected>\ud83d\udd38 \u0631\u0648\u0627\u06cc\u062a\u06cc \u0635\u0646\u0639\u062a\u06cc (\u0645\u06cc\u0688\u06cc\u0645) \u2192 \u03c6 = 1.25<\/option>\n                <option value=\"1.3\">\ud83d\udd38 \u0631\u0648\u0627\u06cc\u062a\u06cc \u0635\u0646\u0639\u062a\u06cc (\u0628\u06be\u0627\u0631\u06cc) \u2192 \u03c6 = 1.30<\/option>\n                <option value=\"1.4\">\ud83d\udd38 \u06c1\u06cc\u0648\u06cc \u0688\u06cc\u0648\u0679\u06cc \/ \u0634\u062f\u06cc\u062f \u0633\u0631\u0648\u0633 \u2192 \u03c6 = 1.40<\/option>\n                <option value=\"1.5\">\ud83d\udd38\u0632\u06cc\u0627\u062f\u06c1 \u0627\u062b\u0631 \/ \u0645\u0644 \u0688\u06cc\u0648\u0679\u06cc \u2192 \u03c6 = 1.50<\/option>\n                <option value=\"1.6\">\ud83d\udd38\u0627\u0646\u062a\u06c1\u0627\u0626\u06cc \u062c\u06be\u0679\u06a9\u0627 \/ \u0634\u062f\u06cc\u062f \u0688\u06cc\u0648\u0679\u06cc \u2192 \u03c6 = 1.60<\/option>\n            <\/select>\n            <div class=\"error-msg\" id=\"error-phi\"><\/div>\n        <\/div>\n\n        <!-- Q : Rated load | unit placed AFTER input box (inline) -->\n        <div class=\"input-group\">\n            <label for=\"calculator-ratedLoad\">\u0634\u0631\u062d \u0634\u062f\u06c1 \u0644\u0648\u0688 <span class=\"var-symbol\">\u0633\u0648\u0627\u0644<\/span><\/label>\n            <div class=\"input-unit-wrapper\">\n                <input type=\"number\" id=\"calculator-ratedLoad\" class=\"calculator-input\" placeholder=\"\u0645\u062b\u0627\u0644 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631\u060c 20.0\" step=\"any\" value=\"20.0\">\n                <span class=\"inline-unit\">\u0679\u0646 (\u0679\u06cc)<\/span>\n            <\/div>\n            <div class=\"error-msg\" id=\"error-ratedLoad\"><\/div>\n        <\/div>\n\n        <!-- Q_h : Hook + lifting attachment weight | unit after input -->\n        <div class=\"input-group\">\n            <label for=\"calculator-hookWeight\">\u06c1\u06a9 \u0627\u0648\u0631 \u0627\u0679\u06cc\u0686\u0645\u0646\u0679 \u0645\u0627\u0633 <span class=\"var-symbol\">\u0633\u0648\u0627\u0644<sub>h<\/sub><\/span><\/label>\n            <div class=\"input-unit-wrapper\">\n                <input type=\"number\" id=\"calculator-hookWeight\" class=\"calculator-input\" placeholder=\"\u0645\u062b\u0627\u0644 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631\u060c 0.6\" step=\"any\" value=\"0.6\">\n                <span class=\"inline-unit\">\u0679\u0646 (\u0679\u06cc)<\/span>\n            <\/div>\n            <div class=\"error-msg\" id=\"error-hookWeight\"><\/div>\n        <\/div>\n\n        <!-- G_t : Trolley self-weight | unit after input -->\n        <div class=\"input-group\">\n            <label for=\"calculator-trolleyWeight\">\u0679\u0631\u0627\u0644\u06cc \u062e\u0648\u062f \u0648\u0632\u0646 <span class=\"var-symbol\">\u062c\u06cc<sub>t<\/sub><\/span><\/label>\n            <div class=\"input-unit-wrapper\">\n                <input type=\"number\" id=\"calculator-trolleyWeight\" class=\"calculator-input\" placeholder=\"\u0645\u062b\u0627\u0644 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631\u060c 5.4\" step=\"any\" value=\"5.4\">\n                <span class=\"inline-unit\">\u0679\u0646 (\u0679\u06cc)<\/span>\n            <\/div>\n            <div class=\"error-msg\" id=\"error-trolleyWeight\"><\/div>\n        <\/div>\n\n        <!-- Result display area -->\n        <div class=\"result-area\">\n            <div class=\"result-label\">\u0645\u062a\u062d\u0631\u06a9 \u0644\u0648\u0688 \u06a9\u0627 \u0646\u062a\u06cc\u062c\u06c1 <span>\u067e\u06cc<sub>\u0688\u06cc<\/sub><\/span><\/div>\n            <div class=\"result-value\" id=\"calculator-result\">\u2014 \u06a9\u06d2 \u0627\u06cc\u0646<\/div>\n            <div class=\"calculation-detail\" id=\"calc-detail\"><\/div>\n        <\/div>\n\n        <!-- Action Buttons -->\n        <div class=\"button-group\">\n            <button id=\"calculator-calcBtn\" class=\"btn-primary\">\u062d\u0633\u0627\u0628 \u0644\u06af\u0627\u0646\u0627<\/button>\n            <button id=\"calculator-resetBtn\" class=\"btn-secondary\">\u062f\u0648\u0628\u0627\u0631\u06c1 \u062a\u0631\u062a\u06cc\u0628 \u062f\u06cc\u06ba\u06d4<\/button>\n        <\/div>\n    <\/div>\n<\/div>\n\n<script>\n    (function() {\n        \/\/ DOM references\n        const phiSelect = document.getElementById('calculator-phi');\n        const ratedLoadInput = document.getElementById('calculator-ratedLoad');\n        const hookWeightInput = document.getElementById('calculator-hookWeight');\n        const trolleyWeightInput = document.getElementById('calculator-trolleyWeight');\n        const calcBtn = document.getElementById('calculator-calcBtn');\n        const resetBtn = document.getElementById('calculator-resetBtn');\n        const resultSpan = document.getElementById('calculator-result');\n        const calcDetailSpan = document.getElementById('calc-detail');\n        \n        \/\/ error message containers\n        const errorPhi = document.getElementById('error-phi');\n        const errorRated = document.getElementById('error-ratedLoad');\n        const errorHook = document.getElementById('error-hookWeight');\n        const errorTrolley = document.getElementById('error-trolleyWeight');\n        \n        \/\/ input fields for validation\n        const inputFields = [\n            { element: ratedLoadInput, errorDiv: errorRated, name: 'Rated load' },\n            { element: hookWeightInput, errorDiv: errorHook, name: 'Hook & attachment mass' },\n            { element: trolleyWeightInput, errorDiv: errorTrolley, name: 'Trolley self-weight' }\n        ];\n        const selectField = { element: phiSelect, errorDiv: errorPhi, name: 'Dynamic factor' };\n        \n        \/\/ conversion factor: tonnes -> kN\n        const TON_TO_KN = 9.80665;\n        \n        \/\/ Helper: clear error for a single input (remove class, hide message)\n        function clearErrorForInput(inputEl, errorDiv) {\n            if (inputEl) inputEl.classList.remove('error-input');\n            if (errorDiv) errorDiv.classList.remove('visible');\n        }\n        \n        \/\/ set error for single input\n        function setErrorForInput(inputEl, errorDiv, message) {\n            if (inputEl) inputEl.classList.add('error-input');\n            if (errorDiv) {\n                errorDiv.textContent = message || 'Invalid value';\n                errorDiv.classList.add('visible');\n            }\n        }\n        \n        \/\/ clear all errors\n        function clearAllErrors() {\n            inputFields.forEach(field => {\n                clearErrorForInput(field.element, field.errorDiv);\n            });\n            clearErrorForInput(selectField.element, selectField.errorDiv);\n        }\n        \n        \/\/ validate single numeric input (non-empty, valid number >=0)\n        function validateSingleInput(value, fieldName) {\n            if (value === undefined || value === null || value === '') {\n                return { valid: false, message: `${fieldName} cannot be empty.` };\n            }\n            const num = parseFloat(value);\n            if (isNaN(num)) {\n                return { valid: false, message: `${fieldName} must be a valid number.` };\n            }\n            if (num < 0) {\n                return { valid: false, message: `${fieldName} cannot be negative.` };\n            }\n            return { valid: true, value: num };\n        }\n        \n        \/\/ validate phi select\n        function validatePhi() {\n            const phiVal = phiSelect.value;\n            const num = parseFloat(phiVal);\n            if (isNaN(num)) {\n                return { valid: false, message: 'Dynamic factor must be a valid number.' };\n            }\n            if (num <= 0) {\n                return { valid: false, message: '\u03c6 must be greater than 0.' };\n            }\n            return { valid: true, value: num };\n        }\n        \n        \/\/ main validation routine\n        function validateAllInputs() {\n            let isValid = true;\n            \n            \/\/ Validate rated load\n            const ratedRaw = ratedLoadInput.value;\n            const ratedCheck = validateSingleInput(ratedRaw, 'Rated load');\n            if (!ratedCheck.valid) {\n                setErrorForInput(ratedLoadInput, errorRated, ratedCheck.message);\n                isValid = false;\n            } else {\n                clearErrorForInput(ratedLoadInput, errorRated);\n            }\n            \n            \/\/ Validate hook weight\n            const hookRaw = hookWeightInput.value;\n            const hookCheck = validateSingleInput(hookRaw, 'Hook &#038; attachment mass');\n            if (!hookCheck.valid) {\n                setErrorForInput(hookWeightInput, errorHook, hookCheck.message);\n                isValid = false;\n            } else {\n                clearErrorForInput(hookWeightInput, errorHook);\n            }\n            \n            \/\/ Validate trolley weight\n            const trolleyRaw = trolleyWeightInput.value;\n            const trolleyCheck = validateSingleInput(trolleyRaw, 'Trolley self-weight');\n            if (!trolleyCheck.valid) {\n                setErrorForInput(trolleyWeightInput, errorTrolley, trolleyCheck.message);\n                isValid = false;\n            } else {\n                clearErrorForInput(trolleyWeightInput, errorTrolley);\n            }\n            \n            \/\/ Validate phi\n            const phiCheck = validatePhi();\n            if (!phiCheck.valid) {\n                setErrorForInput(phiSelect, errorPhi, phiCheck.message);\n                isValid = false;\n            } else {\n                clearErrorForInput(phiSelect, errorPhi);\n            }\n            \n            if (isValid) {\n                return {\n                    valid: true,\n                    Q: parseFloat(ratedLoadInput.value),\n                    Qh: parseFloat(hookWeightInput.value),\n                    Gt: parseFloat(trolleyWeightInput.value),\n                    phi: parseFloat(phiSelect.value)\n                };\n            } else {\n                return { valid: false };\n            }\n        }\n        \n        \/\/ compute and update result (2 decimals)\n        function computeAndDisplay() {\n            const validation = validateAllInputs();\n            if (!validation.valid) {\n                resultSpan.textContent = '-- kN';\n                calcDetailSpan.textContent = '';\n                return;\n            }\n            \n            const { Q, Qh, Gt, phi } = validation;\n            const sumTon = Q + Qh + Gt;\n            const dynamicTonForce = phi * sumTon;\n            const dynamicKN = dynamicTonForce * TON_TO_KN;\n            const roundedKN = Math.round(dynamicKN * 100) \/ 100;\n            resultSpan.textContent = roundedKN.toFixed(2) + ' kN';\n            \n            \/\/ detail expression: consistent formatting\n            const sumFixed = sumTon.toFixed(3);\n            const phiFixed = phi.toFixed(3);\n            calcDetailSpan.innerHTML = `${phiFixed} \u00d7 (${Q.toFixed(2)} + ${Qh.toFixed(2)} + ${Gt.toFixed(2)}) t = ${phiFixed} \u00d7 ${sumFixed} t = ${dynamicTonForce.toFixed(3)} t \u2192 ${roundedKN.toFixed(2)} kN`;\n        }\n        \n        \/\/ reset all inputs to default values, clear errors &#038; reset result\n        function resetCalculator() {\n            ratedLoadInput.value = '20.0';\n            hookWeightInput.value = '0.6';\n            trolleyWeightInput.value = '5.4';\n            phiSelect.value = '1.25';   \/\/ medium duty default\n            \n            clearAllErrors();\n            \n            \/\/ reset result display\n            resultSpan.textContent = '-- kN';\n            calcDetailSpan.textContent = '';\n            \n            \/\/ additionally, remove error classes from all inputs (already cleared, but ensure)\n            inputFields.forEach(field => {\n                field.element.classList.remove('error-input');\n            });\n            if (phiSelect) phiSelect.classList.remove('error-input');\n        }\n        \n        \/\/ setup dynamic error clearing on input\/change\n        function setupDynamicErrorClearing() {\n            ratedLoadInput.addEventListener('input', function() {\n                clearErrorForInput(ratedLoadInput, errorRated);\n            });\n            hookWeightInput.addEventListener('input', function() {\n                clearErrorForInput(hookWeightInput, errorHook);\n            });\n            trolleyWeightInput.addEventListener('input', function() {\n                clearErrorForInput(trolleyWeightInput, errorTrolley);\n            });\n            phiSelect.addEventListener('change', function() {\n                clearErrorForInput(phiSelect, errorPhi);\n            });\n        }\n        \n        \/\/ calculate action\n        function onCalculate() {\n            computeAndDisplay();\n        }\n        \n        \/\/ reset action\n        function onReset() {\n            resetCalculator();\n        }\n        \n        \/\/ initialization\n        function init() {\n            setupDynamicErrorClearing();\n            calcBtn.addEventListener('click', onCalculate);\n            resetBtn.addEventListener('click', onReset);\n            \/\/ initial compute with default values (shows result on page load)\n            computeAndDisplay();\n        }\n        \n        if (document.readyState === 'loading') {\n            document.addEventListener('DOMContentLoaded', init);\n        } else {\n            init();\n        }\n    })();\n<\/script>\n<\/body>\n<\/html>\n\n\n\n<h2 class=\"wp-block-heading\">\u06a9\u0631\u06cc\u0646 \u0688\u0627\u0626\u0646\u0627\u0645\u06a9 \u0644\u0648\u0688\u0646\u06af \u06a9\u06cc\u0644\u06a9\u0648\u0644\u06cc\u0679\u0631 \u0641\u0627\u0631\u0645\u0648\u0644\u06c1<\/h2>\n\n\n\n<p>\u067e\u06cc<sub>\u0688\u06cc<\/sub>=\u03c6(Q+Q<sub>h<\/sub>+G<sub>t<\/sub>)<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u067e\u06cc<sub>\u0688\u06cc<\/sub>: \u0645\u062a\u062d\u0631\u06a9 \u0644\u0648\u0688<\/li>\n\n\n\n<li>\u03c6: \u0627\u062b\u0631 \u06a9\u0627 \u0639\u0646\u0635\u0631<\/li>\n\n\n\n<li>\u0633\u0648\u0627\u0644: \u0634\u0631\u062d \u0634\u062f\u06c1 \u0644\u0648\u0688<\/li>\n\n\n\n<li>\u0633\u0648\u0627\u0644<sub>h<\/sub>: \u06c1\u06a9 \u0627\u0648\u0631 \u0627\u0679\u06cc\u0686\u0645\u0646\u0679 \u0648\u0632\u0646 \u0627\u0679\u06be\u0627\u0646\u0627<\/li>\n\n\n\n<li>\u062c\u06cc<sub>t<\/sub>: \u0679\u0631\u0627\u0644\u06cc \u062e\u0648\u062f \u0648\u0632\u0646<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">\u0646\u0648\u0679\u0633<\/h2>\n\n\n\n<p>\u0627\u0635\u0644 \u06a9\u0631\u06cc\u0646 \u0622\u067e\u0631\u06cc\u0634\u0646 \u0645\u06cc\u06ba\u060c \u0627\u0633 \u067e\u0631 \u06a9\u0627\u0645 \u06a9\u0631\u0646\u06d2 \u0648\u0627\u0644\u06cc \u0642\u0648\u062a\u06cc\u06ba \u06c1\u0645\u06cc\u0634\u06c1 \u062c\u0627\u0645\u062f \u0628\u0648\u062c\u06be \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u06c1\u0648\u062a\u06cc \u06c1\u06cc\u06ba\u06d4 \u0627\u0679\u06be\u0627\u0646\u06d2 \u0627\u0648\u0631 \u0634\u0631\u0648\u0639 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0627\u062b\u0631\u0627\u062a\u060c \u0628\u0631\u06cc\u06a9 \u0644\u06af\u0627\u0646\u06d2 \u06a9\u06d2 \u062f\u0648\u0631\u0627\u0646 \u062c\u0691\u062a\u0627\u060c \u0645\u0648\u0679\u0631 \u06a9\u06cc \u062a\u06cc\u0632 \u0631\u0641\u062a\u0627\u0631\u06cc \u0633\u06d2 \u06a9\u0645\u067e\u0646\u060c \u0627\u0648\u0631 \u0628\u0648\u062c\u06be \u06a9\u06d2 \u062c\u06be\u0648\u0644\u0646\u06d2 \u0633\u06d2 \u0645\u062a\u062d\u0631\u06a9 \u0642\u0648\u062a\u06cc\u06ba \u0628\u0691\u06be \u062c\u0627\u062a\u06cc \u06c1\u06cc\u06ba\u06d4 \u0644\u06c1\u0630\u0627\u060c \u0627\u0646 \u0639\u0648\u0627\u0645\u0644 \u06a9\u0648 \u062d\u0633\u0627\u0628 \u06a9\u06d2 \u062f\u0648\u0631\u0627\u0646 \u0627\u06cc\u06a9 \u0645\u062a\u062d\u0631\u06a9 \u0628\u0648\u062c\u06be \u0639\u0646\u0635\u0631 \u0633\u06d2 \u0636\u0631\u0628 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u06d2\u06d4<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u06a9\u0645 \u0631\u0641\u062a\u0627\u0631\u060c \u06c1\u0644\u06a9\u06d2 \u0628\u0648\u062c\u06be \u06a9\u06d2 \u062d\u0627\u0644\u0627\u062a \u06cc\u0627 \u062f\u0631\u0633\u062a \u06a9\u0646\u0679\u0631\u0648\u0644 \u06a9\u06d2 \u0644\u06cc\u06d2\u060c \u03c6=1.1<\/li>\n\n\n\n<li>\u0631\u0648\u0627\u06cc\u062a\u06cc \u0635\u0646\u0639\u062a\u06cc \u06a9\u0631\u06cc\u0646\u0648\u06ba \u06a9\u06d2 \u0644\u06cc\u06d2\u060c \u03c6=1.2-1.3<\/li>\n\n\n\n<li>\u06c1\u06cc\u0648\u06cc \u0688\u06cc\u0648\u0679\u06cc \u06cc\u0627 \u0633\u062e\u062a \u06a9\u0627\u0645 \u06a9\u0631\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u062d\u0627\u0644\u0627\u062a\u060c \u06cc\u0627 \u0627\u06c1\u0645 \u0627\u062b\u0631 \u0648\u0627\u0644\u06cc \u0622\u067e\u0631\u06cc\u0679\u0646\u06af \u0631\u06cc\u0627\u0633\u062a\u0648\u06ba \u06a9\u06d2 \u0644\u06cc\u06d2\u060c \u03c6=1.4-1.6<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">\u0642\u0627\u0628\u0644 \u0627\u0637\u0644\u0627\u0642 \u06a9\u0631\u06cc\u0646\u06cc\u06ba<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u0627\u0648\u0648\u0631 \u06c1\u06cc\u0688 \u06a9\u0631\u06cc\u0646\u06cc\u06ba<\/li>\n\n\n\n<li>Gnatry \u06a9\u0631\u06cc\u0646\u06cc\u06ba<\/li>\n\n\n\n<li>\u0627\u0644\u06cc\u06a9\u0679\u0631\u06a9 \u0679\u0631\u0627\u0644\u06cc \/ \u0644\u06c1\u0631\u0627\u0646\u06d2 \u0648\u0627\u0644\u0627<\/li>\n\n\n\n<li>\u067e\u0648\u0631\u0679 \u06a9\u0631\u06cc\u0646\u0632<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">\u063a\u06cc\u0631 \u0642\u0627\u0628\u0644 \u0627\u0637\u0644\u0627\u0642 \u0635\u0648\u0631\u062a\u062d\u0627\u0644<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u062a\u06cc\u0632 \u0631\u0641\u062a\u0627\u0631 \u06af\u06be\u0648\u0645\u0646\u06d2 \u0648\u0627\u0644\u06cc \u0645\u0634\u06cc\u0646\u0631\u06cc (\u0679\u0631\u0628\u0627\u0626\u0646\u0632\u060c \u0627\u0646\u062c\u0646)<\/li>\n\n\n\n<li>\u067e\u0631\u06cc\u0633\u062c\u0646 \u0645\u0634\u06cc\u0646 \u0679\u0648\u0644 \u0633\u067e\u0646\u0688\u0644 \u0633\u0633\u0679\u0645<\/li>\n\n\n\n<li>\u0627\u0646\u0679\u06cc\u0644\u062c\u0646\u0679 \u06c1\u0648\u0633\u0679\u0646\u06af \u0633\u0633\u0679\u0645 (\u062e\u0648\u062f\u06a9\u0627\u0631 \u0627\u06cc\u0646\u0679\u06cc \u0633\u0648\u06d2 \u06a9\u0646\u0679\u0631\u0648\u0644)<\/li>\n<\/ul>","protected":false},"excerpt":{"rendered":"\u06a9\u0631\u06cc\u0646 \u0688\u0627\u0626\u0646\u0627\u0645\u06a9 \u0644\u0648\u0688\u0646\u06af \u06a9\u06cc\u0644\u06a9\u0648\u0644\u06cc\u0679\u0631 \u06a9\u06cc \u0628\u0646\u06cc\u0627\u062f\u06cc \u0642\u062f\u0631 \u0635\u0631\u0641 \u062c\u0627\u0645\u062f \u0648\u0632\u0646 \u0627\u0679\u06be\u0627\u0646\u06d2 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2 \u0627\u0635\u0644 \u0622\u067e\u0631\u06cc\u0634\u0646 \u0645\u06cc\u06ba \u0627\u0679\u06be\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u0627\u0636\u0627\u0641\u06cc \u0628\u0648\u062c\u06be \u06a9\u06cc \u0639\u06a9\u0627\u0633\u06cc \u06a9\u0631\u0646\u0627 \u06c1\u06d2\u060c \u062a\u0627\u06a9\u06c1 \u06a9\u0631\u06cc\u0646 \u06a9\u06d2 \u0688\u06be\u0627\u0646\u0686\u06d2 \u0627\u0648\u0631 \u0645\u06cc\u06a9\u0627\u0646\u0632\u0645 \u067e\u0631 \u0644\u06c1\u0631\u0627\u0646\u06d2 \u06a9\u06d2 \u0622\u063a\u0627\u0632\u060c \u0628\u0631\u06cc\u06a9 \u0644\u06af\u0627\u0646\u06d2\u060c \u062f\u0648\u0691\u0646\u06d2 \u06a9\u06d2 \u062c\u06be\u0679\u06a9\u06d2\u060c \u0648\u0627\u0626\u0628\u0631\u06cc\u0634\u0646 \u0627\u0648\u0631 \u0644\u0648\u0688 \u062c\u06be\u0648\u0644\u0646\u06d2 \u062c\u06cc\u0633\u06d2 \u0645\u062a\u062d\u0631\u06a9 \u0637\u0631\u0632 \u0639\u0645\u0644 \u06a9\u06d2 \u0627\u062b\u0631\u0627\u062a \u06a9\u0627 \u062f\u0631\u0633\u062a \u0627\u0646\u062f\u0627\u0632\u06c1 \u0644\u06af\u0627\u06cc\u0627 \u062c\u0627 \u0633\u06a9\u06d2\u06d4 \u06cc\u06c1 \u0645\u06cc\u0646 \u06af\u0631\u0688\u0631\u0632 \u06a9\u06cc \u0645\u0636\u0628\u0648\u0637\u06cc \u0627\u0648\u0631 \u0627\u0646\u062d\u0637\u0627\u0637 \u06a9\u06cc \u062c\u0627\u0646\u0686\u060c \u0627\u062e\u062a\u062a\u0627\u0645\u06cc \u0628\u06cc\u0645 \u06a9\u06d2 \u062f\u0628\u0627\u0624 \u0627\u0648\u0631 \u0631\u06cc\u0644 \u062a\u0646\u0627\u0624 \u06a9\u06d2 \u062a\u062c\u0632\u06cc\u06c1 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0633\u0627\u062a\u06be \u0645\u0648\u0679\u0631\u0632\u060c \u0628\u0631\u06cc\u06a9\u0648\u06ba \u0627\u0648\u0631 \u062f\u06cc\u06af\u0631 \u0627\u06c1\u0645 \u0627\u062c\u0632\u0627\u0621 \u06a9\u06cc \u0642\u0633\u0645 \u06a9\u06d2 \u0627\u0646\u062a\u062e\u0627\u0628 \u0627\u0648\u0631 \u062d\u0641\u0627\u0638\u062a \u06a9\u06cc \u062a\u0648\u062b\u06cc\u0642 \u0645\u06cc\u06ba \u0645\u0624\u062b\u0631 \u0637\u0631\u06cc\u0642\u06d2 \u0633\u06d2 \u0645\u0639\u0627\u0648\u0646\u062a \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0648\u0631 \u0633\u0627\u062e\u062a\u06cc \u0688\u06cc\u0632\u0627\u0626\u0646\u060c \u0639\u0645\u0631 \u06a9\u06cc \u062a\u0634\u062e\u06cc\u0635 \u0627\u0648\u0631 \u0627\u0648\u0648\u0631 \u06c1\u06cc\u0688 \u0627\u0648\u0631 \u06af\u06cc\u0646\u0679\u0631\u06cc \u06a9\u06d2 \u062d\u0641\u0627\u0638\u062a\u06cc \u0633\u0631\u0679\u06cc\u0641\u06cc\u06a9\u06cc\u0634\u0646 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u06cc\u06a9 \u0627\u06c1\u0645 \u0628\u0646\u06cc\u0627\u062f \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u06a9\u0627\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4","protected":false},"author":8,"featured_media":17038,"parent":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"single-onlinetools.php","format":"standard","meta":{"_acf_changed":false,"rank_math_lock_modified_date":false,"pgc_sgb_lightbox_settings":"","footnotes":""},"categories":[63],"tags":[],"class_list":["post-17030","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-other"],"acf":[],"_links":{"self":[{"href":"https:\/\/www.dgcrane.com\/ur\/wp-json\/wp\/v2\/posts\/17030"}],"collection":[{"href":"https:\/\/www.dgcrane.com\/ur\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.dgcrane.com\/ur\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.dgcrane.com\/ur\/wp-json\/wp\/v2\/users\/8"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dgcrane.com\/ur\/wp-json\/wp\/v2\/comments?post=17030"}],"version-history":[{"count":6,"href":"https:\/\/www.dgcrane.com\/ur\/wp-json\/wp\/v2\/posts\/17030\/revisions"}],"predecessor-version":[{"id":17039,"href":"https:\/\/www.dgcrane.com\/ur\/wp-json\/wp\/v2\/posts\/17030\/revisions\/17039"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.dgcrane.com\/ur\/wp-json\/wp\/v2\/media\/17038"}],"wp:attachment":[{"href":"https:\/\/www.dgcrane.com\/ur\/wp-json\/wp\/v2\/media?parent=17030"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dgcrane.com\/ur\/wp-json\/wp\/v2\/categories?post=17030"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dgcrane.com\/ur\/wp-json\/wp\/v2\/tags?post=17030"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}