2541 lines
		
	
	
		
			99 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
			
		
		
	
	
			2541 lines
		
	
	
		
			99 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
<!DOCTYPE html>
 | 
						||
<!--
 | 
						||
Template Name:  SmartAdmin Responsive WebApp - Template build with Twitter Bootstrap 4
 | 
						||
Version: 4.5.1
 | 
						||
Author: Sunnyat A.
 | 
						||
Website: http://gootbootstrap.com
 | 
						||
Purchase: https://wrapbootstrap.com/theme/smartadmin-responsive-webapp-WB0573SK0?ref=myorange
 | 
						||
License: You must have a valid license purchased only from wrapbootstrap.com (link above) in order to legally use this theme for your project.
 | 
						||
-->
 | 
						||
<html lang="zh-hant-TW" class="root-text-lg">
 | 
						||
  <head>
 | 
						||
    <meta charset="utf-8" />
 | 
						||
    <title>Marketing Dashboard - Application Intel - SmartAdmin v4.5.1</title>
 | 
						||
    <meta name="description" content="Marketing Dashboard" />
 | 
						||
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
 | 
						||
    <meta
 | 
						||
      name="viewport"
 | 
						||
      content="width=device-width, initial-scale=1, shrink-to-fit=no, user-scalable=no, minimal-ui"
 | 
						||
    />
 | 
						||
    <!-- Call App Mode on ios devices -->
 | 
						||
    <meta name="apple-mobile-web-app-capable" content="yes" />
 | 
						||
    <!-- Remove Tap Highlight on Windows Phone IE -->
 | 
						||
    <meta name="msapplication-tap-highlight" content="no" />
 | 
						||
    <!-- base css -->
 | 
						||
    <link
 | 
						||
      id="vendorsbundle"
 | 
						||
      rel="stylesheet"
 | 
						||
      media="screen, print"
 | 
						||
      href="lib/vendors.bundle.css"
 | 
						||
    />
 | 
						||
    <link
 | 
						||
      id="appbundle"
 | 
						||
      rel="stylesheet"
 | 
						||
      media="screen, print"
 | 
						||
      href="lib/app.bundle.css"
 | 
						||
    />
 | 
						||
    <link id="mytheme" rel="stylesheet" media="screen, print" href="#" />
 | 
						||
    <link
 | 
						||
      id="myskin"
 | 
						||
      rel="stylesheet"
 | 
						||
      media="screen, print"
 | 
						||
      href="lib/skins/skin-master.css"
 | 
						||
    />
 | 
						||
    <link rel="stylesheet" href="lib/notifications/toastr/toastr.min.css" />
 | 
						||
    <link rel="stylesheet" href="lib/dropzone/dropzone.css" />
 | 
						||
    <!-- Place favicon.ico in the root directory -->
 | 
						||
    <link
 | 
						||
      rel="apple-touch-icon"
 | 
						||
      sizes="180x180"
 | 
						||
      href="img/favicon/apple-touch-icon.png"
 | 
						||
    />
 | 
						||
    <link
 | 
						||
      rel="icon"
 | 
						||
      type="image/png"
 | 
						||
      sizes="32x32"
 | 
						||
      href="img/favicon/favicon-32x32.png"
 | 
						||
    />
 | 
						||
    <link
 | 
						||
      rel="mask-icon"
 | 
						||
      href="img/favicon/safari-pinned-tab.svg"
 | 
						||
      color="#5bbad5"
 | 
						||
    />
 | 
						||
    <!-- Font Awesome -->
 | 
						||
    <link href="lib/fontawesome-free/css/all.min.css" rel="stylesheet" />
 | 
						||
    <link href="lib/jquery-ui/jquery-ui.min.css" rel="stylesheet" />
 | 
						||
 | 
						||
    <!--<link href="lib/chart.js/Chart.min.css" rel="stylesheet" />-->
 | 
						||
    <link
 | 
						||
      href="lib/jstree-master/themes/default/style.min.css"
 | 
						||
      rel="stylesheet"
 | 
						||
    />
 | 
						||
    <link
 | 
						||
      href="lib/jstree-master/themes/default-dark/style.min.css"
 | 
						||
      rel="stylesheet"
 | 
						||
    />
 | 
						||
    <link
 | 
						||
      href="https://fonts.googleapis.com/icon?family=Material+Icons"
 | 
						||
      rel="stylesheet"
 | 
						||
    />
 | 
						||
    <!--<link rel="stylesheet" media="screen, print" href="https://cdn.datatables.net/1.10.21/css/dataTables.bootstrap.min.css">-->
 | 
						||
    <link
 | 
						||
      rel="stylesheet"
 | 
						||
      media="screen, print"
 | 
						||
      href="https://cdn.datatables.net/1.10.21/css/dataTables.bootstrap4.min.css"
 | 
						||
    />
 | 
						||
    <link rel="stylesheet" href="css/site.css" />
 | 
						||
    <link
 | 
						||
      rel="stylesheet"
 | 
						||
      href="css/yourteam/plugins/yt-tooltip/yt-tooltip.css"
 | 
						||
    />
 | 
						||
    <link
 | 
						||
      rel="stylesheet"
 | 
						||
      href="css/yourteam/plugins/yt-notice/yt-notice.css"
 | 
						||
    />
 | 
						||
    <link
 | 
						||
      rel="stylesheet"
 | 
						||
      href="css/yourteam/plugins/yt-navbar/yt-navbar.css"
 | 
						||
    />
 | 
						||
    <link
 | 
						||
      rel="stylesheet"
 | 
						||
      href="css/yourteam/plugins/yt-alert/ytpop-alert.css"
 | 
						||
    />
 | 
						||
    <link
 | 
						||
      rel="stylesheet"
 | 
						||
      href="https://developer.api.autodesk.com/modelderivative/v2/viewers/7.*/style.min.css"
 | 
						||
      type="text/css"
 | 
						||
    />
 | 
						||
 | 
						||
    <link
 | 
						||
      rel="stylesheet"
 | 
						||
      href="lib\bootstrap-datepicker\bootstrap-datepicker.min.css"
 | 
						||
      type="text/css"
 | 
						||
    />
 | 
						||
  </head>
 | 
						||
  <!-- BEGIN Body -->
 | 
						||
  <!-- Possible Classes
 | 
						||
 | 
						||
    * 'header-function-fixed'         - header is in a fixed at all times
 | 
						||
    * 'nav-function-fixed'            - left panel is fixed
 | 
						||
    * 'nav-function-minify'			  - skew nav to maximize space
 | 
						||
    * 'nav-function-hidden'           - roll mouse on edge to reveal
 | 
						||
    * 'nav-function-top'              - relocate left pane to top
 | 
						||
    * 'mod-main-boxed'                - encapsulates to a container
 | 
						||
    * 'nav-mobile-push'               - content pushed on menu reveal
 | 
						||
    * 'nav-mobile-no-overlay'         - removes mesh on menu reveal
 | 
						||
    * 'nav-mobile-slide-out'          - content overlaps menu
 | 
						||
    * 'mod-bigger-font'               - content fonts are bigger for readability
 | 
						||
    * 'mod-high-contrast'             - 4.5:1 text contrast ratio
 | 
						||
    * 'mod-color-blind'               - color vision deficiency
 | 
						||
    * 'mod-pace-custom'               - preloader will be inside content
 | 
						||
    * 'mod-clean-page-bg'             - adds more whitespace
 | 
						||
    * 'mod-hide-nav-icons'            - invisible navigation icons
 | 
						||
    * 'mod-disable-animation'         - disables css based animations
 | 
						||
    * 'mod-hide-info-card'            - hides info card from left panel
 | 
						||
    * 'mod-lean-subheader'            - distinguished page header
 | 
						||
    * 'mod-nav-link'                  - clear breakdown of nav links
 | 
						||
 | 
						||
    >>> more settings are described inside documentation page >>>
 | 
						||
-->
 | 
						||
 | 
						||
  <body
 | 
						||
    class="mod-bg-1 mod-nav-link mod-skin-dark mod-hide-info-card nav-function-top nav-function-fixed mod-lean-subheader desktop chrome webkit pace-done blur"
 | 
						||
  >
 | 
						||
    <!-- DOC: script to save and load page settings -->
 | 
						||
    <script>
 | 
						||
      /**
 | 
						||
       *	This script should be placed right after the body tag for fast execution
 | 
						||
       *	Note: the script is written in pure javascript and does not depend on thirdparty library
 | 
						||
       **/
 | 
						||
      "use strict";
 | 
						||
 | 
						||
      var classHolder = document.getElementsByTagName("BODY")[0],
 | 
						||
        /**
 | 
						||
         * Load from localstorage
 | 
						||
         **/
 | 
						||
        themeSettings = localStorage.getItem("themeSettings")
 | 
						||
          ? JSON.parse(localStorage.getItem("themeSettings"))
 | 
						||
          : {},
 | 
						||
        themeURL = themeSettings.themeURL || "",
 | 
						||
        themeOptions = themeSettings.themeOptions || "";
 | 
						||
      /**
 | 
						||
       * Load theme options
 | 
						||
       **/
 | 
						||
      if (themeSettings.themeOptions) {
 | 
						||
        classHolder.className = themeSettings.themeOptions;
 | 
						||
        console.log("%c✔ Theme settings loaded", "color: #148f32");
 | 
						||
      } else {
 | 
						||
        console.log(
 | 
						||
          "%c✔ Heads up! Theme settings is empty or does not exist, loading default settings...",
 | 
						||
          "color: #ed1c24"
 | 
						||
        );
 | 
						||
      }
 | 
						||
      if (themeSettings.themeURL && !document.getElementById("mytheme")) {
 | 
						||
        var cssfile = document.createElement("link");
 | 
						||
        cssfile.id = "mytheme";
 | 
						||
        cssfile.rel = "stylesheet";
 | 
						||
        cssfile.href = themeURL;
 | 
						||
        document.getElementsByTagName("head")[0].appendChild(cssfile);
 | 
						||
      } else if (themeSettings.themeURL && document.getElementById("mytheme")) {
 | 
						||
        document.getElementById("mytheme").href = themeSettings.themeURL;
 | 
						||
      }
 | 
						||
      /**
 | 
						||
       * Save to localstorage
 | 
						||
       **/
 | 
						||
      var saveSettings = function () {
 | 
						||
        themeSettings.themeOptions = String(classHolder.className)
 | 
						||
          .split(/[^\w-]+/)
 | 
						||
          .filter(function (item) {
 | 
						||
            return /^(nav|header|footer|mod|display)-/i.test(item);
 | 
						||
          })
 | 
						||
          .join(" ");
 | 
						||
        if (document.getElementById("mytheme")) {
 | 
						||
          themeSettings.themeURL = document
 | 
						||
            .getElementById("mytheme")
 | 
						||
            .getAttribute("href");
 | 
						||
        }
 | 
						||
        localStorage.setItem("themeSettings", JSON.stringify(themeSettings));
 | 
						||
      };
 | 
						||
      /**
 | 
						||
       * Reset settings
 | 
						||
       **/
 | 
						||
      var resetSettings = function () {
 | 
						||
        localStorage.setItem("themeSettings", "");
 | 
						||
      };
 | 
						||
    </script>
 | 
						||
    <!-- BEGIN Page Wrapper -->
 | 
						||
    <div class="page-wrapper">
 | 
						||
      <div class="page-inner">
 | 
						||
        <!-- BEGIN Left Aside -->
 | 
						||
        <!-- END Left Aside -->
 | 
						||
        <div class="page-content-wrapper">
 | 
						||
          <!-- BEGIN Page Header -->
 | 
						||
          <header class="page-header" role="banner">
 | 
						||
            <!--we need this logo when user switches to nav-function-top-->
 | 
						||
            <div class="page-logo">
 | 
						||
              <a
 | 
						||
                href="javascript:;"
 | 
						||
                name="topFunBtn"
 | 
						||
                data-page="dashboard"
 | 
						||
                class="page-logo-link press-scale-down d-flex align-items-center position-relative"
 | 
						||
              >
 | 
						||
                <img
 | 
						||
                  src="img/logo.png"
 | 
						||
                  alt="SmartAdmin WebApp"
 | 
						||
                  aria-roledescription="logo"
 | 
						||
                  style="height: 36px"
 | 
						||
                />
 | 
						||
 | 
						||
                <!--<span class="page-logo-text mr-1">SmartAdmin WebApp</span>-->
 | 
						||
                <!--<span class="position-absolute text-white opacity-50 small pos-top pos-right mr-2 mt-n2"></span>
 | 
						||
                          <i class="fal fa-angle-down d-inline-block ml-1 fs-lg color-primary-300"></i>-->
 | 
						||
              </a>
 | 
						||
            </div>
 | 
						||
            <!--DOC: nav menu layout change shortcut-->
 | 
						||
            <div class="hidden-md-down dropdown-icon-menu position-relative">
 | 
						||
              <a
 | 
						||
                href="#"
 | 
						||
                class="header-btn btn js-waves-off"
 | 
						||
                data-action="toggle"
 | 
						||
                data-class="nav-function-hidden"
 | 
						||
                title="Hide Navigation"
 | 
						||
              >
 | 
						||
                <i class="ni ni-menu"></i>
 | 
						||
              </a>
 | 
						||
              <ul>
 | 
						||
                <li>
 | 
						||
                  <a
 | 
						||
                    href="#"
 | 
						||
                    class="btn js-waves-off"
 | 
						||
                    data-action="toggle"
 | 
						||
                    data-class="nav-function-minify"
 | 
						||
                    title="Minify Navigation"
 | 
						||
                  >
 | 
						||
                    <i class="ni ni-minify-nav"></i>
 | 
						||
                  </a>
 | 
						||
                </li>
 | 
						||
                <li>
 | 
						||
                  <a
 | 
						||
                    href="#"
 | 
						||
                    class="btn js-waves-off"
 | 
						||
                    data-action="toggle"
 | 
						||
                    data-class="nav-function-fixed"
 | 
						||
                    title="Lock Navigation"
 | 
						||
                  >
 | 
						||
                    <i class="ni ni-lock-nav"></i>
 | 
						||
                  </a>
 | 
						||
                </li>
 | 
						||
              </ul>
 | 
						||
            </div>
 | 
						||
            <!--DOC: mobile button appears during mobile width-->
 | 
						||
            <div class="hidden-lg-up">
 | 
						||
              <a
 | 
						||
                href="#"
 | 
						||
                class="header-btn btn press-scale-down"
 | 
						||
                data-action="toggle"
 | 
						||
                data-class="mobile-nav-on"
 | 
						||
              >
 | 
						||
                <i class="ni ni-menu"></i>
 | 
						||
              </a>
 | 
						||
            </div>
 | 
						||
 | 
						||
            <div class="dropdown">
 | 
						||
              <a
 | 
						||
                class="dropdown-toggle fs-1"
 | 
						||
                href="javascript:;"
 | 
						||
                role="button"
 | 
						||
                id="buiActDrop"
 | 
						||
                data-target="buiList"
 | 
						||
                data-toggle="dropdown"
 | 
						||
                aria-haspopup="true"
 | 
						||
              >
 | 
						||
              </a>
 | 
						||
              <div
 | 
						||
                id="buiList"
 | 
						||
                class="dropdown-menu dropdown-select-menu js-auto-close"
 | 
						||
              ></div>
 | 
						||
            </div>
 | 
						||
 | 
						||
            <div class="ml-auto d-flex" id="froLisPage"></div>
 | 
						||
            <div class="ml-auto d-flex mr-3">
 | 
						||
              <div class="dropdown">
 | 
						||
                <a
 | 
						||
                  href="javascript:;"
 | 
						||
                  id="toggleNoticeBtn"
 | 
						||
                  class="d-flex align-items-center justify-content-center ml-2"
 | 
						||
                >
 | 
						||
                  <!--<img src="img/demo/avatars/avatar-admin.png" class="profile-image rounded-circle"
 | 
						||
                              alt="Dr. Codex Lantern">-->
 | 
						||
                  <!--you can also add username next to the avatar with the codes below:-->
 | 
						||
                  <div class="row m-0 justify-content-center userblock">
 | 
						||
                    <i id="noticeConIcon" class="fs-1-5 w-100 text-center"></i>
 | 
						||
                    <span
 | 
						||
                      id="noticeConText"
 | 
						||
                      class="text-truncate text-truncate-header hidden-xs-down"
 | 
						||
                      data-hide="隱藏警告"
 | 
						||
                      data-show="顯示警告"
 | 
						||
                    ></span>
 | 
						||
                  </div>
 | 
						||
                </a>
 | 
						||
              </div>
 | 
						||
              <!--app user menu-->
 | 
						||
              <div class="dropdown">
 | 
						||
                <a
 | 
						||
                  href="#"
 | 
						||
                  data-toggle="dropdown"
 | 
						||
                  data-target="logoutList"
 | 
						||
                  class="d-flex align-items-center justify-content-center ml-2"
 | 
						||
                >
 | 
						||
                  <!--<img src="img/demo/avatars/avatar-admin.png" class="profile-image rounded-circle"
 | 
						||
                              alt="Dr. Codex Lantern">-->
 | 
						||
                  <!--you can also add username next to the avatar with the codes below:-->
 | 
						||
                  <div class="row m-0 justify-content-center userblock">
 | 
						||
                    <i class="fas fa-user-circle fs-1-5 w-100 text-center"></i>
 | 
						||
                    <span
 | 
						||
                      id="usrName"
 | 
						||
                      class="text-truncate text-truncate-header hidden-xs-down"
 | 
						||
                    ></span>
 | 
						||
                  </div>
 | 
						||
                </a>
 | 
						||
                <div
 | 
						||
                  id="logoutList"
 | 
						||
                  class="dropdown-menu dropdown-menu-right dropdown-lg"
 | 
						||
                >
 | 
						||
                  <a
 | 
						||
                    id="logout"
 | 
						||
                    href="javascript:;"
 | 
						||
                    class="dropdown-item fw-500 pt-3 pb-3"
 | 
						||
                  >
 | 
						||
                    <span>登出</span>
 | 
						||
                  </a>
 | 
						||
                </div>
 | 
						||
              </div>
 | 
						||
            </div>
 | 
						||
            <div class="ml-2 text-center">
 | 
						||
              <!-- <label class="mb-0 fs-1-2">
 | 
						||
              Diamond Controls<span class="fs-09 position-absolute"
 | 
						||
                >®</span
 | 
						||
              > </label
 | 
						||
            ><br /> -->
 | 
						||
              <!-- <label class="mb-0 fs-1-1">智慧大樓管理平台</label> -->
 | 
						||
            </div>
 | 
						||
          </header>
 | 
						||
          <!-- END Page Header -->
 | 
						||
          <!-- BEGIN Page Content -->
 | 
						||
          <!-- the #js-page-content id is needed for some plugins to initialize -->
 | 
						||
          <!--@RenderBody()-->
 | 
						||
          <div id="app"></div>
 | 
						||
 | 
						||
          <!-- this overlay is activated only when mobile menu is triggered -->
 | 
						||
          <div
 | 
						||
            class="page-content-overlay"
 | 
						||
            data-action="toggle"
 | 
						||
            data-class="mobile-nav-on"
 | 
						||
          ></div>
 | 
						||
 | 
						||
          <div id="sysMonNavbar" class="yt-navbar yt-left-navbar">
 | 
						||
            <div class="yt-navbar-content">
 | 
						||
              <ul id="sysMonBtnList"></ul>
 | 
						||
            </div>
 | 
						||
          </div>
 | 
						||
          <!-- END Page Content -->
 | 
						||
          <!-- BEGIN Page Footer -->
 | 
						||
          <!--<footer class="page-footer" role="contentinfo">
 | 
						||
                  <div class="d-flex align-items-center flex-1 text-muted">
 | 
						||
                      <span class="hidden-md-down fw-700">2022 © SmartAdmin by <a href='https://www.gotbootstrap.com' class='text-primary fw-500' title='gotbootstrap.com' target='_blank'>gotbootstrap.com</a></span>
 | 
						||
                  </div>
 | 
						||
                  <div>
 | 
						||
                      <ul class="list-table m-0">
 | 
						||
                          <li><a href="intel_introduction.html" class="text-secondary fw-700">About</a></li>
 | 
						||
                          <li class="pl-3"><a href="info_app_licensing.html" class="text-secondary fw-700">License</a></li>
 | 
						||
                          <li class="pl-3"><a href="info_app_docs.html" class="text-secondary fw-700">Documentation</a></li>
 | 
						||
                          <li class="pl-3 fs-xl"><a href="https://wrapbootstrap.com/user/MyOrange" class="text-secondary" target="_blank"><i class="fal fa-question-circle" aria-hidden="true"></i></a></li>
 | 
						||
                      </ul>
 | 
						||
                  </div>
 | 
						||
              </footer>-->
 | 
						||
          <!-- END Page Footer -->
 | 
						||
          <!-- BEGIN Shortcuts -->
 | 
						||
          <!-- END Shortcuts -->
 | 
						||
          <!-- BEGIN Color profile -->
 | 
						||
          <!-- this area is hidden and will not be seen on screens or screen readers -->
 | 
						||
          <!-- we use this only for CSS color refernce for JS stuff -->
 | 
						||
          <p id="js-color-profile" class="d-none">
 | 
						||
            <span class="color-primary-50"></span>
 | 
						||
            <span class="color-primary-100"></span>
 | 
						||
            <span class="color-primary-200"></span>
 | 
						||
            <span class="color-primary-300"></span>
 | 
						||
            <span class="color-primary-400"></span>
 | 
						||
            <span class="color-primary-500"></span>
 | 
						||
            <span class="color-primary-600"></span>
 | 
						||
            <span class="color-primary-700"></span>
 | 
						||
            <span class="color-primary-800"></span>
 | 
						||
            <span class="color-primary-900"></span>
 | 
						||
            <span class="color-info-50"></span>
 | 
						||
            <span class="color-info-100"></span>
 | 
						||
            <span class="color-info-200"></span>
 | 
						||
            <span class="color-info-300"></span>
 | 
						||
            <span class="color-info-400"></span>
 | 
						||
            <span class="color-info-500"></span>
 | 
						||
            <span class="color-info-600"></span>
 | 
						||
            <span class="color-info-700"></span>
 | 
						||
            <span class="color-info-800"></span>
 | 
						||
            <span class="color-info-900"></span>
 | 
						||
            <span class="color-danger-50"></span>
 | 
						||
            <span class="color-danger-100"></span>
 | 
						||
            <span class="color-danger-200"></span>
 | 
						||
            <span class="color-danger-300"></span>
 | 
						||
            <span class="color-danger-400"></span>
 | 
						||
            <span class="color-danger-500"></span>
 | 
						||
            <span class="color-danger-600"></span>
 | 
						||
            <span class="color-danger-700"></span>
 | 
						||
            <span class="color-danger-800"></span>
 | 
						||
            <span class="color-danger-900"></span>
 | 
						||
            <span class="color-warning-50"></span>
 | 
						||
            <span class="color-warning-100"></span>
 | 
						||
            <span class="color-warning-200"></span>
 | 
						||
            <span class="color-warning-300"></span>
 | 
						||
            <span class="color-warning-400"></span>
 | 
						||
            <span class="color-warning-500"></span>
 | 
						||
            <span class="color-warning-600"></span>
 | 
						||
            <span class="color-warning-700"></span>
 | 
						||
            <span class="color-warning-800"></span>
 | 
						||
            <span class="color-warning-900"></span>
 | 
						||
            <span class="color-success-50"></span>
 | 
						||
            <span class="color-success-100"></span>
 | 
						||
            <span class="color-success-200"></span>
 | 
						||
            <span class="color-success-300"></span>
 | 
						||
            <span class="color-success-400"></span>
 | 
						||
            <span class="color-success-500"></span>
 | 
						||
            <span class="color-success-600"></span>
 | 
						||
            <span class="color-success-700"></span>
 | 
						||
            <span class="color-success-800"></span>
 | 
						||
            <span class="color-success-900"></span>
 | 
						||
            <span class="color-fusion-50"></span>
 | 
						||
            <span class="color-fusion-100"></span>
 | 
						||
            <span class="color-fusion-200"></span>
 | 
						||
            <span class="color-fusion-300"></span>
 | 
						||
            <span class="color-fusion-400"></span>
 | 
						||
            <span class="color-fusion-500"></span>
 | 
						||
            <span class="color-fusion-600"></span>
 | 
						||
            <span class="color-fusion-700"></span>
 | 
						||
            <span class="color-fusion-800"></span>
 | 
						||
            <span class="color-fusion-900"></span>
 | 
						||
          </p>
 | 
						||
          <!-- END Color profile -->
 | 
						||
        </div>
 | 
						||
      </div>
 | 
						||
    </div>
 | 
						||
    <!-- END Page Wrapper -->
 | 
						||
    <!-- BEGIN Messenger -->
 | 
						||
    <div
 | 
						||
      class="modal fade js-modal-messenger modal-backdrop-transparent"
 | 
						||
      tabindex="-1"
 | 
						||
      role="dialog"
 | 
						||
      aria-hidden="true"
 | 
						||
    >
 | 
						||
      <div class="modal-dialog modal-dialog-right">
 | 
						||
        <div class="modal-content h-100">
 | 
						||
          <div
 | 
						||
            class="dropdown-header bg-trans-gradient d-flex align-items-center w-100"
 | 
						||
          >
 | 
						||
            <div
 | 
						||
              class="d-flex flex-row align-items-center mt-1 mb-1 color-white"
 | 
						||
            >
 | 
						||
              <span class="mr-2">
 | 
						||
                <span
 | 
						||
                  class="rounded-circle profile-image d-block"
 | 
						||
                  style="
 | 
						||
                    background-image: url('img/demo/avatars/avatar-d.png');
 | 
						||
                    background-size: cover;
 | 
						||
                  "
 | 
						||
                ></span>
 | 
						||
              </span>
 | 
						||
              <div class="info-card-text">
 | 
						||
                <a
 | 
						||
                  href="javascript:void(0);"
 | 
						||
                  class="fs-lg text-truncate text-truncate-lg text-white"
 | 
						||
                  data-toggle="dropdown"
 | 
						||
                  aria-expanded="false"
 | 
						||
                >
 | 
						||
                  Tracey Chang
 | 
						||
                  <i
 | 
						||
                    class="fal fa-angle-down d-inline-block ml-1 text-white fs-md"
 | 
						||
                  ></i>
 | 
						||
                </a>
 | 
						||
                <div class="dropdown-menu">
 | 
						||
                  <a class="dropdown-item" href="#">Send Email</a>
 | 
						||
                  <a class="dropdown-item" href="#">Create Appointment</a>
 | 
						||
                  <a class="dropdown-item" href="#">Block User</a>
 | 
						||
                </div>
 | 
						||
                <span class="text-truncate text-truncate-md opacity-80"
 | 
						||
                  >IT Director</span
 | 
						||
                >
 | 
						||
              </div>
 | 
						||
            </div>
 | 
						||
            <button
 | 
						||
              type="button"
 | 
						||
              class="close text-white position-absolute pos-top pos-right p-2 m-1 mr-2"
 | 
						||
              data-dismiss="modal"
 | 
						||
              aria-label="Close"
 | 
						||
            >
 | 
						||
              <span aria-hidden="true"><i class="fal fa-times"></i></span>
 | 
						||
            </button>
 | 
						||
          </div>
 | 
						||
          <div class="modal-body p-0 h-100 d-flex">
 | 
						||
            <!-- BEGIN msgr-list -->
 | 
						||
            <div
 | 
						||
              class="msgr-list d-flex flex-column bg-faded border-faded border-top-0 border-right-0 border-bottom-0 position-absolute pos-top pos-bottom"
 | 
						||
            >
 | 
						||
              <div>
 | 
						||
                <div
 | 
						||
                  class="height-4 width-3 h3 m-0 d-flex justify-content-center flex-column color-primary-500 pl-3 mt-2"
 | 
						||
                >
 | 
						||
                  <i class="fal fa-search"></i>
 | 
						||
                </div>
 | 
						||
                <input
 | 
						||
                  type="text"
 | 
						||
                  class="form-control bg-white"
 | 
						||
                  id="msgr_listfilter_input"
 | 
						||
                  placeholder="Filter contacts"
 | 
						||
                  aria-label="FriendSearch"
 | 
						||
                  data-listfilter="#js-msgr-listfilter"
 | 
						||
                />
 | 
						||
              </div>
 | 
						||
              <div class="flex-1 h-100 custom-scroll">
 | 
						||
                <div class="w-100">
 | 
						||
                  <ul id="js-msgr-listfilter" class="list-unstyled m-0">
 | 
						||
                    <li>
 | 
						||
                      <a
 | 
						||
                        href="#"
 | 
						||
                        class="d-table w-100 px-2 py-2 text-dark hover-white"
 | 
						||
                        data-filter-tags="tracey chang online"
 | 
						||
                      >
 | 
						||
                        <div
 | 
						||
                          class="d-table-cell align-middle status status-success status-sm"
 | 
						||
                        >
 | 
						||
                          <span
 | 
						||
                            class="profile-image-md rounded-circle d-block"
 | 
						||
                            style="
 | 
						||
                              background-image: url('img/demo/avatars/avatar-d.png');
 | 
						||
                              background-size: cover;
 | 
						||
                            "
 | 
						||
                          ></span>
 | 
						||
                        </div>
 | 
						||
                        <div class="d-table-cell w-100 align-middle pl-2 pr-2">
 | 
						||
                          <div class="text-truncate text-truncate-md">
 | 
						||
                            Tracey Chang
 | 
						||
                            <small
 | 
						||
                              class="d-block font-italic text-success fs-xs"
 | 
						||
                            >
 | 
						||
                              Online
 | 
						||
                            </small>
 | 
						||
                          </div>
 | 
						||
                        </div>
 | 
						||
                      </a>
 | 
						||
                    </li>
 | 
						||
                    <li>
 | 
						||
                      <a
 | 
						||
                        href="#"
 | 
						||
                        class="d-table w-100 px-2 py-2 text-dark hover-white"
 | 
						||
                        data-filter-tags="oliver kopyuv online"
 | 
						||
                      >
 | 
						||
                        <div
 | 
						||
                          class="d-table-cell align-middle status status-success status-sm"
 | 
						||
                        >
 | 
						||
                          <span
 | 
						||
                            class="profile-image-md rounded-circle d-block"
 | 
						||
                            style="
 | 
						||
                              background-image: url('img/demo/avatars/avatar-b.png');
 | 
						||
                              background-size: cover;
 | 
						||
                            "
 | 
						||
                          ></span>
 | 
						||
                        </div>
 | 
						||
                        <div class="d-table-cell w-100 align-middle pl-2 pr-2">
 | 
						||
                          <div class="text-truncate text-truncate-md">
 | 
						||
                            Oliver Kopyuv
 | 
						||
                            <small
 | 
						||
                              class="d-block font-italic text-success fs-xs"
 | 
						||
                            >
 | 
						||
                              Online
 | 
						||
                            </small>
 | 
						||
                          </div>
 | 
						||
                        </div>
 | 
						||
                      </a>
 | 
						||
                    </li>
 | 
						||
                    <li>
 | 
						||
                      <a
 | 
						||
                        href="#"
 | 
						||
                        class="d-table w-100 px-2 py-2 text-dark hover-white"
 | 
						||
                        data-filter-tags="dr john cook phd away"
 | 
						||
                      >
 | 
						||
                        <div
 | 
						||
                          class="d-table-cell align-middle status status-warning status-sm"
 | 
						||
                        >
 | 
						||
                          <span
 | 
						||
                            class="profile-image-md rounded-circle d-block"
 | 
						||
                            style="
 | 
						||
                              background-image: url('img/demo/avatars/avatar-e.png');
 | 
						||
                              background-size: cover;
 | 
						||
                            "
 | 
						||
                          ></span>
 | 
						||
                        </div>
 | 
						||
                        <div class="d-table-cell w-100 align-middle pl-2 pr-2">
 | 
						||
                          <div class="text-truncate text-truncate-md">
 | 
						||
                            Dr. John Cook PhD
 | 
						||
                            <small class="d-block font-italic fs-xs">
 | 
						||
                              Away
 | 
						||
                            </small>
 | 
						||
                          </div>
 | 
						||
                        </div>
 | 
						||
                      </a>
 | 
						||
                    </li>
 | 
						||
                    <li>
 | 
						||
                      <a
 | 
						||
                        href="#"
 | 
						||
                        class="d-table w-100 px-2 py-2 text-dark hover-white"
 | 
						||
                        data-filter-tags="ali amdaney online"
 | 
						||
                      >
 | 
						||
                        <div
 | 
						||
                          class="d-table-cell align-middle status status-success status-sm"
 | 
						||
                        >
 | 
						||
                          <span
 | 
						||
                            class="profile-image-md rounded-circle d-block"
 | 
						||
                            style="
 | 
						||
                              background-image: url('img/demo/avatars/avatar-g.png');
 | 
						||
                              background-size: cover;
 | 
						||
                            "
 | 
						||
                          ></span>
 | 
						||
                        </div>
 | 
						||
                        <div class="d-table-cell w-100 align-middle pl-2 pr-2">
 | 
						||
                          <div class="text-truncate text-truncate-md">
 | 
						||
                            Ali Amdaney
 | 
						||
                            <small
 | 
						||
                              class="d-block font-italic fs-xs text-success"
 | 
						||
                            >
 | 
						||
                              Online
 | 
						||
                            </small>
 | 
						||
                          </div>
 | 
						||
                        </div>
 | 
						||
                      </a>
 | 
						||
                    </li>
 | 
						||
                    <li>
 | 
						||
                      <a
 | 
						||
                        href="#"
 | 
						||
                        class="d-table w-100 px-2 py-2 text-dark hover-white"
 | 
						||
                        data-filter-tags="sarah mcbrook online"
 | 
						||
                      >
 | 
						||
                        <div
 | 
						||
                          class="d-table-cell align-middle status status-success status-sm"
 | 
						||
                        >
 | 
						||
                          <span
 | 
						||
                            class="profile-image-md rounded-circle d-block"
 | 
						||
                            style="
 | 
						||
                              background-image: url('img/demo/avatars/avatar-h.png');
 | 
						||
                              background-size: cover;
 | 
						||
                            "
 | 
						||
                          ></span>
 | 
						||
                        </div>
 | 
						||
                        <div class="d-table-cell w-100 align-middle pl-2 pr-2">
 | 
						||
                          <div class="text-truncate text-truncate-md">
 | 
						||
                            Sarah McBrook
 | 
						||
                            <small
 | 
						||
                              class="d-block font-italic fs-xs text-success"
 | 
						||
                            >
 | 
						||
                              Online
 | 
						||
                            </small>
 | 
						||
                          </div>
 | 
						||
                        </div>
 | 
						||
                      </a>
 | 
						||
                    </li>
 | 
						||
                    <li>
 | 
						||
                      <a
 | 
						||
                        href="#"
 | 
						||
                        class="d-table w-100 px-2 py-2 text-dark hover-white"
 | 
						||
                        data-filter-tags="ali amdaney offline"
 | 
						||
                      >
 | 
						||
                        <div class="d-table-cell align-middle status status-sm">
 | 
						||
                          <span
 | 
						||
                            class="profile-image-md rounded-circle d-block"
 | 
						||
                            style="
 | 
						||
                              background-image: url('img/demo/avatars/avatar-a.png');
 | 
						||
                              background-size: cover;
 | 
						||
                            "
 | 
						||
                          ></span>
 | 
						||
                        </div>
 | 
						||
                        <div class="d-table-cell w-100 align-middle pl-2 pr-2">
 | 
						||
                          <div class="text-truncate text-truncate-md">
 | 
						||
                            oliver.kopyuv@gotbootstrap.com
 | 
						||
                            <small class="d-block font-italic fs-xs">
 | 
						||
                              Offline
 | 
						||
                            </small>
 | 
						||
                          </div>
 | 
						||
                        </div>
 | 
						||
                      </a>
 | 
						||
                    </li>
 | 
						||
                    <li>
 | 
						||
                      <a
 | 
						||
                        href="#"
 | 
						||
                        class="d-table w-100 px-2 py-2 text-dark hover-white"
 | 
						||
                        data-filter-tags="ali amdaney busy"
 | 
						||
                      >
 | 
						||
                        <div
 | 
						||
                          class="d-table-cell align-middle status status-danger status-sm"
 | 
						||
                        >
 | 
						||
                          <span
 | 
						||
                            class="profile-image-md rounded-circle d-block"
 | 
						||
                            style="
 | 
						||
                              background-image: url('img/demo/avatars/avatar-j.png');
 | 
						||
                              background-size: cover;
 | 
						||
                            "
 | 
						||
                          ></span>
 | 
						||
                        </div>
 | 
						||
                        <div class="d-table-cell w-100 align-middle pl-2 pr-2">
 | 
						||
                          <div class="text-truncate text-truncate-md">
 | 
						||
                            oliver.kopyuv@gotbootstrap.com
 | 
						||
                            <small
 | 
						||
                              class="d-block font-italic fs-xs text-danger"
 | 
						||
                            >
 | 
						||
                              Busy
 | 
						||
                            </small>
 | 
						||
                          </div>
 | 
						||
                        </div>
 | 
						||
                      </a>
 | 
						||
                    </li>
 | 
						||
                    <li>
 | 
						||
                      <a
 | 
						||
                        href="#"
 | 
						||
                        class="d-table w-100 px-2 py-2 text-dark hover-white"
 | 
						||
                        data-filter-tags="ali amdaney offline"
 | 
						||
                      >
 | 
						||
                        <div class="d-table-cell align-middle status status-sm">
 | 
						||
                          <span
 | 
						||
                            class="profile-image-md rounded-circle d-block"
 | 
						||
                            style="
 | 
						||
                              background-image: url('img/demo/avatars/avatar-c.png');
 | 
						||
                              background-size: cover;
 | 
						||
                            "
 | 
						||
                          ></span>
 | 
						||
                        </div>
 | 
						||
                        <div class="d-table-cell w-100 align-middle pl-2 pr-2">
 | 
						||
                          <div class="text-truncate text-truncate-md">
 | 
						||
                            oliver.kopyuv@gotbootstrap.com
 | 
						||
                            <small class="d-block font-italic fs-xs">
 | 
						||
                              Offline
 | 
						||
                            </small>
 | 
						||
                          </div>
 | 
						||
                        </div>
 | 
						||
                      </a>
 | 
						||
                    </li>
 | 
						||
                    <li>
 | 
						||
                      <a
 | 
						||
                        href="#"
 | 
						||
                        class="d-table w-100 px-2 py-2 text-dark hover-white"
 | 
						||
                        data-filter-tags="ali amdaney inactive"
 | 
						||
                      >
 | 
						||
                        <div class="d-table-cell align-middle">
 | 
						||
                          <span
 | 
						||
                            class="profile-image-md rounded-circle d-block"
 | 
						||
                            style="
 | 
						||
                              background-image: url('img/demo/avatars/avatar-m.png');
 | 
						||
                              background-size: cover;
 | 
						||
                            "
 | 
						||
                          ></span>
 | 
						||
                        </div>
 | 
						||
                        <div class="d-table-cell w-100 align-middle pl-2 pr-2">
 | 
						||
                          <div class="text-truncate text-truncate-md">
 | 
						||
                            +714651347790
 | 
						||
                            <small class="d-block font-italic fs-xs opacity-50">
 | 
						||
                              Missed Call
 | 
						||
                            </small>
 | 
						||
                          </div>
 | 
						||
                        </div>
 | 
						||
                      </a>
 | 
						||
                    </li>
 | 
						||
                  </ul>
 | 
						||
                  <div class="filter-message js-filter-message"></div>
 | 
						||
                </div>
 | 
						||
              </div>
 | 
						||
              <div>
 | 
						||
                <a class="fs-xl d-flex align-items-center p-3">
 | 
						||
                  <i class="fal fa-cogs"></i>
 | 
						||
                </a>
 | 
						||
              </div>
 | 
						||
            </div>
 | 
						||
            <!-- END msgr-list -->
 | 
						||
            <!-- BEGIN msgr -->
 | 
						||
            <div class="msgr d-flex h-100 flex-column bg-white">
 | 
						||
              <!-- BEGIN custom-scroll -->
 | 
						||
              <div class="custom-scroll flex-1 h-100">
 | 
						||
                <div id="chat_container" class="w-100 p-4">
 | 
						||
                  <!-- start .chat-segment -->
 | 
						||
                  <div class="chat-segment">
 | 
						||
                    <div class="time-stamp text-center mb-2 fw-400">Jun 19</div>
 | 
						||
                  </div>
 | 
						||
                  <!--  end .chat-segment -->
 | 
						||
                  <!-- start .chat-segment -->
 | 
						||
                  <div class="chat-segment chat-segment-sent">
 | 
						||
                    <div class="chat-message">
 | 
						||
                      <p>Hey Tracey, did you get my files?</p>
 | 
						||
                    </div>
 | 
						||
                    <div class="text-right fw-300 text-muted mt-1 fs-xs">
 | 
						||
                      3:00 pm
 | 
						||
                    </div>
 | 
						||
                  </div>
 | 
						||
                  <!--  end .chat-segment -->
 | 
						||
                  <!-- start .chat-segment -->
 | 
						||
                  <div class="chat-segment chat-segment-get">
 | 
						||
                    <div class="chat-message">
 | 
						||
                      <p>Hi</p>
 | 
						||
                      <p>
 | 
						||
                        Sorry going through a busy time in office. Yes I
 | 
						||
                        analyzed the solution.
 | 
						||
                      </p>
 | 
						||
                      <p>
 | 
						||
                        It will require some resource, which I could not manage.
 | 
						||
                      </p>
 | 
						||
                    </div>
 | 
						||
                    <div class="fw-300 text-muted mt-1 fs-xs">3:24 pm</div>
 | 
						||
                  </div>
 | 
						||
                  <!--  end .chat-segment -->
 | 
						||
                  <!-- start .chat-segment -->
 | 
						||
                  <div class="chat-segment chat-segment-sent chat-start">
 | 
						||
                    <div class="chat-message">
 | 
						||
                      <p>Okay</p>
 | 
						||
                    </div>
 | 
						||
                  </div>
 | 
						||
                  <!--  end .chat-segment -->
 | 
						||
                  <!-- start .chat-segment -->
 | 
						||
                  <div class="chat-segment chat-segment-sent chat-end">
 | 
						||
                    <div class="chat-message">
 | 
						||
                      <p>
 | 
						||
                        Sending you some dough today, you can allocate the
 | 
						||
                        resources to this project.
 | 
						||
                      </p>
 | 
						||
                    </div>
 | 
						||
                    <div class="text-right fw-300 text-muted mt-1 fs-xs">
 | 
						||
                      3:26 pm
 | 
						||
                    </div>
 | 
						||
                  </div>
 | 
						||
                  <!--  end .chat-segment -->
 | 
						||
                  <!-- start .chat-segment -->
 | 
						||
                  <div class="chat-segment chat-segment-get chat-start">
 | 
						||
                    <div class="chat-message">
 | 
						||
                      <p>Perfect. Thanks a lot!</p>
 | 
						||
                    </div>
 | 
						||
                  </div>
 | 
						||
                  <!--  end .chat-segment -->
 | 
						||
                  <!-- start .chat-segment -->
 | 
						||
                  <div class="chat-segment chat-segment-get">
 | 
						||
                    <div class="chat-message">
 | 
						||
                      <p>I will have them ready by tonight.</p>
 | 
						||
                    </div>
 | 
						||
                  </div>
 | 
						||
                  <!--  end .chat-segment -->
 | 
						||
                  <!-- start .chat-segment -->
 | 
						||
                  <div class="chat-segment chat-segment-get chat-end">
 | 
						||
                    <div class="chat-message">
 | 
						||
                      <p>Cheers</p>
 | 
						||
                    </div>
 | 
						||
                  </div>
 | 
						||
                  <!--  end .chat-segment -->
 | 
						||
                  <!-- start .chat-segment for timestamp -->
 | 
						||
                  <div class="chat-segment">
 | 
						||
                    <div class="time-stamp text-center mb-2 fw-400">Jun 20</div>
 | 
						||
                  </div>
 | 
						||
                  <!--  end .chat-segment for timestamp -->
 | 
						||
                </div>
 | 
						||
              </div>
 | 
						||
              <!-- END custom-scroll  -->
 | 
						||
              <!-- BEGIN msgr__chatinput -->
 | 
						||
              <div class="d-flex flex-column">
 | 
						||
                <div
 | 
						||
                  class="border-faded border-right-0 border-bottom-0 border-left-0 flex-1 mr-3 ml-3 position-relative shadow-top"
 | 
						||
                >
 | 
						||
                  <div class="pt-3 pb-1 pr-0 pl-0 rounded-0" tabindex="-1">
 | 
						||
                    <div
 | 
						||
                      id="msgr_input"
 | 
						||
                      contenteditable="true"
 | 
						||
                      data-placeholder="Type your message here..."
 | 
						||
                      class="height-10 form-content-editable"
 | 
						||
                    ></div>
 | 
						||
                  </div>
 | 
						||
                </div>
 | 
						||
                <div
 | 
						||
                  class="height-8 px-3 d-flex flex-row align-items-center flex-wrap flex-shrink-0"
 | 
						||
                >
 | 
						||
                  <a
 | 
						||
                    href="javascript:void(0);"
 | 
						||
                    class="btn btn-icon fs-xl width-1 mr-1"
 | 
						||
                    data-toggle="tooltip"
 | 
						||
                    data-original-title="More options"
 | 
						||
                    data-placement="top"
 | 
						||
                  >
 | 
						||
                    <i class="fal fa-ellipsis-v-alt color-fusion-300"></i>
 | 
						||
                  </a>
 | 
						||
                  <a
 | 
						||
                    href="javascript:void(0);"
 | 
						||
                    class="btn btn-icon fs-xl mr-1"
 | 
						||
                    data-toggle="tooltip"
 | 
						||
                    data-original-title="Attach files"
 | 
						||
                    data-placement="top"
 | 
						||
                  >
 | 
						||
                    <i class="fal fa-paperclip color-fusion-300"></i>
 | 
						||
                  </a>
 | 
						||
                  <a
 | 
						||
                    href="javascript:void(0);"
 | 
						||
                    class="btn btn-icon fs-xl mr-1"
 | 
						||
                    data-toggle="tooltip"
 | 
						||
                    data-original-title="Insert photo"
 | 
						||
                    data-placement="top"
 | 
						||
                  >
 | 
						||
                    <i class="fal fa-camera color-fusion-300"></i>
 | 
						||
                  </a>
 | 
						||
                  <div class="ml-auto">
 | 
						||
                    <a href="javascript:void(0);" class="btn btn-info">Send</a>
 | 
						||
                  </div>
 | 
						||
                </div>
 | 
						||
              </div>
 | 
						||
              <!-- END msgr__chatinput -->
 | 
						||
            </div>
 | 
						||
            <!-- END msgr -->
 | 
						||
          </div>
 | 
						||
        </div>
 | 
						||
      </div>
 | 
						||
    </div>
 | 
						||
 | 
						||
    <div
 | 
						||
      id="noticeBlock"
 | 
						||
      style="
 | 
						||
        position: fixed;
 | 
						||
        top: 70px;
 | 
						||
        right: 0px;
 | 
						||
        padding: 20px;
 | 
						||
        transition: 0.2s;
 | 
						||
        z-index: 50000;
 | 
						||
        height: 100%;
 | 
						||
      "
 | 
						||
    ></div>
 | 
						||
 | 
						||
    <!--<button id="testsysbtn" class="btn btn-info col-1">系統監控(測試用)</button>-->
 | 
						||
    <!-- END Messenger -->
 | 
						||
    <!-- BEGIN Page Settings -->
 | 
						||
    <!-- END Page Settings -->
 | 
						||
    <!-- base vendor bundle:
 | 
						||
       DOC: if you remove pace.js from core please note on Internet Explorer some CSS animations may execute before a page is fully loaded, resulting 'jump' animations
 | 
						||
                  + pace.js (recommended)
 | 
						||
                  + jquery.js (core)
 | 
						||
                  + jquery-ui-cust.js (core)
 | 
						||
                  + popper.js (core)
 | 
						||
                  + bootstrap.js (core)
 | 
						||
                  + slimscroll.js (extension)
 | 
						||
                  + app.navigation.js (core)
 | 
						||
                  + ba-throttle-debounce.js (core)
 | 
						||
                  + waves.js (extension)
 | 
						||
                  + smartpanels.js (extension)
 | 
						||
                  + src/../jquery-snippets.js (core) -->
 | 
						||
    <!-- verdors.bundle.js 已含有 jquery Library v3.5.1-->
 | 
						||
    <script src="lib/vendors.bundle.js"></script>
 | 
						||
    <!-- toast 第三方套件 若 require 此套件只能用 define 使用,先暫時 html 引用-->
 | 
						||
    <script src="lib/notifications/toastr/toastr.min.js"></script>
 | 
						||
    <script src="lib/momentjs/moment.min.js"></script>
 | 
						||
    <script src="lib/momentjs/moment-with-locales.min.js"></script>
 | 
						||
    <script src="lib/bootstrap-datepicker/bootstrap-datepicker.min.js"></script>
 | 
						||
    <script src="lib/bootstrap-datepicker/bootstrap-datepicker.zh-TW.min.js"></script>
 | 
						||
    <script type="text/javascript">
 | 
						||
      window._datepickerDP = $.fn.datepicker;
 | 
						||
    </script>
 | 
						||
    <script src="js/toast.js"></script>
 | 
						||
    <script src="lib/echarts.min.js"></script>
 | 
						||
    <!--The order of scripts is irrelevant. Please check out the plugin pages for more details about these plugins below:-->
 | 
						||
    <script src="lib/statistics/easypiechart/easypiechart.bundle.js"></script>
 | 
						||
 | 
						||
    <!--Bajascript-->
 | 
						||
    <script src="js/bajascript/bscriptReq.js"></script>
 | 
						||
    <!--<script type='text/javascript' src='/module/js/com/tridium/js/ext/require/require.min.js?version=1496767636459'></script>-->
 | 
						||
    <script src="js/bajascript/require.js"></script>
 | 
						||
 | 
						||
    <script src="https://developer.api.autodesk.com/modelderivative/v2/viewers/7.*/viewer3D.js"></script>
 | 
						||
    <script src="js/forge/forgemodel.js"></script>
 | 
						||
    <script src="js/yourteam/plugins/yt-alert/ytpop-alert.js"></script>
 | 
						||
 | 
						||
    <script type="text/javascript">
 | 
						||
      define("niagaraSystemProperties", function () {
 | 
						||
        return {};
 | 
						||
      });
 | 
						||
    </script>
 | 
						||
    <script src="js/n4js/bajatest.js"></script>
 | 
						||
    <script src="js/n4js/electricmeterbaja.js"></script>
 | 
						||
    <script src="js/n4js/elevatorbaja.js"></script>
 | 
						||
    <script src="js/bajascript/require.config.js"></script>
 | 
						||
    <script src="js/FileSaver.js"></script>
 | 
						||
 | 
						||
    <script>
 | 
						||
      /*$('#js-page-content').smartPanel();*/
 | 
						||
      var cookies = null;
 | 
						||
      var jwt = null;
 | 
						||
      var loadingTip = "";
 | 
						||
      var pageAct = {}; //記錄全頁面已選擇項目
 | 
						||
      var timeOuters = [];
 | 
						||
      pageAct.AreaTag = "";
 | 
						||
      if (location.href.indexOf("ord") != -1) {
 | 
						||
        location.href = "/file/index.html";
 | 
						||
      }
 | 
						||
      var lastPage = sessionStorage.getItem("lastPage");
 | 
						||
      // 執行初步 Loading
 | 
						||
      var loadEle = pageLoading();
 | 
						||
      var errRecTable = null,
 | 
						||
        opeRecTable = null;
 | 
						||
      var tolSubList = [];
 | 
						||
      var allDevices = [];
 | 
						||
      var tempSubTag = ["M10", "M12"]; // 溫度向小類
 | 
						||
 | 
						||
      var sysIconList = [
 | 
						||
    { mainSys: "EE", subSys: "E1", iconClass: "./gif/E1_white.png" },
 | 
						||
    { mainSys: "EE", subSys: "E2", iconClass: "./gif/E2_white.png" },
 | 
						||
    { mainSys: "EE", subSys: "E3", iconClass: "./gif/E3_white.png" },
 | 
						||
    { mainSys: "EE", subSys: "E4", iconClass: "./gif/E4-1_white.png" }, // 電表
 | 
						||
    { mainSys: "LT", subSys: "L1", iconClass: "./gif/L1_white.png" },
 | 
						||
    { mainSys: "LT", subSys: "L2", iconClass: "./gif/L2_white.png" }, // 景觀照明 0131目前沒有
 | 
						||
    { mainSys: "ME", subSys: "M1", iconClass: "./gif/M1_white.png" }, // 儲冰 0131目前沒有
 | 
						||
    { mainSys: "ME", subSys: "M5", iconClass: "./gif/M5-2_white.png" }, // 送排風
 | 
						||
    { mainSys: "ME", subSys: "M8", iconClass: "./gif/M8_white.png" }, // 排油煙0131目前沒有
 | 
						||
    { mainSys: "ME", subSys: "M10", iconClass: "./gif/M10_white.png" },
 | 
						||
    { mainSys: "ME", subSys: "M12", iconClass: "./gif/M12_white.png" },
 | 
						||
    { mainSys: "ELEV", subSys: "EL", iconClass: "./gif/EL_white.png" },
 | 
						||
    { mainSys: "FE", subSys: "F1", iconClass: "./gif/F1_white.png" },
 | 
						||
    { mainSys: "FE", subSys: "F2", iconClass: "./gif/lamp_white.png" }, // 排煙 0131目前沒有
 | 
						||
    { mainSys: "WP", subSys: "W1", iconClass: "./gif/W1_white.png" }, // 電子水表0131目前沒有
 | 
						||
    { mainSys: "WP", subSys: "W2", iconClass: "./gif/W2_white.png" },
 | 
						||
    { mainSys: "WP", subSys: "P1", iconClass: "./gif/P1_white.png" },
 | 
						||
    { mainSys: "S", subSys: "C", iconClass: "./gif/C_white.png" }, // CCTV
 | 
						||
    { mainSys: "S", subSys: "P", iconClass: "./gif/P_white.png" }, // 緊急求救
 | 
						||
    { mainSys: "S", subSys: "R", iconClass: "./gif/R_white.png" }, // 門禁
 | 
						||
    { mainSys: "P", subSys: "PSC", iconClass: "./gif/PSC_white.png" }, // 停管
 | 
						||
    { mainSys: "W3", subSys: "W1", iconClass: "./gif/W3_white.png" }, // 0131目前沒有
 | 
						||
  ];
 | 
						||
 | 
						||
  var tempSysSubText = [
 | 
						||
    { text: "水錶系統", mainSys: "WP", subSys: "W1" },
 | 
						||
    { text: "空調系統", mainSys: "ME", subSys: "M10" }, // 2
 | 
						||
    { text: "照明系統", mainSys: "LT", subSys: "L1" }, // 3
 | 
						||
    { text: "CCTV系統", mainSys: "S", subSys: "C" }, //12
 | 
						||
    { text: "太陽能管理", mainSys: "S", subSys: "C" }, //12
 | 
						||
    { text: "冰水主機", mainSys: "WP", subSys: "W2" }, // 6
 | 
						||
    { text: "緊急發電機", mainSys: "EE", subSys: "E3" }, //10
 | 
						||
    { text: "電梯系統", mainSys: "ELEV", subSys: "EL" }, // 1
 | 
						||
    { text: "環境感測設備", mainSys: "ME", subSys: "M12" }, // 4
 | 
						||
    { text: "電錶系統", mainSys: "EE", subSys: "E4" }, // 5
 | 
						||
    { text: "高壓配電盤", mainSys: "EE", subSys: "E1" }, // 7
 | 
						||
    { text: "汙廢水設備", mainSys: "WP", subSys: "P1" }, // 8
 | 
						||
    { text: "低壓配電盤", mainSys: "EE", subSys: "E2" }, //9
 | 
						||
    { text: "消防設備", mainSys: "FE", subSys: "F1" }, //11
 | 
						||
    { text: "門禁系統", mainSys: "S", subSys: "R" }, //13
 | 
						||
    { text: "停管系統", mainSys: "P", subSys: "PSC" }, //14
 | 
						||
    { text: "緊急求救系統", mainSys: "S", subSys: "P" }, //15
 | 
						||
    { text: "送排風系統", mainSys: "ME", subSys: "M5" }, //16
 | 
						||
    //{ text: "景觀照明系統", mainSys: "LT", subSys: "L2", },
 | 
						||
    //{ text: "儲冰系統", mainSys: "ME", subSys: "M1", },
 | 
						||
    // { text: "排油煙設備", mainSys: "ME", subSys: "M8", },
 | 
						||
    //{ text: "排煙系統", mainSys: "FE", subSys: "F2", },
 | 
						||
    //{ text: "電子水錶", mainSys: "WP", subSys: "W1", },
 | 
						||
    // { text: "熱水系統", mainSys: "W3", subSys: "W1", },
 | 
						||
  ];
 | 
						||
 | 
						||
      /**
 | 
						||
       * 頁面 Loading 建立
 | 
						||
       * */
 | 
						||
      function pageLoading(text = null) {
 | 
						||
        let background = $(`<div class="loading-bg"></div>`);
 | 
						||
        let aleObj = YT.Alert.Tip(text || "讀取中,請稍後", "show");
 | 
						||
        $(background)[0]._aleObj = aleObj;
 | 
						||
        $("body").css("overflow", "hidden");
 | 
						||
        $("body .page-content-wrapper").append(background);
 | 
						||
        $(background).animate({ opacity: 1 }, 300);
 | 
						||
        return background;
 | 
						||
      }
 | 
						||
 | 
						||
      try {
 | 
						||
        $(function () {
 | 
						||
          // 二次引用 jquery.jsf
 | 
						||
          // - 在 require 內部程序需要引用 jquery,由於 require 的套件需要依賴 jquery ,就算 HTML 已經引用 jquery, require 也無法參考
 | 
						||
          // - 上方 HTML 引用套件若有使用 jquery 內存數據程序 (ex: $(x).data() , $(x).trigger("custom event") , $.fn.custom ...)
 | 
						||
          // - 會被清洗,有類似程序需放入 loadPack1 Function rquired 引用
 | 
						||
          // (原 datatable.bundle.js require 會出問題,先以 cdn datatable.min.js引用)
 | 
						||
          require.undef('baja!');
 | 
						||
          require(["jquery"], loadedBasePack);
 | 
						||
        });
 | 
						||
 | 
						||
        /**
 | 
						||
         * jquery.js 二次引用後 Callback,載入第三方套件
 | 
						||
         * */
 | 
						||
        function loadedBasePack() {
 | 
						||
          require([
 | 
						||
            "lib/bootstrap/bootstrap.bundle.min",
 | 
						||
            "lib/app.bundle",
 | 
						||
            "lib/app.menu",
 | 
						||
            "datatables.net.b4",
 | 
						||
            "lib/FixedColumns-4.2.2/js/dataTables.fixedColumns.min",
 | 
						||
            "n4js/alarmbaja",
 | 
						||
            "n4js/historybaja",
 | 
						||
            "n4js/accmanbaja",
 | 
						||
            "lib/statistics/flot/flot.bundle",
 | 
						||
            "lib/statistics/peity/peity.bundle",
 | 
						||
            "lib/jquery-validation/dist/jquery.validate",
 | 
						||
            /*"lib/jquery-validation/dist/additional-methods.min",*/ /* 會影響 messages_zh_TW 文字呈現 */
 | 
						||
            "lib/jquery-validation/dist/localization/messages_zh_TW",
 | 
						||
            "lib/jquery-ui/jquery-ui.min",
 | 
						||
            "lib/chart.js_4.1.2/chart.umd",
 | 
						||
            "lib/dropzone/dropzone-min",
 | 
						||
            "lib/jstree-master/jstree.min",
 | 
						||
            "lib/notifications/sweetalert2/sweetalert2.bundle",
 | 
						||
            "baja!",
 | 
						||
          ], loadedMasterPack);
 | 
						||
        }
 | 
						||
        /**
 | 
						||
         * 第三方套件引用後 Callback,載入額外套件
 | 
						||
         * */
 | 
						||
        function loadedMasterPack() {
 | 
						||
          require([
 | 
						||
            "yourteam/yourteam.utility.class",
 | 
						||
            "yourteam/yourteam.ajax.class",
 | 
						||
            "yourteam/yourteam.jquery.datatables",
 | 
						||
            "yourteam/plugins/yt-tooltip/yt-tooltip",
 | 
						||
            "yourteam/plugins/yt-tab/yt-tab",
 | 
						||
            "yourteam/plugins/yt-navbar/yt-navbar",
 | 
						||
            "yourteam/plugins/yt-notice/yt-notice",
 | 
						||
            "style",
 | 
						||
          ], function () {
 | 
						||
            require(["init", "site"], loadedJsPack);
 | 
						||
          });
 | 
						||
        }
 | 
						||
 | 
						||
        /**
 | 
						||
         * 全數套件讀取完成 Callback
 | 
						||
         * */
 | 
						||
        function loadedJsPack() {
 | 
						||
          $.fn.datepicker = window._datepickerDP;
 | 
						||
 | 
						||
          cookies = new YourTeam.Utility.Cookie();
 | 
						||
          jwt = cookies.get("JWT-Authorization");
 | 
						||
          pageAct.AreaTag = initAreaTag;
 | 
						||
          loadEvent();
 | 
						||
 | 
						||
          if (!jwt) {
 | 
						||
            if (location.href.indexOf("localhost:5966") != -1) {
 | 
						||
              location.href = "login.html";
 | 
						||
            }
 | 
						||
            myBaja = new MyBaja();
 | 
						||
            myBaja.setMyUserAccount(Login);
 | 
						||
          } else {
 | 
						||
            isValidLogin();
 | 
						||
          }
 | 
						||
 | 
						||
          $(loadEle).Loading("close");
 | 
						||
        }
 | 
						||
 | 
						||
        /**
 | 
						||
         * 登入驗證完成 Callback
 | 
						||
         * */
 | 
						||
        async function isValidLogin() {
 | 
						||
          getUserInfo();
 | 
						||
          iniFroList();
 | 
						||
          await isShowBuildingInMenu();
 | 
						||
          showMainSys();
 | 
						||
          getBuiList();
 | 
						||
          getSysMonBtnList();
 | 
						||
          checkDevState();
 | 
						||
          loadNoticeConSta();
 | 
						||
 | 
						||
          allDevices = getAllDevice();
 | 
						||
          if (pageAct.isShowBuildingInMenu) {
 | 
						||
            $("#buiActDrop").hide();
 | 
						||
          }
 | 
						||
 | 
						||
          timeOutGetData();
 | 
						||
 | 
						||
          function getBuiList() {
 | 
						||
            let url = baseApiUrl + "/api/Device/GetBuild";
 | 
						||
            ytAjax = new YourTeam.Ajax(
 | 
						||
              url,
 | 
						||
              null,
 | 
						||
              function (res) {
 | 
						||
                if (!res || res.code != "0000" || !res.data) {
 | 
						||
                } else {
 | 
						||
                  let strHtml = ``;
 | 
						||
                  $.each(res.data, (index, buiObj) => {
 | 
						||
                    strHtml += `<a id="buiBtn${buiObj.building_tag}" data-urn="${buiObj.urn_3D}" class="dropdown-item" href="javascript:;">${buiObj.full_name}</a>`;
 | 
						||
                  });
 | 
						||
                  pageAct.buildList = res.data;
 | 
						||
 | 
						||
                  //$("#buiList").append(strHtml).droSetItem(); //droSetItem 預設第一筆 active
 | 
						||
                }
 | 
						||
              },
 | 
						||
              null,
 | 
						||
              "POST"
 | 
						||
            ).send();
 | 
						||
          }
 | 
						||
 | 
						||
          //lily test
 | 
						||
          function checkDevState() {
 | 
						||
            //TPE_B1_LT_L1
 | 
						||
            //main_system_tag: pageAct.sysMainTag,
 | 
						||
            //building_tag: pageAct.buiTag,
 | 
						||
            //floor_tag: pageAct.floTag,
 | 
						||
            // let systemPath = "TPE_B1";
 | 
						||
            // if (pageAct != undefined && pageAct != null && pageAct.sysMainTag != null && pageAct.buiTag != null) {
 | 
						||
            //     systemPath = "TPE_" + pageAct.buiTag + "_" + pageAct.sysMainTag + "_" + "EL";
 | 
						||
            // }
 | 
						||
            //getOneSystemAlarmStateByBaja(systemPath, callbackForCheckDevState);
 | 
						||
            // console.log("systemP: " + systemPath);
 | 
						||
            // console.log("devList: " + deviceList[0].device_guid + ", " + deviceList[3].device_guid + ", " + deviceList[8].device_guid);
 | 
						||
            //callbackForCheckDevState("test");
 | 
						||
          }
 | 
						||
 | 
						||
          function callbackForCheckDevState(result) {
 | 
						||
            // console.log("------ " + result);
 | 
						||
            // $.each(deviceList, (index, devObj) => {
 | 
						||
            //     if ((`${devObj.device_guid}`) == '4ed28a93-5025-11ed-b23e-0242ac110002'
 | 
						||
            //         || (`${devObj.device_guid}`) == '5d9fdff0-5343-43fe-86f4-bd73cdb15111') {
 | 
						||
            //         var str = "";
 | 
						||
            //         $(`#${devObj.device_guid}`).empty();
 | 
						||
            //         str = `<span class="status status-danger d-inline-block"><img src="${baseImgUrl + varPathImg + devObj.device_master_icon}" class="profile-image rounded-circle" onerror="defDev(this)" alt="..."></span> ${devObj.full_name}`;
 | 
						||
            //         $(`#${devObj.device_guid}`).append(str);
 | 
						||
            //     }
 | 
						||
            // })
 | 
						||
            // console.log(result);
 | 
						||
          }
 | 
						||
        }
 | 
						||
 | 
						||
        // page loaded callback
 | 
						||
        function loadCallback() {
 | 
						||
          initTabsByEle();
 | 
						||
          resetYTTooltip();
 | 
						||
          $("#sysMonTopBtn").YTNavbar("hide");
 | 
						||
          setTopBuildingText();
 | 
						||
        }
 | 
						||
 | 
						||
        // 事件先行讀取
 | 
						||
        function loadEvent() {
 | 
						||
          // 刷新頁面計時器
 | 
						||
          let refreshPageTimer = null;
 | 
						||
          onEvent("click", "[name=topFunBtn]", function (e) {
 | 
						||
            _ytTabInited = [];
 | 
						||
            let page = $(this).data("page");
 | 
						||
            console.log("page", page);
 | 
						||
            if (!page) {
 | 
						||
              e.stopPropagation();
 | 
						||
              return;
 | 
						||
            }
 | 
						||
            if (
 | 
						||
              page != "systemMonitor" &&
 | 
						||
              page != "sysElevator"
 | 
						||
              //  && page != "sysSensor"
 | 
						||
            ) {
 | 
						||
              $("#sysMonBtnList [name=topFunBtn]").removeClass("active");
 | 
						||
              pageAct.sysMainTag = null;
 | 
						||
              pageAct.sysSubTag = null;
 | 
						||
            } else {
 | 
						||
              setSysTagForPageAct(this);
 | 
						||
              $("#sysMonTopBtn").YTTab("set");
 | 
						||
              $(`#subSysBtn${pageAct.sysSubTag}`).YTTab("set");
 | 
						||
 | 
						||
              if (pageAct.isShowBuildingInMenu) {
 | 
						||
                let building_tag = $(this).data("building-tag");
 | 
						||
                $(`#buildTab${building_tag}`).YTTab("set");
 | 
						||
              }
 | 
						||
            }
 | 
						||
            // 取消當前所有 baja 訂閱
 | 
						||
            $.each(tolSubList, (idx, sub) => {
 | 
						||
              sub.unsubscribeAll();
 | 
						||
              sub.detach();
 | 
						||
            });
 | 
						||
            // 清空 baja 訂閱紀錄
 | 
						||
            tolSubList = [];
 | 
						||
            // 清空 loading 狀態
 | 
						||
            endPageLoading();
 | 
						||
 | 
						||
            // $(loadEle).Loading("close");
 | 
						||
            $(".yt-alert").YTAlert().hide();
 | 
						||
            // 取得使用者資訊
 | 
						||
            getUserInfo();
 | 
						||
            // 存取現在頁面 (重整讀取紀錄用)
 | 
						||
            sessionStorage.setItem("lastPage", page);
 | 
						||
            sessionStorage.setItem("pageAct", JSON.stringify(pageAct));
 | 
						||
            // 讀取子頁面
 | 
						||
            
 | 
						||
            $("#app").load(`_${page}.html`, loadCallback);
 | 
						||
          });
 | 
						||
 | 
						||
          onEvent("click", "#logout", function () {
 | 
						||
            localStorage.removeItem("JWT-Authorization");
 | 
						||
            sessionStorage.removeItem("pageAct");
 | 
						||
            sessionStorage.removeItem("lastPage");
 | 
						||
            location.href = "/logout";
 | 
						||
          });
 | 
						||
 | 
						||
          onEvent("active:change", "#buiList", function (e, actEle) {
 | 
						||
            if (actEle) {
 | 
						||
              pageAct.buiTag = $(actEle).prop("id").split("buiBtn")[1];
 | 
						||
              pageAct.buiName = $(actEle).text();
 | 
						||
              pageAct.urn = $(actEle).data("urn");
 | 
						||
              console.log("building");
 | 
						||
 | 
						||
              clearTimeout(refreshPageTimer);
 | 
						||
              refreshPageTimer = setTimeout(() => {
 | 
						||
                refreshSubPage();
 | 
						||
              }, 0);
 | 
						||
            }
 | 
						||
          });
 | 
						||
 | 
						||
          onEvent(
 | 
						||
            "yt:tab:change",
 | 
						||
            "[data-tabname=buildTab]",
 | 
						||
            function (e, arg) {
 | 
						||
              pageAct.buiTag = buildingTagOnProcess($(this).prop("id").split("buildTab")[1]);
 | 
						||
              pageAct.buiName = $(this).text();
 | 
						||
              pageAct.urn = $(this).data("urn");
 | 
						||
              $(this).parents("ul").find("a").removeClass("active");
 | 
						||
              $(this).parent("a").addClass("active");
 | 
						||
              console.log(e, arg);
 | 
						||
 | 
						||
              clearTimeout(refreshPageTimer);
 | 
						||
              refreshPageTimer = setTimeout(() => {
 | 
						||
                if (!arg) {
 | 
						||
                  refreshSubPage("dashboard");
 | 
						||
                } else if(arg.triggerType == "first") {
 | 
						||
                  refreshSubPage();
 | 
						||
                }
 | 
						||
              }, 0);
 | 
						||
            }
 | 
						||
          );
 | 
						||
 | 
						||
          onEvent("yt:tab:change", "#lightSch-tab", function () {
 | 
						||
            if (pageAct.sysMainTag == "LT" && $("#lightSchModal").length != 0) {
 | 
						||
              setLightSchBlcok ? setLightSchBlcok(this) : "";
 | 
						||
              $("#lightSchModal").modal("show");
 | 
						||
            }
 | 
						||
          });
 | 
						||
 | 
						||
          onEvent(
 | 
						||
            "yt:tab:prechange",
 | 
						||
            "[data-tabname=topFunBtn]",
 | 
						||
            function (e, arg) {
 | 
						||
              if ($(this)[0].id == "sysMonTopBtn" || !$(this).data("page")) {
 | 
						||
                arg.cancel = true;
 | 
						||
              }
 | 
						||
            }
 | 
						||
          );
 | 
						||
 | 
						||
          onEvent("scroll", window, function () {
 | 
						||
            if ($(window).scrollTop() != 0) {
 | 
						||
              $("#noticeBlock").css("top", 0);
 | 
						||
            } else {
 | 
						||
              $("#noticeBlock").css("top", 70);
 | 
						||
            }
 | 
						||
          });
 | 
						||
 | 
						||
          onEvent("click", "#testsysbtn", function () {});
 | 
						||
 | 
						||
          //onEvent("click", "button[id^=noticeChkBtn]", function () {
 | 
						||
          //    $(this).parents(".toast").YTNotice("hide");
 | 
						||
          //})
 | 
						||
 | 
						||
          onEvent("click", "button[id^=noticeChkBtn]", function () {
 | 
						||
            /**button[id^=bajaAckBtn] */ let uuid = $(this).data("uuid");
 | 
						||
            let url = window.location.origin + "/obix/alarm/" + uuid + "/ack";
 | 
						||
            let myBaja = new MyBaja();
 | 
						||
            myBaja.setMyUserAccount((data) => {
 | 
						||
              let sendData =
 | 
						||
                '<obj is="obix:AckAlarmIn"><str name="ackUser" val="obix" /></obj>';
 | 
						||
              $.post(
 | 
						||
                url,
 | 
						||
                sendData,
 | 
						||
                (rel) => {
 | 
						||
                  console.log(rel);
 | 
						||
                  $(this).parents(".toast").YTNotice("hide");
 | 
						||
                },
 | 
						||
                "text"
 | 
						||
              );
 | 
						||
            });
 | 
						||
          });
 | 
						||
 | 
						||
          onEvent("click", "#toggleNoticeBtn", function () {
 | 
						||
            chaNoticeConSta();
 | 
						||
          });
 | 
						||
 | 
						||
          $(window).on("timeout:3s", function () {
 | 
						||
            getSystemAlarmByBaja((data) => {
 | 
						||
              if (typeof getAlarmSub != "undefined" && getAlarmSub) {
 | 
						||
                getAlarmSub(data);
 | 
						||
              }
 | 
						||
 | 
						||
              alarmIconBlink(data);
 | 
						||
            });
 | 
						||
            getAlarm();
 | 
						||
          });
 | 
						||
        }
 | 
						||
 | 
						||
        // 登入驗證
 | 
						||
        function Login(account) {
 | 
						||
          console.log(account);
 | 
						||
          /*if ($("#login-form").valid()) {*/
 | 
						||
 | 
						||
          var url = baseApiUrl + "/api/Login/";
 | 
						||
          var send_data = {
 | 
						||
            account: account,
 | 
						||
            password: "rJ2T5Kkj",
 | 
						||
          };
 | 
						||
          if (location.href.indexOf("localhost:5966") != -1) {
 | 
						||
            location.href = "login.html";
 | 
						||
          }
 | 
						||
          $.ajax({
 | 
						||
            method: "post",
 | 
						||
            url: url,
 | 
						||
            data: JSON.stringify(send_data),
 | 
						||
            async: false,
 | 
						||
            contentType: "application/json; charset=UTF-8",
 | 
						||
            dataType: "json",
 | 
						||
            success: function (rel) {
 | 
						||
              if (rel.code != "0000") {
 | 
						||
                toast_error(rel.msg || common.SysErr);
 | 
						||
                return;
 | 
						||
              } else {
 | 
						||
                /*toast_ok(rel.msg);*/
 | 
						||
                cookies.create(
 | 
						||
                  "JWT-Authorization",
 | 
						||
                  rel.data.token,
 | 
						||
                  12 * 60 * 60 * 1000
 | 
						||
                );
 | 
						||
                isValidLogin();
 | 
						||
              }
 | 
						||
            },
 | 
						||
            error: function (xhr, textStatus, thrownError) {
 | 
						||
              alert(common.SysErr);
 | 
						||
            },
 | 
						||
          });
 | 
						||
        }
 | 
						||
 | 
						||
        function refreshSubPage(toPage = null) {
 | 
						||
          lastPage = sessionStorage.getItem("lastPage");
 | 
						||
          console.log("lastPage", lastPage);
 | 
						||
          if (toPage) {
 | 
						||
            lastPage = toPage;
 | 
						||
          }
 | 
						||
 | 
						||
          if (lastPage) {
 | 
						||
            let lastPageAct = {};
 | 
						||
 | 
						||
            if (sessionStorage.getItem("pageAct") && isJSON(sessionStorage.getItem("pageAct"))) {
 | 
						||
              lastPageAct = JSON.parse(sessionStorage.getItem("pageAct"));
 | 
						||
            }
 | 
						||
 | 
						||
            if (
 | 
						||
              (lastPageAct.sysSubTag && lastPage == "systemMonitor") ||
 | 
						||
              lastPage == "sysElevator"
 | 
						||
              //  || lastPage == "sysSensor"
 | 
						||
            ) {
 | 
						||
              $("#sysMonTopBtn").YTTab("set");
 | 
						||
              if (!pageAct.isShowBuildingInMenu) {
 | 
						||
                $(`#subSysBtn${lastPageAct.sysSubTag}`).click();
 | 
						||
              } else {
 | 
						||
                $(
 | 
						||
                  `#subSysBtn${lastPageAct.sysSubTag}[data-building-tag=${buildingTagOnJquery(pageAct.buiTag)}]`
 | 
						||
                ).click();
 | 
						||
              }
 | 
						||
            } else {
 | 
						||
              $(`[data-tabname=topFunBtn][data-page=${lastPage}]`).YTTab(
 | 
						||
                "setAndClick"
 | 
						||
              );
 | 
						||
            }
 | 
						||
 | 
						||
            /*$(`[name=topFunBtn][data-page=${lastPage}]`).click();*/
 | 
						||
          } else {
 | 
						||
            $("#app").load("_schoolView.html", loadCallback);
 | 
						||
          }
 | 
						||
        }
 | 
						||
 | 
						||
        //==============================================================================
 | 
						||
        //                       ↓  系統監控 - 共用 Function ↓
 | 
						||
        //==============================================================================
 | 
						||
 | 
						||
        // Card - 基本資料 Table
 | 
						||
        function drawInfoTabBlo(devGuid) {
 | 
						||
          let tabEle = $(
 | 
						||
            `<table class="table table-bordered table-striped text-center m-0">`
 | 
						||
          );
 | 
						||
          let tbody = tabEle.append("<tbody>");
 | 
						||
          let columnNames = ["設備編號", "設備名稱"];
 | 
						||
 | 
						||
          $.each(columnNames, (index, colName) => {
 | 
						||
            let tr = $("<tr></tr>");
 | 
						||
            let td = $("<td></td>");
 | 
						||
            td.text(colName);
 | 
						||
            tr.append(td);
 | 
						||
            tbody.append(tr);
 | 
						||
          });
 | 
						||
 | 
						||
          let url = baseApiUrl + "/api/Device/GetBaseDevice";
 | 
						||
          let sendData = {
 | 
						||
            device_guid: devGuid,
 | 
						||
          };
 | 
						||
          objSendData.Data = sendData;
 | 
						||
          ytAjax = new YourTeam.Ajax(
 | 
						||
            url,
 | 
						||
            objSendData,
 | 
						||
            function (res) {
 | 
						||
              if (!res || res.code != "0000" || !res.data) {
 | 
						||
              } else {
 | 
						||
                tbody
 | 
						||
                  .find("tr")
 | 
						||
                  .eq(0)
 | 
						||
                  .append(creEle("td", deviceNumber(res.data.device_number)));
 | 
						||
                tbody.find("tr").eq(1).append(creEle("td", res.data.full_name));
 | 
						||
              }
 | 
						||
            },
 | 
						||
            null,
 | 
						||
            "POST"
 | 
						||
          ).send();
 | 
						||
 | 
						||
          return tabEle.prop("outerHTML");
 | 
						||
        }
 | 
						||
 | 
						||
        // Card - 異常紀錄 block
 | 
						||
        function drawErrRecTabBlo() {
 | 
						||
          let strHtml = `<table id="errRecTable" class="table table-bordered table-striped text-center m-0 w-100">
 | 
						||
 | 
						||
                                                                              </table>`;
 | 
						||
          return strHtml;
 | 
						||
        }
 | 
						||
 | 
						||
        // Card - 運維紀錄 block
 | 
						||
        function drawOpeRecTabBlo() {
 | 
						||
          let strHtml = `<table id="opeRecTable" class="table table-bordered table-striped text-center m-0 w-100">
 | 
						||
 | 
						||
                                                                              </table>`;
 | 
						||
          return strHtml;
 | 
						||
        }
 | 
						||
 | 
						||
        // Card 呈現初始化
 | 
						||
        function initPopover(
 | 
						||
          type = null,
 | 
						||
          extOption = {},
 | 
						||
          selector = "[name=devItem]"
 | 
						||
        ) {
 | 
						||
          if (type == null && pageAct.sysMainTag == "LT") {
 | 
						||
            type = "light";
 | 
						||
          }
 | 
						||
 | 
						||
          $(selector).each((index, ele) => {
 | 
						||
            let devNum = $(ele).data("number"); //設備編號
 | 
						||
            let devGuid = $(ele).data("id"); //guid
 | 
						||
            let devName = $(ele).data("name"); //full_name
 | 
						||
            let lightHtml =
 | 
						||
              type == "light"
 | 
						||
                ? `<button type="button" data-toggle="tooltip" data-placement="bottom" title="燈控排程" id="lightSch-tab" class="px-2 btn btn-icon border-0 nav-link mx-1" role="tab" data-tabname="cardTab" data-target="#lightSch"><i class="fas fa-calendar-alt icon fa-2x"></i></button>`
 | 
						||
                : "";
 | 
						||
 | 
						||
            let option = {
 | 
						||
              html: `<div class="card m-1 border device-wrap" data-number="${deviceNumber(devNum)}" data-position="left">
 | 
						||
                                          <div class="card-header p-3">
 | 
						||
 | 
						||
                                              <div class="position-absolute mr-5" style="word-break: break-all;">
 | 
						||
                                                  <label class="m-0 mt-2">${devName}</label>
 | 
						||
                                              </div>
 | 
						||
                                              <div id="card-tab" class="row justify-content-end nav nav-tabs" role="tablist">
 | 
						||
                                                  <button type="button" id="state-tab"
 | 
						||
                                                  data-toggle="tooltip" data-placement="bottom" title="即時監控"
 | 
						||
                                                  class="px-2 btn btn-icon border-0 nav-link active mx-1" role="tab" data-tabname="cardTab" data-target="#state"><i class="fa fa-desktop icon fa-2x"></i></button>
 | 
						||
                                                  ${lightHtml}
 | 
						||
                                                  <button type="button" id="info-tab"
 | 
						||
                                                  data-toggle="tooltip" data-placement="bottom" title="基本資料"
 | 
						||
                                                  class="px-2 btn btn-icon border-0 nav-link mx-1" role="tab" data-tabname="cardTab" data-target="#info"><i class="fa fa-cog icon fa-2x"></i></button>
 | 
						||
                                                  <button type="button"
 | 
						||
                                                  d data-toggle="tooltip" data-placement="bottom" title="告警資料"
 | 
						||
                                                  id="errRec-tab" class=" px-2 btn btn-icon border-0 nav-link mx-1 position-relative " role="tab" data-tabname="cardTab" data-target="#errRec"><i class="fas fa-exclamation-triangle fa-2x"></i></button>
 | 
						||
                                                  <button type="button"
 | 
						||
                                                  data-toggle="tooltip" data-placement="bottom" title="運維紀錄"
 | 
						||
                                                  id="opeRec-tab" class=" px-2 btn btn-icon border-0 nav-link mx-1" role="tab" data-tabname="cardTab" data-target="#opeRec"><i class="fa fa-bars icon fa-2x"></i></button>
 | 
						||
 | 
						||
                                                  <button type="button" class="px-2 btn btn-icon border-0 nav-link mx-1"><i class="fas fa-times text-white-50 fa-2x" data-close="yttooltip"></i></button>
 | 
						||
 | 
						||
                                              </div>
 | 
						||
                                          </div>
 | 
						||
                                          <div class="card-body p-2 tab-content w-100">
 | 
						||
                                              <div id="state" class="show active w-100" data-tabname="cardTab" data-tabrole="child" >
 | 
						||
                                                  ${drawStateTabBlo(devNum)}
 | 
						||
                                              </div>
 | 
						||
                                              <div id="info" data-tabname="cardTab" data-tabrole="child">
 | 
						||
 | 
						||
                                              </div>
 | 
						||
                                              <div id="errRec" data-tabname="cardTab" data-tabrole="child">
 | 
						||
                                                  ${drawErrRecTabBlo()}
 | 
						||
                                              </div>
 | 
						||
                                              <div id="opeRec" data-tabname="cardTab" data-tabrole="child">
 | 
						||
                                                  ${drawOpeRecTabBlo()}
 | 
						||
                                              </div>
 | 
						||
                                          </div>
 | 
						||
                                      </div>`,
 | 
						||
              group: "device",
 | 
						||
              // 在 _sysElevator.html 及 _sysMonAll.html 會用到
 | 
						||
              onShow: function (tooltipEle, oriEle) {
 | 
						||
                // 執行 pop 視窗上方 Tab 類別
 | 
						||
                new YT.Tab({ tabName: "cardTab" });
 | 
						||
                // 系統監控才會有 data-devobj 屬性
 | 
						||
                let devObj = $(oriEle).data("devobj");
 | 
						||
                // 讀取運維列表
 | 
						||
                loadOpeRecTable(devGuid);
 | 
						||
                // 讀取異常列表
 | 
						||
                loadErr($(oriEle).data("number"));
 | 
						||
                // 讀取設備基本資料列表
 | 
						||
                $(tooltipEle)
 | 
						||
                  .find("#info")
 | 
						||
                  .html(
 | 
						||
                    typeof drawInfoTabBlo != "undefined"
 | 
						||
                      ? drawInfoTabBlo(devGuid)
 | 
						||
                      : ""
 | 
						||
                  );
 | 
						||
                // 聚焦熱點
 | 
						||
                const eleDbId = parseInt($(oriEle).data("dbId"));
 | 
						||
                if (eleDbId) {
 | 
						||
                  if (alarmDbIdList.some((dbId) => dbId == eleDbId)) {
 | 
						||
                    changeScaleForHotspot(eleDbId);
 | 
						||
                  } else {
 | 
						||
                    controlFocusHotspot(eleDbId);
 | 
						||
                  }
 | 
						||
                }
 | 
						||
                // 3D 視角 ZOOM IN 聚焦
 | 
						||
 | 
						||
                if (devObj) {
 | 
						||
                  console.log("devObj", devObj);
 | 
						||
                  moveViewToDevice(devObj?.forge_dbid);
 | 
						||
                }
 | 
						||
 | 
						||
                // pop 視窗卡片可拖移功能初始化
 | 
						||
                $(tooltipEle).draggable({
 | 
						||
                  cursor: "move",
 | 
						||
                  handle: ".card-header", // 只能通过卡片的标题栏拖拽
 | 
						||
                  containment: "document",
 | 
						||
                  scroll: true,
 | 
						||
                });
 | 
						||
                // pop 視窗卡片可縮放功能初始化
 | 
						||
                // $(tooltipEle).resizable({
 | 
						||
                //     // resize: function (event, ui) {
 | 
						||
                //     //     let iframe = $(ui.element).find("iframe");
 | 
						||
                //     //     if (iframe.length != 0) {
 | 
						||
                //     //         if (ui.size.width != ui.originalSize.width) {
 | 
						||
                //     //             iframe.css("width", "100%");
 | 
						||
                //     //         } else if (ui.size.height != ui.originalSize.height) {
 | 
						||
                //     //             iframe.css("height", "100%");
 | 
						||
                //     //         }
 | 
						||
                //     //     }
 | 
						||
                //     //     let cardBodyHeight = $(ui.element).find(".card-body").css("height");
 | 
						||
                //     //     $(ui.element).find(".scrolledTable").css("height", cardBodyHeight)
 | 
						||
 | 
						||
                //     //     errRecTable.draw(false)
 | 
						||
                //     // },
 | 
						||
                //     // minWidth: 200,
 | 
						||
                //     // minHeight: 150,
 | 
						||
                // });
 | 
						||
                // 電梯管理 - Card table 更新
 | 
						||
                typeof subDeviceSetTable != "undefined"
 | 
						||
                  ? subDeviceSetTable($(oriEle).data("number"))
 | 
						||
                  : "";
 | 
						||
              },
 | 
						||
              onHide: function (tooltipEle, oriEle) {
 | 
						||
                const eleDbId = $(oriEle).data("dbId");
 | 
						||
                if (eleDbId) {
 | 
						||
                  if (alarmDbIdList.some((dbId) => dbId == eleDbId)) {
 | 
						||
                    changeScaleForHotspot(eleDbId, false);
 | 
						||
                  } else {
 | 
						||
                    // 3D 熱點解除
 | 
						||
                    controlFocusHotspot(eleDbId, false);
 | 
						||
                  }
 | 
						||
                }
 | 
						||
                // sysMonFloor Echart 解除 focus
 | 
						||
                typeof chartUnFocus != "undefined" ? chartUnFocus(oriEle) : "";
 | 
						||
              },
 | 
						||
            };
 | 
						||
 | 
						||
            $.extend(option, extOption);
 | 
						||
 | 
						||
            $(ele).YTTooltip(option);
 | 
						||
          });
 | 
						||
        }
 | 
						||
 | 
						||
        // 卡片設備名稱點擊事件
 | 
						||
        function devItemNameEvent() {
 | 
						||
          onEvent("click", "[name=devItemName]", function () {
 | 
						||
            let devNum = $(this).data("number");
 | 
						||
            let devObj = $(`[name=devItem][data-number=${deviceNumber(devNum)}]`).data(
 | 
						||
              "devobj"
 | 
						||
            );
 | 
						||
			if(devObj){
 | 
						||
				moveViewToDevice(devObj.forge_dbid);
 | 
						||
			}
 | 
						||
          });
 | 
						||
        }
 | 
						||
 | 
						||
        // Card - 運維紀錄 Table
 | 
						||
        function loadOpeRecTable(devGuid) {
 | 
						||
          if (opeRecTable) {
 | 
						||
            opeRecTable.destroy();
 | 
						||
          }
 | 
						||
          let url =
 | 
						||
            baseApiUrl + "/api/Device/GetOpeDevice?device_guid=" + devGuid;
 | 
						||
          let tag = "#opeRecTable";
 | 
						||
 | 
						||
          let column_defs = [
 | 
						||
            { targets: [0], width: "8%", sortable: true },
 | 
						||
            { targets: [1], width: "8%", sortable: true },
 | 
						||
            { targets: [2], width: "7%", sortable: true },
 | 
						||
            { targets: [3], width: "7%", sortable: true },
 | 
						||
          ];
 | 
						||
 | 
						||
          let columns = [
 | 
						||
            {
 | 
						||
              title: "類型",
 | 
						||
              data: "work_type_name",
 | 
						||
            },
 | 
						||
            {
 | 
						||
              title: "項目",
 | 
						||
              data: "fix_do",
 | 
						||
            },
 | 
						||
            {
 | 
						||
              title: "處理人員",
 | 
						||
              data: "work_person_name",
 | 
						||
            },
 | 
						||
            {
 | 
						||
              title: "發生/完成時間",
 | 
						||
              data: "finishTime",
 | 
						||
              render: function (data, type, row) {
 | 
						||
                return row.createdAt + "<br>" + data;
 | 
						||
              },
 | 
						||
            },
 | 
						||
          ];
 | 
						||
 | 
						||
          opeRecTable = new YourTeam.JqDataTables.getTableByAjax(
 | 
						||
            url,
 | 
						||
            tag,
 | 
						||
            null,
 | 
						||
            columns,
 | 
						||
            column_defs,
 | 
						||
            null,
 | 
						||
            null,
 | 
						||
            null,
 | 
						||
            null,
 | 
						||
            null,
 | 
						||
            null,
 | 
						||
            "<'scrolledTable'tpi>"
 | 
						||
          );
 | 
						||
        }
 | 
						||
 | 
						||
        function loadLightSchTable(devGuid) {
 | 
						||
          /*let url = baseApiUrl + "/api/Device/GetOpeDevice?device_guid=" + devGuid;*/
 | 
						||
          let url = `https://63772efc5c47776512165937.mockapi.io/api/GetLightSche`;
 | 
						||
          let tag = "#lightSchTable";
 | 
						||
 | 
						||
          let column_defs = [
 | 
						||
            { targets: [0], width: "14%", sortable: true },
 | 
						||
            { targets: [1], width: "14%", sortable: true },
 | 
						||
            { targets: [2], width: "14%", sortable: true },
 | 
						||
            { targets: [3], width: "14%", sortable: true },
 | 
						||
            { targets: [4], width: "14%", sortable: true },
 | 
						||
            { targets: [5], width: "14%", sortable: true },
 | 
						||
            { targets: [6], width: "16%", sortable: true },
 | 
						||
          ];
 | 
						||
 | 
						||
          let columns = [
 | 
						||
            {
 | 
						||
              title: "序號",
 | 
						||
              data: null,
 | 
						||
              render: function (data, type, row, meta) {
 | 
						||
                return meta.row + 1;
 | 
						||
              },
 | 
						||
            },
 | 
						||
            {
 | 
						||
              title: "排程名稱",
 | 
						||
              data: "sch_name",
 | 
						||
            },
 | 
						||
            {
 | 
						||
              title: "設備數量",
 | 
						||
              data: "dev_cnt",
 | 
						||
            },
 | 
						||
            {
 | 
						||
              title: "排程設定",
 | 
						||
              data: "sch_set",
 | 
						||
            },
 | 
						||
            {
 | 
						||
              title: "動作",
 | 
						||
              data: "action",
 | 
						||
            },
 | 
						||
            {
 | 
						||
              title: "狀態",
 | 
						||
              data: "status",
 | 
						||
            },
 | 
						||
            {
 | 
						||
              title: "功能",
 | 
						||
              data: "sch_id",
 | 
						||
              render: function (data, type, row) {
 | 
						||
                let btnDiv = creDiv(["row", "m-0", "justify-content-center"], {
 | 
						||
                  style: "gap:10px",
 | 
						||
                });
 | 
						||
                let icon = creI(["fas", "fa-pencil-alt"]);
 | 
						||
                btnDiv.append(
 | 
						||
                  creBtnHtml("觸發執行", "lightSchTabTogBtn" + data, null, [
 | 
						||
                    "btn",
 | 
						||
                    "btn-success",
 | 
						||
                  ])
 | 
						||
                );
 | 
						||
                btnDiv.append(
 | 
						||
                  creBtn(
 | 
						||
                    "修改",
 | 
						||
                    "lightSchTabEdiBtn" + data,
 | 
						||
                    null,
 | 
						||
                    ["btn", "btn-danger"],
 | 
						||
                    { toggle: "modal", target: "#delModal" }
 | 
						||
                  ).append(icon)
 | 
						||
                );
 | 
						||
                return btnDiv.outerHtml();
 | 
						||
              },
 | 
						||
            },
 | 
						||
          ];
 | 
						||
 | 
						||
          let lightSchTable = new YourTeam.JqDataTables.getTableByAjax(
 | 
						||
            url,
 | 
						||
            tag,
 | 
						||
            null,
 | 
						||
            columns,
 | 
						||
            column_defs,
 | 
						||
            null,
 | 
						||
            null,
 | 
						||
            null,
 | 
						||
            null,
 | 
						||
            null,
 | 
						||
            null,
 | 
						||
            "tpi"
 | 
						||
          );
 | 
						||
        }
 | 
						||
 | 
						||
        function controlFocusHotspot(dbId, open = true) {
 | 
						||
          pageAct.sysSubTag !== "L1" &&
 | 
						||
            pageAct.sysSubTag !== "M12" &&
 | 
						||
            console.log("dbId", dbId);
 | 
						||
          pageAct.sysSubTag !== "L1" &&
 | 
						||
            pageAct.sysSubTag !== "M12" &&
 | 
						||
            changeColorForHotspot(dbId, open ? "focus" : null);
 | 
						||
          changeScaleForHotspot(dbId, open);
 | 
						||
        }
 | 
						||
 | 
						||
        // Baja 取得異常紀錄
 | 
						||
        function loadErr(allPath) {
 | 
						||
          if (allPath != undefined && allPath != null) {
 | 
						||
            getOneDeviceAlarmTop10ByBaja(allPath, callbackForErr);
 | 
						||
          } else {
 | 
						||
            console.log("no device");
 | 
						||
          }
 | 
						||
        }
 | 
						||
 | 
						||
        // Card - 異常紀錄 Table
 | 
						||
        function callbackForErr(result) {
 | 
						||
          // console.log("@@@",result)
 | 
						||
          if (errRecTable) {
 | 
						||
            errRecTable.destroy();
 | 
						||
          }
 | 
						||
 | 
						||
          let tag = "#errRecTable";
 | 
						||
          let datas;
 | 
						||
 | 
						||
          let column_defs = [
 | 
						||
            { targets: [0], width: "15%", sortable: true },
 | 
						||
            { targets: [1], width: "25%", sortable: true },
 | 
						||
            { targets: [2], width: "25%", sortable: true },
 | 
						||
            { targets: [3], width: "35%", sortable: true },
 | 
						||
          ];
 | 
						||
 | 
						||
          let columns = [
 | 
						||
            {
 | 
						||
              title: "異常ID",
 | 
						||
              data: "uuid",
 | 
						||
            },
 | 
						||
            {
 | 
						||
              title: "異常原因",
 | 
						||
              data: "msgText",
 | 
						||
            },
 | 
						||
            {
 | 
						||
              title: "ACK確認",
 | 
						||
              data: "ackState",
 | 
						||
            },
 | 
						||
            {
 | 
						||
              title: "發生/完成時間",
 | 
						||
              data: "normalTime",
 | 
						||
              // "render": function (data, type, row) {
 | 
						||
              //     return row.timestamp + "<br>" + data;
 | 
						||
              // },
 | 
						||
            },
 | 
						||
          ];
 | 
						||
 | 
						||
          let json_object = JSON.parse(result);
 | 
						||
          datas = json_object["data"];
 | 
						||
          errRecTable = new YourTeam.JqDataTables.getTableByStatic(
 | 
						||
            tag,
 | 
						||
            datas,
 | 
						||
            columns,
 | 
						||
            column_defs,
 | 
						||
            null,
 | 
						||
            null,
 | 
						||
            null,
 | 
						||
            null,
 | 
						||
            "<'scrolledTable'tpi>"
 | 
						||
          );
 | 
						||
        }
 | 
						||
 | 
						||
        //根據 data-type 設置顏色 (判斷後台是否有設定,若無則帶預設)
 | 
						||
        function setLightColor() {
 | 
						||
          $("[data-light-type]").each((index, ele) => {
 | 
						||
            let type = $(ele).data("light-type");
 | 
						||
            let isFlashing = false;
 | 
						||
            let color = "#000";
 | 
						||
            switch (type) {
 | 
						||
              case "normal":
 | 
						||
                color =
 | 
						||
                  pageAct.sysSubObj.device_normal_color ??
 | 
						||
                  "var(--theme-success)";
 | 
						||
                isFlashing = pageAct.sysSubObj.device_normal_flashing == "1";
 | 
						||
                break;
 | 
						||
              case "close":
 | 
						||
                color =
 | 
						||
                  pageAct.sysSubObj.device_close_color ??
 | 
						||
                  "var(--theme-secondary)";
 | 
						||
                isFlashing = pageAct.sysSubObj.device_close_flashing == "1";
 | 
						||
                break;
 | 
						||
              case "error":
 | 
						||
                color =
 | 
						||
                  pageAct.sysSubObj.device_error_color ?? "var(--theme-danger)";
 | 
						||
                isFlashing = pageAct.sysSubObj.device_error_flashing == "1";
 | 
						||
                break;
 | 
						||
            }
 | 
						||
            $(ele).css("background-color", color);
 | 
						||
            //是否閃爍
 | 
						||
            if (isFlashing) {
 | 
						||
              $(ele).parents(".device-wrap").addClass("light-flash");
 | 
						||
            } else {
 | 
						||
              $(ele).parents(".device-wrap").removeClass("light-flash");
 | 
						||
            }
 | 
						||
          });
 | 
						||
        }
 | 
						||
 | 
						||
        // 設置昇位圖上方 燈號
 | 
						||
        function setTopLight() {
 | 
						||
          let sysSubObj = pageAct.sysSubObj;
 | 
						||
          let strHtml = ``;
 | 
						||
          if (
 | 
						||
            sysSubObj.device_normal_point_name != null &&
 | 
						||
            sysSubObj.device_normal_point_value != null
 | 
						||
          ) {
 | 
						||
            strHtml += ` <div class="row m-0 align-items-center">
 | 
						||
                              <span id="sysNorLight" class="circle-light mr-2 " data-light-type="normal"></span>
 | 
						||
                              <label class="mb-0">${sysSubObj.device_normal_text}</label>
 | 
						||
                          </div>`;
 | 
						||
          }
 | 
						||
          if (
 | 
						||
            sysSubObj.device_close_point_name != null &&
 | 
						||
            sysSubObj.device_close_point_value != null
 | 
						||
          ) {
 | 
						||
            strHtml += ` <div class="row m-0 align-items-center">
 | 
						||
                                      <span id="sysCloLight" class="circle-light mr-2" data-light-type="close"></span>
 | 
						||
                                      <label class="mb-0">${sysSubObj.device_close_text}</label>
 | 
						||
                              </div>`;
 | 
						||
          }
 | 
						||
          if (
 | 
						||
            sysSubObj.device_error_point_name != null &&
 | 
						||
            sysSubObj.device_error_point_value != null
 | 
						||
          ) {
 | 
						||
            strHtml += ` <div class="row m-0 align-items-center">
 | 
						||
                              <span id="sysErrLight" class="circle-light mr-2" data-light-type="error"></span>
 | 
						||
                              <label class="mb-0">${sysSubObj.device_error_text}</label>
 | 
						||
                          </div>`;
 | 
						||
          }
 | 
						||
 | 
						||
          return strHtml;
 | 
						||
        }
 | 
						||
 | 
						||
        function crePosPopover(position, obj) {
 | 
						||
          let _position = {};
 | 
						||
          _position.tpLeft = position[0];
 | 
						||
          _position.tpTop = position[1];
 | 
						||
          _position.tpOffHeight = 24;
 | 
						||
          let parentEle = creDiv();
 | 
						||
          parentEle.append(
 | 
						||
            `<a href="javascript:;" name="devItem" class=" ml-2 mb-0 ">詳細資料</a>`
 | 
						||
          );
 | 
						||
          parentEle.data("id", obj.device_guid);
 | 
						||
          parentEle.data("number", obj.device_number);
 | 
						||
          parentEle.data("dbId", obj._dbId);
 | 
						||
          parentEle.data("name", obj.full_name || obj.device_node_full_name);
 | 
						||
          console.log("crePosPopover", parentEle.data());
 | 
						||
          initPopover(null, _position, parentEle);
 | 
						||
 | 
						||
          return parentEle;
 | 
						||
        }
 | 
						||
 | 
						||
        // 設置 Forge 3D 溫度條
 | 
						||
        function setTopHeatBar() {
 | 
						||
          let strHtml = `<canvas name="forgeHeatBar" width="200" height="30" style="position: absolute; z-index:9999"></canvas>`;
 | 
						||
          return strHtml;
 | 
						||
        }
 | 
						||
 | 
						||
        //==============================================================================
 | 
						||
        //                       ↑  系統監控 - 共用 Function ↑
 | 
						||
        //==============================================================================
 | 
						||
      } catch (e) {
 | 
						||
        $(loadEle).Loading("close");
 | 
						||
      }
 | 
						||
 | 
						||
      function setSysTagForPageAct(obj) {
 | 
						||
        pageAct.sysMainTag = $(obj).data("subSysObj").main_system_tag;
 | 
						||
        pageAct.sysSubTag = $(obj).data("subSysObj").sub_system_tag;
 | 
						||
        pageAct.sysSubName = $(obj).data("subSysObj").full_name;
 | 
						||
        pageAct.sysSubObj = $(obj).data("subSysObj");
 | 
						||
        getDevItem();
 | 
						||
      }
 | 
						||
 | 
						||
      function getDevItem() {
 | 
						||
        let url = baseApiUrl + "/api/Device/GetDeviceItem";
 | 
						||
 | 
						||
        objSendData.Data = {
 | 
						||
          main_system_tag: pageAct.sysMainTag,
 | 
						||
          sub_system_tag: pageAct.sysSubTag,
 | 
						||
        };
 | 
						||
        ytAjax = new YourTeam.Ajax(
 | 
						||
          url,
 | 
						||
          objSendData,
 | 
						||
          function (res) {
 | 
						||
            if (!res || res.code != "0000" || !res.data) {
 | 
						||
            } else {
 | 
						||
              pageAct.devItems = res.data;
 | 
						||
            }
 | 
						||
          },
 | 
						||
          null,
 | 
						||
          "POST"
 | 
						||
        ).send();
 | 
						||
      }
 | 
						||
 | 
						||
      function alarmIconBlink(data) {
 | 
						||
        if (data?.data.length != 0) {
 | 
						||
          $(".page-header [name=topFunBtn][data-page=alert] i").addClass(
 | 
						||
            "blink"
 | 
						||
          );
 | 
						||
        } else {
 | 
						||
          $(".page-header [name=topFunBtn][data-page=alert] i").removeClass(
 | 
						||
            "blink"
 | 
						||
          );
 | 
						||
        }
 | 
						||
      }
 | 
						||
 | 
						||
      function timeOutGetData() {
 | 
						||
        let timeOut3s = null,
 | 
						||
          timeOut5m = null;
 | 
						||
        let events = $._data($(window)[0], "events");
 | 
						||
 | 
						||
        if (Object.keys(events).findIndex((x) => x == "timeout:3s") != -1) {
 | 
						||
          timeOut3s = setInterval(() => {
 | 
						||
            $(window).trigger("timeout:3s");
 | 
						||
          }, 3000);
 | 
						||
        }
 | 
						||
 | 
						||
        if (Object.keys(events).findIndex((x) => x == "timeout:5m") != -1) {
 | 
						||
          timeOut5m = setInterval(() => {
 | 
						||
            $(window).trigger("timeout:5m");
 | 
						||
          }, 5 * 60 * 1000);
 | 
						||
        }
 | 
						||
 | 
						||
        timeOuters = timeOuters.concat([timeOut3s, timeOut5m]);
 | 
						||
      }
 | 
						||
 | 
						||
      function showMainSys() {
 | 
						||
        let url = baseApiUrl + "/Utility/isShowMaiSys";
 | 
						||
 | 
						||
        ytAjax = new YourTeam.Ajax(
 | 
						||
          url,
 | 
						||
          null,
 | 
						||
          function (res) {
 | 
						||
            if (!res || res.code != "0000") {
 | 
						||
            } else {
 | 
						||
              pageAct.mainStatus = res.data;
 | 
						||
            }
 | 
						||
          },
 | 
						||
          null,
 | 
						||
          "POST"
 | 
						||
        ).send();
 | 
						||
      }
 | 
						||
 | 
						||
      function isShowBuildingInMenu() {
 | 
						||
        let url = baseApiUrl + "/Utility/isShowBuilding";
 | 
						||
 | 
						||
        ytAjax = new YourTeam.Ajax(
 | 
						||
          url,
 | 
						||
          null,
 | 
						||
          function (res) {
 | 
						||
            if (!res || res.code != "0000") {
 | 
						||
            } else {
 | 
						||
              pageAct.isShowBuildingInMenu = res.data;
 | 
						||
            }
 | 
						||
          },
 | 
						||
          null,
 | 
						||
          "POST"
 | 
						||
        ).send();
 | 
						||
      }
 | 
						||
 | 
						||
      function startPageLoading() {
 | 
						||
        if (!loadingTip) {
 | 
						||
          loadingTip = YT.Alert.Tip("資料讀取中...", "show");
 | 
						||
        }
 | 
						||
      }
 | 
						||
 | 
						||
      function endPageLoading() {
 | 
						||
        if (loadingTip != null) {
 | 
						||
          $(loadingTip.ele).YTAlert().hide();
 | 
						||
          loadingTip = null;
 | 
						||
        }
 | 
						||
      }
 | 
						||
 | 
						||
      function iniFroList() {
 | 
						||
        url = baseApiUrl + "/api/GetUsrFroList";
 | 
						||
        let hasMonitor = false;
 | 
						||
 | 
						||
        ytAjax = new YourTeam.Ajax(
 | 
						||
          url,
 | 
						||
          null,
 | 
						||
          function (res) {
 | 
						||
            if (!res || res.code != "0000" || !res.data) {
 | 
						||
            } else {
 | 
						||
              let strHtml = `<div class="btn-group mx-4">
 | 
						||
                                                                          <a href="javascript:;" id="homeBtn" data-toggle="dropdown" data-page="dashboard" data-tabname="topFunBtn" class="text-center">
 | 
						||
                                                                              <i class="fal fa-home fa-2x"></i><br>首頁
 | 
						||
                                                                          </a>
 | 
						||
                                                                          <div class="dropdown-menu">
 | 
						||
                                                                              <button class="dropdown-item d-none" name="topFunBtn" data-tabname="topFunBtn" data-page="dashboard" type="button" >儀錶板</button>
 | 
						||
                                                                              <button class="dropdown-item" name="topFunBtn" data-tabname="topFunBtn" data-page="schoolView" type="button">校園總覽</button>
 | 
						||
                                                                              <button class="dropdown-item" name="topFunBtn" data-tabname="topFunBtn" data-page="elecSingleLine" type="button">電表單線圖</button>
 | 
						||
                                                                          </div>
 | 
						||
                                                                      </div>`;
 | 
						||
 | 
						||
              $.each(res.data, function (i, v) {
 | 
						||
                if (v.authCode == "PF1") {
 | 
						||
                  strHtml += `<div class="btn-group mx-4" >
 | 
						||
                                                                              <a href="javascript:;" id="sysMonTopBtn" class="text-center" data-toggle="navbar" data-target="#sysMonNavbar" aria-haspopup="true" aria-expanded="false">
 | 
						||
                                                                                  <i class="fal fa-tv fa-2x"></i><br>${v.subName}
 | 
						||
                                                                              </a>
 | 
						||
 | 
						||
                                                                          </div>`;
 | 
						||
 | 
						||
                  hasMonitor = true;
 | 
						||
                } else {
 | 
						||
                  let icon =
 | 
						||
                    v.authCode == "PF2"
 | 
						||
                      ? "fa-chart-pie"
 | 
						||
                      : v.authCode == "PF3"
 | 
						||
                      ? "fa-chart-area"
 | 
						||
                      : v.authCode == "PF4"
 | 
						||
                      ? "fa-chart-line"
 | 
						||
                      : v.authCode == "PF5"
 | 
						||
                      ? "fa-bell"
 | 
						||
                      : v.authCode == "PF6"
 | 
						||
                      ? "fa-server"
 | 
						||
                      : v.authCode == "PF7"
 | 
						||
                      ? "fa-image"
 | 
						||
                      : v.authCode == "PF8"
 | 
						||
                      ? "fa-user"
 | 
						||
                      : "";
 | 
						||
                  strHtml += `<div class="btn-group mx-4">
 | 
						||
                                                                              <a href="javascript:;" name="topFunBtn" data-tabname="topFunBtn" class="dropdown-toggle no-arrow text-center"
 | 
						||
                                                                                 data-page="${v.showView}">
 | 
						||
                                                                                  <i class="fal ${icon} fa-2x"></i><br>${v.subName}
 | 
						||
                                                                              </a>
 | 
						||
                                                                          </div>`;
 | 
						||
                }
 | 
						||
              });
 | 
						||
 | 
						||
              $("#froLisPage").html(strHtml);
 | 
						||
 | 
						||
              // $("#homeBtn").YTNavbar("init");
 | 
						||
            }
 | 
						||
          },
 | 
						||
          null,
 | 
						||
          "POST"
 | 
						||
        ).send();
 | 
						||
      }
 | 
						||
 | 
						||
      function getSysMonBtnList() {
 | 
						||
        let url = null;
 | 
						||
        let sendData = {};
 | 
						||
        if (pageAct.isShowBuildingInMenu) {
 | 
						||
          url = baseApiUrl + "/api/Device/GetSysMonMainSub";
 | 
						||
          sendData = {};
 | 
						||
          objSendData.Data = sendData;
 | 
						||
          ytAjax = new YourTeam.Ajax(
 | 
						||
            url,
 | 
						||
            objSendData,
 | 
						||
            function (res) {
 | 
						||
              if (!res || res.code != "0000" || !res.data) {
 | 
						||
              } else {
 | 
						||
                $("#sysMonBtnList").html("");
 | 
						||
 | 
						||
                $.each(res.data, (i, building) => {
 | 
						||
                  let li = creEle("li", null, null, null, []);
 | 
						||
                  let a = creA(
 | 
						||
                    building.building_name,
 | 
						||
                    { href: "javascript:;" },
 | 
						||
                    [],
 | 
						||
                    null,
 | 
						||
                    {
 | 
						||
                      "nb-node-type": "parent",
 | 
						||
                    },
 | 
						||
                    ""
 | 
						||
                  );
 | 
						||
                  a.html(
 | 
						||
                    `<span id="buildTab${buildingTagOnJquery(building.building_tag)}" data-tabname="buildTab" data-urn="${building.urn_3D}">${building.building_name}</span>`
 | 
						||
                  );
 | 
						||
                  li.append(a);
 | 
						||
                  let ul = creEle("ul", null, null, null, [
 | 
						||
                    "yt-navbar-dropdown",
 | 
						||
                  ]);
 | 
						||
                  $.each(building.history_Main_Systems, (index, mainSysObj) => {
 | 
						||
                    $.each(
 | 
						||
                      mainSysObj.history_Sub_systems,
 | 
						||
                      (index2, subSysObj) => {
 | 
						||
                        let page = "systemMonitor";
 | 
						||
                        if (subSysObj.sub_system_tag == "EL") {
 | 
						||
                          page = "sysElevator";
 | 
						||
                        }
 | 
						||
                        // console.log(subSysObj.sub_system_tag)
 | 
						||
                        // if (subSysObj.sub_system_tag == "M12") {
 | 
						||
                        //     page = "sysSensor";
 | 
						||
                        // }
 | 
						||
 | 
						||
                        let li2 = creEle("li");
 | 
						||
                        let a2 = creA(
 | 
						||
                          subSysObj.full_name,
 | 
						||
                          { href: "javascript:;" },
 | 
						||
                          [],
 | 
						||
                          `subSysBtn${subSysObj.sub_system_tag}`,
 | 
						||
                          {
 | 
						||
                            page: page,
 | 
						||
                            tabname: "systemMonitor",
 | 
						||
                            "building-tag": buildingTagOnJquery(building.building_tag),
 | 
						||
                          },
 | 
						||
                          "topFunBtn"
 | 
						||
                        );
 | 
						||
                        li2.append(a2);
 | 
						||
                        ul.append(li2);
 | 
						||
 | 
						||
                        a2.data("subSysObj", subSysObj);
 | 
						||
                        subSysObj.main_system_tag = mainSysObj.main_system_tag;
 | 
						||
                      }
 | 
						||
                    );
 | 
						||
                  });
 | 
						||
                  const ulLen = ul.find("li").length;
 | 
						||
                  for(let i = 0; i < 8 - ulLen; i++){
 | 
						||
                    let li2 = creEle("li");
 | 
						||
                        let a2 = creA(
 | 
						||
                          tempSysSubText[i].text,
 | 
						||
                          { href: "javascript:;" },
 | 
						||
                          [],
 | 
						||
                          `subSysBtn${tempSysSubText[i].subSys}`,
 | 
						||
                          {
 | 
						||
                            page: "systemMonitor",
 | 
						||
                            tabname: "systemMonitor",
 | 
						||
                            "building-tag": building.building_tag,
 | 
						||
                          },
 | 
						||
                          "topFunBtn"
 | 
						||
                        );
 | 
						||
                        li2.append(a2);
 | 
						||
                        ul.append(li2);
 | 
						||
                  }
 | 
						||
                  
 | 
						||
 | 
						||
                  li.append(ul);
 | 
						||
                  $("#sysMonBtnList").append(li);
 | 
						||
                });
 | 
						||
                $("#sysMonTopBtn").YTNavbar("init",{onlyOneOpen: true});
 | 
						||
 | 
						||
                $("span[id^=buildTab]").first().YTTab("setAndClick",{triggerType:"first"});
 | 
						||
              }
 | 
						||
            },
 | 
						||
            null,
 | 
						||
            "POST"
 | 
						||
          ).send();
 | 
						||
        } else {
 | 
						||
          url = baseApiUrl + "/api/Device/GetMainSub";
 | 
						||
          sendData = {
 | 
						||
            building_tag: pageAct.buiTag,
 | 
						||
          };
 | 
						||
          objSendData.Data = sendData;
 | 
						||
          ytAjax = new YourTeam.Ajax(
 | 
						||
            url,
 | 
						||
            objSendData,
 | 
						||
            function (res) {
 | 
						||
              if (!res || res.code != "0000" || !res.data) {
 | 
						||
              } else {
 | 
						||
                $("#sysMonBtnList").html("");
 | 
						||
 | 
						||
                $.each(res.data.history_Main_Systems, (index, mainSysObj) => {
 | 
						||
                  $.each(
 | 
						||
                    mainSysObj.history_Sub_systems,
 | 
						||
                    (index2, subSysObj) => {
 | 
						||
                      let page = "systemMonitor";
 | 
						||
                      if (subSysObj.sub_system_tag == "EL") {
 | 
						||
                        page = "sysElevator";
 | 
						||
                      }
 | 
						||
                      // console.log(subSysObj.sub_system_tag)
 | 
						||
                      // if (subSysObj.sub_system_tag == "M12") {
 | 
						||
                      //     page = "sysSensor";
 | 
						||
                      // }
 | 
						||
 | 
						||
                      let li = creEle("li");
 | 
						||
                      let a = creA(
 | 
						||
                        subSysObj.full_name,
 | 
						||
                        { href: "javascript:;" },
 | 
						||
                        [],
 | 
						||
                        `subSysBtn${subSysObj.sub_system_tag}`,
 | 
						||
                        { page: page, tabname: "systemMonitor" },
 | 
						||
                        "topFunBtn"
 | 
						||
                      );
 | 
						||
                      li.append(a);
 | 
						||
 | 
						||
                      a.data("subSysObj", subSysObj);
 | 
						||
                      subSysObj.main_system_tag = mainSysObj.main_system_tag;
 | 
						||
                      $("#sysMonBtnList").append(li);
 | 
						||
                    }
 | 
						||
                  );
 | 
						||
                });
 | 
						||
              }
 | 
						||
            },
 | 
						||
            null,
 | 
						||
            "POST"
 | 
						||
          ).send();
 | 
						||
        }
 | 
						||
      }
 | 
						||
 | 
						||
      function getLogo() {
 | 
						||
        url = baseApiUrl + "/api/GetLogo";
 | 
						||
        ytAjax = new YourTeam.Ajax(
 | 
						||
          url,
 | 
						||
          null,
 | 
						||
          function (res) {
 | 
						||
            $("[name=webLogo]").attr("src", baseImgUrl + "/img/" + res.data);
 | 
						||
          },
 | 
						||
          null,
 | 
						||
          "POST"
 | 
						||
        ).send();
 | 
						||
      }
 | 
						||
 | 
						||
      function getUserInfo() {
 | 
						||
        let url = baseApiUrl + varApiUrl + "getUserFull";
 | 
						||
 | 
						||
        ytAjax = new YourTeam.Ajax(
 | 
						||
          url,
 | 
						||
          null,
 | 
						||
          function (res) {
 | 
						||
            if (!res || res.code != "0000") {
 | 
						||
            } else {
 | 
						||
              pageAct.userInfo = res.data;
 | 
						||
              let user = res.data;
 | 
						||
              $("#usrName").text(user.full_name);
 | 
						||
            }
 | 
						||
          },
 | 
						||
          null,
 | 
						||
          "POST"
 | 
						||
        ).send();
 | 
						||
      }
 | 
						||
 | 
						||
      var noticeOptArr = [];
 | 
						||
      function getAlarmFromDB() {
 | 
						||
        let url = baseApiUrl + "/api/AlarmCard";
 | 
						||
        ytAjax = new YourTeam.Ajax(
 | 
						||
          url,
 | 
						||
          null,
 | 
						||
          function (res) {
 | 
						||
            if (!res || res.code != "0000" || !res.data) {
 | 
						||
            } else {
 | 
						||
              let datas = res.data;
 | 
						||
            }
 | 
						||
          },
 | 
						||
          null,
 | 
						||
          "POST",
 | 
						||
          true
 | 
						||
        ).send();
 | 
						||
      }
 | 
						||
 | 
						||
      function getAlarm() {
 | 
						||
        let now = new Date().getTime();
 | 
						||
        let noticeObj = [
 | 
						||
          { title: "異常編號", data: "uuid" },
 | 
						||
          { title: "異常等級", data: "priority" },
 | 
						||
          { title: "異常類別", data: "alarmClass" },
 | 
						||
          { title: "設備名稱", data: "full_name" },
 | 
						||
          { title: "異常訊息", data: "msgText" },
 | 
						||
        ];
 | 
						||
        // 向 niagara 取得告警資料
 | 
						||
        getDeviceAlarmCardByBaja(null, now, false, false, function (bajaDatas) {
 | 
						||
          let datas = bajaDatas.data;
 | 
						||
          let titleHtml = `異常通知`;
 | 
						||
          let notices = [];
 | 
						||
          // 遍歷每個告警資料
 | 
						||
          $.each(datas ?? [], (idx, data) => {
 | 
						||
            if (noticeOptArr.findIndex((x) => x.id == data.uuid) == -1) {
 | 
						||
              // 針對該告警對象的設備,從 allDevices 找出設備名稱
 | 
						||
              datas[idx].full_name = allDevices.filter(
 | 
						||
                (x) => x.device_number == data.devicePath
 | 
						||
              )[0]?.full_name;
 | 
						||
 | 
						||
              let div1 = creDiv(["col-12"]);
 | 
						||
              let button = creBtn(
 | 
						||
                "確認",
 | 
						||
                "noticeChkBtn",
 | 
						||
                null,
 | 
						||
                ["btn btn-sm btn-secondary ml-auto col-4"],
 | 
						||
                { uuid: data.uuid }
 | 
						||
              );
 | 
						||
              let btnDiv = creDiv(["d-flex m-0 gap-5 mt-2"]);
 | 
						||
              btnDiv.append(button);
 | 
						||
              // 繪製 每行告警資訊
 | 
						||
              noticeObj.forEach((notice) => {
 | 
						||
                let div2 = creDiv(["row", "m-0"]);
 | 
						||
                let span1 = creSpan(notice.title + ":", ["m-0"]);
 | 
						||
                if (notice.data === "uuid") {
 | 
						||
                  data[notice.data] = data[notice.data].split("-")[0];
 | 
						||
                }
 | 
						||
                span1.append(creSpan(data[notice.data]));
 | 
						||
                div2.append(span1);
 | 
						||
                div1.append(div2);
 | 
						||
              });
 | 
						||
 | 
						||
              div1.append(btnDiv);
 | 
						||
              // 拚湊 YTNotice 通知套件所需參數
 | 
						||
              let main = {
 | 
						||
                title: titleHtml,
 | 
						||
                content: div1.outerHtml(),
 | 
						||
                type: "warning",
 | 
						||
                id: data.uuid,
 | 
						||
                hasCloseBtn: true,
 | 
						||
                timeText: displayDate(data.timestamp),
 | 
						||
              };
 | 
						||
              noticeOptArr.push(main);
 | 
						||
              notices.push(main);
 | 
						||
            }
 | 
						||
          });
 | 
						||
          if (notices.length != 0) {
 | 
						||
            $("#noticeBlock").YTNotice(
 | 
						||
              "add_many",
 | 
						||
              notices.oSort("id").reverse()
 | 
						||
            );
 | 
						||
          }
 | 
						||
        });
 | 
						||
      }
 | 
						||
 | 
						||
      function getAllDevice() {
 | 
						||
        let url = baseApiUrl + "/api/Device/GetAllDevice";
 | 
						||
        let result = [];
 | 
						||
 | 
						||
        ytAjax = new YourTeam.Ajax(
 | 
						||
          url,
 | 
						||
          null,
 | 
						||
          function (res) {
 | 
						||
            if (!res || res.code != "0000" || !res.data) {
 | 
						||
            } else {
 | 
						||
              result = res.data;
 | 
						||
            }
 | 
						||
          },
 | 
						||
          null,
 | 
						||
          "POST"
 | 
						||
        ).send();
 | 
						||
        return result;
 | 
						||
      }
 | 
						||
 | 
						||
      function loadNoticeConSta() {
 | 
						||
        let noticeStatus = localStorage.getItem("noticeStatus");
 | 
						||
        chaNoticeConSta(noticeStatus ?? "show");
 | 
						||
      }
 | 
						||
 | 
						||
      function chaNoticeConSta(type = null) {
 | 
						||
        let showText = $("#toggleNoticeBtn #noticeConText").data("show");
 | 
						||
        let hideText = $("#toggleNoticeBtn #noticeConText").data("hide");
 | 
						||
        let iconArr = ["fal fa-comment-slash", "fal fa-comment-dots"];
 | 
						||
        $("#noticeConIcon").removeClass(iconArr[0]).removeClass(iconArr[1]);
 | 
						||
        if (type != null) {
 | 
						||
          if (type == "hide") {
 | 
						||
            setHide();
 | 
						||
          } else if (type == "show") {
 | 
						||
            setShow();
 | 
						||
          }
 | 
						||
        } else {
 | 
						||
          if ($("#noticeBlock").is(":visible")) {
 | 
						||
            setHide();
 | 
						||
          } else if (!$("#noticeBlock").is(":visible")) {
 | 
						||
            setShow();
 | 
						||
          }
 | 
						||
        }
 | 
						||
 | 
						||
        function setShow() {
 | 
						||
          $("#toggleNoticeBtn").find("#noticeConText").text(hideText);
 | 
						||
          $("#noticeConIcon").addClass(iconArr[0]);
 | 
						||
          $("#noticeBlock").show();
 | 
						||
          $("#noticeBlock").animate({ opacity: 1 }, 200);
 | 
						||
          localStorage.setItem("noticeStatus", "show");
 | 
						||
        }
 | 
						||
 | 
						||
        function setHide() {
 | 
						||
          $("#toggleNoticeBtn").find("#noticeConText").text(showText);
 | 
						||
          $("#noticeConIcon").addClass(iconArr[1]);
 | 
						||
          $("#noticeBlock").animate({ opacity: 0 }, 200, function () {
 | 
						||
            $("#noticeBlock").hide();
 | 
						||
          });
 | 
						||
          localStorage.setItem("noticeStatus", "hide");
 | 
						||
        }
 | 
						||
      }
 | 
						||
    </script>
 | 
						||
  </body>
 | 
						||
  <!-- END Body -->
 | 
						||
</html>
 |