Initial commit

This commit is contained in:
2026-09-03 11:24:19 +02:00
commit 6ed3153f36
1897 changed files with 538007 additions and 0 deletions
+648
View File
@@ -0,0 +1,648 @@
<?php
if (!empty($_SESSION['site801_edit']))
{
// ====================================================================================================
// Synchronizacja kont z systemem SYNDIS.
// Strona pobiera przez SOAP pelny wykaz kont z SYNDIS (GetUserInfos), odrzuca te, ktore juz istnieja
// w sys_users i pokazuje pozostale do recznego wyboru. Operator decyduje, ktore konta zalozyc oraz
// jakie nadac im regiony i profile.
// Haslo nowego konta jest zawsze ustawiane wg wzorca [login].123 - tego wzorca wymaga logowanie
// z SYNDIS (index.php -> usrLoginAndSiteAccess($uName, $uName.".123", ...)).
// ====================================================================================================
// Adres uslugi SOAP systemu SYNDIS - konfigurowalny w sys_setup_parameters [SSP_NAME='SYNDIS_URL'].
// Plik WSDL nie jest tu potrzebny - zadanie budujemy i parsujemy sami, patrz komentarz nizej.
$syndisUrl = sqlStringValue("select SSP_VALUE from sys_setup_parameters where SSP_NAME='SYNDIS_URL'", "SSP_VALUE");
if (empty($syndisUrl)) $syndisUrl = "http://172.22.64.101:3615/";
// numer regionu z SYNDIS -> opis zapisywany w sys_users_regions
$regionMap = array(1 => 'P/Szczerców', 2 => 'P/Szczerców', 3 => 'Dębina', 4 => 'P/Bełchatów');
$regionList = array('P/Szczerców', 'Dębina', 'P/Bełchatów');
// lista profili - pobierana raz, uzywana przy kazdym koncie
$profileArr = array();
$wynikPro = mysql_query("select PRO_ID,PRO_NAME,PRO_DESCRIPTION from sys_profiles order by PRO_NAME");
if($wynikPro)while ($rPro = mysql_fetch_array($wynikPro))
{
// profil 1 [nieograniczony dostep] moze nadac tylko admin - tak jak na site801E
if ($rPro["PRO_ID"] != 1 || $_SESSION['user']=='admin') $profileArr[] = $rPro;
}
// ====================================================================================================
// ZAPIS - zakladanie wybranych kont
// ====================================================================================================
if ($_POST['subUserSave']==$lab_ButtonName_Save)
{
if (!is_array($_POST['inAdd']) || count($_POST['inAdd'])==0)
echo"<div class='actionERROR'>$lab_Field_site801_028</div>";
else
{
?>
<div class="tag100">
<div class="head_tag"><?php echo $lab_Tag_site801_007 ;?></div>
<div class="tag">
<table WIDTH="100%" class="tag">
<tr>
<td class="label"><?php echo $lab_Field_site801_001 ;?></td>
<td class="label"><?php echo $lab_Field_site801_002 ;?></td>
<td class="label"><?php echo $lab_Field_site801_003 ;?></td>
<td class="label"><?php echo $lab_Field_site801_023 ;?></td>
<td class="label"><?php echo $lab_Field_site801_013 ;?></td>
<td class="label"><?php echo $lab_Field_site801_006 ;?></td>
</tr>
<?php
foreach ($_POST['inAdd'] as $idx => $chk)
{
$idx = (int) $idx;
$login = trim($_POST['inLogin'][$idx]);
if ($login=='') continue;
$loginSql = mysql_real_escape_string($login);
// konto moglo powstac w miedzyczasie - sprawdzamy tuz przed zapisem
if (sqlValue("select count(1) from sys_users where USR_USERNAME='".$loginSql."'")>0)
{
echo"<tr><td class='field_center'>".htmlspecialchars($login, ENT_QUOTES, 'UTF-8')."</td><td class='field_center' colspan='5'>$lab_Field_site801_030</td></tr>";
continue;
}
$fNameSql = mysql_real_escape_string(trim($_POST['inFName'][$idx]));
$lNameSql = mysql_real_escape_string(trim($_POST['inLName'][$idx]));
$mailSql = mysql_real_escape_string(trim($_POST['inMail'][$idx]));
$phoneSql = mysql_real_escape_string(trim($_POST['inPhone'][$idx]));
$status = (int) $_POST['inStatus'][$idx];
if ($status!=0 && $status!=1 && $status!=2) $status=1;
mysql_query("INSERT INTO sys_users SET USR_USERNAME='".$loginSql."',USR_PASSWORD=md5('".$loginSql.".123'),USR_FIRST_NAME='".$fNameSql."',USR_LAST_NAME='".$lNameSql."',USR_MAIL='".$mailSql."',USR_PHONE='".$phoneSql."',USR_STATUS='".$status."',USR_PRT_ID=1,USR_AUDIT_CU='".mysql_real_escape_string($_SESSION['user'])."',USR_AUDIT_CD=now()");
$newUsrID = sqlValue("select max(USR_ID) from sys_users where USR_USERNAME='".$loginSql."'");
if ($newUsrID<=0)
{
echo"<tr><td class='field_center'>".htmlspecialchars($login, ENT_QUOTES, 'UTF-8')."</td><td class='field_center' colspan='5'>".mysql_error()."</td></tr>";
continue;
}
// profile
$addedPro = array();
if (is_array($_POST['inProfile'][$idx]))
{
foreach ($_POST['inProfile'][$idx] as $proID => $proChk)
{
$proID = (int) $proID;
// profil 1 tylko dla admina - powtorzone po stronie zapisu, formularz nie jest zabezpieczeniem
if ($proID==1 && $_SESSION['user']!='admin') continue;
if ($proID>0 && sqlValue("select count(1) from sys_profiles where PRO_ID=".$proID)>0)
{
mysql_query("INSERT INTO sys_user_profiles SET SUP_USR_ID=".$newUsrID.",SUP_PRO_ID=".$proID);
$addedPro[] = sqlStringValue("select PRO_NAME from sys_profiles where PRO_ID=".$proID, "PRO_NAME");
}
}
}
// regiony - URG_ID jest AUTO_INCREMENT, nie podajemy go jawnie
$addedReg = array();
if (is_array($_POST['inRegion'][$idx]))
{
foreach ($_POST['inRegion'][$idx] as $regIdx => $regChk)
{
$regIdx = (int) $regIdx;
if (isset($regionList[$regIdx]))
{
mysql_query("INSERT INTO sys_users_regions SET URG_USR_ID=".$newUsrID.",URG_DESC='".mysql_real_escape_string($regionList[$regIdx])."'");
$addedReg[] = $regionList[$regIdx];
}
}
}
if ($status=='0') $statusDesc=$lab_Field_site801_008;
else if ($status=='1') $statusDesc=$lab_Field_site801_007;
else $statusDesc=$lab_Field_site801_009;
echo"
<tr>
<td class='field_center'>".htmlspecialchars($login, ENT_QUOTES, 'UTF-8')."</td>
<td class='field_center'>".htmlspecialchars(trim($_POST['inFName'][$idx]), ENT_QUOTES, 'UTF-8')."</td>
<td class='field_center'>".htmlspecialchars(trim($_POST['inLName'][$idx]), ENT_QUOTES, 'UTF-8')."</td>
<td class='field_center'>".implode(', ', $addedReg)."</td>
<td class='field_center'>".implode(', ', $addedPro)."</td>
<td class='field_center'>$statusDesc</td>
</tr>
";
}
?>
</table>
</div>
<div class="tag_buttons">
<a class="btn btn-info btn-sm" style="text-decoration: none;" href="./?pg=site801" role="button"><?php echo $lab_ButtonName_BackToList; ?></a>
</div>
</div>
<?php
}
}
// ====================================================================================================
// LISTA - konta z SYNDIS, ktorych nie ma w SoftSPM
// ====================================================================================================
else
{
// ================================================================================================
// Pobranie listy kont z SYNDIS.
//
// UWAGA: swiadomie NIE uzywamy tu klasy SoapClient ani soap.php.
// Usluga SYNDIS [gSOAP 2.7] zwraca poprawne HTTP 200 z kompletna trescia, ale PHP nie potrafi
// jej sparsowac - konczy sie bledem "looks like we got no XML document" niezaleznie od opcji
// transportu [sprawdzone: domyslne, keep_alive=false, SOAP 1.2, kompresja gzip].
// Odpowiedz deklaruje encoding="UTF-8", ale zawiera bajty, ktorych libxml nie akceptuje.
// Dlatego wysylamy zadanie recznie przez gniazdo i parsujemy odpowiedz po oczyszczeniu.
// ================================================================================================
// wysyla zadanie SOAP surowym POST-em i zwraca tresc odpowiedzi
if (!function_exists('syndisHttpSoap'))
{
function syndisHttpSoap($url, $action, $envelope, &$err, &$dump)
{
$err = ''; $dump = '';
$p = parse_url($url);
$host = isset($p['host']) ? $p['host'] : '';
$port = isset($p['port']) ? (int) $p['port'] : 80;
$path = (isset($p['path']) && $p['path'] != '') ? $p['path'] : '/';
if ($host == '') { $err = 'Niepoprawny adres uslugi: '.$url; return ''; }
$errNo = 0; $errStr = '';
$fp = @fsockopen($host, $port, $errNo, $errStr, 15);
if (!$fp) { $err = 'Brak polaczenia z '.$host.':'.$port.' - '.$errStr.' ['.$errNo.']'; return ''; }
$req = "POST ".$path." HTTP/1.1\r\n";
$req .= "Host: ".$host.":".$port."\r\n";
$req .= "Content-Type: text/xml; charset=utf-8\r\n";
$req .= "SOAPAction: \"".$action."\"\r\n";
$req .= "User-Agent: SoftSPM\r\n";
$req .= "Content-Length: ".strlen($envelope)."\r\n";
$req .= "Connection: close\r\n\r\n".$envelope;
stream_set_timeout($fp, 30);
fwrite($fp, $req);
$raw = '';
while (!feof($fp))
{
$chunk = fread($fp, 8192);
if ($chunk === false || $chunk === '') break;
$raw .= $chunk;
if (strlen($raw) > 4000000) break;
}
$meta = stream_get_meta_data($fp);
fclose($fp);
if ($meta['timed_out']) { $err = 'Przekroczono czas oczekiwania na odpowiedz uslugi.'; return ''; }
if ($raw === '') { $err = 'Usluga nie zwrocila zadnej tresci.'; return ''; }
$pos = strpos($raw, "\r\n\r\n");
$headers = ($pos === false) ? $raw : substr($raw, 0, $pos);
$body = ($pos === false) ? '' : substr($raw, $pos + 4);
$status = strtok($headers, "\r\n");
$dump = "----- ZADANIE -----\n".$req."\n\n----- NAGLOWKI ODPOWIEDZI -----\n".$headers
."\n\n----- ODPOWIEDZ (".strlen($body)." B) -----\n".substr($body, 0, 8000);
// odpowiedz dzielona na czesci [chunked]
if (stripos($headers, 'Transfer-Encoding: chunked') !== false)
{
$out = ''; $i = 0;
while ($i < strlen($body))
{
$nl = strpos($body, "\r\n", $i);
if ($nl === false) break;
$len = hexdec(trim(substr($body, $i, $nl - $i)));
if ($len <= 0) break;
$out .= substr($body, $nl + 2, $len);
$i = $nl + 2 + $len + 2;
}
$body = $out;
}
if (strpos($status, ' 200') === false) { $err = 'Usluga zwrocila: '.$status; return ''; }
if (trim($body) == '') { $err = 'Usluga zwrocila pusta tresc [HTTP 200].'; return ''; }
return $body;
}
}
// czysci i parsuje odpowiedz XML z SYNDIS
if (!function_exists('syndisParseXml'))
{
function syndisParseXml($body, &$err)
{
$err = '';
// 1. odciecie ewentualnych smieci przed deklaracja XML
$start = strpos($body, '<?xml');
if ($start === false) $start = strpos($body, '<SOAP');
if ($start !== false && $start > 0) $body = substr($body, $start);
// 2. usuniecie znakow sterujacych niedozwolonych w XML 1.0
$body = preg_replace('/[\x00-\x08\x0B\x0C\x0E-\x1F]/', '', $body);
// 3. jesli tresc nie jest poprawnym UTF-8 - konwersja z Windows-1250
// [SYNDIS deklaruje UTF-8, ale wysyla polskie znaki jednobajtowo]
if (!preg_match('//u', $body))
{
$conv = @iconv('CP1250', 'UTF-8//IGNORE', $body);
if ($conv === false || $conv === '') $conv = @iconv('ISO-8859-2', 'UTF-8//IGNORE', $body);
if ($conv !== false && $conv !== '') $body = $conv;
}
// 4. usuniecie prefiksow przestrzeni nazw - upraszcza dostep do wezlow
$body = preg_replace('/\s+xmlns(:[A-Za-z0-9_.-]+)?\s*=\s*"[^"]*"/', '', $body);
$body = preg_replace('/(<\/?)[A-Za-z0-9_.-]+:/', '$1', $body);
libxml_use_internal_errors(true);
libxml_clear_errors();
$xml = simplexml_load_string($body);
if ($xml === false)
{
$msgs = array();
foreach (libxml_get_errors() as $le) $msgs[] = 'linia '.$le->line.': '.trim($le->message);
libxml_clear_errors();
$err = 'Nie udalo sie odczytac odpowiedzi XML. '.implode(' | ', array_slice($msgs, 0, 5));
return null;
}
return $xml;
}
}
// ================================================================================================
// Odtwarzanie loginu utraconego przez blad kodowania po stronie SYNDIS.
//
// SYNDIS odsyla polskie znaki jako '?' [poza litera 'o' z kreska] - informacja jest tracona
// u zrodla, wiec nie da sie jej wyliczyc. Mozna ja jednak ODTWORZYC I ZWERYFIKOWAC:
// podstawiamy w miejsce '?' kolejne polskie litery i pytamy usluge operacja GetUserInfo,
// ktory wariant faktycznie istnieje. To nie jest zgadywanie - to sprawdzenie u zrodla.
// Gdy zaden albo wiecej niz jeden wariant sie potwierdzi, login zostaje do recznej poprawy.
// ================================================================================================
// buduje warianty loginu przez podstawienie polskich liter w miejsce znakow zapytania
if (!function_exists('syndisLoginCandidates'))
{
function syndisLoginCandidates($login)
{
$marks = substr_count($login, '?');
if ($marks == 0 || $marks > 2) return array();
$small = array('ą','ć','ę','ł','ń','ó','ś','ź','ż');
$big = array('Ą','Ć','Ę','Ł','Ń','Ó','Ś','Ź','Ż');
// przy dwoch niewiadomych ograniczamy sie do malych liter, zeby nie mnozyc zapytan
$set = ($marks == 1) ? array_merge($small, $big) : $small;
$out = array($login);
for ($m = 0; $m < $marks; $m++)
{
$next = array();
foreach ($out as $cand)
{
$q = strpos($cand, '?');
if ($q === false) continue;
foreach ($set as $ch) $next[] = substr($cand, 0, $q).$ch.substr($cand, $q + 1);
}
$out = $next;
}
return $out;
}
}
// sprawdza w SYNDIS, czy konto o podanym loginie istnieje
if (!function_exists('syndisLoginExists'))
{
function syndisLoginExists($url, $login, $enc)
{
$safe = str_replace(array('&','<','>'), array('&amp;','&lt;','&gt;'), $login);
if ($enc != 'UTF-8')
{
$conv = @iconv('UTF-8', $enc.'//IGNORE', $safe);
if ($conv === false || $conv === '') return false;
$safe = $conv;
}
$env = '<?xml version="1.0" encoding="'.$enc.'"?>'
. '<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"'
. ' xmlns:ns1="http://www.mikronika.com.pl/2014/11/24/spm/types">'
. '<SOAP-ENV:Body><ns1:GetUserInfoRequest><login>'.$safe.'</login>'
. '</ns1:GetUserInfoRequest></SOAP-ENV:Body></SOAP-ENV:Envelope>';
$err = ''; $dump = '';
$body = syndisHttpSoap($url, 'http://www.mikronika.com.pl/2014/11/24/spm/GetUserInfo', $env, $err, $dump);
if (!empty($err) || $body == '') return false;
$e2 = '';
$xml = syndisParseXml($body, $e2);
if ($xml === null) return false;
if (isset($xml->Body->Fault)) return false;
if (!isset($xml->Body->GetUserInfoResponse)) return false;
$r = $xml->Body->GetUserInfoResponse;
return (trim((string) $r->login) != '' && trim((string) $r->fullName) != '');
}
}
// limity, zeby odtwarzanie loginow nie zablokowalo strony
$probeCalls = 0;
$probeMax = 200;
$probeStart = microtime(true);
$probeMaxSec = 25;
$syndisError = '';
$syndisStep = '';
$syndisRaw = '';
$syndisUsers = array();
$envelope = '<?xml version="1.0" encoding="UTF-8"?>'
. '<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"'
. ' xmlns:ns1="http://www.mikronika.com.pl/2014/11/24/spm/types">'
. '<SOAP-ENV:Body><ns1:GetUserInfosRequest/></SOAP-ENV:Body></SOAP-ENV:Envelope>';
$body = syndisHttpSoap($syndisUrl, 'http://www.mikronika.com.pl/2014/11/24/spm/GetUserInfos', $envelope, $syndisError, $syndisRaw);
if (!empty($syndisError)) $syndisStep = 'POLACZENIE';
if (empty($syndisError))
{
$xml = syndisParseXml($body, $syndisError);
if (!empty($syndisError)) $syndisStep = 'ODPOWIEDZ';
if (empty($syndisError))
{
// fault zwrocony przez usluge
if (isset($xml->Body->Fault))
{
$syndisStep = 'USLUGA';
$syndisError = trim((string) $xml->Body->Fault->faultstring);
if ($syndisError == '') $syndisError = 'Usluga zwrocila SOAP Fault.';
}
else
{
foreach ($xml->Body->GetUserInfosResponse->users as $node)
{
$one = array(
'login' => (string) $node->login,
'fullName' => (string) $node->fullName,
'isActive' => ((string) $node->isActive == 'true' || (string) $node->isActive == '1'),
'isAdmin' => ((string) $node->isAdmin == 'true' || (string) $node->isAdmin == '1'),
'isEditForms' => ((string) $node->isEditForms == 'true' || (string) $node->isEditForms == '1'),
'isEditReports' => ((string) $node->isEditReports == 'true' || (string) $node->isEditReports == '1'),
'isConfig' => ((string) $node->isConfig == 'true' || (string) $node->isConfig == '1'),
'isChangeValues' => ((string) $node->isChangeValues == 'true' || (string) $node->isChangeValues == '1'),
'regions' => array()
);
foreach ($node->regions as $reg) $one['regions'][] = (int) $reg;
$syndisUsers[] = $one;
}
if (count($syndisUsers) == 0)
{
$syndisStep = 'ODPOWIEDZ';
$syndisError = 'Usluga odpowiedziala, ale nie zwrocila zadnego konta.';
}
}
}
}
// odrzucamy konta juz istniejace w SoftSPM
$missing = array();
foreach ($syndisUsers as $u)
{
$login = trim($u["login"]);
if ($login=='') continue;
if (sqlValue("select count(1) from sys_users where USR_USERNAME='".mysql_real_escape_string($login)."'")>0) continue;
$missing[] = $u;
}
if (!empty($syndisError))
{
echo"<div class='actionERROR'>$lab_Field_site801_027<br/>
[".$syndisStep."] ".htmlspecialchars($syndisError, ENT_QUOTES, 'UTF-8')."<br/>
Adres uslugi: ".htmlspecialchars($syndisUrl, ENT_QUOTES, 'UTF-8')."</div>";
// podglad surowej komunikacji - do diagnostyki po stronie SYNDIS
if (!empty($syndisRaw))
echo"<div class='tag100'><div class='head_tag'>Diagnostyka - surowa komunikacja SOAP</div><div class='tag'>
<pre style='white-space:pre-wrap;word-break:break-all;font-size:11px;max-height:420px;overflow:auto;margin:0;'>"
.htmlspecialchars($syndisRaw, ENT_QUOTES, 'UTF-8')."</pre></div></div>";
echo"<div class='tag100'><div class=tag_buttons><a class='btn btn-info btn-sm' style='text-decoration: none;' href='./?pg=site801' role='button'>$lab_ButtonName_BackToList</a></div></div>";
}
else if (count($missing)==0)
{
echo"<div class='actionOK'>$lab_Field_site801_026</div>";
echo"<div class='tag100'><div class=tag_buttons><a class='btn btn-info btn-sm' style='text-decoration: none;' href='./?pg=site801' role='button'>$lab_ButtonName_BackToList</a></div></div>";
}
else
{
?>
<FORM ACTION="./?pg=site801syn" METHOD="POST" id="SyndisSyncForm">
<div class="tag100">
<div class="head_tag"><?php echo $lab_Tag_site801_005 ;?></div>
</div>
<?php
// ostrzezenie zbiorcze, jesli SYNDIS przyslal loginy z utraconymi polskimi znakami
$anyBadChars = false;
foreach ($missing as $uChk)
if (strpos($uChk["login"], '?') !== false || strpos($uChk["fullName"], '?') !== false) { $anyBadChars = true; break; }
if ($anyBadChars) echo"<div class='actionERROR'>".$lab_Field_site801_033."</div>";
?>
<?php
foreach ($missing as $idx => $u)
{
$login = trim($u["login"]);
$fullName = trim($u["fullName"]);
// rozbicie pelnej nazwy z SYNDIS na imie i nazwisko - SYNDIS przekazuje ja w jednym polu
$spacePos = strpos($fullName, ' ');
if ($spacePos===false) { $fName=$fullName; $lName=''; }
else { $fName=substr($fullName,0,$spacePos); $lName=trim(substr($fullName,$spacePos+1)); }
$isActive = ($u["isActive"]==true || $u["isActive"]==1);
// SYNDIS gubi polskie znaki - odsyla je jako znak zapytania [poza litera 'o' z kreska].
// Takiego loginu nie wolno zapisac bez poprawienia, bo nie zgodzi sie z logowaniem z SYNDIS.
$badChars = (strpos($login, '?') !== false || strpos($fullName, '?') !== false);
// proba odtworzenia loginu i potwierdzenia go w SYNDIS
$loginFixed = '';
$loginHints = array();
if (strpos($login, '?') !== false && $probeCalls < $probeMax && (microtime(true) - $probeStart) < $probeMaxSec)
{
$hits = array();
foreach (array('UTF-8', 'windows-1250') as $enc)
{
foreach (syndisLoginCandidates($login) as $cand)
{
if ($probeCalls >= $probeMax || (microtime(true) - $probeStart) >= $probeMaxSec) break;
$probeCalls++;
if (syndisLoginExists($syndisUrl, $cand, $enc)) $hits[] = $cand;
}
if (count($hits) > 0) break;
}
// ufamy wynikowi tylko wtedy, gdy potwierdzil sie DOKLADNIE jeden wariant
if (count($hits) == 1) $loginFixed = $hits[0];
else if (count($hits) > 1) $loginHints = $hits;
}
$loginValue = ($loginFixed != '') ? $loginFixed : $login;
// uprawnienia z SYNDIS - do informacji dla operatora
$rights = array();
if ($u["isAdmin"]==true || $u["isAdmin"]==1) $rights[]='isAdmin';
if ($u["isEditForms"]==true || $u["isEditForms"]==1) $rights[]='isEditForms';
if ($u["isEditReports"]==true || $u["isEditReports"]==1) $rights[]='isEditReports';
if ($u["isConfig"]==true || $u["isConfig"]==1) $rights[]='isConfig';
if ($u["isChangeValues"]==true || $u["isChangeValues"]==1) $rights[]='isChangeValues';
// regiony z SYNDIS - pojedynczy region przychodzi jako liczba, kilka jako tablica
$uRegionNo = array();
$uRegionDesc = array();
if (isset($u["regions"]))
{
foreach ((array) $u["regions"] as $regNo)
{
$regNo = (int) $regNo;
$uRegionNo[] = $regNo;
if (isset($regionMap[$regNo]) && !in_array($regionMap[$regNo], $uRegionDesc)) $uRegionDesc[] = $regionMap[$regNo];
}
}
// domyslny profil wg uprawnien z SYNDIS: operator dla edytujacych, w pozostalych przypadkach tylko odczyt
if (($u["isAdmin"]==true || $u["isAdmin"]==1) || ($u["isEditForms"]==true || $u["isEditForms"]==1)) $defProID=3;
else $defProID=2;
?>
<div class="tag100">
<div class="head_tag"><?php echo htmlspecialchars($login, ENT_QUOTES, 'UTF-8')." &nbsp;&raquo;&nbsp; ".htmlspecialchars($fullName, ENT_QUOTES, 'UTF-8'); ?></div>
<div class="tag">
<table class="desc_val">
<tr>
<td class="desc"><?php echo $lab_Field_site801_019 ; ?></td>
<td class="desc_value"><INPUT TYPE=CHECKBOX NAME="inAdd[<?php echo $idx; ?>]" VALUE="1"></td>
</tr>
<tr>
<td class="desc"><?php echo $lab_Field_site801_001 ; ?></td>
<td class="desc_value">
<INPUT class="text50" TYPE="TEXT" NAME="inLogin[<?php echo $idx; ?>]" value="<?php echo htmlspecialchars($loginValue, ENT_QUOTES, 'UTF-8'); ?>"
oninput="var p=document.getElementById('pw_<?php echo $idx; ?>'); if(p) p.firstChild.nodeValue=this.value;">
<?php
if ($loginFixed != '')
echo "<span style='color:#1f8a53;font-weight:bold;'>&nbsp;&nbsp;".$lab_Field_site801_035."</span>";
else if (count($loginHints) > 0)
echo "<span style='color:#b3760a;font-weight:bold;'>&nbsp;&nbsp;".$lab_Field_site801_036.": "
.htmlspecialchars(implode(', ', $loginHints), ENT_QUOTES, 'UTF-8')."</span>";
else if (strpos($login, '?') !== false)
echo "<span style='color:#c1272d;font-weight:bold;'>&nbsp;&nbsp;".$lab_Field_site801_034."</span>";
?>
</td>
</tr>
<tr>
<td class="desc"><?php echo $lab_Field_site801_020 ; ?></td>
<td class="desc_value"><?php echo htmlspecialchars($fullName, ENT_QUOTES, 'UTF-8'); ?></td>
</tr>
<tr>
<td class="desc"><?php echo $lab_Field_site801_021 ; ?></td>
<td class="desc_value"><?php echo (count($rights)>0 ? implode(', ', $rights) : '-'); ?></td>
</tr>
<tr>
<td class="desc"><?php echo $lab_Field_site801_022 ; ?></td>
<td class="desc_value"><?php echo (count($uRegionNo)>0 ? implode(', ', $uRegionNo).' &nbsp;['.implode(', ', $uRegionDesc).']' : '-'); ?></td>
</tr>
<tr>
<td class="desc"><?php echo $lab_Field_site801_002 ; ?></td>
<td class="desc_value"><INPUT class="text50" TYPE="TEXT" NAME="inFName[<?php echo $idx; ?>]" value="<?php echo htmlspecialchars($fName, ENT_QUOTES, 'UTF-8'); ?>"></td>
</tr>
<tr>
<td class="desc"><?php echo $lab_Field_site801_003 ; ?></td>
<td class="desc_value"><INPUT class="text50" TYPE="TEXT" NAME="inLName[<?php echo $idx; ?>]" value="<?php echo htmlspecialchars($lName, ENT_QUOTES, 'UTF-8'); ?>"></td>
</tr>
<tr>
<td class="desc"><?php echo $lab_Field_site801_004 ; ?></td>
<td class="desc_value"><INPUT class="text50" TYPE="TEXT" NAME="inMail[<?php echo $idx; ?>]" value=""></td>
</tr>
<tr>
<td class="desc"><?php echo $lab_Field_site801_005 ; ?></td>
<td class="desc_value"><INPUT TYPE="TEXT" NAME="inPhone[<?php echo $idx; ?>]" value=""></td>
</tr>
<tr>
<td class="desc"><?php echo $lab_Field_site801_006 ; ?></td>
<td class="desc_value">
<select name="inStatus[<?php echo $idx; ?>]">
<option value="1" <?php if($isActive) echo "selected";?> ><?php echo $lab_Field_site801_007 ; ?></option>
<option value="0" <?php if(!$isActive) echo "selected";?> ><?php echo $lab_Field_site801_008 ; ?></option>
<option value="2"><?php echo $lab_Field_site801_009 ; ?></option>
</select>
</td>
</tr>
<tr>
<td class="desc"><?php echo $lab_Field_site801_024 ; ?></td>
<td class="desc_value"><b><span id="pw_<?php echo $idx; ?>"><?php echo htmlspecialchars($loginValue, ENT_QUOTES, 'UTF-8'); ?></span>.123</b> &nbsp;&nbsp; <?php echo $lab_Field_site801_025 ; ?></td>
</tr>
<tr>
<td class="desc"><?php echo $lab_Field_site801_023 ; ?></td>
<td class="desc_value">
<?php
foreach ($regionList as $regIdx => $regDesc)
{
$regChecked = in_array($regDesc, $uRegionDesc) ? 'checked' : '';
echo"<INPUT TYPE=CHECKBOX NAME=\"inRegion[$idx][$regIdx]\" VALUE=\"1\" $regChecked> $regDesc &nbsp;&nbsp;&nbsp;";
}
?>
</td>
</tr>
</table>
</div>
<div class="head_tag"><?php echo $lab_Tag_site801_004 ;?></div>
<div class="tag">
<table class="desc_val">
<tr>
<td class="label"><?php echo $lab_Field_site801_013 ;?></td>
<td class="label"><?php echo $lab_Field_site801_014 ;?></td>
<td class="label"></td>
</tr>
<?php
foreach ($profileArr as $p)
{
$proChecked = ($p["PRO_ID"]==$defProID) ? 'checked' : '';
echo"
<tr>
<td class='field_center'>".$p["PRO_NAME"]."</td>
<td class='field_center'>".$p["PRO_DESCRIPTION"]."</td>
<td class='field_center'><INPUT TYPE=CHECKBOX NAME=\"inProfile[$idx][".$p["PRO_ID"]."]\" VALUE=\"1\" $proChecked></td>
</tr>
";
}
?>
</table>
</div>
</div>
<?php
}
?>
<div class="tag100">
<div class="tag_buttons">
<a class="btn btn-info btn-sm" style="text-decoration: none;" href="./?pg=site801" role="button"><?php echo $lab_ButtonName_Cancel; ?></a>
<INPUT class='btn btn-success btn-sm' TYPE='SUBMIT' NAME='subUserSave' VALUE="<?php echo $lab_ButtonName_Save; ?>">
</div>
</div>
</FORM>
<?php
}
}
}
else showFooterWarningAccessNotification($lab_FooterWarningAccessNotification_001);
?>