<!DOCTYPE html>
<html lang="fa">
<head>
  <meta charset="UTF-8" />
  <title>محاسبه مهریه به نرخ روز</title>
  <style>
body {
  font-family: inherit;
  direction: rtl;
  padding: 0;
  margin: 0;  
  background-color: #f5f5f5; 
}

.container {
  background-color: #fff;
  margin: 30px;
  padding: 30px; 
  border-radius: 10px;
  box-shadow: 0 0 10px #ccc;
  max-width: 600px; 
}
    h2 {
      color: #4a148c;
      margin-bottom: 20px;
    }
    label, select, input {
      display: block;
      width: 100%;
      margin-bottom: 10px;
      font-size: 16px;
      box-sizing: border-box;
    }
    input {
      padding: 8px;
      border: 1px solid #ccc;
      border-radius: 4px;
    }
    .result-box {
      background-color: #e0f7fa;
      padding: 15px;
      border-radius: 8px;
      border: 1px solid #26c6da;
      margin-top: 20px;
      color: #006064;
      line-height: 1.6;
    }
    .amount-text {
      font-size: 14px;
      color: #666;
      margin-bottom: 10px;
      min-height: 24px;
      white-space: pre-wrap;
    }
    .error {
      background-color: #ffecec;
      border: 1px solid #f44336;
      color: #d32f2f;
      padding: 10px;
      border-radius: 8px;
      display: none;
      margin-top: 10px;
    }
        .spaced-lines p {
      margin-bottom: 10px;
    }
    .spaced-lines p:last-child {
      margin-bottom: 0;
    }
  </style>
</head>
<body>
  <div class="container">
    <h2>محاسبه مهریه به نرخ روز</h2>

    <label for="amount">مبلغ مهریه (ریال):</label>
    <input type="text" id="amount" placeholder="مثلاً ۵۰,۰۰۰,۰۰۰" inputmode="numeric" autocomplete="off" />
    <div class="amount-text" id="amount_words"></div>

    <label for="start_year">سال عقد:</label>
    <select id="start_year"></select>

    <label for="end_year">سال محاسبه:</label>
    <select id="end_year"></select>

    <div class="result-box" id="result" style="display: none;"></div>
    <div class="error" id="errorBox">لطفاً مبلغ صحیح وارد کنید.</div>
  </div>

  <script>
  // شاخص سال‌ها (اعداد فرضی و تقریبی شاخص قیمت/تورم)
  const index = {
    1320: 5,
    1325: 6,
    1330: 10,
    1335: 12,
    1340: 15,
    1345: 18,
    1350: 25,
    1355: 30,
    1360: 50,
    1365: 60,
    1370: 100,
    1375: 120,
    1380: 150,
    1385: 180,
    1390: 250,
    1395: 300,
    1400: 450,
    1404: 600
  };

  // تبدیل عدد انگلیسی به فارسی بدون جداکننده هزارگان
  function toPersianNumber(num) {
    return num.toString().replace(/\d/g, d => '۰۱۲۳۴۵۶۷۸۹'[d]);
  }

  // داینامیک ساختن لیست سال‌ها در select
  function populateYears() {
    const startYearSelect = document.getElementById("start_year");
    const endYearSelect = document.getElementById("end_year");
    const minYear = 1320;
    const maxYear = 1404;

    for(let y = minYear; y <= maxYear; y++) {
      const option1 = document.createElement("option");
      option1.value = y;
      option1.textContent = toPersianNumber(y);
      startYearSelect.appendChild(option1);

      const option2 = document.createElement("option");
      option2.value = y;
      option2.textContent = toPersianNumber(y);
      endYearSelect.appendChild(option2);
    }

    startYearSelect.value = 1404;
    endYearSelect.value = 1404;
  }

  // تبدیل عدد با جداکننده هزارگان انگلیسی (کاما)
  function numberWithCommas(x) {
    return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
  }

  // تبدیل رشته جداکننده‌دار انگلیسی به عدد (حذف همه غیر عدد)
  function unformatNumber(str) {
    return str.replace(/[^0-9]/g, '');
  }

  // تبدیل عدد به حروف فارسی (همان کد قبلی)
  Number.prototype.num2persian = function () {
    const e = ["صفر","یک","دو","سه","چهار","پنج","شش","هفت","هشت","نه","ده","یازده","دوازده","سیزده","چهارده","پانزده","شانزده","هفده","هجده","نوزده","بیست"];
    const t = ["", "", "بیست", "سی", "چهل", "پنجاه", "شصت", "هفتاد", "هشتاد", "نود"];
    const r = ["", "صد", "دویست", "سیصد", "چهارصد", "پانصد", "ششصد", "هفتصد", "هشتصد", "نهصد"];
    const i = ["", "هزار", "میلیون", "میلیارد", "بیلیون"];
    let o = this.toString().replace(/[^0-9]/g, '');
    if (o === '0' || o === '') return e[0];

    const chunk = (str) => {
      let arr = [];
      let len = str.length;
      while(len > 0) {
        arr.unshift(str.slice(Math.max(len - 3, 0), len));
        len -=3;
      }
      return arr;
    };

    const threeDigit = (num) => {
      let word = "";
      if (num === "000") return "";
      if (num.length < 3) num = ("000" + num).slice(-3);
      let [a,b,c] = num.split("").map(Number);
      if (a > 0) word += r[a];
      if (b > 1) {
        if (word) word += " و ";
        word += t[b];
        if (c > 0) word += " و " + e[c];
      } else if (b === 1 || c > 0) {
        if (word) word += " و ";
        if (b === 1) word += e[10 + c];
        else word += e[c];
      }
      return word;
    };

    const parts = chunk(o);
    let strArr = parts.map((p, idx) => {
      let part = threeDigit(p);
      if (part) return part + (i[parts.length - idx - 1] ? (" " + i[parts.length - idx -1]) : "");
      return "";
    }).filter(Boolean);

    return strArr.join(" و ");
  };

  document.addEventListener("DOMContentLoaded", function() {
    const amountInput = document.getElementById("amount");
    const amountWords = document.getElementById("amount_words");
    const startYear = document.getElementById("start_year");
    const endYear = document.getElementById("end_year");
    const resultBox = document.getElementById("result");
    const errorBox = document.getElementById("errorBox");

    populateYears();

    // به‌روز رسانی نمایش مبلغ به حروف و عدد با کاما
    function displayFormattedAmount(raw) {
      if (!raw) {
        amountWords.innerText = "";
        return;
      }
      const numberValue = Number(raw);
      if (isNaN(numberValue)) {
        amountWords.innerText = "";
        return;
      }
      
      amountWords.innerText = `عدد: ${numberWithCommas(numberValue).replace(/\d/g, d => '۰۱۲۳۴۵۶۷۸۹'[d])}\nبه حروف: ${numberValue.num2persian()} ریال`;
    }

    // دریافت شاخص با میانگین گیری خطی در صورت نبودن شاخص دقیق
    function getIndexValue(year) {
      if(index[year]) return index[year];

      const years = Object.keys(index).map(y => parseInt(y)).sort((a,b) => a-b);
      let low = null, high = null;
      for(let y of years) {
        if(y < year) low = y;
        if(y > year) {
          high = y;
          break;
        }
      }
      if(low === null) return index[years[0]];
      if(high === null) return index[years[years.length -1]];

      const lowIndex = index[low];
      const highIndex = index[high];
      const fraction = (year - low) / (high - low);
      return lowIndex + fraction * (highIndex - lowIndex);
    }

    // محاسبه و نمایش نتیجه
    function calculate(raw) {
      const start = parseInt(startYear.value);
      const end = parseInt(endYear.value);

      if (!raw || isNaN(raw) || !start || !end) {
        resultBox.style.display = "none";
        errorBox.style.display = raw ? "none" : "block";
        errorBox.innerText = "لطفاً مبلغ صحیح و سال‌ها را انتخاب کنید.";
        return;
      }

      if(start > end) {
        resultBox.style.display = "none";
        errorBox.style.display = "block";
        errorBox.innerText = "سال محاسبه نمی‌تواند قبل از سال عقد باشد.";
        return;
      }

      errorBox.style.display = "none";

      const startIndex = getIndexValue(start);
      const endIndex = getIndexValue(end);
      const adjusted = Number(raw) * (endIndex / startIndex);

      const rial = Math.round(adjusted);
      const toman = Math.round(adjusted / 10);

      const rialFormatted = numberWithCommas(rial).replace(/\d/g, d => '۰۱۲۳۴۵۶۷۸۹'[d]) + " ریال";
      const tomanFormatted = numberWithCommas(toman).replace(/\d/g, d => '۰۱۲۳۴۵۶۷۸۹'[d]) + " تومان";

      const rialWords = rial.num2persian() + " ریال";
      const tomanWords = toman.num2persian() + " تومان";

      resultBox.innerHTML = `
        <p>ارزش مهریه به نرخ روز:</p>
        <strong>${rialFormatted}</strong><br>
        <strong>${tomanFormatted}</strong>
        <br><br>
        <p>به حروف:</p>
        <div class="spaced-lines">
          <p>ریال: ${rialWords}</p>
          <p>تومان: ${tomanWords}</p>
        </div>
      `;
      resultBox.style.display = "block";
    }

    amountInput.addEventListener("input", function(e) {
      let input = amountInput;
      let oldVal = input.value;
      let cursorPos = input.selectionStart;

      // تبدیل فارسی به انگلیسی اعداد و حذف همه غیر عدد
      let englishDigits = oldVal.replace(/[۰۱۲۳۴۵۶۷۸۹]/g,function(d){
        return "0123456789"["۰۱۲۳۴۵۶۷۸۹".indexOf(d)];
      });
      let raw = unformatNumber(englishDigits);

      if(!raw) {
        input.value = "";
        amountWords.innerText = "";
        resultBox.style.display = "none";
        errorBox.style.display = "none";
        return;
      }

      let formattedNumber = numberWithCommas(raw);

      // تبدیل انگلیسی به فارسی
      let persianFormatted = formattedNumber.replace(/\d/g, d => '۰۱۲۳۴۵۶۷۸۹'[d]);

      // تنظیم مقدار جدید در input
      input.value = persianFormatted;

      // محاسبه تغییر طول رشته
      let diff = input.value.length - oldVal.length;

      // محاسبه موقعیت کرسر جدید با اصلاح
      let newCursorPos = cursorPos + diff;

      if(newCursorPos < 0) newCursorPos = 0;
      if(newCursorPos > input.value.length) newCursorPos = input.value.length;

      input.setSelectionRange(newCursorPos, newCursorPos);

      displayFormattedAmount(raw);
      calculate(raw);
    });

    startYear.addEventListener("change", function() {
      const raw = unformatNumber(amountInput.value.replace(/[۰۱۲۳۴۵۶۷۸۹]/g,function(d){
        return "0123456789"["۰۱۲۳۴۵۶۷۸۹".indexOf(d)];
      }));
      calculate(raw);
    });
    endYear.addEventListener("change", function() {
      const raw = unformatNumber(amountInput.value.replace(/[۰۱۲۳۴۵۶۷۸۹]/g,function(d){
        return "0123456789"["۰۱۲۳۴۵۶۷۸۹".indexOf(d)];
      }));
      calculate(raw);
    });
  });
  </script>
</body>
</html>


این ماشین حساب برای محاسبه مهریه هست، لطفا منطق محاسبه هر سال رو براساس شاخص تورم هر سال از همون سال 1315 تا 1404 تنظیم کن که درست حساب کنه، هیچ قابلیتی از این ماشین حساب رو هم کم نکن و فقط منطق محاسبه رو تنظیم کن