[removeprofile]
[html]<style>
.calculator {
max-width: 660px;
margin: 0 auto;
}
h1 {
background: url(https://forumstatic.ru/files/001c/9d/fc/28922.png) no-repeat center center;
border-radius: 2px;
box-shadow: 0px 0px 0px 1px #42594B, 0px 0px 0px 2px #181D1A;
padding: 10px;
margin: 0 0 46px;
}
h1 p {
color: #3B5A4D;
font-size: 22px;
font-family: var(--font-accent);
display: flex;
justify-content: center;
align-items: center;
line-height: 1.4;
padding: 0;
font-weight: 700;
letter-spacing: 0.03em;
text-transform: uppercase;
background: linear-gradient(181deg, #3B5A4D 0%, #56A289 100%);
-webkit-background-clip: text;
background-clip: text;
-webkit-text-fill-color: transparent;
filter: drop-shadow(1px 2px 1px rgba(0, 0, 0, 1));
text-align: center;
height: 89px;
}
.form-group {
margin-bottom: 20px;
}
select,
input {
width: 100%;
padding: 12px;
border: 2px solid #d7ccc8;
border-radius: 8px;
font-size: 16px;
background: #fafafa;
box-sizing: border-box;
}
.school-info {
margin-top: 15px;
margin-bottom: 15px;
background: rgba(0, 0, 0, .05);
border: 1px solid #969696;
padding: 15px 25px;
border-radius: 0 10px 10px;
}
.early-option input {
width: 10px;
height: 10px;
margin: 0 10px 2px 0;
}
.stage {
margin: 15px 0;
text-align: left;
background: rgba(0, 0, 0, .05);
border: 1px solid #969696;
padding: 15px 25px;
border-radius: 0 10px 10px;
}
.stage-title {
margin-bottom: 8px;
text-transform: uppercase;
font-size: 1.06em;
font-weight: 700;
letter-spacing: 0.06em;
}
.stage-dates {
display: flex;
justify-content: space-between;
margin: 10px 0;
font-size: 18px;
}
.stage-desc {
font-size: 14px;
color: #666;
margin-top: 8px;
padding-top: 8px;
border-top: 1px solid transparent;
border-image: linear-gradient(90deg, #969696 0%, rgba(150, 150, 150, 0) 100%);
border-image-slice: 1;
}
.final {
margin: 30px 40px 0;
padding: 10px;
border: 1px solid transparent;
border-radius: 10px;
background: url(https://forumstatic.ru/files/001c/9d/fc/28922.png) no-repeat center center / cover padding-box, linear-gradient(270deg, #253836 0%, #4D5A59 50%, #253836 100%) border-box;
background-clip: padding-box, border-box;
text-align: center;
font-size: 20px;
text-transform: uppercase;
font-weight: 700;
color: #52645E;
}
.result {
margin-top: 25px;
}
</style>
<div class="calculator">
<h1>
<p>Калькулятор выпуска из школ магии</p>
</h1>
<div class="form-group">
<label for="school">Выберите школу:</label>
<select id="school">
<option value="hogwarts">Хогвартс</option>
<option value="beauxbatons">Шармбатон</option>
<option value="durmstrang">Дурмстранг</option>
<option value="koldovstorets">Колдовстворец</option>
<option value="ilvermorny">Ильверморни</option>
<option value="uagadou">Уагаду</option>
<option value="mahoutokoro">Махотокоро</option>
</select>
<div id="schoolDescription" class="school-info"></div>
</div>
<div class="form-group">
<label for="birthYear">Год рождения:</label>
<input type="number" id="birthYear" min="1800" max="2100" value="1953" placeholder="Введите год рождения">
</div>
<div class="form-group">
<label for="birthMonth">Месяц рождения:</label>
<select id="birthMonth">
<option value="1" selected>Январь</option>
<option value="2">Февраль</option>
<option value="3">Март</option>
<option value="4">Апрель</option>
<option value="5">Май</option>
<option value="6">Июнь</option>
<option value="7">Июль</option>
<option value="8">Август</option>
<option value="9">Сентябрь</option>
<option value="10">Октябрь</option>
<option value="11">Ноябрь</option>
<option value="12">Декабрь</option>
</select>
</div>
<div id="earlyOptionContainer" class="early-option" style="display: none;">
<input type="checkbox" id="earlyAdmission">
<label for="earlyAdmission" style="display: inline; font-weight: normal;">
Раннее поступление (с 7 лет)
</label>
</div>
<div id="result" class="result"></div>
</div>
<script>
const schoolRules = {
hogwarts: {
name: "Хогвартс",
description: "Шотландия • Базовый курс (5 лет) + Повышенный курс (2 года)",
stages: [
{ name: "Базовый курс (OWL)", startAge: 11, duration: 5, endAge: 16, desc: "базовый курс, сдача СОВ (5 лет, 11→16 лет)" },
{ name: "Повышенный курс (NEWT)", startAge: 16, duration: 2, endAge: 18, desc: "повышенный курс, сдача ЖАБА (2 года, 16→18 лет)" }
],
color: "#8B4513"
},
beauxbatons: {
name: "Шармбатон",
description: "Франция • Подготовительное (3 года) + Основной (6 лет) + Углубленный (2 года)",
stages: [
{ name: "Подготовительное отделение", startAge: 8, duration: 3, endAge: 11, desc: "подготовительное отделение (3 года, 8→11 лет)" },
{ name: "Основной курс", startAge: 11, duration: 6, endAge: 17, desc: "основной курс (6 лет, 11→17 лет)" },
{ name: "Углубленный курс", startAge: 17, duration: 2, endAge: 19, desc: "углубленный курс (2 года, 17→19 лет)" }
],
color: "#4169E1"
},
durmstrang: {
name: "Дурмстранг",
description: "Скандинавия • Раннее обучение (3 года) + Базовый (6 лет) + Полный (8 лет)",
stages: [
{ name: "Раннее обучение", startAge: 7, duration: 3, endAge: 10, desc: "раннее обучение (3 года, 7→10 лет)" },
{ name: "Базовый курс", startAge: 10, duration: 6, endAge: 16, desc: "базовый курс (6 лет, 10→16 лет)" },
{ name: "Полный курс", startAge: 10, duration: 8, endAge: 18, desc: "полный курс (8 лет, 10→18 лет)" }
],
color: "#8B0000"
},
koldovstorets: {
name: "Колдовстворец",
description: "Россия • Младшая (4 года) + Средняя (5 лет) + Старшая школа (3 года)",
stages: [
{ name: "Младшая школа", startAge: 7, duration: 4, endAge: 10, desc: "младшая школа (без факультетов, 4 года, 7→10 лет)" },
{ name: "Средняя школа", startAge: 11, duration: 5, endAge: 15, desc: "средняя школа (5 лет, 11→15 лет)" },
{ name: "Старшая школа", startAge: 16, duration: 3, endAge: 18, desc: "старшая школа (3 года, 16→18 лет)" }
],
color: "#B22222"
},
ilvermorny: {
name: "Ильверморни",
description: "США • Базовый курс (5 лет) + Полный курс (2 года)",
stages: [
{ name: "Базовый курс", startAge: 11, duration: 5, endAge: 16, desc: "базовый курс (5 лет, 11→16 лет)" },
{ name: "Полный курс", startAge: 16, duration: 2, endAge: 18, desc: "полный курс (2 года, 16→18 лет)" }
],
color: "#228B22"
},
uagadou: {
name: "Уагаду",
description: "Африка • Единый курс (8 лет)",
stages: [
{ name: "Полный курс", startAge: 10, duration: 8, endAge: 18, desc: "полное обучение (8 лет, 10→18 лет)" }
],
color: "#DAA520"
},
mahoutokoro: {
name: "Махотокоро",
description: "Япония • Подготовительная школа (4 года) + Полный курс (7 лет) + Магическая степень (3 года)",
stages: [
{ name: "Подготовительная школа", startAge: 7, duration: 4, endAge: 11, desc: "подготовительная школа (4 года, 7→11 лет)" },
{ name: "Полный курс", startAge: 11, duration: 7, endAge: 18, desc: "полный курс (7 лет, 11→18 лет)" },
{ name: "Магическая ученая степень", startAge: 18, duration: 3, endAge: 21, desc: "ученая степень (3 года, 18→21 год)" }
],
japaneseSchoolYear: true,
color: "#9932CC"
}
};
function calculateGraduation() {
const schoolSelect = document.getElementById('school');
const birthYearInput = document.getElementById('birthYear');
const birthMonthSelect = document.getElementById('birthMonth');
const earlyAdmission = document.getElementById('earlyAdmission');
const resultDiv = document.getElementById('result');
const schoolKey = schoolSelect.value;
const birthYear = parseInt(birthYearInput.value);
const birthMonth = parseInt(birthMonthSelect.value);
const useEarly = earlyAdmission?.checked || false;
if (!birthYear || birthYear < 1900 || birthYear > 2100) {
resultDiv.innerHTML = `<strong>❌ Ошибка:</strong> Пожалуйста, введите корректный год рождения (1900-2100)`;
resultDiv.style.backgroundColor = '#ffebee';
resultDiv.style.borderColor = '#f44336';
resultDiv.style.color = '#c62828';
return;
}
try {
const rules = schoolRules[schoolKey];
let allStages = [];
// Специальная обработка для разных школ
if (schoolKey === 'beauxbatons') {
// Подготовительное отделение (8→11 лет)
const prepStage = rules.stages[0];
const prepAdmission = calculateAdmissionYear(birthYear, birthMonth, prepStage.startAge, rules.japaneseSchoolYear);
const prepGraduation = prepAdmission + prepStage.duration;
allStages.push({
name: prepStage.name,
admission: prepAdmission,
graduation: prepGraduation,
desc: prepStage.desc
});
// Основной курс (11→17 лет)
const mainStage = rules.stages[1];
const mainAdmission = prepGraduation;
const mainGraduation = mainAdmission + mainStage.duration;
allStages.push({
name: mainStage.name,
admission: mainAdmission,
graduation: mainGraduation,
desc: mainStage.desc
});
// Углубленный курс (17→19 лет)
const advancedStage = rules.stages[2];
const advancedAdmission = mainGraduation;
const advancedGraduation = advancedAdmission + advancedStage.duration;
allStages.push({
name: advancedStage.name,
admission: advancedAdmission,
graduation: advancedGraduation,
desc: advancedStage.desc
});
} else if (schoolKey === 'durmstrang') {
if (useEarly) {
// Раннее обучение (7→10 лет)
const earlyStage = rules.stages[0];
const earlyAdmissionYear = calculateAdmissionYear(birthYear, birthMonth, earlyStage.startAge, rules.japaneseSchoolYear);
const earlyGraduationYear = earlyAdmissionYear + earlyStage.duration;
allStages.push({
name: earlyStage.name,
admission: earlyAdmissionYear,
graduation: earlyGraduationYear,
desc: earlyStage.desc
});
// Базовый курс (10→16 лет)
const baseStage = rules.stages[1];
const baseAdmissionYear = earlyGraduationYear;
const baseGraduationYear = baseAdmissionYear + baseStage.duration;
allStages.push({
name: baseStage.name,
admission: baseAdmissionYear,
graduation: baseGraduationYear,
desc: baseStage.desc
});
// Полный курс (до 18 лет)
const fullStage = rules.stages[2];
const fullAdmissionYear = baseGraduationYear;
const fullGraduationYear = fullAdmissionYear + (fullStage.duration - baseStage.duration);
allStages.push({
name: fullStage.name,
admission: fullAdmissionYear,
graduation: fullGraduationYear,
desc: fullStage.desc
});
} else {
// Базовый курс (10→16 лет)
const baseStage = rules.stages[1];
const baseAdmissionYear = calculateAdmissionYear(birthYear, birthMonth, baseStage.startAge, rules.japaneseSchoolYear);
const baseGraduationYear = baseAdmissionYear + baseStage.duration;
allStages.push({
name: baseStage.name,
admission: baseAdmissionYear,
graduation: baseGraduationYear,
desc: baseStage.desc
});
// Полный курс (до 18 лет)
const fullStage = rules.stages[2];
const fullAdmissionYear = baseGraduationYear;
const fullGraduationYear = fullAdmissionYear + (fullStage.duration - baseStage.duration);
allStages.push({
name: fullStage.name,
admission: fullAdmissionYear,
graduation: fullGraduationYear,
desc: fullStage.desc
});
}
} else if (schoolKey === 'hogwarts') {
// Базовый курс (OWL)
const owlStage = rules.stages[0];
const owlAdmission = calculateAdmissionYear(birthYear, birthMonth, owlStage.startAge, rules.japaneseSchoolYear);
const owlGraduation = owlAdmission + owlStage.duration;
allStages.push({
name: owlStage.name,
admission: owlAdmission,
graduation: owlGraduation,
desc: owlStage.desc
});
// Повышенный курс (NEWT)
const newtStage = rules.stages[1];
const newtAdmission = owlGraduation;
const newtGraduation = newtAdmission + newtStage.duration;
allStages.push({
name: newtStage.name,
admission: newtAdmission,
graduation: newtGraduation,
desc: newtStage.desc
});
} else if (schoolKey === 'ilvermorny') {
// Базовый курс (11→16 лет)
const baseStage = rules.stages[0];
const baseAdmission = calculateAdmissionYear(birthYear, birthMonth, baseStage.startAge, rules.japaneseSchoolYear);
const baseGraduation = baseAdmission + baseStage.duration;
allStages.push({
name: baseStage.name,
admission: baseAdmission,
graduation: baseGraduation,
desc: baseStage.desc
});
// Полный курс (16→18 лет)
const fullStage = rules.stages[1];
const fullAdmission = baseGraduation;
const fullGraduation = fullAdmission + fullStage.duration;
allStages.push({
name: fullStage.name,
admission: fullAdmission,
graduation: fullGraduation,
desc: fullStage.desc
});
} else if (schoolKey === 'koldovstorets') {
// Младшая школа (7→10 лет)
const juniorStage = rules.stages[0];
const juniorAdmission = calculateAdmissionYear(birthYear, birthMonth, juniorStage.startAge, rules.japaneseSchoolYear);
const juniorGraduation = juniorAdmission + juniorStage.duration;
allStages.push({
name: juniorStage.name,
admission: juniorAdmission,
graduation: juniorGraduation,
desc: juniorStage.desc
});
// Средняя школа (11→15 лет)
const middleStage = rules.stages[1];
const middleAdmission = juniorGraduation;
const middleGraduation = middleAdmission + middleStage.duration;
allStages.push({
name: middleStage.name,
admission: middleAdmission,
graduation: middleGraduation,
desc: middleStage.desc
});
// Старшая школа (16→18 лет)
const seniorStage = rules.stages[2];
const seniorAdmission = middleGraduation;
const seniorGraduation = seniorAdmission + seniorStage.duration;
allStages.push({
name: seniorStage.name,
admission: seniorAdmission,
graduation: seniorGraduation,
desc: seniorStage.desc
});
} else if (schoolKey === 'mahoutokoro') {
// Подготовительная школа (7→11 лет)
const prepStage = rules.stages[0];
const prepAdmission = calculateAdmissionYear(birthYear, birthMonth, prepStage.startAge, true);
const prepGraduation = prepAdmission + prepStage.duration;
allStages.push({
name: prepStage.name,
admission: prepAdmission,
graduation: prepGraduation,
desc: prepStage.desc
});
// Полный курс (11→18 лет)
const mainStage = rules.stages[1];
const mainAdmission = prepGraduation;
const mainGraduation = mainAdmission + mainStage.duration;
allStages.push({
name: mainStage.name,
admission: mainAdmission,
graduation: mainGraduation,
desc: mainStage.desc
});
// Магическая степень (18→21 год)
const degreeStage = rules.stages[2];
const degreeAdmission = mainGraduation;
const degreeGraduation = degreeAdmission + degreeStage.duration;
allStages.push({
name: degreeStage.name,
admission: degreeAdmission,
graduation: degreeGraduation,
desc: degreeStage.desc
});
} else {
// Для школ с одним курсом (Уагаду)
const stage = rules.stages[0];
const admissionYear = calculateAdmissionYear(birthYear, birthMonth, stage.startAge, rules.japaneseSchoolYear);
const graduationYear = admissionYear + stage.duration;
allStages.push({
name: stage.name,
admission: admissionYear,
graduation: graduationYear,
desc: stage.desc
});
}
// Формируем HTML
let html = '';
allStages.forEach((stage, index) => {
const stageNames = ['Первый этап', 'Второй этап', 'Третий этап', 'Четвертый этап'];
html += `
<div class="stage">
<div class="stage-title">${stageNames[index] || 'Следующий этап'}</div>
<div class="stage-dates">
<span>Поступление: <strong>${stage.admission}</strong></span>
<span>Выпуск: <strong>${stage.graduation}</strong></span>
</div>
<div class="stage-desc">${stage.desc}</div>
</div>
`;
});
// Итоговый выпуск
const finalYear = allStages[allStages.length - 1].graduation;
html += `
<div class="final">
Итоговый выпуск: ${finalYear} год
</div>
`;
resultDiv.innerHTML = html;
} catch (error) {
resultDiv.innerHTML = `<strong>❌ Ошибка:</strong> ${error.message}`;
}
}
function updateSchoolInfo() {
const schoolSelect = document.getElementById('school');
const schoolKey = schoolSelect.value;
const rules = schoolRules[schoolKey];
const descriptionDiv = document.getElementById('schoolDescription');
const earlyContainer = document.getElementById('earlyOptionContainer');
// Обновляем описание школы
descriptionDiv.textContent = rules.description;
// Показываем опцию раннего обучения только для Дурмстранга
if (schoolKey === 'durmstrang') {
earlyContainer.style.display = 'block';
} else {
earlyContainer.style.display = 'none';
document.getElementById('earlyAdmission').checked = false;
}
calculateGraduation();
}
// Функция для расчета года поступления
function calculateAdmissionYear(birthYear, birthMonth, startAge, isJapaneseSchool) {
if (isJapaneseSchool) {
// Японская система: учебный год начинается 1 апреля
if (birthMonth >= 1 && birthMonth <= 3) {
return birthYear + startAge;
} else {
return birthYear + startAge + 1;
}
} else {
// Стандартная система: учебный год начинается 1 сентября
if (birthMonth >= 1 && birthMonth <= 8) {
return birthYear + startAge;
} else {
return birthYear + startAge + 1;
}
}
}
// Обработчики событий
document.getElementById('school').addEventListener('change', updateSchoolInfo);
document.getElementById('birthYear').addEventListener('input', calculateGraduation);
document.getElementById('birthMonth').addEventListener('change', calculateGraduation);
document.getElementById('earlyAdmission').addEventListener('change', calculateGraduation);
// Инициализация
updateSchoolInfo();
</script>[/html]






