1
0
Fork 0
MastodonStartpage/web/admin/instances.php
pezcurrel a37efa448e ...
2020-01-27 17:26:37 +01:00

1211 lines
55 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
require('include/glob.php');
require('include/muoribene.php');
require('include/sessionstart.php');
require('include/menu.php');
$menu['istanze']['href']=null;
$menu['istanze']['selected']=true;
buildmenu($menu);
require('include/myconn.php');
$dbg='';
use function mysqli_real_escape_string as myesc;
// praticamente una macro
function hspech($str) {
return(htmlspecialchars($str,ENT_QUOTES|ENT_HTML5,'UTF-8'));
}
function nully($val,$fem,$filter,$ntext=null) {
if (!is_null($val)) {
if ($filter=='strip') {
return(strip_tags($val,'<a><br><ol><ul><li><p><i><b><strong><em><small>'));
} elseif ($filter=='htmlchars') {
return(hspech($val));
} elseif ($filter=='timestamp') {
return(strftime('%a %d %b %Y, %T',$val));
} elseif ($filter=='email') {
return('<a href="mailto:'.strip_tags($val).'">'.strip_tags($val).'</a>');
} elseif ($filter=='url') {
return('<a href="'.strip_tags($val).'" target="_blank">'.strip_tags($val).'</a>');
} elseif ($filter=='image') {
return('<img src="'.str_replace('"','\\"',strip_tags($val)).'">');
} elseif ($filter=='boolt') {
if ($val)
return('<span class="good">Si</span>');
else
return('<span class="bad">No</span>');
} elseif ($filter=='boolf') {
if ($val)
return('<span class="bad">Si</span>');
else
return('<span class="good">No</span>');
} else {
return($val);
}
} else {
if (is_null($ntext)) {
if ($fem)
return('<span class="nully">Non definita</span>');
else
return('<span class="nully">Non definito</span>');
}
else {
return('<span class="nully">'.$ntext.'</span>');
}
}
}
function booly($pre,$val,$nottoobad=false,$invcol=false) {
if ($val) {
if (!$invcol) {
$p='<p class="good">';
} else {
if (!$nottoobad) {
$p='<p class="bad">';
} else {
$p='<p class="neut">';
}
}
return($p.$pre.'SI</p>');
} else {
if (!$invcol) {
if (!$nottoobad) {
$p='<p class="bad">';
} else {
$p='<p class="neut">';
}
} else {
$p='<p class="good">';
}
return($p.$pre.'NO</p>');
}
}
$dbg.='<pre>'.print_r($_POST,1).'</pre>';
/*SELECT *, Instances.ID AS IID, GROUP_CONCAT(OrdOurLanguages.NameIt ORDER BY OrdInstOurLangs.Pos ASC SEPARATOR '; ') AS OrdOurLangs FROM Instances LEFT JOIN InstOurLangs ON InstOurLangs.InstID=Instances.ID LEFT JOIN Languages AS OurLanguages ON OurLanguages.ID=InstOurLangs.OurLangID LEFT JOIN InstOurLangs AS OrdInstOurLangs ON OrdInstOurLangs.InstID=Instances.ID LEFT JOIN Languages AS OrdOurLanguages ON OrdOurLanguages.ID=OrdInstOurLangs.OurLangID WHERE OurLanguages.NameIT LIKE '%italiano%' GROUP BY IID LIMIT 50*/
$cols=array(
'Instances.New'=>array('field'=>'Instances.New','name'=>'Nuova','type'=>'bool'),
'Instances.Good'=>array('field'=>'Instances.Good','name'=>'Papabile','type'=>'bool'),
'Instances.Chosen'=>array('field'=>'Instances.Chosen','name'=>'Scelta','type'=>'bool'),
'Instances.Visible'=>array('field'=>'Instances.Visible','name'=>'Visibile','type'=>'bool'),
'Instances.Blacklisted'=>array('field'=>'Instances.Blacklisted','name'=>'Blacklistata','type'=>'bool'),
'Instances.URI'=>array('field'=>'Instances.URI','name'=>'URI','type'=>'text'),
'Instances.Title'=>array('field'=>'Instances.Title','name'=>'Titolo','type'=>'text'),
'Instances.ShortDesc'=>array('field'=>'Instances.ShortDesc','name'=>'Descrizione breve','type'=>'text'),
'Instances.LongDesc'=>array('field'=>'Instances.LongDesc','name'=>'Descrizione lunga','type'=>'text'),
'Instances.OurDesc'=>array('field'=>'Instances.OurDesc','name'=>'Descrizione nostra','type'=>'text'),
//--------------------------------
'Instances.LocalityID'=>array('field'=>'Instances.LocalityID','name'=>'Località ⮞','type'=>'join','join'=>array(),'ord'=>false),
'Localities.Locality'=>array('field'=>'Localities.Locality','name'=>'Località','type'=>'joini','join'=>array('Localities ON Localities.ID=Instances.LocalityID'),'subtype'=>'text'),
'Provinces.ID'=>array('field'=>'Provinces.ID','name'=>'Provincia ⮞','type'=>'join','join'=>array('Localities ON Localities.ID=Instances.LocalityID','Provinces ON Provinces.ID=Localities.ProvinceID'),'ord'=>false),
'Provinces.Province'=>array('field'=>'Provinces.Province','name'=>'Provincia','type'=>'joini','join'=>array('Localities ON Localities.ID=Instances.LocalityID','Provinces ON Provinces.ID=Localities.ProvinceID'),'subtype'=>'text'),
'Regions.ID'=>array('field'=>'Regions.ID','name'=>'Regione ⮞','type'=>'join','join'=>array('Localities ON Localities.ID=Instances.LocalityID','Provinces ON Provinces.ID=Localities.ProvinceID','Regions ON Regions.ID=Provinces.RegionID'),'ord'=>false),
'Regions.Region'=>array('field'=>'Regions.Region','name'=>'Regione','type'=>'joini','join'=>array('Localities ON Localities.ID=Instances.LocalityID','Provinces ON Provinces.ID=Localities.ProvinceID','Regions ON Regions.ID=Provinces.RegionID'),'subtype'=>'text'),
'States.ID'=>array('field'=>'States.ID','name'=>'Stato ⮞','type'=>'join','join'=>array('Localities ON Localities.ID=Instances.LocalityID','Provinces ON Provinces.ID=Localities.ProvinceID','Regions ON Regions.ID=Provinces.RegionID','States ON States.ID=Regions.StateID'),'ord'=>false),
'States.State'=>array('field'=>'States.State','name'=>'Stato','type'=>'joini','join'=>array('Localities ON Localities.ID=Instances.LocalityID','Provinces ON Provinces.ID=Localities.ProvinceID','Regions ON Regions.ID=Provinces.RegionID','States ON States.ID=Regions.StateID'),'subtype'=>'text'),
//--------------------------------
'Instances.Email'=>array('field'=>'Instances.Email','name'=>'Email di contatto','type'=>'text'),
'Instances.Software'=>array('field'=>'Instances.Software','name'=>'Software','type'=>'text'),
'Instances.Version'=>array('field'=>'Instances.Version','name'=>'Versione','type'=>'text'),
'Instances.UserCount'=>array('field'=>'Instances.UserCount','name'=>'Utenti','type'=>'int'),
'Instances.StatusCount'=>array('field'=>'Instances.StatusCount','name'=>'Stati','type'=>'int'),
'Instances.DomainCount'=>array('field'=>'Instances.DomainCount','name'=>'Istanze note','type'=>'int'),
'Instances.ActiveUsersMonth'=>array('field'=>'Instances.ActiveUsersMonth','name'=>'Utenti attivi (mese)','type'=>'int'),
'Instances.ActiveUsersHalfYear'=>array('field'=>'Instances.ActiveUsersHalfYear','name'=>'Utenti attivi (6 mesi)','type'=>'int'),
'Instances.Thumb'=>array('field'=>'Instances.Thumb','name'=>'Logo','type'=>'text','search'=>false,'ord'=>false),
'Instances.RegOpen'=>array('field'=>'Instances.RegOpen','name'=>'Registrazioni aperte','type'=>'bool'),
'Instances.RegReqApproval'=>array('field'=>'Instances.RegReqApproval','name'=>'Approvazione registrazioni','type'=>'bool'),
'Instances.MaxTootChars'=>array('field'=>'Instances.MaxTootChars','name'=>'Limite caratteri','type'=>'int'),
'Instances.AdmAccount'=>array('field'=>'Instances.AdmAccount','name'=>'Account admin','type'=>'text'),
'Instances.AdmDisplayName'=>array('field'=>'Instances.AdmDisplayName','name'=>'Nome account admin','type'=>'text'),
'Instances.AdmCreatedAt'=>array('field'=>'Instances.AdmCreatedAt','name'=>'Data creazione account admin','type'=>'time'),
'Instances.AdmURL'=>array('field'=>'Instances.AdmURL','name'=>'Pagina delladmin','type'=>'text','search'=>false,'ord'=>false),
'Instances.AdmAvatar'=>array('field'=>'Instances.AdmAvatar','name'=>'Avatar admin','type'=>'text','search'=>false,'ord'=>false),
'Instances.AdmNote'=>array('field'=>'Instances.AdmNote','name'=>'Note delladmin','type'=>'text'),
//--------------------------------
'InstLangs'=>array('name'=>'Lingue dichiarate','search'=>false,'ord'=>false),
'InstLangs.LangID'=>array('field'=>'InstLangs%.LangID','name'=>'Una lingua dichiarata ⮞','type'=>'join','join'=>array('InstLangs AS InstLangs% ON InstLangs%.InstID=Instances.ID'),'ord'=>false),
'Languages.NameIT'=>array('field'=>'Languages%.NameIT','name'=>'Una lingua dichiarata','type'=>'joini','join'=>array('InstLangs AS InstLangs% ON InstLangs%.InstID=Instances.ID','Languages AS Languages% ON Languages%.ID=InstLangs%.LangID'),'subtype'=>'text','ord'=>true,'ordname'=>'Lingue dichiarate','ordjoin'=>array('InstLangs AS OrdInstLangs ON OrdInstLangs.InstID=Instances.ID','Languages AS OrdLanguages ON OrdLanguages.ID=OrdInstLangs.LangID'),'ordselmore'=>'GROUP_CONCAT(OrdLanguages.NameIT ORDER BY OrdInstLangs.Pos ASC SEPARATOR \'\') AS xOrdLangs','ordby'=>'xOrdLangs'),
'InstLangs.LangID.First'=>array('field'=>'InstLangs.LangID','name'=>'Lingua primaria dichiarata ⮞','type'=>'join','join'=>array('InstLangs AS InstLangs ON InstLangs.InstID=Instances.ID AND InstLangs.Pos=1'),'ord'=>false),
'Languages.NameIT.First'=>array('field'=>'Languages.NameIT','name'=>'Lingua primaria dichiarata','type'=>'joini','join'=>array('InstLangs AS InstLangs ON InstLangs.InstID=Instances.ID AND InstLangs.Pos=1','Languages AS Languages ON Languages.ID=InstLangs.LangID'),'subtype'=>'text','ord'=>false),
//--------------------------------
'InstOurLangs'=>array('name'=>'Lingue impostate da noi','search'=>false,'ord'=>false),
'InstOurLangs.OurLangID'=>array('field'=>'InstOurLangs%.OurLangID','name'=>'Una lingua impostata da noi ⮞','type'=>'join','join'=>array('InstOurLangs AS InstOurLangs% ON InstOurLangs%.InstID=Instances.ID'),'ord'=>false),
'OurLanguages.NameIT'=>array('field'=>'OurLanguages%.NameIT','name'=>'Una lingua impostata da noi','type'=>'joini','join'=>array('InstOurLangs AS InstOurLangs% ON InstOurLangs%.InstID=Instances.ID','Languages AS OurLanguages% ON OurLanguages%.ID=InstOurLangs%.OurLangID'),'subtype'=>'text','ord'=>true,'ordname'=>'Lingue impostate da noi','ordjoin'=>array('InstOurLangs AS OrdInstOurLangs ON OrdInstOurLangs.InstID=Instances.ID','Languages AS OrdOurLanguages ON OrdOurLanguages.ID=OrdInstOurLangs.OurLangID'),'ordselmore'=>'GROUP_CONCAT(OrdOurLanguages.NameIT ORDER BY OrdInstOurLangs.Pos ASC SEPARATOR \'\') AS xOrdOurLangs','ordby'=>'xOrdOurLangs'),
'InstOurLangs.OurLangID.First'=>array('field'=>'InstOurLangs.OurLangID','name'=>'Lingua primaria impostata da noi ⮞','type'=>'join','join'=>array('InstOurLangs AS InstOurLangs ON InstOurLangs.InstID=Instances.ID AND InstOurLangs.Pos=1'),'ord'=>false),
'OurLanguages.NameIT.First'=>array('field'=>'OurLanguages.NameIT','name'=>'Lingua primaria impostata da noi','type'=>'joini','join'=>array('InstOurLangs AS InstOurLangs ON InstOurLangs.InstID=Instances.ID AND InstOurLangs.Pos=1','Languages AS OurLanguages ON OurLanguages.ID=InstOurLangs.OurLangID'),'subtype'=>'text','ord'=>false),
//--------------------------------
'InstFinancing'=>array('name'=>'Modalità di finanziamento','search'=>false,'ord'=>false),
'InstFinancing.FinID'=>array('field'=>'InstFinancing%.FinID','name'=>'Una modalità di finanziamento ⮞','type'=>'join','join'=>array('InstFinancing AS InstFinancing% ON InstFinancing%.InstID=Instances.ID'),'ord'=>false),
'Financing.Type'=>array('field'=>'Financing%.Type','name'=>'Una modalità di finanziamento','type'=>'joini','join'=>array('InstFinancing AS InstFinancing% ON InstFinancing%.InstID=Instances.ID','Financing AS Financing% ON Financing%.ID=InstFinancing%.FinID'),'subtype'=>'text','ord'=>true,'ordname'=>'Modalità di finanziamento','ordjoin'=>array('InstFinancing AS OrdInstFinancing ON OrdInstFinancing.InstID=Instances.ID','Financing AS OrdFinancing ON OrdFinancing.ID=OrdInstFinancing.FinID'),'ordselmore'=>'GROUP_CONCAT(OrdFinancing.Type ORDER BY OrdInstFinancing.Pos ASC SEPARATOR \'\') AS xOrdFinancing','ordby'=>'xOrdFinancing'),
'InstFinancing.FinID.First'=>array('field'=>'InstFinancing.FinID','name'=>'Modalità di finanziamento primaria ⮞','type'=>'join','join'=>array('InstFinancing AS InstFinancing ON InstFinancing.InstID=Instances.ID AND InstFinancing.Pos=1'),'ord'=>false),
'Financing.Type.First'=>array('field'=>'Financing.Type','name'=>'Modalità di finanziamento primaria','type'=>'joini','join'=>array('InstFinancing AS InstFinancing ON InstFinancing.InstID=Instances.ID AND InstFinancing.Pos=1','Financing AS Financing ON Financing.ID=InstFinancing.FinID'),'subtype'=>'text','ord'=>false),
//--------------------------------
'InstPolicies'=>array('name'=>'Restrizioni sui contenuti','search'=>false,'ord'=>false),
'InstPolicies.PolID'=>array('field'=>'InstPolicies%.PolID','name'=>'Una restrizione sui contenuti ⮞','type'=>'join','join'=>array('InstPolicies AS InstPolicies% ON InstPolicies%.InstID=Instances.ID'),'ord'=>false),
'Policies.Name'=>array('field'=>'Policies%.Name','name'=>'Una restrizione sui contenuti','type'=>'joini','join'=>array('InstPolicies AS InstPolicies% ON InstPolicies%.InstID=Instances.ID','Policies AS Policies% ON Policies%.ID=InstPolicies%.PolID'),'subtype'=>'text','ord'=>true,'ordname'=>'Restrizioni sui contenuti','ordjoin'=>array('InstPolicies AS OrdInstPolicies ON OrdInstPolicies.InstID=Instances.ID','Policies AS OrdPolicies ON OrdPolicies.ID=OrdInstPolicies.PolID'),'ordselmore'=>'GROUP_CONCAT(OrdPolicies.Name ORDER BY OrdInstPolicies.Pos ASC SEPARATOR \'\') AS xOrdPolicies','ordby'=>'xOrdPolicies'),
'InstPolicies.PolID.First'=>array('field'=>'InstPolicies.PolID','name'=>'Restrizione sui contenuti primaria ⮞','type'=>'join','join'=>array('InstPolicies AS InstPolicies ON InstPolicies.InstID=Instances.ID AND InstPolicies.Pos=1'),'ord'=>false),
'Policies.Name.First'=>array('field'=>'Policies.Name','name'=>'Restrizione sui contenuti primaria','type'=>'joini','join'=>array('InstPolicies AS InstPolicies ON InstPolicies.InstID=Instances.ID AND InstPolicies.Pos=1','Policies AS Policies ON Policies.ID=InstPolicies.PolID'),'subtype'=>'text','ord'=>false),
//--------------------------------
'InstTags'=>array('name'=>'Tags','search'=>false,'ord'=>false),
'InstTags.TagID'=>array('field'=>'InstTags%.TagID','name'=>'Una tag ⮞','type'=>'join','join'=>array('InstTags% ON InstTags%.InstID=Instances.ID'),'ord'=>false),
'Tags.Name'=>array('field'=>'Tags%.Name','name'=>'Una tag','type'=>'joini','join'=>array('InstTags AS InstTags% ON InstTags%.InstID=Instances.ID','Tags AS Tags% ON Tags%.ID=InstTags%.TagID'),'subtype'=>'text','ord'=>true,'ordname'=>'Tags','ordjoin'=>array('InstTags AS OrdInstTags ON OrdInstTags.InstID=Instances.ID','Tags AS OrdTags ON OrdTags.ID=OrdInstTags.TagID'),'ordselmore'=>'GROUP_CONCAT(OrdTags.Name ORDER BY OrdInstTags.Pos ASC SEPARATOR \'\') AS xOrdTags','ordby'=>'xOrdTags'),
'InstTags.TagID.First'=>array('field'=>'InstTags.TagID','name'=>'Tag primaria ⮞','type'=>'join','join'=>array('InstTags AS InstTags ON InstTags.InstID=Instances.ID AND InstTags.Pos=1'),'ord'=>false),
'Tags.Name.First'=>array('field'=>'Tags.Name','name'=>'Tag primaria','type'=>'joini','join'=>array('InstTags AS InstTags ON InstTags.InstID=Instances.ID AND InstTags.Pos=1','Tags AS Tags ON Tags.ID=InstTags.TagID'),'subtype'=>'text','ord'=>false),
//--------------------------------
'InstActivity.Statuses.First'=>array('field'=>'InstActivity.Statuses','name'=>'Stati ultima settimana','type'=>'joini','join'=>array('InstActivity AS InstActivity ON InstActivity.InstID=Instances.ID AND InstActivity.Pos=1'),'subtype'=>'int','ord'=>true,'ordjoin'=>array('InstActivity AS OrdInstActivity ON OrdInstActivity.InstID=Instances.ID AND OrdInstActivity.Pos=1'),'ordselmore'=>1,'ordby'=>'OrdInstActivity.Statuses'),
'InstActivity.Logins.First'=>array('field'=>'InstActivity.Logins','name'=>'Logins ultima settimana','type'=>'joini','join'=>array('InstActivity AS InstActivity ON InstActivity.InstID=Instances.ID AND InstActivity.Pos=1'),'subtype'=>'int','ord'=>true,'ordjoin'=>array('InstActivity AS OrdInstActivity ON OrdInstActivity.InstID=Instances.ID AND OrdInstActivity.Pos=1'),'ordselmore'=>1,'ordby'=>'OrdInstActivity.Logins'),
'IntstActivity.Registrations.First'=>array('field'=>'InstActivity.Registrations','name'=>'Registrazioni ultima settimana','type'=>'joini','join'=>array('InstActivity AS InstActivity ON InstActivity.InstID=Instances.ID AND InstActivity.Pos=1'),'subtype'=>'int','ord'=>true,'ordjoin'=>array('InstActivity AS OrdInstActivity ON OrdInstActivity.InstID=Instances.ID AND OrdInstActivity.Pos=1'),'ordselmore'=>1,'ordby'=>'OrdInstActivity.Registrations'),
//--------------------------------
/*'InstActivity.Statuses.AVG'=>array('field'=>'InstActivity.Statuses','name'=>'Media stati ultima settimana','type'=>'joini','join'=>array('InstActivity ON InstActivity.InstID=Instances.ID'),'subtype'=>'int','ord'=>true,'ordjoin'=>array('InstActivity AS OrdInstActivity ON OrdInstActivity.InstID=Instances.ID'),'ordselmore'=>'AVG(InstActivity.Statuses) AS avgstatuses'),
'InstActivity.Logins.AVG'=>array('field'=>'InstActivity.Logins','name'=>'Logins ultima settimana','type'=>'joini','join'=>array('InstActivity ON InstActivity.InstID=Instances.ID'),'subtype'=>'int','wheremore'=>'InstActivity.Pos=1','ord'=>false),
'IntstActivity.Registrations.AVG'=>array('field'=>'InstActivity.Registrations','name'=>'Registrazioni ultima settimana','type'=>'joini','join'=>array('InstActivity ON InstActivity.InstID=Instances.ID'),'subtype'=>'int','wheremore'=>'InstActivity.Pos=1','ord'=>false),*/
);
$types=array('bool','int','time','text','join','joini');
$fieldselopts='';
$ordfieldselopts='';
foreach ($cols as $key=>$arr) {
if (!array_key_exists('search',$arr) || $arr['search']==true) {
if ($arr['type']=='joini') {
$fieldselopts.='<option value="'.$key.':'.$arr['type'].':'.$arr['subtype'].'">'.$arr['name'].'</option>';
} else {
$fieldselopts.='<option value="'.$key.':'.$arr['type'].':null">'.$arr['name'].'</option>';
}
}
if (!array_key_exists('ord',$arr) || $arr['ord']==true) {
if (!array_key_exists('ordname',$arr))
$name=$arr['name'];
else
$name=$arr['ordname'];
if ($arr['type']=='joini') {
$ordfieldselopts.='<option value="'.$key.':'.$arr['type'].':'.$arr['subtype'].'">'.$name.'</option>';
} else {
$ordfieldselopts.='<option value="'.$key.':'.$arr['type'].':null">'.$name.'</option>';
}
}
}
$pblocks=0;
foreach ($_POST as $key=>$val)
if (preg_match('/^openpar-\d+$/',$key)===1)
$pblocks++;
$fi=0;
$ji=0;
$oi=0;
$jsaddrows='';
$jssetrows='';
$jsordaddrows='';
$jsordsetrows='';
$sels=array();
$joins=array();
$havings=array();
$where='';
$order='';
foreach ($_POST as $key=>$val) {
if (preg_match('/^openpar-\d+$/',$key)===1) {
$fi++;
if (preg_match('/^\(+$/',$val)===1)
$where.=$val;
$jsaddrows.='addrow('.$fi.',false);'.N;
$jssetrows.='setrow('.$fi.','.json_encode($val);
}
if (preg_match('/^fieldsel-\d+$/',$key)===1 && preg_match('/^(.+):(.+):(.+)$/',$val,$buf)===1) {
$tagk=$buf[1];
$type=$buf[2];
$subtype=$buf[3];
if (array_key_exists($tagk,$cols) && in_array($type,$types)) {
if (strpos($cols[$tagk]['field'],'%')!==false)
$ji++;
$where.=str_replace('%',$ji,$cols[$tagk]['field']);
if ($type=='join' || $type=='joini') {
foreach ($cols[$tagk]['join'] as $join) {
$join=str_replace('%',$ji,$join);
if (!in_array($join,$joins))
$joins[]=$join;
}
}
if (array_key_exists('havings',$cols[$tagk]) && !in_array($cols[$tagk]['havings'],$havings))
$havings[]=$cols[$tagk]['havings'];
if (array_key_exists('selmore',$cols[$tagk]) && !in_array($cols[$tagk]['selmore'],$sels))
$sels[]=$cols[$tagk]['selmore'];
$jssetrows.=','.json_encode($val);
} else {
muoribene($dbg.'<br>Dati POST corrotti.<br>Puoi <a href="instances.php">riprovare resettando i parametri</a> o <a href="index.php">tornare al login</a>.',true);
}
}
if (preg_match('/^condsel-\d+$/',$key)===1) {
$where.=' '.$val.' ';
$cond=$val;
$jssetrows.=','.json_encode($val);
// nel caso qui sotto, valuesel e valueinp sono entrambi disabilitati (non ci sono in $_POST), quindi li riempio di introvabile e nulla
if (preg_match('/^IS NULL|IS NOT NULL$/',$val)===1)
$jssetrows.=',"NOMMITROVI!",""';
}
if (preg_match('/^valuesel-\d+$/',$key)===1) {
$where.=$val;
$jssetrows.=','.json_encode($val);
$jssetrows.=',""';
}
if (preg_match('/^valueinp-\d+$/',$key)===1) {
if (preg_match('/^LIKE|NOT LIKE$/',$cond)===1)
$where.='\'%'.myesc($link,$val).'%\'';
else
$where.='\''.myesc($link,$val).'\'';
$jssetrows.=',"NOMMITROVI!"';
$jssetrows.=','.json_encode($val);
}
if (preg_match('/^closepar-\d+$/',$key)===1) {
if (preg_match('/^\)+$/',$val)===1)
$where.=$val;
$jssetrows.=','.json_encode($val);
}
if (preg_match('/^andor-\d+$/',$key)===1 && preg_match('/^AND|OR$/',$val)===1) {
if ($fi<$pblocks)
$where.=' '.$val.' ';
$jssetrows.=','.json_encode($val).');'.N;
}
if (preg_match('/^ordfieldsel-\d+$/',$key)===1 && preg_match('/^(.+):(.+):(.+)$/',$val,$buf)===1) {
$oi++;
$tagk=$buf[1];
$type=$buf[2];
$subtype=$buf[3];
if (array_key_exists($tagk,$cols) && in_array($type,$types)) {
if ($type=='join' || $type=='joini') {
if (!array_key_exists('ordjoin',$cols[$tagk])) {
foreach ($cols[$tagk]['join'] as $join)
if (!in_array($join,$joins))
$joins[]=$join;
} else {
foreach ($cols[$tagk]['ordjoin'] as $join)
if (!in_array($join,$joins))
$joins[]=$join;
}
}
if (!array_key_exists('ordby',$cols[$tagk])) {
$order.=$cols[$tagk]['field'];
} else {
if (!in_array($cols[$tagk]['ordselmore'],$sels))
$sels[]=$cols[$tagk]['ordselmore'];
$order.=$cols[$tagk]['ordby'];
}
if (array_key_exists('havings',$cols[$tagk]) && !in_array($cols[$tagk]['havings'],$havings))
$havings[]=$cols[$tagk]['havings'];
if (array_key_exists('selmore',$cols[$tagk]) && !in_array($cols[$tagk]['selmore'],$sels))
$sels[]=$cols[$tagk]['selmore'];
$jsordaddrows.='ordaddrow('.$oi.',false);'.N;
$jsordsetrows.='ordsetrow('.$oi.','.json_encode($val);
} else {
muoribene($dbg.'<br>Dati POST corrotti.<br>Puoi <a href="instances.php">riprovare resettando i parametri</a> o <a href="index.php">tornare al login</a>.',true);
}
}
if (preg_match('/^ascdesc-\d+$/',$key)===1 && preg_match('/^ASC|DESC$/',$val)===1) {
$order.=' '.$val.', ';
$jsordsetrows.=','.json_encode($val).');'.N;
}
}
if ($jsaddrows!='') {
$jsaddrows.='document.getElementById("filbut").value="Rimuovi tutti i criteri di ricerca";'.N;
$jsaddrows.='synctai();'.N;
}
if ($jsordaddrows!='') {
$jsordaddrows.='document.getElementById("ordbut").value="Rimuovi tutti i criteri di ordinamento";'.N;
$jsordaddrows.='synctoi();'.N;
}
if (count($sels)>0)
$sels=', '.implode(', ',$sels);
else
$sels='';
if ($where!='')
$where='WHERE '.$where;
if ($order!='')
$order='ORDER BY '.substr($order,0,-2);
$dbg.='ORDER: '.$order.'<br>';
if (count($joins)>0)
$joins='LEFT JOIN '.implode(' LEFT JOIN ',$joins);
else
$joins='';
if (count($havings)>0)
$havings='HAVING '.implode(' AND ',$havings);
else
$havings='';
$query='SELECT *, Instances.ID AS IID'.$sels.' FROM Instances '.$joins.' '.$where.' GROUP BY IID '.$havings.' '.$order.' LIMIT 50';
$dbg.='QUERONA: '.$query.'<br>'.N;
$tini=microtime(true);
$res=mysqli_query($link,$query)
or muoribene($dbg.'<br>'.$query.': '.mysqli_error($link).'<br>'.'La query è fallita. <a href="instances.php">Resetta</a>.',true);
$dbg.='Durata esecuzione query: '.round(microtime(true)-$tini,4).' sec.<br>'.N;
if (mysqli_num_rows($res)<1) {
$out='<p>Nessuna istanza da mostrare.</p>'.N;
} else {
$out='';
while ($row=mysqli_fetch_assoc($res)) {
$out.='<table class="bigtab">'.N;
// $out.='<thead><tr><th class="tdattr">Attributi</th><th>Info</th></thead>'.N;
$out.='<tbody>'.N;
$out.='<tr><td colspan="2" class="insthead">'.$row['URI'].' {'.$row['IID'].'}</td></tr>'.N;
$attr=booly($cols['Instances.Blacklisted']['name'].': ',$row['Blacklisted'],false,true).N;
$attr.=booly($cols['Instances.New']['name'].': ',$row['New'],true).N;
$attr.=booly($cols['Instances.Good']['name'].': ',$row['Good']).N;
$attr.=booly($cols['Instances.Chosen']['name'].': ',$row['Chosen']).N;
$attr.=booly($cols['Instances.Visible']['name'].': ',$row['Visible']).N;
/* $attr.=booly($cols['Instances.RegOpen']['name'].': ',$row['RegOpen']).N;
$attr.=booly($cols['Instances.RegReqApproval']['name'].': ',$row['RegReqApproval'],true,true).N;*/
$sres=mysqli_query($link,'SELECT * FROM InstChecks WHERE InstID='.$row['IID'].' ORDER BY Time DESC')
or muoribene(mysqli_error($link),true);
$csres=mysqli_num_rows($sres);
if ($csres>0) {
$bene=0;
while ($srow=mysqli_fetch_assoc($sres)) {
if ($srow['Status']==1)
$bene++;
}
$width=str_replace(',','.',100/$csres*$bene);
$attr.='<div class="colsectheader">Percentuale di risposta ai nostri check: '.round($width,1).'%</div>';
$attr.='<div class="percbg"><div class="percfg" style="width:'.$width.'%;"></div></div>'.N;
mysqli_data_seek($sres,0);
$srow=mysqli_fetch_assoc($sres);
$attr.='<div class="colsectcont">Ultimo check '.strftime('%e %b %Y, %T',$srow['Time']).': '.(($srow['Status']) ? '<span class="good">OK</span>' : '<span class="bad">KO</span>').'</div>';
} else {
$attr.='<div class="colsectheader">Percentuale di risposta ai nostri check</div>'.N;
$attr.='<div class="colsectcont nully">Non disponibile (?!?!?!)</div>'.N;
}
$attr.='<div class="colsectheader">Attività delle ultime 12 settimane</div>'.N;
$sres=mysqli_query($link,'SELECT SUM(Statuses) AS tstatuses, SUM(Logins) AS tlogins, SUM(Registrations) AS tregs FROM InstActivity WHERE InstID='.$row['IID'])
or muoribene(mysqli_error($link),true);
$tot=mysqli_fetch_assoc($sres);
$sres=mysqli_query($link,'SELECT * FROM InstActivity WHERE InstID='.$row['IID'].' ORDER BY Week DESC')
or muoribene(mysqli_error($link),true);
if (mysqli_num_rows($sres)>0) {
$attr.='<div class="colsectcont">Stati: '.$tot['tstatuses'].'<br>Accessi: '.$tot['tlogins'].'<br>Registrazioni: '.$tot['tregs'].'</div>'.N;
while ($srow=mysqli_fetch_assoc($sres)) {
$attr.='<div class="colsectcontb">'.strftime('%e %b %Y',$srow['Week']).'</div>'.N;
($tot['tstatuses']==0) ? $width=0 : $width=str_replace(',','.',100/$tot['tstatuses']*$srow['Statuses']);
$attr.='<div class="percstatuses" style="width:'.$width.'%;">'.$srow['Statuses'].'&nbsp;stati</div>'.N;
($tot['tlogins']==0) ? $width=0 : $width=str_replace(',','.',100/$tot['tlogins']*$srow['Logins']);
$attr.='<div class="perclogins" style="width:'.$width.'%;">'.$srow['Logins'].'&nbsp;accessi</div>'.N;
($tot['tregs']==0) ? $width=0 : $width=str_replace(',','.',100/$tot['tregs']*$srow['Registrations']);
$attr.='<div class="percregs" style="width:'.$width.'%;">'.$srow['Registrations'].'&nbsp;registrazioni</div>'.N;
}
} else {
$attr.='<div class="colsectcont nully">Non disponibile</div>'.N;
}
$attr.='<div class="colsectheader">Hashtags più usati durante lultima settimana</div>'.N;
$sres=mysqli_query($link,'SELECT * FROM InstTrends WHERE InstID='.$row['IID'].' ORDER BY Pos ASC')
or muoribene(mysqli_error($link),true);
if (mysqli_num_rows($sres)>0) {
$attr.='<div class="colsectcont"><ol>'.N;
while ($srow=mysqli_fetch_assoc($sres)) {
$attr.='<li><a href="'.$srow['URL'].'">'.hspech($srow['Name']).'</a></li>'.N;
}
$attr.='</ol></div>'.N;
} else {
$attr.='<div class="colsectcont nully">Non disponibili</div>'.N;
}
$out.='<tr><td class="tdattr">'.$attr.'</td><td>'.N;
$out.='<div class="baloo"><span class="field">'.$cols['Instances.URI']['name'].':</span> <a href="https://'.$row['URI'].'" target="_blank">'.$row['URI'].'</a></div>'.N;
$out.='<div class="baloo"><span class="field">'.$cols['Instances.Title']['name'].':</span> '.nully($row['Title'],false,'strip').'</div>'.N;
$out.='<div class="baloo"><span class="field">'.$cols['Instances.Thumb']['name'].':</span> '.nully($row['Thumb'],true,'image').'</div>'.N;
$out.='<div class="baloo"><span class="field">'.$cols['Instances.ShortDesc']['name'].':</span> '.nully($row['ShortDesc'],true,'strip').'</div>'.N;
$out.='<div class="baloo"><span class="field">'.$cols['Instances.LongDesc']['name'].':</span> '.nully($row['LongDesc'],true,'strip').'</div>'.N;
// 'strip' o 'htmlent' per la descrizione nostra?
$out.='<div class="baloo"><span class="ourfield">'.$cols['Instances.OurDesc']['name'].':</span> '.nully($row['OurDesc'],true,'strip').'</div>'.N;
$out.='<div class="baloo"><span class="ourfield">'.$cols['Localities.Locality']['name'].':</span> ';
if (!is_null($row['LocalityID'])) {
$sres=mysqli_query($link,'SELECT * FROM Localities LEFT JOIN Provinces ON Provinces.ID=Localities.ProvinceID LEFT JOIN Regions ON Regions.ID=Provinces.RegionID LEFT JOIN States ON States.ID=Regions.StateID WHERE Localities.ID='.$row['LocalityID'])
or muoribene(mysqli_error($link),true);
$srow=mysqli_fetch_assoc($sres);
$out.=hspech($srow['Locality']).' ('.$srow['Province'].', '.$srow['Region'].', '.$srow['State'].')</div>'.N;
} else {
$out.='<span class="nully">Non definita</span></div>'.N;
}
$sres=mysqli_query($link,'SELECT * FROM InstLangs LEFT JOIN Languages ON Languages.ID=LangID WHERE InstID='.$row['IID'].' ORDER BY Pos ASC')
or muoribene(mysqli_error($link),true);
if (mysqli_num_rows($sres)>0) {
$i=0;
$buf=array();
while ($srow=mysqli_fetch_assoc($sres)) {
$i++;
$buf[]=$i.': '.hspech($srow['Code'].' ['.$srow['NameIT'].']');
}
$out.='<div class="baloo"><span class="field">'.$cols['InstLangs']['name'].':</span> '.implode('; ',$buf).'</div>'.N;
} else {
$out.='<div class="baloo"><span class="field">'.$cols['InstLangs']['name'].':</span> <span class="nully">Non definite</span></div>'.N;
}
$sres=mysqli_query($link,'SELECT * FROM InstOurLangs LEFT JOIN Languages ON Languages.ID=OurLangID WHERE InstID='.$row['IID'].' ORDER BY Pos ASC')
or muoribene(mysqli_error($link),true);
if (mysqli_num_rows($sres)>0) {
$i=0;
$buf=array();
while ($srow=mysqli_fetch_assoc($sres)) {
$i++;
$buf[]=$i.': '.hspech($srow['Code'].' ['.$srow['NameIT'].']');
}
$out.='<div class="baloo"><span class="ourfield">'.$cols['InstOurLangs']['name'].':</span> '.implode('; ',$buf).'</div>'.N;
} else {
$out.='<div class="baloo"><span class="ourfield">'.$cols['InstOurLangs']['name'].':</span> <span class="nully">Non definite</span></div>'.N;
}
$sres=mysqli_query($link,'SELECT * FROM InstFinancing LEFT JOIN Financing ON Financing.ID=FinID WHERE InstID='.$row['IID'].' ORDER BY Pos ASC')
or muoribene(mysqli_error($link),true);
if (mysqli_num_rows($sres)>0) {
$i=0;
$buf=array();
while ($srow=mysqli_fetch_assoc($sres)) {
$i++;
$buf[]=$i.': '.hspech($srow['Type']);
}
$out.='<div class="baloo"><span class="ourfield">'.$cols['InstFinancing']['name'].':</span> '.implode('; ',$buf).'</div>'.N;
} else {
$out.='<div class="baloo"><span class="ourfield">'.$cols['InstFinancing']['name'].':</span> <span class="nully">Non definite</span></div>'.N;
}
$sres=mysqli_query($link,'SELECT * FROM InstPolicies LEFT JOIN Policies ON Policies.ID=PolID WHERE InstID='.$row['IID'].' ORDER BY Pos ASC')
or muoribene(mysqli_error($link),true);
if (mysqli_num_rows($sres)>0) {
$i=0;
$buf=array();
while ($srow=mysqli_fetch_assoc($sres)) {
$i++;
$buf[]=$i.': '.hspech($srow['Name']);
}
$out.='<div class="baloo"><span class="ourfield">'.$cols['InstPolicies']['name'].':</span> '.implode('; ',$buf).'</div>'.N;
} else {
$out.='<div class="baloo"><span class="ourfield">'.$cols['InstPolicies']['name'].':</span> <span class="nully">Non definite</span></div>'.N;
}
$sres=mysqli_query($link,'SELECT * FROM InstTags LEFT JOIN Tags ON Tags.ID=TagID WHERE InstID='.$row['IID'].' ORDER BY Pos ASC')
or muoribene(mysqli_error($link),true);
if (mysqli_num_rows($sres)>0) {
$i=0;
$buf=array();
while ($srow=mysqli_fetch_assoc($sres)) {
$i++;
$buf[]=$i.': '.hspech($srow['Name']);
}
$out.='<div class="baloo"><span class="ourfield">'.$cols['InstTags']['name'].':</span> '.implode('; ',$buf).'</div>'.N;
} else {
$out.='<div class="baloo"><span class="ourfield">'.$cols['InstTags']['name'].':</span> <span class="nully">Non definite</span></div>'.N;
}
$out.='<div class="baloo"><span class="field">'.$cols['Instances.Email']['name'].':</span> '.nully($row['Email'],true,'email').'</div>'.N;
$out.='<div class="baloo"><span class="field">'.$cols['Instances.Software']['name'].':</span> '.nully($row['Software'],false,'strip').'</div>'.N;
$out.='<div class="baloo"><span class="field">'.$cols['Instances.Version']['name'].':</span> '.nully($row['Version'],true,'strip').'</div>'.N;
$out.='<div class="baloo"><span class="field">'.$cols['Instances.UserCount']['name'].':</span> '.nully($row['UserCount'],false,'strip').'</div>'.N;
$out.='<div class="baloo"><span class="field">'.$cols['Instances.StatusCount']['name'].':</span> '.nully($row['StatusCount'],false,'strip').'</div>'.N;
$out.='<div class="baloo"><span class="field">'.$cols['Instances.DomainCount']['name'].':</span> '.nully($row['DomainCount'],false,'strip').'</div>'.N;
$out.='<div class="baloo"><span class="field">'.$cols['Instances.ActiveUsersMonth']['name'].':</span> '.nully($row['ActiveUsersMonth'],false,'strip').'</div>'.N;
$out.='<div class="baloo"><span class="field">'.$cols['Instances.ActiveUsersHalfYear']['name'].':</span> '.nully($row['ActiveUsersHalfYear'],false,'strip').'</div>'.N;
$out.='<div class="baloo"><span class="field">'.$cols['Instances.RegOpen']['name'].':</span> '.nully($row['RegOpen'],false,'boolt').'</div>'.N;
$out.='<div class="baloo"><span class="field">'.$cols['Instances.RegReqApproval']['name'].':</span> '.nully($row['RegReqApproval'],false,'boolf').'</div>'.N;
$out.='<div class="baloo"><span class="field">'.$cols['Instances.MaxTootChars']['name'].':</span> '.nully($row['MaxTootChars'],false,'strip','500').'</div>'.N;
$out.='<div class="baloo"><span class="field">'.$cols['Instances.AdmAccount']['name'].':</span> '.nully($row['AdmAccount'],false,'strip').'</div>'.N;
$out.='<div class="baloo"><span class="field">'.$cols['Instances.AdmDisplayName']['name'].':</span> '.nully($row['AdmDisplayName'],false,'strip').'</div>'.N;
$out.='<div class="baloo"><span class="field">'.$cols['Instances.AdmCreatedAt']['name'].':</span> '.nully($row['AdmCreatedAt'],true,'timestamp').'</div>'.N;
$out.='<div class="baloo"><span class="field">'.$cols['Instances.AdmURL']['name'].':</span> '.nully($row['AdmURL'],true,'url').'</div>'.N;
$out.='<div class="baloo"><span class="field">'.$cols['Instances.AdmAvatar']['name'].':</span> '.nully($row['AdmAvatar'],false,'image').'</div>'.N;
$out.='<div><span class="field">'.$cols['Instances.AdmNote']['name'].':</span> '.nully($row['AdmNote'],false,'strip').'</div>'.N;
$out.='</td></tr>'.N;
$out.='</tbody>'.N;
$out.='</table>'.N;
}
$out.='<div class="bigtabfoot"></div>';
}
$presid=0;
if (array_key_exists('presets',$_POST) && preg_match('/^[0-9]+$/',$_POST['presets'])===1)
$presid=$_POST['presets'];
$presopts='<option value="null"></option>'.N;
$res=mysqli_query($link,'SELECT * FROM Presets ORDER BY Name ASC')
or muoribene(mysqli_error($link),true);
while ($row=mysqli_fetch_assoc($res)) {
if ($row['ID']!=$presid)
$presopts.='<option value="'.$row['ID'].'">'.hspech($row['Name']).'</option>'.N;
else
$presopts.='<option value="'.$row['ID'].'" selected>'.hspech($row['Name']).'</option>'.N;
}
mysqli_close($link);
?>
<!DOCTYPE HTML>
<html lang="it">
<head>
<title>Mastodon Startpage Admin - Istanze</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="description" content="Admin pages for Mastodon Startpage">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<link rel="icon" type="image/png" href="imgs/icona-32.png" sizes="32x32">
<link rel="icon" type="image/png" href="imgs/icona-192.png" sizes="192x192">
<link rel="icon" type="image/png" href="imgs/icona-512.png" sizes="512x512">
<link rel="apple-touch-icon-precomposed" href="imgs/icona-180.png">
<script language="JavaScript" src="js/confirma.js?v=<?php echo($cjrand); ?>"></script>
<script language="JavaScript" src="js/alerta.js?v=<?php echo($cjrand); ?>"></script>
<link rel="stylesheet" type="text/css" href="theme.css?v=<?php echo($cjrand); ?>">
<script language="JavaScript">
<!--
function chulsh(el,sh) {
if (sh)
el.querySelector('ul').style.display='block';
else
el.querySelector('ul').style.display='none';
}
function ulsh(el,sh) {
if (sh)
el.style.display='block';
else
el.style.display='none';
}
function golang(lang) {
var loc=document.location.href;
loc=loc.replace(/#.*$/,'');
loc=loc.replace(/\/$/,'');
if (document.documentElement.lang=='en') {
if (lang!='en')
document.location.href=loc+'/'+lang;
} else {
if (lang!='en')
document.location.href=loc.substr(0,loc.length-3)+'/'+lang;
else
document.location.href=loc.substr(0,loc.length-3);
}
}
function shideplancia() {
var plancia=document.getElementById('plancia');
var plctrl=document.getElementById('plctrl');
if (plancia.style.display=='block') {
plancia.style.display='none';
plctrl.innerHTML='Mostra plancia';
} else {
plancia.style.display='block';
plctrl.innerHTML='Nascondi plancia';
}
}
function truncsel(el) {
var sel=document.getElementById(el), len=sel.length, i=0;
for (i=len-1; i>=0; i--)
sel.remove(i);
}
function addselopt(el,val,txt) {
option=new Option(txt,val);
el.add(option);
}
function inpdisif(index) {
console.log('inpdisif index: '+index);
var source=document.getElementById('condsel-'+index);
var inp=document.getElementById('valueinp-'+index);
var sel=document.getElementById('valuesel-'+index);
var conds=['IS NULL','IS NOT NULL'];
if (conds.includes(source.value)) {
inp.disabled=true;
sel.disabled=true;
} else {
if (inp.style.display!='none') inp.disabled=false;
if (sel.style.display!='none') sel.disabled=false;
}
}
function popusels(index,valselval) {
console.log('popusels index: '+index);
var key=document.getElementById('fieldsel-'+index).value;
var type=key.replace(/^.*:(.*):.*$/,'$1');
var subtype=key.replace(/^.*:.*:(.*)$/,'$1');
key=key.replace(/^(.*):.*:.*$/,'$1');
var condsel=document.getElementById('condsel-'+index);
var valsel=document.getElementById('valuesel-'+index);
var valinp=document.getElementById('valueinp-'+index);
condsel.setAttribute('onchange','inpdisif('+index+');');
if (type=='joini')
type=subtype;
if (type=='bool') {
truncsel('condsel-'+index);
addselopt(condsel,'IS','è');
truncsel('valuesel-'+index);
addselopt(valsel,'TRUE','vero');
addselopt(valsel,'FALSE','falso');
addselopt(valsel,'NOT NULL','definit@');
addselopt(valsel,'NULL','non definit@');
if (valselval!==false)
selind('valuesel-'+index,valselval);
valinp.style.display='none';
valinp.disabled=true;
valsel.style.display='block';
valsel.disabled=false;
} else if (type=='text') {
truncsel('condsel-'+index);
addselopt(condsel,'LIKE','contiene');
addselopt(condsel,'NOT LIKE','non contiene');
addselopt(condsel,'=','è uguale a');
addselopt(condsel,'!=','è divers@ da');
addselopt(condsel,'>=','è maggiore o uguale a');
addselopt(condsel,'<=','è minore o uguale a');
addselopt(condsel,'>','è maggiore di');
addselopt(condsel,'<','è minore di');
addselopt(condsel,'IS NOT NULL','è definit@');
addselopt(condsel,'IS NULL','non è definit@');
valsel.style.display='none';
valsel.disabled=true;
valinp.style.display='block';
valinp.disabled=false;
} else if (type=='int' || type=='time') {
truncsel('condsel-'+index);
addselopt(condsel,'>=','è maggiore o uguale a');
addselopt(condsel,'<=','è minore o uguale a');
addselopt(condsel,'>','è maggiore di');
addselopt(condsel,'<','è minore di');
addselopt(condsel,'=','è uguale a');
addselopt(condsel,'!=','è divers@ da');
addselopt(condsel,'IS NOT NULL','è definit@');
addselopt(condsel,'IS NULL','non è definit@');
valsel.style.display='none';
valsel.disabled=true;
valinp.style.display='block';
valinp.disabled=false;
} else if (type=='join') {
truncsel('condsel-'+index);
addselopt(condsel,'=','è uguale a');
addselopt(condsel,'!=','è divers@ da');
addselopt(condsel,'IS NOT NULL','è definit@');
addselopt(condsel,'IS NULL','non è definit@');
valsel.style.display='block';
valsel.disabled=false;
valinp.style.display='none';
valinp.disabled=true;
truncsel('valuesel-'+index);
pupwait(true);
let xhr=new XMLHttpRequest();
xhr.open('GET','instancesh.php?key='+key);
xhr.responseType='json';
xhr.send();
xhr.onload=function() {
let jarr=xhr.response;
for (i=0; i<jarr.length; i++)
addselopt(valsel,jarr[i][0],jarr[i][1]);
console.log('valsel pronto!');
if (valselval!==false)
selind('valuesel-'+index,valselval);
pupwait(false);
};
xhr.onerror=function() {
pupwait(false);
alert('La richiesta è fallita.');
};
} else {
alert('Attenziò: non so che farmene del tipo "'+type+'": diglielo, al programmatore.');
}
}
function addrow(index,refresh) {
var table=document.getElementById('planciafil');
var newrow=table.insertRow(index);
var newcell0=newrow.insertCell(0);
var newcell1=newrow.insertCell(1);
var newcell2=newrow.insertCell(2);
var newcell3=newrow.insertCell(3);
var newcell4=newrow.insertCell(4);
var newcell5=newrow.insertCell(5);
var newcell6=newrow.insertCell(6);
var newcell7=newrow.insertCell(7);
newcell0.innerHTML='<select class="openpar"><option value="null"></option><option value="(">(</option><option value="((">((</option><option value="(((">(((</option></select>';
newcell1.innerHTML='<select class="fieldsel"><?php echo($fieldselopts); ?></select>';
newcell2.innerHTML='<select class="condsel"></select>';
newcell3.innerHTML='<select class="valuesel" style="display:none;"></select><input type="text" class="valueinp" maxlength="256" style="display:none;">';
newcell4.innerHTML='<select class="closepar"><option value="null"></option><option value=")">)</option><option value="))">))</option><option value=")))">)))</option></select>';
newcell5.innerHTML='<select class="andor"><option value="AND">E</option><option value="OR">O</option></select>';
newcell6.innerHTML='<img class="plus" src="imgs/plus.svg" title="Aggiungi un criterio sotto questo">';
newcell6.style.width='22px';
newcell7.innerHTML='<img class="minus" src="imgs/minus.svg" title="Rimuovi questo criterio">';
newcell7.style.width='22px';
if (refresh) {
synctai();
popusels(index,false);
}
}
function ordaddrow(index,refresh) {
var table=document.getElementById('planciaord');
var newrow=table.insertRow(index);
var newcell0=newrow.insertCell(0);
var newcell1=newrow.insertCell(1);
var newcell2=newrow.insertCell(2);
var newcell3=newrow.insertCell(3);
newcell0.style.width='97%';
newcell1.style.width='1%';
newcell2.style.width='1%';
newcell3.style.width='1%';
newcell0.innerHTML='<select class="ordfieldsel"><?php echo($ordfieldselopts); ?></select>';
newcell1.innerHTML='<select class="ascdesc"><option value="ASC">Crescente</option><option value="DESC">Decrescente</option></select>';
newcell2.innerHTML='<img class="plus" src="imgs/plus.svg" title="Aggiungi un criterio sotto questo">';
newcell3.innerHTML='<img class="minus" src="imgs/minus.svg" title="Rimuovi questo criterio">';
if (refresh)
synctoi();
}
function synctai() {
var i=0;
var table=document.getElementById('planciafil');
var nodes=table.querySelectorAll('.minus');
var cnodes=nodes.length;
for (i=0; i<cnodes; i++)
// +1 sempre per via della row iniziale
nodes[i].setAttribute('onclick','remrow('+(i+1)+');');
nodes=table.querySelectorAll('.plus');
for (i=0; i<cnodes; i++)
// +2 perché la devi aggiungere dopo la corrente
nodes[i].setAttribute('onclick','addrow('+(i+2)+',true);');
// da qui in poi faccio a scendere per non avere mai id e nomi duplicati
cnodes--;
nodes=table.querySelectorAll('.openpar');
for (i=cnodes; i>-1; i--) {
nodes[i].setAttribute('id','openpar-'+(i+1));
nodes[i].setAttribute('name','openpar-'+(i+1));
}
nodes=table.querySelectorAll('.fieldsel');
for (i=cnodes; i>-1; i--) {
nodes[i].setAttribute('id','fieldsel-'+(i+1));
nodes[i].setAttribute('name','fieldsel-'+(i+1));
nodes[i].setAttribute('onchange','popusels('+(i+1)+',false);');
}
nodes=table.querySelectorAll('.condsel');
for (i=cnodes; i>-1; i--) {
nodes[i].setAttribute('id','condsel-'+(i+1));
nodes[i].setAttribute('name','condsel-'+(i+1));
nodes[i].setAttribute('onchange','inpdisif('+(i+1)+');');
}
nodes=table.querySelectorAll('.valuesel');
for (i=cnodes; i>-1; i--) {
nodes[i].setAttribute('id','valuesel-'+(i+1));
nodes[i].setAttribute('name','valuesel-'+(i+1));
}
nodes=table.querySelectorAll('.valueinp');
for (i=cnodes; i>-1; i--) {
nodes[i].setAttribute('id','valueinp-'+(i+1));
nodes[i].setAttribute('name','valueinp-'+(i+1));
}
nodes=table.querySelectorAll('.closepar');
for (i=cnodes; i>-1; i--) {
nodes[i].setAttribute('id','closepar-'+(i+1));
nodes[i].setAttribute('name','closepar-'+(i+1));
}
nodes=table.querySelectorAll('.andor');
for (i=cnodes; i>-1; i--) {
nodes[i].setAttribute('id','andor-'+(i+1));
nodes[i].setAttribute('name','andor-'+(i+1));
nodes[i].disabled=false;
}
if (cnodes>=0)
nodes[cnodes].disabled=true;
}
function synctoi() {
var i=0;
var table=document.getElementById('planciaord');
var nodes=table.querySelectorAll('.minus');
var cnodes=nodes.length;
for (i=0; i<cnodes; i++)
// +1 sempre per via della row iniziale
nodes[i].setAttribute('onclick','ordremrow('+(i+1)+');');
nodes=table.querySelectorAll('.plus');
for (i=0; i<cnodes; i++)
// +2 perché la devi aggiungere dopo la corrente
nodes[i].setAttribute('onclick','ordaddrow('+(i+2)+',true);');
// da qui in poi faccio a scendere per non avere mai id e nomi duplicati
cnodes--;
nodes=table.querySelectorAll('.ordfieldsel');
for (i=cnodes; i>-1; i--) {
nodes[i].setAttribute('id','ordfieldsel-'+(i+1));
nodes[i].setAttribute('name','ordfieldsel-'+(i+1));
}
nodes=table.querySelectorAll('.ascdesc');
for (i=cnodes; i>-1; i--) {
nodes[i].setAttribute('id','ascdesc-'+(i+1));
nodes[i].setAttribute('name','ascdesc-'+(i+1));
}
}
function selind(id,val) {
var el=document.getElementById(id), i=0, found=false;
while (!found && i<el.length) {
if (el[i].value==val) {
el.selectedIndex=i;
found=true;
}
i++;
}
if (!found)
console.log('"'+val+'" non è stato trovato in "'+id+'"');
}
function setrow(index,openparv,fieldselv,condselv,valueselv,valueinpv,closeparv,andorv) {
selind('openpar-'+index,openparv);
selind('fieldsel-'+index,fieldselv);
popusels(index,valueselv);
selind('condsel-'+index,condselv);
// selind('valuesel-'+index,valueselv);
document.getElementById('valueinp-'+index).value=valueinpv;
if (condselv=='IS NULL' || condselv=='IS NOT NULL') {
document.getElementById('valueinp-'+index).disabled=true;
document.getElementById('valuesel-'+index).disabled=true;
}
selind('closepar-'+index,closeparv);
selind('andor-'+index,andorv);
}
function ordsetrow(index,ordfieldselv,ascdescv) {
selind('ordfieldsel-'+index,ordfieldselv);
selind('ascdesc-'+index,ascdescv);
}
function remrow(index) {
var table=document.getElementById('planciafil');
table.deleteRow(index);
synctai();
if (table.rows.length<2)
document.getElementById('filbut').value='Aggiungi criteri di ricerca';
}
function ordremrow(index) {
var table=document.getElementById('planciaord');
table.deleteRow(index);
synctoi();
if (table.rows.length<2)
document.getElementById('ordbut').value='Aggiungi criteri di ordinamento';
}
function truncfil() {
var table=document.getElementById('planciafil');
while (table.rows.length>1)
remrow(1);
}
function truncord() {
var table=document.getElementById('planciaord');
while (table.rows.length>1)
ordremrow(1);
}
function manfil() {
var filbut=document.getElementById('filbut');
var table=document.getElementById('planciafil');
var crows=table.rows.length;
if (crows<2) {
addrow(1,true);
filbut.value='Rimuovi tutti i criteri di ricerca';
} else {
confirma('<p>Confermi di voler rimuovere tutti i criteri di ricerca?</p>','truncfil();filbut.value=\'Aggiungi criteri di ricerca\'');
}
}
function manord() {
var ordbut=document.getElementById('ordbut');
var table=document.getElementById('planciaord');
var crows=table.rows.length;
if (crows<2) {
ordaddrow(1,true);
ordbut.value='Rimuovi tutti i criteri di ordinamento';
} else {
confirma('<p>Confermi di voler rimuovere tutti i criteri di ordinamento?</p>','truncord();ordbut.value=\'Aggiungi criteri di ordinamento\'');
}
}
function ckpar() {
var i=0;
var table=document.getElementById('planciafil');
var nodes=table.querySelectorAll('.openpar');
var cnodes=nodes.length;
var opars=[];
var cpars=[];
for (i=0; i<cnodes; i++)
opars.push(nodes[i].value);
nodes=table.querySelectorAll('.closepar');
for (i=0; i<cnodes; i++)
cpars.push(nodes[i].value);
var spars='';
for (i=0; i<cnodes; i++) {
if (opars[i]!='null') spars+=opars[i];
if (cpars[i]!='null') spars+=cpars[i];
}
var opq=0, cpq=0, ok=true;
for (i=0; i<spars.length; i++) {
if (spars[i]=='(') {
opq++;
} else if (spars[i]==')') {
cpq++;
}
if (cpq>opq)
break;
}
if (opq!=cpq)
ok=false;
console.log(i+'/'+spars.length+': '+ok);
return ok;
}
function ckf() {
var emsg='';
if (!ckpar()) emsg+='Qualcosa non va con le parentesi!<br>\n';
// emsg+='Comunque NO!<br>\n';
if (emsg=='') {
var table=document.getElementById('planciafil');
var crows=table.rows.length;
if (crows>1)
document.getElementById('andor-'+(crows-1)).disabled=false;
document.getElementById('f').submit();
} else {
alerta('<p>'+emsg+'</p>');
}
}
function pupwait(on) {
var pup=document.getElementById('popup'), inpup=document.getElementById('inpopup');
if (on) {
if (pup.style.display!='table') {
inpup.innerHTML='<div class="waitbub"><img src="imgs/loading.gif"><br>&nbsp;<br>Caricamento in corso...</div>';
pup.style.display='table';
} else {
console.log('Sto già aspettando...');
}
} else {
inpup.innerHTML='<div id="popupcont">...</div>';
pup.style.display='none';
}
}
//function setrow(index,openparv,fieldselv,condselv,valueselv,valueinpv,closeparv,andorv)
function loadpres() {
let pres=document.getElementById('presets');
if (pres.value!='null') {
pupwait(true);
let formdata=new FormData();
formdata.append('act','load');
formdata.append('pid',pres.value);
let xhr=new XMLHttpRequest();
xhr.open('POST','loadsavepres.php');
xhr.responseType='json';
xhr.send(formdata);
xhr.onload=function() {
let jarr=xhr.response;
truncfil();
for (i=0; i<jarr['f'].length; i++) {
console.log(jarr['f'][i]);
addrow(i+1,false);
}
synctai();
for (i=0; i<jarr['f'].length; i++) {
setrow(i+1, jarr['f'][i]['OpenPar'], jarr['f'][i]['Field'], jarr['f'][i]['Cond'], jarr['f'][i]['ValueSel'], jarr['f'][i]['ValueInp'], jarr['f'][i]['ClosePar'], jarr['f'][i]['AndOr']);
}
if (jarr['f'].length>0)
document.getElementById('filbut').value='Rimuovi tutti i criteri di ricerca';
truncord();
for (i=0; i<jarr['o'].length; i++) {
console.log(jarr['o'][i]);
ordaddrow(i+1,false);
}
synctoi();
for (i=0; i<jarr['o'].length; i++) {
ordsetrow(i+1, jarr['o'][i]['Field'], jarr['o'][i]['Sort']);
}
if (jarr['o'].length>0)
document.getElementById('ordbut').value='Rimuovi tutti i criteri di ordinamento';
pupwait(false);
};
xhr.onerror=function() {
pupwait(false);
alert('La richiesta è fallita.');
};
} else {
alerta('<p>Non hai selezionato alcun preset ;)</p>');
}
}
function savepres(txt,asnew) {
pupwait(true);
let pres=document.getElementById('presets');
let formdata=new FormData(document.forms.f);
formdata.append('act','save');
formdata.append('txt',txt);
if (!asnew)
formdata.append('pid',pres.value);
let xhr=new XMLHttpRequest();
xhr.open('POST','loadsavepres.php');
xhr.responseType='json';
xhr.send(formdata);
xhr.onload=function() {
console.log(xhr.response);
if (!asnew) {
pres.options[pres.selectedIndex].text=txt;
} else {
let jarr=xhr.response;
pres.add(new Option(txt,jarr['pid']));
pres.selectedIndex=pres.options.length-1;
}
pupwait(false);
};
xhr.onerror=function() {
pupwait(false);
alert('La richiesta è fallita.');
};
}
function pupsavepres(asnew) {
var pres=document.getElementById('presets');
if (pres.value!='null' || asnew) {
var pup=document.getElementById('popup'), inpup=document.getElementById('inpopup');
var prestext=pres.options[pres.selectedIndex].text;
var pre='<p>Se vuoi puoi modificare il nome del preset che stai per sovrascrivere</p>';
if (asnew) pre='<p>Dai un nuovo nome al nuovo preset che stai per salvare</p>';
inpup.innerHTML='<div class="loadsavepresbub">'+pre+'<input type="text" maxlength="256" value="'+prestext.replace(/"/g,'&quot;')+'" id="presname"><input type="button" value="Salva" onClick="ckpresname('+asnew+');"><input type="button" value="Annulla" onClick="pupoff();"><div id="ckmsg"></div></div>';
pup.style.display='table';
} else {
alerta('<p>Non hai selezionato alcun preset ;)</p>');
}
}
function ckpresname(asnew) {
var pres=document.getElementById('presets');
var presname=document.getElementById('presname').value;
var ckmsg=document.getElementById('ckmsg');
var ok=true;
var i;
if (presname.trim=='') {
presname='';
ok=false;
ckmsg.innerHTML='Non puoi salvare un preset senza nome';
}
if (!asnew) {
for (i=0; i<pres.options.length; i++) {
if (i!=pres.selectedIndex && presname==pres.options[i].text) {
ok=false;
ckmsg.innerHTML='<p>Esiste già un altro preset con questo nome</p>';
break;
}
}
} else {
for (i=0; i<pres.options.length; i++) {
if (presname==pres.options[i].text) {
ok=false;
ckmsg.innerHTML='<p>Esiste già un preset con questo nome</p>';
break;
}
}
}
if (ok) {
pupoff();
savepres(presname,asnew);
}
}
function pupoff() {
var pup=document.getElementById('popup'), inpup=document.getElementById('inpopup');
inpup.innerHTML='<div id="popupcont">...</div>';
pup.style.display='none';
}
//-->
</script>
</head>
<body>
<nav>
<div id="hmenu">
<ul>
<?php echo($menuout); ?>
</ul>
<div id="rightdiv">
<div id="plctrl" class="rlinks" onclick="shideplancia();">Mostra plancia</div>
<div id="logout" class="rlinks"><a href="logout.php">Esci</a></div>
</div>
</nav>
<div id="popup">
<div id="inpopup">
<div id="popupcont">
...
</div>
</div>
</div>
<!--
<div id="footer">
<form action="edinst.php" name="addinst" method="post">
<table><tr><td>Aggiungi unistanza:</td><td><input type="text" name="URI" maxlength="512"></td><td><input type="button" value="Vai" onClick="ckaif();"></td></tr></table>
</form>
</div>
-->
<div id="debug">
<?php echo($dbg); ?>
</div>
<div id="plancia">
<form method="post" id="f" onsubmit="ckf();">
<table id="planciafil" class="planciatab">
<tr><td colspan="8"><input type="button" id="filbut" value="Aggiungi criteri di ricerca" class="ctrlbut" onclick="manfil();"></td></tr>
</table>
<table id="planciaord" class="planciatab">
<tr><td colspan="4"><input type="button" id="ordbut" value="Aggiungi criteri di ordinamento" class="ctrlbut" onclick="manord();"></td></tr>
</table>
<table class="planciatab"><tr><td style="width:1%">Preset: </td><td style="width:95%"><select name="presets" id="presets" class="presets"><?php echo($presopts); ?></select></td><td style="width:1%"><img src="imgs/carica.svg" class="lilbut" onclick="loadpres();" title="Carica i criteri dal preset selezionato"></td><td style="width:1%"><img src="imgs/salva.svg" class="lilbut" onclick="pupsavepres(false);" title="Salva i criteri impostati nel preset selezionato sovrascrivendolo"></td><td style="width:1%"><img src="imgs/salvacome.svg" class="lilbut" onclick="pupsavepres(true);" title="Salva i criteri impostati come nuovo preset ..."></td><td style="width:1%"><img src="imgs/minus.svg" class="lilbut" onclick="rempres();" title="Elimina il preset selezionato"></td></tr></table>
<table id="planciaothers" class="planciatab">
<tr><td><input type="button" id="subbut" value="Applica" class="ctrlbut" onclick="ckf();"></td></tr>
</table>
</form>
</div>
<script language="JavaScript">
<!--
<?php
echo($jsaddrows);
echo($jssetrows);
echo($jsordaddrows);
echo($jsordsetrows);
?>
//-->
</script>
<div id="fullscreen">
<div id="middlerow">
<?php echo($out); ?>
</div>
</div>
</body>
</html>