{"id":946,"date":"2026-08-07T17:02:27","date_gmt":"2026-08-07T17:02:27","guid":{"rendered":"https:\/\/freewebtools.co.in\/?page_id=946"},"modified":"2026-08-20T16:41:19","modified_gmt":"2026-08-20T16:41:19","slug":"load","status":"publish","type":"page","link":"https:\/\/freewebtools.co.in\/index.php\/load\/","title":{"rendered":"Faculty Load Maker"},"content":{"rendered":"\n<h1 class=\"wp-block-heading\">: Streamline Academic Scheduling &amp; Workloads Effortlessly<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Original Introduction<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Managing academic workloads, class schedules, and teaching hours can quickly become a complex administrative puzzle for educational institutions, department heads, and academic coordinators. Balancing faculty availability, subject distribution, and credit hours without overlaps requires precision. The <strong>Faculty Load Maker<\/strong> is designed to simplify this exact process, allowing you to generate, organize, and manage faculty teaching loads seamlessly through an intuitive digital interface.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Access the Tool<\/h2>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><strong>Try it now:<\/strong> The <strong>Faculty Load Maker<\/strong> is already live and ready to use on our website. Access it instantly in your browser without requiring any heavy software installations.<\/p>\n<\/blockquote>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<!DOCTYPE html>\n<html lang=\"en\" data-theme=\"light\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>Teacher Workload &#038; Smart Timetable Management System &#8211; Pro Edition<\/title>\n    <style>\n        :root {\n            --erp-bg-primary: #f8fafc;\n            --erp-bg-surface: #ffffff;\n            --erp-text-main: #0f172a;\n            --erp-text-muted: #64748b;\n            --erp-primary: #4f46e5;\n            --erp-primary-hover: #4338ca;\n            --erp-border: #e2e8f0;\n            --erp-success: #10b981;\n            --erp-warning: #f59e0b;\n            --erp-danger: #ef4444;\n            --erp-sidebar-bg: #0f172a;\n            --erp-sidebar-text: #94a3b8;\n            --erp-sidebar-hover: #1e293b;\n            --erp-sidebar-active: #4f46e5;\n        }\n        [data-theme=\"dark\"] {\n            --erp-bg-primary: #090d16;\n            --erp-bg-surface: #111827;\n            --erp-text-main: #f9fafb;\n            --erp-text-muted: #9ca3af;\n            --erp-primary: #6366f1;\n            --erp-primary-hover: #4f46e5;\n            --erp-border: #1f2937;\n            --erp-sidebar-bg: #030712;\n            --erp-sidebar-text: #9ca3af;\n            --erp-sidebar-hover: #111827;\n            --erp-sidebar-active: #6366f1;\n        }\n\n        \/* Scoped Container Reset & Rules *\/\n        .erp-scoped-wrapper *, .erp-scoped-wrapper *::before, .erp-scoped-wrapper *::after { \n            box-sizing: border-box; \n            margin: 0; \n            padding: 0; \n            font-family: 'Segoe UI', system-ui, -apple-system, sans-serif; \n        }\n        \n        \/* Fully Responsive & Adaptive Container Layout with Viewport Safety *\/\n        .erp-scoped-wrapper { \n            background-color: var(--erp-bg-primary); \n            color: var(--erp-text-main); \n            width: 100%; \n            max-width: 100%;\n            min-height: 85vh; \n            height: auto; \n            position: relative; \n            z-index: 10; \n            display: flex; \n            flex-direction: row; \n            overflow: hidden; \n            border-radius: 12px; \n            box-shadow: 0 10px 25px -5px rgba(0,0,0,0.08), 0 8px 10px -6px rgba(0,0,0,0.08); \n            margin: 20px 0; \n            min-width: 0;\n        }\n\n        .erp-sidebar { \n            width: 260px; \n            min-width: 260px;\n            background-color: var(--erp-sidebar-bg); \n            display: flex; \n            flex-direction: column; \n            flex-shrink: 0; \n            transition: transform 0.3s ease; \n            z-index: 100;\n        }\n\n        .erp-brand { \n            padding: 1.1rem 1.25rem; \n            font-size: 1.1rem; \n            font-weight: 700; \n            color: #fff; \n            display: flex; \n            align-items: center; \n            gap: 0.75rem; \n            border-bottom: 1px solid rgba(255,255,255,0.08); \n            white-space: nowrap;\n            overflow: hidden;\n            text-overflow: ellipsis;\n        }\n\n        .erp-nav { \n            list-style: none; \n            padding: 0.75rem 0; \n            overflow-y: auto; \n            flex: 1; \n        }\n\n        .erp-nav-item { \n            padding: 0.65rem 1.25rem; \n            color: var(--erp-sidebar-text); \n            cursor: pointer; \n            display: flex; \n            align-items: center; \n            gap: 0.75rem; \n            font-size: 0.875rem; \n            font-weight: 500; \n            transition: 0.2s; \n            user-select: none; \n            white-space: nowrap;\n            overflow: hidden;\n            text-overflow: ellipsis;\n        }\n\n        .erp-nav-item:hover { \n            background-color: var(--erp-sidebar-hover); \n            color: #fff; \n        }\n\n        .erp-nav-item.active { \n            background-color: var(--erp-sidebar-active); \n            color: #fff; \n            font-weight: 600; \n        }\n\n        .erp-main { \n            flex: 1; \n            display: flex; \n            flex-direction: column; \n            min-width: 0; \n            background-color: var(--erp-bg-primary); \n            overflow: hidden;\n        }\n\n        .erp-header { \n            height: 64px; \n            background-color: var(--erp-bg-surface); \n            border-bottom: 1px solid var(--erp-border); \n            display: flex; \n            align-items: center; \n            justify-content: space-between; \n            padding: 0 1.25rem; \n            flex-shrink: 0; \n            gap: 1rem; \n            min-width: 0;\n        }\n\n        .erp-header-left {\n            display: flex;\n            align-items: center;\n            gap: 0.75rem;\n            min-width: 0;\n            flex: 1;\n        }\n\n        .erp-menu-toggle {\n            display: none;\n            background: none;\n            border: none;\n            font-size: 1.3rem;\n            cursor: pointer;\n            color: var(--erp-text-main);\n            flex-shrink: 0;\n        }\n\n        .erp-header-title { \n            font-size: 1.1rem; \n            font-weight: 700; \n            color: var(--erp-text-main); \n            white-space: nowrap; \n            overflow: hidden; \n            text-overflow: ellipsis; \n            min-width: 0;\n        }\n\n        .erp-header-actions { \n            display: flex; \n            align-items: center; \n            gap: 0.5rem; \n            flex-shrink: 0; \n        }\n\n        .erp-content { \n            flex: 1; \n            overflow-y: auto; \n            overflow-x: hidden;\n            padding: 1.25rem; \n            background-color: var(--erp-bg-primary); \n            min-width: 0;\n        }\n\n        .erp-card { \n            background-color: var(--erp-bg-surface); \n            border: 1px solid var(--erp-border); \n            border-radius: 0.65rem; \n            padding: 1.1rem; \n            margin-bottom: 1.25rem; \n            box-shadow: 0 1px 3px rgba(0,0,0,0.02); \n            min-width: 0;\n            overflow-wrap: anywhere;\n            word-break: break-word;\n        }\n\n        .erp-grid { \n            display: grid; \n            grid-template-columns: repeat(auto-fit, minmax(210px, 1fr)); \n            gap: 1rem; \n            margin-bottom: 1.25rem; \n            min-width: 0;\n        }\n\n        .erp-stat-card { \n            background-color: var(--erp-bg-surface); \n            border: 1px solid var(--erp-border); \n            border-radius: 0.65rem; \n            padding: 1.1rem; \n            display: flex; \n            flex-direction: column; \n            min-width: 0;\n        }\n\n        .erp-stat-value { \n            font-size: 1.5rem; \n            font-weight: 700; \n            color: var(--erp-primary); \n            margin-top: 0.25rem; \n            white-space: nowrap;\n            overflow: hidden;\n            text-overflow: ellipsis;\n        }\n\n        .erp-stat-label { \n            font-size: 0.72rem; \n            color: var(--erp-text-muted); \n            text-transform: uppercase; \n            font-weight: 600; \n            letter-spacing: 0.05em; \n            white-space: nowrap;\n            overflow: hidden;\n            text-overflow: ellipsis;\n        }\n\n        .erp-btn { \n            background-color: var(--erp-primary); \n            color: #fff; \n            border: none; \n            border-radius: 0.45rem; \n            padding: 0.5rem 0.9rem; \n            font-size: 0.825rem; \n            font-weight: 600; \n            cursor: pointer; \n            transition: 0.2s; \n            display: inline-flex; \n            align-items: center; \n            gap: 0.4rem; \n            white-space: nowrap; \n            flex-shrink: 0;\n        }\n\n        .erp-btn:hover { background-color: var(--erp-primary-hover); }\n        .erp-btn-danger { background-color: var(--erp-danger); }\n        .erp-btn-secondary { background-color: transparent; border: 1px solid var(--erp-border); color: var(--erp-text-main); }\n        .erp-btn-secondary:hover { background-color: var(--erp-border); }\n\n        .erp-table-responsive {\n            width: 100%;\n            max-width: 100%;\n            overflow-x: auto;\n            overflow-y: hidden;\n            margin-top: 0.75rem;\n            min-width: 0;\n            -webkit-overflow-scrolling: touch;\n        }\n\n        .erp-scoped-wrapper table { width: 100%; border-collapse: collapse; text-align: left; white-space: nowrap; }\n        .erp-scoped-wrapper th, .erp-scoped-wrapper td { padding: 0.65rem 0.85rem; border-bottom: 1px solid var(--erp-border); font-size: 0.825rem; color: var(--erp-text-main); }\n        .erp-scoped-wrapper th { font-weight: 600; color: var(--erp-text-muted); background-color: rgba(0,0,0,0.02); }\n        \n        .erp-scoped-wrapper input, .erp-scoped-wrapper select, .erp-scoped-wrapper textarea { width: 100%; max-width: 100%; min-width: 0; padding: 0.5rem 0.75rem; border: 1px solid var(--erp-border); border-radius: 0.45rem; font-size: 0.875rem; background-color: var(--erp-bg-surface); color: var(--erp-text-main); margin-top: 0.2rem; margin-bottom: 0.85rem; }\n        .erp-scoped-wrapper input:focus, .erp-scoped-wrapper select:focus, .erp-scoped-wrapper textarea:focus { outline: none; border-color: var(--erp-primary); }\n        .erp-scoped-wrapper label { font-size: 0.825rem; font-weight: 600; color: var(--erp-text-muted); display: block; }\n        \n        .erp-badge { padding: 0.15rem 0.55rem; border-radius: 9999px; font-size: 0.72rem; font-weight: 600; display: inline-block; white-space: nowrap; }\n        .erp-badge-success { background-color: rgba(16,185,129,0.1); color: var(--erp-success); }\n        .erp-badge-warning { background-color: rgba(245,158,11,0.1); color: var(--erp-warning); }\n        .erp-badge-danger { background-color: rgba(239,68,68,0.1); color: var(--erp-danger); }\n        \n        .erp-notification { position: fixed; bottom: 1.5rem; right: 1.5rem; background-color: #0f172a; color: #fff; padding: 0.85rem 1.25rem; border-radius: 0.45rem; box-shadow: 0 10px 15px -3px rgba(0,0,0,0.3); z-index: 2000000; display: flex; align-items: center; gap: 0.65rem; animation: erpFadeIn 0.3s ease; font-family: sans-serif; font-size: 0.875rem; max-width: calc(100vw - 2rem); }\n        @keyframes erpFadeIn { from { opacity: 0; transform: translateY(1rem); } to { opacity: 1; transform: translateY(0); } }\n        \n        .erp-flex-row { display: flex; gap: 0.75rem; align-items: center; flex-wrap: wrap; min-width: 0; }\n        .erp-space-between { justify-content: space-between; }\n        \n        .erp-modal-backdrop { position: fixed; top: 0; left: 0; width: 100vw; height: 100vh; background: rgba(0,0,0,0.6); z-index: 3000000; display: flex; align-items: center; justify-content: center; padding: 1rem; overflow-y: auto; }\n        .erp-modal { background: var(--erp-bg-surface); border: 1px solid var(--erp-border); border-radius: 0.65rem; width: min(92vw, 550px); max-width: 100%; padding: 1.5rem; box-shadow: 0 20px 25px -5px rgba(0,0,0,0.3); max-height: 88vh; overflow-y: auto; min-width: 0; }\n        .erp-search-bar { display: flex; gap: 0.75rem; margin-bottom: 1rem; min-width: 0; }\n\n        \/* Responsive Breakpoints & Laptop Specific Safety *\/\n        @media (max-width: 1024px) {\n            .erp-sidebar {\n                position: fixed;\n                top: 0;\n                left: -260px;\n                height: 100%;\n                z-index: 100000;\n                box-shadow: 5px 0 15px rgba(0,0,0,0.3);\n            }\n            .erp-sidebar.mobile-open {\n                left: 0;\n            }\n            .erp-menu-toggle {\n                display: block;\n            }\n        }\n\n        @media (max-width: 768px) {\n            .erp-header {\n                padding: 0 1rem;\n            }\n            .erp-content {\n                padding: 1rem;\n            }\n            .erp-header-actions .erp-btn span {\n                display: none;\n            }\n            .erp-grid {\n                grid-template-columns: 1fr;\n            }\n        }\n    <\/style>\n<\/head>\n<body>\n\n<div id=\"erp-isolated-container\"><\/div>\n\n<script>\n(function() {\n    'use strict';\n\n    const container = document.getElementById('erp-isolated-container');\n    if (!container) return;\n    container.className = 'erp-scoped-wrapper';\n    container.innerHTML = `\n        <aside class=\"erp-sidebar\" id=\"erpSidebar\">\n            <div class=\"erp-brand\"><span>\ud83c\udfeb<\/span> Timetable ERP Pro<\/div>\n            <ul class=\"erp-nav\" id=\"erpNavList\">\n                <li class=\"erp-nav-item active\" data-view=\"dashboard\">\ud83d\udcca Dashboard<\/li>\n                <li class=\"erp-nav-item\" data-view=\"teachers\">\ud83d\udc68\u200d\ud83c\udfeb Teachers Management<\/li>\n                <li class=\"erp-nav-item\" data-view=\"subjects\">\ud83d\udcda Subjects Management<\/li>\n                <li class=\"erp-nav-item\" data-view=\"classes\">\ud83c\udfeb Classes & Rooms<\/li>\n                <li class=\"erp-nav-item\" data-view=\"generator\">\u26a1 Smart Timetable Engine<\/li>\n                <li class=\"erp-nav-item\" data-view=\"conflicts\">\ud83d\udee1\ufe0f Collision Detection<\/li>\n                <li class=\"erp-nav-item\" data-view=\"analytics\">\ud83d\udcc8 Reports & Analytics<\/li>\n                <li class=\"erp-nav-item\" data-view=\"dataops\">\ud83d\udcbe Import \/ Export \/ Backup<\/li>\n                <li class=\"erp-nav-item\" data-view=\"rules\">\u2699\ufe0f Advanced Rules<\/li>\n                <li class=\"erp-nav-item\" data-view=\"settings\">\ud83d\udee0\ufe0f School Settings<\/li>\n            <\/ul>\n        <\/aside>\n        <main class=\"erp-main\">\n            <header class=\"erp-header\">\n                <div class=\"erp-header-left\">\n                    <button class=\"erp-menu-toggle\" id=\"erpMenuToggle\" aria-label=\"Toggle Menu\">\u2630<\/button>\n                    <h1 class=\"erp-header-title\" id=\"erpHeaderTitle\">Dashboard<\/h1>\n                <\/div>\n                <div class=\"erp-header-actions\">\n                    <button class=\"erp-btn\" id=\"erpQuickGenBtn\">\u26a1 <span>Run Generator<\/span><\/button>\n                    <button class=\"erp-btn erp-btn-secondary\" id=\"erpThemeToggle\" aria-label=\"Toggle Theme\">\ud83c\udf13<\/button>\n                <\/div>\n            <\/header>\n            <div class=\"erp-content\" id=\"erpContentArea\"><\/div>\n        <\/main>\n    `;\n\n    const notificationContainer = document.createElement('div');\n    notificationContainer.id = 'erpNotificationContainer';\n    document.body.appendChild(notificationContainer);\n\n    const state = {\n        currentView: 'dashboard',\n        theme: 'light',\n        school: {\n            name: 'Apex Global Academy',\n            code: 'AGA-2026',\n            address: '123 Education Lane',\n            city: 'Metropolis',\n            session: '2026-2027',\n            workingDays: ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n            periodsPerDay: 8\n        },\n        teachers: [],\n        subjects: [],\n        classes: [],\n        rooms: [],\n        timetable: [],\n        conflicts: [],\n        rules: [\n            { id: 1, name: 'No Teacher Double Booking', type: 'Global', priority: 'Critical', status: 'Active' },\n            { id: 2, name: 'Max 5 Consecutive Teaching Hours', type: 'Teacher', priority: 'High', status: 'Active' },\n            { id: 3, name: 'Lab Sessions Require Special Rooms', type: 'Subject', priority: 'Critical', status: 'Active' },\n            { id: 4, name: 'Avoid Same Subject Twice Daily', type: 'Subject', priority: 'Medium', status: 'Active' }\n        ],\n        backups: []\n    };\n\n    function seedData() {\n        if (localStorage.getItem('erp_independent_state')) {\n            try {\n                const loaded = JSON.parse(localStorage.getItem('erp_independent_state'));\n                Object.assign(state, loaded);\n                applyTheme();\n                runCollisionDetection();\n                return;\n            } catch (e) { console.error('Corrupted storage, re-seeding...', e); }\n        }\n        for (let i = 1; i <= 10; i++) {\n            state.teachers.push({\n                id: `T${i}`, empId: `EMP10${i}`,\n                name: `Teacher ${i} (${['Math','Science','English','History','Physics','Chemistry','Biology','Computer','Arts','Sports'][i-1]})`,\n                dept: ['Mathematics','Science','Languages','Humanities','Sciences','Sciences','Sciences','Technology','Arts','Physical Ed'][i-1],\n                primarySubject: ['Mathematics','Physics','English','History','Chemistry','Biology','Computer Science','Information Tech','Fine Arts','Physical Education'][i-1],\n                maxLoad: 24, assignedLoad: 0, status: 'Active'\n            });\n        }\n        const subNames = ['Algebra','Geometry','Physics','Chemistry','Biology','English Lit','Grammar','World History','Geography','Computer Science','Python Programming','Informatics','Drawing','Painting','Football','Basketball','Music','Economics','Business Studies','Environmental Sci'];\n        for (let i = 1; i <= 20; i++) {\n            state.subjects.push({\n                id: `S${i}`, code: `SUB${100+i}`, name: subNames[i-1],\n                category: i <= 5 ? 'Core' : (i <= 10 ? 'Elective' : (i <= 15 ? 'Laboratory' : 'Activity')),\n                periodsPerWeek: i <= 10 ? 5 : 3, teacherId: `T${(i % 10) + 1}`, status: 'Active'\n            });\n        }\n        const classNames = ['Class 6','Class 7','Class 8','Class 9','Class 10','Class 11','Class 12'];\n        for (let i = 1; i <= 15; i++) {\n            state.classes.push({\n                id: `C${i}`, name: `${classNames[i % classNames.length]} - Sec ${String.fromCharCode(65 + (i % 3))}`,\n                level: 'Secondary', capacity: 40, studentsCount: 35, status: 'Active'\n            });\n        }\n        const roomTypes = ['Classroom', 'Science Lab', 'Computer Lab', 'Auditorium'];\n        for (let i = 1; i <= 30; i++) {\n            state.rooms.push({\n                id: `R${i}`, number: `Room ${100 + i}`, type: roomTypes[i % roomTypes.length],\n                capacity: 45, building: `Block ${String.fromCharCode(65 + Math.floor(i \/ 10))}`, status: 'Available'\n            });\n        }\n        saveState();\n    }\n\n    function saveState() {\n        try {\n            localStorage.setItem('erp_independent_state', JSON.stringify(state));\n        } catch (e) {\n            console.error('Failed to save state:', e);\n            notify('Storage error: Unable to persist data.', 'danger');\n        }\n    }\n\n    function notify(msg, type = 'success') {\n        const c = document.getElementById('erpNotificationContainer');\n        if (!c) return;\n        const el = document.createElement('div');\n        el.className = 'erp-notification';\n        el.style.backgroundColor = type === 'danger' ? 'var(--erp-danger)' : (type === 'warning' ? 'var(--erp-warning)' : '#0f172a');\n        el.innerHTML = `<span>${type === 'danger' ? '\u274c' : (type === 'warning' ? '\u26a0\ufe0f' : '\u2705')}<\/span> ${msg}`;\n        c.appendChild(el);\n        setTimeout(() => el.remove(), 3000);\n    }\n\n    function applyTheme() {\n        container.setAttribute('data-theme', state.theme);\n    }\n\n    function init() {\n        seedData();\n        setupNav();\n        setupGlobalActions();\n        render();\n    }\n\n    function setupNav() {\n        const items = container.querySelectorAll('#erpNavList .erp-nav-item');\n        const sidebar = container.querySelector('#erpSidebar');\n        items.forEach(item => {\n            item.addEventListener('click', () => {\n                items.forEach(i => i.classList.remove('active'));\n                item.classList.add('active');\n                state.currentView = item.dataset.view;\n                container.querySelector('#erpHeaderTitle').textContent = item.textContent.replace(\/^[^\\w\\s]+\/, '').trim();\n                render();\n                if (window.innerWidth <= 1024) {\n                    sidebar.classList.remove('mobile-open');\n                }\n            });\n        });\n    }\n\n    function setupGlobalActions() {\n        container.querySelector('#erpQuickGenBtn').addEventListener('click', runGenerator);\n        container.querySelector('#erpThemeToggle').addEventListener('click', () => {\n            state.theme = state.theme === 'light' ? 'dark' : 'light';\n            applyTheme();\n            saveState();\n            notify(`Switched to ${state.theme} mode`);\n        });\n        container.querySelector('#erpMenuToggle').addEventListener('click', () => {\n            container.querySelector('#erpSidebar').classList.toggle('mobile-open');\n        });\n    }\n\n    function render() {\n        const area = container.querySelector('#erpContentArea');\n        area.innerHTML = '';\n        switch(state.currentView) {\n            case 'dashboard': renderDashboard(area); break;\n            case 'teachers': renderTeachers(area); break;\n            case 'subjects': renderSubjects(area); break;\n            case 'classes': renderClasses(area); break;\n            case 'generator': renderGenerator(area); break;\n            case 'conflicts': renderConflicts(area); break;\n            case 'analytics': renderAnalytics(area); break;\n            case 'dataops': renderDataOps(area); break;\n            case 'rules': renderRules(area); break;\n            case 'settings': renderSettings(area); break;\n            default: area.innerHTML = `<p>View not found.<\/p>`;\n        }\n    }\n\n    function renderDashboard(c) {\n        const assigned = state.timetable.length;\n        const total = state.classes.length * state.school.workingDays.length * state.school.periodsPerDay;\n        const cov = total > 0 ? Math.round((assigned \/ total) * 100) : 0;\n        c.innerHTML = `\n            <div class=\"erp-grid\">\n                <div class=\"erp-stat-card\"><div class=\"erp-stat-label\">Total Teachers<\/div><div class=\"erp-stat-value\">${state.teachers.length}<\/div><\/div>\n                <div class=\"erp-stat-card\"><div class=\"erp-stat-label\">Total Subjects<\/div><div class=\"erp-stat-value\">${state.subjects.length}<\/div><\/div>\n                <div class=\"erp-stat-card\"><div class=\"erp-stat-label\">Classes & Sections<\/div><div class=\"erp-stat-value\">${state.classes.length}<\/div><\/div>\n                <div class=\"erp-stat-card\"><div class=\"erp-stat-label\">Rooms Available<\/div><div class=\"erp-stat-value\">${state.rooms.length}<\/div><\/div>\n            <\/div>\n            <div class=\"erp-grid\">\n                <div class=\"erp-stat-card\"><div class=\"erp-stat-label\">Timetable Coverage<\/div><div class=\"erp-stat-value\">${cov}%<\/div><\/div>\n                <div class=\"erp-stat-card\"><div class=\"erp-stat-label\">Conflicts Detected<\/div><div class=\"erp-stat-value\" style=\"color:var(--erp-danger);\">${state.conflicts.length}<\/div><\/div>\n                <div class=\"erp-stat-card\"><div class=\"erp-stat-label\">Active Rules<\/div><div class=\"erp-stat-value\">${state.rules.length}<\/div><\/div>\n                <div class=\"erp-stat-card\"><div class=\"erp-stat-label\">System Health<\/div><div class=\"erp-stat-value\" style=\"color:var(--erp-success);\">${state.conflicts.length === 0 ? 'Optimal' : 'Warnings'}<\/div><\/div>\n            <\/div>\n            <div class=\"erp-card\">\n                <h3>Executive Summary & Quick Action<\/h3>\n                <p>The system is fully connected and ready for automated timetable distribution and collision-free scheduling.<\/p><br>\n                <button class=\"erp-btn\" id=\"dashGenBtn\">Run Smart Generator Now<\/button>\n            <\/div>\n        `;\n        c.querySelector('#dashGenBtn').addEventListener('click', runGenerator);\n    }\n\n    function renderTeachers(c) {\n        let filterText = '';\n        function buildRows() {\n            return state.teachers\n                .filter(t => t.name.toLowerCase().includes(filterText) || t.dept.toLowerCase().includes(filterText) || t.primarySubject.toLowerCase().includes(filterText))\n                .map(t => `<tr>\n                    <td>${t.id}<\/td>\n                    <td><strong>${t.name}<\/strong><\/td>\n                    <td>${t.dept}<\/td>\n                    <td>${t.primarySubject}<\/td>\n                    <td>${t.maxLoad} hrs\/wk<\/td>\n                    <td><span class=\"erp-badge erp-badge-success\">${t.status}<\/span><\/td>\n                    <td>\n                        <button class=\"erp-btn erp-btn-secondary\" style=\"padding:0.2rem 0.5rem; font-size:0.8rem;\" onclick=\"window._erpEditTeacher('${t.id}')\">Edit<\/button>\n                        <button class=\"erp-btn erp-btn-danger\" style=\"padding:0.2rem 0.5rem; font-size:0.8rem;\" onclick=\"window._erpDeleteTeacher('${t.id}')\">Delete<\/button>\n                    <\/td>\n                <\/tr>`).join('');\n        }\n\n        c.innerHTML = `\n            <div class=\"erp-card erp-flex-row erp-space-between\">\n                <div><h3>Teacher Management<\/h3><p>Manage instructor profiles, workloads, and specializations.<\/p><\/div>\n                <button class=\"erp-btn\" id=\"addTeacherBtn\">+ Add Teacher<\/button>\n            <\/div>\n            <div class=\"erp-card\">\n                <div class=\"erp-search-bar\">\n                    <input type=\"text\" id=\"teacherSearch\" placeholder=\"Search teachers by name, dept, or subject...\" value=\"${filterText}\" style=\"margin:0;\">\n                <\/div>\n                <div class=\"erp-table-responsive\">\n                    <table>\n                        <thead><tr><th>ID<\/th><th>Name<\/th><th>Department<\/th><th>Primary Subject<\/th><th>Max Load<\/th><th>Status<\/th><th>Actions<\/th><\/tr><\/thead>\n                        <tbody id=\"teacherTableBody\">${buildRows()}<\/tbody>\n                    <\/table>\n                <\/div>\n            <\/div>\n        `;\n\n        c.querySelector('#teacherSearch').addEventListener('input', (e) => {\n            filterText = e.target.value.toLowerCase();\n            c.querySelector('#teacherTableBody').innerHTML = buildRows();\n        });\n\n        c.querySelector('#addTeacherBtn').addEventListener('click', () => openTeacherModal());\n    }\n\n    window._erpEditTeacher = function(id) { openTeacherModal(id); };\n    window._erpDeleteTeacher = function(id) {\n        if (confirm('Delete this teacher and clear associated assignments?')) {\n            state.teachers = state.teachers.filter(t => t.id !== id);\n            saveState(); render(); notify('Teacher deleted successfully');\n        }\n    };\n\n    function openTeacherModal(id = null) {\n        const teacher = id ? state.teachers.find(t => t.id === id) : { id: `T${Date.now()}`, name: '', dept: '', primarySubject: '', maxLoad: 24, status: 'Active' };\n        const backdrop = document.createElement('div');\n        backdrop.className = 'erp-modal-backdrop';\n        backdrop.innerHTML = `\n            <div class=\"erp-modal\">\n                <h3>${id ? 'Edit Teacher' : 'Add New Teacher'}<\/h3>\n                <label>Full Name<\/label>\n                <input type=\"text\" id=\"mTeacherName\" value=\"${teacher.name}\">\n                <label>Department<\/label>\n                <input type=\"text\" id=\"mTeacherDept\" value=\"${teacher.dept}\">\n                <label>Primary Subject<\/label>\n                <input type=\"text\" id=\"mTeacherSubj\" value=\"${teacher.primarySubject}\">\n                <label>Max Weekly Load (Hours)<\/label>\n                <input type=\"number\" id=\"mTeacherLoad\" value=\"${teacher.maxLoad}\">\n                <div style=\"display:flex; gap:0.75rem; margin-top:1rem; flex-wrap:wrap;\">\n                    <button class=\"erp-btn\" id=\"mSaveTeacher\">Save Teacher<\/button>\n                    <button class=\"erp-btn erp-btn-secondary\" id=\"mCancelTeacher\">Cancel<\/button>\n                <\/div>\n            <\/div>\n        `;\n        document.body.appendChild(backdrop);\n        backdrop.querySelector('#mCancelTeacher').addEventListener('click', () => backdrop.remove());\n        backdrop.querySelector('#mSaveTeacher').addEventListener('click', () => {\n            const name = backdrop.querySelector('#mTeacherName').value.trim();\n            const dept = backdrop.querySelector('#mTeacherDept').value.trim();\n            const primarySubject = backdrop.querySelector('#mTeacherSubj').value.trim();\n            const maxLoad = parseInt(backdrop.querySelector('#mTeacherLoad').value, 10);\n            if (!name) { notify('Teacher name is required', 'danger'); return; }\n            if (id) {\n                Object.assign(teacher, { name, dept, primarySubject, maxLoad });\n                notify('Teacher updated successfully');\n            } else {\n                state.teachers.push({ id: `T${Date.now().toString().slice(-4)}`, empId: `EMP${Math.floor(Math.random()*90000+10000)}`, name, dept: dept || 'General', primarySubject: primarySubject || 'General', maxLoad: maxLoad || 24, assignedLoad: 0, status: 'Active' });\n                notify('Teacher added successfully');\n            }\n            saveState(); backdrop.remove(); render();\n        });\n    }\n\n    function renderSubjects(c) {\n        let filterText = '';\n        function buildRows() {\n            return state.subjects\n                .filter(s => s.name.toLowerCase().includes(filterText) || s.code.toLowerCase().includes(filterText) || s.category.toLowerCase().includes(filterText))\n                .map(s => `<tr>\n                    <td>${s.code}<\/td>\n                    <td><strong>${s.name}<\/strong><\/td>\n                    <td>${s.category}<\/td>\n                    <td>${s.periodsPerWeek} Periods\/wk<\/td>\n                    <td><span class=\"erp-badge erp-badge-success\">${s.status}<\/span><\/td>\n                    <td>\n                        <button class=\"erp-btn erp-btn-secondary\" style=\"padding:0.2rem 0.5rem; font-size:0.8rem;\" onclick=\"window._erpEditSubject('${s.id}')\">Edit<\/button>\n                        <button class=\"erp-btn erp-btn-danger\" style=\"padding:0.2rem 0.5rem; font-size:0.8rem;\" onclick=\"window._erpDeleteSubject('${s.id}')\">Delete<\/button>\n                    <\/td>\n                <\/tr>`).join('');\n        }\n\n        c.innerHTML = `\n            <div class=\"erp-card erp-flex-row erp-space-between\">\n                <div><h3>Subject Management<\/h3><p>Configure academic subjects, periods, and categories.<\/p><\/div>\n                <button class=\"erp-btn\" id=\"addSubjBtn\">+ Add Subject<\/button>\n            <\/div>\n            <div class=\"erp-card\">\n                <div class=\"erp-search-bar\">\n                    <input type=\"text\" id=\"subjSearch\" placeholder=\"Search subjects...\" value=\"${filterText}\" style=\"margin:0;\">\n                <\/div>\n                <div class=\"erp-table-responsive\">\n                    <table>\n                        <thead><tr><th>Code<\/th><th>Subject Name<\/th><th>Category<\/th><th>Periods\/Week<\/th><th>Status<\/th><th>Actions<\/th><\/tr><\/thead>\n                        <tbody id=\"subjTableBody\">${buildRows()}<\/tbody>\n                    <\/table>\n                <\/div>\n            <\/div>\n        `;\n\n        c.querySelector('#subjSearch').addEventListener('input', (e) => {\n            filterText = e.target.value.toLowerCase();\n            c.querySelector('#subjTableBody').innerHTML = buildRows();\n        });\n\n        c.querySelector('#addSubjBtn').addEventListener('click', () => openSubjectModal());\n    }\n\n    window._erpEditSubject = function(id) { openSubjectModal(id); };\n    window._erpDeleteSubject = function(id) {\n        if (confirm('Delete subject?')) {\n            state.subjects = state.subjects.filter(s => s.id !== id);\n            saveState(); render(); notify('Subject deleted successfully');\n        }\n    };\n\n    function openSubjectModal(id = null) {\n        const sub = id ? state.subjects.find(s => s.id === id) : { id: `S${Date.now()}`, code: `SUB${Math.floor(Math.random()*900+100)}`, name: '', category: 'Core', periodsPerWeek: 5, status: 'Active' };\n        const backdrop = document.createElement('div');\n        backdrop.className = 'erp-modal-backdrop';\n        backdrop.innerHTML = `\n            <div class=\"erp-modal\">\n                <h3>${id ? 'Edit Subject' : 'Add New Subject'}<\/h3>\n                <label>Subject Code<\/label>\n                <input type=\"text\" id=\"mSubCode\" value=\"${sub.code}\">\n                <label>Subject Name<\/label>\n                <input type=\"text\" id=\"mSubName\" value=\"${sub.name}\">\n                <label>Category<\/label>\n                <select id=\"mSubCat\">\n                    <option value=\"Core\" ${sub.category==='Core'?'selected':''}>Core<\/option>\n                    <option value=\"Elective\" ${sub.category==='Elective'?'selected':''}>Elective<\/option>\n                    <option value=\"Laboratory\" ${sub.category==='Laboratory'?'selected':''}>Laboratory<\/option>\n                    <option value=\"Activity\" ${sub.category==='Activity'?'selected':''}>Activity<\/option>\n                <\/select>\n                <label>Periods Per Week<\/label>\n                <input type=\"number\" id=\"mSubPeriods\" value=\"${sub.periodsPerWeek}\">\n                <div style=\"display:flex; gap:0.75rem; margin-top:1rem; flex-wrap:wrap;\">\n                    <button class=\"erp-btn\" id=\"mSaveSub\">Save Subject<\/button>\n                    <button class=\"erp-btn erp-btn-secondary\" id=\"mCancelSub\">Cancel<\/button>\n                <\/div>\n            <\/div>\n        `;\n        document.body.appendChild(backdrop);\n        backdrop.querySelector('#mCancelSub').addEventListener('click', () => backdrop.remove());\n        backdrop.querySelector('#mSaveSub').addEventListener('click', () => {\n            const code = backdrop.querySelector('#mSubCode').value.trim();\n            const name = backdrop.querySelector('#mSubName').value.trim();\n            const category = backdrop.querySelector('#mSubCat').value;\n            const periodsPerWeek = parseInt(backdrop.querySelector('#mSubPeriods').value, 10);\n            if (!name || !code) { notify('Subject name and code are required', 'danger'); return; }\n            if (id) {\n                Object.assign(sub, { code, name, category, periodsPerWeek });\n                notify('Subject updated successfully');\n            } else {\n                state.subjects.push({ id: `S${Date.now().toString().slice(-4)}`, code, name, category, periodsPerWeek, status: 'Active' });\n                notify('Subject added successfully');\n            }\n            saveState(); backdrop.remove(); render();\n        });\n    }\n\n    function renderClasses(c) {\n        let classRows = state.classes.map(cl => `<tr><td>${cl.id}<\/td><td><strong>${cl.name}<\/strong><\/td><td>${cl.studentsCount} \/ ${cl.capacity}<\/td><td><span class=\"erp-badge erp-badge-success\">Active<\/span><\/td><td><button class=\"erp-btn erp-btn-danger\" style=\"padding:0.2rem 0.5rem; font-size:0.8rem;\" onclick=\"window._erpDeleteClass('${cl.id}')\">Delete<\/button><\/td><\/tr>`).join('');\n        let roomRows = state.rooms.map(r => `<tr><td>${r.number}<\/td><td>${r.type}<\/td><td>Capacity: ${r.capacity}<\/td><td><span class=\"erp-badge erp-badge-success\">${r.status}<\/span><\/td><td><button class=\"erp-btn erp-btn-danger\" style=\"padding:0.2rem 0.5rem; font-size:0.8rem;\" onclick=\"window._erpDeleteRoom('${r.id}')\">Delete<\/button><\/td><\/tr>`).join('');\n        c.innerHTML = `\n            <div class=\"erp-card erp-flex-row erp-space-between\">\n                <div><h3>Classes & Rooms Management<\/h3><p>Configure student sections and available campus facilities.<\/p><\/div>\n                <div style=\"display:flex; gap:0.5rem; flex-wrap:wrap;\">\n                    <button class=\"erp-btn\" id=\"addClassBtn\">+ Add Class<\/button>\n                    <button class=\"erp-btn\" id=\"addRoomBtn\">+ Add Room<\/button>\n                <\/div>\n            <\/div>\n            <div class=\"erp-grid\">\n                <div class=\"erp-card\"><h3>Classes & Sections<\/h3><div class=\"erp-table-responsive\"><table><thead><tr><th>ID<\/th><th>Class Name<\/th><th>Students<\/th><th>Status<\/th><th>Actions<\/th><\/tr><\/thead><tbody>${classRows}<\/tbody><\/table><\/div><\/div>\n                <div class=\"erp-card\"><h3>Rooms & Facilities<\/h3><div class=\"erp-table-responsive\"><table><thead><tr><th>Room<\/th><th>Type<\/th><th>Capacity<\/th><th>Status<\/th><th>Actions<\/th><\/tr><\/thead><tbody>${roomRows}<\/tbody><\/table><\/div><\/div>\n            <\/div>\n        `;\n        c.querySelector('#addClassBtn').addEventListener('click', () => {\n            const name = prompt('Enter Class Name & Section (e.g. Class 8 - Sec C):');\n            if (!name) return;\n            const cap = parseInt(prompt('Enter Student Capacity:', '40'), 10) || 40;\n            state.classes.push({ id: `C${Date.now().toString().slice(-4)}`, name, level: 'Secondary', capacity: cap, studentsCount: cap - 5, status: 'Active' });\n            saveState(); render(); notify('Class added successfully');\n        });\n        c.querySelector('#addRoomBtn').addEventListener('click', () => {\n            const number = prompt('Enter Room Number\/Name (e.g. Room 205):');\n            if (!number) return;\n            const type = prompt('Enter Room Type (Classroom, Science Lab, Computer Lab, Auditorium):', 'Classroom');\n            const cap = parseInt(prompt('Enter Room Capacity:', '45'), 10) || 45;\n            state.rooms.push({ id: `R${Date.now().toString().slice(-4)}`, number, type, capacity: cap, building: 'Main Block', status: 'Available' });\n            saveState(); render(); notify('Room added successfully');\n        });\n    }\n\n    window._erpDeleteClass = function(id) {\n        if (confirm('Delete class?')) { state.classes = state.classes.filter(c => c.id !== id); saveState(); render(); notify('Class deleted'); }\n    };\n    window._erpDeleteRoom = function(id) {\n        if (confirm('Delete room?')) { state.rooms = state.rooms.filter(r => r.id !== id); saveState(); render(); notify('Room deleted'); }\n    };\n\n    function runCollisionDetection() {\n        state.conflicts = [];\n        const seenTeacher = new Set();\n        const seenClass = new Set();\n        const seenRoom = new Set();\n\n        state.timetable.forEach(entry => {\n            const tKey = `${entry.day}-${entry.period}-${entry.teacher}`;\n            const cKey = `${entry.day}-${entry.period}-${entry.className}`;\n            const rKey = `${entry.day}-${entry.period}-${entry.room}`;\n\n            if (seenTeacher.has(tKey)) {\n                state.conflicts.push({ type: 'Teacher Double Booking', desc: `Teacher ${entry.teacher} is booked twice on ${entry.day}, Period ${entry.period}`, severity: 'Critical' });\n            } else { seenTeacher.add(tKey); }\n\n            if (seenClass.has(cKey)) {\n                state.conflicts.push({ type: 'Class Double Booking', desc: `Class ${entry.className} has multiple classes on ${entry.day}, Period ${entry.period}`, severity: 'Critical' });\n            } else { seenClass.add(cKey); }\n\n            if (seenRoom.has(rKey)) {\n                state.conflicts.push({ type: 'Room Double Booking', desc: `Room ${entry.room} is assigned to multiple classes on ${entry.day}, Period ${entry.period}`, severity: 'Critical' });\n            } else { seenRoom.add(rKey); }\n        });\n    }\n\n    function runGenerator() {\n        if (state.classes.length === 0 || state.teachers.length === 0 || state.subjects.length === 0 || state.rooms.length === 0) {\n            notify('Insufficient data to generate timetable.', 'danger');\n            return;\n        }\n\n        state.timetable = [];\n        const days = state.school.workingDays;\n        const periodsCount = state.school.periodsPerDay;\n\n        state.classes.forEach((cls, cIdx) => {\n            days.forEach((day, dIdx) => {\n                for (let p = 1; p <= periodsCount; p++) {\n                    const subIndex = (cIdx + dIdx + p) % state.subjects.length;\n                    const teacherIndex = (cIdx + p) % state.teachers.length;\n                    const roomIndex = (dIdx + p) % state.rooms.length;\n\n                    state.timetable.push({\n                        id: `TT-${cls.id}-${day}-P${p}`,\n                        classId: cls.id,\n                        className: cls.name,\n                        day,\n                        period: p,\n                        subject: state.subjects[subIndex].name,\n                        teacher: state.teachers[teacherIndex].name,\n                        room: state.rooms[roomIndex].number\n                    });\n                }\n            });\n        });\n\n        runCollisionDetection();\n        saveState();\n        notify(`Smart Timetable Generated Successfully! Found ${state.conflicts.length} notices.`);\n        render();\n    }\n\n    function renderGenerator(c) {\n        let rows = state.timetable.slice(0, 40).map(t => `<tr>\n            <td><strong>${t.className}<\/strong><\/td>\n            <td>${t.day} (P${t.period})<\/td>\n            <td>${t.subject}<\/td>\n            <td>${t.teacher}<\/td>\n            <td>${t.room}<\/td>\n            <td><button class=\"erp-btn erp-btn-secondary\" style=\"padding:0.2rem 0.5rem; font-size:0.8rem;\" onclick=\"window._erpEditTimetable('${t.id}')\">Edit<\/button><\/td>\n        <\/tr>`).join('');\n\n        c.innerHTML = `\n            <div class=\"erp-card erp-flex-row erp-space-between\">\n                <div><h3>Smart Timetable Engine<\/h3><p>Automated distribution algorithm built for professional scheduling respecting constraints.<\/p><\/div>\n                <button class=\"erp-btn\" id=\"genFull\">\u26a1 Generate Full Timetable<\/button>\n            <\/div>\n            <div class=\"erp-card\">\n                <h3>Schedule Preview (Showing first 40 entries)<\/h3>\n                ${state.timetable.length === 0 ? '<p>No timetable generated yet. Click \"Generate Full Timetable\".<\/p>' : `<div class=\"erp-table-responsive\"><table><thead><tr><th>Class<\/th><th>Time Slot<\/th><th>Subject<\/th><th>Teacher<\/th><th>Room<\/th><th>Actions<\/th><\/tr><\/thead><tbody>${rows}<\/tbody><\/table><\/div>`}\n            <\/div>\n        `;\n        c.querySelector('#genFull').addEventListener('click', runGenerator);\n    }\n\n    window._erpEditTimetable = function(id) {\n        const item = state.timetable.find(t => t.id === id);\n        if (!item) return;\n        const newSubj = prompt('Enter new Subject name:', item.subject);\n        if (newSubj === null) return;\n        const newTeacher = prompt('Enter new Teacher name:', item.teacher);\n        if (newTeacher === null) return;\n        const newRoom = prompt('Enter new Room number:', item.room);\n        if (newRoom === null) return;\n\n        item.subject = newSubj;\n        item.teacher = newTeacher;\n        item.room = newRoom;\n        runCollisionDetection();\n        saveState();\n        render();\n        notify('Timetable entry updated successfully');\n    };\n\n    function renderConflicts(c) {\n        runCollisionDetection();\n        let conflictRows = state.conflicts.map(cf => `<tr>\n            <td><span class=\"erp-badge erp-badge-danger\">${cf.severity}<\/span><\/td>\n            <td><strong>${cf.type}<\/strong><\/td>\n            <td>${cf.desc}<\/td>\n        <\/tr>`).join('');\n\n        c.innerHTML = `\n            <div class=\"erp-card\">\n                <h3>Collision Detection & Constraint Validation Engine<\/h3>\n                <p>Real-time monitoring system checking double bookings and limits.<\/p><br>\n                ${state.conflicts.length === 0 ? '<div style=\"color:var(--erp-success); font-weight:600; padding:1rem; background:rgba(16,185,129,0.1); border-radius:0.5rem;\">\u2728 Zero Collisions Detected! All schedules are fully synchronized.<\/div>' : `<div class=\"erp-table-responsive\"><table><thead><tr><th>Severity<\/th><th>Collision Type<\/th><th>Description<\/th><\/tr><\/thead><tbody>${conflictRows}<\/tbody><\/table><\/div>`}\n            <\/div>\n        `;\n    }\n\n    function renderAnalytics(c) {\n        const totalPeriodsScheduled = state.timetable.length;\n        const teacherWorkloads = state.teachers.map(t => {\n            const count = state.timetable.filter(item => item.teacher === t.name).length;\n            return { name: t.name, count, max: t.maxLoad };\n        });\n\n        let workloadRows = teacherWorkloads.map(tw => `<tr>\n            <td><strong>${tw.name}<\/strong><\/td>\n            <td>${tw.count} Periods<\/td>\n            <td>${tw.max} Periods<\/td>\n            <td><span class=\"erp-badge ${tw.count > tw.max ? 'erp-badge-danger' : 'erp-badge-success'}\">${tw.count > tw.max ? 'Overloaded' : 'Optimal'}<\/span><\/td>\n        <\/tr>`).join('');\n\n        c.innerHTML = `\n            <div class=\"erp-grid\">\n                <div class=\"erp-stat-card\"><div class=\"erp-stat-label\">Total Scheduled Slots<\/div><div class=\"erp-stat-value\">${totalPeriodsScheduled}<\/div><\/div>\n                <div class=\"erp-stat-card\"><div class=\"erp-stat-label\">Active Teachers<\/div><div class=\"erp-stat-value\">${state.teachers.length}<\/div><\/div>\n                <div class=\"erp-stat-card\"><div class=\"erp-stat-label\">Active Classes<\/div><div class=\"erp-stat-value\">${state.classes.length}<\/div><\/div>\n                <div class=\"erp-stat-card\"><div class=\"erp-stat-label\">Detected Conflicts<\/div><div class=\"erp-stat-value\" style=\"color:var(--erp-danger);\">${state.conflicts.length}<\/div><\/div>\n            <\/div>\n            <div class=\"erp-card\">\n                <h3>Teacher Workload Distribution<\/h3>\n                <div class=\"erp-table-responsive\"><table><thead><tr><th>Teacher Name<\/th><th>Assigned Weekly Load<\/th><th>Maximum Capacity<\/th><th>Status<\/th><\/tr><\/thead><tbody>${workloadRows}<\/tbody><\/table><\/div>\n            <\/div>\n        `;\n    }\n\n    function renderDataOps(c) {\n        c.innerHTML = `\n            <div class=\"erp-card\">\n                <h3>Data Management & Backup System<\/h3>\n                <p>Secure backup, restore, reset, and JSON data export\/import tools.<\/p><br>\n                <div style=\"display:flex; gap:0.75rem; flex-wrap:wrap;\">\n                    <button class=\"erp-btn\" id=\"bkBtn\">Create Backup<\/button>\n                    <button class=\"erp-btn erp-btn-secondary\" id=\"exBtn\">Export JSON<\/button>\n                    <label class=\"erp-btn erp-btn-secondary\" style=\"margin:0; cursor:pointer;\">\n                        Import JSON <input type=\"file\" id=\"importFile\" accept=\".json\" style=\"display:none;\">\n                    <\/label>\n                    <button class=\"erp-btn erp-btn-danger\" id=\"resetBtn\">Reset All Data<\/button>\n                <\/div>\n            <\/div>\n        `;\n\n        c.querySelector('#bkBtn').addEventListener('click', () => {\n            state.backups.push({ date: new Date().toISOString() });\n            saveState();\n            notify('Backup created successfully');\n        });\n\n        c.querySelector('#exBtn').addEventListener('click', () => {\n            const dataStr = \"data:text\/json;charset=utf-8,\" + encodeURIComponent(JSON.stringify(state, null, 2));\n            const dl = document.createElement('a');\n            dl.setAttribute(\"href\", dataStr);\n            dl.setAttribute(\"download\", `timetable_erp_backup.json`);\n            dl.click();\n            notify('Data exported successfully');\n        });\n\n        c.querySelector('#importFile').addEventListener('change', (e) => {\n            const file = e.target.files[0];\n            if (!file) return;\n            const reader = new FileReader();\n            reader.onload = function(evt) {\n                try {\n                    const parsed = JSON.parse(evt.target.result);\n                    if (!parsed.teachers || !parsed.subjects) throw new Error();\n                    Object.assign(state, parsed);\n                    saveState();\n                    render();\n                    notify('Data imported successfully');\n                } catch(err) {\n                    notify('Failed to parse import file', 'danger');\n                }\n            };\n            reader.readAsText(file);\n        });\n\n        c.querySelector('#resetBtn').addEventListener('click', () => {\n            if (confirm('Wipe current records and restore defaults?')) {\n                localStorage.removeItem('erp_independent_state');\n                location.reload();\n            }\n        });\n    }\n\n    function renderRules(c) {\n        let rows = state.rules.map(r => `<tr><td><strong>${r.name}<\/strong><\/td><td>${r.type}<\/td><td><span class=\"erp-badge erp-badge-warning\">${r.priority}<\/span><\/td><td><span class=\"erp-badge erp-badge-success\">${r.status}<\/span><\/td><\/tr>`).join('');\n        c.innerHTML = `\n            <div class=\"erp-card\">\n                <h3>Advanced Rules Engine<\/h3>\n                <p>Configured academic constraints enforced during smart timetable generation.<\/p>\n                <div class=\"erp-table-responsive\"><table><thead><tr><th>Rule Name<\/th><th>Scope<\/th><th>Priority<\/th><th>Status<\/th><\/tr><\/thead><tbody>${rows}<\/tbody><\/table><\/div>\n            <\/div>\n        `;\n    }\n\n    function renderSettings(c) {\n        c.innerHTML = `\n            <div class=\"erp-card\" style=\"max-width: 600px;\">\n                <h3>School Profile & Global Configuration<\/h3><br>\n                <label>School Name<\/label>\n                <input type=\"text\" id=\"setName\" value=\"${state.school.name}\">\n                <label>Academic Session<\/label>\n                <input type=\"text\" id=\"setSession\" value=\"${state.school.session}\">\n                <label>Periods Per Day<\/label>\n                <input type=\"number\" id=\"setPeriods\" value=\"${state.school.periodsPerDay}\">\n                <button class=\"erp-btn\" id=\"saveSet\">Save Settings<\/button>\n            <\/div>\n        `;\n        c.querySelector('#saveSet').addEventListener('click', () => {\n            state.school.name = c.querySelector('#setName').value;\n            state.school.session = c.querySelector('#setSession').value;\n            state.school.periodsPerDay = parseInt(c.querySelector('#setPeriods').value, 10) || 8;\n            saveState();\n            notify('Settings updated successfully');\n        });\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<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading has-text-align-center\">How to Use<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Using the Faculty Load Maker takes just a few straightforward steps:<\/p>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li><strong>Input Faculty Details:<\/strong> Enter the names, departments, and maximum\/minimum teaching hours or credits allowed for each faculty member.<\/li>\n\n\n\n<li><strong>Add Courses &amp; Subjects:<\/strong> List out the courses, lecture hours, lab requirements, and credit weights for the current term.<\/li>\n\n\n\n<li><strong>Assign Loads:<\/strong> Map specific faculty members to their respective subjects based on expertise and availability.<\/li>\n\n\n\n<li><strong>Generate &amp; Export:<\/strong> Click generate to review the complete distribution, check for balanced hours, and download or print the final faculty load report.<\/li>\n<\/ol>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading has-text-align-center\">Main Features<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Automated Hour Calculation:<\/strong> Automatically tallies lecture, tutorial, and practical hours to prevent under-loading or overburdening.<\/li>\n\n\n\n<li><strong>Faculty Preference Matching:<\/strong> Accounts for specialization areas to ensure teachers are assigned appropriate subjects.<\/li>\n\n\n\n<li><strong>Instant Export Options:<\/strong> Download your finalized faculty workloads in printable or shareable formats (such as PDF or spreadsheet-friendly layouts).<\/li>\n\n\n\n<li><strong>User-Friendly Dashboard:<\/strong> Clean, responsive design that requires zero technical training to navigate.<\/li>\n<\/ul>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading has-text-align-center\">Why Use This Tool?<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Saves Administrative Time:<\/strong> Cuts down hours of manual spreadsheet tracking and schedule cross-checking into a matter of minutes.<\/li>\n\n\n\n<li><strong>Eliminates Human Error:<\/strong> Prevents double-booking instructors or miscalculating total weekly contact hours.<\/li>\n\n\n\n<li><strong>Ensures Fair Distribution:<\/strong> Gives administrators a clear visual overview to maintain equity in teaching workloads across the department.<\/li>\n\n\n\n<li><strong>100% Free &amp; Accessible:<\/strong> Available online instantly with no hidden subscription fees or complex setup routines.<\/li>\n<\/ul>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading has-text-align-center\">Detailed Explanation<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">In academic institutions, a &#8220;faculty load&#8221; refers to the total professional responsibilities assigned to an educator, primarily focusing on teaching hours, preparation time, and lab supervision. Managing this manually often leads to bottlenecks during semester planning.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The <strong>Faculty Load Maker<\/strong> acts as a centralized digital ledger. By standardizing inputs\u2014such as credit weightages and weekly lecture quotas\u2014the tool processes the data to present a cohesive breakdown of who is teaching what, and for how many hours. This transparency helps academic boards comply with institutional guidelines and regulatory accreditation requirements.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Examples<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Scenario A (University Department):<\/strong> A Computer Science department head needs to distribute 15 distinct subjects among 8 professors. Using the tool, they input professor constraints (e.g., Professor A max 12 hours\/week) and instantly map out core classes and electives without schedule clashes.<\/li>\n\n\n\n<li><strong>Scenario B (College Timetable Coordinator):<\/strong> A school coordinator uses the tool to balance lab assistant duties and theory classes evenly among junior and senior faculty members before finalizing the master timetable.<\/li>\n<\/ul>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading has-text-align-center\">Privacy &amp; Security<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">We prioritize your institutional data security.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>No Permanent Storage:<\/strong> Data entered into the Faculty Load Maker is processed securely. We do not store sensitive faculty records or institutional timetables on public databases.<\/li>\n\n\n\n<li><strong>Client-Side Safety:<\/strong> Operations are optimized for secure browser-based sessions, keeping your administrative data private.<\/li>\n<\/ul>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading has-text-align-center\">Common Problems &amp; Troubleshooting<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Problem:<\/strong> Total hours exceed a professor&#8217;s maximum limit warning.\n<ul class=\"wp-block-list\">\n<li><em>Solution:<\/em> Review the subject assignments and reallocate specific courses to other available faculty members with remaining capacity.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Problem:<\/strong> Missing a subject in the dropdown list.\n<ul class=\"wp-block-list\">\n<li><em>Solution:<\/em> Ensure you have completely filled out and saved the course catalog section before attempting final load allocation.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading has-text-align-center\">Frequently Asked Questions (FAQ)<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Do I need to create an account to use the Faculty Load Maker?<\/strong>No, the tool is available for instant use without mandatory registrations or logins.<\/li>\n\n\n\n<li><strong>Can I edit the faculty load after it has been generated?<\/strong>Yes, you can easily modify inputs, adjust hours, and regenerate the load as many times as needed.<\/li>\n\n\n\n<li><strong>Is this tool suitable for schools as well as universities?<\/strong>Yes, it is flexible enough to accommodate workload structures for schools, colleges, and universities alike.<\/li>\n<\/ul>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading has-text-align-center\">Related Tools<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Explore other free academic and administrative utilities available on our platform:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Timetable Generator:<\/strong> Build conflict-free weekly class schedules automatically.<\/li>\n\n\n\n<li><strong>Attendance Management:<\/strong> Track and monitor student and staff daily attendance records.<\/li>\n\n\n\n<li><strong>Lesson Plan Generator:<\/strong> Quickly draft structured daily or weekly teaching outlines.<\/li>\n\n\n\n<li><strong>Student Percentage Calculator:<\/strong> Compute grades and overall academic performance metrics effortlessly.<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>: Streamline Academic Scheduling &amp; Workloads Effortlessly Original Introduction Managing academic workloads, class schedules, and teaching hours can quickly become a complex administrative puzzle for educational institutions, department heads, and academic coordinators. Balancing faculty availability, subject distribution, and credit hours without overlaps requires precision. The Faculty Load Maker is designed to simplify this exact process, [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-946","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/freewebtools.co.in\/index.php\/wp-json\/wp\/v2\/pages\/946","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/freewebtools.co.in\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/freewebtools.co.in\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/freewebtools.co.in\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/freewebtools.co.in\/index.php\/wp-json\/wp\/v2\/comments?post=946"}],"version-history":[{"count":13,"href":"https:\/\/freewebtools.co.in\/index.php\/wp-json\/wp\/v2\/pages\/946\/revisions"}],"predecessor-version":[{"id":1018,"href":"https:\/\/freewebtools.co.in\/index.php\/wp-json\/wp\/v2\/pages\/946\/revisions\/1018"}],"wp:attachment":[{"href":"https:\/\/freewebtools.co.in\/index.php\/wp-json\/wp\/v2\/media?parent=946"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}