{
  "deviceName": "[entry.deviceName.escapeJSON]",
  "deviceId": "[entry.deviceId.escapeJSON]",
  "modelObjectId": "[entry.deviceModel.id]",
  "assetNumber": "[entry.assetNumber.escapeJSON]",
  "purchaseDate": "[entry.purchaseDate.escapeJSON]",
  "supplierObjectId": "[entry.supplier.id]",
  "departmentObjectId": "[entry.department.id]",
  "status": "[entry.status.escapeJSON]"
}









{
  "modelObjectId": "[entry.deviceModel.id]",
  "modelName": "[entry.deviceModel.label]",
  "assetObjectId": "[iftttResult_ASSETCREATE]",
  "deviceId": "[entry.deviceId]",
  "deviceName": "[entry.deviceName]"
}








{
  "assetObjectId": "$!{iftttResult_ASSETCREATE}",
  "pageId": "$!{iftttResult_DEVICEPAGE}"
}










{
  "modelName": "[entry.modelName.escapeJSON]",
  "modelTitle": "[entry.modelTitle.escapeJSON]",
  "deviceTitleObjectId": "[entry.deviceTitle.id]",
  "manufacturerObjectId": "[entry.manufacturer.id]",
  "nature": "[entry.nature.escapeJSON]",
  "typeObjectId": "[entry.modelType.id]",
  "groupObjectId": "[entry.modelGroup.id]",
  "modelFunction": "[entry.modelFunction.escapeJSON]",
  "criticality": "[entry.criticality.escapeJSON]",
  "technology": "[entry.technology.escapeJSON]",
  "powerRequirement": "[entry.powerRequirement.escapeJSON]",
  "waterRequirement": "[entry.waterRequirement.escapeJSON]",
  "gasRequirement": "[entry.gasRequirement.escapeJSON]"
}









{
  "modelName": "[entry.modelName.escapeJSON]",
  "modelTitle": "[entry.modelTitle.escapeJSON]",

  "deviceTitleObjectId": "[entry.deviceTitle.id]",
  "manufacturerObjectId": "[entry.manufacturer.id]",

  "nature": "[entry.nature.escapeJSON]",

  "typeObjectId": "[entry.modelType.id]",
  "groupObjectId": "[entry.modelGroup.id]",

  "modelFunction": "[entry.modelFunction.escapeJSON]",
  "criticality": "[entry.criticality.escapeJSON]",
  "technology": "[entry.technology.escapeJSON]",

  "powerRequirement": "[entry.powerRequirement.escapeJSON]",
  "waterRequirement": "[entry.waterRequirement.escapeJSON]",
  "gasRequirement": "[entry.gasRequirement.escapeJSON]"
}










{
  "sourceAttributeId": 6626,
  "name": "[entry.equipmentTitleName.escapeJSON]",
  "values": {
    "6668": "[entry.equipmentTitleGroup]"
  }
}







{"sourceAttributeId":6630,"name":"[entry.classificationName.escapeJSON]","values":{"6663":"[entry.classificationParent]","6683":"[entry.classificationName.escapeJSON]"}}








<div id="mediq-dashboard" dir="rtl">

<style>

/* ============================================================
   MEDIQ DASHBOARD - SUPPLY
   PRESENTATION VERSION
   ============================================================ */

#mediq-dashboard,
#mediq-dashboard * {
    box-sizing: border-box;
}

#mediq-dashboard {

    --navy: #34414d;
    --navy-dark: #2b3540;

    --primary: #57606a;
    --primary-dark: #4a525a;

    --text: #3d4954;
    --muted: #7c8791;

    --border: #d7dde2;

    --bg: #f4f5f6;
    --white: #ffffff;

    position: fixed;

    inset: 0;

    width: 100vw;
    height: 100vh;

    z-index: 9999;

    overflow: hidden;

    direction: rtl;

    font-family:
        Tahoma,
        Arial,
        sans-serif;

    color: var(--text);

    background:
        radial-gradient(
            circle at 12% 4%,
            rgba(87,97,107,.09),
            transparent 27%
        ),
        #f4f5f6;
}


/* ============================================================
   HIDE CONFLUENCE
   ============================================================ */

html,
body,
#page,
#full-height-container,
#main,
#content,
#main-content,
.aui-page-panel,
.aui-page-panel-inner,
.aui-page-panel-content,
.content-body {

    width: 100% !important;
    height: 100% !important;

    max-width: none !important;

    margin: 0 !important;
    padding: 0 !important;
}

html,
body {
    overflow: hidden !important;
}

#footer,
footer,
.aui-footer,
#header,
#main-header,
.breadcrumbs,
#breadcrumbs,
.page-metadata {

    display: none !important;
}


/* ============================================================
   APP
   ============================================================ */

.mq-app {

    width: 100%;
    height: 100%;

    display: grid;

    grid-template-columns:
        minmax(0,1fr)
        255px;

    direction: ltr;
}


/* ============================================================
   SIDEBAR - LEAD GRAY THEME
   ============================================================ */

.mq-sidebar {

    grid-column: 2;

    height: 100vh;

    padding:
        24px
        17px;

    direction: rtl;

    color: #fff;

    display: flex;
    flex-direction: column;

    background:
        linear-gradient(
            180deg,
            #424b55 0%,
            #343c45 45%,
            #2b3138 100%
        );

    box-shadow:
        -12px 0 38px
        rgba(43,49,56,.18);

    border-left:
        1px solid
        rgba(255,255,255,.04);
}


/* LOGO */

.mq-logo {

    width: 100%;

    text-align: center;

    padding:
        3px
        5px
        22px;

    border-bottom:
        1px solid
        rgba(255,255,255,.08);
}

.mq-logo img {

    width: 174px;

    max-width: 92%;

    height: auto;

    filter:
        drop-shadow(0 2px 10px rgba(0,0,0,.08));
}


/* USER */

.mq-user {

    margin-top: 17px;

    padding:
        14px
        15px;

    border-radius: 14px;

    background:
        rgba(255,255,255,.06);

    border:
        1px solid
        rgba(255,255,255,.08);

    box-shadow:
        inset 0 1px 0 rgba(255,255,255,.04);
}

.mq-user-name {

    font-size: 12px;

    font-weight: 900;

    color: #ffffff;
}

.mq-user-role {

    margin-top: 6px;

    color:
        rgba(255,255,255,.64);

    font-size: 9px;

    font-weight: 600;
}


/* ============================================================
   LIFE CYCLE
   ============================================================ */

.mq-life-title {

    margin:
        26px
        7px
        9px;

    color:
        rgba(255,255,255,.42);

    font-size: 9px;

    font-weight: 700;

    letter-spacing: .2px;
}


.mq-life {

    display: flex;

    flex-direction: column;

    gap: 7px;
}


.mq-life-item {

    position: relative;

    min-height: 46px;

    padding:
        0
        13px;

    border-radius: 12px;

    display: flex;

    align-items: center;

    gap: 10px;

    color:
        rgba(255,255,255,.76);

    font-size: 11px;

    font-weight: 800;

    cursor: pointer;

    user-select: none;

    border:
        1px solid
        transparent;

    transition:
        background .18s ease,
        color .18s ease,
        transform .18s ease,
        border-color .18s ease,
        box-shadow .18s ease;
}


.mq-life-item:hover {

    color: #fff;

    background:
        rgba(255,255,255,.08);

    border-color:
        rgba(255,255,255,.07);
}


.mq-life-item.active {

    color: #ffffff;

    background:
        linear-gradient(
            90deg,
            #6c7680 0%,
            #59626c 100%
        );

    border-color:
        rgba(255,255,255,.10);

    box-shadow:
        0 12px 24px rgba(35,40,46,.24);
}

.mq-life-item.active::before {

    content: "";

    position: absolute;

    right: 10px;
    top: 50%;

    width: 6px;
    height: 6px;

    border-radius: 50%;

    background: #ffffff;

    transform: translateY(-50%);

    box-shadow:
        0 0 0 4px rgba(255,255,255,.10);
}


.mq-life-icon {

    width: 28px;
    height: 28px;

    border-radius: 8px;

    display: flex;

    align-items: center;

    justify-content: center;

    background:
        rgba(255,255,255,.06);

    border:
        1px solid
        rgba(255,255,255,.05);
}


.mq-life-item.active .mq-life-icon {

    background:
        rgba(255,255,255,.14);

    border-color:
        rgba(255,255,255,.10);
}


.mq-life-icon svg {

    width: 16px;
    height: 16px;

    fill: none;

    stroke: currentColor;

    stroke-width: 1.9;

    stroke-linecap: round;
    stroke-linejoin: round;
}


/* ============================================================
   LOGOUT
   ============================================================ */

.mq-sidebar-bottom {

    margin-top: auto;

    padding-top: 14px;

    border-top:
        1px solid
        rgba(255,255,255,.07);
}


.mq-logout {

    min-height: 43px;

    padding:
        0
        13px;

    border-radius: 11px;

    display: flex;

    align-items: center;

    gap: 9px;

    color:
        rgba(255,255,255,.72);

    font-size: 10px;

    font-weight: 700;

    cursor: pointer;

    border:
        1px solid
        transparent;

    transition:
        background .18s ease,
        color .18s ease,
        border-color .18s ease;
}


.mq-logout:hover {

    color: #fff;

    background:
        rgba(255,255,255,.07);

    border-color:
        rgba(255,255,255,.07);
}


/* ============================================================
   MAIN
   ============================================================ */

.mq-main {

    grid-column: 1;

    height: 100vh;

    direction: rtl;

    overflow-y: auto;

    padding:
        0
        clamp(25px,4vw,55px)
        45px;
}


/* ============================================================
   HEADER
   ============================================================ */

.mq-header {

    min-height: 88px;

    border-bottom:
        1px solid
        var(--border);

    display: flex;

    align-items: center;

    justify-content: space-between;

    gap: 20px;
}


.mq-header-right {

    min-width: 0;
}


.mq-page-title {

    color:
        var(--navy);

    font-size: 20px;

    font-weight: 900;
}


.mq-page-description {

    margin-top: 6px;

    color:
        var(--muted);

    font-size: 10px;

    font-weight: 600;
}


/* CENTER */

.mq-center {

    padding:
        10px
        14px;

    border:
        1px solid
        var(--border);

    border-radius: 11px;

    background: #fff;

    color:
        #536f84;

    font-size: 10px;

    font-weight: 700;
}


/* ============================================================
   BREADCRUMB
   ============================================================ */

.mq-breadcrumb {

    min-height: 54px;

    display: flex;

    align-items: center;

    gap: 7px;

    flex-wrap: wrap;
}


.mq-bread-item {

    color:
        #8197a8;

    font-size: 10px;

    font-weight: 700;
}


.mq-bread-current {

    color:
        var(--primary-dark);

    font-weight: 900;
}


.mq-bread-separator {

    color:
        #b6c4cf;
}


/* ============================================================
   HERO
   ============================================================ */

.mq-hero {

    position: relative;

    overflow: hidden;

    min-height: 112px;

    padding:
        21px
        24px;

    border-radius: 18px;

    color: #fff;

    display: flex;

    align-items: center;

    justify-content: space-between;

    background:
        linear-gradient(
            105deg,
            #073b5c,
            #3c4249
        );

    box-shadow:
        0 15px 35px
        rgba(7,53,83,.10);
}


.mq-hero::before {

    content: "";

    position: absolute;

    width: 250px;
    height: 250px;

    left: -70px;
    top: -150px;

    border-radius: 50%;

    background:
        rgba(107,119,131,.14);
}


.mq-hero-title {

    position: relative;

    z-index: 2;

    font-size: 16px;

    font-weight: 900;
}


.mq-hero-desc {

    position: relative;

    z-index: 2;

    margin-top: 6px;

    color:
        rgba(255,255,255,.70);

    font-size: 10px;
}


.mq-back-btn {

    position: relative;

    z-index: 2;

    display: none;

    min-width: 88px;
    height: 36px;

    padding:
        0
        13px;

    border:
        1px solid
        rgba(255,255,255,.25);

    border-radius: 10px;

    background:
        rgba(255,255,255,.10);

    color: #fff;

    font-family:
        inherit;

    font-size: 10px;

    font-weight: 800;

    cursor: pointer;
}


.mq-back-btn:hover {

    background:
        rgba(255,255,255,.16);
}


/* ============================================================
   CONTENT
   ============================================================ */

.mq-view {

    margin-top: 23px;

    animation:
        mqFade
        .22s ease;
}


@keyframes mqFade {

    from {
        opacity: 0;
        transform: translateY(5px);
    }

    to {
        opacity: 1;
        transform: translateY(0);
    }

}


/* ============================================================
   SECTION HEADER
   ============================================================ */

.mq-section-head {

    margin-bottom: 14px;

    display: flex;

    align-items: center;

    justify-content: space-between;
}


.mq-section-title {

    color:
        var(--navy);

    font-size: 14px;

    font-weight: 900;
}


.mq-section-desc {

    margin-top: 4px;

    color:
        var(--muted);

    font-size: 9px;
}


/* ============================================================
   MODULE CARDS
   ============================================================ */

.mq-card-grid {

    display: grid;

    grid-template-columns:
        repeat(4,minmax(0,1fr));

    gap: 14px;
}


.mq-module-card {

    position: relative;

    min-height: 176px;

    padding:
        18px;

    border:
        1px solid
        var(--border);

    border-radius: 17px;

    background: #fff;

    cursor: pointer;

    box-shadow:
        0 9px 26px
        rgba(19,65,90,.035);

    transition:
        transform .17s ease,
        box-shadow .17s ease,
        border-color .17s ease;
}


.mq-module-card:hover {

    transform:
        translateY(-4px);

    border-color:
        rgba(87,96,106,.45);

    box-shadow:
        0 18px 40px
        rgba(19,65,90,.08);
}


.mq-module-icon {

    width: 48px;
    height: 48px;

    margin-bottom: 17px;

    border-radius: 14px;

    display: flex;

    align-items: center;

    justify-content: center;

    color:
        var(--primary-dark);

    background:
        linear-gradient(
            145deg,
            #f1f2f3,
            #e6e8ea
        );
}


.mq-module-icon svg {

    width: 24px;
    height: 24px;

    fill: none;

    stroke: currentColor;

    stroke-width: 1.8;

    stroke-linecap: round;
    stroke-linejoin: round;
}


.mq-module-name {

    color:
        var(--navy);

    font-size: 12px;

    font-weight: 900;

    line-height: 1.8;
}


.mq-module-arrow {

    position: absolute;

    left: 18px;
    bottom: 17px;

    width: 29px;
    height: 29px;

    border-radius: 8px;

    display: flex;

    align-items: center;

    justify-content: center;

    color:
        #8ea5b5;

    background:
        #f3f7f9;

    font-size: 18px;
}


.mq-module-card:hover
.mq-module-arrow {

    color: #fff;

    background:
        var(--primary);
}


/* ============================================================
   LARGE ACTION CARDS
   ============================================================ */

.mq-action-grid {

    display: grid;

    grid-template-columns:
        repeat(2,minmax(0,1fr));

    gap: 15px;
}


.mq-action-card {

    min-height: 155px;

    padding:
        19px;

    border:
        1px solid
        var(--border);

    border-radius: 17px;

    background: #fff;

    cursor: pointer;

    display: flex;

    align-items: center;

    gap: 16px;

    transition: .17s;
}


.mq-action-card:hover {

    border-color:
        rgba(87,96,106,.45);

    transform:
        translateY(-2px);

    box-shadow:
        0 15px 35px
        rgba(24,74,98,.06);
}


.mq-action-icon {

    flex: 0 0 auto;

    width: 54px;
    height: 54px;

    border-radius: 15px;

    display: flex;

    align-items: center;

    justify-content: center;

    color:
        var(--primary-dark);

    background:
        #eff0f2;
}


.mq-action-icon svg {

    width: 25px;
    height: 25px;

    fill: none;

    stroke: currentColor;

    stroke-width: 1.8;

    stroke-linecap: round;

    stroke-linejoin: round;
}


.mq-action-title {

    color:
        var(--navy);

    font-size: 13px;

    font-weight: 900;
}


.mq-action-sub {

    margin-top: 6px;

    color:
        var(--muted);

    font-size: 9px;
}


/* ============================================================
   ASSET LIST MENU
   ============================================================ */

.mq-list-layout {

    display: grid;

    grid-template-columns:
        330px
        minmax(0,1fr);

    gap: 16px;

    direction: ltr;
}


.mq-list-menu,
.mq-preview {

    direction: rtl;

    border:
        1px solid
        var(--border);

    border-radius: 18px;

    background: #fff;

    box-shadow:
        0 10px 28px
        rgba(19,65,90,.035);
}


.mq-list-menu {

    padding: 13px;
}


.mq-list-option {

    min-height: 52px;

    margin-bottom: 5px;

    padding:
        0
        13px;

    border-radius: 10px;

    display: flex;

    align-items: center;

    justify-content: space-between;

    color:
        #536f84;

    font-size: 10px;

    font-weight: 800;

    cursor: pointer;

    transition: .15s;
}


.mq-list-option:hover {

    color:
        var(--primary-dark);

    background:
        #f5f5f6;
}


.mq-list-option.active {

    color:
        #3d444a;

    background:
        #f0f1f2;
}


.mq-option-badge {

    width: 26px;
    height: 26px;

    border-radius: 7px;

    display: flex;

    align-items: center;

    justify-content: center;

    background:
        rgba(87,96,106,.09);

    color:
        var(--primary-dark);
}


/* ============================================================
   PREVIEW
   ============================================================ */

.mq-preview {

    min-height: 390px;

    padding:
        23px;
}


.mq-preview-title {

    color:
        var(--navy);

    font-size: 14px;

    font-weight: 900;
}


.mq-preview-description {

    margin-top: 7px;

    color:
        var(--muted);

    font-size: 9px;
}


/* MOCK CONTENT */

.mq-demo-box {

    margin-top: 23px;

    padding: 20px;

    border:
        1px dashed
        #bdd4df;

    border-radius: 14px;

    background:
        #f8fbfc;
}


.mq-demo-icon {

    width: 48px;
    height: 48px;

    margin:
        0
        auto
        12px;

    border-radius: 14px;

    display: flex;

    align-items: center;

    justify-content: center;

    color:
        var(--primary-dark);

    background:
        #eef0f1;
}


.mq-demo-text {

    color:
        #68747f;

    text-align: center;

    font-size: 10px;

    line-height: 2;
}


.mq-demo-button {

    display: block;

    min-width: 125px;

    height: 38px;

    margin:
        17px
        auto
        0;

    border: 0;

    border-radius: 9px;

    background:
        linear-gradient(
            90deg,
            #505962,
            #5c6670
        );

    color: #fff;

    font-family: inherit;

    font-size: 10px;

    font-weight: 800;

    cursor: pointer;
}


/* ============================================================
   PLACEHOLDER LIFE CYCLE
   ============================================================ */

.mq-empty-cycle {

    min-height: 350px;

    border:
        1px dashed
        #c7dce5;

    border-radius: 18px;

    display: flex;

    align-items: center;

    justify-content: center;

    flex-direction: column;

    background:
        rgba(255,255,255,.65);

    color:
        #7890a2;
}


.mq-empty-cycle strong {

    color:
        var(--navy);

    font-size: 15px;
}


.mq-empty-cycle span {

    margin-top: 8px;

    font-size: 10px;
}


/* ============================================================
   TOAST
   ============================================================ */

.mq-toast {

    position: fixed;

    left: 30px;
    bottom: 27px;

    z-index: 10020;

    min-width: 260px;

    max-width: 360px;

    padding:
        13px
        16px;

    border-radius: 11px;

    color: #fff;

    background:
        #073b5c;

    box-shadow:
        0 16px 40px
        rgba(0,0,0,.15);

    font-size: 10px;

    font-weight: 700;

    opacity: 0;

    transform:
        translateY(12px);

    pointer-events: none;

    transition:
        .2s;
}


.mq-toast.show {

    opacity: 1;

    transform:
        translateY(0);
}


/* ============================================================
   RESPONSIVE
   ============================================================ */

@media(max-width:1300px) {

    .mq-card-grid {
        grid-template-columns:
            repeat(2,minmax(0,1fr));
    }

}


@media(max-width:1000px) {

    .mq-app {
        grid-template-columns:
            minmax(0,1fr)
            210px;
    }

    .mq-list-layout {
        grid-template-columns:
            280px
            minmax(0,1fr);
    }

}


@media(max-width:800px) {

    .mq-sidebar {
        display: none;
    }

    .mq-app {
        display: block;
    }

    .mq-main {
        width: 100%;
    }

    .mq-card-grid,
    .mq-action-grid,
    .mq-list-layout {
        grid-template-columns:
            1fr;
    }

}


/* ============================================================
   MEDIQ SIDEBAR NAVIGATION TREE
   ============================================================ */

.mq-life-title,
.mq-life {
    display: none !important;
}

.mq-tree-title {
    margin: 22px 7px 9px;
    color: rgba(255,255,255,.39);
    font-size: 9px;
    font-weight: 700;
}

.mq-tree {
    display: flex;
    flex-direction: column;
    gap: 5px;
    overflow-y: auto;
    overflow-x: hidden;
    padding-left: 2px;
    scrollbar-width: thin;
}

.mq-tree::-webkit-scrollbar {
    width: 4px;
}
.mq-tree::-webkit-scrollbar-thumb {
    background: rgba(255,255,255,.15);
    border-radius: 10px;
}

.mq-tree-row {
    min-height: 38px;
    padding: 0 10px;
    border-radius: 9px;
    display: flex;
    align-items: center;
    gap: 8px;
    color: rgba(255,255,255,.70);
    font-size: 10px;
    font-weight: 800;
    cursor: pointer;
    user-select: none;
    transition: background .15s ease, color .15s ease;
}

.mq-tree-row:hover {
    color: #fff;
    background: rgba(255,255,255,.07);
}

.mq-tree-row.active {
    color: #fff;
    background: linear-gradient(90deg,#57606a,#4a525b);
}

.mq-tree-row.parent-active:not(.active) {
    color: #fff;
    background: rgba(255,255,255,.055);
}

.mq-tree-row.level-1 { padding-right: 10px; }
.mq-tree-row.level-2 { padding-right: 23px; font-size: 9.5px; }
.mq-tree-row.level-3 { padding-right: 36px; font-size: 9px; }
.mq-tree-row.level-4 { padding-right: 49px; font-size: 8.7px; color: rgba(255,255,255,.60); }

.mq-tree-dot {
    width: 6px;
    height: 6px;
    flex: 0 0 6px;
    border-radius: 50%;
    background: rgba(255,255,255,.32);
}

.mq-tree-row.active .mq-tree-dot {
    background: #fff;
}

.mq-tree-arrow {
    margin-right: auto;
    color: rgba(255,255,255,.45);
    font-size: 13px;
    transition: transform .18s ease;
}

.mq-tree-row.open > .mq-tree-arrow {
    transform: rotate(90deg);
}

.mq-tree-children {
    display: none;
    margin-top: 2px;
}

.mq-tree-children.open {
    display: block;
}

.mq-tree-separator {
    height: 1px;
    margin: 8px 9px;
    background: rgba(255,255,255,.08);
}


/* ============================================================
   MEDIQ UI POLISH - LARGER TYPOGRAPHY + TOP WELCOME
   ============================================================ */
#mediq-dashboard .mq-user-name { font-size: 15px; }
#mediq-dashboard .mq-user-role { font-size: 12px; }
#mediq-dashboard .mq-tree-title { font-size: 12px; }
#mediq-dashboard .mq-tree-row { font-size: 13px; min-height: 42px; }
#mediq-dashboard .mq-tree-row.level-2 { font-size: 12.5px; }
#mediq-dashboard .mq-tree-row.level-3 { font-size: 12px; }
#mediq-dashboard .mq-tree-row.level-4 { font-size: 11.7px; }
#mediq-dashboard .mq-logout { font-size: 13px; }
#mediq-dashboard .mq-page-title { font-size: 23px; }
#mediq-dashboard .mq-page-description { font-size: 13px; }
#mediq-dashboard .mq-center { font-size: 13px; }
#mediq-dashboard .mq-bread-item { font-size: 13px; }
#mediq-dashboard .mq-hero-title { font-size: 19px; }
#mediq-dashboard .mq-hero-desc { font-size: 13px; }
#mediq-dashboard .mq-back-btn { font-size: 13px; }
#mediq-dashboard .mq-section-title { font-size: 17px; }
#mediq-dashboard .mq-section-desc { font-size: 12px; }
#mediq-dashboard .mq-module-name { font-size: 15px; }
#mediq-dashboard .mq-action-title { font-size: 16px; }
#mediq-dashboard .mq-action-sub { font-size: 12px; }
#mediq-dashboard .mq-list-option { font-size: 13px; }
#mediq-dashboard .mq-preview-title { font-size: 17px; }
#mediq-dashboard .mq-preview-description,
#mediq-dashboard .mq-demo-text { font-size: 12px; }
#mediq-dashboard .mq-demo-button { font-size: 13px; }
#mediq-dashboard .mq-empty-cycle strong { font-size: 18px; }
#mediq-dashboard .mq-empty-cycle span { font-size: 13px; }
#mediq-dashboard .mq-toast { font-size: 13px; }

#mediq-dashboard .mq-header-welcome {
    display:flex; align-items:center; gap:9px; padding:9px 14px;
    border:1px solid rgba(87,96,106,.20); border-radius:999px;
    background:rgba(255,255,255,.82); box-shadow:0 7px 22px rgba(7,53,83,.055);
    color:#587287; font-size:13px; font-weight:700; white-space:nowrap;
}
#mediq-dashboard .mq-header-welcome strong { color:var(--navy); font-size:14px; font-weight:900; }
#mediq-dashboard .mq-welcome-dot { width:8px; height:8px; border-radius:50%; background:var(--primary); box-shadow:0 0 0 4px rgba(87,96,106,.10); }
#mediq-dashboard .mq-header-left { display:flex; align-items:center; gap:10px; }

#mediq-dashboard .mq-edit-page-btn{
    display:inline-flex;
    align-items:center;
    justify-content:center;
    gap:7px;
    min-height:38px;
    padding:0 14px;
    border:1px solid #cfe1e8;
    border-radius:12px;
    background:#fff;
    color:#34414d !important;
    font-family:inherit;
    font-size:12px;
    font-weight:900;
    text-decoration:none !important;
    cursor:pointer;
    box-shadow:0 6px 18px rgba(3,53,83,.06);
    transition:.18s ease;
}

#mediq-dashboard .mq-edit-page-btn:hover{
    background:#f1f2f3;
    border-color:#b8bec5;
    color:#444b52 !important;
    transform:translateY(-1px);
}

#mediq-dashboard .mq-edit-page-btn svg{
    width:15px;
    height:15px;
    stroke:currentColor;
    stroke-width:2;
    fill:none;
}

#mediq-dashboard .mq-module-card { box-shadow:0 10px 30px rgba(19,65,90,.05); }
#mediq-dashboard .mq-module-card:hover { transform:translateY(-5px); box-shadow:0 20px 45px rgba(19,65,90,.10); }
#mediq-dashboard .mq-hero { box-shadow:0 18px 42px rgba(7,53,83,.12); }


/* ===== FINAL UI REFINEMENTS ===== */
#mediq-dashboard .mq-header { min-height: 92px; }
#mediq-dashboard .mq-header-left { margin-right:auto; }
#mediq-dashboard .mq-header-welcome { padding:10px 16px; }
#mediq-dashboard .mq-breadcrumb { min-height:46px; }
#mediq-dashboard .mq-hero { margin-top:14px; }
#mediq-dashboard .mq-tree { scrollbar-width:none; -ms-overflow-style:none; }
#mediq-dashboard .mq-tree::-webkit-scrollbar { display:none !important; width:0 !important; }
#mediq-dashboard .mq-sidebar { overflow:hidden; }


#mediq-dashboard .mq-bread-link {
    cursor: pointer;
    transition: color .15s ease, background .15s ease;
    border-radius: 7px;
    padding: 4px 6px;
}
#mediq-dashboard .mq-bread-link:hover {
    color: var(--primary) !important;
    background: rgba(87,96,106,.08);
}


/* MEDIQ -> CONFIFORMS BRIDGE */
.confiforms-registration-control {
    position: fixed !important;
    left: -10000px !important;
    top: -10000px !important;
    width: 1px !important;
    height: 1px !important;
    overflow: hidden !important;
    opacity: 0 !important;
    pointer-events: auto !important;
}

/* ============================================================
   MEDIQ CONFIFORMS MODAL
   ============================================================ */
#mqCfModal {
    position: fixed;
    inset: 0;
    z-index: 10050;
    display: none;
    align-items: center;
    justify-content: center;
    padding: 24px;
    background: rgba(3, 35, 55, .48);
    backdrop-filter: blur(3px);
    direction: rtl;
}
#mqCfModal.open { display: flex; }

#mqCfDialog {
    width: min(620px, 94vw);
    max-height: 88vh;
    overflow: auto;
    background: #fff;
    border: 1px solid #d7dde2;
    border-radius: 20px;
    box-shadow: 0 28px 80px rgba(3,35,55,.24);
}
#mqCfHeader {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 16px;
    padding: 18px 22px;
    border-bottom: 1px solid #e1e5e8;
}
#mqCfHeader strong {
    color: #34414d;
    font-size: 16px;
    font-weight: 900;
}
#mqCfClose {
    width: 34px;
    height: 34px;
    border: 0;
    border-radius: 9px;
    background: #f1f6f8;
    color: #68747f;
    font: 700 20px/34px Tahoma,Arial,sans-serif;
    cursor: pointer;
}
#mqCfClose:hover { background: #ecedee; color: #4a525a; }
#mqCfBody { padding: 8px 18px 18px; }

/* The real ConfiForms registration panel is moved here at runtime */
#mqCfBody .confiFormsFormBorder {
    width: 100% !important;
    margin: 0 !important;
    border: 0 !important;
    box-shadow: none !important;
}
#mqCfBody .confiFormsFormTitle { display: none !important; }
#mqCfBody .confiFormsFormContent { padding: 16px 4px !important; }
#mqCfBody .confiFormsFormFooter {
    padding: 14px 4px 4px !important;
    background: transparent !important;
}
#mqCfBody table { width: 100% !important; }
#mqCfBody td {
    border: 0 !important;
    padding: 8px !important;
    text-align: right !important;
}
#mqCfBody input[type="text"],
#mqCfBody input[type="password"],
#mqCfBody textarea,
#mqCfBody select {
    width: 100% !important;
    max-width: none !important;
    min-width: 0 !important;
    min-height: 40px;
    border-radius: 9px !important;
    direction: rtl;
}
#mqCfBody .entry_metadata_button,
#mqCfBody .entry_metadata { display: none !important; }
#mqCfBody .save-cf-btn {
    min-width: 130px;
    min-height: 40px;
    border: 0 !important;
    border-radius: 9px !important;
    background: linear-gradient(90deg,#505962,#5c6670) !important;
    color: #fff !important;
    font-family: inherit !important;
    font-weight: 800 !important;
    cursor: pointer;
}


/* ============================================================
   MEDIQ - REAL PURCHASED ASSETS LIST (ConfiForms TableView)
   ============================================================ */
#mediq-dashboard .mq-assets-head {
    margin-top: 18px;
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 12px;
    flex-wrap: wrap;
}
#mediq-dashboard .mq-assets-actions {
    display: flex;
    gap: 8px;
    flex-wrap: wrap;
}
#mediq-dashboard .mq-assets-btn {
    min-height: 38px;
    padding: 0 15px;
    border: 1px solid #d8e7ed;
    border-radius: 9px;
    background: #fff;
    color: #47677d;
    font-family: inherit;
    font-size: 12px;
    font-weight: 800;
    cursor: pointer;
}
#mediq-dashboard .mq-assets-btn.primary {
    border-color: transparent;
    color: #fff;
    background: linear-gradient(90deg,#505962,#5c6670);
}
#mediq-dashboard .mq-assets-host {
    margin-top: 14px;
    min-height: 140px;
}
#mediq-dashboard .mq-assets-host > table,
#mediq-dashboard .mq-assets-host table {
    width: 100% !important;
    border-collapse: collapse !important;
    direction: rtl !important;
    background: #fff !important;
    border: 1px solid #d7dde2 !important;
    border-radius: 12px !important;
    overflow: hidden !important;
}
#mediq-dashboard .mq-assets-host th {
    padding: 12px 14px !important;
    text-align: right !important;
    background: #f3f8fa !important;
    color: #47677d !important;
    border-bottom: 1px solid #d7dde2 !important;
    font-size: 12px !important;
    font-weight: 900 !important;
}
#mediq-dashboard .mq-assets-host td {
    padding: 12px 14px !important;
    text-align: right !important;
    color: #294e68 !important;
    border-bottom: 1px solid #eceff1 !important;
    font-size: 12px !important;
    font-weight: 700 !important;
}
#mediq-dashboard .mq-assets-message {
    min-height: 140px;
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 22px;
    border: 1px dashed #c5dce5;
    border-radius: 12px;
    background: #f8fbfc;
    color: #6f8799;
    text-align: center;
    font-size: 12px;
    font-weight: 700;
}


/* ConfiForms delete proxy inside MediQ */
#mediq-dashboard .mq-cf-delete-proxy {
    display: inline-flex !important;
    align-items: center;
    justify-content: center;
    min-width: 58px;
    min-height: 30px;
    padding: 0 10px !important;
    border: 1px solid #f1c9c9 !important;
    border-radius: 8px !important;
    background: #fff7f7 !important;
    color: #b42318 !important;
    text-decoration: none !important;
    font-family: inherit !important;
    font-size: 11px !important;
    font-weight: 800 !important;
    cursor: pointer !important;
}
#mediq-dashboard .mq-cf-delete-proxy:hover {
    background: #ffeded !important;
    border-color: #e8aaaa !important;
}

#mediq-dashboard .mq-cf-edit-proxy {
    min-width: 50px !important;
    height: 28px !important;
    padding: 0 11px !important;
    margin-left: 6px !important;
    border: 1px solid rgba(87,96,106,.30) !important;
    border-radius: 8px !important;
    background: #f4f4f5 !important;
    color: #434a51 !important;
    font-family: inherit !important;
    font-size: 11px !important;
    font-weight: 800 !important;
    cursor: pointer !important;
    text-decoration: none !important;
}

#mediq-dashboard .mq-cf-edit-proxy:hover {
    background: #eaebec !important;
    border-color: rgba(87,96,106,.55) !important;
}

/* ============================================================
   DEDICATED EDIT ASSET WORKSPACE
   ============================================================ */
#mediq-dashboard .mq-edit-wrap {
    border: 1px solid var(--border);
    border-radius: 18px;
    background: #fff;
    padding: 24px;
    box-shadow: 0 10px 28px rgba(19,65,90,.035);
}
#mediq-dashboard .mq-edit-toolbar {
    margin-top: 18px;
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 12px;
    flex-wrap: wrap;
}
#mediq-dashboard .mq-edit-search {
    width: min(390px, 100%);
    min-height: 40px;
    padding: 0 14px;
    border: 1px solid #d8e7ed;
    border-radius: 10px;
    outline: none;
    background: #fff;
    color: #294e68;
    direction: rtl;
    font-family: inherit;
    font-size: 12px;
    font-weight: 700;
}
#mediq-dashboard .mq-edit-search:focus {
    border-color: rgba(87,96,106,.65);
    box-shadow: 0 0 0 3px rgba(87,96,106,.08);
}
#mediq-dashboard .mq-edit-help {
    color: #71899a;
    font-size: 12px;
    font-weight: 700;
}
#mediq-dashboard .mq-edit-host {
    margin-top: 14px;
}
#mediq-dashboard .mq-edit-host table {
    width: 100% !important;
    border-collapse: collapse !important;
    direction: rtl !important;
    background: #fff !important;
    border: 1px solid #d7dde2 !important;
}
#mediq-dashboard .mq-edit-host th {
    padding: 12px 14px !important;
    text-align: right !important;
    background: #f3f8fa !important;
    color: #47677d !important;
    border-bottom: 1px solid #d7dde2 !important;
    font-size: 12px !important;
    font-weight: 900 !important;
}
#mediq-dashboard .mq-edit-host td {
    padding: 12px 14px !important;
    text-align: right !important;
    color: #294e68 !important;
    border-bottom: 1px solid #eceff1 !important;
    font-size: 12px !important;
    font-weight: 700 !important;
}

/* Keep ConfiForms/AUI edit dialogs above the full-screen MediQ shell */
.aui-blanket {
    z-index: 10060 !important;
}
.aui-dialog,
.aui-dialog2,
.aui-dialog2[open],
.aui-dialog2[aria-hidden="false"] {
    z-index: 10070 !important;
}




/* ============================================================
   MEDIQ - SECTIONED CONFIFORMS + MODEL QUICK CREATE
   ============================================================ */
#mqCfDialog { width:min(780px,96vw); }
#mqModelModal {
    position:fixed; inset:0; z-index:10080; display:none;
    align-items:center; justify-content:center; padding:24px;
    background:rgba(3,35,55,.58); backdrop-filter:blur(4px); direction:rtl;
}
#mqModelModal.open { display:flex; }
#mqModelDialog {
    width:min(800px,96vw); max-height:90vh; overflow:auto;
    background:#fff; border:1px solid #d7dde2; border-radius:20px;
    box-shadow:0 30px 90px rgba(3,35,55,.28);
}
#mqModelHeader {
    display:flex; align-items:center; justify-content:space-between; gap:16px;
    padding:18px 22px; border-bottom:1px solid #e1e5e8;
}
#mqModelHeader strong { color:#34414d; font-size:16px; font-weight:900; }
#mqModelClose {
    width:34px; height:34px; border:0; border-radius:9px;
    background:#f1f6f8; color:#68747f; font:700 20px/34px Tahoma,Arial,sans-serif; cursor:pointer;
}
#mqModelClose:hover { background:#ecedee; color:#4a525a; }
#mqModelBody { padding:8px 18px 18px; }
#mqModelBody .confiFormsFormBorder {
    width:100%!important; margin:0!important; border:0!important; box-shadow:none!important;
}
#mqModelBody .confiFormsFormTitle { display:none!important; }
#mqModelBody .confiFormsFormContent { padding:16px 4px!important; }
#mqModelBody .confiFormsFormFooter { padding:14px 4px 4px!important; background:transparent!important; }
#mqModelBody table { width:100%!important; }
#mqModelBody td { border:0!important; padding:8px!important; text-align:right!important; }
#mqModelBody input[type="text"],
#mqModelBody input[type="password"],
#mqModelBody textarea,
#mqModelBody select {
    width:100%!important; max-width:none!important; min-width:0!important;
    min-height:40px; border-radius:9px!important; direction:rtl;
}
#mqModelBody .save-cf-btn {
    min-width:130px; min-height:40px; border:0!important; border-radius:9px!important;
    background:linear-gradient(90deg,#505962,#5c6670)!important;
    color:#fff!important; font-family:inherit!important; font-weight:800!important; cursor:pointer;
}

#mqCfBody .mq-form-section-row td,
#mqModelBody .mq-form-section-row td {
    padding:15px 8px 7px!important;
}
#mqCfBody .mq-form-section-title,
#mqModelBody .mq-form-section-title {
    display:flex; align-items:center; gap:9px; color:#34414d;
    font-size:13px; font-weight:900; padding-bottom:8px;
    border-bottom:1px solid #e5eef2;
}
#mqCfBody .mq-form-section-title::before,
#mqModelBody .mq-form-section-title::before {
    content:""; width:7px; height:7px; border-radius:50%; background:#57606a;
    box-shadow:0 0 0 4px rgba(87,96,106,.10);
}
#mqCfBody tr.mq-system-field,
#mqModelBody tr.mq-system-field { display:none!important; }

/* =====================================================
   MODEL FIELD + ADD MODEL BUTTON
   ===================================================== */
.mq-model-field-cell{
    white-space:normal!important;
    width:100%!important;
}

.mq-device-model-wrap{
    display:flex!important;
    flex-direction:row!important;
    align-items:center!important;
    justify-content:flex-start!important;
    gap:10px!important;
    width:100%!important;
    min-width:0!important;
    direction:ltr!important;
}

.mq-device-model-wrap > .select2-container,
.mq-device-model-wrap > select,
.mq-device-model-wrap > input{
    flex:1 1 auto!important;
    width:calc(100% - 50px)!important;
    max-width:calc(100% - 50px)!important;
    min-width:0!important;
    margin:0!important;
}

/* Select2 / Insight visible box */
.mq-device-model-wrap .select2-choice,
.mq-device-model-wrap .select2-selection,
.mq-device-model-wrap .aui-select2-choice{
    min-height:40px!important;
    height:40px!important;
    border:1px solid #d5e3ea!important;
    border-radius:10px!important;
    background:#f9fbfc!important;
    box-shadow:none!important;
    color:#3d4954!important;
    overflow:hidden!important;
}

.mq-device-model-wrap .select2-chosen,
.mq-device-model-wrap .select2-selection__rendered{
    display:block!important;
    max-width:100%!important;
    line-height:38px!important;
    padding:0 34px 0 14px!important;
    color:#3d4954!important;
    font-size:12px!important;
    font-weight:700!important;
    white-space:nowrap!important;
    overflow:hidden!important;
    text-overflow:ellipsis!important;
    direction:rtl!important;
    text-align:right!important;
}

.mq-device-model-wrap .select2-arrow,
.mq-device-model-wrap .select2-selection__arrow{
    height:38px!important;
    top:0!important;
    right:4px!important;
    border:0!important;
    background:transparent!important;
}

.mq-device-model-wrap .select2-search-choice-close,
.mq-device-model-wrap .select2-selection__clear,
.mq-device-model-wrap .select2-clear{
    left:10px!important;
    right:auto!important;
    top:50%!important;
    transform:translateY(-50%)!important;
    margin:0!important;
}

.mq-model-plus{
    flex:0 0 40px!important;
    width:40px!important;
    height:40px!important;
    min-width:40px!important;
    margin:0!important;
    padding:0!important;
    border:1px solid #afb6be!important;
    border-radius:11px!important;
    background:#f1f2f3!important;
    color:#444b52!important;
    font:900 22px/38px Tahoma,Arial,sans-serif!important;
    cursor:pointer!important;
    text-align:center!important;
    box-shadow:none!important;
    transition:.18s ease!important;
}

.mq-model-plus:hover{
    background:#57606a!important;
    border-color:#57606a!important;
    color:#fff!important;
    transform:translateY(-1px);
}

.mq-model-plus:focus{
    outline:none!important;
    box-shadow:0 0 0 4px rgba(87,96,106,.14)!important;
}

/* Keep Select2 / AUI dropdowns above both MediQ modals while open. */
.select2-drop,
.select2-dropdown,
.aui-select2-drop { z-index:10120!important; }


/* ============================================================
   FIX CONFIFORMS / SELECT2 ORIGINAL HIDDEN FIELDS
   جلوگیری از نمایش نوار خاکستری زیر Select2
   ============================================================ */

#mqCfBody select.select2-offscreen,
#mqCfBody input.select2-offscreen,
#mqCfBody select.select2-hidden-accessible,
#mqCfBody input.select2-hidden-accessible,
#mqModelBody select.select2-offscreen,
#mqModelBody input.select2-offscreen,
#mqModelBody select.select2-hidden-accessible,
#mqModelBody input.select2-hidden-accessible{
    position:absolute !important;
    left:-10000px !important;
    top:auto !important;
    width:1px !important;
    height:1px !important;
    min-width:1px !important;
    max-width:1px !important;
    padding:0 !important;
    margin:0 !important;
    border:0 !important;
    opacity:0 !important;
    overflow:hidden !important;
    pointer-events:none !important;
}

/* فقط Select2 قابل مشاهده عرض بگیرد */
.mq-device-model-wrap > .select2-container{
    flex:1 1 auto !important;
    width:calc(100% - 50px) !important;
    max-width:calc(100% - 50px) !important;
    min-width:0 !important;
    margin:0 !important;
}

/* خود Select مخفی Select2 نباید Flex شود */
.mq-device-model-wrap > select.select2-offscreen,
.mq-device-model-wrap > input.select2-offscreen,
.mq-device-model-wrap > select.select2-hidden-accessible,
.mq-device-model-wrap > input.select2-hidden-accessible{
    flex:none !important;
}

/* وضعیت و سایر Select2های فرم نیز فقط کنترل ظاهری را نشان بدهند */
#mqCfBody .select2-container,
#mqModelBody .select2-container{
    position:relative !important;
    display:inline-block !important;
    vertical-align:middle !important;
}

/* جلوگیری از ایجاد پس‌زمینه خاکستری اضافه برای کنترل اصلی */
#mqCfBody select[style*="display: none"],
#mqModelBody select[style*="display: none"]{
    width:1px !important;
    min-width:1px !important;
    max-width:1px !important;
    height:1px !important;
    margin:0 !important;
    padding:0 !important;
}


/* ============================================================
   MEDIQ V25 - CONFIFORMS AJAX SAFE MODAL
   فرم واقعی ConfiForms هرگز از محل اصلی DOM جابه‌جا نمی‌شود.
   ============================================================ */

/* Our old custom dialog is now only a backdrop container. */
#mqCfModal,
#mqModelModal{
    background:rgba(3,35,55,.50) !important;
    backdrop-filter:blur(3px);
}

#mqCfDialog,
#mqModelDialog{
    display:none !important;
}

/* Keep source forms out of the normal page layout while closed. */
body:not(.mq-asset-form-open) .cf_mediqNewAsset,
body:not(.mq-model-form-open) .cf_mediqNewModel{
    position:fixed !important;
    left:-200vw !important;
    top:0 !important;
    width:1px !important;
    height:1px !important;
    max-height:1px !important;
    overflow:hidden !important;
    opacity:0 !important;
    visibility:hidden !important;
    pointer-events:none !important;
    margin:0 !important;
}

/* REAL ASSET FORM = modal */
body.mq-asset-form-open .cf_mediqNewAsset{
    display:block !important;
    position:fixed !important;
    z-index:10070 !important;
    left:50% !important;
    top:50% !important;
    transform:translate(-50%,-50%) !important;

    width:min(760px,94vw) !important;
    max-width:94vw !important;
    height:auto !important;
    max-height:88vh !important;

    overflow-y:auto !important;
    overflow-x:hidden !important;

    margin:0 !important;
    padding:0 !important;

    opacity:1 !important;
    visibility:visible !important;
    pointer-events:auto !important;

    background:#fff !important;
    border:1px solid #d7dde2 !important;
    border-radius:20px !important;
    box-shadow:0 28px 80px rgba(3,35,55,.28) !important;
    direction:rtl !important;
}

/* REAL MODEL FORM = modal */
body.mq-model-form-open .cf_mediqNewModel{
    display:block !important;
    position:fixed !important;
    z-index:10110 !important;
    left:50% !important;
    top:50% !important;
    transform:translate(-50%,-50%) !important;

    width:min(700px,94vw) !important;
    max-width:94vw !important;
    height:auto !important;
    max-height:86vh !important;

    overflow-y:auto !important;
    overflow-x:hidden !important;

    margin:0 !important;
    padding:0 !important;

    opacity:1 !important;
    visibility:visible !important;
    pointer-events:auto !important;

    background:#fff !important;
    border:1px solid #d7dde2 !important;
    border-radius:20px !important;
    box-shadow:0 28px 80px rgba(3,35,55,.30) !important;
    direction:rtl !important;
}

/* Inner ConfiForms wrappers must not create nested scrollbars. */
body.mq-asset-form-open .cf_mediqNewAsset .confiFormsFormContent,
body.mq-asset-form-open .cf_mediqNewAsset form.aui-confiforms,
body.mq-asset-form-open .cf_mediqNewAsset .table-wrap,
body.mq-model-form-open .cf_mediqNewModel .confiFormsFormContent,
body.mq-model-form-open .cf_mediqNewModel form.aui-confiforms,
body.mq-model-form-open .cf_mediqNewModel .table-wrap{
    overflow:visible !important;
    overflow-x:visible !important;
    overflow-y:visible !important;
    height:auto !important;
    max-height:none !important;
    max-width:100% !important;
    box-sizing:border-box !important;
}

/* Header from ConfiForms itself */
body.mq-asset-form-open .cf_mediqNewAsset .confiFormsFormTitle,
body.mq-model-form-open .cf_mediqNewModel .confiFormsFormTitle{
    display:flex !important;
    align-items:center !important;
    justify-content:space-between !important;
    gap:12px !important;

    position:sticky !important;
    top:0 !important;
    z-index:20 !important;

    margin:0 !important;
    padding:17px 20px !important;
    background:#fff !important;
    border-bottom:1px solid #e1e5e8 !important;
}

body.mq-asset-form-open .cf_mediqNewAsset .confiFormsFormTitle h1,
body.mq-asset-form-open .cf_mediqNewAsset .confiFormsFormTitle h2,
body.mq-asset-form-open .cf_mediqNewAsset .confiFormsFormTitle h3,
body.mq-model-form-open .cf_mediqNewModel .confiFormsFormTitle h1,
body.mq-model-form-open .cf_mediqNewModel .confiFormsFormTitle h2,
body.mq-model-form-open .cf_mediqNewModel .confiFormsFormTitle h3{
    margin:0 !important;
    padding:0 !important;
    font-size:16px !important;
    line-height:1.6 !important;
    font-weight:900 !important;
    color:#34414d !important;
}

/* Close button injected into the real form title */
.mq-native-form-close{
    flex:0 0 34px !important;
    width:34px !important;
    height:34px !important;
    padding:0 !important;
    margin:0 !important;
    border:0 !important;
    border-radius:9px !important;
    background:#f1f6f8 !important;
    color:#68747f !important;
    font:700 20px/34px Tahoma,Arial,sans-serif !important;
    cursor:pointer !important;
    text-align:center !important;
}

.mq-native-form-close:hover{
    background:#ecedee !important;
    color:#4a525a !important;
}

/* Normal form spacing */
body.mq-asset-form-open .cf_mediqNewAsset .confiFormsFormContent,
body.mq-model-form-open .cf_mediqNewModel .confiFormsFormContent{
    padding:14px 18px 18px !important;
}

body.mq-asset-form-open .cf_mediqNewAsset .confiFormsFormFooter,
body.mq-model-form-open .cf_mediqNewModel .confiFormsFormFooter{
    background:#fff !important;
    padding:12px 18px 18px !important;
}

/* Avoid horizontal overflow */
body.mq-asset-form-open .cf_mediqNewAsset table,
body.mq-model-form-open .cf_mediqNewModel table{
    width:100% !important;
    max-width:100% !important;
    box-sizing:border-box !important;
}

body.mq-asset-form-open .cf_mediqNewAsset td,
body.mq-asset-form-open .cf_mediqNewAsset th,
body.mq-model-form-open .cf_mediqNewModel td,
body.mq-model-form-open .cf_mediqNewModel th{
    box-sizing:border-box !important;
    max-width:100% !important;
}

/* Select2 dropdowns are usually appended directly to body. */
body.mq-asset-form-open .select2-drop,
body.mq-asset-form-open .aui-select2-drop,
body.mq-asset-form-open .select2-dropdown{
    z-index:10095 !important;
}

body.mq-model-form-open .select2-drop,
body.mq-model-form-open .aui-select2-drop,
body.mq-model-form-open .select2-dropdown{
    z-index:10130 !important;
}

</style>



<div class="mq-app">


    <!-- =====================================================
         MAIN
         ===================================================== -->

    <main class="mq-main">


        <!-- HEADER -->

        <header class="mq-header">

            <div class="mq-header-right">

                <div
                    id="mqPageTitle"
                    class="mq-page-title"
                >
                    تأمین
                </div>

                <div
                    id="mqPageDesc"
                    class="mq-page-description"
                >
                    مدیریت فرآیند تأمین تجهیزات پزشکی
                </div>

            </div>


            <div class="mq-header-left">

                <a
                    id="mqEditPageBtn"
                    class="mq-edit-page-btn"
                    href="/pages/editpage.action?pageId=174855144"
                    title="ویرایش صفحه داشبورد"
                >
                    <svg viewBox="0 0 24 24" aria-hidden="true">
                        <path d="M12 20h9"></path>
                        <path d="M16.5 3.5a2.1 2.1 0 0 1 3 3L8 18l-4 1 1-4Z"></path>
                    </svg>
                    <span>ویرایش صفحه</span>
                </a>

                <div class="mq-header-welcome">
                    <span class="mq-welcome-dot"></span>
                    <strong id="mqWelcomeUser">کاربر مدیکیو</strong>
                    <span>خوش آمدید</span>
                </div>
            </div>

        </header>



        <!-- HERO -->

        <section class="mq-hero">

            <div>

                <div
                    id="mqHeroTitle"
                    class="mq-hero-title"
                >
                    مدیریت تجهیزات
                </div>

                <div
                    id="mqHeroDesc"
                    class="mq-hero-desc"
                >
                    بخش موردنظر خود را انتخاب کنید.
                </div>

            </div>


            <button
                id="mqBack"
                class="mq-back-btn"
                type="button"
            >
                بازگشت
            </button>

        </section>



        <!-- BREADCRUMB -->

        <div
            id="mqBreadcrumb"
            class="mq-breadcrumb"
        ></div>



        <!-- DYNAMIC VIEW -->

        <div
            id="mqView"
            class="mq-view"
        ></div>


    </main>



    <!-- =====================================================
         SIDEBAR
         ===================================================== -->

    <aside class="mq-sidebar">


        <div class="mq-logo">

            <img
                src="/download/attachments/174855060/MediQ%20Heart%20Medical%20Logo.png"
                alt="MediQ"
            >

        </div>


        <div class="mq-life-title">
            چرخه عمر تجهیزات
        </div>


        <div class="mq-life">


            <div
                class="mq-life-item active"
                data-cycle="supply"
            >

                <div class="mq-life-icon">

                    <svg viewBox="0 0 24 24">

                        <path d="M4 7h16"></path>
                        <path d="M6 7l1 13h10l1-13"></path>
                        <path d="M9 4h6"></path>

                    </svg>

                </div>

                تأمین

            </div>



            <div
                class="mq-life-item"
                data-cycle="operation"
            >

                <div class="mq-life-icon">

                    <svg viewBox="0 0 24 24">

                        <circle
                            cx="12"
                            cy="12"
                            r="3"
                        ></circle>

                        <path d="M12 3v3"></path>
                        <path d="M12 18v3"></path>
                        <path d="M3 12h3"></path>
                        <path d="M18 12h3"></path>

                    </svg>

                </div>

                بهره‌برداری

            </div>



            <div
                class="mq-life-item"
                data-cycle="replacement"
            >

                <div class="mq-life-icon">

                    <svg viewBox="0 0 24 24">

                        <path d="M4 7h11"></path>
                        <path d="M12 4l3 3-3 3"></path>

                        <path d="M20 17H9"></path>
                        <path d="M12 14l-3 3 3 3"></path>

                    </svg>

                </div>

                جایگزینی

            </div>



            <div
                class="mq-life-item"
                data-cycle="maintenance"
            >

                <div class="mq-life-icon">

                    <svg viewBox="0 0 24 24">

                        <path
                            d="M14 6a4 4 0 0 0 4 4l-8 8-4-4 8-8z"
                        ></path>

                    </svg>

                </div>

                نگهداری

            </div>


        </div>




        <!-- MEDIQ NAVIGATION TREE -->
        <div class="mq-tree-title">ساختار تأمین</div>

        <div class="mq-tree" id="mqTree">

            <div class="mq-tree-row level-1 active" data-tree-action="equipment" data-tree-key="equipment">
                <span class="mq-tree-dot"></span>
                <span>مدیریت تجهیزات</span>
                <span class="mq-tree-arrow">‹</span>
            </div>

            <div class="mq-tree-children open" data-tree-group="equipment">

                <div class="mq-tree-row level-2" data-tree-action="property" data-tree-key="property">
                    <span class="mq-tree-dot"></span>
                    <span>مدیریت اموال</span>
                </div>

                <div class="mq-tree-row level-2" data-tree-action="equipmentMaintenance" data-tree-key="equipmentMaintenance">
                    <span class="mq-tree-dot"></span>
                    <span>مدیریت نگهداری و تعمیر</span>
                </div>

                <div class="mq-tree-row level-2" data-tree-action="finance" data-tree-key="finance">
                    <span class="mq-tree-dot"></span>
                    <span>مدیریت مالی و بهره‌وری</span>
                </div>

                <div class="mq-tree-row level-2" data-tree-action="logistics" data-tree-key="logistics">
                    <span class="mq-tree-dot"></span>
                    <span>مدیریت تأمین و لجستیک</span>
                    <span class="mq-tree-arrow">‹</span>
                </div>

                <div class="mq-tree-children" data-tree-group="logistics">

                    <div class="mq-tree-row level-3" data-tree-action="purchase" data-tree-key="purchase">
                        <span class="mq-tree-dot"></span>
                        <span>خرید دارایی</span>
                    </div>

                    <div class="mq-tree-row level-3" data-tree-action="newAsset" data-tree-key="newAsset">
                        <span class="mq-tree-dot"></span>
                        <span>ورود دارایی جدید</span>
                        <span class="mq-tree-arrow">‹</span>
                    </div>

                    <div class="mq-tree-children" data-tree-group="newAsset">
                        <div class="mq-tree-row level-4" data-tree-action="section" data-mode="newAsset" data-section="purchased" data-tree-key="newAsset-purchased"><span class="mq-tree-dot"></span><span>لیست دارایی‌ها</span></div>
                        <div class="mq-tree-row level-4" data-tree-action="section" data-mode="newAsset" data-section="technical" data-tree-key="newAsset-technical"><span class="mq-tree-dot"></span><span>شناسنامه فنی</span></div>
                        <div class="mq-tree-row level-4" data-tree-action="section" data-mode="newAsset" data-section="financial" data-tree-key="newAsset-financial"><span class="mq-tree-dot"></span><span>شناسنامه مالی</span></div>
                        <div class="mq-tree-row level-4" data-tree-action="section" data-mode="newAsset" data-section="maintenance" data-tree-key="newAsset-maintenance"><span class="mq-tree-dot"></span><span>شناسنامه نگهداری و تعمیر</span></div>
                        <div class="mq-tree-row level-4" data-tree-action="section" data-mode="newAsset" data-section="commercial" data-tree-key="newAsset-commercial"><span class="mq-tree-dot"></span><span>شناسنامه بازرگانی</span></div>
                    </div>

                    <div class="mq-tree-row level-3" data-tree-action="editAsset" data-tree-key="editAsset">
                        <span class="mq-tree-dot"></span>
                        <span>ویرایش دارایی</span>
                        <span class="mq-tree-arrow">‹</span>
                    </div>

                    <div class="mq-tree-children" data-tree-group="editAsset">
                        <div class="mq-tree-row level-4" data-tree-action="section" data-mode="editAsset" data-section="purchased" data-tree-key="editAsset-purchased"><span class="mq-tree-dot"></span><span>لیست دارایی‌ها</span></div>
                        <div class="mq-tree-row level-4" data-tree-action="section" data-mode="editAsset" data-section="technical" data-tree-key="editAsset-technical"><span class="mq-tree-dot"></span><span>شناسنامه فنی</span></div>
                        <div class="mq-tree-row level-4" data-tree-action="section" data-mode="editAsset" data-section="financial" data-tree-key="editAsset-financial"><span class="mq-tree-dot"></span><span>شناسنامه مالی</span></div>
                        <div class="mq-tree-row level-4" data-tree-action="section" data-mode="editAsset" data-section="maintenance" data-tree-key="editAsset-maintenance"><span class="mq-tree-dot"></span><span>شناسنامه نگهداری و تعمیر</span></div>
                        <div class="mq-tree-row level-4" data-tree-action="section" data-mode="editAsset" data-section="commercial" data-tree-key="editAsset-commercial"><span class="mq-tree-dot"></span><span>شناسنامه بازرگانی</span></div>
                    </div>

                    <div class="mq-tree-row level-3" data-tree-action="consumable" data-tree-key="consumable">
                        <span class="mq-tree-dot"></span>
                        <span>کالاهای مصرفی</span>
                    </div>

                </div>
            </div>

            <div class="mq-tree-separator"></div>

            <div class="mq-tree-row level-1" data-tree-action="cycle" data-cycle="operation" data-tree-key="operation">
                <span class="mq-tree-dot"></span><span>بهره‌برداری</span>
            </div>

            <div class="mq-tree-row level-1" data-tree-action="cycle" data-cycle="replacement" data-tree-key="replacement">
                <span class="mq-tree-dot"></span><span>جایگزینی</span>
            </div>

            <div class="mq-tree-row level-1" data-tree-action="cycle" data-cycle="maintenance" data-tree-key="maintenanceCycle">
                <span class="mq-tree-dot"></span><span>نگهداری</span>
            </div>

        </div>


        <div class="mq-sidebar-bottom">

            <div
                id="mqLogout"
                class="mq-logout"
            >
                خروج از حساب کاربری
            </div>

        </div>


    </aside>


</div>




<!-- MEDIQ CONFIFORMS MODAL -->
<div id="mqCfModal" aria-hidden="true">
    <div id="mqCfDialog" role="dialog" aria-modal="true" aria-labelledby="mqCfTitle">
        <div id="mqCfHeader">
            <strong id="mqCfTitle">ثبت دارایی جدید</strong>
            <button id="mqCfClose" type="button" aria-label="بستن">×</button>
        </div>
        <div id="mqCfBody"></div>
    </div>
</div>

<!-- MEDIQ NEW MODEL MODAL -->
<div id="mqModelModal" aria-hidden="true">
    <div id="mqModelDialog" role="dialog" aria-modal="true" aria-labelledby="mqModelTitle">
        <div id="mqModelHeader">
            <strong id="mqModelTitle">ثبت مدل جدید</strong>
            <button id="mqModelClose" type="button" aria-label="بستن">×</button>
        </div>
        <div id="mqModelBody"></div>
    </div>
</div>

<div
    id="mqToast"
    class="mq-toast"
></div>



<script>

(function () {

"use strict";


/* ============================================================
   STATE
   ============================================================ */

var state = {

    cycle:
        "supply",

    screen:
        "equipment",

    selectedAssetSection:
        "purchased"

};



/* ============================================================
   ELEMENTS
   ============================================================ */

var view =
    document.getElementById(
        "mqView"
    );


var breadcrumb =
    document.getElementById(
        "mqBreadcrumb"
    );


var heroTitle =
    document.getElementById(
        "mqHeroTitle"
    );


var heroDesc =
    document.getElementById(
        "mqHeroDesc"
    );


var backButton =
    document.getElementById(
        "mqBack"
    );


var pageTitle =
    document.getElementById(
        "mqPageTitle"
    );


var pageDesc =
    document.getElementById(
        "mqPageDesc"
    );


var toast =
    document.getElementById(
        "mqToast"
    );



/* ============================================================
   ICONS
   ============================================================ */

var ICONS = {

    property:
        '<path d="M12 3l7 4-7 4-7-4 7-4z"></path>' +
        '<path d="M5 7v9l7 4 7-4V7"></path>' +
        '<path d="M12 11v9"></path>',


    maintenance:
        '<circle cx="12" cy="12" r="3"></circle>' +
        '<path d="M12 2v3"></path>' +
        '<path d="M12 19v3"></path>' +
        '<path d="M2 12h3"></path>' +
        '<path d="M19 12h3"></path>',


    finance:
        '<circle cx="12" cy="12" r="9"></circle>' +
        '<path d="M8 12h8"></path>' +
        '<path d="M12 8v8"></path>',


    supply:
        '<path d="M4 7h16"></path>' +
        '<path d="M6 7l1 13h10l1-13"></path>' +
        '<path d="M9 4h6"></path>',


    purchase:
        '<path d="M4 5h2l2 11h9l2-7H8"></path>' +
        '<circle cx="10" cy="20" r="1"></circle>' +
        '<circle cx="17" cy="20" r="1"></circle>',


    newAsset:
        '<path d="M12 3l7 4-7 4-7-4 7-4z"></path>' +
        '<path d="M5 7v9l7 4 7-4V7"></path>' +
        '<path d="M18 3v6"></path>' +
        '<path d="M15 6h6"></path>',


    edit:
        '<path d="M4 20h4l11-11-4-4L4 16v4z"></path>' +
        '<path d="M13 7l4 4"></path>',


    consumable:
        '<rect x="5" y="4" width="14" height="16" rx="2"></rect>' +
        '<path d="M8 9h8"></path>' +
        '<path d="M8 13h8"></path>'

};



/* ============================================================
   TOAST
   ============================================================ */

var toastTimer = null;


function showToast(message) {

    if (!toast) {
        return;
    }


    toast.textContent =
        message;


    toast.classList.add(
        "show"
    );


    window.clearTimeout(
        toastTimer
    );


    toastTimer =
        window.setTimeout(
            function () {

                toast.classList.remove(
                    "show"
                );

            },
            2200
        );

}



/* ============================================================
   BREADCRUMB
   ============================================================ */

function buildBreadcrumb(items) {

    if (!breadcrumb) {
        return;
    }

    var html = "";

    items.forEach(function (item, index) {

        var isLast = index === items.length - 1;

        html +=
            '<span class="' +
            (isLast ? 'mq-bread-item mq-bread-current' : 'mq-bread-item mq-bread-link') +
            '" data-bread-label="' + item + '">' +
            item +
            '</span>';

        if (!isLast) {
            html += '<span class="mq-bread-separator">/</span>';
        }
    });

    breadcrumb.innerHTML = html;

    var links = breadcrumb.querySelectorAll('.mq-bread-link');
    for (var i = 0; i < links.length; i++) {
        links[i].onclick = function () {
            var label = this.getAttribute('data-bread-label');

            if (label === 'تأمین' || label === 'مدیریت تجهیزات') {
                renderEquipment();
            }
            else if (label === 'مدیریت تأمین و لجستیک') {
                renderLogistics();
            }
            else if (label === 'ورود دارایی جدید') {
                state.selectedAssetSection = 'purchased';
                renderAssetSections('newAsset');
            }
            else if (label === 'ویرایش دارایی') {
                renderEditAssetWorkspace();
            }
        };
    }

}


/* ============================================================
   CARD
   ============================================================ */

function moduleCard(
    title,
    icon,
    action,
    clickable
) {

    return (

        '<div class="mq-module-card" ' +

            (
                clickable
                    ? 'data-action="' +
                      action +
                      '"'
                    : ''
            ) +

        '>' +

            '<div class="mq-module-icon">' +

                '<svg viewBox="0 0 24 24">' +

                    icon +

                '</svg>' +

            '</div>' +

            '<div class="mq-module-name">' +
                title +
            '</div>' +

            (
                clickable
                    ? '<div class="mq-module-arrow">‹</div>'
                    : ''
            ) +

        '</div>'

    );

}



/* ============================================================
   SCREEN : EQUIPMENT
   ============================================================ */

function renderEquipment() {

    state.screen =
        "equipment";


    pageTitle.textContent =
        "تأمین";


    pageDesc.textContent =
        "مدیریت فرآیند تأمین تجهیزات پزشکی";


    heroTitle.textContent =
        "مدیریت تجهیزات";


    heroDesc.textContent =
        "حوزه موردنظر را انتخاب کنید.";


    backButton.style.display =
        "none";


    buildBreadcrumb(
        [
            "تأمین",
            "مدیریت تجهیزات"
        ]
    );


    view.innerHTML =

        '<div class="mq-section-head">' +

            '<div>' +

                '<div class="mq-section-title">' +
                    'مدیریت تجهیزات' +
                '</div>' +

                '<div class="mq-section-desc">' +
                    'یکی از حوزه‌های مدیریت تجهیزات را انتخاب کنید.' +
                '</div>' +

            '</div>' +

        '</div>' +


        '<div class="mq-card-grid">' +


            moduleCard(
                "مدیریت اموال",
                ICONS.property,
                "",
                false
            ) +


            moduleCard(
                "مدیریت نگهداری و تعمیر",
                ICONS.maintenance,
                "",
                false
            ) +


            moduleCard(
                "مدیریت مالی و بهره‌وری",
                ICONS.finance,
                "",
                false
            ) +


            moduleCard(
                "مدیریت تأمین و لجستیک",
                ICONS.supply,
                "logistics",
                true
            ) +


        '</div>';


    bindActions();
    mqTreeActivate("equipment");

}



/* ============================================================
   SCREEN : LOGISTICS
   ============================================================ */

function renderLogistics() {

    state.screen =
        "logistics";


    heroTitle.textContent =
        "مدیریت تأمین و لجستیک";


    heroDesc.textContent =
        "عملیات موردنظر را انتخاب کنید.";


    backButton.style.display =
        "inline-block";


    buildBreadcrumb(
        [
            "تأمین",
            "مدیریت تجهیزات",
            "مدیریت تأمین و لجستیک"
        ]
    );


    view.innerHTML =

        '<div class="mq-section-head">' +

            '<div>' +

                '<div class="mq-section-title">' +
                    'مدیریت تأمین و لجستیک' +
                '</div>' +

                '<div class="mq-section-desc">' +
                    'عملیات مرتبط با تأمین و لجستیک تجهیزات' +
                '</div>' +

            '</div>' +

        '</div>' +


        '<div class="mq-action-grid">' +


            actionCard(
                "خرید دارایی",
                "فرآیند خرید دارایی",
                ICONS.purchase,
                "purchase"
            ) +


            actionCard(
                "ورود دارایی جدید",
                "ثبت و تکمیل اطلاعات دارایی جدید",
                ICONS.newAsset,
                "newAsset"
            ) +


            actionCard(
                "ویرایش دارایی",
                "مشاهده و ویرایش اطلاعات دارایی موجود",
                ICONS.edit,
                "editAsset"
            ) +


            actionCard(
                "کالاهای مصرفی",
                "مدیریت کالاهای مصرفی",
                ICONS.consumable,
                "consumable"
            ) +


        '</div>';


    bindActions();
    mqTreeActivate("logistics");

}



function actionCard(
    title,
    subtitle,
    icon,
    action
) {

    return (

        '<div class="mq-action-card" data-action="' +
            action +
        '">' +

            '<div class="mq-action-icon">' +

                '<svg viewBox="0 0 24 24">' +

                    icon +

                '</svg>' +

            '</div>' +

            '<div>' +

                '<div class="mq-action-title">' +
                    title +
                '</div>' +

                '<div class="mq-action-sub">' +
                    subtitle +
                '</div>' +

            '</div>' +

        '</div>'

    );

}



/* ============================================================
   ASSET SECTION SCREEN
   ============================================================ */

function renderAssetSections(mode) {

    state.screen =
        mode;


    var isNew =
        mode ===
        "newAsset";


    var title =
        isNew
            ? "ورود دارایی جدید"
            : "ویرایش دارایی موجود";


    heroTitle.textContent =
        title;


    heroDesc.textContent =
        isNew
            ? "اطلاعات موردنیاز برای ورود دارایی را انتخاب کنید."
            : "بخش موردنظر برای ویرایش دارایی را انتخاب کنید.";


    backButton.style.display =
        "inline-block";


    buildBreadcrumb(
        [
            "تأمین",
            "مدیریت تجهیزات",
            "مدیریت تأمین و لجستیک",
            title
        ]
    );


    view.innerHTML =

        '<div class="mq-list-layout">' +


            '<div class="mq-list-menu">' +


                listOption(
                    "purchased",
                    "لیست دارایی‌ها"
                ) +


                listOption(
                    "technical",
                    "شناسنامه فنی"
                ) +


                listOption(
                    "financial",
                    "شناسنامه مالی"
                ) +


                listOption(
                    "maintenance",
                    "شناسنامه نگهداری و تعمیر"
                ) +


                listOption(
                    "commercial",
                    "شناسنامه بازرگانی"
                ) +


            '</div>' +


            '<div class="mq-preview">' +

                '<div id="mqPreviewContent"></div>' +

            '</div>' +


        '</div>';


    bindSectionOptions();


    renderPreview(
        state.selectedAssetSection
    );

    mqTreeActivate(mode + "-" + state.selectedAssetSection);

}



function listOption(
    key,
    title
) {

    return (

        '<div ' +
            'class="mq-list-option" ' +
            'data-section="' +
            key +
            '">' +

            '<span>' +
                title +
            '</span>' +

            '<span class="mq-option-badge">' +
                '‹' +
            '</span>' +

        '</div>'

    );

}



/* ============================================================
   PREVIEW CONTENT
   ============================================================ */

var SECTION_NAMES = {

    purchased:
        "لیست دارایی‌ها",

    technical:
        "شناسنامه فنی",

    financial:
        "شناسنامه مالی",

    maintenance:
        "شناسنامه نگهداری و تعمیر",

    commercial:
        "شناسنامه بازرگانی"

};



function mqFindConfiFormsTable() {
    var tables = document.querySelectorAll("table");
    var bestTable = null;
    var bestScore = -99999;

    function norm(value) {
        return String(value || "")
            .replace(/\s+/g, " ")
            .trim()
            .toLowerCase();
    }

    function isCalendarTable(table, txt, raw) {
        var marker = norm(
            (table.id || "") + " " +
            (table.className || "") + " " +
            raw
        );

        if (
            marker.indexOf("datepicker") >= 0 ||
            marker.indexOf("date-picker") >= 0 ||
            marker.indexOf("calendar") >= 0 ||
            marker.indexOf("ui-datepicker") >= 0 ||
            marker.indexOf("aui-datepicker") >= 0
        ) {
            return true;
        }

        var days = ["sun","mon","tue","wed","thu","fri","sat"];
        var hits = 0;
        for (var d = 0; d < days.length; d++) {
            if (txt.indexOf(days[d]) >= 0) hits++;
        }
        return hits >= 4;
    }

    for (var i = 0; i < tables.length; i++) {
        var table = tables[i];

        /* Never clone tables that belong to MediQ itself or to a registration form. */
        if (table.closest("#mediq-dashboard")) continue;
        if (table.closest("#mqCfModal")) continue;
        if (table.closest("#mqModelModal")) continue;
        if (table.closest("form.aui-confiforms")) continue;
        if (table.closest(".confiFormsFormBorder")) continue;

        var txt = norm(table.textContent);
        var raw = "";
        try { raw = norm(table.outerHTML); } catch (e) {}

        /* IMPORTANT: purchaseDate calendar must NEVER be considered the asset list. */
        if (isCalendarTable(table, txt, raw)) continue;

        var rows = table.querySelectorAll("tr");
        var cells = table.querySelectorAll("td,th");
        if (rows.length < 2 || cells.length < 2) continue;

        var score = 0;

        if (txt.indexOf("شناسه دستگاه") >= 0) score += 180;
        if (txt.indexOf("نام دستگاه") >= 0) score += 180;
        if (txt.indexOf("مدل دستگاه") >= 0) score += 80;
        if (txt.indexOf("delete") >= 0 || txt.indexOf("حذف") >= 0) score += 110;
        if (txt.indexOf("edit") >= 0 || txt.indexOf("ویرایش") >= 0) score += 40;

        /* ConfiForms wrapper/class/id evidence. */
        var ancestors = table;
        for (var p = 0; p < 5 && ancestors; p++, ancestors = ancestors.parentElement) {
            var a = norm(
                (ancestors.id || "") + " " +
                (ancestors.className || "") + " " +
                (ancestors.getAttribute && ancestors.getAttribute("data-form-name") || "")
            );
            if (a.indexOf("confiform") >= 0) score += 50;
            if (a.indexOf("mediqnewasset") >= 0) score += 140;
        }

        /* Data-looking rows also help when ConfiForms doesn't render headers. */
        if (rows.length >= 2) score += Math.min(rows.length, 10) * 3;

        if (score > bestScore) {
            bestScore = score;
            bestTable = table;
        }
    }

    /* We need positive evidence; don't ever fall back to an arbitrary page table. */
    return bestScore >= 90 ? bestTable : null;
}

function mqFindDeleteControl(row) {
    if (!row) return null;

    var candidates = row.querySelectorAll('a, button, input[type="button"], input[type="submit"]');
    for (var i = 0; i < candidates.length; i++) {
        var el = candidates[i];
        var text = ((el.textContent || el.value || '') + '').trim().toLowerCase();
        var cls = ((el.className || '') + '').toLowerCase();
        var title = ((el.getAttribute('title') || '') + '').toLowerCase();

        if (text === 'delete' || text === 'حذف' || cls.indexOf('delete') >= 0 || title.indexOf('delete') >= 0) {
            return el;
        }
    }

    return null;
}

function mqFindEditControl(row) {
    if (!row) return null;

    var candidates = row.querySelectorAll('a, button, input[type="button"], input[type="submit"]');
    for (var i = 0; i < candidates.length; i++) {
        var el = candidates[i];
        var text = ((el.textContent || el.value || '') + '').trim().toLowerCase();
        var cls = ((el.className || '') + '').toLowerCase();
        var title = ((el.getAttribute('title') || '') + '').toLowerCase();

        if (text === 'edit' || text === 'ویرایش' || cls.indexOf('edit') >= 0 || title.indexOf('edit') >= 0) {
            return el;
        }
    }

    return null;
}


function mqExtractEntryId(deleteControl, row) {
    function fromElement(el) {
        if (!el) return "";

        var directNames = [
            "data-entry-id",
            "data-entryid",
            "data-entry",
            "entryid",
            "data-id"
        ];

        for (var i = 0; i < directNames.length; i++) {
            var v = el.getAttribute && el.getAttribute(directNames[i]);
            if (v && /^[A-Za-z0-9_-]+$/.test(v)) return v;
        }

        var hidden = el.querySelector && el.querySelector('input[name="entryId"],input[name="entryid"]');
        if (hidden && hidden.value) return hidden.value;

        var raw = "";
        try {
            raw += " " + (el.getAttribute("href") || "");
            raw += " " + (el.getAttribute("onclick") || "");
            raw += " " + (el.outerHTML || "");
        } catch (ignore) {}

        try { raw = decodeURIComponent(raw); } catch (ignore2) {}

        var match = raw.match(/entryId\s*[=:]\s*["']?([A-Za-z0-9_-]+)/i) ||
                    raw.match(/[?&]entryId=([^&"'<>\s]+)/i);
        if (match && match[1]) return match[1];

        var uuid = raw.match(/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/i);
        return uuid ? uuid[0] : "";
    }

    return fromElement(deleteControl) || fromElement(row);
}

function mqDeleteConfiFormsEntry(entryId, sourceRow, clonedRow) {
    if (!entryId) {
        showToast("شناسه رکورد ConfiForms پیدا نشد.");
        return;
    }

    if (!window.confirm("این رکورد حذف شود؟")) return;

    var pageId = "174855144";
    var formName = "mediqNewAsset";

    /* ConfiForms REST API v1 - Delete entry by ID */
    var url =
        "/rest/confiforms/1.0/deleteById/" +
        encodeURIComponent(pageId) + "/" +
        encodeURIComponent(formName) + "/" +
        encodeURIComponent(entryId) +
        "?skipIFTTTExecute=true";

    var xhr = new XMLHttpRequest();
    xhr.open("DELETE", url, true);
    xhr.setRequestHeader("Accept", "application/json");
    xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
    xhr.setRequestHeader("X-Atlassian-Token", "no-check");

    xhr.onreadystatechange = function () {
        if (xhr.readyState !== 4) return;

        if (xhr.status >= 200 && xhr.status < 300) {
            if (sourceRow && sourceRow.parentNode) sourceRow.parentNode.removeChild(sourceRow);
            if (clonedRow && clonedRow.parentNode) clonedRow.parentNode.removeChild(clonedRow);
            showToast("رکورد با موفقیت حذف شد.");
            return;
        }

        if (xhr.status === 401 || xhr.status === 403) {
            showToast("اجازه حذف این رکورد را ندارید.");
            return;
        }

        if (xhr.status === 404) {
            showToast("رکورد یا API حذف ConfiForms پیدا نشد (404).");
            return;
        }

        var details = "";
        try {
            details = (xhr.responseText || "").replace(/\s+/g, " ").trim();
            if (details.length > 140) details = details.substring(0, 140) + "...";
        } catch (ignore) {}

        showToast(
            "حذف انجام نشد. کد خطا: " + xhr.status +
            (details ? " - " + details : "")
        );
    };

    xhr.onerror = function () {
        showToast("ارتباط با ConfiForms برای حذف رکورد برقرار نشد.");
    };

    xhr.send(null);
}

function mqBindClonedEditControls(sourceTable, clonedTable) {
    var sourceRows = sourceTable.querySelectorAll('tr');
    var clonedRows = clonedTable.querySelectorAll('tr');

    for (var i = 0; i < clonedRows.length; i++) {
        var clonedEdit = mqFindEditControl(clonedRows[i]);
        if (!clonedEdit) continue;

        var sourceRow = i < sourceRows.length ? sourceRows[i] : null;
        var sourceEdit = sourceRow ? mqFindEditControl(sourceRow) : null;

        clonedEdit.textContent = 'ویرایش';
        if ('value' in clonedEdit && clonedEdit.tagName !== 'A') clonedEdit.value = 'ویرایش';
        clonedEdit.setAttribute('title', 'ویرایش دارایی');
        clonedEdit.classList.add('mq-cf-edit-proxy');
        clonedEdit.setAttribute('href', '#');

        if (!sourceEdit) {
            clonedEdit.style.display = 'none';
            continue;
        }

        (function (btn, srcEdit) {
            btn.onclick = function (e) {
                e.preventDefault();
                e.stopPropagation();

                try {
                    try {
                        window.sessionStorage.setItem('mediqPendingReturn', 'editAsset');
                    } catch (ignore) {}
                    srcEdit.click();
                } catch (err) {
                    showToast('فرم ویرایش ConfiForms باز نشد.');
                }
                return false;
            };
        })(clonedEdit, sourceEdit);
    }
}

function mqBindClonedDeleteControls(sourceTable, clonedTable) {
    var sourceRows = sourceTable.querySelectorAll('tr');
    var clonedRows = clonedTable.querySelectorAll('tr');

    for (var i = 0; i < clonedRows.length; i++) {
        var clonedDelete = mqFindDeleteControl(clonedRows[i]);
        if (!clonedDelete) continue;

        var sourceRow = i < sourceRows.length ? sourceRows[i] : null;
        var sourceDelete = sourceRow ? mqFindDeleteControl(sourceRow) : null;

        clonedDelete.textContent = 'حذف';
        if ('value' in clonedDelete && clonedDelete.tagName !== 'A') clonedDelete.value = 'حذف';
        clonedDelete.setAttribute('title', 'حذف رکورد');
        clonedDelete.classList.add('mq-cf-delete-proxy');
        clonedDelete.setAttribute('href', '#');

        if (!sourceDelete) {
            clonedDelete.style.display = 'none';
            continue;
        }

        (function (btn, srcDelete, srcRow, visualRow) {
            btn.onclick = function (e) {
                e.preventDefault();
                e.stopPropagation();

                var entryId = mqExtractEntryId(srcDelete, srcRow);
                mqDeleteConfiFormsEntry(entryId, srcRow, visualRow);
                return false;
            };
        })(clonedDelete, sourceDelete, sourceRow, clonedRows[i]);
    }
}

function mqLoadPurchasedAssets(attempt) {
    var host = document.getElementById("mqAssetsHost");
    if (!host) return;

    var table = mqFindConfiFormsTable();

    if (!table) {
        if ((attempt || 0) < 12) {
            window.setTimeout(function () {
                mqLoadPurchasedAssets((attempt || 0) + 1);
            }, 250);
            return;
        }

        host.innerHTML =
            '<div class="mq-assets-message">' +
                'خروجی لیست ConfiForms روی صفحه پیدا نشد.' +
            '</div>';
        return;
    }

    var clonedTable = table.cloneNode(true);

    /* Remove only form/edit inputs from the visual copy; keep Delete and proxy it to the real ConfiForms control */
    var controls = clonedTable.querySelectorAll('input:not([type="button"]):not([type="submit"]), select, textarea');
    for (var i = 0; i < controls.length; i++) {
        controls[i].parentNode && controls[i].parentNode.removeChild(controls[i]);
    }

    /* Creation/list screen: editing is intentionally kept out of this screen. */
    var clonedEdits = clonedTable.querySelectorAll('a, button, input[type="button"], input[type="submit"]');
    for (var e = clonedEdits.length - 1; e >= 0; e--) {
        var candidate = clonedEdits[e];
        var txt = ((candidate.textContent || candidate.value || '') + '').trim().toLowerCase();
        var cls = ((candidate.className || '') + '').toLowerCase();
        var ttl = ((candidate.getAttribute('title') || '') + '').toLowerCase();
        if (txt === 'edit' || txt === 'ویرایش' || cls.indexOf('edit') >= 0 || ttl.indexOf('edit') >= 0) {
            candidate.parentNode && candidate.parentNode.removeChild(candidate);
        }
    }
    mqBindClonedDeleteControls(table, clonedTable);

    host.innerHTML = "";
    host.appendChild(clonedTable);
}
function mqRenderPurchasedAssets(container) {
    container.innerHTML =
        '<div class="mq-preview-title">لیست دارایی‌ها</div>' +
        '<div class="mq-preview-description">دارایی‌های ثبت‌شده</div>' +
        '<div class="mq-assets-head">' +
            '<div></div>' +
            '<div class="mq-assets-actions">' +
                '<button class="mq-assets-btn" type="button" id="mqAssetsRefresh">به‌روزرسانی لیست</button>' +
                '<button class="mq-assets-btn primary" type="button" id="mqAssetsNew">ثبت دارایی جدید</button>' +
            '</div>' +
        '</div>' +
        '<div id="mqAssetsHost" class="mq-assets-host">' +
            '<div class="mq-assets-message">در حال بارگذاری دارایی‌ها...</div>' +
        '</div>';

    var addButton = document.getElementById("mqAssetsNew");
    if (addButton) addButton.onclick = openMediQAssetForm;

    var refreshButton = document.getElementById("mqAssetsRefresh");
    if (refreshButton) {
        refreshButton.onclick = function () {
            try {
                window.sessionStorage.setItem("mediqResumeView", "newAsset-purchased");
            } catch (e) {}
            window.location.reload();
        };
    }

    mqLoadPurchasedAssets(0);
}

function mqLoadEditAssets(attempt) {
    var host = document.getElementById("mqEditAssetsHost");
    if (!host) return;

    var table = mqFindConfiFormsTable();

    if (!table) {
        if ((attempt || 0) < 12) {
            window.setTimeout(function () {
                mqLoadEditAssets((attempt || 0) + 1);
            }, 250);
            return;
        }

        host.innerHTML =
            '<div class="mq-assets-message">' +
                'خروجی لیست ConfiForms روی صفحه پیدا نشد.' +
            '</div>';
        return;
    }

    var clonedTable = table.cloneNode(true);

    var inputs = clonedTable.querySelectorAll('input:not([type="button"]):not([type="submit"]), select, textarea');
    for (var i = 0; i < inputs.length; i++) {
        inputs[i].parentNode && inputs[i].parentNode.removeChild(inputs[i]);
    }

    /* Edit screen: only Edit is exposed; Delete stays in the registration/list screen. */
    var buttons = clonedTable.querySelectorAll('a, button, input[type="button"], input[type="submit"]');
    for (var x = buttons.length - 1; x >= 0; x--) {
        var btn = buttons[x];
        var text = ((btn.textContent || btn.value || '') + '').trim().toLowerCase();
        var cls = ((btn.className || '') + '').toLowerCase();
        var title = ((btn.getAttribute('title') || '') + '').toLowerCase();
        if (text === 'delete' || text === 'حذف' || cls.indexOf('delete') >= 0 || title.indexOf('delete') >= 0) {
            btn.parentNode && btn.parentNode.removeChild(btn);
        }
    }

    mqBindClonedEditControls(table, clonedTable);

    host.innerHTML = "";
    host.appendChild(clonedTable);

    var search = document.getElementById("mqEditSearch");
    if (search) {
        search.oninput = function () {
            var q = (this.value || '').trim().toLowerCase();
            var rows = clonedTable.querySelectorAll('tr');
            for (var r = 1; r < rows.length; r++) {
                var rowText = (rows[r].textContent || '').toLowerCase();
                rows[r].style.display = (!q || rowText.indexOf(q) >= 0) ? '' : 'none';
            }
        };
    }
}

function renderEditAssetWorkspace() {
    state.screen = "editAsset";

    pageTitle.textContent = "تأمین";
    pageDesc.textContent = "مدیریت فرآیند تأمین تجهیزات پزشکی";
    heroTitle.textContent = "ویرایش دارایی";
    heroDesc.textContent = "دارایی موردنظر را انتخاب و اطلاعات آن را ویرایش کنید.";
    backButton.style.display = "inline-block";

    buildBreadcrumb([
        "تأمین",
        "مدیریت تجهیزات",
        "مدیریت تأمین و لجستیک",
        "ویرایش دارایی"
    ]);

    view.innerHTML =
        '<div class="mq-edit-wrap">' +
            '<div class="mq-preview-title">ویرایش دارایی</div>' +
            '<div class="mq-preview-description">دارایی را با نام یا شناسه جستجو کنید و روی «ویرایش» بزنید.</div>' +
            '<div class="mq-edit-toolbar">' +
                '<input id="mqEditSearch" class="mq-edit-search" type="text" placeholder="جستجو بر اساس شناسه یا نام دستگاه">' +
            '</div>' +
            '<div id="mqEditAssetsHost" class="mq-edit-host">' +
                '<div class="mq-assets-message">در حال بارگذاری دارایی‌ها...</div>' +
            '</div>' +
        '</div>';

    mqTreeActivate("editAsset");
    mqLoadEditAssets(0);
}

function renderPreview(section) {

    state.selectedAssetSection = section;

    if (state.screen === "newAsset" || state.screen === "editAsset") {
        mqTreeActivate(state.screen + "-" + section);
    }

    var container = document.getElementById("mqPreviewContent");
    if (!container) return;

    var title = SECTION_NAMES[section];

    if (section === "purchased") {
        mqRenderPurchasedAssets(container);
    } else {
        container.innerHTML =
            '<div class="mq-preview-title">' + title + '</div>' +
            '<div class="mq-preview-description">' +
                (state.screen === "newAsset"
                    ? "اطلاعات این بخش را برای دارایی انتخاب‌شده تکمیل کنید."
                    : "اطلاعات این بخش را برای دارایی انتخاب‌شده مشاهده یا ویرایش کنید.") +
            '</div>' +
            '<div class="mq-demo-box">' +
                '<div class="mq-demo-icon">✓</div>' +
                '<div class="mq-demo-text">' + title + '</div>' +
                '<button class="mq-demo-button" type="button" id="mqDemoButton">' +
                    (state.screen === "newAsset" ? "ثبت اطلاعات" : "مشاهده اطلاعات") +
                '</button>' +
            '</div>';
    }

    var options = document.querySelectorAll("#mediq-dashboard .mq-list-option");
    for (var i = 0; i < options.length; i++) {
        options[i].classList.toggle(
            "active",
            options[i].getAttribute("data-section") === section
        );
    }

    var demoButton = document.getElementById("mqDemoButton");
    if (demoButton) {
        demoButton.onclick = function () {
            showToast("فرم این بخش هنوز تعریف نشده است.");
        };
    }
}



/* ============================================================
   MEDIQ <-> CONFIFORMS : NEW ASSET FORM
   ============================================================ */

var mqCfOriginalParent = null;
var mqCfOriginalNext = null;

function mqFindConfiFormsRegistrationPanel(formName) {

    if (!formName) return null;

    var wanted = String(formName).toLowerCase();

    function hasWantedValue(el) {
        if (!el) return false;

        var candidates = [
            el.value,
            el.getAttribute && el.getAttribute("value"),
            el.getAttribute && el.getAttribute("data-form-name"),
            el.getAttribute && el.getAttribute("data-formname"),
            el.getAttribute && el.getAttribute("formname"),
            el.getAttribute && el.getAttribute("data-form")
        ];

        for (var i = 0; i < candidates.length; i++) {
            if (
                candidates[i] !== null &&
                candidates[i] !== undefined &&
                String(candidates[i]).trim().toLowerCase() === wanted
            ) {
                return true;
            }
        }

        return false;
    }

    function panelFromMarker(marker) {
        if (!marker) return null;

        return (
            marker.closest(".confiFormsFormBorder") ||
            marker.closest('[id^="i_confiform_registration_panel_"]') ||
            marker.closest("form.aui-confiforms") ||
            marker.closest("form") ||
            marker.parentElement
        );
    }


    /* --------------------------------------------------------
       1) Hidden inputs used by different ConfiForms versions.
       IMPORTANT: compare .value PROPERTY, not only [value=...]
       because ConfiForms may set value dynamically.
       -------------------------------------------------------- */

    var markers = document.querySelectorAll(
        'input#confiform_form_name,' +
        'input[name="confiform_form_name"],' +
        'input[name="registrationFormName"],' +
        'input[name="formName"],' +
        'input[id*="confiform_form_name"]'
    );

    for (var i = 0; i < markers.length; i++) {
        if (hasWantedValue(markers[i])) {
            var p1 = panelFromMarker(markers[i]);
            if (p1) return p1;
        }
    }


    /* --------------------------------------------------------
       2) Known ConfiForms wrapper class:
          cf_mediqNewAsset / cf_mediqNewModel
       Compare case-insensitively because plugin markup may vary.
       -------------------------------------------------------- */

    var borders = document.querySelectorAll(".confiFormsFormBorder");

    for (var j = 0; j < borders.length; j++) {

        var cls = String(borders[j].className || "").toLowerCase();

        if (
            cls.indexOf("cf_" + wanted) !== -1 ||
            cls.indexOf(wanted) !== -1
        ) {
            return borders[j];
        }
    }


    /* --------------------------------------------------------
       3) Registration panel IDs created by ConfiForms.
       Search the panel's form markup / hidden values.
       -------------------------------------------------------- */

    var registrationPanels = document.querySelectorAll(
        'div[id^="i_confiform_registration_panel_"],' +
        '[id*="confiform_registration_panel"]'
    );

    for (var k = 0; k < registrationPanels.length; k++) {

        var rp = registrationPanels[k];

        var innerMarkers = rp.querySelectorAll(
            'input, form, [data-form-name], [data-formname], [formname]'
        );

        for (var m = 0; m < innerMarkers.length; m++) {
            if (hasWantedValue(innerMarkers[m])) {
                return (
                    rp.closest(".confiFormsFormBorder") ||
                    rp
                );
            }
        }

        var raw = "";
        try {
            raw = String(rp.outerHTML || "").toLowerCase();
        } catch (ignoreRaw) {}

        if (raw.indexOf(wanted) !== -1) {
            return (
                rp.closest(".confiFormsFormBorder") ||
                rp
            );
        }
    }


    /* --------------------------------------------------------
       4) Search actual ConfiForms registration forms.
       -------------------------------------------------------- */

    var cfForms = document.querySelectorAll(
        'form.aui-confiforms,' +
        'form[id^="i_confiform_registration_form_"],' +
        'form[id*="confiform_registration_form"]'
    );

    for (var n = 0; n < cfForms.length; n++) {

        var f = cfForms[n];
        var fInputs = f.querySelectorAll("input");

        for (var q = 0; q < fInputs.length; q++) {
            if (hasWantedValue(fInputs[q])) {
                return (
                    f.closest(".confiFormsFormBorder") ||
                    f.parentElement ||
                    f
                );
            }
        }

        var formRaw = "";
        try {
            formRaw = String(f.outerHTML || "").toLowerCase();
        } catch (ignoreFormRaw) {}

        if (formRaw.indexOf(wanted) !== -1) {
            return (
                f.closest(".confiFormsFormBorder") ||
                f.parentElement ||
                f
            );
        }
    }


    /* --------------------------------------------------------
       5) Last-resort fallback for this dashboard.
       The page has two Embedded registration forms:
       mediqNewAsset first, mediqNewModel second.
       Never use this if a named match above exists.
       -------------------------------------------------------- */

    var candidatePanels = [];

    for (var z = 0; z < borders.length; z++) {

        if (
            borders[z].querySelector(
                'form.aui-confiforms,' +
                'form[id^="i_confiform_registration_form_"],' +
                'form[id*="confiform_registration_form"]'
            )
        ) {
            candidatePanels.push(borders[z]);
        }
    }

    if (candidatePanels.length) {

        if (wanted === "mediqnewasset") {
            return candidatePanels[0];
        }

        if (wanted === "mediqnewmodel" && candidatePanels.length > 1) {
            return candidatePanels[1];
        }
    }


    return null;
}


function mqFindConfiFormsPanelByFields(fieldNames, minMatches) {

    if (!fieldNames || !fieldNames.length) return null;

    minMatches = minMatches || fieldNames.length;

    function scorePanel(panel) {

        if (!panel) return 0;

        var score = 0;
        var raw = "";

        try {
            raw = String(panel.outerHTML || "").toLowerCase();
        } catch (ignoreRaw) {}

        for (var i = 0; i < fieldNames.length; i++) {

            var fieldName = String(fieldNames[i] || "").trim();
            if (!fieldName) continue;

            var lower = fieldName.toLowerCase();
            var found = false;

            /*
             * First try real controls. ConfiForms may prefix IDs,
             * therefore check exact name plus partial id/name.
             */
            try {
                found = !!panel.querySelector(
                    '[name="' + fieldName + '"],' +
                    '[id="' + fieldName + '"],' +
                    '[id*="' + fieldName + '"],' +
                    '[name*="' + fieldName + '"]'
                );
            } catch (ignoreSelector) {}

            /*
             * Fallback to rendered markup. This catches Insight/Assets
             * controls whose visible Select2 is generated from a hidden
             * field.
             */
            if (!found && raw.indexOf(lower) !== -1) {
                found = true;
            }

            if (found) score++;
        }

        return score;
    }


    var candidates = [];
    var seen = [];

    function addCandidate(el) {

        if (!el) return;

        var panel =
            el.closest && el.closest(".confiFormsFormBorder")
                ? el.closest(".confiFormsFormBorder")
                : el;

        if (!panel) return;

        if (seen.indexOf(panel) !== -1) return;

        seen.push(panel);
        candidates.push(panel);
    }


    var borders = document.querySelectorAll(".confiFormsFormBorder");
    for (var i = 0; i < borders.length; i++) {
        addCandidate(borders[i]);
    }

    var registrationPanels = document.querySelectorAll(
        'div[id^="i_confiform_registration_panel_"],' +
        '[id*="confiform_registration_panel"]'
    );
    for (var j = 0; j < registrationPanels.length; j++) {
        addCandidate(registrationPanels[j]);
    }

    var forms = document.querySelectorAll(
        'form.aui-confiforms,' +
        'form[id^="i_confiform_registration_form_"],' +
        'form[id*="confiform_registration_form"]'
    );
    for (var k = 0; k < forms.length; k++) {
        addCandidate(forms[k]);
    }


    var best = null;
    var bestScore = 0;

    for (var x = 0; x < candidates.length; x++) {

        var s = scorePanel(candidates[x]);

        if (s > bestScore) {
            bestScore = s;
            best = candidates[x];
        }
    }


    if (best && bestScore >= minMatches) {
        return best;
    }

    return null;
}


function findMediQAssetFormPanel() {

    /*
     * IMPORTANT:
     * Do NOT choose a ConfiForms panel by its position on the page.
     * After adding mediqNewModel that caused the model form to be
     * mistaken for the asset form.
     *
     * The asset form is identified by its own field signature.
     */
    var byFields = mqFindConfiFormsPanelByFields(
        ["deviceModel", "deviceId", "deviceName"],
        2
    );

    if (byFields) {
        return byFields;
    }


    /*
     * Named lookup is now only a secondary fallback.
     */
    var byName =
        mqFindConfiFormsRegistrationPanel(
            "mediqNewAsset"
        );

    if (byName) {

        var html = "";

        try {
            html = String(byName.outerHTML || "").toLowerCase();
        } catch (ignore) {}

        /*
         * Never accept mediqNewModel as the asset form.
         */
        if (
            html.indexOf("modeltitle") === -1 &&
            html.indexOf("modelname") === -1
        ) {
            return byName;
        }
    }

    return null;
}


/* ============================================================
   CONFIFORMS LAZY REGISTRATION CONTROL BRIDGE
   بعضی نسخه‌های ConfiForms فرم Embedded را تا قبل از کلیک
   روی Registration Control داخل DOM نمی‌سازند.
   ============================================================ */

function mqFindRegistrationControl(formName, expectedButtonText) {

    var wanted = String(formName || "")
        .replace(/\s+/g, " ")
        .trim()
        .toLowerCase();

    var expected = String(expectedButtonText || "")
        .replace(/\s+/g, " ")
        .trim();


    /* ========================================================
       1) مطمئن‌ترین روش در نصب فعلی شما:
          خود دکمه/لینک Registration Control را از روی Caption
          پیدا می‌کنیم، ولی دکمه‌های داخل داشبورد مدیکیو را
          عمداً نادیده می‌گیریم.
       ======================================================== */

    var clickables = document.querySelectorAll(
        'button, a, input[type="button"], input[type="submit"], ' +
        '[role="button"]'
    );

    for (var i = 0; i < clickables.length; i++) {

        var el = clickables[i];

        /*
         * دکمه «ثبت دارایی جدید» خود داشبورد نباید به عنوان
         * Registration Control شناخته شود.
         */
        if (
            el.closest &&
            (
                el.closest("#mediq-dashboard") ||
                el.closest("#mqCfModal") ||
                el.closest("#mqModelModal")
            )
        ) {
            continue;
        }

        var txt = "";

        if (
            el.tagName &&
            el.tagName.toLowerCase() === "input"
        ) {
            txt = el.value || "";
        }
        else {
            txt =
                el.textContent ||
                el.getAttribute("aria-label") ||
                el.getAttribute("title") ||
                "";
        }

        txt = String(txt)
            .replace(/\s+/g, " ")
            .trim();

        if (
            expected &&
            (
                txt === expected ||
                txt.indexOf(expected) !== -1
            )
        ) {
            return el;
        }
    }


    /* ========================================================
       2) پیدا کردن از روی نام فرم در markup خود ConfiForms
       ======================================================== */

    var possible = document.querySelectorAll(
        '[class*="confiform"],' +
        '[id*="confiform"],' +
        '[data-form-name],' +
        '[data-formname],' +
        '[formname]'
    );

    for (var j = 0; j < possible.length; j++) {

        var node = possible[j];

        if (
            node.closest &&
            (
                node.closest("#mediq-dashboard") ||
                node.closest("#mqCfModal") ||
                node.closest("#mqModelModal")
            )
        ) {
            continue;
        }

        var raw = "";

        try {
            raw = String(node.outerHTML || "").toLowerCase();
        }
        catch (ignoreRaw) {}

        if (
            wanted &&
            raw.indexOf(wanted) !== -1
        ) {

            /*
             * اگر خود Node کلیک‌پذیر است همان را برگردان.
             */
            var tag =
                node.tagName
                    ? node.tagName.toLowerCase()
                    : "";

            if (
                tag === "button" ||
                tag === "a" ||
                (
                    tag === "input" &&
                    (
                        node.type === "button" ||
                        node.type === "submit"
                    )
                ) ||
                node.getAttribute("role") === "button"
            ) {
                return node;
            }


            var inner =
                node.querySelector(
                    'button, a, input[type="button"], ' +
                    'input[type="submit"], [role="button"]'
                );

            if (inner) {
                return inner;
            }

            return node;
        }
    }


    /* ========================================================
       3) آخرین fallback:
          Caption را در متن Wrapperهای خارج از داشبورد جستجو کن.
       ======================================================== */

    if (expected) {

        var wrappers = document.querySelectorAll(
            "div, span, p, td"
        );

        for (var k = 0; k < wrappers.length; k++) {

            var w = wrappers[k];

            if (
                w.closest &&
                (
                    w.closest("#mediq-dashboard") ||
                    w.closest("#mqCfModal") ||
                    w.closest("#mqModelModal")
                )
            ) {
                continue;
            }

            var wText =
                String(w.textContent || "")
                    .replace(/\s+/g, " ")
                    .trim();

            if (
                wText === expected ||
                wText.indexOf(expected) !== -1
            ) {

                var child =
                    w.querySelector(
                        'button, a, input[type="button"], ' +
                        'input[type="submit"], [role="button"]'
                    );

                if (child) {
                    return child;
                }
            }
        }
    }


    return null;
}

function mqClickRegistrationControl(control, expectedButtonText) {

    if (!control) return false;

    var expected = String(expectedButtonText || "")
        .replace(/\s+/g, " ")
        .trim();


    function getCaption(el) {

        if (!el) return "";

        var txt = "";

        if (
            el.tagName &&
            el.tagName.toLowerCase() === "input"
        ) {
            txt = el.value || "";
        }
        else {
            txt =
                el.textContent ||
                el.getAttribute("aria-label") ||
                el.getAttribute("title") ||
                "";
        }

        return String(txt)
            .replace(/\s+/g, " ")
            .trim();
    }


    function isClickable(el) {

        if (!el || !el.tagName) return false;

        var tag =
            el.tagName.toLowerCase();

        return (
            tag === "button" ||
            tag === "a" ||
            (
                tag === "input" &&
                (
                    el.type === "button" ||
                    el.type === "submit"
                )
            ) ||
            el.getAttribute("role") === "button"
        );
    }


    /* Finder ممکن است خود دکمه Registration Control را برگرداند. */
    if (isClickable(control)) {

        var ownCaption =
            getCaption(control);

        if (
            !expected ||
            ownCaption === expected ||
            ownCaption.indexOf(expected) !== -1
        ) {

            try {
                control.click();
                return true;
            }
            catch (ignoreDirectClick) {}
        }
    }


    var candidates =
        control.querySelectorAll
            ? control.querySelectorAll(
                'button, a, input[type="button"], ' +
                'input[type="submit"], [role="button"]'
            )
            : [];


    /* اول Caption دقیق را کلیک کن. */
    for (var i = 0; i < candidates.length; i++) {

        var txt =
            getCaption(
                candidates[i]
            );

        if (
            !expected ||
            txt === expected ||
            txt.indexOf(expected) !== -1
        ) {

            try {
                candidates[i].click();
                return true;
            }
            catch (ignoreClick1) {}
        }
    }


    /* سپس هر کنترل کلیک‌پذیر موجود. */
    if (candidates.length) {

        try {
            candidates[0].click();
            return true;
        }
        catch (ignoreClick2) {}
    }


    /* آخرین fallback. */
    try {
        control.click();
        return true;
    }
    catch (ignoreClick3) {}


    return false;
}

function mqWaitForConfiFormsPanel(findFn, onReady, onFail) {

    var tries = 0;
    var maxTries = 30;   /* ~3 seconds */

    function check() {

        tries++;

        var panel = null;

        try {
            panel = findFn();
        } catch (ignoreFind) {}

        if (panel) {
            onReady(panel);
            return;
        }

        if (tries >= maxTries) {

            if (typeof onFail === "function") {
                onFail();
            }

            return;
        }

        window.setTimeout(check, 100);
    }

    check();
}



var mqActiveAssetPanel = null;
var mqAssetEnhanceBusy = false;
var mqAssetRefreshTimer = null;

function mqEnsureNativeCloseButton(panel, kind) {
    if (!panel) return;

    var title =
        panel.querySelector(".confiFormsFormTitle") ||
        panel.querySelector(".confiFormsFormContent");

    if (!title) return;

    var selector =
        kind === "model"
            ? ".mq-native-model-close"
            : ".mq-native-asset-close";

    if (title.querySelector(selector)) return;

    var btn = document.createElement("button");
    btn.type = "button";
    btn.className =
        "mq-native-form-close " +
        (kind === "model" ? "mq-native-model-close" : "mq-native-asset-close");
    btn.setAttribute("aria-label", "بستن");
    btn.setAttribute("title", "بستن");
    btn.textContent = "×";

    btn.onclick = function (e) {
        e.preventDefault();
        e.stopPropagation();
        e.stopImmediatePropagation();

        if (kind === "model") {
            closeMediQModelForm();
        } else {
            closeMediQAssetForm();
        }

        return false;
    };

    title.appendChild(btn);
}


function mqEnhanceLiveAssetPanel(panel) {
    if (!panel || mqAssetEnhanceBusy) return;

    var form =
        panel.querySelector("form.aui-confiforms") ||
        panel.querySelector("form");

    if (!form) return;

    mqAssetEnhanceBusy = true;

    try {
        mqSectionizeConfiForm(
            panel,
            MQ_ASSET_FORM_SECTIONS,
            ["assetObjectId", "devicePageId"]
        );

        mqFixAssetPlaceholders(panel);
        mqInjectModelPlus(panel);
        mqEnsureNativeCloseButton(panel, "asset");

        panel.style.display = "block";
        panel.style.opacity = "1";
        panel.style.visibility = "visible";
        panel.style.pointerEvents = "auto";

        mqActiveAssetPanel = panel;
    } finally {
        mqAssetEnhanceBusy = false;
    }
}


function mqRefreshLiveAssetPanel() {
    if (!document.body.classList.contains("mq-asset-form-open")) return;

    var panel = findMediQAssetFormPanel();
    if (!panel) return;

    /*
     * ConfiForms may replace the entire panel OR only its inner form after a
     * dropdown selection. In both cases re-run the visual enhancement, but
     * never move the panel in the DOM.
     */
    var needsEnhance =
        panel !== mqActiveAssetPanel ||
        !panel.querySelector(".mq-form-section-row") ||
        !panel.querySelector(".mq-native-asset-close");

    if (needsEnhance) {
        mqEnhanceLiveAssetPanel(panel);
    }
}


function mqScheduleLiveAssetRefresh() {
    window.clearTimeout(mqAssetRefreshTimer);

    mqAssetRefreshTimer = window.setTimeout(function () {
        mqRefreshLiveAssetPanel();
    }, 90);

    window.setTimeout(mqRefreshLiveAssetPanel, 220);
    window.setTimeout(mqRefreshLiveAssetPanel, 500);
    window.setTimeout(mqRefreshLiveAssetPanel, 900);
}


function mqMountAssetPanel(panel) {

    var modal = document.getElementById("mqCfModal");

    if (!panel || !modal) {
        showToast("فرم ثبت دارایی آماده نشد.");
        return;
    }

    /*
     * CRITICAL:
     * Do NOT append/move the ConfiForms panel.
     * Insight/Select2 AJAX refresh expects the panel to stay under the
     * original ConfiForms macro container.
     */
    mqActiveAssetPanel = panel;

    document.body.classList.add("mq-asset-form-open");

    modal.classList.add("open");
    modal.setAttribute("aria-hidden", "false");

    mqEnhanceLiveAssetPanel(panel);
    mqRestoreAssetDraft(panel);

    window.setTimeout(function () {
        mqRefreshLiveAssetPanel();

        var current = findMediQAssetFormPanel();
        if (!current) return;

        var first = current.querySelector(
            'input:not([type="hidden"]):not([disabled]), ' +
            'textarea:not([disabled]), ' +
            'select:not([disabled])'
        );

        if (first) first.focus();
    }, 80);
}


function openMediQAssetForm() {

    try {
        window.sessionStorage.setItem(
            "mediqPendingReturn",
            "newAsset-purchased"
        );
    } catch (ignore) {}

    var panel = findMediQAssetFormPanel();

    if (panel) {
        mqMountAssetPanel(panel);
        return;
    }

    var control = mqFindRegistrationControl(
        "mediqNewAsset",
        "ثبت دارایی جدید"
    );

    if (!control) {
        showToast(
            "دکمه واقعی «ثبت دارایی جدید» مربوط به ConfiForms در خروجی صفحه پیدا نشد."
        );
        return;
    }

    var clicked = mqClickRegistrationControl(
        control,
        "ثبت دارایی جدید"
    );

    if (!clicked) {
        showToast(
            "امکان اجرای Registration Control فرم دارایی وجود نداشت."
        );
        return;
    }

    mqWaitForConfiFormsPanel(
        findMediQAssetFormPanel,
        function (readyPanel) {
            mqMountAssetPanel(readyPanel);
        },
        function () {
            showToast(
                "ConfiForms فرم ثبت دارایی را بعد از کلیک Registration Control ایجاد نکرد."
            );
        }
    );
}


function closeMediQAssetForm() {

    var modal = document.getElementById("mqCfModal");
    var panel = findMediQAssetFormPanel();

    mqCloseSelect2Dropdowns(panel || document);

    document.body.classList.remove("mq-asset-form-open");

    if (modal) {
        modal.classList.remove("open");
        modal.setAttribute("aria-hidden", "true");
    }

    mqActiveAssetPanel = null;

    window.setTimeout(function () {
        mqCloseSelect2Dropdowns(document);
    }, 30);
}

(function bindMediQAssetModal() {
    var modal = document.getElementById("mqCfModal");
    var close = document.getElementById("mqCfClose");

    if (close) {
        close.onclick = closeMediQAssetForm;
    }

    if (modal) {
        modal.onclick = function (e) {
            if (e.target === modal) {
                closeMediQAssetForm();
            }
        };
    }

    document.addEventListener("keydown", function (e) {
        if (e.key === "Escape" && modal && modal.classList.contains("open")) {
            closeMediQAssetForm();
        }
    });
})();




/* ============================================================
   MEDIQ - SECTIONED FORMS / MODEL QUICK CREATE / SELECT2 CLEANUP
   ============================================================ */

var MQ_ASSET_FORM_SECTIONS = [
    { title:"مشخصات اصلی", fields:["deviceModel","deviceId","deviceName","serialNumber","assetNumber"] },
    { title:"خرید و اطلاعات مالی", fields:["purchaseDate","supplier","purchaseValueIRR","purchaseValueUSD","manufactureDate","expiryDate"] },
    { title:"موقعیت و مسئولیت", fields:["department","operatingRoom","businessUnit","responsibleUnit","receiver","accessories"] },
    { title:"وضعیت و بهره‌برداری", fields:["status","accessStatus","statusReason","usageMode","fallRisk","combinedFunction","aggregateValue","priority","emergency","portable","transportability","clinicalUser","entryDateTime","exitDateTime","inStore","storeLocation","financialCenter"] }
];

var MQ_MODEL_FORM_SECTIONS = [
    /* 6624 «عنوان مدل» توسط endpoint از عنوان دستگاه + سازنده + سری ساخته می‌شود. */
    { title:"مشخصات اصلی مدل", fields:["modelName","deviceTitle","manufacturer","nature"] },
    { title:"طبقه‌بندی مدل", fields:["modelType","modelGroup","modelFunction","criticality","technology"] },
    { title:"نیازمندی‌های مصرفی", fields:["powerRequirement","waterRequirement","gasRequirement"] }
];

var MQ_FORM_LABELS = {
    deviceModel:"مدل دستگاه",
    deviceId:"شناسه دستگاه",
    deviceName:"نام دستگاه",
    serialNumber:"شماره سریال",
    assetNumber:"شماره اموال",
    purchaseDate:"تاریخ خرید",
    supplier:"فروشنده",
    purchaseValueIRR:"ارزش ریالی خرید",
    purchaseValueUSD:"ارزش دلاری خرید",
    manufactureDate:"تاریخ تولید",
    expiryDate:"تاریخ انقضا",
    department:"بخش بهره‌بردار",
    operatingRoom:"موقعیت مکانی فعلی",
    businessUnit:"محل کاربری",
    responsibleUnit:"مسئول بهره‌برداری",
    receiver:"تحویل‌گیرنده",
    accessories:"متعلقات",
    status:"وضعیت",
    accessStatus:"وضعیت دسترسی",
    statusReason:"علت وضعیت فعلی",
    usageMode:"نحوه مصرف",
    fallRisk:"آیا با خرابی این جزء دستگاه ترکیبی ساقط می‌شود؟",
    combinedFunction:"عملکرد در مجموعه‌های ترکیبی",
    aggregateValue:"ارزش ریالی/ارزی تجمیعی",
    priority:"اولویت",
    emergency:"اورژانسی",
    portable:"قابل حمل",
    transportability:"قابلیت حمل",
    clinicalUser:"کاربر کلینیکال",
    entryDateTime:"زمان ورود",
    exitDateTime:"زمان خروج",
    inStore:"در انبار",
    storeLocation:"محل انبار",
    financialCenter:"مرکز مالی",

    modelTitle:"عنوان مدل",
    modelName:"سری دستگاه",
    deviceTitle:"عنوان دستگاه",
    manufacturer:"شرکت سازنده",
    nature:"ماهیت دستگاه",
    modelType:"نوع",
    modelGroup:"گروه",
    modelFunction:"کارکرد",
    criticality:"سطح اهمیت",
    technology:"فناوری",
    powerRequirement:"برق مصرفی",
    waterRequirement:"آب مصرفی",
    gasRequirement:"گاز مصرفی"
};

function mqCloseSelect2Dropdowns(scope) {
    var jq = null;

    try {
        jq = (window.AJS && AJS.$) ? AJS.$ : (window.jQuery || null);
    } catch (ignore) {}

    if (jq) {
        try {
            jq(scope || document)
                .find('select, input')
                .add(jq('select, input'))
                .each(function () {
                    try {
                        var $el = jq(this);
                        if (
                            $el.data('select2') ||
                            $el.hasClass('select2-offscreen') ||
                            $el.hasClass('select2-hidden-accessible')
                        ) {
                            $el.select2('close');
                        }
                    } catch (ignore2) {}
                });
        } catch (ignore3) {}

        try {
            jq('.select2-drop-active').removeClass('select2-drop-active').hide();
            jq('.select2-container-active').removeClass('select2-container-active');
            jq('.select2-container--open').removeClass('select2-container--open');
            jq('#select2-drop-mask,.select2-drop-mask').hide();
            jq('body > .select2-drop, body > .aui-select2-drop').hide();
        } catch (ignore4) {}
    }

    var floating = document.querySelectorAll(
        'body > .select2-drop,' +
        'body > .select2-drop-mask,' +
        '.select2-drop-active,' +
        '.aui-select2-drop,' +
        '.select2-dropdown'
    );

    for (var i = 0; i < floating.length; i++) {
        floating[i].classList.remove('select2-drop-active');
        floating[i].style.display = 'none';
    }

    var opened = document.querySelectorAll(
        '.select2-container-active, .select2-container--open'
    );

    for (var j = 0; j < opened.length; j++) {
        opened[j].classList.remove('select2-container-active');
        opened[j].classList.remove('select2-container--open');
    }
}

function mqFindNamedField(form, name) {
    if (!form || !name) return null;
    return form.querySelector('[name="' + name + '"], [name="' + name + '[]"]') ||
           form.querySelector('[id$="_' + name + '"], [id*="' + name + '"]');
}

function mqFieldRow(form, name) {
    var field = mqFindNamedField(form, name);
    if (!field) return null;
    return field.closest('tr') || field.closest('.field-group') || field.parentElement;
}

function mqPersianizeField(form, name) {
    var field = mqFindNamedField(form, name);
    if (!field) return;

    var labelText = MQ_FORM_LABELS[name];
    if (!labelText) return;

    var id = field.getAttribute('id');
    var label = id ? form.querySelector('label[for="' + id + '"]') : null;
    if (!label) {
        var row = field.closest('tr');
        if (row) label = row.querySelector('label');
    }
    if (label) {
        var required = label.querySelector('.aui-iconfont-required, .required, .cf_required');
        label.childNodes.forEach && Array.prototype.forEach.call(label.childNodes, function (n) {
            if (n.nodeType === 3) n.nodeValue = '';
        });
        if (!required) label.textContent = labelText;
        else label.insertBefore(document.createTextNode(labelText + ' '), required);
    }
}

function mqSectionizeConfiForm(panel, sections, systemFields) {
    if (!panel) return;
    var form = panel.querySelector('form.aui-confiforms') || panel.querySelector('form');
    if (!form) return;

    var old = form.querySelectorAll('.mq-form-section-row');
    for (var z = 0; z < old.length; z++) old[z].parentNode && old[z].parentNode.removeChild(old[z]);

    Object.keys(MQ_FORM_LABELS).forEach(function (name) { mqPersianizeField(form, name); });

    (systemFields || []).forEach(function (name) {
        var row = mqFieldRow(form, name);
        if (row) row.classList.add('mq-system-field');
    });

    sections.forEach(function (section) {
        var firstRow = null;
        for (var i = 0; i < section.fields.length; i++) {
            var row = mqFieldRow(form, section.fields[i]);
            if (row && row.tagName && row.tagName.toLowerCase() === 'tr') {
                firstRow = row;
                break;
            }
        }
        if (!firstRow || !firstRow.parentNode) return;

        var tr = document.createElement('tr');
        tr.className = 'mq-form-section-row';
        var td = document.createElement('td');
        td.setAttribute('colspan', '99');
        td.innerHTML = '<div class="mq-form-section-title">' + section.title + '</div>';
        tr.appendChild(td);
        firstRow.parentNode.insertBefore(tr, firstRow);
    });
}

function mqFindDeviceModelField(form) {
    if (!form) return null;

    var field =
        mqFindNamedField(form, 'deviceModel') ||
        form.querySelector('[name$="deviceModel"], [name*="deviceModel"], [id$="deviceModel"], [id*="deviceModel"]');

    if (field) return field;

    var rows = form.querySelectorAll('tr, .field-group');

    for (var i = 0; i < rows.length; i++) {
        var txt = (rows[i].textContent || '').replace(/\s+/g, ' ').trim();
        if (txt.indexOf('مدل دستگاه') !== -1) {
            return rows[i].querySelector(
                'input.select2-offscreen, input.select2-hidden-accessible, select, input, .select2-container'
            );
        }
    }

    return null;
}

function mqFindDeviceModelVisual(form, field) {
    if (!form || !field) return null;

    if (field.classList && field.classList.contains('select2-container')) {
        return field;
    }

    var row = field.closest('tr') || field.closest('.field-group') || field.parentElement;

    if (row) {
        var visibleInRow = row.querySelector('.select2-container');
        if (visibleInRow) return visibleInRow;
    }

    var next = field.nextElementSibling;
    if (next && next.classList && next.classList.contains('select2-container')) {
        return next;
    }

    if (field.parentElement) {
        var visibleInParent = field.parentElement.querySelector('.select2-container');
        if (visibleInParent) return visibleInParent;
    }

    return field;
}

function mqInjectModelPlus(panel) {
    if (!panel) return;

    var form = panel.querySelector('form.aui-confiforms') || panel.querySelector('form');
    if (!form) return;

    if (form.querySelector('#mqAddModelBtn, .mq-model-plus')) return;

    var field = mqFindDeviceModelField(form);
    if (!field) return;

    var visual = mqFindDeviceModelVisual(form, field);
    if (!visual || !visual.parentNode) return;

    var cell = visual.closest('td') || field.closest('td') || visual.parentNode;
    if (!cell) return;

    cell.classList.add('mq-model-field-cell');

    var wrap = cell.querySelector('.mq-device-model-wrap');

    if (!wrap) {
        wrap = document.createElement('div');
        wrap.className = 'mq-device-model-wrap';

        visual.parentNode.insertBefore(wrap, visual);
        wrap.appendChild(visual);
    }

    var btn = document.createElement('button');
    btn.id = 'mqAddModelBtn';
    btn.type = 'button';
    btn.className = 'mq-model-plus';
    btn.setAttribute('title', 'ثبت مدل جدید');
    btn.setAttribute('aria-label', 'ثبت مدل جدید');
    btn.textContent = '+';

    btn.onclick = function (e) {
        e.preventDefault();
        e.stopPropagation();
        e.stopImmediatePropagation();

        mqCloseSelect2Dropdowns(panel);

        window.setTimeout(function () {
            openMediQModelForm();
        }, 30);

        return false;
    };

    wrap.appendChild(btn);
}

function mqFixAssetPlaceholders(panel) {
    if (!panel) return;

    var form = panel.querySelector('form.aui-confiforms') || panel.querySelector('form');
    if (!form) return;

    var idField = mqFindNamedField(form, 'deviceId');
    var nameField = mqFindNamedField(form, 'deviceName');

    if (idField && idField.tagName && idField.tagName.toLowerCase() === 'input') {
        idField.setAttribute('placeholder', 'شناسه دستگاه را وارد کنید');
    }

    if (nameField && nameField.tagName && nameField.tagName.toLowerCase() === 'input') {
        nameField.setAttribute('placeholder', 'نام دستگاه را وارد کنید');
    }
}

function mqScheduleAssetFormEnhancements(panel) {
    if (!panel) return;

    var tries = [0, 80, 180, 350, 600, 1000];

    for (var i = 0; i < tries.length; i++) {
        (function (delay) {
            window.setTimeout(function () {
                mqFixAssetPlaceholders(panel);
                mqInjectModelPlus(panel);
            }, delay);
        })(tries[i]);
    }
}

var mqModelOriginalParent = null;
var mqModelOriginalNext = null;

function findMediQModelFormPanel() {

    /*
     * The model form is identified by modelTitle + modelName.
     * This prevents it from ever being selected as mediqNewAsset.
     */
    var byFields = mqFindConfiFormsPanelByFields(
        ["modelTitle", "modelName"],
        2
    );

    if (byFields) {
        return byFields;
    }

    return mqFindConfiFormsRegistrationPanel(
        "mediqNewModel"
    );
}

function mqSnapshotAssetDraft() {
    var panel = findMediQAssetFormPanel();
    if (!panel) return;
    var form = panel.querySelector('form.aui-confiforms') || panel.querySelector('form');
    if (!form) return;

    var data = {};
    var controls = form.querySelectorAll('input[name], textarea[name], select[name]');
    for (var i = 0; i < controls.length; i++) {
        var c = controls[i];
        var name = c.name;
        if (!name || name === 'deviceModel' || c.type === 'hidden' || c.type === 'submit' || c.type === 'button') continue;
        if (c.type === 'checkbox' || c.type === 'radio') data[name] = !!c.checked;
        else data[name] = c.value;
    }
    try { window.sessionStorage.setItem('mediqAssetDraft', JSON.stringify(data)); } catch (ignore) {}
}

function mqRestoreAssetDraft(panel) {
    if (!panel) return;
    var raw = '';
    try { raw = window.sessionStorage.getItem('mediqAssetDraft') || ''; } catch (ignore) {}
    if (!raw) return;

    var data = {};
    try { data = JSON.parse(raw); } catch (ignore2) { return; }
    var form = panel.querySelector('form.aui-confiforms') || panel.querySelector('form');
    if (!form) return;

    Object.keys(data).forEach(function (name) {
        var c = mqFindNamedField(form, name);
        if (!c) return;
        if (c.type === 'checkbox' || c.type === 'radio') c.checked = !!data[name];
        else c.value = data[name];
    });

    try { window.sessionStorage.removeItem('mediqAssetDraft'); } catch (ignore3) {}
}



var mqActiveModelPanel = null;
var mqModelEnhanceBusy = false;
var mqModelRefreshTimer = null;

function mqEnhanceLiveModelPanel(panel) {
    if (!panel || mqModelEnhanceBusy) return;

    var form =
        panel.querySelector("form.aui-confiforms") ||
        panel.querySelector("form");

    if (!form) return;

    mqModelEnhanceBusy = true;

    try {
        mqSectionizeConfiForm(
            panel,
            MQ_MODEL_FORM_SECTIONS,
            []
        );

        Object.keys(MQ_FORM_LABELS).forEach(function (name) {
            mqPersianizeField(form, name);
        });

        mqEnsureNativeCloseButton(panel, "model");

        panel.style.display = "block";
        panel.style.opacity = "1";
        panel.style.visibility = "visible";
        panel.style.pointerEvents = "auto";

        mqActiveModelPanel = panel;
    } finally {
        mqModelEnhanceBusy = false;
    }
}


function mqRefreshLiveModelPanel() {
    if (!document.body.classList.contains("mq-model-form-open")) return;

    var panel = findMediQModelFormPanel();
    if (!panel) return;

    var needsEnhance =
        panel !== mqActiveModelPanel ||
        !panel.querySelector(".mq-form-section-row") ||
        !panel.querySelector(".mq-native-model-close");

    if (needsEnhance) {
        mqEnhanceLiveModelPanel(panel);
    }
}


function mqScheduleLiveModelRefresh() {
    window.clearTimeout(mqModelRefreshTimer);

    mqModelRefreshTimer = window.setTimeout(function () {
        mqRefreshLiveModelPanel();
    }, 90);

    window.setTimeout(mqRefreshLiveModelPanel, 220);
    window.setTimeout(mqRefreshLiveModelPanel, 500);
    window.setTimeout(mqRefreshLiveModelPanel, 900);
}


function mqMountModelPanel(panel) {

    var modal = document.getElementById("mqModelModal");

    if (!panel || !modal) {
        showToast("فرم ثبت مدل آماده نشد.");
        return;
    }

    mqActiveModelPanel = panel;

    /*
     * Asset form remains in DOM and keeps its data, but visually sits under
     * the model backdrop while model form is open.
     */
    document.body.classList.add("mq-model-form-open");

    modal.classList.add("open");
    modal.setAttribute("aria-hidden", "false");

    mqEnhanceLiveModelPanel(panel);

    window.setTimeout(function () {
        mqRefreshLiveModelPanel();

        var current = findMediQModelFormPanel();
        if (!current) return;

        var first = current.querySelector(
            'input:not([type="hidden"]):not([disabled]), ' +
            'textarea:not([disabled]), ' +
            'select:not([disabled])'
        );

        if (first) first.focus();
    }, 80);
}


function openMediQModelForm() {

    mqSnapshotAssetDraft();
    mqCloseSelect2Dropdowns(document);

    var panel = findMediQModelFormPanel();

    if (panel) {
        mqMountModelPanel(panel);
        return;
    }

    var control = mqFindRegistrationControl(
        "mediqNewModel",
        "ثبت مدل جدید"
    );

    if (!control) {
        showToast(
            "Registration Control فرم mediqNewModel پیدا نشد."
        );
        return;
    }

    var clicked = mqClickRegistrationControl(
        control,
        "ثبت مدل جدید"
    );

    if (!clicked) {
        showToast(
            "امکان اجرای Registration Control فرم مدل وجود نداشت."
        );
        return;
    }

    mqWaitForConfiFormsPanel(
        findMediQModelFormPanel,
        function (readyPanel) {
            mqMountModelPanel(readyPanel);
        },
        function () {
            showToast(
                "ConfiForms فرم ثبت مدل را بعد از کلیک Registration Control ایجاد نکرد."
            );
        }
    );
}


function closeMediQModelForm() {

    var modal = document.getElementById("mqModelModal");
    var panel = findMediQModelFormPanel();

    mqCloseSelect2Dropdowns(panel || document);

    document.body.classList.remove("mq-model-form-open");

    if (modal) {
        modal.classList.remove("open");
        modal.setAttribute("aria-hidden", "true");
    }

    mqActiveModelPanel = null;

    /*
     * Re-apply asset layout after closing model, because the asset form
     * was never moved or destroyed.
     */
    window.setTimeout(function () {
        mqRefreshLiveAssetPanel();
    }, 80);
}

(function bindMediQModelModal() {
    var modal = document.getElementById('mqModelModal');
    var close = document.getElementById('mqModelClose');
    if (close) close.onclick = closeMediQModelForm;
    if (modal) {
        modal.onclick = function (e) {
            if (e.target === modal) closeMediQModelForm();
        };
    }
})();



/* ============================================================
   CONFIFORMS / SELECT2 AJAX REFRESH WATCH
   No re-parenting. Only re-apply presentation after plugin redraw.
   ============================================================ */

document.addEventListener("change", function (e) {

    if (
        document.body.classList.contains("mq-asset-form-open")
    ) {
        mqScheduleLiveAssetRefresh();
    }

    if (
        document.body.classList.contains("mq-model-form-open")
    ) {
        mqScheduleLiveModelRefresh();
    }

}, true);


try {
    var mqLiveJq =
        (window.AJS && AJS.$)
            ? AJS.$
            : (window.jQuery || null);

    if (mqLiveJq) {

        mqLiveJq(document)
            .off(".mediqLiveForms")
            .on(
                "select2-selected.mediqLiveForms " +
                "select2:select.mediqLiveForms " +
                "select2-removed.mediqLiveForms " +
                "select2:unselect.mediqLiveForms",
                "input,select",
                function () {

                    if (
                        document.body.classList.contains(
                            "mq-asset-form-open"
                        )
                    ) {
                        mqScheduleLiveAssetRefresh();
                    }

                    if (
                        document.body.classList.contains(
                            "mq-model-form-open"
                        )
                    ) {
                        mqScheduleLiveModelRefresh();
                    }
                }
            );
    }
} catch (ignoreLiveFormEvents) {}


/*
 * Observe only for replacement/redraw of the ConfiForms panel.
 * We never move nodes, so this is safe with ConfiForms AJAX.
 */
var mqLiveFormsObserver = null;
var mqLiveFormsObserverTimer = null;

if (window.MutationObserver) {

    mqLiveFormsObserver =
        new MutationObserver(function () {

            if (
                !document.body.classList.contains("mq-asset-form-open") &&
                !document.body.classList.contains("mq-model-form-open")
            ) {
                return;
            }

            window.clearTimeout(
                mqLiveFormsObserverTimer
            );

            mqLiveFormsObserverTimer =
                window.setTimeout(function () {

                    if (
                        document.body.classList.contains(
                            "mq-asset-form-open"
                        )
                    ) {
                        mqRefreshLiveAssetPanel();
                    }

                    if (
                        document.body.classList.contains(
                            "mq-model-form-open"
                        )
                    ) {
                        mqRefreshLiveModelPanel();
                    }

                }, 120);
        });

    mqLiveFormsObserver.observe(
        document.body,
        {
            childList:true,
            subtree:true
        }
    );
}

/* Extra cleanup for dropdowns rendered outside the MediQ modal. */
document.addEventListener('click', function (e) {
    var assetModal = document.getElementById('mqCfModal');
    var closeBtn = e.target && e.target.closest ? e.target.closest('#mqCfClose') : null;

    if (closeBtn || (assetModal && e.target === assetModal)) {
        mqCloseSelect2Dropdowns(document);
        window.setTimeout(function () { mqCloseSelect2Dropdowns(document); }, 30);
        window.setTimeout(function () { mqCloseSelect2Dropdowns(document); }, 150);
    }
}, true);


/* ============================================================
   SIMPLE PRESENTATION PAGES
   ============================================================ */

function renderSimplePage(
    title
) {

    heroTitle.textContent =
        title;


    heroDesc.textContent =
        "نمای پرزنت این بخش";


    backButton.style.display =
        "inline-block";


    buildBreadcrumb(
        [
            "تأمین",
            "مدیریت تجهیزات",
            "مدیریت تأمین و لجستیک",
            title
        ]
    );


    view.innerHTML =

        '<div class="mq-empty-cycle">' +

            '<strong>' +
                title +
            '</strong>' +

            '<span>' +
                'این بخش در ادامه فرآیند طراحی تکمیل می‌شود.' +
            '</span>' +

        '</div>';

}



/* ============================================================
   OTHER LIFE CYCLE TABS
   ============================================================ */

function renderOtherCycle(
    key,
    title
) {

    state.cycle =
        key;


    pageTitle.textContent =
        title;


    pageDesc.textContent =
        "چرخه عمر تجهیزات پزشکی";


    heroTitle.textContent =
        title;


    heroDesc.textContent =
        "نمای ساختار این بخش";


    backButton.style.display =
        "none";


    buildBreadcrumb(
        [
            title
        ]
    );


    view.innerHTML =

        '<div class="mq-empty-cycle">' +

            '<strong>' +
                title +
            '</strong>' +

            '<span>' +
                'ساختار این بخش در مرحله بعد طراحی می‌شود.' +
            '</span>' +

        '</div>';

}



/* ============================================================
   BIND MODULE ACTIONS
   ============================================================ */

function bindActions() {

    var elements =
        document.querySelectorAll(
            "#mediq-dashboard [data-action]"
        );


    for (
        var i = 0;
        i < elements.length;
        i++
    ) {

        elements[i].onclick =
            function () {

                var action =
                    this.getAttribute(
                        "data-action"
                    );


                if (
                    action ===
                    "logistics"
                ) {

                    renderLogistics();

                }


                else if (
                    action ===
                    "newAsset"
                ) {

                    renderAssetSections(
                        "newAsset"
                    );

                }


                else if (
                    action ===
                    "editAsset"
                ) {

                    renderEditAssetWorkspace();

                }


                else if (
                    action ===
                    "purchase"
                ) {

                    renderSimplePage(
                        "خرید دارایی"
                    );

                }


                else if (
                    action ===
                    "consumable"
                ) {

                    renderSimplePage(
                        "کالاهای مصرفی"
                    );

                }

            };

    }

}



/* ============================================================
   SECTION OPTIONS
   ============================================================ */

function bindSectionOptions() {

    var options =
        document.querySelectorAll(
            "#mediq-dashboard .mq-list-option"
        );


    for (
        var i = 0;
        i < options.length;
        i++
    ) {

        options[i].onclick =
            function () {

                renderPreview(
                    this.getAttribute(
                        "data-section"
                    )
                );

            };

    }

}



/* ============================================================
   BACK
   ============================================================ */

if (backButton) {

    backButton.onclick =
        function () {


            if (
                state.screen ===
                "logistics"
            ) {

                renderEquipment();

            }


            else if (
                state.screen ===
                "newAsset" ||
                state.screen ===
                "editAsset"
            ) {

                renderLogistics();

            }


            else if (
                state.screen === "property" ||
                state.screen === "equipmentMaintenance" ||
                state.screen === "finance"
            ) {

                renderEquipment();

            }

            else if (
                state.screen === "purchase" ||
                state.screen === "consumable"
            ) {

                renderLogistics();

            }

            else {

                renderLogistics();

            }

        };

}



/* ============================================================
   LIFE CYCLE BUTTONS
   ============================================================ */

var lifeItems =
    document.querySelectorAll(
        "#mediq-dashboard .mq-life-item"
    );


for (
    var i = 0;
    i < lifeItems.length;
    i++
) {

    lifeItems[i].onclick =
        function () {

            var cycle =
                this.getAttribute(
                    "data-cycle"
                );


            for (
                var x = 0;
                x < lifeItems.length;
                x++
            ) {

                lifeItems[x]
                    .classList
                    .remove(
                        "active"
                    );

            }


            this.classList.add(
                "active"
            );


            if (
                cycle ===
                "supply"
            ) {

                state.cycle =
                    "supply";


                renderEquipment();

            }


            else if (
                cycle ===
                "operation"
            ) {

                renderOtherCycle(
                    "operation",
                    "بهره‌برداری"
                );

            }


            else if (
                cycle ===
                "replacement"
            ) {

                renderOtherCycle(
                    "replacement",
                    "جایگزینی"
                );

            }


            else if (
                cycle ===
                "maintenance"
            ) {

                renderOtherCycle(
                    "maintenance",
                    "نگهداری"
                );

            }

        };

}



/* ============================================================
   LOGOUT
   ============================================================ */

var logout =
    document.getElementById(
        "mqLogout"
    );


if (logout) {

    logout.onclick =
        function () {

            window.location.href =
                "/logout.action";

        };

}



/* ============================================================
   CURRENT USER / FULL NAME
   ============================================================ */

(function loadMediQCurrentUser() {

    var fallbackUser = "";

    try {
        if (window.AJS && AJS.Meta) {
            fallbackUser = AJS.Meta.get("remote-user") || "";
        }
    } catch (e) {}

    function setWelcomeName(name) {
        var welcomeUser = document.getElementById("mqWelcomeUser");
        if (welcomeUser && name) {
            welcomeUser.textContent = name;
        }

        /* -------------------------------------------------
           Edit page button - use current Confluence page id
           ------------------------------------------------- */
        var editBtn = document.getElementById("mqEditPageBtn");

        if (editBtn) {

            var currentPageId = "";

            try {
                if (window.AJS && AJS.Meta) {
                    currentPageId = AJS.Meta.get("page-id") || "";
                }
            }
            catch (ignorePageMeta) {}

            if (!currentPageId) {
                try {
                    currentPageId =
                        new URL(window.location.href)
                            .searchParams
                            .get("pageId") || "";
                }
                catch (ignorePageUrl) {}
            }

            if (currentPageId) {
                editBtn.href =
                    "/pages/editpage.action?pageId=" +
                    encodeURIComponent(currentPageId);
            }
        }
    }

    setWelcomeName(fallbackUser || "کاربر مدیکیو");

    try {
        var xhr = new XMLHttpRequest();
        xhr.open("GET", "/rest/api/user/current", true);
        xhr.setRequestHeader("Accept", "application/json");
        xhr.onreadystatechange = function () {
            if (xhr.readyState !== 4 || xhr.status < 200 || xhr.status >= 300) return;
            try {
                var user = JSON.parse(xhr.responseText || "{}");
                setWelcomeName(user.displayName || user.fullName || fallbackUser || "کاربر مدیکیو");
            } catch (e) {}
        };
        xhr.send();
    } catch (e) {}

})();


/* ============================================================
   SIDEBAR TREE
   ============================================================ */

function mqTreeOpen(group, open) {
    var el = document.querySelector('#mediq-dashboard [data-tree-group="' + group + '"]');
    var row = document.querySelector('#mediq-dashboard [data-tree-key="' + group + '"]');
    if (el) el.classList.toggle("open", !!open);
    if (row) row.classList.toggle("open", !!open);
}

function mqTreeReset() {
    var rows = document.querySelectorAll("#mediq-dashboard .mq-tree-row");
    for (var i = 0; i < rows.length; i++) {
        rows[i].classList.remove("active");
        rows[i].classList.remove("parent-active");
    }
}

function mqTreeActivate(key) {
    mqTreeReset();

    var active = document.querySelector('#mediq-dashboard [data-tree-key="' + key + '"]');
    if (active) active.classList.add("active");

    /* Default collapse */
    mqTreeOpen("equipment", false);
    mqTreeOpen("logistics", false);
    mqTreeOpen("newAsset", false);
    mqTreeOpen("editAsset", false);

    if (key === "equipment" || key === "property" || key === "equipmentMaintenance" || key === "finance" ||
        key === "logistics" || key === "purchase" || key === "newAsset" || key === "editAsset" ||
        key === "consumable" || key.indexOf("newAsset-") === 0 || key.indexOf("editAsset-") === 0) {
        mqTreeOpen("equipment", true);
        var p1 = document.querySelector('[data-tree-key="equipment"]');
        if (p1 && key !== "equipment") p1.classList.add("parent-active");
    }

    if (key === "logistics" || key === "purchase" || key === "newAsset" || key === "editAsset" ||
        key === "consumable" || key.indexOf("newAsset-") === 0 || key.indexOf("editAsset-") === 0) {
        mqTreeOpen("logistics", true);
        var p2 = document.querySelector('[data-tree-key="logistics"]');
        if (p2 && key !== "logistics") p2.classList.add("parent-active");
    }

    if (key === "newAsset" || key.indexOf("newAsset-") === 0) {
        mqTreeOpen("newAsset", true);
        var p3 = document.querySelector('[data-tree-key="newAsset"]');
        if (p3 && key !== "newAsset") p3.classList.add("parent-active");
    }

    if (key.indexOf("editAsset-") === 0) {
        mqTreeOpen("editAsset", true);
        var p4 = document.querySelector('[data-tree-key="editAsset"]');
        if (p4) p4.classList.add("parent-active");
    }
}

function mqTreeSimpleEquipmentPage(title, key) {
    state.screen = key;
    pageTitle.textContent = "تأمین";
    pageDesc.textContent = "مدیریت فرآیند تأمین تجهیزات پزشکی";
    heroTitle.textContent = title;
    heroDesc.textContent = "نمای پرزنت این بخش";
    backButton.style.display = "inline-block";
    buildBreadcrumb(["تأمین", "مدیریت تجهیزات", title]);
    view.innerHTML =
        '<div class="mq-empty-cycle">' +
            '<strong>' + title + '</strong>' +
            '<span>این بخش در ادامه فرآیند طراحی تکمیل می‌شود.</span>' +
        '</div>';
    mqTreeActivate(key);
}

function bindTree() {
    var rows = document.querySelectorAll("#mediq-dashboard .mq-tree-row[data-tree-action]");

    for (var i = 0; i < rows.length; i++) {
        rows[i].onclick = function () {
            var action = this.getAttribute("data-tree-action");

            if (action === "equipment") {
                renderEquipment();
            }
            else if (action === "property") {
                mqTreeSimpleEquipmentPage("مدیریت اموال", "property");
            }
            else if (action === "equipmentMaintenance") {
                mqTreeSimpleEquipmentPage("مدیریت نگهداری و تعمیر", "equipmentMaintenance");
            }
            else if (action === "finance") {
                mqTreeSimpleEquipmentPage("مدیریت مالی و بهره‌وری", "finance");
            }
            else if (action === "logistics") {
                renderLogistics();
            }
            else if (action === "purchase") {
                state.screen = "purchase";
                renderSimplePage("خرید دارایی");
                mqTreeActivate("purchase");
            }
            else if (action === "newAsset") {
                state.selectedAssetSection = "purchased";
                renderAssetSections("newAsset");
            }
            else if (action === "editAsset") {
                renderEditAssetWorkspace();
            }
            else if (action === "consumable") {
                state.screen = "consumable";
                renderSimplePage("کالاهای مصرفی");
                mqTreeActivate("consumable");
            }
            else if (action === "section") {
                var mode = this.getAttribute("data-mode");
                var section = this.getAttribute("data-section");

                if (state.screen !== mode) {
                    state.selectedAssetSection = section;
                    renderAssetSections(mode);
                } else {
                    renderPreview(section);
                }

                mqTreeActivate(mode + "-" + section);
            }
            else if (action === "cycle") {
                var cycle = this.getAttribute("data-cycle");

                if (cycle === "operation") {
                    renderOtherCycle("operation", "بهره‌برداری");
                    mqTreeActivate("operation");
                }
                else if (cycle === "replacement") {
                    renderOtherCycle("replacement", "جایگزینی");
                    mqTreeActivate("replacement");
                }
                else if (cycle === "maintenance") {
                    renderOtherCycle("maintenance", "نگهداری");
                    mqTreeActivate("maintenanceCycle");
                }
            }
        };
    }
}


/* ============================================================
   CONFIFORMS SAVE CALLBACK
   ============================================================ */

(function mqBindConfiFormsSaveCallback() {
    var previous = window.onCFSubmitFinished;

    window.onCFSubmitFinished = function (formName) {
        try {
            if (typeof previous === 'function') previous.apply(this, arguments);
        } catch (ignore) {}

        if (formName === 'mediqNewModel') {
            /*
             * V47:
             * فقط فرم مدل بسته می‌شود.
             * فرم ثبت دارایی باز می‌ماند تا کاربر همان مدل جدید را انتخاب کند.
             * هیچ Reloadای در این مرحله انجام نمی‌شود.
             */
            closeMediQModelForm();

            try {
                window.sessionStorage.removeItem('mediqAssetDraft');
                window.sessionStorage.removeItem('mediqOpenAssetAfterReload');
            } catch (ignoreModel) {}

            window.setTimeout(function () {
                var assetPanel = findMediQAssetFormPanel();
                if (!assetPanel) return;

                mqCloseSelect2Dropdowns(assetPanel);

                var assetForm =
                    assetPanel.querySelector('form.aui-confiforms') ||
                    assetPanel.querySelector('form');

                if (assetForm) {
                    var modelField =
                        mqFindNamedField(assetForm, 'deviceModel') ||
                        mqFindDeviceModelField(assetForm);

                    if (modelField) {
                        try {
                            var jq =
                                (window.AJS && AJS.$)
                                    ? AJS.$
                                    : (window.jQuery || null);

                            if (jq) {
                                try { jq(modelField).select2('close'); } catch (ignoreClose) {}
                                try { jq(modelField).trigger('change'); } catch (ignoreChange) {}
                            }
                        } catch (ignorePickerRefresh) {}
                    }
                }

                mqRefreshLiveAssetPanel();
                mqScheduleAssetFormEnhancements(assetPanel);
            }, 180);

            showToast('مدل جدید ثبت شد؛ فرم دارایی باز است و می‌توانید مدل جدید را انتخاب کنید.');
            return;
        }

        if (formName === 'mediqNewAsset') {
            var target = 'newAsset-purchased';
            try {
                target = window.sessionStorage.getItem('mediqPendingReturn') ||
                         (state.screen === 'editAsset' ? 'editAsset' : 'newAsset-purchased');
                window.sessionStorage.removeItem('mediqPendingReturn');
                window.sessionStorage.setItem('mediqResumeView', target);
            } catch (ignore2) {}

            window.setTimeout(function () {
                window.location.reload();
            }, 450);
        }
    };
})();

/* ============================================================
   MEDIQ V47 - MODEL OBJECT + BUTTONS / KEEP ASSET OPEN / NESTED CLOSE SYNC
   IMPORTANT: this block must live INSIDE the main MediQ IIFE.
   ============================================================ */

var MQ_MODEL_REFERENCE_CFG = {
    deviceTitle: {
        label: "عنوان دستگاه",
        formName: "mediqNewEquipmentTitle",
        buttonText: "ثبت عنوان دستگاه جدید"
    },
    manufacturer: {
        label: "شرکت سازنده",
        formName: "mediqNewManufacturer",
        buttonText: "ثبت شرکت سازنده جدید"
    },
    modelType: {
        label: "نوع",
        formName: "mediqNewFacility",
        buttonText: "ثبت نوع جدید"
    },
    modelGroup: {
        label: "گروه",
        formName: "mediqNewClassification",
        buttonText: "ثبت گروه جدید"
    }
};

/* Model page must expose every real Models attribute except system-managed ones. */
MQ_MODEL_FORM_SECTIONS = [
    /* Assets Models: 6625,6626,6627,6628 / 6629,6630,6637,6632,6633 / 6634-6636 */
    { title:"مشخصات اصلی مدل", fields:["modelName","deviceTitle","manufacturer","nature"] },
    { title:"طبقه‌بندی مدل", fields:["modelType","modelGroup","modelFunction","criticality","technology"] },
    { title:"نیازمندی‌های مصرفی", fields:["powerRequirement","waterRequirement","gasRequirement"] }
];

MQ_FORM_LABELS.modelTitle = "عنوان مدل";
MQ_FORM_LABELS.modelName = "سری دستگاه";
MQ_FORM_LABELS.deviceTitle = "عنوان دستگاه";
MQ_FORM_LABELS.manufacturer = "شرکت سازنده";
MQ_FORM_LABELS.nature = "ماهیت دستگاه";
MQ_FORM_LABELS.technicalInfo = "اطلاعات فنی";
MQ_FORM_LABELS.modelType = "نوع";
MQ_FORM_LABELS.modelGroup = "گروه";
MQ_FORM_LABELS.modelFunction = "کارکرد";
MQ_FORM_LABELS.criticality = "سطح اهمیت";
MQ_FORM_LABELS.technology = "فناوری";
MQ_FORM_LABELS.powerRequirement = "برق مصرفی";
MQ_FORM_LABELS.waterRequirement = "آب مصرفی";
MQ_FORM_LABELS.gasRequirement = "گاز مصرفی";

function mqNormalizeTextV46(v) {
    return String(v == null ? "" : v).replace(/\s+/g, " ").trim();
}

function mqFindModelFieldV46(form, fieldName, labelText) {
    if (!form) return null;

    var direct = mqFindNamedField(form, fieldName);
    if (direct) return direct;

    var selectors = [
        '[data-field-name="' + fieldName + '"]',
        '[data-fieldname="' + fieldName + '"]',
        '[id*="' + fieldName + '"]',
        '[name*="' + fieldName + '"]'
    ];

    for (var s = 0; s < selectors.length; s++) {
        try {
            var byAttr = form.querySelector(selectors[s]);
            if (byAttr) return byAttr;
        } catch (ignoreSelector) {}
    }

    var rows = form.querySelectorAll('tr, .field-group, .control-group');
    var wanted = mqNormalizeTextV46(labelText);

    for (var i = 0; i < rows.length; i++) {
        var txt = mqNormalizeTextV46(rows[i].textContent || "");
        if (!wanted || txt.indexOf(wanted) === -1) continue;

        var c = rows[i].querySelector(
            'input.select2-offscreen, input.select2-hidden-accessible, select, input[name], textarea[name], .select2-container'
        );
        if (c) return c;
    }

    return null;
}

function mqReferenceVisualV46(form, field) {
    if (!form || !field) return null;

    if (field.classList && field.classList.contains('select2-container')) {
        return field;
    }

    var row =
        (field.closest && field.closest('tr')) ||
        (field.closest && field.closest('.field-group')) ||
        (field.closest && field.closest('.control-group')) ||
        field.parentElement;

    if (row) {
        var select2 = row.querySelector('.select2-container');
        if (select2) return select2;
    }

    if (field.nextElementSibling && field.nextElementSibling.classList &&
        field.nextElementSibling.classList.contains('select2-container')) {
        return field.nextElementSibling;
    }

    return field;
}

function mqFieldDisplayTextV46(form, fieldName, labelText) {
    var field = mqFindModelFieldV46(form, fieldName, labelText);
    if (!field) return "";

    var row =
        (field.closest && field.closest('tr')) ||
        (field.closest && field.closest('.field-group')) ||
        (field.closest && field.closest('.control-group')) ||
        field.parentElement;

    if (row) {
        var rendered = row.querySelector(
            '.select2-chosen, .select2-selection__rendered, .aui-select2-choice .select2-chosen'
        );
        if (rendered) {
            var text = mqNormalizeTextV46(rendered.textContent || "")
                .replace(/^×\s*/, "")
                .trim();

            if (text && text !== "انتخاب کنید" && text !== "Select") {
                return text;
            }
        }
    }

    return mqNormalizeTextV46(field.value || "");
}

function mqUpdateAutoModelTitleV46(panel) {
    if (!panel) return;

    var form = panel.querySelector('form.aui-confiforms') || panel.querySelector('form');
    if (!form) return;

    var titleField = mqFindNamedField(form, 'modelTitle');
    if (!titleField) return;

    var deviceTitle = mqFieldDisplayTextV46(form, 'deviceTitle', 'عنوان دستگاه');
    var manufacturer = mqFieldDisplayTextV46(form, 'manufacturer', 'شرکت سازنده');
    var modelName = mqFieldDisplayTextV46(form, 'modelName', 'مدل دستگاه');

    var parts = [];
    if (deviceTitle) parts.push(deviceTitle);
    if (manufacturer) parts.push(manufacturer);
    if (modelName) parts.push(modelName);

    var value = parts.join(' - ');
    if (!value) return;

    titleField.value = value;
    titleField.setAttribute('value', value);

    try { titleField.dispatchEvent(new Event('input', { bubbles:true })); } catch (ignoreInput) {}
    try { titleField.dispatchEvent(new Event('change', { bubbles:true })); } catch (ignoreChange) {}
    try { if (window.AJS && AJS.$) AJS.$(titleField).val(value); } catch (ignoreAJS) {}
}

/* ------------------------------------------------------------
   Child Reference Modal (ConfiForms-based)
   ------------------------------------------------------------ */
var mqReferenceActiveV46 = null;

function mqEnsureReferenceBackdropV46() {
    var modal = document.getElementById('mqReferenceModalV46');
    if (modal) return modal;

    modal = document.createElement('div');
    modal.id = 'mqReferenceModalV46';
    modal.setAttribute('aria-hidden', 'true');
    document.body.appendChild(modal);

    modal.onclick = function (e) {
        if (e.target === modal) {
            closeMediQReferenceFormV46();
        }
    };

    return modal;
}

function mqFindReferencePanelV46(cfg) {
    if (!cfg) return null;

    var panel = mqFindConfiFormsRegistrationPanel(cfg.formName);
    if (!panel) return null;

    var asset = findMediQAssetFormPanel();
    var model = findMediQModelFormPanel();
    if (panel === asset || panel === model) return null;

    return panel;
}

function mqEnsureReferenceCloseV46(panel) {
    if (!panel) return;

    var title = panel.querySelector('.confiFormsFormTitle') || panel.querySelector('.confiFormsFormContent');
    if (!title || title.querySelector('.mq-native-reference-close-v46')) return;

    var btn = document.createElement('button');
    btn.type = 'button';
    btn.className = 'mq-native-form-close mq-native-reference-close-v46';
    btn.setAttribute('aria-label', 'بستن');
    btn.setAttribute('title', 'بستن');
    btn.textContent = '×';
    btn.onclick = function (e) {
        e.preventDefault();
        e.stopPropagation();
        e.stopImmediatePropagation();
        closeMediQReferenceFormV46();
        return false;
    };

    title.appendChild(btn);
}

function mqMountReferencePanelV46(panel, cfg, fieldName) {
    if (!panel || !cfg) return;

    var modal = mqEnsureReferenceBackdropV46();
    mqReferenceActiveV46 = {
        panel: panel,
        cfg: cfg,
        fieldName: fieldName
    };

    panel.classList.add('mq-reference-panel-v46');
    panel.setAttribute('data-mq-reference-form', cfg.formName);

    document.body.classList.add('mq-reference-form-open-v46');
    modal.classList.add('open');
    modal.setAttribute('aria-hidden', 'false');

    mqEnsureReferenceCloseV46(panel);

    panel.style.display = 'block';
    panel.style.opacity = '1';
    panel.style.visibility = 'visible';
    panel.style.pointerEvents = 'auto';

    window.setTimeout(function () {
        var current = mqFindReferencePanelV46(cfg);
        if (!current) return;

        mqEnsureReferenceCloseV46(current);

        var first = current.querySelector(
            'input:not([type="hidden"]):not([disabled]), textarea:not([disabled]), select:not([disabled])'
        );
        if (first) first.focus();
    }, 80);
}

function openMediQReferenceFormV46(fieldName) {
    var cfg = MQ_MODEL_REFERENCE_CFG[fieldName];
    if (!cfg) {
        showToast('تنظیمات فیلد مرجع پیدا نشد.');
        return;
    }

    mqCloseSelect2Dropdowns(document);

    var panel = mqFindReferencePanelV46(cfg);
    if (panel) {
        mqMountReferencePanelV46(panel, cfg, fieldName);
        return;
    }

    var control = mqFindRegistrationControl(cfg.formName, cfg.buttonText);
    if (!control) {
        showToast(
            'فرم «' + cfg.formName + '» روی همین صفحه ساخته نشده است.'
        );
        return;
    }

    var clicked = mqClickRegistrationControl(control, cfg.buttonText);
    if (!clicked) {
        showToast('Registration Control فرم «' + cfg.formName + '» اجرا نشد.');
        return;
    }

    mqWaitForConfiFormsPanel(
        function () { return mqFindReferencePanelV46(cfg); },
        function (readyPanel) { mqMountReferencePanelV46(readyPanel, cfg, fieldName); },
        function () { showToast('ConfiForms فرم «' + cfg.formName + '» را ایجاد نکرد.'); }
    );
}

function closeMediQReferenceFormV46() {
    var modal = document.getElementById('mqReferenceModalV46');
    var active = mqReferenceActiveV46;

    mqCloseSelect2Dropdowns(active && active.panel ? active.panel : document);
    document.body.classList.remove('mq-reference-form-open-v46');

    if (modal) {
        modal.classList.remove('open');
        modal.setAttribute('aria-hidden', 'true');
    }

    if (active && active.panel) {
        active.panel.classList.remove('mq-reference-panel-v46');
        active.panel.removeAttribute('data-mq-reference-form');
    }

    mqReferenceActiveV46 = null;

    window.setTimeout(function () {
        if (document.body.classList.contains('mq-model-form-open')) {
            var panel = findMediQModelFormPanel();
            if (panel) {
                mqUpdateAutoModelTitleV46(panel);
                mqInjectAllModelReferenceButtonsV46(panel);
            }
        }
    }, 80);
}

function mqInjectReferenceButtonV46(panel, fieldName, cfg) {
    if (!panel || !cfg) return;

    var form = panel.querySelector('form.aui-confiforms') || panel.querySelector('form');
    if (!form) return;

    if (form.querySelector('.mq-reference-plus-v46[data-mq-ref-field="' + fieldName + '"]')) {
        return;
    }

    var field = mqFindModelFieldV46(form, fieldName, cfg.label);
    if (!field) return;

    var visual = mqReferenceVisualV46(form, field);
    if (!visual) return;

    var cell =
        (visual.closest && visual.closest('td')) ||
        (field.closest && field.closest('td')) ||
        (field.closest && field.closest('.field-group')) ||
        (field.closest && field.closest('.control-group')) ||
        visual.parentElement;

    if (!cell) return;

    cell.classList.add('mq-reference-cell-v46');

    var wrap = cell.querySelector('.mq-reference-control-wrap-v46');

    if (!wrap) {
        wrap = document.createElement('div');
        wrap.className = 'mq-reference-control-wrap-v46';

        if (visual.parentNode) {
            visual.parentNode.insertBefore(wrap, visual);
            wrap.appendChild(visual);
        } else {
            cell.appendChild(wrap);
        }
    }

    var btn = document.createElement('button');
    btn.type = 'button';
    btn.className = 'mq-reference-plus-v46';
    btn.setAttribute('data-mq-ref-field', fieldName);
    btn.setAttribute('title', 'ثبت ' + cfg.label + ' جدید');
    btn.setAttribute('aria-label', 'ثبت ' + cfg.label + ' جدید');
    btn.textContent = '+';

    btn.onclick = function (e) {
        e.preventDefault();
        e.stopPropagation();
        e.stopImmediatePropagation();

        mqCloseSelect2Dropdowns(panel);

        window.setTimeout(function () {
            openMediQReferenceFormV46(fieldName);
        }, 20);

        return false;
    };

    wrap.appendChild(btn);
}

function mqInjectAllModelReferenceButtonsV46(panel) {
    Object.keys(MQ_MODEL_REFERENCE_CFG).forEach(function (fieldName) {
        mqInjectReferenceButtonV46(panel, fieldName, MQ_MODEL_REFERENCE_CFG[fieldName]);
    });
}

/* Replace model finder with a safe version that cannot confuse the asset form. */
findMediQModelFormPanel = function () {
    var panels = document.querySelectorAll('.confiFormsFormBorder, [id^="i_confiform_registration_panel_"]');

    for (var i = 0; i < panels.length; i++) {
        var form = panels[i].querySelector('form.aui-confiforms') || panels[i].querySelector('form');
        if (!form) continue;

        var hasModelName = !!mqFindModelFieldV46(form, 'modelName', 'مدل دستگاه');
        var hasDeviceTitle = !!mqFindModelFieldV46(form, 'deviceTitle', 'عنوان دستگاه');
        var hasManufacturer = !!mqFindModelFieldV46(form, 'manufacturer', 'شرکت سازنده');
        var hasModelType = !!mqFindModelFieldV46(form, 'modelType', 'نوع');
        var hasModelGroup = !!mqFindModelFieldV46(form, 'modelGroup', 'گروه');

        if (hasModelName && (hasDeviceTitle || hasManufacturer || hasModelType || hasModelGroup)) {
            return panels[i];
        }
    }

    return mqFindConfiFormsRegistrationPanel('mediqNewModel');
};

var mqOriginalEnhanceModelV46 = mqEnhanceLiveModelPanel;

mqEnhanceLiveModelPanel = function (panel) {
    if (!panel || mqModelEnhanceBusy) return;

    var form = panel.querySelector('form.aui-confiforms') || panel.querySelector('form');
    if (!form) return;

    mqModelEnhanceBusy = true;

    try {
        mqSectionizeConfiForm(
            panel,
            MQ_MODEL_FORM_SECTIONS,
            ['modelTitle', 'technicalInfo']
        );

        Object.keys(MQ_FORM_LABELS).forEach(function (name) {
            mqPersianizeField(form, name);
        });

        mqUpdateAutoModelTitleV46(panel);
        mqInjectAllModelReferenceButtonsV46(panel);
        mqEnsureNativeCloseButton(panel, 'model');

        panel.style.display = 'block';
        panel.style.opacity = '1';
        panel.style.visibility = 'visible';
        panel.style.pointerEvents = 'auto';

        mqActiveModelPanel = panel;
    }
    finally {
        mqModelEnhanceBusy = false;
    }
};

function mqScheduleModelButtonsV46() {
    var delays = [0, 80, 180, 350, 650, 1000, 1600];

    for (var i = 0; i < delays.length; i++) {
        (function (delay) {
            window.setTimeout(function () {
                if (!document.body.classList.contains('mq-model-form-open')) return;
                var panel = findMediQModelFormPanel();
                if (!panel) return;
                mqUpdateAutoModelTitleV46(panel);
                mqInjectAllModelReferenceButtonsV46(panel);
            }, delay);
        })(delays[i]);
    }
}

var mqOriginalMountModelV46 = mqMountModelPanel;
mqMountModelPanel = function (panel) {
    mqOriginalMountModelV46(panel);
    mqScheduleModelButtonsV46();
};

/* Closing the MODEL also closes any child reference modal. */
var mqOriginalCloseModelV46 = closeMediQModelForm;
closeMediQModelForm = function () {
    if (document.body.classList.contains('mq-reference-form-open-v46')) {
        closeMediQReferenceFormV46();
    }
    mqOriginalCloseModelV46();
};

/* Closing the ASSET form closes child reference + model in the same click. */
var mqOriginalCloseAssetV46 = closeMediQAssetForm;
closeMediQAssetForm = function () {
    if (document.body.classList.contains('mq-reference-form-open-v46')) {
        closeMediQReferenceFormV46();
    }

    if (document.body.classList.contains('mq-model-form-open')) {
        mqOriginalCloseModelV46();
    }

    mqOriginalCloseAssetV46();
};

/* Rebind direct onclick assignment done earlier in the script. */
(function mqRebindCloseButtonsV46() {
    var assetClose = document.getElementById('mqCfClose');
    if (assetClose) assetClose.onclick = closeMediQAssetForm;

    var modelClose = document.getElementById('mqModelClose');
    if (modelClose) modelClose.onclick = closeMediQModelForm;
})();

/* ESC: deepest open form closes first. */
document.addEventListener('keydown', function (e) {
    if (e.key !== 'Escape') return;

    if (document.body.classList.contains('mq-reference-form-open-v46')) {
        e.preventDefault();
        e.stopPropagation();
        e.stopImmediatePropagation();
        closeMediQReferenceFormV46();
        return;
    }

    if (document.body.classList.contains('mq-model-form-open')) {
        e.preventDefault();
        e.stopPropagation();
        e.stopImmediatePropagation();
        closeMediQModelForm();
    }
}, true);

/* Keep + buttons after Select2/ConfiForms redraws. */
document.addEventListener('input', function () {
    if (!document.body.classList.contains('mq-model-form-open')) return;
    mqScheduleModelButtonsV46();
}, true);

document.addEventListener('change', function () {
    if (!document.body.classList.contains('mq-model-form-open')) return;
    mqScheduleModelButtonsV46();
}, true);

try {
    var mqV46Jq = (window.AJS && AJS.$) ? AJS.$ : (window.jQuery || null);
    if (mqV46Jq) {
        mqV46Jq(document)
            .off('.mediqV46Refs')
            .on(
                'select2-selected.mediqV46Refs select2:select.mediqV46Refs select2-removed.mediqV46Refs select2:unselect.mediqV46Refs',
                'input,select',
                function () {
                    if (document.body.classList.contains('mq-model-form-open')) {
                        mqScheduleModelButtonsV46();
                    }
                }
            );
    }
}
catch (ignoreV46Jq) {}

try {
    var mqV46Observer = new MutationObserver(function () {
        if (!document.body.classList.contains('mq-model-form-open')) return;
        window.setTimeout(function () {
            var panel = findMediQModelFormPanel();
            if (!panel) return;
            mqInjectAllModelReferenceButtonsV46(panel);
        }, 20);
    });

    if (document.body) {
        mqV46Observer.observe(document.body, { childList:true, subtree:true });
    }
}
catch (ignoreV46Observer) {}

/* Child quick-create submit: close only the child, keep model + asset open. */
(function mqWrapSubmitFinishedV46() {
    var previousSubmit = window.onCFSubmitFinished;

    window.onCFSubmitFinished = function (formName) {
        var isReference = false;

        Object.keys(MQ_MODEL_REFERENCE_CFG).forEach(function (key) {
            if (MQ_MODEL_REFERENCE_CFG[key].formName === formName) {
                isReference = true;
            }
        });

        if (isReference) {
            closeMediQReferenceFormV46();
            showToast('مقدار جدید ثبت شد؛ لیست فیلد مرجع به‌روزرسانی می‌شود.');
            mqScheduleModelButtonsV46();
            return;
        }

        if (typeof previousSubmit === 'function') {
            return previousSubmit.apply(this, arguments);
        }
    };
})();




/* ============================================================
   MEDIQ V48 - CLEAN FORMS / FULL WIDTH SELECT2 / NESTED CLASSIFICATION
   ============================================================ */

function mqResetConfiFormV48(panel) {
    if (!panel) return;

    var form =
        panel.querySelector('form.aui-confiforms') ||
        panel.querySelector('form');

    if (!form) return;

    try { form.reset(); } catch (ignoreReset) {}

    var controls = form.querySelectorAll(
        'input:not([type="hidden"]), textarea, select'
    );

    for (var i = 0; i < controls.length; i++) {
        var c = controls[i];
        if (!c || c.disabled) continue;

        var type = String(c.type || '').toLowerCase();

        if (type === 'submit' || type === 'button' || type === 'reset') {
            continue;
        }

        if (type === 'checkbox' || type === 'radio') {
            c.checked = false;
        }
        else if (c.tagName === 'SELECT') {
            try { c.selectedIndex = -1; } catch (ignoreSelectIndex) {}
            try { c.value = ''; } catch (ignoreSelectValue) {}
        }
        else {
            try { c.value = ''; } catch (ignoreValue) {}
        }

        try { c.dispatchEvent(new Event('input', { bubbles:true })); } catch (ignoreInput) {}
        try { c.dispatchEvent(new Event('change', { bubbles:true })); } catch (ignoreChange) {}
    }

    /* ConfiForms/Select2 often stores the real selected value in a hidden input. */
    var select2Controls = form.querySelectorAll(
        'input.select2-offscreen, input.select2-hidden-accessible, ' +
        'select.select2-offscreen, select.select2-hidden-accessible'
    );

    var jq =
        (window.AJS && AJS.$)
            ? AJS.$
            : (window.jQuery || null);

    for (var j = 0; j < select2Controls.length; j++) {
        var s = select2Controls[j];

        try {
            if (jq) {
                try { jq(s).select2('val', ''); } catch (ignoreS2v3) {}
                try { jq(s).val(null).trigger('change'); } catch (ignoreS2v4) {}
            }
        }
        catch (ignoreSelect2) {}

        try { s.value = ''; } catch (ignoreHiddenValue) {}
    }

    /* Hide stale validation/web-service banners from the previous opening. */
    var stale = panel.querySelectorAll(
        '.aui-message-error, .aui-message-warning, .confiforms-error, ' +
        '.confiFormsError, .cf-error'
    );

    for (var k = 0; k < stale.length; k++) {
        try { stale[k].style.display = 'none'; } catch (ignoreBanner) {}
    }
}


/* ------------------------------------------------------------
   Make model reference Select2 boxes always fill the control area.
   ------------------------------------------------------------ */
function mqRepairModelDropdownWidthsV48() {
    if (!document.body.classList.contains('mq-model-form-open')) return;

    var panel = findMediQModelFormPanel();
    if (!panel) return;

    var wraps = panel.querySelectorAll('.mq-reference-control-wrap-v46');

    for (var i = 0; i < wraps.length; i++) {
        var select2 = wraps[i].querySelector('.select2-container');
        if (!select2) continue;

        select2.style.setProperty('width', '100%', 'important');
        select2.style.setProperty('max-width', '100%', 'important');
        select2.style.setProperty('min-width', '0', 'important');
    }
}


/* ------------------------------------------------------------
   Reference quick-create form: always open blank.
   ------------------------------------------------------------ */
var mqOriginalMountReferenceV48 = mqMountReferencePanelV46;
mqMountReferencePanelV46 = function (panel, cfg, fieldName) {
    mqResetConfiFormV48(panel);
    var result = mqOriginalMountReferenceV48.apply(this, arguments);

    window.setTimeout(function () {
        mqInjectEquipmentTitleGroupPlusV48(panel, cfg);
    }, 80);

    return result;
};

var mqOriginalCloseReferenceV48 = closeMediQReferenceFormV46;
closeMediQReferenceFormV46 = function () {
    if (document.body.classList.contains('mq-nested-reference-open-v48')) {
        closeMediQNestedClassificationV48();
    }

    var active = mqReferenceActiveV46;
    var panel = active && active.panel ? active.panel : null;

    var result = mqOriginalCloseReferenceV48.apply(this, arguments);

    window.setTimeout(function () {
        mqResetConfiFormV48(panel);
    }, 20);

    return result;
};


/* ------------------------------------------------------------
   Model form: every new opening starts blank.
   Asset form stays open underneath after model save.
   ------------------------------------------------------------ */
var mqOriginalMountModelV48 = mqMountModelPanel;
mqMountModelPanel = function (panel) {
    mqResetConfiFormV48(panel);

    var result = mqOriginalMountModelV48.apply(this, arguments);

    window.setTimeout(mqRepairModelDropdownWidthsV48, 0);
    window.setTimeout(mqRepairModelDropdownWidthsV48, 120);
    window.setTimeout(mqRepairModelDropdownWidthsV48, 350);

    return result;
};

var mqOriginalCloseModelV48 = closeMediQModelForm;
closeMediQModelForm = function () {
    if (document.body.classList.contains('mq-nested-reference-open-v48')) {
        closeMediQNestedClassificationV48();
    }

    var panel = findMediQModelFormPanel();
    var result = mqOriginalCloseModelV48.apply(this, arguments);

    window.setTimeout(function () {
        mqResetConfiFormV48(panel);
    }, 20);

    return result;
};


/* ------------------------------------------------------------
   Asset form: if the user actually closes it and opens a new one,
   the old values must not survive.
   ------------------------------------------------------------ */
var mqOriginalCloseAssetV48 = closeMediQAssetForm;
closeMediQAssetForm = function () {
    if (document.body.classList.contains('mq-nested-reference-open-v48')) {
        closeMediQNestedClassificationV48();
    }

    var panel = findMediQAssetFormPanel();
    var result = mqOriginalCloseAssetV48.apply(this, arguments);

    window.setTimeout(function () {
        mqResetConfiFormV48(panel);
        try { window.sessionStorage.removeItem('mediqAssetDraft'); } catch (ignoreDraft) {}
    }, 20);

    return result;
};


/* ============================================================
   NESTED QUICK CREATE:
   Equipment Title -> Group(Classification) [+]
   ============================================================ */
var mqNestedClassificationPanelV48 = null;

function mqFindClassificationPanelV48() {
    var panel = mqFindConfiFormsRegistrationPanel('mediqNewClassification');
    if (!panel) return null;

    var asset = findMediQAssetFormPanel();
    var model = findMediQModelFormPanel();
    var parent = mqReferenceActiveV46 && mqReferenceActiveV46.panel
        ? mqReferenceActiveV46.panel
        : null;

    if (panel === asset || panel === model || panel === parent) return null;
    return panel;
}

function mqEnsureNestedClassificationBackdropV48() {
    var modal = document.getElementById('mqNestedReferenceModalV48');
    if (modal) return modal;

    modal = document.createElement('div');
    modal.id = 'mqNestedReferenceModalV48';
    modal.setAttribute('aria-hidden', 'true');
    document.body.appendChild(modal);

    modal.onclick = function (e) {
        if (e.target === modal) closeMediQNestedClassificationV48();
    };

    return modal;
}

function mqEnsureNestedCloseV48(panel) {
    if (!panel) return;

    var title =
        panel.querySelector('.confiFormsFormTitle') ||
        panel.querySelector('.confiFormsFormContent');

    if (!title || title.querySelector('.mq-native-nested-close-v48')) return;

    var btn = document.createElement('button');
    btn.type = 'button';
    btn.className = 'mq-native-form-close mq-native-nested-close-v48';
    btn.setAttribute('aria-label', 'بستن');
    btn.setAttribute('title', 'بستن');
    btn.textContent = '×';
    btn.onclick = function (e) {
        e.preventDefault();
        e.stopPropagation();
        e.stopImmediatePropagation();
        closeMediQNestedClassificationV48();
        return false;
    };

    title.appendChild(btn);
}

function mqMountNestedClassificationV48(panel) {
    if (!panel) return;

    mqResetConfiFormV48(panel);

    var modal = mqEnsureNestedClassificationBackdropV48();
    mqNestedClassificationPanelV48 = panel;

    panel.classList.add('mq-nested-reference-panel-v48');
    document.body.classList.add('mq-nested-reference-open-v48');

    modal.classList.add('open');
    modal.setAttribute('aria-hidden', 'false');

    mqEnsureNestedCloseV48(panel);

    panel.style.display = 'block';
    panel.style.opacity = '1';
    panel.style.visibility = 'visible';
    panel.style.pointerEvents = 'auto';

    window.setTimeout(function () {
        mqEnsureNestedCloseV48(panel);

        var first = panel.querySelector(
            'input:not([type="hidden"]):not([disabled]), textarea:not([disabled]), select:not([disabled])'
        );
        if (first) first.focus();
    }, 80);
}

function openMediQNestedClassificationV48() {
    mqCloseSelect2Dropdowns(document);

    var panel = mqFindClassificationPanelV48();
    if (panel) {
        mqMountNestedClassificationV48(panel);
        return;
    }

    var control = mqFindRegistrationControl(
        'mediqNewClassification',
        'ثبت گروه جدید'
    );

    if (!control) {
        showToast('ابتدا فرم mediqNewClassification و Registration Control آن را روی همین صفحه بسازید.');
        return;
    }

    var clicked = mqClickRegistrationControl(control, 'ثبت گروه جدید');
    if (!clicked) {
        showToast('Registration Control فرم Classification اجرا نشد.');
        return;
    }

    mqWaitForConfiFormsPanel(
        mqFindClassificationPanelV48,
        function (readyPanel) {
            mqMountNestedClassificationV48(readyPanel);
        },
        function () {
            showToast('ConfiForms فرم Classification را ایجاد نکرد.');
        }
    );
}

function closeMediQNestedClassificationV48() {
    var modal = document.getElementById('mqNestedReferenceModalV48');
    var panel = mqNestedClassificationPanelV48;

    mqCloseSelect2Dropdowns(panel || document);
    document.body.classList.remove('mq-nested-reference-open-v48');

    if (modal) {
        modal.classList.remove('open');
        modal.setAttribute('aria-hidden', 'true');
    }

    if (panel) {
        panel.classList.remove('mq-nested-reference-panel-v48');
    }

    mqNestedClassificationPanelV48 = null;

    window.setTimeout(function () {
        mqResetConfiFormV48(panel);

        var active = mqReferenceActiveV46;
        if (active && active.panel) {
            mqInjectEquipmentTitleGroupPlusV48(active.panel, active.cfg);
        }
    }, 30);
}

function mqInjectEquipmentTitleGroupPlusV48(panel, cfg) {
    if (!panel || !cfg || cfg.formName !== 'mediqNewEquipmentTitle') return;

    var form =
        panel.querySelector('form.aui-confiforms') ||
        panel.querySelector('form');

    if (!form) return;

    if (form.querySelector('.mq-equipment-title-group-plus-v48')) return;

    var field = mqFindNamedField(form, 'equipmentTitleGroup');
    if (!field) return;

    var visual = mqReferenceVisualV46(form, field);
    if (!visual) return;

    var cell =
        (visual.closest && visual.closest('td')) ||
        (field.closest && field.closest('td')) ||
        (field.closest && field.closest('.field-group')) ||
        visual.parentElement;

    if (!cell) return;

    var wrap = document.createElement('div');
    wrap.className = 'mq-nested-ref-wrap-v48';

    if (visual.parentNode) {
        visual.parentNode.insertBefore(wrap, visual);
        wrap.appendChild(visual);
    }
    else {
        cell.appendChild(wrap);
    }

    var btn = document.createElement('button');
    btn.type = 'button';
    btn.className = 'mq-reference-plus-v46 mq-equipment-title-group-plus-v48';
    btn.setAttribute('title', 'ثبت گروه جدید');
    btn.setAttribute('aria-label', 'ثبت گروه جدید');
    btn.textContent = '+';

    btn.onclick = function (e) {
        e.preventDefault();
        e.stopPropagation();
        e.stopImmediatePropagation();
        openMediQNestedClassificationV48();
        return false;
    };

    wrap.appendChild(btn);

    var select2 = wrap.querySelector('.select2-container');
    if (select2) {
        select2.style.setProperty('width', '100%', 'important');
        select2.style.setProperty('max-width', '100%', 'important');
        select2.style.setProperty('min-width', '0', 'important');
    }
}


/* ------------------------------------------------------------
   Existing reference modal redraw may recreate the Equipment Title
   picker, therefore re-inject its nested + when required.
   ------------------------------------------------------------ */
document.addEventListener('change', function () {
    window.setTimeout(mqRepairModelDropdownWidthsV48, 0);
    window.setTimeout(mqRepairModelDropdownWidthsV48, 120);

    var active = mqReferenceActiveV46;
    if (active && active.panel) {
        window.setTimeout(function () {
            mqInjectEquipmentTitleGroupPlusV48(active.panel, active.cfg);
        }, 80);
    }
}, true);

try {
    var mqV48Observer = new MutationObserver(function () {
        if (document.body.classList.contains('mq-model-form-open')) {
            window.setTimeout(mqRepairModelDropdownWidthsV48, 20);
        }

        var active = mqReferenceActiveV46;
        if (active && active.panel) {
            window.setTimeout(function () {
                mqInjectEquipmentTitleGroupPlusV48(active.panel, active.cfg);
            }, 30);
        }
    });

    if (document.body) {
        mqV48Observer.observe(document.body, { childList:true, subtree:true });
    }
}
catch (ignoreV48Observer) {}


/* ------------------------------------------------------------
   If Classification was created from INSIDE Equipment Title,
   close only the nested Classification form. Keep Equipment Title,
   Model and Asset forms open.
   ------------------------------------------------------------ */
(function mqWrapNestedClassificationSubmitV48() {
    var previousSubmitV48 = window.onCFSubmitFinished;

    window.onCFSubmitFinished = function (formName) {
        if (
            formName === 'mediqNewClassification' &&
            document.body.classList.contains('mq-nested-reference-open-v48')
        ) {
            closeMediQNestedClassificationV48();
            showToast('گروه جدید ثبت شد؛ فرم عنوان دستگاه باز مانده است.');
            return;
        }

        if (typeof previousSubmitV48 === 'function') {
            return previousSubmitV48.apply(this, arguments);
        }
    };
})();


/* Final close-button binding must point to V48 wrappers. */
(function mqRebindCloseButtonsV48() {
    var assetClose = document.getElementById('mqCfClose');
    if (assetClose) assetClose.onclick = closeMediQAssetForm;

    var modelClose = document.getElementById('mqModelClose');
    if (modelClose) modelClose.onclick = closeMediQModelForm;
})();



/* ============================================================
   MEDIQ V62 - TOP-DOWN REGISTRATION FLOW
   Classification -> Equipment Title -> Model -> Equipment
   Uses the existing ConfiForms; no nested form stack.
   ============================================================ */

var mqFlowStateV50 = {
    open: false,
    step: 1,
    mode: "selector",
    activePanel: null,
    initialized: {}
};

var MQ_FLOW_CFG_V50 = {
    classification: {
        formName: "mediqNewClassification",
        buttonText: "ثبت گروه جدید",
        title: "ثبت گروه جدید"
    },
    equipmentTitle: {
        formName: "mediqNewEquipmentTitle",
        buttonText: "ثبت عنوان دستگاه جدید",
        title: "ثبت عنوان دستگاه جدید"
    },
    model: {
        formName: "mediqNewModel",
        buttonText: "ثبت مدل جدید",
        title: "ثبت مدل جدید"
    },
    asset: {
        formName: "mediqNewAsset",
        buttonText: "ثبت دارایی جدید",
        title: "ثبت دستگاه"
    }
};

/* ============================================================
   V61 - STRICT FORM/PANEL RESOLUTION
   هر مرحله فقط فرم واقعی خودش را می‌گیرد و هیچ‌وقت Asset Form
   به جای Model Form یا Equipment Title Form انتخاب نمی‌شود.
   ============================================================ */
function mqFlowStrictPanelByFieldsV60(requiredFields, forbiddenFields) {
    requiredFields = requiredFields || [];
    forbiddenFields = forbiddenFields || [];

    var candidates = [];
    var seen = [];

    function add(el) {
        if (!el) return;
        var panel = (el.closest && el.closest('.confiFormsFormBorder')) || el;
        if (!panel || seen.indexOf(panel) !== -1) return;
        seen.push(panel);
        candidates.push(panel);
    }

    var nodes = document.querySelectorAll(
        '.confiFormsFormBorder,' +
        'div[id^="i_confiform_registration_panel_"],' +
        '[id*="confiform_registration_panel"],' +
        'form.aui-confiforms,' +
        'form[id^="i_confiform_registration_form_"],' +
        'form[id*="confiform_registration_form"]'
    );

    for (var i = 0; i < nodes.length; i++) add(nodes[i]);

    function hasField(panel, fieldName) {
        if (!panel || !fieldName) return false;
        try {
            if (panel.querySelector(
                '[name="' + fieldName + '"],' +
                '[id="' + fieldName + '"],' +
                '[data-field-name="' + fieldName + '"],' +
                '[data-fieldname="' + fieldName + '"]'
            )) return true;
        } catch (ignoreExact) {}

        try {
            var raw = String(panel.outerHTML || '').toLowerCase();
            return raw.indexOf(String(fieldName).toLowerCase()) !== -1;
        } catch (ignoreRaw) {
            return false;
        }
    }

    var best = null;
    var bestScore = -9999;

    for (var c = 0; c < candidates.length; c++) {
        var panel = candidates[c];
        var score = 0;
        var rejected = false;

        for (var f = 0; f < forbiddenFields.length; f++) {
            if (hasField(panel, forbiddenFields[f])) {
                rejected = true;
                break;
            }
        }
        if (rejected) continue;

        for (var r = 0; r < requiredFields.length; r++) {
            if (hasField(panel, requiredFields[r])) score += 100;
        }

        if (score > bestScore) {
            bestScore = score;
            best = panel;
        }
    }

    return (best && bestScore >= requiredFields.length * 100) ? best : null;
}

function mqFlowExactPanelByFormNameV61(formName) {
    if (!formName) return null;

    var wanted = String(formName).trim().toLowerCase();

    function exactValue(el) {
        if (!el) return false;

        var vals = [
            el.value,
            el.getAttribute && el.getAttribute("value"),
            el.getAttribute && el.getAttribute("data-form-name"),
            el.getAttribute && el.getAttribute("data-formname"),
            el.getAttribute && el.getAttribute("formname"),
            el.getAttribute && el.getAttribute("data-form")
        ];

        for (var i = 0; i < vals.length; i++) {
            if (vals[i] == null) continue;
            if (String(vals[i]).trim().toLowerCase() === wanted) return true;
        }
        return false;
    }

    function panelOf(el) {
        if (!el) return null;
        return (
            (el.closest && el.closest('.confiFormsFormBorder')) ||
            (el.closest && el.closest('[id^="i_confiform_registration_panel_"]')) ||
            (el.closest && el.closest('form.aui-confiforms')) ||
            (el.closest && el.closest('form')) ||
            el.parentElement ||
            null
        );
    }

    /* 1) Exact hidden/meta marker. No positional fallback. */
    var markers = document.querySelectorAll(
        'input#confiform_form_name,' +
        'input[name="confiform_form_name"],' +
        'input[name="registrationFormName"],' +
        'input[name="formName"],' +
        'input[id*="confiform_form_name"],' +
        '[data-form-name],[data-formname],[formname]'
    );

    for (var m = 0; m < markers.length; m++) {
        if (!exactValue(markers[m])) continue;
        var p = panelOf(markers[m]);
        if (p && (p.querySelector('form') || String(p.tagName || '').toLowerCase() === 'form')) return p;
    }

    /* 2) Exact ConfiForms wrapper class cf_<formName>. */
    var borders = document.querySelectorAll('.confiFormsFormBorder');
    var exactClass = ('cf_' + wanted).toLowerCase();

    for (var b = 0; b < borders.length; b++) {
        var classes = String(borders[b].className || '').toLowerCase().split(/\s+/);
        if (classes.indexOf(exactClass) !== -1) return borders[b];
    }

    /* 3) Registration forms whose own markup contains an exact form marker. */
    var forms = document.querySelectorAll(
        'form.aui-confiforms,' +
        'form[id^="i_confiform_registration_form_"],' +
        'form[id*="confiform_registration_form"]'
    );

    for (var f = 0; f < forms.length; f++) {
        var inner = forms[f].querySelectorAll(
            'input,[data-form-name],[data-formname],[formname]'
        );
        for (var x = 0; x < inner.length; x++) {
            if (exactValue(inner[x])) return panelOf(forms[f]);
        }
    }

    return null;
}

function mqFlowGetPanelV50(key) {
    var cfg = MQ_FLOW_CFG_V50[key];
    if (!cfg) return null;

    /*
     * V61: First resolve by the exact ConfiForms formName.
     * This prevents mediqNewAsset from ever being used as the Model step.
     */
    var exact = mqFlowExactPanelByFormNameV61(cfg.formName);
    if (exact) return exact;

    /* Field signatures are only a fallback for AJAX states where the marker is late. */
    if (key === "classification") {
        return mqFlowStrictPanelByFieldsV60(
            ["classificationName", "classificationParent"],
            ["equipmentTitleName", "deviceTitle", "deviceModel", "deviceId"]
        );
    }

    if (key === "equipmentTitle") {
        return mqFlowStrictPanelByFieldsV60(
            ["equipmentTitleName", "equipmentTitleGroup"],
            ["modelName", "deviceModel", "deviceId", "deviceName"]
        );
    }

    if (key === "model") {
        return mqFlowStrictPanelByFieldsV60(
            ["modelName", "deviceTitle", "manufacturer"],
            ["deviceModel", "deviceId", "deviceName", "assetNumber"]
        );
    }

    if (key === "asset") {
        return mqFlowStrictPanelByFieldsV60(
            ["deviceModel", "deviceId", "deviceName"],
            ["equipmentTitleName", "modelName", "manufacturer"]
        );
    }

    return null;
}

function mqFlowEnsurePanelV50(key, onReady) {
    var cfg = MQ_FLOW_CFG_V50[key];
    if (!cfg) return;

    var panel = mqFlowGetPanelV50(key);
    if (panel) {
        onReady(panel);
        return;
    }

    var control = mqFindRegistrationControl(cfg.formName, cfg.buttonText);
    if (!control) {
        showToast("Registration Control فرم «" + cfg.formName + "» روی صفحه پیدا نشد.");
        return;
    }

    if (!mqClickRegistrationControl(control, cfg.buttonText)) {
        showToast("Registration Control فرم «" + cfg.formName + "» اجرا نشد.");
        return;
    }

    mqWaitForConfiFormsPanel(
        function () { return mqFlowGetPanelV50(key); },
        function (readyPanel) { onReady(readyPanel); },
        function () {
            showToast("ConfiForms فرم «" + cfg.formName + "» را ایجاد نکرد.");
        }
    );
}

function mqFlowGetFormV50(panel) {
    if (!panel) return null;
    return panel.querySelector("form.aui-confiforms") || panel.querySelector("form");
}

function mqFlowRemoveUiV50(panel) {
    if (!panel) return;

    panel.removeAttribute("data-mq-selector-field");

    var generated = panel.querySelectorAll(
        ".mq-flow-head-v50, .mq-flow-footer-v50, .mq-flow-create-actions-v50"
    );
    for (var i = 0; i < generated.length; i++) {
        generated[i].parentNode && generated[i].parentNode.removeChild(generated[i]);
    }

    var rows = panel.querySelectorAll(".mq-flow-hidden-row-v50");
    for (var r = 0; r < rows.length; r++) {
        rows[r].classList.remove("mq-flow-hidden-row-v50");
    }

    panel.classList.remove("mq-flow-selector-v50");
    panel.classList.remove("mq-flow-create-v50");
    panel.classList.remove("mq-flow-asset-v50");
    panel.classList.remove("mq-flow-active-panel-v50");
}

function mqFlowDeactivateCurrentV50() {
    if (!mqFlowStateV50.activePanel) return;

    mqCloseSelect2Dropdowns(mqFlowStateV50.activePanel);
    mqFlowStateV50.activePanel.classList.remove("mq-flow-active-panel-v50");
    mqFlowStateV50.activePanel = null;
}

function mqFlowActivateV50(panel) {
    if (!panel) return;

    mqFlowDeactivateCurrentV50();

    panel.classList.add("mq-flow-active-panel-v50");
    panel.style.display = "block";
    panel.style.opacity = "1";
    panel.style.visibility = "visible";
    panel.style.pointerEvents = "auto";

    mqFlowStateV50.activePanel = panel;
}

function mqFlowStepTitleV50(step) {
    return [
        "",
        "گروه",
        "عنوان دستگاه",
        "مدل",
        "دستگاه"
    ][step] || "دستگاه";
}

function mqFlowBuildHeadV50(panel, step, title, subtitle) {
    if (!panel) return;

    var old = panel.querySelector(".mq-flow-head-v50");
    if (old) old.parentNode.removeChild(old);

    var head = document.createElement("div");
    head.className = "mq-flow-head-v50";

    var steps = "";
    var labels = ["گروه", "عنوان دستگاه", "مدل", "دستگاه"];

    for (var i = 1; i <= 4; i++) {
        var cls = "mq-flow-step-v50";
        if (i < step) cls += " done";
        if (i === step) cls += " active";

        steps +=
            '<div class="' + cls + '">' +
                '<span class="mq-flow-step-num-v50">' + i + '</span>' +
                '<span>' + labels[i - 1] + '</span>' +
            '</div>';
    }

    head.innerHTML =
        '<div class="mq-flow-head-top-v50">' +
            '<div>' +
                '<div class="mq-flow-title-v50">' + title + '</div>' +
                '<div class="mq-flow-subtitle-v50">' + (subtitle || "") + '</div>' +
            '</div>' +
            '<button type="button" class="mq-flow-close-v50" aria-label="بستن">×</button>' +
        '</div>' +
        '<div class="mq-flow-steps-v50">' + steps + '</div>';

    panel.insertBefore(head, panel.firstChild);

    var close = head.querySelector(".mq-flow-close-v50");
    if (close) {
        close.onclick = function (e) {
            e.preventDefault();
            e.stopPropagation();
            mqCloseRegistrationFlowV50(true);
        };
    }
}

function mqFlowFindFieldV50(panel, fieldName) {
    var form = mqFlowGetFormV50(panel);
    if (!form) return null;

    return mqFindNamedField(form, fieldName) ||
           mqFindModelFieldV46(form, fieldName, MQ_FORM_LABELS[fieldName] || "");
}

function mqFlowFieldRowV50(panel, fieldName) {
    var form = mqFlowGetFormV50(panel);
    if (!form) return null;

    var field = mqFlowFindFieldV50(panel, fieldName);
    if (!field) return null;

    return (
        (field.closest && field.closest("tr")) ||
        (field.closest && field.closest(".field-group")) ||
        (field.closest && field.closest(".control-group")) ||
        field.parentElement
    );
}

function mqFlowSetLabelV50(panel, fieldName, text) {
    var form = mqFlowGetFormV50(panel);
    var field = mqFlowFindFieldV50(panel, fieldName);
    if (!form || !field) return;

    var id = field.getAttribute && field.getAttribute("id");
    var label = id ? form.querySelector('label[for="' + id + '"]') : null;
    var row = mqFlowFieldRowV50(panel, fieldName);

    if (!label && row) label = row.querySelector("label");
    if (!label) return;

    var required = label.querySelector(".aui-iconfont-required, .required, .cf_required");

    if (required) {
        label.innerHTML = "";
        label.appendChild(document.createTextNode(text + " "));
        label.appendChild(required);
    }
    else {
        label.textContent = text;
    }
}

/* ============================================================
   V61 - SHOW EXACT FIELDS FOR CREATE PANELS
   ============================================================ */
function mqFlowShowOnlyFieldsV60(panel, fieldNames) {
    if (!panel || !fieldNames || !fieldNames.length) return;

    var form = mqFlowGetFormV50(panel);
    if (!form) return;

    var targets = [];

    for (var i = 0; i < fieldNames.length; i++) {
        var field = mqFlowFindFieldV50(panel, fieldNames[i]);
        if (!field) continue;

        var row = mqFlowFieldRowV50(panel, fieldNames[i]);
        targets.push({ field: field, row: row });
    }

    if (!targets.length) return;

    var rows = form.querySelectorAll('tr, .field-group, .control-group');

    for (var r = 0; r < rows.length; r++) {
        var row = rows[r];
        var keep = false;

        for (var t = 0; t < targets.length; t++) {
            var targetRow = targets[t].row;
            var targetField = targets[t].field;

            if (
                row === targetRow ||
                (targetRow && row.contains(targetRow)) ||
                (targetRow && targetRow.contains(row)) ||
                row.contains(targetField)
            ) {
                keep = true;
                break;
            }
        }

        if (keep) row.classList.remove('mq-flow-hidden-row-v50');
        else row.classList.add('mq-flow-hidden-row-v50');
    }

    for (var x = 0; x < targets.length; x++) {
        var tr = targets[x].row;
        if (tr && tr.style) {
            tr.classList.remove('mq-flow-hidden-row-v50');
            tr.style.removeProperty('display');
            tr.style.setProperty('visibility', 'visible', 'important');
            tr.style.setProperty('opacity', '1', 'important');
        }
    }
}

function mqFlowSetPlaceholderV60(panel, fieldName, placeholder) {
    var field = mqFlowFindFieldV50(panel, fieldName);
    if (!field || !field.setAttribute) return;
    if (String(field.tagName || '').toLowerCase() === 'input' || String(field.tagName || '').toLowerCase() === 'textarea') {
        field.setAttribute('placeholder', placeholder || '');
    }
}

function mqFlowHideAllRowsExceptV50(panel, fieldName) {
    if (!panel || !fieldName) return;

    var form = mqFlowGetFormV50(panel);
    if (!form) return;

    /*
     * V59:
     * Keep the current selector field name on the panel so the same
     * layout can be restored after ConfiForms/Select2 redraws.
     */
    panel.setAttribute("data-mq-selector-field", fieldName);

    var field = mqFlowFindFieldV50(panel, fieldName);
    var target = mqFlowFieldRowV50(panel, fieldName);

    /*
     * Never blank the modal when a ConfiForms field is temporarily
     * unavailable during an AJAX redraw. In that case leave the rows
     * visible and let the delayed repair below try again.
     */
    if (!field || !target) {
        var existingHidden = form.querySelectorAll(".mq-flow-hidden-row-v50");
        for (var eh = 0; eh < existingHidden.length; eh++) {
            existingHidden[eh].classList.remove("mq-flow-hidden-row-v50");
        }
        return;
    }

    var rows = form.querySelectorAll("tr, .field-group, .control-group");

    for (var i = 0; i < rows.length; i++) {
        var row = rows[i];

        /*
         * Keep the target row AND any structural wrapper which contains
         * the target. This is important for the Model/Asset forms, where
         * ConfiForms can wrap fields differently after enhancement.
         */
        var keep =
            row === target ||
            row.contains(target) ||
            target.contains(row) ||
            row.contains(field);

        if (keep) {
            row.classList.remove("mq-flow-hidden-row-v50");
        }
        else {
            row.classList.add("mq-flow-hidden-row-v50");
        }
    }

    /*
     * Clear stale hiding on the selected row and its wrappers.
     * Do NOT force the real Select2 source input visible; only its visual
     * Select2 container is shown.
     */
    var node = target;
    while (node && node !== form) {
        if (node.classList) {
            node.classList.remove("mq-flow-hidden-row-v50");
        }

        if (node.style) {
            node.style.removeProperty("display");
            node.style.setProperty("visibility", "visible", "important");
            node.style.setProperty("opacity", "1", "important");
        }

        node = node.parentElement;
    }

    var visual = mqReferenceVisualV46(form, field);

    if (visual && visual.style) {
        visual.style.setProperty("display", "block", "important");
        visual.style.setProperty("visibility", "visible", "important");
        visual.style.setProperty("opacity", "1", "important");
        visual.style.setProperty("pointer-events", "auto", "important");
        visual.style.setProperty("width", "100%", "important");
        visual.style.setProperty("max-width", "100%", "important");
        visual.style.setProperty("min-width", "0", "important");
    }

    /*
     * The body/table itself must never stay collapsed after a previous
     * modal mode or ConfiForms redraw.
     */
    var shells = [
        form,
        panel.querySelector(".confiFormsFormContent"),
        panel.querySelector(".table-wrap"),
        target.closest && target.closest("table"),
        target.closest && target.closest("tbody")
    ];

    for (var s = 0; s < shells.length; s++) {
        var shell = shells[s];
        if (!shell || !shell.style) continue;

        shell.style.setProperty("visibility", "visible", "important");
        shell.style.setProperty("opacity", "1", "important");
        shell.style.removeProperty("display");
        shell.style.removeProperty("height");
        shell.style.removeProperty("max-height");
    }
}


/* ============================================================
   V62 - SELECT2 VISUAL NORMALIZER
   ------------------------------------------------------------
   - Keeps the internal Select2 v3 focus helper invisible
   - Restores the chosen text after ConfiForms redraws the control
   - Never changes the stored Assets value
   ============================================================ */

function mqV62StateLabel(fieldName) {
    if (fieldName === "equipmentTitleGroup") {
        return mqV57.selected.groupLabel || "";
    }

    if (fieldName === "deviceTitle") {
        return mqV57.selected.titleLabel || "";
    }

    if (fieldName === "deviceModel") {
        return mqV57.selected.modelLabel || "";
    }

    return "";
}

function mqV62RestoreSelectedVisual(panel, fieldName, knownField) {
    if (!panel || !fieldName) return;

    var form = mqFlowGetFormV50(panel);
    if (!form) return;

    var field = knownField || mqFlowFindFieldV50(panel, fieldName);
    if (!field) return;

    var inst = mqV57Instance(field);
    var visual = mqV57Visual(field, inst) || mqReferenceVisualV46(form, field);
    if (!visual) return;

    /*
     * Internal Select2 v3 helpers are accessibility/focus controls, not
     * visible form fields. Hide them so the Wizard's generic input styles
     * can never turn them into a white box.
     */
    var helpers = visual.querySelectorAll(
        "input.select2-focusser," +
        "input.select2-offscreen," +
        "input.select2-hidden-accessible," +
        ":scope > input.select2-input"
    );

    for (var i = 0; i < helpers.length; i++) {
        var helper = helpers[i];

        helper.style.setProperty("display", "none", "important");
        helper.style.setProperty("visibility", "hidden", "important");
        helper.style.setProperty("opacity", "0", "important");
        helper.style.setProperty("pointer-events", "none", "important");
        helper.style.setProperty("position", "absolute", "important");
        helper.style.setProperty("left", "-10000px", "important");
        helper.style.setProperty("top", "0", "important");
        helper.style.setProperty("width", "1px", "important");
        helper.style.setProperty("height", "1px", "important");
        helper.style.setProperty("min-width", "1px", "important");
        helper.style.setProperty("min-height", "1px", "important");
        helper.style.setProperty("border", "0", "important");
        helper.style.setProperty("padding", "0", "important");
        helper.style.setProperty("margin", "0", "important");
    }

    var choice = visual.querySelector(
        ".select2-choice,.select2-selection,.aui-select2-choice"
    );

    if (choice && choice.style) {
        choice.style.setProperty("display", "block", "important");
        choice.style.setProperty("visibility", "visible", "important");
        choice.style.setProperty("opacity", "1", "important");
        choice.style.setProperty("width", "100%", "important");
        choice.style.setProperty("min-width", "0", "important");
        choice.style.setProperty("max-width", "100%", "important");
    }

    var chosen = visual.querySelector(
        ".select2-chosen,.select2-selection__rendered"
    );

    if (!chosen) return;

    var data = mqV57GetData(field);
    var current = String(chosen.textContent || "").trim();
    var fallback = mqV62StateLabel(fieldName) || current;

    var visibleText = fallback;

    if (data) {
        if (mqV57IsClassificationField(fieldName)) {
            visibleText = mqV57PersianDisplay(data, fallback, field) || fallback;
        }
        else {
            var identity = mqV57Identity(data, field);
            visibleText =
                identity.label ||
                data.text ||
                data.name ||
                fallback;
        }
    }

    if (visibleText) {
        chosen.textContent = String(visibleText).trim();
    }

    chosen.style.setProperty("display", "block", "important");
    chosen.style.setProperty("visibility", "visible", "important");
    chosen.style.setProperty("opacity", "1", "important");
    chosen.style.setProperty("width", "100%", "important");
    chosen.style.setProperty("min-width", "0", "important");
    chosen.style.setProperty("max-width", "100%", "important");
    chosen.style.setProperty("overflow", "hidden", "important");
    chosen.style.setProperty("text-overflow", "ellipsis", "important");
    chosen.style.setProperty("white-space", "nowrap", "important");
}

/* ============================================================
   V62 - KEEP CURRENT SELECTOR FIELD VISIBLE AFTER SELECTION
   ConfiForms/legacy Select2 may redraw the row when a value is chosen.
   Re-resolve the live field and restore only the current selector row.
   ============================================================ */
function mqFlowRepairSelectorV61(panel, fieldName, labelText) {
    if (!panel || !fieldName) return;
    if (!mqFlowStateV50.open || mqFlowStateV50.mode !== "selector") return;
    if (mqFlowStateV50.activePanel !== panel) return;

    var form = mqFlowGetFormV50(panel);
    if (!form) return;

    /* Re-resolve the LIVE control after any ConfiForms redraw. */
    var field = mqFlowFindFieldV50(panel, fieldName);
    var row = field ? mqFlowFieldRowV50(panel, fieldName) : null;

    if (!field || !row) {
        /* Do not leave the modal blank while the AJAX replacement is in flight. */
        var hidden = form.querySelectorAll('.mq-flow-hidden-row-v50');
        for (var h = 0; h < hidden.length; h++) {
            hidden[h].classList.remove('mq-flow-hidden-row-v50');
        }
        return;
    }

    panel.setAttribute('data-mq-selector-field', fieldName);

    /* Hide only non-target field rows; keep structural wrappers containing the target. */
    var rows = form.querySelectorAll('tr, .field-group, .control-group');
    for (var i = 0; i < rows.length; i++) {
        var candidate = rows[i];
        var keep =
            candidate === row ||
            candidate.contains(row) ||
            row.contains(candidate) ||
            candidate.contains(field);

        if (keep) candidate.classList.remove('mq-flow-hidden-row-v50');
        else candidate.classList.add('mq-flow-hidden-row-v50');
    }

    /* The row and all wrappers up to the form must stay visible. */
    var node = row;
    while (node && node !== form) {
        if (node.classList) node.classList.remove('mq-flow-hidden-row-v50');
        if (node.style) {
            node.style.removeProperty('display');
            node.style.setProperty('visibility', 'visible', 'important');
            node.style.setProperty('opacity', '1', 'important');
            node.style.setProperty('pointer-events', 'auto', 'important');
            node.style.setProperty('max-width', '100%', 'important');
        }
        node = node.parentElement;
    }

    var visual = mqReferenceVisualV46(form, field);
    if (visual && visual.style) {
        visual.style.setProperty('display', 'block', 'important');
        visual.style.setProperty('visibility', 'visible', 'important');
        visual.style.setProperty('opacity', '1', 'important');
        visual.style.setProperty('pointer-events', 'auto', 'important');
        visual.style.setProperty('position', 'relative', 'important');
        visual.style.setProperty('left', 'auto', 'important');
        visual.style.setProperty('right', 'auto', 'important');
        visual.style.setProperty('top', 'auto', 'important');
        visual.style.setProperty('transform', 'none', 'important');
        visual.style.setProperty('width', '100%', 'important');
        visual.style.setProperty('min-width', '0', 'important');
        visual.style.setProperty('max-width', '100%', 'important');
    }

    if (labelText) mqFlowSetLabelV50(panel, fieldName, labelText);

    /*
     * V62: normalize the live Select2 visual after every ConfiForms redraw.
     * This keeps the selected value visible and hides the v3 focus helper.
     */
    try {
        mqV62RestoreSelectedVisual(panel, fieldName, field);
    } catch (ignoreSelectedTextV61) {}
}

function mqFlowScheduleSelectorRepairV61(panel, fieldName, labelText) {
    [0, 40, 100, 180, 320, 600, 1000].forEach(function (delay) {
        window.setTimeout(function () {
            if (!mqFlowStateV50.open || mqFlowStateV50.mode !== 'selector') return;
            if (mqFlowStateV50.activePanel !== panel) return;
            mqFlowRepairSelectorV61(panel, fieldName, labelText);
            try { mqV57SyncActivePanel(); } catch (ignoreSyncV61) {}
        }, delay);
    });
}

function mqFlowShowAllRowsV50(panel) {
    if (!panel) return;

    panel.removeAttribute("data-mq-selector-field");

    var rows = panel.querySelectorAll(".mq-flow-hidden-row-v50");
    for (var i = 0; i < rows.length; i++) {
        rows[i].classList.remove("mq-flow-hidden-row-v50");
    }
}

function mqFlowSelectedTextV50(panel, fieldName) {
    var field = mqFlowFindFieldV50(panel, fieldName);
    if (!field) return "";

    var row = mqFlowFieldRowV50(panel, fieldName);
    if (row) {
        var rendered = row.querySelector(
            ".select2-chosen, .select2-selection__rendered, .aui-select2-choice .select2-chosen"
        );
        if (rendered) {
            var txt = mqNormalizeTextV46(rendered.textContent || "")
                .replace(/^×\s*/, "")
                .trim();

            if (
                txt &&
                txt !== "انتخاب کنید" &&
                txt !== "Select" &&
                txt !== "Choose"
            ) {
                return txt;
            }
        }
    }

    return mqNormalizeTextV46(field.value || "");
}

function mqFlowHasSelectionV50(panel, fieldName) {
    var field = mqFlowFindFieldV50(panel, fieldName);
    if (!field) return false;

    var value = mqNormalizeTextV46(field.value || "");
    if (value) return true;

    return !!mqFlowSelectedTextV50(panel, fieldName);
}

function mqFlowClearExceptV50(panel, keepNames) {
    var form = mqFlowGetFormV50(panel);
    if (!form) return;

    var keep = {};
    (keepNames || []).forEach(function (n) { keep[n] = true; });

    var controls = form.querySelectorAll("input[name], textarea[name], select[name]");

    for (var i = 0; i < controls.length; i++) {
        var c = controls[i];
        var name = c.name || "";

        if (!name || keep[name] || c.type === "hidden" || c.type === "submit" || c.type === "button") {
            continue;
        }

        if (c.type === "checkbox" || c.type === "radio") {
            c.checked = false;
        }
        else {
            c.value = "";
        }

        try {
            if (window.AJS && AJS.$) {
                var $c = AJS.$(c);
                if ($c.data("select2") || $c.hasClass("select2-offscreen") || $c.hasClass("select2-hidden-accessible")) {
                    try { $c.select2("val", ""); } catch (ignoreS2v) {}
                    try { $c.trigger("change"); } catch (ignoreS2c) {}
                }
            }
        }
        catch (ignore) {}
    }
}

function mqFlowRefreshReferenceV50(panel, fieldName) {
    var field = mqFlowFindFieldV50(panel, fieldName);
    if (!field) return;

    try {
        var jq = (window.AJS && AJS.$) ? AJS.$ : (window.jQuery || null);
        if (!jq) return;

        var $field = jq(field);
        try { $field.select2("close"); } catch (ignore1) {}
        try { $field.trigger("change"); } catch (ignore2) {}
    }
    catch (ignore) {}
}

function mqFlowBuildSelectorFooterV50(panel, opts) {
    var old = panel.querySelector(".mq-flow-footer-v50");
    if (old) old.parentNode.removeChild(old);

    var footer = document.createElement("div");
    footer.className = "mq-flow-footer-v50";

    footer.innerHTML =
        '<div class="mq-flow-footer-right-v50">' +
            '<button type="button" class="mq-flow-plus-v50">+ ثبت ' + opts.plusLabel + ' جدید</button>' +
        '</div>' +
        '<div class="mq-flow-footer-left-v50">' +
            (opts.backStep
                ? '<button type="button" class="mq-flow-secondary-v50 mq-flow-back-v50">مرحله قبل</button>'
                : '') +
            '<button type="button" class="mq-flow-primary-v50 mq-flow-next-v50">مرحله بعد</button>' +
        '</div>';

    panel.appendChild(footer);

    var plus = footer.querySelector(".mq-flow-plus-v50");
    var next = footer.querySelector(".mq-flow-next-v50");
    var back = footer.querySelector(".mq-flow-back-v50");

    if (plus) plus.onclick = opts.onPlus;
    if (next) next.onclick = opts.onNext;
    if (back) back.onclick = function () { mqFlowShowSelectorStepV50(opts.backStep); };
}

function mqFlowBuildCreateBackV50(panel, stepBack) {
    var old = panel.querySelector(".mq-flow-create-actions-v50");
    if (old) old.parentNode.removeChild(old);

    var bar = document.createElement("div");
    bar.className = "mq-flow-create-actions-v50";
    bar.innerHTML =
        '<button type="button" class="mq-flow-secondary-v50">بازگشت بدون ثبت</button>';

    panel.appendChild(bar);

    var btn = bar.querySelector("button");
    if (btn) btn.onclick = function () { mqFlowShowSelectorStepV50(stepBack); };
}

function mqFlowPrepareSelectorPanelV50(panel, step, fieldName, title, subtitle, labelText, plusLabel, createKey, nextStep, backStep) {
    mqFlowRemoveUiV50(panel);
    mqFlowActivateV50(panel);

    panel.classList.add("mq-flow-selector-v50");

    mqFlowBuildHeadV50(panel, step, title, subtitle);
    mqFlowHideAllRowsExceptV50(panel, fieldName);
    mqFlowSetLabelV50(panel, fieldName, labelText);

    /*
     * ConfiForms may rebuild Select2/reference markup shortly after a step
     * becomes active. Re-apply the selector layout a few times so Step 2
     * (deviceTitle) and Step 3 (deviceModel) can never become an empty modal.
     */
    mqFlowScheduleSelectorRepairV61(panel, fieldName, labelText);

    mqFlowBuildSelectorFooterV50(panel, {
        plusLabel: plusLabel,
        backStep: backStep,
        onPlus: function () {
            mqFlowShowCreateV50(createKey, step);
        },
        onNext: function () {
            var field = mqFlowFindFieldV50(panel, fieldName);
            if (!mqFlowHasSelectionV50(panel, fieldName)) {
                showToast("ابتدا «" + labelText + "» را انتخاب کنید.");
                return;
            }

            /* Keep the selected object in the unified wizard state. */
            try { mqV57RememberSelection(fieldName, field); } catch (ignoreRememberV57) {}

            mqFlowShowSelectorStepV50(nextStep);
        }
    });

    var field = mqFlowFindFieldV50(panel, fieldName);
    if (field) {
        window.setTimeout(function () {
            mqCloseSelect2Dropdowns(document);

            var form = mqFlowGetFormV50(panel);
            var visual = mqReferenceVisualV46(form, field);

            if (visual && visual.style) {
                visual.style.setProperty('display', 'block', 'important');
                visual.style.setProperty('visibility', 'visible', 'important');
                visual.style.setProperty('opacity', '1', 'important');
                visual.style.setProperty('width', '100%', 'important');
                visual.style.setProperty('max-width', '100%', 'important');
                visual.style.setProperty('min-width', '0', 'important');
            }

            var row = mqFlowFieldRowV50(panel, fieldName);
            if (row && row.style) {
                row.style.setProperty('display', '', 'important');
                row.style.setProperty('visibility', 'visible', 'important');
                row.style.setProperty('opacity', '1', 'important');
                row.style.setProperty('width', '100%', 'important');
                row.style.setProperty('max-width', '100%', 'important');
            }

            /* Rebind/repair only through the single V57 handler. */
            try { mqV57SyncActivePanel(); } catch (ignoreSyncV57) {}
            mqFlowScheduleSelectorRepairV61(panel, fieldName, labelText);
        }, 90);
    }
}

function mqFlowShowSelectorStepV50(step) {
    if (!mqFlowStateV50.open) return;

    mqFlowStateV50.step = step;
    mqFlowStateV50.mode = "selector";

    if (step === 1) {
        mqFlowEnsurePanelV50("equipmentTitle", function (panel) {
            if (!mqFlowStateV50.initialized.equipmentTitle) {
                mqResetConfiFormV48(panel);
                mqFlowStateV50.initialized.equipmentTitle = true;
            }

            mqFlowPrepareSelectorPanelV50(
                panel,
                1,
                "equipmentTitleGroup",
                "انتخاب گروه",
                "گروه را انتخاب کنید؛ سپس برای ادامه دکمه «مرحله بعد» را بزنید. اگر گروه وجود ندارد، از دکمه + آن را ثبت کنید.",
                "گروه",
                "گروه",
                "classification",
                2,
                0
            );
        });
        return;
    }

    if (step === 2) {
        mqFlowEnsurePanelV50("model", function (panel) {
            if (!mqFlowStateV50.initialized.model) {
                mqResetConfiFormV48(panel);
                mqFlowStateV50.initialized.model = true;
            }

            mqFlowPrepareSelectorPanelV50(
                panel,
                2,
                "deviceTitle",
                "انتخاب عنوان دستگاه",
                "فقط عنوان‌های مرتبط با گروه انتخاب‌شده نمایش داده می‌شوند. عنوان دستگاه را انتخاب کنید و سپس «مرحله بعد» را بزنید.",
                "عنوان دستگاه",
                "عنوان دستگاه",
                "equipmentTitle",
                3,
                1
            );
        });
        return;
    }

    if (step === 3) {
        mqFlowEnsurePanelV50("asset", function (panel) {
            if (!mqFlowStateV50.initialized.asset) {
                mqResetConfiFormV48(panel);
                mqFlowStateV50.initialized.asset = true;
            }

            mqFlowPrepareSelectorPanelV50(
                panel,
                3,
                "deviceModel",
                "انتخاب مدل",
                "فقط مدل‌های مرتبط با عنوان دستگاه انتخاب‌شده نمایش داده می‌شوند. مدل را انتخاب کنید و سپس «مرحله بعد» را بزنید.",
                "مدل",
                "مدل",
                "model",
                4,
                2
            );
        });
        return;
    }

    if (step === 4) {
        mqFlowShowAssetCreateV50();
    }
}

function mqFlowShowCreateV50(key, returnStep) {
    if (!mqFlowStateV50.open) return;

    mqFlowStateV50.mode = "create-" + key;

    mqFlowEnsurePanelV50(key, function (panel) {
        mqFlowRemoveUiV50(panel);
        mqFlowActivateV50(panel);
        panel.classList.add("mq-flow-create-v50");

        if (key === "classification") {
            mqResetConfiFormV48(panel);

            mqFlowBuildHeadV50(
                panel,
                1,
                "ثبت گروه جدید",
                "نام گروه و در صورت نیاز گروه والد را وارد و ثبت کنید. بعد از ثبت، گروه جدید انتخاب می‌شود؛ برای ادامه خودتان «مرحله بعد» را بزنید."
            );

            mqFlowShowAllRowsV50(panel);
            mqFlowShowOnlyFieldsV60(panel, ["classificationName", "classificationParent"]);
            mqFlowSetLabelV50(panel, "classificationName", "نام گروه");
            mqFlowSetLabelV50(panel, "classificationParent", "گروه والد");
            mqFlowSetPlaceholderV60(panel, "classificationName", "نام گروه را وارد کنید");
        }

        else if (key === "equipmentTitle") {
            /*
             * Object Type 755 = Equipment Title
             * 6665 = Name   -> عنوان دستگاه
             * 6668 = Group  -> گروه
             * گروه انتخاب‌شده از مرحله قبل حفظ می‌شود.
             */
            mqFlowClearExceptV50(panel, ["equipmentTitleGroup"]);

            mqFlowBuildHeadV50(
                panel,
                2,
                "ثبت عنوان دستگاه جدید",
                "این فرم فقط شامل «عنوان دستگاه» و «گروه» است. بعد از ثبت، عنوان جدید انتخاب می‌شود؛ برای ادامه خودتان «مرحله بعد» را بزنید."
            );

            mqFlowShowAllRowsV50(panel);
            mqFlowShowOnlyFieldsV60(panel, ["equipmentTitleName", "equipmentTitleGroup"]);
            mqFlowSetLabelV50(panel, "equipmentTitleName", "عنوان دستگاه");
            mqFlowSetLabelV50(panel, "equipmentTitleGroup", "گروه");
            mqFlowSetPlaceholderV60(panel, "equipmentTitleName", "عنوان دستگاه را وارد کنید");
        }

        else if (key === "model") {
            /* Keep the selected Equipment Title in deviceTitle. */
            mqFlowClearExceptV50(panel, ["deviceTitle"]);
            try { mqEnhanceLiveModelPanel(panel); } catch (ignoreEnhanceModelV50) {}

            mqFlowBuildHeadV50(
                panel,
                3,
                "ثبت مدل جدید",
                "عنوان دستگاه انتخاب‌شده حفظ می‌شود. سری دستگاه، سازنده و سایر مشخصات مدل را تکمیل کنید. عنوان مدل به‌صورت خودکار ساخته می‌شود؛ بعد از ثبت برای ادامه خودتان «مرحله بعد» را بزنید."
            );

            mqFlowShowAllRowsV50(panel);

            /*
             * Models Object Type 752
             * 6624 عنوان مدل: generated by endpoint (not manually entered)
             * 6625 سری دستگاه: modelName
             * 6626 عنوان دستگاه: deviceTitle
             * 6627 شرکت سازنده: manufacturer
             * 6628 ماهیت دستگاه: nature
             * 6629 Type: modelType
             * 6630 Group: modelGroup
             * 6631 اطلاعات فنی: managed by page/integration flow
             * 6632 Criticality, 6633 Technology, 6634-6636 consumptions, 6637 function
             */
            mqFlowShowOnlyFieldsV60(panel, [
                "modelName",
                "deviceTitle",
                "manufacturer",
                "nature",
                "modelType",
                "modelGroup",
                "modelFunction",
                "criticality",
                "technology",
                "powerRequirement",
                "waterRequirement",
                "gasRequirement"
            ]);

            mqFlowSetLabelV50(panel, "modelName", "سری دستگاه");
            mqFlowSetLabelV50(panel, "deviceTitle", "عنوان دستگاه");
            mqFlowSetLabelV50(panel, "manufacturer", "شرکت سازنده");
            mqFlowSetLabelV50(panel, "nature", "ماهیت دستگاه");
            mqFlowSetLabelV50(panel, "modelType", "نوع");
            mqFlowSetLabelV50(panel, "modelGroup", "گروه");
            mqFlowSetLabelV50(panel, "modelFunction", "کارکرد");
            mqFlowSetLabelV50(panel, "criticality", "سطح اهمیت");
            mqFlowSetLabelV50(panel, "technology", "فناوری");
            mqFlowSetLabelV50(panel, "powerRequirement", "برق مصرفی");
            mqFlowSetLabelV50(panel, "waterRequirement", "آب مصرفی");
            mqFlowSetLabelV50(panel, "gasRequirement", "گاز مصرفی");
            mqFlowSetPlaceholderV60(panel, "modelName", "سری دستگاه را وارد کنید");
        }

        mqFlowBuildCreateBackV50(panel, returnStep);

        window.setTimeout(function () {
            if (key === "classification") {
                mqFlowShowOnlyFieldsV60(panel, ["classificationName", "classificationParent"]);
                mqFlowSetLabelV50(panel, "classificationName", "نام گروه");
                mqFlowSetLabelV50(panel, "classificationParent", "گروه والد");
            }
            else if (key === "equipmentTitle") {
                mqFlowShowOnlyFieldsV60(panel, ["equipmentTitleName", "equipmentTitleGroup"]);
                mqFlowSetLabelV50(panel, "equipmentTitleName", "عنوان دستگاه");
                mqFlowSetLabelV50(panel, "equipmentTitleGroup", "گروه");
            }
            else if (key === "model") {
                mqFlowShowOnlyFieldsV60(panel, [
                    "modelName","deviceTitle","manufacturer","nature",
                    "modelType","modelGroup","modelFunction","criticality",
                    "technology","powerRequirement","waterRequirement","gasRequirement"
                ]);
                mqFlowSetLabelV50(panel, "modelName", "سری دستگاه");
                mqFlowSetLabelV50(panel, "deviceTitle", "عنوان دستگاه");
                mqFlowSetLabelV50(panel, "manufacturer", "شرکت سازنده");
                mqFlowSetLabelV50(panel, "nature", "ماهیت دستگاه");
                mqFlowSetLabelV50(panel, "modelType", "نوع");
                mqFlowSetLabelV50(panel, "modelGroup", "گروه");
                mqFlowSetLabelV50(panel, "modelFunction", "کارکرد");
                mqFlowSetLabelV50(panel, "criticality", "سطح اهمیت");
                mqFlowSetLabelV50(panel, "technology", "فناوری");
                mqFlowSetLabelV50(panel, "powerRequirement", "برق مصرفی");
                mqFlowSetLabelV50(panel, "waterRequirement", "آب مصرفی");
                mqFlowSetLabelV50(panel, "gasRequirement", "گاز مصرفی");
            }

            try { mqV57SyncActivePanel(); } catch (ignoreSyncV57) {}
        }, 70);
    });
}

function mqFlowShowAssetCreateV50() {
    mqFlowEnsurePanelV50("asset", function (panel) {
        mqFlowStateV50.step = 4;
        mqFlowStateV50.mode = "asset";

        mqFlowRemoveUiV50(panel);
        mqFlowActivateV50(panel);
        panel.classList.add("mq-flow-asset-v50");

        try { mqEnhanceLiveAssetPanel(panel); } catch (ignoreEnhanceAssetV50) {}
        mqFlowShowAllRowsV50(panel);

        mqFlowBuildHeadV50(
            panel,
            4,
            "ثبت دستگاه",
            "مدل انتخاب شده است؛ اطلاعات نهایی دستگاه را تکمیل و ثبت کنید."
        );

        mqFlowBuildCreateBackV50(panel, 3);

        window.setTimeout(function () {
            try { mqV57SyncActivePanel(); } catch (ignoreSyncV57) {}
        }, 70);
    });
}

function mqEnsureRegistrationFlowBackdropV50() {
    var backdrop = document.getElementById("mqRegistrationFlowBackdropV50");
    if (backdrop) return backdrop;

    backdrop = document.createElement("div");
    backdrop.id = "mqRegistrationFlowBackdropV50";
    backdrop.setAttribute("aria-hidden", "true");
    document.body.appendChild(backdrop);

    return backdrop;
}

function openMediQRegistrationFlowV50() {
    if (mqFlowStateV50.open) return;

    mqFlowStateV50.open = true;
    mqFlowStateV50.step = 1;
    mqFlowStateV50.mode = "selector";
    mqFlowStateV50.activePanel = null;
    mqFlowStateV50.initialized = {};

    try {
        mqV57.selected.groupKey = "";
        mqV57.selected.groupId = "";
        mqV57.selected.groupLabel = "";
        mqV57.selected.titleKey = "";
        mqV57.selected.titleId = "";
        mqV57.selected.titleLabel = "";
        mqV57.selected.modelKey = "";
        mqV57.selected.modelId = "";
        mqV57.selected.modelLabel = "";
        mqV57.pending.classification = "";
        mqV57.pending.equipmentTitle = "";
        mqV57.pending.model = "";
        mqV57.lastAdvanceToken = "";
        mqV57.lastAdvanceAt = 0;
    } catch (ignoreV57Reset) {}

    try {
        window.sessionStorage.removeItem("mediqAssetDraft");
        window.sessionStorage.removeItem("mediqOpenAssetAfterReload");
    } catch (ignore) {}

    mqCloseSelect2Dropdowns(document);

    document.body.classList.add("mq-flow-open-v50");

    var backdrop = mqEnsureRegistrationFlowBackdropV50();
    backdrop.classList.add("open");
    backdrop.setAttribute("aria-hidden", "false");

    mqFlowShowSelectorStepV50(1);
}

function mqCloseRegistrationFlowV50(resetAll) {
    try { mqV57Close(); } catch (ignoreV57Close) {}
    mqCloseSelect2Dropdowns(document);

    var keys = ["classification", "equipmentTitle", "model", "asset"];

    for (var i = 0; i < keys.length; i++) {
        var panel = mqFlowGetPanelV50(keys[i]);
        if (!panel) continue;

        mqFlowRemoveUiV50(panel);

        if (resetAll) {
            try { mqResetConfiFormV48(panel); } catch (ignoreResetV50) {}
        }
    }

    mqFlowDeactivateCurrentV50();

    var backdrop = document.getElementById("mqRegistrationFlowBackdropV50");
    if (backdrop) {
        backdrop.classList.remove("open");
        backdrop.setAttribute("aria-hidden", "true");
    }

    document.body.classList.remove("mq-flow-open-v50");

    mqFlowStateV50.open = false;
    mqFlowStateV50.step = 1;
    mqFlowStateV50.mode = "selector";
    mqFlowStateV50.activePanel = null;
    mqFlowStateV50.initialized = {};
}

/* Replace the old bottom-up asset opener with the new top-down flow. */
var mqLegacyOpenAssetV50 = openMediQAssetForm;
openMediQAssetForm = function () {
    openMediQRegistrationFlowV50();
};

/* Final ConfiForms callback for the top-down flow. */
(function mqBindTopDownSubmitV50() {
    var previousSubmitV50 = window.onCFSubmitFinished;

    window.onCFSubmitFinished = function (formName) {
        if (mqFlowStateV50.open) {

            if (formName === "mediqNewClassification") {
                var groupName = mqV57.pending.classification || "";
                mqV57.pending.classification = "";

                showToast("گروه با موفقیت ثبت شد.");

                mqFlowShowSelectorStepV50(1);

                window.setTimeout(function () {
                    var p = mqFlowGetPanelV50("equipmentTitle");
                    if (!p) return;

                    mqFlowRefreshReferenceV50(p, "equipmentTitleGroup");

                    if (!groupName) {
                        showToast("گروه ثبت شد؛ آن را از لیست انتخاب کنید.");
                        return;
                    }

                    mqV57AutoSelectByText(
                        p,
                        "equipmentTitleGroup",
                        groupName,
                        function () {},
                        function () {
                            showToast("گروه ثبت شد، ولی انتخاب خودکار انجام نشد؛ آن را از لیست انتخاب کنید.");
                        }
                    );
                }, 320);

                return;
            }

            if (formName === "mediqNewEquipmentTitle") {
                var titleName = mqV57.pending.equipmentTitle || "";
                mqV57.pending.equipmentTitle = "";

                showToast("عنوان دستگاه با موفقیت ثبت شد.");

                mqFlowShowSelectorStepV50(2);

                window.setTimeout(function () {
                    var p = mqFlowGetPanelV50("model");
                    if (!p) return;

                    mqFlowRefreshReferenceV50(p, "deviceTitle");

                    if (!titleName) {
                        showToast("عنوان دستگاه ثبت شد؛ آن را از لیست انتخاب کنید.");
                        return;
                    }

                    mqV57AutoSelectByText(
                        p,
                        "deviceTitle",
                        titleName,
                        function () {},
                        function () {
                            showToast("عنوان دستگاه ثبت شد، ولی انتخاب خودکار انجام نشد؛ آن را از لیست انتخاب کنید.");
                        }
                    );
                }, 320);

                return;
            }

            if (formName === "mediqNewModel") {
                var modelName = mqV57.pending.model || "";
                mqV57.pending.model = "";

                showToast("مدل با موفقیت ثبت شد.");

                mqFlowShowSelectorStepV50(3);

                window.setTimeout(function () {
                    var p = mqFlowGetPanelV50("asset");
                    if (!p) return;

                    mqFlowRefreshReferenceV50(p, "deviceModel");

                    if (!modelName) {
                        showToast("مدل ثبت شد؛ آن را از لیست انتخاب کنید.");
                        return;
                    }

                    mqV57AutoSelectByText(
                        p,
                        "deviceModel",
                        modelName,
                        function () {},
                        function () {
                            showToast("مدل ثبت شد، ولی انتخاب خودکار انجام نشد؛ آن را از لیست انتخاب کنید.");
                        }
                    );
                }, 320);

                return;
            }

            if (formName === "mediqNewAsset") {
                try {
                    window.sessionStorage.setItem("mediqResumeView", "newAsset-purchased");
                } catch (ignoreResumeV50) {}

                mqCloseRegistrationFlowV50(true);
                showToast("دستگاه با موفقیت ثبت شد.");

                window.setTimeout(function () {
                    window.location.reload();
                }, 450);

                return;
            }
        }

        if (typeof previousSubmitV50 === "function") {
            return previousSubmitV50.apply(this, arguments);
        }
    };
})();

/* ESC closes the whole top-down flow. */
document.addEventListener("keydown", function (e) {
    if (e.key !== "Escape") return;
    if (!mqFlowStateV50.open) return;

    e.preventDefault();
    e.stopPropagation();
    e.stopImmediatePropagation();
    mqCloseRegistrationFlowV50(true);
}, true);




/* ============================================================
   MEDIQ V57 - SINGLE STABLE SELECT2 HANDLER
   ------------------------------------------------------------
   Replaces V50.5 / V54 / V55 / V56.
   - One open/close/position handler only
   - Keeps dropdown/search under the active field inside Wizard bounds
   - Keeps selected value visible after closing
   - No DOM reparenting of live Select2 controls
   - Reads Classification Persian Name (attribute 6683) for Wizard display
     WITHOUT changing the Assets label attribute
   - Filters Equipment Titles by Classification attribute 6668
   - Filters Models by Equipment Title attribute 6626
   - Navigation remains manual; user clicks «مرحله بعد»
   ============================================================ */

var mqV57 = {
    field: null,
    fieldName: "",
    inst: null,
    visual: null,
    drop: null,
    wantOpen: false,
    opening: false,
    observerTimer: null,
    advanceTimer: null,
    lastAdvanceToken: "",
    lastAdvanceAt: 0,

    selected: {
        groupKey: "",
        groupId: "",
        groupLabel: "",
        titleKey: "",
        titleId: "",
        titleLabel: "",
        modelKey: "",
        modelId: "",
        modelLabel: ""
    },

    pending: {
        classification: "",
        equipmentTitle: "",
        model: ""
    }
};

function mqV57JQ() {
    return (window.AJS && AJS.$) ? AJS.$ : (window.jQuery || null);
}

function mqV57Norm(value) {
    return String(value == null ? "" : value)
        .replace(/\s+/g, " ")
        .trim()
        .toLowerCase();
}

function mqV57Dom(value) {
    if (!value) return null;
    if (value.nodeType === 1) return value;
    if (value[0] && value[0].nodeType === 1) return value[0];
    return null;
}

function mqV57ActivePanel() {
    return document.querySelector(".mq-flow-active-panel-v50");
}

function mqV57Instance(field) {
    var jq = mqV57JQ();
    if (!jq || !field) return null;
    try { return jq(field).data("select2") || null; } catch (ignore) { return null; }
}

function mqV57Visual(field, inst) {
    var v = mqV57Dom(inst && inst.container);
    if (v) return v;

    var next = field && field.nextElementSibling;
    if (next && next.classList && next.classList.contains("select2-container")) return next;

    var row = field && (
        (field.closest && field.closest("td")) ||
        (field.closest && field.closest(".field-group")) ||
        (field.closest && field.closest(".control-group")) ||
        field.parentElement
    );

    return row ? row.querySelector(".select2-container,.aui-select2-container") : null;
}

function mqV57Drop(inst) {
    var d = mqV57Dom(inst && inst.dropdown);
    if (d) return d;

    var active = document.querySelector(
        ".select2-drop.select2-drop-active," +
        ".aui-select2-drop.select2-drop-active," +
        ".select2-dropdown[aria-hidden='false']," +
        ".select2-drop.mq-v57-open," +
        ".aui-select2-drop.mq-v57-open"
    );

    if (active) return active;

    var all = document.querySelectorAll(
        "body > .select2-drop,body > .aui-select2-drop,body > .select2-dropdown"
    );

    return all.length ? all[all.length - 1] : null;
}

function mqV57FieldName(field) {
    if (!field) return "";

    var panel = mqV57ActivePanel();
    var known = [
        "equipmentTitleGroup",
        "classificationParent",
        "deviceTitle",
        "deviceModel",
        "manufacturer",
        "modelType",
        "modelGroup"
    ];

    if (panel) {
        for (var i = 0; i < known.length; i++) {
            try {
                if (mqFlowFindFieldV50(panel, known[i]) === field) return known[i];
            } catch (ignoreKnown) {}
        }
    }

    return String(field.name || field.id || "");
}

function mqV57FieldForVisual(visual) {
    var panel = mqV57ActivePanel();
    if (!panel || !visual) return null;

    var fields = panel.querySelectorAll("select,input");
    for (var i = 0; i < fields.length; i++) {
        var inst = mqV57Instance(fields[i]);
        if (!inst) continue;
        if (mqV57Visual(fields[i], inst) === visual) return fields[i];
    }

    return null;
}

function mqV57GetData(field) {
    var jq = mqV57JQ();
    if (!jq || !field) return null;

    try {
        var data = jq(field).select2("data");
        if (data && data.length && !data.objectKey && !data.attributes) data = data[0];
        return data || null;
    } catch (ignore) {
        return null;
    }
}

function mqV57FindAttribute(data, attributeId) {
    var wanted = String(attributeId);
    var seen = [];

    function already(obj) {
        for (var i = 0; i < seen.length; i++) if (seen[i] === obj) return true;
        seen.push(obj);
        return false;
    }

    function walk(obj, depth) {
        if (!obj || depth > 6) return null;
        if (typeof obj !== "object") return null;
        if (obj.nodeType || obj.jquery) return null;
        if (already(obj)) return null;

        var attrs = obj.attributes;
        if (attrs && typeof attrs.length === "number") {
            for (var i = 0; i < attrs.length; i++) {
                var a = attrs[i];
                if (!a) continue;

                var aid =
                    a.objectTypeAttributeId != null ? a.objectTypeAttributeId :
                    (a.objectTypeAttribute && a.objectTypeAttribute.id != null
                        ? a.objectTypeAttribute.id
                        : null);

                if (aid != null && String(aid) === wanted) return a;
            }
        }

        var keys = ["raw", "object", "insightObject", "item", "data", "value", "result"];
        for (var k = 0; k < keys.length; k++) {
            try {
                var found = walk(obj[keys[k]], depth + 1);
                if (found) return found;
            } catch (ignoreWalk) {}
        }

        return null;
    }

    return walk(data, 0);
}

function mqV57AttrText(data, attributeId) {
    var attr = mqV57FindAttribute(data, attributeId);
    if (!attr) return "";

    var vals = attr.objectAttributeValues || attr.values || [];
    if (!vals || typeof vals.length !== "number") vals = [vals];

    for (var i = 0; i < vals.length; i++) {
        var v = vals[i];
        if (v == null) continue;

        if (typeof v !== "object") {
            var simple = String(v).trim();
            if (simple) return simple;
            continue;
        }

        var out =
            v.displayValue != null ? v.displayValue :
            (v.value != null ? v.value :
            (v.label != null ? v.label : ""));

        if (out != null && String(out).trim()) return String(out).trim();
    }

    return "";
}

function mqV57AttrReferences(data, attributeId) {
    var attr = mqV57FindAttribute(data, attributeId);
    if (!attr) return null; /* null = attribute data not available; fail open */

    var vals = attr.objectAttributeValues || attr.values || [];
    if (!vals || typeof vals.length !== "number") vals = [vals];

    var out = [];

    function push(v) {
        if (v == null) return;
        var s = String(v).trim();
        if (!s) return;
        if (out.indexOf(s) < 0) out.push(s);
    }

    for (var i = 0; i < vals.length; i++) {
        var v = vals[i];
        if (v == null) continue;

        if (typeof v !== "object") {
            push(v);
            continue;
        }

        var ref = v.referencedObject || v.object || null;
        if (ref) {
            push(ref.id);
            push(ref.objectId);
            push(ref.objectKey);
            push(ref.key);
            push(ref.label);
        }

        push(v.id);
        push(v.objectId);
        push(v.objectKey);
        push(v.key);
        push(v.value);
        push(v.displayValue);
        push(v.label);
    }

    return out;
}

function mqV57Identity(data, field) {
    data = data || {};

    var key = String(
        data.objectKey != null ? data.objectKey :
        (data.key != null ? data.key :
        (field && field.value ? field.value : ""))
    ).trim();

    var id = String(
        data.objectId != null ? data.objectId :
        (data.id != null ? data.id : "")
    ).trim();

    var label = String(
        data.label != null ? data.label :
        (data.text != null ? data.text :
        (data.name != null ? data.name : ""))
    ).trim();

    return { key:key, id:id, label:label };
}

function mqV57RefMatches(refs, identity) {
    if (refs === null) return true; /* data unavailable: do not hide */
    if (!identity) return true;

    var targets = [identity.key, identity.id, identity.label]
        .filter(function (v) { return !!String(v || "").trim(); })
        .map(function (v) { return mqV57Norm(v); });

    if (!targets.length) return true;

    for (var i = 0; i < refs.length; i++) {
        var r = mqV57Norm(refs[i]);
        if (!r) continue;
        for (var t = 0; t < targets.length; t++) {
            if (r === targets[t] || r.indexOf(targets[t]) >= 0 || targets[t].indexOf(r) >= 0) {
                return true;
            }
        }
    }

    return false;
}

function mqV57PersianDisplay(data, fallback, field) {
    var persian = mqV57AttrText(data, 6683);
    if (!persian) return fallback || "";

    var identity = mqV57Identity(data, field);
    return identity.key ? (identity.key + " - " + persian) : persian;
}

function mqV57IsClassificationField(fieldName) {
    return fieldName === "equipmentTitleGroup" ||
           fieldName === "classificationParent" ||
           fieldName === "modelGroup";
}

function mqV57ResultData(item) {
    var jq = mqV57JQ();
    if (!jq || !item) return null;

    try {
        return jq(item).data("select2-data") ||
               jq(item).data("data") ||
               null;
    } catch (ignore) {
        return null;
    }
}

function mqV57ResultLabelNode(item) {
    if (!item) return null;
    return item.querySelector(
        ".select2-result-label,.select2-results__option-text,.select2-result"
    ) || item;
}

function mqV57RenderResults() {
    if (!mqV57.wantOpen) return;

    var field = mqV57.field;
    var fieldName = mqV57.fieldName || mqV57FieldName(field);
    var drop = mqV57.drop || mqV57Drop(mqV57.inst);
    if (!field || !drop) return;

    var items = drop.querySelectorAll(
        ".select2-result-selectable,.select2-results li,.select2-results__option"
    );

    for (var i = 0; i < items.length; i++) {
        var item = items[i];
        var data = mqV57ResultData(item);
        var labelNode = mqV57ResultLabelNode(item);
        var originalText = item.getAttribute("data-mq-v57-original-text");

        if (originalText === null) {
            originalText = String(labelNode.textContent || "").trim();
            item.setAttribute("data-mq-v57-original-text", originalText);
        }

        var visibleText = originalText;

        if (mqV57IsClassificationField(fieldName) && data) {
            visibleText = mqV57PersianDisplay(data, originalText, field) || originalText;
            if (labelNode && visibleText) labelNode.textContent = visibleText;
        }

        var keep = true;

        if (fieldName === "deviceTitle" && mqV57.selected.groupKey) {
            var titleGroupRefs = mqV57AttrReferences(data, 6668);
            keep = mqV57RefMatches(titleGroupRefs, {
                key: mqV57.selected.groupKey,
                id: mqV57.selected.groupId,
                label: mqV57.selected.groupLabel
            });
        }

        if (fieldName === "deviceModel" && mqV57.selected.titleKey) {
            var modelTitleRefs = mqV57AttrReferences(data, 6626);
            keep = mqV57RefMatches(modelTitleRefs, {
                key: mqV57.selected.titleKey,
                id: mqV57.selected.titleId,
                label: mqV57.selected.titleLabel
            });
        }

        item.style.setProperty("display", keep ? "" : "none", keep ? "" : "important");

        var searchText = mqV57Norm(
            originalText + " " + visibleText + " " +
            (data && data.objectKey ? data.objectKey : "") + " " +
            (data && data.label ? data.label : "")
        );
        item.setAttribute("data-mq-v57-search", searchText);
    }
}

function mqV57FilterClassificationLocally(query) {
    var drop = mqV57.drop || mqV57Drop(mqV57.inst);
    if (!drop) return;

    var q = mqV57Norm(query);
    var items = drop.querySelectorAll(
        ".select2-result-selectable,.select2-results li,.select2-results__option"
    );

    for (var i = 0; i < items.length; i++) {
        var item = items[i];
        var baseVisible = item.style.display !== "none";
        var hay = item.getAttribute("data-mq-v57-search") || mqV57Norm(item.textContent || "");
        var match = !q || hay.indexOf(q) >= 0;
        if (baseVisible || match) {
            item.style.setProperty("display", match ? "" : "none", match ? "" : "important");
        }
    }
}

function mqV57BindSearchBox() {
    var drop = mqV57.drop || mqV57Drop(mqV57.inst);
    if (!drop) return;

    var search = drop.querySelector(
        ".select2-search input,input.select2-input,input[type='text']"
    );

    if (!search) return;

    search.style.setProperty("display", "block", "important");
    search.style.setProperty("visibility", "visible", "important");

    if (search.getAttribute("data-mq-v57-bound") === "1") return;
    search.setAttribute("data-mq-v57-bound", "1");

    search.addEventListener("input", function () {
        if (!mqV57IsClassificationField(mqV57.fieldName)) return;
        window.setTimeout(function () {
            mqV57RenderResults();
            mqV57FilterClassificationLocally(search.value || "");
        }, 0);
    }, false);
}

function mqV57PositionDrop() {
    if (!mqV57.wantOpen) return;

    var panel = mqV57ActivePanel();
    var visual = mqV57.visual;
    var drop = mqV57.drop || mqV57Drop(mqV57.inst);

    if (!panel || !visual || !drop) return;

    var pr, vr;
    try {
        pr = panel.getBoundingClientRect();
        vr = visual.getBoundingClientRect();
    } catch (ignoreRect) {
        return;
    }

    if (!vr || vr.width < 20) return;

    /*
     * V62:
     * Position the picker relative to the viewport, NOT the bottom of the
     * Wizard panel. The Select2 dropdown is appended to <body>, so using the
     * modal bottom incorrectly forced the search/results ABOVE the field.
     *
     * Prefer opening below the field. Only open above when the browser
     * viewport itself genuinely has no useful room below.
     */
    var viewportWidth = Math.max(
        document.documentElement.clientWidth || 0,
        window.innerWidth || 0
    );

    var viewportHeight = Math.max(
        document.documentElement.clientHeight || 0,
        window.innerHeight || 0
    );

    var margin = 12;

    /* Keep horizontal bounds aligned with the Wizard. */
    var width = Math.min(
        Math.max(vr.width, 280),
        Math.max(280, pr.width - (margin * 2))
    );

    var left = vr.left;

    if (left < pr.left + margin) {
        left = pr.left + margin;
    }

    if (left + width > pr.right - margin) {
        left = pr.right - margin - width;
    }

    if (left < margin) {
        left = margin;
    }

    if (left + width > viewportWidth - margin) {
        left = viewportWidth - margin - width;
    }

    var availableBelow = viewportHeight - vr.bottom - margin;
    var availableAbove = vr.top - margin;

    var openAbove = (
        availableBelow < 130 &&
        availableAbove > availableBelow
    );

    var maxHeight;
    var top;

    if (openAbove) {
        maxHeight = Math.max(
            120,
            Math.min(300, availableAbove - 6)
        );

        top = Math.max(
            margin,
            vr.top - maxHeight - 5
        );
    }
    else {
        maxHeight = Math.max(
            120,
            Math.min(300, availableBelow - 6)
        );

        top = vr.bottom + 5;
    }

    drop.classList.remove("select2-display-none");
    drop.classList.add("select2-drop-active");
    drop.classList.add("mq-v57-open");
    drop.setAttribute("aria-hidden", "false");

    drop.style.setProperty("display", "block", "important");
    drop.style.setProperty("visibility", "visible", "important");
    drop.style.setProperty("opacity", "1", "important");
    drop.style.setProperty("pointer-events", "auto", "important");
    drop.style.setProperty("position", "fixed", "important");
    drop.style.setProperty("left", Math.round(left) + "px", "important");
    drop.style.setProperty("right", "auto", "important");
    drop.style.setProperty("top", Math.round(top) + "px", "important");
    drop.style.setProperty("width", Math.round(width) + "px", "important");
    drop.style.setProperty("min-width", Math.round(width) + "px", "important");
    drop.style.setProperty("max-width", Math.round(width) + "px", "important");
    drop.style.setProperty("max-height", Math.round(maxHeight) + "px", "important");
    drop.style.setProperty("z-index", "2147483646", "important");

    mqV57.drop = drop;

    mqV57RenderResults();
    mqV57BindSearchBox();
}

function mqV57ScheduleOpenRepair() {
    [0, 20, 60, 120, 220, 400].forEach(function (ms) {
        window.setTimeout(function () {
            if (!mqV57.wantOpen) return;
            mqV57.drop = mqV57Drop(mqV57.inst);
            mqV57PositionDrop();
        }, ms);
    });
}

function mqV57Close() {
    var jq = mqV57JQ();
    var field = mqV57.field;
    var fieldName = mqV57.fieldName || mqV57FieldName(field);

    mqV57.wantOpen = false;
    mqV57.opening = false;

    if (jq && field) {
        try { jq(field).select2("close"); } catch (ignoreClose) {}
    }

    /*
     * V62:
     * Select2 v3 sometimes leaves select2-drop-active on the body node for a
     * few milliseconds after close. Do not trust that transient class.
     * A closed picker is always force-hidden and fully reset here.
     */
    var drops = document.querySelectorAll(
        "body > .select2-drop," +
        "body > .aui-select2-drop," +
        "body > .select2-dropdown"
    );

    for (var i = 0; i < drops.length; i++) {
        var d = drops[i];

        d.classList.remove("mq-v57-open");
        d.classList.remove("select2-drop-active");
        d.classList.add("select2-display-none");

        d.setAttribute("aria-hidden", "true");

        d.style.setProperty("display", "none", "important");
        d.style.setProperty("visibility", "hidden", "important");
        d.style.setProperty("opacity", "0", "important");
        d.style.setProperty("pointer-events", "none", "important");

        [
            "position",
            "left",
            "right",
            "top",
            "width",
            "min-width",
            "max-width",
            "max-height",
            "z-index"
        ].forEach(function (p) {
            d.style.removeProperty(p);
        });
    }

    var masks = document.querySelectorAll(
        "#select2-drop-mask,.select2-drop-mask"
    );

    for (var m = 0; m < masks.length; m++) {
        masks[m].style.setProperty("display", "none", "important");
    }

    /*
     * Hide detached/orphan search nodes. The legitimate search input is
     * nested inside .mq-v57-open and is therefore not matched here.
     */
    var orphanSearch = document.querySelectorAll(
        "body > .select2-search," +
        "body > input.select2-input," +
        "body > input.select2-focusser"
    );

    for (var s = 0; s < orphanSearch.length; s++) {
        orphanSearch[s].style.setProperty("display", "none", "important");
        orphanSearch[s].style.setProperty("visibility", "hidden", "important");
        orphanSearch[s].style.setProperty("opacity", "0", "important");
        orphanSearch[s].style.setProperty("pointer-events", "none", "important");
    }

    /*
     * The v3 focus helper lives inside the visible Select2 container. A broad
     * input[type=text] rule used by the Wizard must never turn it into a
     * visible white rectangle.
     */
    var panel = mqV57ActivePanel();

    if (panel) {
        var helpers = panel.querySelectorAll(
            ".select2-container input.select2-focusser," +
            ".aui-select2-container input.select2-focusser," +
            ".select2-container > input.select2-input," +
            ".aui-select2-container > input.select2-input"
        );

        for (var h = 0; h < helpers.length; h++) {
            helpers[h].style.setProperty("display", "none", "important");
            helpers[h].style.setProperty("visibility", "hidden", "important");
            helpers[h].style.setProperty("opacity", "0", "important");
            helpers[h].style.setProperty("pointer-events", "none", "important");
            helpers[h].style.setProperty("width", "1px", "important");
            helpers[h].style.setProperty("height", "1px", "important");
            helpers[h].style.setProperty("min-width", "1px", "important");
            helpers[h].style.setProperty("min-height", "1px", "important");
        }

        if (field && fieldName) {
            try {
                mqV62RestoreSelectedVisual(panel, fieldName, field);
            } catch (ignoreRestoreV62) {}
        }
    }

    mqV57.field = null;
    mqV57.fieldName = "";
    mqV57.inst = null;
    mqV57.visual = null;
    mqV57.drop = null;
}

function mqV57OpenField(field) {
    if (!field || !mqFlowStateV50.open) return false;

    var jq = mqV57JQ();
    if (!jq) return false;

    var inst = mqV57Instance(field);
    if (!inst) return false;

    var visual = mqV57Visual(field, inst);
    if (!visual) return false;

    if (mqV57.field && mqV57.field !== field) mqV57Close();

    mqV57.field = field;
    mqV57.fieldName = mqV57FieldName(field);
    mqV57.inst = inst;
    mqV57.visual = visual;
    mqV57.drop = null;
    mqV57.wantOpen = true;
    mqV57.opening = true;

    try {
        jq(field).select2("open");
    } catch (e1) {
        try { if (typeof inst.open === "function") inst.open(); } catch (e2) {}
    }

    mqV57ScheduleOpenRepair();

    window.setTimeout(function () {
        mqV57.opening = false;
        if (mqV57.wantOpen) {
            var drop = mqV57.drop || mqV57Drop(mqV57.inst);
            var search = drop && drop.querySelector(
                ".select2-search input,input.select2-input,input[type='text']"
            );
            if (search) {
                try { search.focus(); } catch (ignoreFocus) {}
            }
        }
    }, 120);

    return true;
}

function mqV57SetSelectedText(field, fieldName, data) {
    if (!field || !mqV57IsClassificationField(fieldName)) return;

    var inst = mqV57Instance(field);
    var visual = mqV57Visual(field, inst);
    if (!visual) return;

    data = data || mqV57GetData(field);
    if (!data) return;

    var chosen = visual.querySelector(
        ".select2-chosen,.select2-selection__rendered"
    );

    if (!chosen) return;

    var fallback = String(chosen.textContent || "").trim();
    var text = mqV57PersianDisplay(data, fallback, field);
    if (text) chosen.textContent = text;
}

function mqV57ClearField(panelKey, fieldName) {
    var panel = mqFlowGetPanelV50(panelKey);
    if (!panel) return;

    var field = mqFlowFindFieldV50(panel, fieldName);
    if (!field) return;

    var jq = mqV57JQ();

    try {
        if (jq && mqV57Instance(field)) {
            try { jq(field).select2("val", ""); } catch (ignoreV3) {}
            try { jq(field).val(null).trigger("change"); } catch (ignoreV4) {}
        } else {
            field.value = "";
        }
    } catch (ignoreClear) {}
}

function mqV57RememberSelection(fieldName, field, data) {
    if (!fieldName || !field) return;

    data = data || mqV57GetData(field);
    var identity = mqV57Identity(data, field);

    if (fieldName === "equipmentTitleGroup") {
        var changedGroup = mqV57.selected.groupKey && identity.key &&
                           mqV57.selected.groupKey !== identity.key;

        mqV57.selected.groupKey = identity.key;
        mqV57.selected.groupId = identity.id;
        mqV57.selected.groupLabel = identity.label;

        if (changedGroup) {
            mqV57.selected.titleKey = "";
            mqV57.selected.titleId = "";
            mqV57.selected.titleLabel = "";
            mqV57.selected.modelKey = "";
            mqV57.selected.modelId = "";
            mqV57.selected.modelLabel = "";
            mqV57ClearField("model", "deviceTitle");
            mqV57ClearField("asset", "deviceModel");
        }
    }

    else if (fieldName === "deviceTitle") {
        var changedTitle = mqV57.selected.titleKey && identity.key &&
                           mqV57.selected.titleKey !== identity.key;

        mqV57.selected.titleKey = identity.key;
        mqV57.selected.titleId = identity.id;
        mqV57.selected.titleLabel = identity.label;

        if (changedTitle) {
            mqV57.selected.modelKey = "";
            mqV57.selected.modelId = "";
            mqV57.selected.modelLabel = "";
            mqV57ClearField("asset", "deviceModel");
        }
    }

    else if (fieldName === "deviceModel") {
        mqV57.selected.modelKey = identity.key;
        mqV57.selected.modelId = identity.id;
        mqV57.selected.modelLabel = identity.label;
    }

    mqV57SetSelectedText(field, fieldName, data);
}

function mqV57MaybeAdvance(fieldName, field, data) {
    /*
     * V61: انتخاب مقدار فقط در State ذخیره می‌شود.
     * هیچ Selectionای حق ندارد Wizard را خودکار به مرحله بعد ببرد.
     * ادامه مسیر فقط با دکمه «مرحله بعد» انجام می‌شود.
     */
    if (!mqFlowStateV50.open || mqFlowStateV50.mode !== "selector") return;
    if (!field || !String(field.value || "").trim()) return;

    mqV57RememberSelection(fieldName, field, data);
}

function mqV57ReadTextField(panel, fieldName) {
    if (!panel) return "";
    var field = mqFlowFindFieldV50(panel, fieldName);
    if (!field) return "";
    return String(field.value || "").trim();
}

function mqV57CapturePending() {
    if (!mqFlowStateV50.open) return;

    var panel = mqFlowStateV50.activePanel;
    if (!panel) return;

    if (mqFlowStateV50.mode === "create-classification") {
        mqV57.pending.classification = mqV57ReadTextField(panel, "classificationName");
    }

    else if (mqFlowStateV50.mode === "create-equipmentTitle") {
        mqV57.pending.equipmentTitle = mqV57ReadTextField(panel, "equipmentTitleName");
    }

    else if (mqFlowStateV50.mode === "create-model") {
        mqV57.pending.model = mqV57ReadTextField(panel, "modelName");
    }
}

function mqV57CandidateTexts(item, data, field) {
    var out = [];

    function add(v) {
        if (v == null) return;
        var s = String(v).trim();
        if (!s) return;
        out.push(mqV57Norm(s));
    }

    add(item && item.textContent);
    if (data) {
        add(data.text);
        add(data.label);
        add(data.name);
        add(data.objectKey);
        add(mqV57AttrText(data, 6683));
        add(mqV57PersianDisplay(data, "", field));
    }

    return out;
}

function mqV57AutoSelectByText(panel, fieldName, wantedText, onSuccess, onFailure) {
    var wanted = mqV57Norm(wantedText);
    if (!panel || !wanted) {
        if (typeof onFailure === "function") onFailure();
        return;
    }

    var field = mqFlowFindFieldV50(panel, fieldName);
    if (!field) {
        if (typeof onFailure === "function") onFailure();
        return;
    }

    var attempts = 0;
    var maxAttempts = 8;

    function attempt() {
        attempts++;

        mqFlowRefreshReferenceV50(panel, fieldName);

        window.setTimeout(function () {
            if (!mqV57OpenField(field)) {
                if (attempts < maxAttempts) {
                    window.setTimeout(attempt, 350);
                } else if (typeof onFailure === "function") {
                    onFailure();
                }
                return;
            }

            window.setTimeout(function () {
                var drop = mqV57.drop || mqV57Drop(mqV57.inst);
                if (!drop) {
                    if (attempts < maxAttempts) window.setTimeout(attempt, 350);
                    else if (typeof onFailure === "function") onFailure();
                    return;
                }

                var search = drop.querySelector(
                    ".select2-search input,input.select2-input,input[type='text']"
                );

                if (search) {
                    try {
                        search.value = wantedText;
                        search.dispatchEvent(new Event("input", { bubbles:true }));
                        search.dispatchEvent(new KeyboardEvent("keyup", { bubbles:true, key:"a" }));
                    } catch (ignoreSearch) {}
                }

                var polls = 0;

                function findMatch() {
                    polls++;
                    mqV57RenderResults();

                    var items = drop.querySelectorAll(
                        ".select2-result-selectable,.select2-results li,.select2-results__option"
                    );

                    for (var i = 0; i < items.length; i++) {
                        var item = items[i];
                        if (item.style.display === "none") continue;

                        var data = mqV57ResultData(item);
                        var texts = mqV57CandidateTexts(item, data, field);
                        var matched = false;

                        for (var t = 0; t < texts.length; t++) {
                            if (texts[t] === wanted || texts[t].indexOf(wanted) >= 0 || wanted.indexOf(texts[t]) >= 0) {
                                matched = true;
                                break;
                            }
                        }

                        if (!matched) continue;

                        try {
                            var jq = mqV57JQ();
                            if (jq) jq(item).trigger("mouseup");
                            else item.dispatchEvent(new MouseEvent("mouseup", { bubbles:true, cancelable:true, view:window }));
                        } catch (ignorePick) {}

                        window.setTimeout(function () {
                            var selected = String(field.value || "").trim();
                            if (selected) {
                                mqV57RememberSelection(fieldName, field, mqV57GetData(field));
                                mqV57MaybeAdvance(fieldName, field, mqV57GetData(field));
                                if (typeof onSuccess === "function") onSuccess();
                            } else if (attempts < maxAttempts) {
                                window.setTimeout(attempt, 350);
                            } else if (typeof onFailure === "function") {
                                onFailure();
                            }
                        }, 180);

                        return;
                    }

                    if (polls < 8) {
                        window.setTimeout(findMatch, 180);
                        return;
                    }

                    mqV57Close();
                    if (attempts < maxAttempts) window.setTimeout(attempt, 350);
                    else if (typeof onFailure === "function") onFailure();
                }

                window.setTimeout(findMatch, 130);
            }, 120);
        }, attempts === 1 ? 220 : 380);
    }

    attempt();
}

function mqV57SyncActivePanel() {
    if (!mqFlowStateV50.open) return;

    var panel = mqV57ActivePanel();
    if (!panel) return;

    var names = [
        "equipmentTitleGroup",
        "classificationParent",
        "deviceTitle",
        "deviceModel",
        "manufacturer",
        "modelType",
        "modelGroup"
    ];

    for (var i = 0; i < names.length; i++) {
        var field = null;
        try { field = mqFlowFindFieldV50(panel, names[i]); } catch (ignoreField) {}
        if (!field) continue;

        var inst = mqV57Instance(field);
        var visual = mqV57Visual(field, inst);

        if (visual) {
            visual.style.setProperty("display", "block", "important");
            visual.style.setProperty("visibility", "visible", "important");
            visual.style.setProperty("opacity", "1", "important");
            visual.style.setProperty("width", "100%", "important");
            visual.style.setProperty("max-width", "100%", "important");
            visual.style.setProperty("min-width", "0", "important");
            visual.style.setProperty("position", "relative", "important");
            visual.style.setProperty("left", "auto", "important");
            visual.style.setProperty("right", "auto", "important");
            visual.style.setProperty("top", "auto", "important");
            visual.style.setProperty("transform", "none", "important");
        }

        mqV57SetSelectedText(field, names[i], mqV57GetData(field));
    }
}

function mqV57InjectCss() {
    if (document.getElementById("mq-v57-select2-css")) return;

    var st = document.createElement("style");
    st.id = "mq-v57-select2-css";
    st.textContent =
        'body.mq-flow-open-v50 .mq-flow-active-panel-v50 .select2-container,' +
        'body.mq-flow-open-v50 .mq-flow-active-panel-v50 .aui-select2-container{' +
            'display:block!important;position:relative!important;left:auto!important;right:auto!important;top:auto!important;' +
            'transform:none!important;width:100%!important;max-width:100%!important;min-width:0!important;' +
            'visibility:visible!important;opacity:1!important;pointer-events:auto!important;box-sizing:border-box!important;' +
        '}' +
        /* V62: never render Select2 v3 focus/input helpers as visible Wizard inputs */ +
        'body.mq-flow-open-v50 .mq-flow-active-panel-v50 .select2-container input.select2-focusser,' +
        'body.mq-flow-open-v50 .mq-flow-active-panel-v50 .aui-select2-container input.select2-focusser,' +
        'body.mq-flow-open-v50 .mq-flow-active-panel-v50 .select2-container > input.select2-input,' +
        'body.mq-flow-open-v50 .mq-flow-active-panel-v50 .aui-select2-container > input.select2-input{' +
            'display:none!important;visibility:hidden!important;opacity:0!important;pointer-events:none!important;' +
            'position:absolute!important;left:-10000px!important;top:0!important;width:1px!important;height:1px!important;' +
            'min-width:1px!important;min-height:1px!important;max-width:1px!important;max-height:1px!important;' +
            'border:0!important;padding:0!important;margin:0!important;box-shadow:none!important;' +
        '}' +
        'body.mq-flow-open-v50 > .select2-search,' +
        'body.mq-flow-open-v50 > input.select2-input,' +
        'body.mq-flow-open-v50 > input.select2-focusser{' +
            'display:none!important;visibility:hidden!important;opacity:0!important;pointer-events:none!important;' +
        '}' +
        'body.mq-flow-open-v50 .mq-flow-active-panel-v50 .select2-choice,' +
        'body.mq-flow-open-v50 .mq-flow-active-panel-v50 .select2-selection,' +
        'body.mq-flow-open-v50 .mq-flow-active-panel-v50 .aui-select2-choice{' +
            'display:block!important;width:100%!important;max-width:100%!important;min-width:0!important;' +
            'min-height:44px!important;height:44px!important;line-height:42px!important;padding:0 12px!important;' +
            'border:1px solid #d5dbe0!important;border-radius:12px!important;background:#fff!important;' +
            'box-shadow:0 2px 9px rgba(7,53,83,.035)!important;direction:rtl!important;text-align:right!important;box-sizing:border-box!important;' +
        '}' +
        'body.mq-flow-open-v50 .mq-flow-active-panel-v50 .select2-chosen,' +
        'body.mq-flow-open-v50 .mq-flow-active-panel-v50 .select2-selection__rendered{' +
            'display:block!important;visibility:visible!important;opacity:1!important;' +
            'width:100%!important;max-width:100%!important;min-width:0!important;line-height:42px!important;' +
            'padding:0 14px!important;direction:rtl!important;text-align:right!important;box-sizing:border-box!important;' +
            'overflow:hidden!important;text-overflow:ellipsis!important;white-space:nowrap!important;' +
        '}' +
        'html body.mq-flow-open-v50 .select2-drop.mq-v57-open,' +
        'html body.mq-flow-open-v50 .aui-select2-drop.mq-v57-open,' +
        'html body.mq-flow-open-v50 .select2-dropdown.mq-v57-open{' +
            'display:block!important;visibility:visible!important;opacity:1!important;pointer-events:auto!important;' +
            'z-index:2147483646!important;background:#fff!important;border:1px solid #d5dbe0!important;border-radius:12px!important;' +
            'box-shadow:0 18px 44px rgba(3,35,55,.22)!important;overflow:hidden!important;direction:rtl!important;text-align:right!important;' +
        '}' +
        'html body.mq-flow-open-v50 .select2-drop.mq-v57-open .select2-search,' +
        'html body.mq-flow-open-v50 .aui-select2-drop.mq-v57-open .select2-search{' +
            'display:block!important;padding:8px!important;background:#fff!important;' +
        '}' +
        'html body.mq-flow-open-v50 .select2-drop.mq-v57-open .select2-search input,' +
        'html body.mq-flow-open-v50 .aui-select2-drop.mq-v57-open .select2-search input,' +
        'html body.mq-flow-open-v50 .select2-drop.mq-v57-open .select2-input,' +
        'html body.mq-flow-open-v50 .aui-select2-drop.mq-v57-open .select2-input{' +
            'display:block!important;visibility:visible!important;width:100%!important;min-height:38px!important;' +
            'border:1px solid #d5dbe0!important;border-radius:9px!important;box-sizing:border-box!important;' +
            'direction:rtl!important;text-align:right!important;background:#fff!important;' +
        '}' +
        'html body.mq-flow-open-v50 .select2-drop.mq-v57-open .select2-results,' +
        'html body.mq-flow-open-v50 .aui-select2-drop.mq-v57-open .select2-results{' +
            'display:block!important;max-height:260px!important;overflow-y:auto!important;direction:rtl!important;text-align:right!important;' +
        '}' +
        'body.mq-flow-open-v50 > .select2-drop:not(.select2-drop-active):not(.mq-v57-open),' +
        'body.mq-flow-open-v50 > .aui-select2-drop:not(.select2-drop-active):not(.mq-v57-open),' +
        'body.mq-flow-open-v50 > .select2-dropdown[aria-hidden="true"]{' +
            'display:none!important;visibility:hidden!important;opacity:0!important;pointer-events:none!important;' +
        '}';

    document.head.appendChild(st);
}

mqV57InjectCss();

/* Capture values before ConfiForms AJAX save can reset/redraw the form. */
document.addEventListener("submit", function () {
    mqV57CapturePending();
}, true);

document.addEventListener("click", function (e) {
    if (!mqFlowStateV50.open || !e.target || !e.target.closest) return;

    var panel = mqV57ActivePanel();
    if (!panel || !panel.contains(e.target)) return;

    var submit = e.target.closest(
        'button[type="submit"],input[type="submit"],.aui-button-primary,.confiforms-submit'
    );

    if (submit) mqV57CapturePending();
}, true);

/* One capture handler opens every Select2 inside the active Wizard panel. */
document.addEventListener("mousedown", function (e) {
    if (!mqFlowStateV50.open || !e.target || !e.target.closest) return;

    var panel = mqV57ActivePanel();
    if (!panel) return;

    var visual = e.target.closest(".select2-container,.aui-select2-container");
    if (!visual || !panel.contains(visual)) return;

    var field = mqV57FieldForVisual(visual);
    if (!field) return;

    e.preventDefault();
    e.stopPropagation();
    if (e.stopImmediatePropagation) e.stopImmediatePropagation();

    mqV57OpenField(field);
}, true);

/* Selection/close events: keep value and keep selector visible.
   V61: navigation is manual via the «مرحله بعد» button. */
var mqV57Dollar = mqV57JQ();
if (mqV57Dollar) {
    try {
        mqV57Dollar(document)
            .off(".mqV57")
            .on(
                "select2-selected.mqV57 select2:select.mqV57",
                ".mq-flow-active-panel-v50 select,.mq-flow-active-panel-v50 input",
                function () {
                    var field = this;
                    var fieldName = mqV57FieldName(field);
                    var value = String(field.value || "").trim();

                    if (!value) return;

                    window.setTimeout(function () {
                        var data = mqV57GetData(field);
                        mqV57RememberSelection(fieldName, field, data);
                        mqV57Close();
                        mqV57MaybeAdvance(fieldName, field, data);

                        /* V61: ConfiForms may replace the Select2 row after selection. */
                        var panelNow = mqFlowStateV50.activePanel;
                        if (panelNow && mqFlowStateV50.mode === "selector") {
                            var labelNow =
                                fieldName === "equipmentTitleGroup" ? "گروه" :
                                fieldName === "deviceTitle" ? "عنوان دستگاه" :
                                fieldName === "deviceModel" ? "مدل" : "";
                            mqFlowScheduleSelectorRepairV61(panelNow, fieldName, labelNow);
                        }
                    }, 30);
                }
            )
            .on(
                "select2-close.mqV57 select2:close.mqV57",
                ".mq-flow-active-panel-v50 select,.mq-flow-active-panel-v50 input",
                function () {
                    var field = this;
                    var fieldName = mqV57FieldName(field);
                    window.setTimeout(function () {
                        mqV57SetSelectedText(field, fieldName, mqV57GetData(field));
                        mqV57Close();

                        var panelNow = mqFlowStateV50.activePanel;
                        if (panelNow && mqFlowStateV50.mode === "selector") {
                            var labelNow =
                                fieldName === "equipmentTitleGroup" ? "گروه" :
                                fieldName === "deviceTitle" ? "عنوان دستگاه" :
                                fieldName === "deviceModel" ? "مدل" : "";
                            mqFlowScheduleSelectorRepairV61(panelNow, fieldName, labelNow);
                        }
                    }, 20);
                }
            );
    } catch (ignoreDelegatedV57) {}
}

/* Close when user clicks away from the active control/dropdown. */
document.addEventListener("mousedown", function (e) {
    if (!mqV57.wantOpen || mqV57.opening) return;
    if (!e.target || !e.target.closest) return;
    if (e.target.closest(".mq-v57-open")) return;
    if (e.target.closest(".select2-container,.aui-select2-container")) return;
    mqV57Close();
}, false);

window.addEventListener("resize", function () {
    if (mqV57.wantOpen) mqV57PositionDrop();
}, true);

document.addEventListener("scroll", function () {
    if (mqV57.wantOpen) mqV57PositionDrop();
}, true);

try {
    var mqV57Observer = new MutationObserver(function () {
        if (!mqFlowStateV50.open) return;

        window.clearTimeout(mqV57.observerTimer);
        mqV57.observerTimer = window.setTimeout(function () {
            mqV57SyncActivePanel();

            if (mqFlowStateV50.mode === "selector") {
                var activePanel = mqFlowStateV50.activePanel;
                var selectorField = activePanel && activePanel.getAttribute("data-mq-selector-field");
                if (activePanel && selectorField) {
                    var selectorLabel =
                        selectorField === "equipmentTitleGroup" ? "گروه" :
                        selectorField === "deviceTitle" ? "عنوان دستگاه" :
                        selectorField === "deviceModel" ? "مدل" : "";
                    mqFlowRepairSelectorV61(activePanel, selectorField, selectorLabel);
                }
            }

            if (mqV57.wantOpen) {
                mqV57.drop = mqV57Drop(mqV57.inst);
                mqV57PositionDrop();
            }
        }, 35);
    });

    mqV57Observer.observe(document.body, {
        childList: true,
        subtree: true
    });
} catch (ignoreObserverV57) {}

/* ============================================================
   INITIAL
   ============================================================ */

bindTree();

var mqResumeView = "";
try {
    mqResumeView = window.sessionStorage.getItem("mediqResumeView") || "";
    if (mqResumeView) {
        window.sessionStorage.removeItem("mediqResumeView");
    }
} catch (e) {}

if (mqResumeView === "newAsset-purchased") {
    state.selectedAssetSection = "purchased";
    renderAssetSections("newAsset");

    var mqOpenAssetAfterReload = false;
    try {
        mqOpenAssetAfterReload = window.sessionStorage.getItem("mediqOpenAssetAfterReload") === "1";
        if (mqOpenAssetAfterReload) window.sessionStorage.removeItem("mediqOpenAssetAfterReload");
    } catch (ignoreOpen) {}

    if (mqOpenAssetAfterReload) {
        window.setTimeout(function () { openMediQAssetForm(); }, 500);
    }
} else if (mqResumeView === "editAsset") {
    renderEditAssetWorkspace();
} else {
    renderEquipment();
}


})();

</script>

</div>

<style id="mq-v41-safe-polish">
/* ============================================================
   V41 - PRESENTATION SAFE POLISH
   Visual-only changes. Form opener / IFTTT / endpoints untouched.
   ============================================================ */

/* ---------- Asset form ---------- */
body.mq-asset-form-open .cf_mediqNewAsset{
    width:min(900px,94vw) !important;
    max-width:94vw !important;
    border-radius:22px !important;
    border:1px solid #dbe9ef !important;
    box-shadow:0 30px 90px rgba(3,35,55,.30) !important;
    background:#fff !important;
}

body.mq-asset-form-open .cf_mediqNewAsset .confiFormsFormContent{
    padding:14px 22px 8px !important;
    background:#fff !important;
}

body.mq-asset-form-open .cf_mediqNewAsset table{
    width:100% !important;
    border-collapse:separate !important;
    border-spacing:0 7px !important;
    direction:rtl !important;
}

body.mq-asset-form-open .cf_mediqNewAsset tr:not(.mq-form-section-row) > td{
    padding:5px 7px !important;
    border:0 !important;
    background:transparent !important;
    vertical-align:middle !important;
}

/* Label column on the RIGHT */
body.mq-asset-form-open .cf_mediqNewAsset tr:not(.mq-form-section-row) > td:first-child{
    width:190px !important;
    min-width:190px !important;
    color:#123e58 !important;
    font-size:12px !important;
    font-weight:800 !important;
    text-align:right !important;
    white-space:nowrap !important;
}

/* Input side: white card, soft border */
body.mq-asset-form-open .cf_mediqNewAsset tr:not(.mq-form-section-row) > td:last-child{
    background:#fff !important;
    border:1px solid #dce8ee !important;
    border-radius:11px !important;
    padding:5px !important;
    box-shadow:0 4px 14px rgba(17,62,88,.035) !important;
}

body.mq-asset-form-open .cf_mediqNewAsset input[type="text"],
body.mq-asset-form-open .cf_mediqNewAsset input[type="password"],
body.mq-asset-form-open .cf_mediqNewAsset input[type="date"],
body.mq-asset-form-open .cf_mediqNewAsset textarea,
body.mq-asset-form-open .cf_mediqNewAsset select{
    width:100% !important;
    min-height:38px !important;
    box-sizing:border-box !important;
    border:0 !important;
    border-radius:8px !important;
    background:#fff !important;
    color:#163f58 !important;
    box-shadow:none !important;
    outline:none !important;
    padding:0 10px !important;
    direction:rtl !important;
    text-align:right !important;
    font-family:inherit !important;
    font-size:12px !important;
}

body.mq-asset-form-open .cf_mediqNewAsset textarea{
    min-height:76px !important;
    padding-top:9px !important;
}

body.mq-asset-form-open .cf_mediqNewAsset tr:not(.mq-form-section-row) > td:last-child:focus-within{
    border-color:#5d6771 !important;
    box-shadow:0 0 0 3px rgba(93,103,113,.10) !important;
}

/* Section headers */
body.mq-asset-form-open .cf_mediqNewAsset .mq-form-section-row > td{
    border:0 !important;
    background:transparent !important;
    padding:11px 2px 2px !important;
}
body.mq-asset-form-open .cf_mediqNewAsset .mq-form-section-title{
    color:#0c405b !important;
    font-size:13px !important;
    font-weight:900 !important;
    padding:0 0 9px !important;
    border-bottom:1px solid #e2edf1 !important;
}

/* Model select: remove ugly grey strip */
body.mq-asset-form-open .cf_mediqNewAsset .select2-container,
body.mq-asset-form-open .cf_mediqNewAsset .select2-choice,
body.mq-asset-form-open .cf_mediqNewAsset .select2-selection,
body.mq-asset-form-open .cf_mediqNewAsset .select2-selection--single{
    background:#fff !important;
    background-image:none !important;
    border-color:#dce8ee !important;
    box-shadow:none !important;
    border-radius:8px !important;
}

body.mq-asset-form-open .cf_mediqNewAsset .mq-model-plus{
    width:38px !important;
    height:38px !important;
    min-width:38px !important;
    border-radius:10px !important;
    border:1px solid rgba(87,96,106,.38) !important;
    background:#f3f3f4 !important;
    color:#464e56 !important;
    font-size:22px !important;
    font-weight:700 !important;
    box-shadow:none !important;
}

body.mq-asset-form-open .cf_mediqNewAsset .save-cf-btn{
    min-width:135px !important;
    height:40px !important;
    border-radius:10px !important;
    border:0 !important;
    background:linear-gradient(90deg,#4b535b,#59626c) !important;
    color:#fff !important;
    font-weight:900 !important;
    box-shadow:0 10px 24px rgba(89,98,108,.18) !important;
}

/* ---------- Purchased asset list ---------- */
#mediq-dashboard .mq-assets-host{
    margin-top:14px !important;
}

#mediq-dashboard .mq-assets-host > table,
#mediq-dashboard .mq-assets-host table{
    border-collapse:separate !important;
    border-spacing:0 !important;
    border:1px solid #d7dde2 !important;
    border-radius:14px !important;
    overflow:hidden !important;
    box-shadow:0 8px 26px rgba(17,62,88,.035) !important;
}

#mediq-dashboard .mq-assets-host thead th,
#mediq-dashboard .mq-assets-host th{
    background:#f5f9fb !important;
    color:#16435e !important;
    padding:14px 16px !important;
    font-size:12px !important;
    font-weight:900 !important;
    border-bottom:1px solid #d7dde2 !important;
}

#mediq-dashboard .mq-assets-host tbody td,
#mediq-dashboard .mq-assets-host td{
    background:#fff !important;
    color:#294f68 !important;
    padding:13px 16px !important;
    border-bottom:1px solid #eef3f5 !important;
}

#mediq-dashboard .mq-assets-host tbody tr:last-child td{
    border-bottom:0 !important;
}

#mediq-dashboard .mq-assets-host tbody tr:hover td{
    background:#fcfcfd !important;
}

/* Never show a date-picker/calendar as the asset list. */
#mediq-dashboard .mq-assets-host .ui-datepicker,
#mediq-dashboard .mq-assets-host .aui-datepicker,
#mediq-dashboard .mq-assets-host [class*="datepicker"],
#mediq-dashboard .mq-assets-host [class*="calendar"]{
    display:none !important;
}

/* Actual date picker must stay above the modal when opened. */
#ui-datepicker-div,
.ui-datepicker,
.aui-datepicker,
.aui-datepicker-dialog,
[class*="datepicker-popup"]{
    z-index:10250 !important;
}
</style>


<style id="mq-v42-rtl-soft-forms">
/* ============================================================
   V42 - RTL + SOFT MODEL FORM + GREEN SUBMIT BUTTONS
   Visual-only override. No ConfiForms/Assets logic changed.
   ============================================================ */

/* ---------- RTL: both MediQ modal forms + native ConfiForms dialogs ---------- */
#mqCfModal,
#mqCfDialog,
#mqCfBody,
#mqCfBody .confiFormsFormBorder,
#mqCfBody .confiFormsFormContent,
#mqCfBody form,
#mqCfBody table,
#mqModelModal,
#mqModelDialog,
#mqModelBody,
#mqModelBody .confiFormsFormBorder,
#mqModelBody .confiFormsFormContent,
#mqModelBody form,
#mqModelBody table,
.confiFormsFormBorder.cf_mediqNewAsset,
.confiFormsFormBorder.cf_mediqNewModel,
.confiFormsFormBorder.cf_mediqNewAsset form,
.confiFormsFormBorder.cf_mediqNewModel form,
.confiFormsFormBorder.cf_mediqNewAsset table,
.confiFormsFormBorder.cf_mediqNewModel table {
    direction: rtl !important;
    text-align: right !important;
}

/* AUI/ConfiForms dialog that may be created outside our custom wrapper */
body.mq-asset-form-open .aui-dialog,
body.mq-asset-form-open .aui-dialog2,
body.mq-asset-form-open .aui-dialog-content,
body.mq-model-form-open .aui-dialog,
body.mq-model-form-open .aui-dialog2,
body.mq-model-form-open .aui-dialog-content {
    direction: rtl !important;
    text-align: right !important;
}

/* labels always on the right and aligned */
#mqCfBody td,
#mqModelBody td,
.confiFormsFormBorder.cf_mediqNewAsset td,
.confiFormsFormBorder.cf_mediqNewModel td {
    text-align: right !important;
    direction: rtl !important;
    vertical-align: middle !important;
}

#mqCfBody label,
#mqModelBody label,
.confiFormsFormBorder.cf_mediqNewAsset label,
.confiFormsFormBorder.cf_mediqNewModel label {
    display: inline-block !important;
    direction: rtl !important;
    text-align: right !important;
    color: #3d4954 !important;
    font-weight: 800 !important;
}

/* ---------- softer white controls in BOTH forms ---------- */
#mqCfBody input[type="text"],
#mqCfBody input[type="password"],
#mqCfBody input[type="date"],
#mqCfBody input[type="number"],
#mqCfBody textarea,
#mqCfBody select,
#mqModelBody input[type="text"],
#mqModelBody input[type="password"],
#mqModelBody input[type="date"],
#mqModelBody input[type="number"],
#mqModelBody textarea,
#mqModelBody select,
.confiFormsFormBorder.cf_mediqNewAsset input[type="text"],
.confiFormsFormBorder.cf_mediqNewAsset input[type="password"],
.confiFormsFormBorder.cf_mediqNewAsset input[type="date"],
.confiFormsFormBorder.cf_mediqNewAsset input[type="number"],
.confiFormsFormBorder.cf_mediqNewAsset textarea,
.confiFormsFormBorder.cf_mediqNewAsset select,
.confiFormsFormBorder.cf_mediqNewModel input[type="text"],
.confiFormsFormBorder.cf_mediqNewModel input[type="password"],
.confiFormsFormBorder.cf_mediqNewModel input[type="date"],
.confiFormsFormBorder.cf_mediqNewModel input[type="number"],
.confiFormsFormBorder.cf_mediqNewModel textarea,
.confiFormsFormBorder.cf_mediqNewModel select {
    width: 100% !important;
    min-height: 42px !important;
    padding: 8px 13px !important;
    background: #ffffff !important;
    border: 1px solid #d7e5eb !important;
    border-radius: 12px !important;
    box-shadow: 0 2px 8px rgba(7,53,83,.035) !important;
    color: #3d4954 !important;
    font-family: inherit !important;
    font-size: 13px !important;
    direction: rtl !important;
    text-align: right !important;
    transition: border-color .16s ease, box-shadow .16s ease, background .16s ease !important;
}

#mqCfBody input:focus,
#mqCfBody textarea:focus,
#mqCfBody select:focus,
#mqModelBody input:focus,
#mqModelBody textarea:focus,
#mqModelBody select:focus,
.confiFormsFormBorder.cf_mediqNewAsset input:focus,
.confiFormsFormBorder.cf_mediqNewAsset textarea:focus,
.confiFormsFormBorder.cf_mediqNewAsset select:focus,
.confiFormsFormBorder.cf_mediqNewModel input:focus,
.confiFormsFormBorder.cf_mediqNewModel textarea:focus,
.confiFormsFormBorder.cf_mediqNewModel select:focus {
    outline: none !important;
    border-color: #646f7b !important;
    box-shadow: 0 0 0 3px rgba(87,96,106,.10) !important;
    background: #fff !important;
}

/* ---------- Select2 / Assets reference controls: no gray block ---------- */
#mqCfBody .select2-container,
#mqModelBody .select2-container,
.confiFormsFormBorder.cf_mediqNewAsset .select2-container,
.confiFormsFormBorder.cf_mediqNewModel .select2-container {
    direction: rtl !important;
    background: transparent !important;
}

#mqCfBody .select2-choice,
#mqCfBody .select2-selection,
#mqCfBody .aui-select2-choice,
#mqModelBody .select2-choice,
#mqModelBody .select2-selection,
#mqModelBody .aui-select2-choice,
.confiFormsFormBorder.cf_mediqNewAsset .select2-choice,
.confiFormsFormBorder.cf_mediqNewAsset .select2-selection,
.confiFormsFormBorder.cf_mediqNewAsset .aui-select2-choice,
.confiFormsFormBorder.cf_mediqNewModel .select2-choice,
.confiFormsFormBorder.cf_mediqNewModel .select2-selection,
.confiFormsFormBorder.cf_mediqNewModel .aui-select2-choice {
    min-height: 42px !important;
    height: 42px !important;
    background: #fff !important;
    border: 1px solid #d7e5eb !important;
    border-radius: 12px !important;
    box-shadow: 0 2px 8px rgba(7,53,83,.035) !important;
    color: #3d4954 !important;
}

#mqCfBody .select2-chosen,
#mqCfBody .select2-selection__rendered,
#mqModelBody .select2-chosen,
#mqModelBody .select2-selection__rendered,
.confiFormsFormBorder.cf_mediqNewAsset .select2-chosen,
.confiFormsFormBorder.cf_mediqNewAsset .select2-selection__rendered,
.confiFormsFormBorder.cf_mediqNewModel .select2-chosen,
.confiFormsFormBorder.cf_mediqNewModel .select2-selection__rendered {
    direction: rtl !important;
    text-align: right !important;
    line-height: 40px !important;
    color: #3d4954 !important;
}

/* model quick-create form: tighter rows and softer cards */
#mqModelBody .confiFormsFormContent,
.confiFormsFormBorder.cf_mediqNewModel .confiFormsFormContent {
    padding: 10px 6px !important;
}

#mqModelBody td,
.confiFormsFormBorder.cf_mediqNewModel td {
    padding-top: 5px !important;
    padding-bottom: 5px !important;
}

#mqModelBody tr:not(.mq-form-section-row) > td:last-child,
.confiFormsFormBorder.cf_mediqNewModel tr:not(.mq-form-section-row) > td:last-child {
    background: #fff !important;
    border-radius: 13px !important;
}

#mqModelBody .mq-form-section-row td,
.confiFormsFormBorder.cf_mediqNewModel .mq-form-section-row td {
    padding-top: 9px !important;
    padding-bottom: 4px !important;
}

/* ---------- GREEN submit buttons, never Atlassian blue ---------- */
#mqCfBody .save-cf-btn,
#mqCfBody .aui-button-primary,
#mqModelBody .save-cf-btn,
#mqModelBody .aui-button-primary,
.confiFormsFormBorder.cf_mediqNewAsset .save-cf-btn,
.confiFormsFormBorder.cf_mediqNewAsset .aui-button-primary,
.confiFormsFormBorder.cf_mediqNewModel .save-cf-btn,
.confiFormsFormBorder.cf_mediqNewModel .aui-button-primary,
body.mq-asset-form-open .aui-dialog .save-cf-btn,
body.mq-asset-form-open .aui-dialog .aui-button-primary,
body.mq-model-form-open .aui-dialog .save-cf-btn,
body.mq-model-form-open .aui-dialog .aui-button-primary {
    min-width: 132px !important;
    min-height: 42px !important;
    padding: 0 18px !important;
    border: 1px solid #505962 !important;
    border-radius: 11px !important;
    background: linear-gradient(135deg,#57606a 0%,#4a525a 100%) !important;
    background-color: #57606a !important;
    color: #fff !important;
    text-shadow: none !important;
    box-shadow: 0 8px 18px rgba(87,96,106,.18) !important;
    font-family: inherit !important;
    font-weight: 900 !important;
}

#mqCfBody .save-cf-btn:hover,
#mqCfBody .aui-button-primary:hover,
#mqModelBody .save-cf-btn:hover,
#mqModelBody .aui-button-primary:hover,
.confiFormsFormBorder.cf_mediqNewAsset .save-cf-btn:hover,
.confiFormsFormBorder.cf_mediqNewAsset .aui-button-primary:hover,
.confiFormsFormBorder.cf_mediqNewModel .save-cf-btn:hover,
.confiFormsFormBorder.cf_mediqNewModel .aui-button-primary:hover {
    background: #434a52 !important;
    background-color: #434a52 !important;
    border-color: #434a52 !important;
}

/* add buttons keep same MediQ green family */
.mq-model-plus,
#mqCfBody button[type="button"].mq-model-plus,
#mqModelBody button[type="button"].mq-model-plus {
    background:#f1f2f3 !important;
    border:1px solid #afb6be !important;
    color:#444b52 !important;
    border-radius:11px !important;
}

/* footer alignment RTL */
#mqCfBody .confiFormsFormFooter,
#mqModelBody .confiFormsFormFooter,
.confiFormsFormBorder.cf_mediqNewAsset .confiFormsFormFooter,
.confiFormsFormBorder.cf_mediqNewModel .confiFormsFormFooter {
    direction: rtl !important;
    text-align: right !important;
}
</style>

<style id="mq-v43-datepicker-layer-fix">
/* ============================================================
   V43 - DATE PICKER LAYER FIX ONLY
   Keeps V42 form design unchanged and prevents calendar leakage.
   ============================================================ */
body.mq-asset-form-open #ui-datepicker-div,
body.mq-asset-form-open .ui-datepicker,
body.mq-asset-form-open .aui-datepicker,
body.mq-asset-form-open .aui-datepicker-dialog,
body.mq-asset-form-open .aui-inline-dialog,
body.mq-asset-form-open [class*="datepicker-popup"] {
    z-index: 2147483000 !important;
}

/* AUI DatePicker is often rendered as an inline-dialog outside ConfiForms. */
body > .aui-inline-dialog,
body > .aui-datepicker-dialog,
body > #ui-datepicker-div {
    z-index: 2147483000 !important;
}

/* Never let a calendar become visible inside the MediQ asset-list host. */
#mediq-dashboard .mq-assets-host .ui-datepicker,
#mediq-dashboard .mq-assets-host .aui-datepicker,
#mediq-dashboard .mq-assets-host .aui-datepicker-dialog,
#mediq-dashboard .mq-assets-host .aui-inline-dialog,
#mediq-dashboard .mq-assets-host [class*="datepicker"],
#mediq-dashboard .mq-assets-host [class*="calendar"] {
    display: none !important;
}
</style>

<script id="mq-v43-datepicker-cleanup">
(function () {
    function mqHideLooseDatePickers() {
        var selectors = [
            '#ui-datepicker-div',
            '.aui-datepicker-dialog',
            '.aui-inline-dialog'
        ];
        for (var s = 0; s < selectors.length; s++) {
            var nodes = document.querySelectorAll(selectors[s]);
            for (var i = 0; i < nodes.length; i++) {
                var n = nodes[i];
                /* Do not touch ordinary Select2 dropdowns. */
                var marker = ((n.id || '') + ' ' + (n.className || '') + ' ' + (n.textContent || '')).toLowerCase();
                var looksLikeDatePicker =
                    marker.indexOf('datepicker') >= 0 ||
                    marker.indexOf('date-picker') >= 0 ||
                    marker.indexOf('calendar') >= 0 ||
                    !!n.querySelector('.ui-datepicker, .aui-datepicker');
                if (!looksLikeDatePicker && selectors[s] === '.aui-inline-dialog') continue;
                try { n.style.zIndex = '2147483000'; } catch (ignore) {}
            }
        }
    }

    /* Raise the AUI calendar whenever the purchase-date field/icon is used. */
    document.addEventListener('mousedown', function (e) {
        if (!document.body.classList.contains('mq-asset-form-open')) return;
        var t = e.target;
        if (!t) return;
        var field = t.closest ? t.closest('[name="purchaseDate"], .aui-date-picker, [class*="date-picker"], [class*="datepicker"]') : null;
        if (!field) return;
        window.setTimeout(mqHideLooseDatePickers, 0);
        window.setTimeout(mqHideLooseDatePickers, 40);
        window.setTimeout(mqHideLooseDatePickers, 120);
    }, true);

    document.addEventListener('focusin', function (e) {
        var t = e.target;
        if (!t || !document.body.classList.contains('mq-asset-form-open')) return;
        if ((t.name || '') === 'purchaseDate') {
            window.setTimeout(mqHideLooseDatePickers, 0);
            window.setTimeout(mqHideLooseDatePickers, 80);
        }
    }, true);
})();
</script>


<!-- ============================================================
     MEDIQ V44 - PERSIAN (JALALI) PURCHASE DATE PICKER
     Visual Persian date, Gregorian MMM dd, yyyy stored for ConfiForms
     ============================================================ -->
<style id="mq-v44-jalali-datepicker-style">
/* Hide the original ConfiForms purchaseDate control only after our Jalali proxy is ready. */
#mqCfBody .mq-jalali-real-date,
.confiFormsFormBorder.cf_mediqNewAsset .mq-jalali-real-date {
    position: absolute !important;
    width: 1px !important;
    height: 1px !important;
    min-width: 1px !important;
    min-height: 1px !important;
    opacity: 0 !important;
    pointer-events: none !important;
    padding: 0 !important;
    margin: 0 !important;
    border: 0 !important;
    overflow: hidden !important;
}

.mq-jalali-shell {
    position: relative !important;
    display: flex !important;
    align-items: center !important;
    gap: 8px !important;
    width: 100% !important;
    direction: rtl !important;
}

.mq-jalali-input {
    width: 100% !important;
    min-height: 42px !important;
    padding: 8px 44px 8px 13px !important;
    background: #fff !important;
    border: 1px solid #d7e5eb !important;
    border-radius: 12px !important;
    box-shadow: 0 2px 8px rgba(7,53,83,.035) !important;
    color: #3d4954 !important;
    font-family: inherit !important;
    font-size: 13px !important;
    direction: rtl !important;
    text-align: right !important;
    cursor: pointer !important;
    outline: none !important;
}

.mq-jalali-input:focus {
    border-color: #646f7b !important;
    box-shadow: 0 0 0 3px rgba(87,96,106,.10) !important;
}

.mq-jalali-calendar-btn {
    position: absolute !important;
    left: 10px !important;
    top: 50% !important;
    transform: translateY(-50%) !important;
    width: 30px !important;
    height: 30px !important;
    border: 0 !important;
    border-radius: 9px !important;
    background: #f1f2f3 !important;
    color: #444b52 !important;
    display: inline-flex !important;
    align-items: center !important;
    justify-content: center !important;
    cursor: pointer !important;
    font-size: 16px !important;
    line-height: 1 !important;
    padding: 0 !important;
    box-shadow: none !important;
}

.mq-jalali-calendar-btn:hover {
    background: #e6e8e9 !important;
}

#mqJalaliPicker {
    position: fixed !important;
    z-index: 2147483646 !important;
    width: 326px !important;
    background: #fff !important;
    border: 1px solid #d7e5eb !important;
    border-radius: 16px !important;
    box-shadow: 0 22px 60px rgba(3,35,55,.25) !important;
    padding: 12px !important;
    direction: rtl !important;
    font-family: inherit !important;
    color: #3d4954 !important;
}

#mqJalaliPicker[hidden] { display: none !important; }

#mqJalaliPicker .mq-jp-head {
    display: grid !important;
    grid-template-columns: 38px 1fr 38px !important;
    align-items: center !important;
    gap: 8px !important;
    margin-bottom: 10px !important;
}

#mqJalaliPicker .mq-jp-title {
    text-align: center !important;
    font-size: 14px !important;
    font-weight: 900 !important;
    color: #34414d !important;
}

#mqJalaliPicker .mq-jp-nav {
    width: 38px !important;
    height: 34px !important;
    border: 1px solid #d7e5eb !important;
    border-radius: 10px !important;
    background: #f9fafa !important;
    color: #3d444a !important;
    cursor: pointer !important;
    font-size: 18px !important;
    font-weight: 900 !important;
    padding: 0 !important;
}

#mqJalaliPicker .mq-jp-week,
#mqJalaliPicker .mq-jp-days {
    display: grid !important;
    grid-template-columns: repeat(7, 1fr) !important;
    gap: 4px !important;
}

#mqJalaliPicker .mq-jp-week {
    margin-bottom: 4px !important;
}

#mqJalaliPicker .mq-jp-week span {
    min-height: 28px !important;
    display: flex !important;
    align-items: center !important;
    justify-content: center !important;
    color: #6b8596 !important;
    font-size: 11px !important;
    font-weight: 800 !important;
}

#mqJalaliPicker .mq-jp-day,
#mqJalaliPicker .mq-jp-empty {
    height: 34px !important;
    border-radius: 9px !important;
}

#mqJalaliPicker .mq-jp-day {
    border: 0 !important;
    background: transparent !important;
    color: #3d4954 !important;
    cursor: pointer !important;
    font-family: inherit !important;
    font-size: 12px !important;
    font-weight: 800 !important;
    padding: 0 !important;
}

#mqJalaliPicker .mq-jp-day:hover {
    background: #f1f2f3 !important;
    color: #444b52 !important;
}

#mqJalaliPicker .mq-jp-day.today {
    box-shadow: inset 0 0 0 1px #646f7b !important;
}

#mqJalaliPicker .mq-jp-day.selected {
    background: linear-gradient(135deg,#57606a 0%,#4a525a 100%) !important;
    color: #fff !important;
    box-shadow: 0 5px 12px rgba(87,96,106,.18) !important;
}

#mqJalaliPicker .mq-jp-foot {
    display: flex !important;
    justify-content: space-between !important;
    gap: 8px !important;
    margin-top: 9px !important;
    padding-top: 9px !important;
    border-top: 1px solid #edf3f5 !important;
}

#mqJalaliPicker .mq-jp-foot button {
    border: 0 !important;
    border-radius: 9px !important;
    min-height: 32px !important;
    padding: 0 11px !important;
    background: #f2f7f9 !important;
    color: #47677d !important;
    cursor: pointer !important;
    font-family: inherit !important;
    font-size: 11px !important;
    font-weight: 800 !important;
}

#mqJalaliPicker .mq-jp-foot button.primary {
    background: #f1f2f3 !important;
    color: #444b52 !important;
}

/* Disable/hide the native AUI calendar trigger beside purchaseDate after Jalali UI is mounted. */
.mq-jalali-host .aui-iconfont-calendar,
.mq-jalali-host [class*="calendar-icon"],
.mq-jalali-host [aria-label*="calendar" i],
.mq-jalali-host [title*="calendar" i],
.mq-jalali-host [aria-label*="date" i][role="button"],
.mq-jalali-host [title*="date" i][role="button"] {
    display: none !important;
}

/* The asset list must never display any calendar implementation. */
#mediq-dashboard .mq-assets-host #mqJalaliPicker,
#mediq-dashboard .mq-assets-host .mq-jalali-shell,
#mediq-dashboard .mq-assets-host .ui-datepicker,
#mediq-dashboard .mq-assets-host .aui-datepicker,
#mediq-dashboard .mq-assets-host .aui-datepicker-dialog,
#mediq-dashboard .mq-assets-host [class*="calendar"] {
    display: none !important;
}
</style>

<script id="mq-v44-jalali-datepicker-script">
(function () {
    'use strict';

    var MONTHS_FA = [
        'فروردین','اردیبهشت','خرداد','تیر','مرداد','شهریور',
        'مهر','آبان','آذر','دی','بهمن','اسفند'
    ];
    var WEEK_FA = ['ش','ی','د','س','چ','پ','ج'];
    var G_MONTHS = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'];

    function div(a, b) { return Math.trunc(a / b); }
    function mod(a, b) { return a - Math.trunc(a / b) * b; }

    function jalCal(jy, withoutLeap) {
        var breaks = [-61, 9, 38, 199, 426, 686, 756, 818, 1111, 1181, 1210,
            1635, 2060, 2097, 2192, 2262, 2324, 2394, 2456, 3178];
        var bl = breaks.length;
        var gy = jy + 621;
        var leapJ = -14;
        var jp = breaks[0];
        var jm, jump, leap, leapG, march, n, i;

        if (jy < jp || jy >= breaks[bl - 1]) throw new Error('Invalid Jalaali year ' + jy);

        for (i = 1; i < bl; i += 1) {
            jm = breaks[i];
            jump = jm - jp;
            if (jy < jm) break;
            leapJ = leapJ + div(jump, 33) * 8 + div(mod(jump, 33), 4);
            jp = jm;
        }
        n = jy - jp;
        leapJ = leapJ + div(n, 33) * 8 + div(mod(n, 33) + 3, 4);
        if (mod(jump, 33) === 4 && jump - n === 4) leapJ += 1;

        leapG = div(gy, 4) - div((div(gy, 100) + 1) * 3, 4) - 150;
        march = 20 + leapJ - leapG;

        if (withoutLeap) return { gy: gy, march: march };

        if (jump - n < 6) n = n - jump + div(jump + 4, 33) * 33;
        leap = mod(mod(n + 1, 33) - 1, 4);
        if (leap === -1) leap = 4;

        return { leap: leap, gy: gy, march: march };
    }

    function g2d(gy, gm, gd) {
        var d = div((gy + div(gm - 8, 6) + 100100) * 1461, 4)
            + div(153 * mod(gm + 9, 12) + 2, 5)
            + gd - 34840408;
        d = d - div(div(gy + 100100 + div(gm - 8, 6), 100) * 3, 4) + 752;
        return d;
    }

    function d2g(jdn) {
        var j = 4 * jdn + 139361631;
        j = j + div(div(4 * jdn + 183187720, 146097) * 3, 4) * 4 - 3908;
        var i = div(mod(j, 1461), 4) * 5 + 308;
        var gd = div(mod(i, 153), 5) + 1;
        var gm = mod(div(i, 153), 12) + 1;
        var gy = div(j, 1461) - 100100 + div(8 - gm, 6);
        return { gy: gy, gm: gm, gd: gd };
    }

    function j2d(jy, jm, jd) {
        var r = jalCal(jy, true);
        return g2d(r.gy, 3, r.march) + (jm - 1) * 31 - div(jm, 7) * (jm - 7) + jd - 1;
    }

    function d2j(jdn) {
        var g = d2g(jdn);
        var jy = g.gy - 621;
        var r = jalCal(jy, false);
        var jdn1f = g2d(g.gy, 3, r.march);
        var k = jdn - jdn1f;
        if (k >= 0) {
            if (k <= 185) return { jy: jy, jm: 1 + div(k, 31), jd: mod(k, 31) + 1 };
            k -= 186;
        } else {
            jy -= 1;
            k += 179;
            if (r.leap === 1) k += 1;
        }
        return { jy: jy, jm: 7 + div(k, 30), jd: mod(k, 30) + 1 };
    }

    function toGregorian(jy, jm, jd) { return d2g(j2d(jy, jm, jd)); }
    function toJalaali(gy, gm, gd) { return d2j(g2d(gy, gm, gd)); }
    function isLeapJalaaliYear(jy) { return jalCal(jy, false).leap === 0; }
    function jalaaliMonthLength(jy, jm) {
        if (jm <= 6) return 31;
        if (jm <= 11) return 30;
        return isLeapJalaaliYear(jy) ? 30 : 29;
    }

    function faDigits(value) {
        return String(value).replace(/\d/g, function (d) { return '۰۱۲۳۴۵۶۷۸۹'[Number(d)]; });
    }

    function enDigits(value) {
        return String(value || '')
            .replace(/[۰-۹]/g, function (d) { return '۰۱۲۳۴۵۶۷۸۹'.indexOf(d); })
            .replace(/[٠-٩]/g, function (d) { return '٠١٢٣٤٥٦٧٨٩'.indexOf(d); });
    }

    function pad2(n) { return n < 10 ? '0' + n : String(n); }

    function formatJalali(j) {
        return faDigits(j.jy + '/' + pad2(j.jm) + '/' + pad2(j.jd));
    }

    function formatGregorianForConfiForms(g) {
        return G_MONTHS[g.gm - 1] + ' ' + pad2(g.gd) + ', ' + g.gy;
    }

    function parseGregorian(value) {
        value = enDigits(value).trim();
        if (!value) return null;

        var m = value.match(/^([A-Za-z]{3})\s+(\d{1,2}),\s*(\d{4})$/);
        if (m) {
            var gm = G_MONTHS.map(function (x) { return x.toLowerCase(); }).indexOf(m[1].toLowerCase()) + 1;
            if (gm > 0) return { gy: Number(m[3]), gm: gm, gd: Number(m[2]) };
        }

        m = value.match(/^(\d{4})[-\/]([01]?\d)[-\/]([0-3]?\d)$/);
        if (m && Number(m[1]) > 1700) {
            return { gy: Number(m[1]), gm: Number(m[2]), gd: Number(m[3]) };
        }

        var d = new Date(value);
        if (!isNaN(d.getTime())) {
            return { gy: d.getFullYear(), gm: d.getMonth() + 1, gd: d.getDate() };
        }
        return null;
    }

    function parseJalali(value) {
        value = enDigits(value).trim();
        var m = value.match(/^(1[2-5]\d{2})[-\/]([01]?\d)[-\/]([0-3]?\d)$/);
        if (!m) return null;
        var j = { jy: Number(m[1]), jm: Number(m[2]), jd: Number(m[3]) };
        if (j.jm < 1 || j.jm > 12 || j.jd < 1 || j.jd > jalaaliMonthLength(j.jy, j.jm)) return null;
        return j;
    }

    var picker = null;
    var active = null;
    var viewJ = null;

    function ensurePicker() {
        if (picker) return picker;
        picker = document.createElement('div');
        picker.id = 'mqJalaliPicker';
        picker.hidden = true;
        picker.innerHTML =
            '<div class="mq-jp-head">' +
                '<button type="button" class="mq-jp-nav mq-jp-next" aria-label="ماه بعد">‹</button>' +
                '<div class="mq-jp-title"></div>' +
                '<button type="button" class="mq-jp-nav mq-jp-prev" aria-label="ماه قبل">›</button>' +
            '</div>' +
            '<div class="mq-jp-week">' + WEEK_FA.map(function (d) { return '<span>' + d + '</span>'; }).join('') + '</div>' +
            '<div class="mq-jp-days"></div>' +
            '<div class="mq-jp-foot">' +
                '<button type="button" class="mq-jp-clear">پاک کردن</button>' +
                '<button type="button" class="mq-jp-today primary">امروز</button>' +
            '</div>';
        document.body.appendChild(picker);

        picker.querySelector('.mq-jp-prev').onclick = function () { changeMonth(-1); };
        picker.querySelector('.mq-jp-next').onclick = function () { changeMonth(1); };
        picker.querySelector('.mq-jp-today').onclick = function () {
            var now = new Date();
            selectJalali(toJalaali(now.getFullYear(), now.getMonth() + 1, now.getDate()));
        };
        picker.querySelector('.mq-jp-clear').onclick = function () {
            if (!active) return;
            setRealDate(active.real, '');
            active.proxy.value = '';
            closePicker();
        };

        return picker;
    }

    function changeMonth(delta) {
        if (!viewJ) return;
        var jy = viewJ.jy;
        var jm = viewJ.jm + delta;
        if (jm < 1) { jm = 12; jy -= 1; }
        if (jm > 12) { jm = 1; jy += 1; }
        viewJ = { jy: jy, jm: jm, jd: 1 };
        renderPicker();
    }

    function selectedJalali() {
        if (!active || !active.real.value) return null;
        var g = parseGregorian(active.real.value);
        if (g) return toJalaali(g.gy, g.gm, g.gd);
        var j = parseJalali(active.real.value);
        return j || null;
    }

    function renderPicker() {
        ensurePicker();
        var title = picker.querySelector('.mq-jp-title');
        var daysHost = picker.querySelector('.mq-jp-days');
        title.textContent = MONTHS_FA[viewJ.jm - 1] + ' ' + faDigits(viewJ.jy);

        var firstG = toGregorian(viewJ.jy, viewJ.jm, 1);
        var firstDate = new Date(firstG.gy, firstG.gm - 1, firstG.gd);
        var offset = (firstDate.getDay() + 1) % 7; // Saturday = 0
        var len = jalaaliMonthLength(viewJ.jy, viewJ.jm);
        var now = new Date();
        var todayJ = toJalaali(now.getFullYear(), now.getMonth() + 1, now.getDate());
        var selected = selectedJalali();
        var html = '';

        for (var i = 0; i < offset; i++) html += '<span class="mq-jp-empty"></span>';
        for (var d = 1; d <= len; d++) {
            var cls = 'mq-jp-day';
            if (todayJ.jy === viewJ.jy && todayJ.jm === viewJ.jm && todayJ.jd === d) cls += ' today';
            if (selected && selected.jy === viewJ.jy && selected.jm === viewJ.jm && selected.jd === d) cls += ' selected';
            html += '<button type="button" class="' + cls + '" data-day="' + d + '">' + faDigits(d) + '</button>';
        }
        daysHost.innerHTML = html;

        var buttons = daysHost.querySelectorAll('.mq-jp-day');
        for (var b = 0; b < buttons.length; b++) {
            buttons[b].onclick = function () {
                selectJalali({ jy: viewJ.jy, jm: viewJ.jm, jd: Number(this.getAttribute('data-day')) });
            };
        }
    }

    function setRealDate(real, value) {
        real.value = value;
        real.setAttribute('value', value);
        try { real.dispatchEvent(new Event('input', { bubbles: true })); } catch (e) {}
        try { real.dispatchEvent(new Event('change', { bubbles: true })); } catch (e) {}
        try { real.dispatchEvent(new Event('blur', { bubbles: true })); } catch (e) {}
        try {
            if (window.AJS && AJS.$) {
                AJS.$(real).val(value).trigger('input').trigger('change');
            }
        } catch (e) {}
    }

    function selectJalali(j) {
        if (!active) return;
        var g = toGregorian(j.jy, j.jm, j.jd);
        setRealDate(active.real, formatGregorianForConfiForms(g));
        active.proxy.value = formatJalali(j);
        closePicker();
    }

    function positionPicker() {
        if (!active || !picker || picker.hidden) return;
        var r = active.proxy.getBoundingClientRect();
        var width = 326;
        var left = Math.max(10, Math.min(window.innerWidth - width - 10, r.right - width));
        var top = r.bottom + 8;
        var h = picker.offsetHeight || 355;
        if (top + h > window.innerHeight - 10) top = Math.max(10, r.top - h - 8);
        picker.style.left = left + 'px';
        picker.style.top = top + 'px';
    }

    function openPicker(item) {
        active = item;
        ensurePicker();

        var selected = selectedJalali();
        if (selected) {
            viewJ = { jy: selected.jy, jm: selected.jm, jd: 1 };
        } else {
            var now = new Date();
            var j = toJalaali(now.getFullYear(), now.getMonth() + 1, now.getDate());
            viewJ = { jy: j.jy, jm: j.jm, jd: 1 };
        }

        renderPicker();
        picker.hidden = false;
        positionPicker();
    }

    function closePicker() {
        if (picker) picker.hidden = true;
        active = null;
    }

    function hideNativeDateTrigger(host, real, shell) {
        var nodes = host.querySelectorAll('*');
        for (var i = 0; i < nodes.length; i++) {
            var el = nodes[i];
            if (el === real || el === shell || shell.contains(el)) continue;
            var marker = ((el.id || '') + ' ' + (el.className || '') + ' ' + (el.getAttribute('title') || '') + ' ' + (el.getAttribute('aria-label') || '')).toLowerCase();
            if (marker.indexOf('calendar') >= 0 || marker.indexOf('datepicker') >= 0 || marker.indexOf('date-picker') >= 0) {
                el.style.display = 'none';
            }
        }
    }

    function syncExistingValue(real, proxy) {
        var j = parseJalali(real.value);
        if (j) {
            var g = toGregorian(j.jy, j.jm, j.jd);
            setRealDate(real, formatGregorianForConfiForms(g));
            proxy.value = formatJalali(j);
            return;
        }
        var g2 = parseGregorian(real.value);
        if (g2) {
            proxy.value = formatJalali(toJalaali(g2.gy, g2.gm, g2.gd));
        }
    }

    function initRealInput(real) {
        if (!real || real.getAttribute('data-mq-jalali-ready') === '1') return;
        real.setAttribute('data-mq-jalali-ready', '1');

        var host = real.parentElement;
        if (!host) return;
        host.classList.add('mq-jalali-host');

        var shell = document.createElement('div');
        shell.className = 'mq-jalali-shell';

        var proxy = document.createElement('input');
        proxy.type = 'text';
        proxy.className = 'mq-jalali-input';
        proxy.placeholder = 'تاریخ شمسی را انتخاب کنید';
        proxy.readOnly = true;
        proxy.autocomplete = 'off';
        proxy.setAttribute('aria-label', 'تاریخ خرید شمسی');

        var button = document.createElement('button');
        button.type = 'button';
        button.className = 'mq-jalali-calendar-btn';
        button.setAttribute('aria-label', 'باز کردن تقویم شمسی');
        button.innerHTML = '📅';

        shell.appendChild(proxy);
        shell.appendChild(button);
        host.insertBefore(shell, real);

        real.classList.add('mq-jalali-real-date');
        hideNativeDateTrigger(host, real, shell);
        syncExistingValue(real, proxy);

        var item = { real: real, proxy: proxy, shell: shell };
        proxy.addEventListener('click', function (e) { e.preventDefault(); e.stopPropagation(); openPicker(item); });
        button.addEventListener('click', function (e) { e.preventDefault(); e.stopPropagation(); openPicker(item); });
        proxy.addEventListener('focus', function () { openPicker(item); });
    }

    function scan() {
        var roots = [document.getElementById('mqCfBody')];
        var assetForms = document.querySelectorAll('.confiFormsFormBorder.cf_mediqNewAsset');
        for (var x = 0; x < assetForms.length; x++) roots.push(assetForms[x]);

        for (var r = 0; r < roots.length; r++) {
            if (!roots[r]) continue;
            var inputs = roots[r].querySelectorAll('input[name="purchaseDate"], input[id*="purchaseDate"], input[data-field-name="purchaseDate"]');
            for (var i = 0; i < inputs.length; i++) initRealInput(inputs[i]);
        }
    }

    document.addEventListener('click', function (e) {
        if (picker && !picker.hidden && active) {
            if (!picker.contains(e.target) && !active.shell.contains(e.target)) closePicker();
        }

        var text = ((e.target && (e.target.textContent || e.target.value)) || '').replace(/\s+/g, ' ').trim();
        if (text.indexOf('ثبت دارایی جدید') >= 0) {
            window.setTimeout(scan, 40);
            window.setTimeout(scan, 150);
            window.setTimeout(scan, 400);
        }
    }, true);

    window.addEventListener('resize', positionPicker);
    window.addEventListener('scroll', function () { if (picker && !picker.hidden) positionPicker(); }, true);

    var observer = new MutationObserver(function () { window.setTimeout(scan, 0); });
    if (document.body) observer.observe(document.body, { childList: true, subtree: true });

    window.mqInitJalaliPurchaseDate = scan;
    window.setTimeout(scan, 100);
    window.setTimeout(scan, 600);
})();
</script>

<style id="mq-v46-reference-buttons-style">
/* ============================================================
   MEDIQ V46 - visible + buttons + child modal polish
   ============================================================ */
body.mq-model-form-open .cf_mediqNewModel .mq-reference-cell-v46{
    background:#fff !important;
}

body.mq-model-form-open .cf_mediqNewModel .mq-reference-control-wrap-v46{
    width:100% !important;
    display:flex !important;
    flex-direction:row !important;
    align-items:center !important;
    gap:8px !important;
    direction:ltr !important;
}

body.mq-model-form-open .cf_mediqNewModel .mq-reference-control-wrap-v46 > .select2-container,
body.mq-model-form-open .cf_mediqNewModel .mq-reference-control-wrap-v46 > select,
body.mq-model-form-open .cf_mediqNewModel .mq-reference-control-wrap-v46 > input{
    flex:1 1 auto !important;
    min-width:0 !important;
    width:auto !important;
    max-width:none !important;
    direction:rtl !important;
}

.mq-reference-plus-v46{
    flex:0 0 38px !important;
    width:38px !important;
    min-width:38px !important;
    height:38px !important;
    padding:0 !important;
    margin:0 !important;
    border:1px solid #afb6be !important;
    border-radius:11px !important;
    background:#f1f2f3 !important;
    color:#444b52 !important;
    font:900 22px/36px Tahoma,Arial,sans-serif !important;
    text-align:center !important;
    cursor:pointer !important;
    box-shadow:none !important;
    transition:.16s ease !important;
}

.mq-reference-plus-v46:hover{
    background:#57606a !important;
    border-color:#57606a !important;
    color:#fff !important;
}

.mq-reference-plus-v46:focus{
    outline:none !important;
    box-shadow:0 0 0 4px rgba(87,96,106,.14) !important;
}

#mqReferenceModalV46{
    position:fixed !important;
    inset:0 !important;
    z-index:2147483300 !important;
    display:none !important;
    align-items:center !important;
    justify-content:center !important;
    padding:24px !important;
    background:rgba(3,35,55,.56) !important;
    backdrop-filter:blur(3px) !important;
    direction:rtl !important;
}

#mqReferenceModalV46.open{
    display:flex !important;
}

body:not(.mq-reference-form-open-v46) .cf_mediqNewEquipmentTitle,
body:not(.mq-reference-form-open-v46) .cf_mediqNewManufacturer,
body:not(.mq-reference-form-open-v46) .cf_mediqNewFacility,
body:not(.mq-reference-form-open-v46) .cf_mediqNewClassification{
    position:fixed !important;
    left:-200vw !important;
    top:0 !important;
    width:1px !important;
    height:1px !important;
    max-width:1px !important;
    max-height:1px !important;
    overflow:hidden !important;
    opacity:0 !important;
    visibility:hidden !important;
    pointer-events:none !important;
    margin:0 !important;
    padding:0 !important;
}

body.mq-reference-form-open-v46 .mq-reference-panel-v46{
    display:block !important;
    position:fixed !important;
    z-index:2147483400 !important;
    left:50% !important;
    top:50% !important;
    transform:translate(-50%,-50%) !important;
    width:min(760px,94vw) !important;
    max-width:94vw !important;
    height:auto !important;
    max-height:86vh !important;
    overflow-y:auto !important;
    overflow-x:hidden !important;
    margin:0 !important;
    padding:0 !important;
    opacity:1 !important;
    visibility:visible !important;
    pointer-events:auto !important;
    background:#fff !important;
    border:1px solid #d7dde2 !important;
    border-radius:20px !important;
    box-shadow:0 30px 90px rgba(3,35,55,.31) !important;
    direction:rtl !important;
    text-align:right !important;
}

body.mq-reference-form-open-v46 .mq-reference-panel-v46 .confiFormsFormTitle{
    display:flex !important;
    align-items:center !important;
    justify-content:space-between !important;
    gap:12px !important;
    position:sticky !important;
    top:0 !important;
    z-index:20 !important;
    margin:0 !important;
    padding:17px 20px !important;
    background:#fff !important;
    border-bottom:1px solid #e1e5e8 !important;
}

body.mq-reference-form-open-v46 .mq-reference-panel-v46 .confiFormsFormContent{
    padding:14px 18px 18px !important;
    overflow:visible !important;
    background:#fff !important;
}

body.mq-reference-form-open-v46 .mq-reference-panel-v46 .confiFormsFormFooter{
    padding:12px 18px 18px !important;
    background:#fff !important;
    direction:rtl !important;
    text-align:right !important;
}

body.mq-reference-form-open-v46 .mq-reference-panel-v46 form,
body.mq-reference-form-open-v46 .mq-reference-panel-v46 table{
    width:100% !important;
    max-width:100% !important;
    direction:rtl !important;
    text-align:right !important;
}

body.mq-reference-form-open-v46 .mq-reference-panel-v46 td{
    padding:6px 8px !important;
    border:0 !important;
    direction:rtl !important;
    text-align:right !important;
    vertical-align:middle !important;
    background:#fff !important;
}

body.mq-reference-form-open-v46 .mq-reference-panel-v46 label{
    color:#3d4954 !important;
    font-weight:800 !important;
    direction:rtl !important;
    text-align:right !important;
}

body.mq-reference-form-open-v46 .mq-reference-panel-v46 input[type="text"],
body.mq-reference-form-open-v46 .mq-reference-panel-v46 input[type="number"],
body.mq-reference-form-open-v46 .mq-reference-panel-v46 input[type="date"],
body.mq-reference-form-open-v46 .mq-reference-panel-v46 textarea,
body.mq-reference-form-open-v46 .mq-reference-panel-v46 select,
body.mq-reference-form-open-v46 .mq-reference-panel-v46 .select2-choice,
body.mq-reference-form-open-v46 .mq-reference-panel-v46 .select2-selection,
body.mq-reference-form-open-v46 .mq-reference-panel-v46 .aui-select2-choice{
    width:100% !important;
    min-height:42px !important;
    padding:8px 13px !important;
    background:#fff !important;
    border:1px solid #d7e5eb !important;
    border-radius:12px !important;
    box-shadow:0 2px 8px rgba(7,53,83,.035) !important;
    color:#3d4954 !important;
    font-family:inherit !important;
    font-size:13px !important;
    direction:rtl !important;
    text-align:right !important;
}

body.mq-reference-form-open-v46 .mq-reference-panel-v46 .save-cf-btn,
body.mq-reference-form-open-v46 .mq-reference-panel-v46 .aui-button-primary{
    min-width:132px !important;
    min-height:42px !important;
    padding:0 18px !important;
    border:1px solid #505962 !important;
    border-radius:11px !important;
    background:linear-gradient(135deg,#57606a 0%,#4a525a 100%) !important;
    background-color:#57606a !important;
    color:#fff !important;
    text-shadow:none !important;
    box-shadow:0 8px 18px rgba(87,96,106,.18) !important;
    font-family:inherit !important;
    font-weight:900 !important;
}

body.mq-reference-form-open-v46 .select2-drop,
body.mq-reference-form-open-v46 .select2-dropdown,
body.mq-reference-form-open-v46 .aui-select2-drop{
    z-index:2147483500 !important;
}
</style>



<style id="mq-v48-clean-form-style">
/* ============================================================
   MEDIQ V48 - full width dropdowns + nested Classification modal
   ============================================================ */

body.mq-model-form-open .cf_mediqNewModel .mq-reference-control-wrap-v46{
    width:100% !important;
    max-width:100% !important;
    display:grid !important;
    grid-template-columns:minmax(0,1fr) 42px !important;
    align-items:center !important;
    gap:8px !important;
    direction:ltr !important;
}

body.mq-model-form-open .cf_mediqNewModel .mq-reference-control-wrap-v46 > .select2-container,
body.mq-model-form-open .cf_mediqNewModel .mq-reference-control-wrap-v46 > select,
body.mq-model-form-open .cf_mediqNewModel .mq-reference-control-wrap-v46 > input{
    grid-column:1 !important;
    width:100% !important;
    max-width:100% !important;
    min-width:0 !important;
    flex:none !important;
    display:block !important;
    direction:rtl !important;
}

body.mq-model-form-open .cf_mediqNewModel .mq-reference-control-wrap-v46 > .mq-reference-plus-v46{
    grid-column:2 !important;
    width:42px !important;
    min-width:42px !important;
    max-width:42px !important;
    height:42px !important;
    min-height:42px !important;
}

body.mq-model-form-open .cf_mediqNewModel .mq-reference-control-wrap-v46 .select2-choice,
body.mq-model-form-open .cf_mediqNewModel .mq-reference-control-wrap-v46 .select2-selection,
body.mq-model-form-open .cf_mediqNewModel .mq-reference-control-wrap-v46 .aui-select2-choice{
    width:100% !important;
    max-width:100% !important;
    min-width:0 !important;
    min-height:42px !important;
    height:42px !important;
    border:1px solid #d7e5eb !important;
    border-radius:12px !important;
    background:#fff !important;
    box-shadow:none !important;
    direction:rtl !important;
    text-align:right !important;
}

body.mq-model-form-open .cf_mediqNewModel .mq-reference-control-wrap-v46 .select2-chosen,
body.mq-model-form-open .cf_mediqNewModel .mq-reference-control-wrap-v46 .select2-selection__rendered{
    width:100% !important;
    line-height:40px !important;
    padding:0 12px !important;
    direction:rtl !important;
    text-align:right !important;
}

/* Equipment Title -> Group [+] */
body.mq-reference-form-open-v46 .mq-reference-panel-v46[data-mq-reference-form="mediqNewEquipmentTitle"] .mq-nested-ref-wrap-v48{
    width:100% !important;
    max-width:100% !important;
    display:grid !important;
    grid-template-columns:minmax(0,1fr) 42px !important;
    align-items:center !important;
    gap:8px !important;
    direction:ltr !important;
}

body.mq-reference-form-open-v46 .mq-reference-panel-v46[data-mq-reference-form="mediqNewEquipmentTitle"] .mq-nested-ref-wrap-v48 > .select2-container,
body.mq-reference-form-open-v46 .mq-reference-panel-v46[data-mq-reference-form="mediqNewEquipmentTitle"] .mq-nested-ref-wrap-v48 > select,
body.mq-reference-form-open-v46 .mq-reference-panel-v46[data-mq-reference-form="mediqNewEquipmentTitle"] .mq-nested-ref-wrap-v48 > input{
    grid-column:1 !important;
    width:100% !important;
    max-width:100% !important;
    min-width:0 !important;
}

body.mq-reference-form-open-v46 .mq-reference-panel-v46[data-mq-reference-form="mediqNewEquipmentTitle"] .mq-nested-ref-wrap-v48 > .mq-equipment-title-group-plus-v48{
    grid-column:2 !important;
    width:42px !important;
    min-width:42px !important;
    height:42px !important;
}

/* Nested Classification modal */
#mqNestedReferenceModalV48{
    position:fixed !important;
    inset:0 !important;
    z-index:2147483600 !important;
    display:none !important;
    align-items:center !important;
    justify-content:center !important;
    padding:24px !important;
    background:rgba(3,35,55,.44) !important;
    backdrop-filter:blur(2px) !important;
    direction:rtl !important;
}

#mqNestedReferenceModalV48.open{
    display:flex !important;
}

body.mq-nested-reference-open-v48 .mq-nested-reference-panel-v48{
    position:fixed !important;
    z-index:2147483700 !important;
    top:50% !important;
    left:50% !important;
    transform:translate(-50%,-50%) !important;
    display:block !important;
    width:min(700px,92vw) !important;
    max-width:92vw !important;
    max-height:82vh !important;
    overflow:auto !important;
    opacity:1 !important;
    visibility:visible !important;
    pointer-events:auto !important;
    border:1px solid #d7dde2 !important;
    border-radius:20px !important;
    background:#fff !important;
    box-shadow:0 30px 90px rgba(3,35,55,.30) !important;
    direction:rtl !important;
    text-align:right !important;
}

body.mq-nested-reference-open-v48 .mq-nested-reference-panel-v48 form,
body.mq-nested-reference-open-v48 .mq-nested-reference-panel-v48 table{
    width:100% !important;
    max-width:100% !important;
    direction:rtl !important;
    text-align:right !important;
}

body.mq-nested-reference-open-v48 .mq-nested-reference-panel-v48 td{
    padding:7px 10px !important;
    border:0 !important;
    background:#fff !important;
    direction:rtl !important;
    text-align:right !important;
}

body.mq-nested-reference-open-v48 .mq-nested-reference-panel-v48 input[type="text"],
body.mq-nested-reference-open-v48 .mq-nested-reference-panel-v48 textarea,
body.mq-nested-reference-open-v48 .mq-nested-reference-panel-v48 select,
body.mq-nested-reference-open-v48 .mq-nested-reference-panel-v48 .select2-container,
body.mq-nested-reference-open-v48 .mq-nested-reference-panel-v48 .select2-choice,
body.mq-nested-reference-open-v48 .mq-nested-reference-panel-v48 .select2-selection{
    width:100% !important;
    max-width:100% !important;
    min-height:42px !important;
    border-radius:12px !important;
    background:#fff !important;
}

body.mq-nested-reference-open-v48 .select2-drop,
body.mq-nested-reference-open-v48 .select2-dropdown,
body.mq-nested-reference-open-v48 .aui-select2-drop{
    z-index:2147483800 !important;
}
</style>


<style id="mq-v50-top-down-registration">
/* ============================================================
   MEDIQ V50 - TOP-DOWN REGISTRATION UI
   ============================================================ */

#mqRegistrationFlowBackdropV50{
    position:fixed !important;
    inset:0 !important;
    z-index:2147483000 !important;
    display:none !important;
    background:rgba(3,35,55,.56) !important;
    backdrop-filter:blur(4px) !important;
}

#mqRegistrationFlowBackdropV50.open{
    display:block !important;
}

body.mq-flow-open-v50 #mqCfModal,
body.mq-flow-open-v50 #mqModelModal,
body.mq-flow-open-v50 #mqReferenceModalV46,
body.mq-flow-open-v50 #mqNestedReferenceModalV48{
    display:none !important;
}

body.mq-flow-open-v50 .mq-flow-active-panel-v50{
    display:block !important;
    position:fixed !important;
    z-index:2147483100 !important;
    left:50% !important;
    top:50% !important;
    transform:translate(-50%,-50%) !important;
    width:min(860px,94vw) !important;
    max-width:94vw !important;
    height:auto !important;
    max-height:88vh !important;
    overflow-y:auto !important;
    overflow-x:hidden !important;
    margin:0 !important;
    padding:0 !important;
    opacity:1 !important;
    visibility:visible !important;
    pointer-events:auto !important;
    background:#fff !important;
    border:1px solid #d7dde2 !important;
    border-radius:22px !important;
    box-shadow:0 32px 95px rgba(3,35,55,.32) !important;
    direction:rtl !important;
    text-align:right !important;
}

body.mq-flow-open-v50 .mq-flow-active-panel-v50 .confiFormsFormTitle{
    display:none !important;
}

body.mq-flow-open-v50 .mq-flow-active-panel-v50 .confiFormsFormContent{
    padding:14px 22px 8px !important;
    background:#fff !important;
    overflow:visible !important;
}

body.mq-flow-open-v50 .mq-flow-active-panel-v50 .confiFormsFormFooter{
    padding:12px 22px 20px !important;
    background:#fff !important;
    direction:rtl !important;
    text-align:right !important;
}

body.mq-flow-open-v50 .mq-flow-selector-v50 .confiFormsFormFooter{
    display:none !important;
}

body.mq-flow-open-v50 .mq-flow-active-panel-v50 form,
body.mq-flow-open-v50 .mq-flow-active-panel-v50 table{
    width:100% !important;
    max-width:100% !important;
    direction:rtl !important;
    text-align:right !important;
}

body.mq-flow-open-v50 .mq-flow-active-panel-v50 td,
body.mq-flow-open-v50 .mq-flow-active-panel-v50 th{
    box-sizing:border-box !important;
    border:0 !important;
    padding:7px 8px !important;
    background:#fff !important;
    direction:rtl !important;
    text-align:right !important;
    vertical-align:middle !important;
}

body.mq-flow-open-v50 .mq-flow-active-panel-v50 label{
    color:#3d4954 !important;
    font-family:Tahoma,Arial,sans-serif !important;
    font-size:13px !important;
    font-weight:900 !important;
    direction:rtl !important;
    text-align:right !important;
}

body.mq-flow-open-v50 .mq-flow-active-panel-v50 input[type="text"],
body.mq-flow-open-v50 .mq-flow-active-panel-v50 input[type="number"],
body.mq-flow-open-v50 .mq-flow-active-panel-v50 input[type="date"],
body.mq-flow-open-v50 .mq-flow-active-panel-v50 textarea,
body.mq-flow-open-v50 .mq-flow-active-panel-v50 select,
body.mq-flow-open-v50 .mq-flow-active-panel-v50 .select2-container,
body.mq-flow-open-v50 .mq-flow-active-panel-v50 .select2-choice,
body.mq-flow-open-v50 .mq-flow-active-panel-v50 .select2-selection,
body.mq-flow-open-v50 .mq-flow-active-panel-v50 .aui-select2-choice{
    width:100% !important;
    max-width:100% !important;
    min-width:0 !important;
    min-height:44px !important;
    border:1px solid #d5dbe0 !important;
    border-radius:12px !important;
    background:#fff !important;
    box-shadow:0 2px 9px rgba(7,53,83,.035) !important;
    color:#3d4954 !important;
    font-family:Tahoma,Arial,sans-serif !important;
    font-size:13px !important;
    direction:rtl !important;
    text-align:right !important;
}

body.mq-flow-open-v50 .mq-flow-active-panel-v50 .select2-chosen,
body.mq-flow-open-v50 .mq-flow-active-panel-v50 .select2-selection__rendered{
    line-height:42px !important;
    padding:0 14px !important;
    direction:rtl !important;
    text-align:right !important;
}

body.mq-flow-open-v50 .mq-flow-active-panel-v50 select.select2-offscreen,
body.mq-flow-open-v50 .mq-flow-active-panel-v50 input.select2-offscreen,
body.mq-flow-open-v50 .mq-flow-active-panel-v50 select.select2-hidden-accessible,
body.mq-flow-open-v50 .mq-flow-active-panel-v50 input.select2-hidden-accessible{
    position:absolute !important;
    left:-10000px !important;
    width:1px !important;
    height:1px !important;
    min-width:1px !important;
    max-width:1px !important;
    opacity:0 !important;
    overflow:hidden !important;
}

body.mq-flow-open-v50 .mq-flow-active-panel-v50 .save-cf-btn,
body.mq-flow-open-v50 .mq-flow-active-panel-v50 .aui-button-primary{
    min-width:145px !important;
    min-height:44px !important;
    padding:0 20px !important;
    border:1px solid #505962 !important;
    border-radius:12px !important;
    background:linear-gradient(135deg,#57606a 0%,#4a525a 100%) !important;
    background-color:#57606a !important;
    color:#fff !important;
    text-shadow:none !important;
    box-shadow:0 9px 20px rgba(87,96,106,.18) !important;
    font-family:Tahoma,Arial,sans-serif !important;
    font-weight:900 !important;
}

body.mq-flow-open-v50 .mq-flow-hidden-row-v50{
    display:none !important;
}

body.mq-flow-open-v50 .mq-flow-active-panel-v50 .mq-reference-plus-v46,
body.mq-flow-open-v50 .mq-flow-active-panel-v50 .mq-model-plus,
body.mq-flow-open-v50 .mq-flow-active-panel-v50 .mq-equipment-title-group-plus-v48,
body.mq-flow-open-v50 .mq-flow-active-panel-v50 .mq-native-form-close{
    display:none !important;
}

.mq-flow-head-v50{
    position:sticky !important;
    top:0 !important;
    z-index:40 !important;
    padding:18px 22px 14px !important;
    background:#fff !important;
    border-bottom:1px solid #e1e5e8 !important;
}

.mq-flow-head-top-v50{
    display:flex !important;
    align-items:flex-start !important;
    justify-content:space-between !important;
    gap:18px !important;
}

.mq-flow-title-v50{
    color:#34414d !important;
    font-size:18px !important;
    font-weight:900 !important;
    line-height:1.8 !important;
}

.mq-flow-subtitle-v50{
    margin-top:4px !important;
    color:#7c8791 !important;
    font-size:11px !important;
    font-weight:700 !important;
    line-height:1.9 !important;
}

.mq-flow-close-v50{
    flex:0 0 36px !important;
    width:36px !important;
    height:36px !important;
    padding:0 !important;
    border:0 !important;
    border-radius:10px !important;
    background:#f1f6f8 !important;
    color:#68747f !important;
    font:700 21px/36px Tahoma,Arial,sans-serif !important;
    cursor:pointer !important;
}

.mq-flow-close-v50:hover{
    background:#ecedee !important;
    color:#4a525a !important;
}

.mq-flow-steps-v50{
    margin-top:15px !important;
    display:grid !important;
    grid-template-columns:repeat(4,minmax(0,1fr)) !important;
    gap:8px !important;
}

.mq-flow-step-v50{
    min-height:40px !important;
    padding:7px 9px !important;
    display:flex !important;
    align-items:center !important;
    justify-content:center !important;
    gap:7px !important;
    border:1px solid #e1ebef !important;
    border-radius:11px !important;
    background:#f8fbfc !important;
    color:#87919a !important;
    font-size:10px !important;
    font-weight:800 !important;
}

.mq-flow-step-v50.active{
    border-color:#b9bfc5 !important;
    background:#f0f1f2 !important;
    color:#434a51 !important;
}

.mq-flow-step-v50.done{
    border-color:#d6d9dc !important;
    background:#f4f5f6 !important;
    color:#636e7a !important;
}

.mq-flow-step-num-v50{
    width:22px !important;
    height:22px !important;
    display:inline-flex !important;
    align-items:center !important;
    justify-content:center !important;
    border-radius:50% !important;
    background:#e5eef2 !important;
    color:#6d7882 !important;
    font-size:10px !important;
    font-weight:900 !important;
}

.mq-flow-step-v50.active .mq-flow-step-num-v50{
    background:#57606a !important;
    color:#fff !important;
}

body.mq-flow-open-v50 .mq-flow-selector-v50 .confiFormsFormContent{
    padding:26px 26px 14px !important;
}

body.mq-flow-open-v50 .mq-flow-selector-v50 td{
    padding:9px 10px !important;
}

body.mq-flow-open-v50 .mq-flow-selector-v50 .select2-container,
body.mq-flow-open-v50 .mq-flow-selector-v50 input[type="text"],
body.mq-flow-open-v50 .mq-flow-selector-v50 select{
    min-height:48px !important;
}

.mq-flow-footer-v50{
    padding:14px 22px 22px !important;
    display:flex !important;
    align-items:center !important;
    justify-content:space-between !important;
    gap:12px !important;
    flex-wrap:wrap !important;
    background:#fff !important;
    border-top:1px solid #eceff1 !important;
}

.mq-flow-footer-left-v50,
.mq-flow-footer-right-v50{
    display:flex !important;
    align-items:center !important;
    gap:9px !important;
    flex-wrap:wrap !important;
}

.mq-flow-primary-v50,
.mq-flow-secondary-v50,
.mq-flow-plus-v50{
    min-height:42px !important;
    padding:0 17px !important;
    border-radius:11px !important;
    font-family:Tahoma,Arial,sans-serif !important;
    font-size:12px !important;
    font-weight:900 !important;
    cursor:pointer !important;
}

.mq-flow-primary-v50,
.mq-flow-plus-v50{
    border:1px solid #505962 !important;
    background:linear-gradient(135deg,#57606a,#4a525a) !important;
    color:#fff !important;
    box-shadow:0 8px 18px rgba(87,96,106,.16) !important;
}

.mq-flow-secondary-v50{
    border:1px solid #d7e5eb !important;
    background:#fff !important;
    color:#536f84 !important;
}

.mq-flow-create-actions-v50{
    padding:0 22px 20px !important;
    display:flex !important;
    justify-content:flex-start !important;
    background:#fff !important;
}

body.mq-flow-open-v50 .select2-drop,
body.mq-flow-open-v50 .select2-dropdown,
body.mq-flow-open-v50 .aui-select2-drop{
    z-index:2147483200 !important;
}

@media(max-width:760px){
    body.mq-flow-open-v50 .mq-flow-active-panel-v50{
        width:96vw !important;
        max-width:96vw !important;
        max-height:92vh !important;
        border-radius:16px !important;
    }

    .mq-flow-steps-v50{
        grid-template-columns:repeat(2,minmax(0,1fr)) !important;
    }

    .mq-flow-footer-v50{
        align-items:stretch !important;
        flex-direction:column !important;
    }

    .mq-flow-footer-left-v50,
    .mq-flow-footer-right-v50{
        width:100% !important;
    }
}
</style>


<style id="mq-v50-1-horizontal-scroll-fix">
/* ============================================================
   MEDIQ V50.1 - REMOVE HORIZONTAL SCROLL FROM TOP-DOWN FORMS
   ============================================================ */

body.mq-flow-open-v50 .mq-flow-active-panel-v50{
    overflow-x:hidden !important;
}

body.mq-flow-open-v50 .mq-flow-active-panel-v50 .confiFormsFormContent,
body.mq-flow-open-v50 .mq-flow-active-panel-v50 .confiFormsFormFooter,
body.mq-flow-open-v50 .mq-flow-active-panel-v50 form,
body.mq-flow-open-v50 .mq-flow-active-panel-v50 form.aui-confiforms,
body.mq-flow-open-v50 .mq-flow-active-panel-v50 .table-wrap,
body.mq-flow-open-v50 .mq-flow-active-panel-v50 .aui,
body.mq-flow-open-v50 .mq-flow-active-panel-v50 .field-group,
body.mq-flow-open-v50 .mq-flow-active-panel-v50 .control-group{
    width:100% !important;
    max-width:100% !important;
    min-width:0 !important;
    box-sizing:border-box !important;
    overflow-x:hidden !important;
}

body.mq-flow-open-v50 .mq-flow-active-panel-v50 .confiFormsFormContent{
    overflow-y:visible !important;
}

body.mq-flow-open-v50 .mq-flow-active-panel-v50 .table-wrap{
    overflow-y:visible !important;
    margin:0 !important;
    padding:0 !important;
}

body.mq-flow-open-v50 .mq-flow-active-panel-v50 table{
    width:100% !important;
    max-width:100% !important;
    min-width:0 !important;
    table-layout:fixed !important;
    margin:0 !important;
}

body.mq-flow-open-v50 .mq-flow-active-panel-v50 td,
body.mq-flow-open-v50 .mq-flow-active-panel-v50 th{
    min-width:0 !important;
    max-width:100% !important;
    overflow:hidden !important;
    word-break:break-word !important;
}

body.mq-flow-open-v50 .mq-flow-active-panel-v50 td > *,
body.mq-flow-open-v50 .mq-flow-active-panel-v50 th > *{
    max-width:100% !important;
    min-width:0 !important;
    box-sizing:border-box !important;
}

body.mq-flow-open-v50 .mq-flow-active-panel-v50 .select2-container,
body.mq-flow-open-v50 .mq-flow-active-panel-v50 .select2-choice,
body.mq-flow-open-v50 .mq-flow-active-panel-v50 .select2-selection,
body.mq-flow-open-v50 .mq-flow-active-panel-v50 .aui-select2-choice,
body.mq-flow-open-v50 .mq-flow-active-panel-v50 input[type="text"],
body.mq-flow-open-v50 .mq-flow-active-panel-v50 input[type="number"],
body.mq-flow-open-v50 .mq-flow-active-panel-v50 input[type="date"],
body.mq-flow-open-v50 .mq-flow-active-panel-v50 textarea,
body.mq-flow-open-v50 .mq-flow-active-panel-v50 select{
    width:100% !important;
    max-width:100% !important;
    min-width:0 !important;
    box-sizing:border-box !important;
}

/* prevent old/stale Select2 menus from remaining at the page corner */
body.mq-flow-open-v50 .select2-drop:not(.select2-drop-active),
body.mq-flow-open-v50 .aui-select2-drop:not(.select2-drop-active),
body.mq-flow-open-v50 .select2-dropdown[aria-hidden="true"]{
    display:none !important;
}

@media(max-width:760px){
    body.mq-flow-open-v50 .mq-flow-active-panel-v50 .confiFormsFormContent{
        padding-left:14px !important;
        padding-right:14px !important;
    }
}
</style>


<style id="mq-v50-2-classification-picker-fix">
/* ============================================================
   MEDIQ V50.2 - TOP-DOWN PICKER VISIBILITY FIX
   The legacy quick-create CSS pushed ConfiForms reference forms
   to left:-200vw when mq-reference-form-open-v46 was absent.
   During the V50 wizard those same forms are the active wizard
   panel, so restore them ONLY while they are the active panel.
   ============================================================ */

body.mq-flow-open-v50 .mq-flow-active-panel-v50.cf_mediqNewEquipmentTitle,
body.mq-flow-open-v50 .mq-flow-active-panel-v50.cf_mediqNewManufacturer,
body.mq-flow-open-v50 .mq-flow-active-panel-v50.cf_mediqNewFacility,
body.mq-flow-open-v50 .mq-flow-active-panel-v50.cf_mediqNewClassification,
body.mq-flow-open-v50 .mq-flow-active-panel-v50 .cf_mediqNewEquipmentTitle,
body.mq-flow-open-v50 .mq-flow-active-panel-v50 .cf_mediqNewManufacturer,
body.mq-flow-open-v50 .mq-flow-active-panel-v50 .cf_mediqNewFacility,
body.mq-flow-open-v50 .mq-flow-active-panel-v50 .cf_mediqNewClassification{
    position:static !important;
    left:auto !important;
    right:auto !important;
    top:auto !important;
    width:100% !important;
    min-width:0 !important;
    max-width:100% !important;
    height:auto !important;
    min-height:0 !important;
    max-height:none !important;
    margin:0 !important;
    padding:0 !important;
    overflow:visible !important;
    opacity:1 !important;
    visibility:visible !important;
    pointer-events:auto !important;
}

/* Keep the active ConfiForms body in the normal document flow. */
body.mq-flow-open-v50 .mq-flow-active-panel-v50 form.aui-confiforms,
body.mq-flow-open-v50 .mq-flow-active-panel-v50 .confiFormsFormContent,
body.mq-flow-open-v50 .mq-flow-active-panel-v50 .confiFormsFormContent > div,
body.mq-flow-open-v50 .mq-flow-active-panel-v50 .table-wrap{
    position:relative !important;
    left:auto !important;
    right:auto !important;
    top:auto !important;
    width:100% !important;
    min-width:0 !important;
    max-width:100% !important;
    height:auto !important;
    max-height:none !important;
    opacity:1 !important;
    visibility:visible !important;
}

/* Make the visible Select2 control occupy the same width as text inputs. */
body.mq-flow-open-v50 .mq-flow-active-panel-v50 .select2-container{
    display:block !important;
    visibility:visible !important;
    opacity:1 !important;
    width:100% !important;
    min-width:0 !important;
    max-width:100% !important;
    box-sizing:border-box !important;
}

body.mq-flow-open-v50 .mq-flow-active-panel-v50 .select2-container .select2-choice,
body.mq-flow-open-v50 .mq-flow-active-panel-v50 .select2-container .select2-selection{
    width:100% !important;
    min-width:0 !important;
    max-width:100% !important;
    min-height:44px !important;
    box-sizing:border-box !important;
    border:1px solid #d5dbe0 !important;
    border-radius:12px !important;
    background:#fff !important;
}

/* Do not show an orphan Select2 popup in the top-left corner. */
body.mq-flow-open-v50 > .select2-drop:not(.select2-drop-active),
body.mq-flow-open-v50 > .aui-select2-drop:not(.select2-drop-active),
body.mq-flow-open-v50 > .select2-dropdown[aria-hidden="true"],
body.mq-flow-open-v50 > #select2-drop-mask{
    display:none !important;
}

/* Reference picker rows should never collapse to one pixel. */
body.mq-flow-open-v50 .mq-flow-active-panel-v50 tr:not(.mq-flow-hidden-row-v50),
body.mq-flow-open-v50 .mq-flow-active-panel-v50 .field-group:not(.mq-flow-hidden-row-v50),
body.mq-flow-open-v50 .mq-flow-active-panel-v50 .control-group:not(.mq-flow-hidden-row-v50){
    visibility:visible !important;
    opacity:1 !important;
    max-width:100% !important;
}
</style>

<style id="mq-v50-3-modal-position-fix">
/* ============================================================
   MEDIQ V50.3 - FIX ACTIVE WIZARD PANEL POSITION
   V50.2 restored reference-form wrappers with position:static.
   When the ConfiForms registration panel itself carries the
   cf_mediqNew... class, that rule also changed the wizard modal
   from fixed to static and left its translate(-50%,-50%) active,
   which pushed the visible form away while the backdrop remained.
   Keep the ACTIVE panel fixed and centered; only inner wrappers
   are allowed to return to normal document flow.
   ============================================================ */

body.mq-flow-open-v50 .mq-flow-active-panel-v50.cf_mediqNewEquipmentTitle,
body.mq-flow-open-v50 .mq-flow-active-panel-v50.cf_mediqNewManufacturer,
body.mq-flow-open-v50 .mq-flow-active-panel-v50.cf_mediqNewFacility,
body.mq-flow-open-v50 .mq-flow-active-panel-v50.cf_mediqNewClassification,
body.mq-flow-open-v50 .mq-flow-active-panel-v50.cf_mediqNewModel,
body.mq-flow-open-v50 .mq-flow-active-panel-v50.cf_mediqNewAsset{
    display:block !important;
    position:fixed !important;
    left:50% !important;
    right:auto !important;
    top:50% !important;
    transform:translate(-50%,-50%) !important;
    z-index:2147483100 !important;
    width:min(860px,94vw) !important;
    max-width:94vw !important;
    min-width:0 !important;
    height:auto !important;
    min-height:0 !important;
    max-height:88vh !important;
    margin:0 !important;
    padding:0 !important;
    overflow-x:hidden !important;
    overflow-y:auto !important;
    opacity:1 !important;
    visibility:visible !important;
    pointer-events:auto !important;
    background:#fff !important;
    border:1px solid #d7dde2 !important;
    border-radius:22px !important;
    box-shadow:0 32px 95px rgba(3,35,55,.32) !important;
}

/* Only nested/reference content should be static inside the centered panel. */
body.mq-flow-open-v50 .mq-flow-active-panel-v50 .cf_mediqNewEquipmentTitle,
body.mq-flow-open-v50 .mq-flow-active-panel-v50 .cf_mediqNewManufacturer,
body.mq-flow-open-v50 .mq-flow-active-panel-v50 .cf_mediqNewFacility,
body.mq-flow-open-v50 .mq-flow-active-panel-v50 .cf_mediqNewClassification{
    position:static !important;
    left:auto !important;
    right:auto !important;
    top:auto !important;
    transform:none !important;
    width:100% !important;
    max-width:100% !important;
    min-width:0 !important;
    margin:0 !important;
    padding:0 !important;
    opacity:1 !important;
    visibility:visible !important;
    pointer-events:auto !important;
}

/* Keep stale Select2 dropdowns hidden until the picker is actually opened. */
body.mq-flow-open-v50 > .select2-drop:not(.select2-drop-active),
body.mq-flow-open-v50 > .aui-select2-drop:not(.select2-drop-active),
body.mq-flow-open-v50 > .select2-dropdown[aria-hidden="true"]{
    display:none !important;
}
</style>

<!-- ============================================================
     MEDIQ V59
     Step 2/3 selector visibility fixed; Select2 remains single-handler.
     No V50.5/V54/V55/V56 duplicate handler is loaded here.
     ============================================================ -->