<?
include_once(_DIR_EXT.'/HTML/c_page_XML_AJAX.php') ;
class c_page_ajax extends c_page_XML_AJAX
{
  function check_member()
  { // только в этом ext не проверять авторизацию
    //if (!MEMBER()->id) { $this->add_element('go_url','/cab/') ; return(0) ; }
    return(1) ;
  }

    // войти по ссылкы "авторизация пользователя AD"
    // сбросить флаг что пользователь вышел и обновить страницу - начнется процесс
    function clear_member_AD_is_logout()
    {
        unset($_SESSION['member_AD_is_logout']);
        //unset($_SESSION['AD_user_sert_valid']) ;
        //$_SESSION['no_ecp_check_sert_by_auth']=0 ;
        $this->add_element('update_page',1);
    }

  function reboot()
  { reboot_engine() ;
    ACCOUNTS()->update_member_info(MEMBER()) ;
    $this->add_element('update_page',1) ;
  }

  function get_panel_login_as()
  {
    $recs_members=ACCOUNTS()->get_list_members(array('rol'=>$_POST['rol_id'],'order'=>'obj_name')) ;
      ?><link href="/<?echo _CLASS_?>/ext/interface/select2/dist/css/select2.css" rel="stylesheet" />
      	<script src="/<?echo _CLASS_?>/ext/interface/select2/dist/js/select2.min.js"></script>
        <div id="panel_filter">
                  <form id="sky-form" class="sky-form"><input type="hidden" name="filter_dir" value="<?echo _CUR_REPORT_DIR?>">
                               <section data-select>
                                           <label class="label">ФИО сотрудника, роль <strong>"<?echo $_SESSION['ARR_roll'][$_POST['rol_id']]['obj_name']?>"</strong></label>
                                           <label class="select">
                                               <select name="member_id" class="select2">
                                                   <? if (_sizeof($recs_members)) foreach($recs_members as $recs_member)
                                                       {?><option value="<?echo $recs_member['pkey']?>"><?echo $recs_member['obj_name']?></option><?}
                                                   ?>
                                               </select><i></i>
                                       </section>
                      <div id="panel_buttons">
                          <button class="button v2" cmd="account/account_login_as" group_id="<?echo $this->group_id?>" account_id="<?echo $this->account_id?>">Перейти</button>
                          <button class="button cancel">Отмена</button>
                      </div>
                   </form>
            </div><br>
            <script type="text/javascript">$j(document).ready(function() {$j('.select2').select2();});</script>
          <?


    $this->add_element('show_modal_window','HTML',array('title'=>'Перейти в аккаунт')) ;
  }

  function get_panel_group_as()
  {
    $arr_groups=execSQL_row('select pkey,obj_name from obj_site_account where clss in (1,206) and parent!=0 order by clss,obj_name') ;
      ?><link href="/<?echo _CLASS_?>/ext/interface/select2/dist/css/select2.css" rel="stylesheet" />
        <script src="/<?echo _CLASS_?>/ext/interface/select2/dist/js/select2.min.js"></script>
        <div id="panel_filter">
                  <form id="sky-form" class="sky-form"><input type="hidden" name="filter_dir" value="<?echo _CUR_REPORT_DIR?>">
                               <section data-select>
                                           <label class="select">
                                               <select name="group_id" class="select2">
                                                   <? if (_sizeof($arr_groups)) foreach($arr_groups as $id=>$name){?><option value="<?echo $id?>"><?echo $name?></option><?} ?>
                                               </select><i></i>
                                       </section>
                      <div id="panel_buttons">
                          <button class="button v2" cmd="account/account_group_as">Перейти</button>
                          <button class="button cancel">Отмена</button>
                      </div>
                   </form>
            </div><br>
            <script type="text/javascript">$j(document).ready(function() {$j('.select2').select2();});</script>
          <?


    $this->add_element('show_modal_window','HTML',array('title'=>'Перейти в группу')) ;
  }

  function account_group_as()
  {   if (MEMBER()->rol==1)
        { ACCOUNTS()->cur_member_group_set($_POST['group_id']) ;
          ACCOUNTS()->update_member_info(MEMBER()) ;
        }
      $this->add_element('update_page',1) ;
  }

  //==========================================================================================================================================================================
  // Работа с персоналом АСПМО
  //==========================================================================================================================================================================

    function check_pass()
    {   $mess[0]='<i class="fa fa-exclamation-triangle red" aria-hidden="true"></i>' ;
        $mess[1]='<i class="fa fa-check-square-o green" aria-hidden="true"></i>' ;

        $res=ACCOUNTS()->check_pass($_POST['login'],$_POST['password']) ;
        if (_sizeof($res)) foreach($res as $code=>$value) $this->add_element('check_'.$code.'.HTML',$mess[$value]) ;
    }
   //  функция используется только для входа "Войти как...."
  /*
    function account_login($options=array())
    { if (is_object($options)) $options=array() ;
      $result=ACCOUNTS()->member_login($_POST['user_login'],$_POST['user_pass'],$options) ;
      if ($result['type'!='success']) LOGS()->reg_log('account_login','',array('data'=>$result)) ;
      // действия после авторизации - выбрать что-то одно
      if ($result['type']=='success' or $result['code']=='no_login_for_member')
      { $this->add_element('go_url','/cab/') ;   // переходим на страницу личного кабинета
        ESMO()->reg_monitor_mess(0,array('update_page'=>1)) ; // перегружаем текущею страницу на мониторинге
      }
      else
      { if ($result['code']=='member_is_start')
        { echo 'Ваш личный кабинет уже запущен на другом устройстве<br>' ;
          damp_array($result,1,-1) ;
          $this->add_element('show_modal_window','HTML') ;
          ACCOUNTS()->member_logout() ;
        }
        else $this->add_element('show_notife','Аккаунта не существует или неверно указан пароль',array('type'=>'error')) ;
      }
    }   */

    function account_login_as()
    { $_SESSION['admin_login_id']=MEMBER()->id ;
      $rec_member=ACCOUNTS()->get_member_by_id($_POST['member_id'],$options=array()) ;
      if ($rec_member['login'] and $rec_member['password'])
      { LOGS()->reg_log('Авторизация аккаунта','Выполняем вход под аккаунтом "<strong>'.$rec_member['obj_name'].'"</strong> ['.$rec_member['pkey'].']') ;
        $this->account_logout() ; // стандартный выход из аккунта
        //$_SESSION['account_id_to_autorize']=$rec_member['pkey'] ;
        $_SESSION['autorize_process']['sert_valid']=1 ; // ставим флаг, что сертификат подтвержден
        $this->account_login(array('user_login'=>$rec_member['login'],'user_pass'=>$rec_member['password'],'pass_is_hash'=>1)) ; //  стандартный вход в аккаунт  - с проверкой группы, без проверки сертификата
        // отложенный вход в аккаунт - без проверки группы и сертификата

        //$this->account_login() ; //
      } else $this->add_element('show_notife','У аккаунта не задан логин или пароль') ;
      //damp_array($rec_member,1,-1) ;
      //$this->add_element('show_modal_window','HTML') ;

    }

// авторизация по обычному логину/паролю
    // либо авторизация по ID сотрудника (отложенная авторизация)
    // последнее используется, когда логин/пароль уже подтвержден, ID аккаунта известен и необходимо выполнить стандатные действия после авторизациии
    // ID такого аккаунта передавать только через сессию, ни в коем случае не передавать ID через GET/POST данные

    function account_login($options=array())
    { if (is_object($options)) $options=array() ;
      if ($_POST['group_id_to_auth']) setcookie('def_group',$_POST['group_id_to_auth']) ;
      LOG_JSON('account_autorize')->reg('fixed_selected_group','Сделан выбор группы ID '.ACCOUNTS()->get_group_name($_POST['group_id_to_auth']).', ID '.$_POST['group_id_to_auth']) ;
      $result=array() ;
      LOG_JSON('account_autorize')->reg('autorize_by_ajax_request','member_id='.MEMBER()->id.'<br>SESSION_UID='.session_id(),array('data'=>$_POST)) ;
        //LOGS()->reg_log('ajax/account_login','',array('data'=>['options'=>$options,'POST'=>$_POST])) ;
      // если переданы формой логин и пароль - авторизуем сотрудка по этим данным
      if ($_POST['user_login'] or $_POST['user_pass'])
      { $options['group_id_to_auth']=($_POST['group_id_to_auth'])? $_POST['group_id_to_auth']:0 ;
      $result=ACCOUNTS()->member_login($_POST['user_login'],$_POST['user_pass'],$options) ;
        //LOGS()->reg_log('ajax/account_login','',array('data'=>['result'=>$result])) ;
      }
      elseif ($options['user_login'] or $options['user_pass'])
      { $options['group_id_to_auth']=($_POST['group_id_to_auth'])? $_POST['group_id_to_auth']:0 ;

        $result=ACCOUNTS()->member_login($options['user_login'],$options['user_pass'],$options) ;
      }
      // если в сессии есть ID сотрудника для отложенной авторизации - авторизуем его по этим данным
      // авторизация может откладываться несколько раз
      // один раз для выбора группы
      // второй раз для подтверждения сертификата
      else if ($_SESSION['autorize_process']['account_id'])
      { $options['pass_is_hash']=1 ;
        if ($_POST['group_id_to_auth']) $_SESSION['autorize_process']['group_id']=$_POST['group_id_to_auth'] ;
        //$_SESSION['account_id_to_autorize']=0 ;
        $rec=ACCOUNTS()->get_member_by_id($_SESSION['autorize_process']['account_id'],$options) ;
        LOGS()->reg_log('ASPMO/ajax/account_login','Будет выполнена отложенная авторизация сотрудника ID '.$_SESSION['autorize_process']['account_id'],array('data'=>$_SESSION['autorize_process'])) ;
        if ($rec['pkey']) $result=ACCOUNTS()->member_login($rec['login'],$rec['password'],$options) ;  // авторизуем пользователя
        LOGS()->reg_log('ASPMO/ajax/account_login','Выполнен отложенная авторизация сотрудника ID '.$_SESSION['autorize_process']['account_id'],array('data'=>$result)) ;

      }

      //LOGS()->reg_log('auth result','',array('data'=>$result)) ;

      // действия после авторизации - выбрать что-то одно
      if ($result['type']=='success' or $result['code']=='no_login_for_member')
      {
        if ($_SERVER['HTTP_REFERER'])
        {
            //не перенаправлять на HTTP_REFERER если в сессии есть метка о логауте через кнопку "Выход"
            if ($_SESSION['logout_via_exit_button']) {$redirect_url='/cab/'; unset($_SESSION['logout_via_exit_button']);}
            elseif (strpos($_SERVER['HTTP_REFERER'], '/cab/account/select_group/')!==false) $redirect_url='/cab/';
            else $redirect_url=$_SERVER['HTTP_REFERER'];
        }  else
        {
            $redirect_url='/cab/';
        }
        $this->add_element('go_url',$redirect_url) ;   // переходим на страницу личного кабинета
        //damp_array($_SERVER,1,-1) ; $this->add_element('show_modal_window','HTML') ;
        if (function_exists('ESMO')) ESMO()->reg_monitor_mess(MEMBER()->cur_group_id,array('update_page'=>1)) ; // перегружаем текущею страницу на мониторинге
      }
      else
      {  if ($result['code']=='select_group')
         { $this->add_element('go_url','/cab/account/select_group/') ;   // переходим на страницу выбора группы сотрудника
           $_SESSION['autorize_process']['account_id']=$result['account_id'] ;   // сохраняем ID для отложенной авторизации - после выбора группы будет вновь вызвана эта функция, но уже с  $_SESSION['autorize_process']['account_id']
           LOGS()->reg_log('Авторизация персонала','Выбрана отложенная авторизация сотрудника ID '.$_SESSION['autorize_process']['account_id'].' для выбора группы',array('account_id'=>$_SESSION['autorize_process']['account_id'])) ;
         }
         else if ($result['code']=='check_sertificate')
        { $this->add_element('go_url','/cab/cryptopro/check_sert/') ;   // переходим на страницу личного кабинета
          $_SESSION['autorize_process']['account_id']=$result['account_id'] ;
        }
         else // для всех других кодов возврата регистрируем ошибку авторизации с переданными данными
         {  $result['login']=$_POST['user_login'] ;
            if ($GLOBALS['LS_account_save_open_pass']) $result['password']=$_POST['user_pass'] ;
            LOGS()->reg_log('account_login_failed','',array('data'=>$result)) ;
            switch($result['code'])
        {  case 'member_not_found': $text='Аккаунта не существует или неверно указан пароль' ; break ;
           case 'check_account_autorize_limit_failed': $text='Превышено число попыток входа в систему' ; break ;
           case 'space_field': $text='Не указан логин или пароль' ; break ;
           case 'no_login_for_member': $text='Пользователь уже авторизован' ; break ;
               //case 'check_sertificate': $text='Требуется проверка сертификата' ; break ;
           default:  $text=$result['code'] ;
        }
        $this->add_element('show_notife',$text,array('type'=>'error')) ;
      }
    }
        $url=LOG_JSON('account_autorize')->flush('auth_'.$_COOKIE[session_name()].'_'.date('d_m_Y_h_i')) ;
        LOGS()->reg_log('account_autorize','<a href="'.$url.'" target="_blank">отчет</a>') ;
        //$this->add_element('show_new_window',$url) ;
    }

    function account_logout()
    { $cur_group=MEMBER()->cur_group_id ; // группа будет сброшена при logout
      //добавлена метка о выходе по кнопке "Выход"
      $result=ACCOUNTS()->member_logout('',['logout_via_exit_button'=>1]) ;
      if ($result['type']=='success') $this->add_element('update_page',1) ;  // после выхода - перегружаем текущую страницу
        if (function_exists('ESMO')) ESMO()->reg_monitor_mess($cur_group,array('update_page'=>1)) ; // перегружаем текущею страницу на мониторинге
    }

    /* не используетмя
    function check_autorize2()
    {
       $this->add_element('check',MEMBER()->id) ;
    }  */

    // принудительное открытие смены врача, ставим выход другим сотрудникам
    /* используеться в ext/aspmo
    function smena_in()
    {  $doctor_id=ESMO()->check_doctor(MEMBER()->cur_group_id,array('debug'=>0)) ;
       if ($doctor_id)
       { $rec_member=ACCOUNTS()->get_member_by_id($doctor_id) ; $text=', смена приостановлена у <strong>'.$rec_member['obj_name'].'</strong> ['.$rec_member['pkey'].']' ;
         // приостанавливаем смену текущего доктора
         ACCOUNTS()->member_save($doctor_id,array('smena'=>2)) ; //смена приостановлена у текущего доктора
         // оповещаем доктора о приостановке его смены через SSE

         //
         ENGINE()->send_cmd_reboot_client() ;
       }
       else $text=', активной смены не найдено' ;
       // открываем смену у текущего сотрудника
       ACCOUNTS()->member_save(MEMBER()->id,array('smena'=>1,'smena_in'=>time(),'smena_out'=>0)) ;
       ACCOUNTS()->update_member_info(MEMBER()) ; // данные аккаунта будут заново прочитаны из базу

       LOGS()->reg_log('Смена персонала','<div class="red">'.MEMBER()->name.' ['.MEMBER()->id.'] - Начало смены по команде'.$text.'</div>',array('member_id'=>MEMBER()->id)) ;
       $this->update_page=1 ;
    } */

    // возобновление смены
    /* /* используеться в ext/aspmo
    function smena_resume()
    {  $doctor_id=ESMO()->check_doctor(MEMBER()->cur_group_id,array('debug'=>0)) ;
       ACCOUNTS()->member_smena_in(MEMBER()->info['smena_in']) ;
       if ($doctor_id)
       { $rec_member=ACCOUNTS()->get_member_by_id($doctor_id) ; $text=', смена приостановлена у <strong>'.$rec_member['obj_name'].'</strong> ['.$rec_member['pkey'].']' ;
         // приостанавливаем смену текущего доктора
         ACCOUNTS()->member_save($doctor_id,array('smena'=>2)) ; //смена приостановлена у текущего доктора
         // оповещаем доктора о приостановке его смены через SSE

         //
         ENGINE()->send_cmd_reboot_client() ;

       } else $text=', активной смены не найдено' ;

       // открываем смену у текущего сотрудника
       ACCOUNTS()->member_save(MEMBER()->id,array('smena'=>1)) ;
       ACCOUNTS()->update_member_info(MEMBER()) ; // данные аккаунта будут заново прочитаны из базу

       LOGS()->reg_log('Смена персонала','<div class="red">'.MEMBER()->name.' ['.MEMBER()->id.'] - Возобновление смены по команде'.$text.'</div>',array('member_id'=>MEMBER()->id)) ;
       $this->update_page=1 ;
    }  */

    /*  не импользуется
    function cancel_select_group()
       {
           unset($_SESSION['account_id_to_select_group']) ;
           $this->add_element('go_url','/cab/') ;
       }
      */

     // запоминаем выбранную группу в сессии в массиве $_SESSION['autorize_process'] и перезагружаем страницу для повторной авторизации
     function fixed_selected_group()
     { $_SESSION['autorize_process']['group_id']=$_POST['group_id_to_auth'] ;
       setcookie('def_group',$_POST['group_id_to_auth']) ;
       //LOGS()->reg_log('ACCOUNTS/member_login','Сделан выбор группы ID '.ACCOUNTS()->get_group_name($_POST['group_id_to_auth']).', ID '.$_POST['group_id_to_auth'],array()) ;
       LOG_JSON('account_autorize')->reg('fixed_selected_group','Сделан выбор группы ID '.ACCOUNTS()->get_group_name($_POST['group_id_to_auth']).', ID '.$_POST['group_id_to_auth']) ;
       $this->add_element('go_url','/cab/') ;
       $url=LOG_JSON('account_autorize')->flush('auth_'.$_COOKIE[session_name()].'_'.date('d_m_Y_h_i')) ;
       LOGS()->reg_log('account_autorize','<a href="'.$url.'" target="_blank">отчет</a>') ;
    }

}
