instances.php 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716
  1. <?php
  2. require('include/glob.php');
  3. require('include/muoribene.php');
  4. require('include/sessionstart.php');
  5. require('include/menu.php');
  6. $menu['istanze']['href']=null;
  7. $menu['istanze']['selected']=true;
  8. buildmenu($menu);
  9. require('include/myconn.php');
  10. $dbg='';
  11. use function mysqli_real_escape_string as myesc;
  12. // praticamente una macro
  13. function hspech($str) {
  14. return(htmlspecialchars($str,ENT_QUOTES|ENT_HTML5,'UTF-8'));
  15. }
  16. function nully($val,$fem,$filter,$ntext=null) {
  17. if (!is_null($val)) {
  18. if ($filter=='strip') {
  19. return(strip_tags($val,'<a><br><ol><ul><li><p><i><b><strong><em><small>'));
  20. } elseif ($filter=='htmlchars') {
  21. return(hspech($val));
  22. } elseif ($filter=='timestamp') {
  23. return(strftime('%a %d %b %Y, %T',$val));
  24. } elseif ($filter=='email') {
  25. return('<a href="mailto:'.strip_tags($val).'">'.strip_tags($val).'</a>');
  26. } elseif ($filter=='url') {
  27. return('<a href="'.strip_tags($val).'" target="_blank">'.strip_tags($val).'</a>');
  28. } elseif ($filter=='image') {
  29. return('<img src="'.str_replace('"','\\"',strip_tags($val)).'">');
  30. } elseif ($filter=='boolt') {
  31. if ($val)
  32. return('<span class="good">Si</span>');
  33. else
  34. return('<span class="bad">No</span>');
  35. } elseif ($filter=='boolf') {
  36. if ($val)
  37. return('<span class="bad">Si</span>');
  38. else
  39. return('<span class="good">No</span>');
  40. } else {
  41. return($val);
  42. }
  43. } else {
  44. if (is_null($ntext)) {
  45. if ($fem)
  46. return('<span class="nully">Non definita</span>');
  47. else
  48. return('<span class="nully">Non definito</span>');
  49. }
  50. else {
  51. return('<span class="nully">'.$ntext.'</span>');
  52. }
  53. }
  54. }
  55. function booly($pre,$val,$nottoobad=false,$invcol=false) {
  56. if ($val) {
  57. if (!$invcol) {
  58. $p='<p class="good">';
  59. } else {
  60. if (!$nottoobad) {
  61. $p='<p class="bad">';
  62. } else {
  63. $p='<p class="neut">';
  64. }
  65. }
  66. return($p.$pre.'SI</p>');
  67. } else {
  68. if (!$invcol) {
  69. if (!$nottoobad) {
  70. $p='<p class="bad">';
  71. } else {
  72. $p='<p class="neut">';
  73. }
  74. } else {
  75. $p='<p class="good">';
  76. }
  77. return($p.$pre.'NO</p>');
  78. }
  79. }
  80. $dbg.='<pre>'.print_r($_POST,1).'</pre>';
  81. $cols=array(
  82. 'New'=>array('name'=>'Nuova','type'=>'bool'),
  83. 'Good'=>array('name'=>'Papabile','type'=>'bool'),
  84. 'Chosen'=>array('name'=>'Scelta','type'=>'bool'),
  85. 'Visible'=>array('name'=>'Visibile','type'=>'bool'),
  86. 'Blacklisted'=>array('name'=>'Blacklistata','type'=>'bool'),
  87. 'URI'=>array('name'=>'URI','type'=>'text'),
  88. 'Title'=>array('name'=>'Titolo','type'=>'text'),
  89. 'ShortDesc'=>array('name'=>'Descrizione breve','type'=>'text'),
  90. 'LongDesc'=>array('name'=>'Descrizione lunga','type'=>'text'),
  91. 'OurDesc'=>array('name'=>'Descrizione nostra','type'=>'text'),
  92. 'PlaceID'=>array('name'=>'[Località]','type'=>'join','join'=>array()),
  93. 'Places.Locality'=>array('name'=>'Località','type'=>'joini','join'=>array('Places ON Places.ID=Instances.PlaceID'),'subtype'=>'text'),
  94. 'Email'=>array('name'=>'Email di contatto','type'=>'text'),
  95. 'Software'=>array('name'=>'Software','type'=>'text'),
  96. 'Version'=>array('name'=>'Versione','type'=>'text'),
  97. 'UserCount'=>array('name'=>'Utenti','type'=>'int'),
  98. 'StatusCount'=>array('name'=>'Stati','type'=>'int'),
  99. 'DomainCount'=>array('name'=>'Istanze note','type'=>'int'),
  100. 'ActiveUsersMonth'=>array('name'=>'Utenti attivi (mese)','type'=>'int'),
  101. 'ActiveUsersHalfYear'=>array('name'=>'Utenti attivi (6 mesi)','type'=>'int'),
  102. 'Thumb'=>array('name'=>'Logo','type'=>'text'),
  103. 'RegOpen'=>array('name'=>'Registrazioni aperte','type'=>'bool'),
  104. 'RegReqApproval'=>array('name'=>'Approvazione registrazioni','type'=>'bool'),
  105. 'MaxTootChars'=>array('name'=>'Limite caratteri','type'=>'int'),
  106. 'AdmAccount'=>array('name'=>'Account admin','type'=>'text'),
  107. 'AdmDisplayName'=>array('name'=>'Nome account admin','type'=>'text'),
  108. 'AdmCreatedAt'=>array('name'=>'Data creazione account admin','type'=>'time'),
  109. 'AdmURL'=>array('name'=>'Pagina dell’admin','type'=>'text'),
  110. 'AdmAvatar'=>array('name'=>'Avatar admin','type'=>'text'),
  111. 'AdmNote'=>array('name'=>'Note dell’admin','type'=>'text'),
  112. 'LangID'=>array('name'=>'[Lingue dichiarate]','type'=>'join','join'=>array('InstLangs ON InstLangs.InstID=Instances.ID')),
  113. 'Languages.Code'=>array('name'=>'Lingue dichiarate','type'=>'joini','join'=>array('InstLangs ON InstLangs.InstID=Instances.ID','Languages ON Languages.ID=InstLangs.LangID'),'subtype'=>'text'),
  114. 'OurLangID'=>array('name'=>'[Lingue impostate da noi]','type'=>'join','join'=>array('InstOurLangs ON InstOurLangs.InstID=Instances.ID')),
  115. 'OurLanguages.Code'=>array('name'=>'Lingue impostate da noi','type'=>'joini','join'=>array('InstOurLangs ON InstOurLangs.InstID=Instances.ID','Languages AS OurLanguages ON OurLanguages.ID=InstOurLangs.OurLangID'),'subtype'=>'text'),
  116. 'FinID'=>array('name'=>'[Modalità di finanziamento]','type'=>'join','join'=>array('InstFinancing ON InstFinancing.InstID=Instnces.ID')),
  117. 'Financing.Type'=>array('name'=>'Modalità di finanziamento','type'=>'joini','join'=>array('InstFinancing ON InstFinancing.InstID=Instnces.ID','Financing ON Financing.ID=InstFinancing.FinID'),'subtype'=>'text'),
  118. 'PolID'=>array('name'=>'[Restrizioni sui contenuti]','type'=>'join','join'=>array('InstPolicies ON InstPolicies.InstID=Instances.ID')),
  119. 'Policies.Name'=>array('name'=>'Restrizioni sui contenuti','type'=>'joini','join'=>array('InstPolicies ON InstPolicies.InstID=Instances.ID','Policies ON Policies.ID=InstPolicies.PolID'),'subtype'=>'text'),
  120. 'TagID'=>array('name'=>'[Tags]','type'=>'join','join'=>array('InstTags ON InstTags.InstID=Instances.ID')),
  121. 'Tags.Name'=>array('name'=>'Tags','type'=>'join','joini'=>array('InstTags ON InstTags.InstID=Instances.ID','Tags ON Tags.ID=InstTags.TagID'),'subtype'=>'text'),
  122. 'Statuses'=>array('name'=>'Stati ultima settimana','type'=>'int','join'=>'LEFT JOIN InstActivity ON InstActivity.InstID=Instances.ID','select'=>'MAX(Week) AS maxweek'),
  123. 'Logins'=>array('name'=>'Logins ultima settimana','type'=>'int','join'=>'LEFT JOIN InstActivity ON InstActivity.InstID=Instances.ID','select'=>'MAX(Week) AS maxweek'),
  124. 'Registrations'=>array('name'=>'Registrazioni ultima settimana','type'=>'int','join'=>'LEFT JOIN InstActivity ON InstActivity.InstID=Instances.ID','select'=>'MAX(Week) AS maxweek'),
  125. );
  126. $types=array('bool','int','time','text','join','joini');
  127. $fieldselopts='';
  128. foreach ($cols as $key=>$val) {
  129. if ($val['type']=='joini') {
  130. $fieldselopts.='<option value="'.$key.'§'.$val['type'].'§'.$val['subtype'].'">'.$val['name'].'</option>';
  131. } else {
  132. $fieldselopts.='<option value="'.$key.'§'.$val['type'].'§null">'.$val['name'].'</option>';
  133. }
  134. }
  135. /*
  136. [openpar-1] => null
  137. [fieldsel-1] => New§bool
  138. [condsel-1] => IS
  139. [valuesel-1] => TRUE
  140. [closepar-1] => null
  141. [andor-1] => AND
  142. [openpar-2] => (
  143. [fieldsel-2] => URI§text
  144. [condsel-2] => LIKE
  145. [valueinp-2] => bida
  146. [closepar-2] => null
  147. [andor-2] => OR
  148. [openpar-3] => null
  149. [fieldsel-3] => URI§text
  150. [condsel-3] => IS NULL
  151. [closepar-3] => )
  152. [andor-3] => AND
  153. [openpar-4] => null
  154. [fieldsel-4] => PlaceID§join
  155. [condsel-4] => =
  156. [valuesel-4] => 1
  157. [closepar-4] => null
  158. [andor-4] => AND
  159. [openpar-5] => null
  160. [fieldsel-5] => UserCount§int
  161. [condsel-5] => >=
  162. [valueinp-5] => 123
  163. [closepar-5] => null
  164. [andor-5] => AND
  165. [openpar-6] => null
  166. [fieldsel-6] => LangID§join
  167. [condsel-6] => =
  168. [valuesel-6] => 20
  169. [closepar-6] => null
  170. */
  171. $joins=array();
  172. $where='';
  173. foreach ($_POST as $key=>$val) {
  174. if (preg_match('/^openpar-\d+/',$key)===1 && preg_match('/^\(+$/',$val)===1)
  175. $where.=$val;
  176. if (preg_match('/^fieldsel-\d+/',$key)===1 && preg_match('/^(.+)§(.+)§(.+)$/',$val,$buf)===1) {
  177. if (array_key_exists($buf[1],$cols) && in_array($buf[2],$types)) {
  178. $where.=$buf[1];
  179. if ($buf[2]=='join' || $buf[2]=='joini') {
  180. foreach ($cols[$buf[1]]['join'] as $join) {
  181. if (!in_array($join,$joins))
  182. $joins[]=$join;
  183. }
  184. }
  185. } else {
  186. muoribene($dbg.'<br>Dati POST corrotti.<br>Puoi <a href="instances.php">riprovare</a> o <a href="index.php">tornare al login</a>.',true);
  187. }
  188. }
  189. if (preg_match('/^condsel-\d+/',$key)===1) {
  190. $where.=' '.$val.' ';
  191. $cond=$val;
  192. }
  193. if (preg_match('/^valuesel-\d+/',$key)===1)
  194. $where.=$val;
  195. if (preg_match('/^valueinp-\d+/',$key)===1) {
  196. if (preg_match('/^(LIKE|NOT LIKE)$/',$cond)===1)
  197. $where.='\'%'.myesc($link,$val).'%\'';
  198. else
  199. $where.='\''.myesc($link,$val).'\'';
  200. }
  201. if (preg_match('/^closepar-\d+/',$key)===1 && preg_match('/^\)+$/',$val)===1)
  202. $where.=$val;
  203. if (preg_match('/^andor-\d+/',$key)===1 && preg_match('/^(AND|OR)$/',$val)===1)
  204. $where.=' '.$val.' ';
  205. }
  206. if ($where!='')
  207. $where='WHERE '.$where;
  208. if (count($joins)>0)
  209. $joins='LEFT JOIN '.implode(' LEFT JOIN ',$joins);
  210. else
  211. $joins='';
  212. $query='SELECT *, Instances.ID AS IID FROM Instances '.$joins.' '.$where.' GROUP BY IID ORDER BY Instances.URI ASC LIMIT 50';
  213. $dbg.='QUERONA: '.$query.'<br>'.N;
  214. $res=mysqli_query($link,$query)
  215. or muoribene($dbg.'<br>'.$query.': '.mysqli_error($link),true);
  216. if (mysqli_num_rows($res)<1) {
  217. $out='<p>Nessuna istanza da mostrare.</p>'.N;
  218. } else {
  219. $out='';
  220. while ($row=mysqli_fetch_assoc($res)) {
  221. $out.='<table class="bigtab">'.N;
  222. // $out.='<thead><tr><th class="tdattr">Attributi</th><th>Info</th></thead>'.N;
  223. $out.='<tbody>'.N;
  224. $out.='<tr><td colspan="2" class="insthead">'.$row['URI'].' {'.$row['IID'].'}</td></tr>'.N;
  225. $attr=booly($cols['Blacklisted']['name'].': ',$row['Blacklisted'],false,true).N;
  226. $attr.=booly($cols['New']['name'].': ',$row['New'],true).N;
  227. $attr.=booly($cols['Good']['name'].': ',$row['Good']).N;
  228. $attr.=booly($cols['Chosen']['name'].': ',$row['Chosen']).N;
  229. $attr.=booly($cols['Visible']['name'].': ',$row['Visible']).N;
  230. /* $attr.=booly($cols['RegOpen']['name'].': ',$row['RegOpen']).N;
  231. $attr.=booly($cols['RegReqApproval']['name'].': ',$row['RegReqApproval'],true,true).N;*/
  232. $sres=mysqli_query($link,'SELECT * FROM InstChecks WHERE InstID='.$row['IID'].' ORDER BY Time DESC')
  233. or muoribene(mysqli_error($link),true);
  234. $csres=mysqli_num_rows($sres);
  235. if ($csres>0) {
  236. $bene=0;
  237. while ($srow=mysqli_fetch_assoc($sres)) {
  238. if ($srow['Status']==1)
  239. $bene++;
  240. }
  241. $width=str_replace(',','.',100/$csres*$bene);
  242. $attr.='<div class="colsectheader">Percentuale di risposta ai nostri check: '.round($width,1).'%</div>';
  243. $attr.='<div class="percbg"><div class="percfg" style="width:'.$width.'%;"></div></div>'.N;
  244. mysqli_data_seek($sres,0);
  245. $srow=mysqli_fetch_assoc($sres);
  246. $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>';
  247. } else {
  248. $attr.='<div class="colsectheader">Percentuale di risposta ai nostri check</div>';
  249. $attr.='<div class="colsectcont nully">Non disponibile (?!?!?!)</div>'.N;
  250. }
  251. $attr.='<div class="colsectheader">Attività delle ultime 12 settimane</div>'.N;
  252. $sres=mysqli_query($link,'SELECT SUM(Statuses) AS tstatuses, SUM(Logins) AS tlogins, SUM(Registrations) AS tregs FROM InstActivity WHERE InstID='.$row['IID'])
  253. or muoribene(mysqli_error($link),true);
  254. $tot=mysqli_fetch_assoc($sres);
  255. $sres=mysqli_query($link,'SELECT * FROM InstActivity WHERE InstID='.$row['IID'].' ORDER BY Week DESC')
  256. or muoribene(mysqli_error($link),true);
  257. if (mysqli_num_rows($sres)>0) {
  258. $attr.='<div class="colsectcont">Stati: '.$tot['tstatuses'].'<br>Accessi: '.$tot['tlogins'].'<br>Registrazioni: '.$tot['tregs'].'</div>'.N;
  259. while ($srow=mysqli_fetch_assoc($sres)) {
  260. $attr.='<div class="colsectcontb">'.strftime('%e %b %Y',$srow['Week']).'</div>'.N;
  261. ($tot['tstatuses']==0) ? $width=0 : $width=str_replace(',','.',100/$tot['tstatuses']*$srow['Statuses']);
  262. $attr.='<div class="percstatuses" style="width:'.$width.'%;">'.$srow['Statuses'].'&nbsp;stati</div>'.N;
  263. ($tot['tlogins']==0) ? $width=0 : $width=str_replace(',','.',100/$tot['tlogins']*$srow['Logins']);
  264. $attr.='<div class="perclogins" style="width:'.$width.'%;">'.$srow['Logins'].'&nbsp;accessi</div>'.N;
  265. ($tot['tregs']==0) ? $width=0 : $width=str_replace(',','.',100/$tot['tregs']*$srow['Registrations']);
  266. $attr.='<div class="percregs" style="width:'.$width.'%;">'.$srow['Registrations'].'&nbsp;registrazioni</div>'.N;
  267. }
  268. } else {
  269. $attr.='<div class="colsectcont nully">Non disponibile</div>'.N;
  270. }
  271. $attr.='<div class="colsectheader">Hashtags più usati durante l’ultima settimana</div>'.N;
  272. $sres=mysqli_query($link,'SELECT * FROM InstTrends WHERE InstID='.$row['IID'].' ORDER BY Pos ASC')
  273. or muoribene(mysqli_error($link),true);
  274. if (mysqli_num_rows($sres)>0) {
  275. $attr.='<div class="colsectcont"><ol>'.N;
  276. while ($srow=mysqli_fetch_assoc($sres)) {
  277. $attr.='<li><a href="'.$srow['URL'].'">'.hspech($srow['Name']).'</a></li>'.N;
  278. }
  279. $attr.='</ol></div>'.N;
  280. } else {
  281. $attr.='<div class="colsectcont nully">Non disponibili</div>'.N;
  282. }
  283. $out.='<tr><td class="tdattr">'.$attr.'</td><td>'.N;
  284. $out.='<div class="baloo"><span class="field">'.$cols['URI']['name'].':</span> <a href="https://'.$row['URI'].'" target="_blank">'.$row['URI'].'</a></div>'.N;
  285. $out.='<div class="baloo"><span class="field">'.$cols['Title']['name'].':</span> '.nully($row['Title'],false,'strip').'</div>'.N;
  286. $out.='<div class="baloo"><span class="field">'.$cols['Thumb']['name'].':</span> '.nully($row['Thumb'],true,'image').'</div>'.N;
  287. $out.='<div class="baloo"><span class="field">'.$cols['ShortDesc']['name'].':</span> '.nully($row['ShortDesc'],true,'strip').'</div>'.N;
  288. $out.='<div class="baloo"><span class="field">'.$cols['LongDesc']['name'].':</span> '.nully($row['LongDesc'],true,'strip').'</div>'.N;
  289. // 'strip' o 'htmlent' per la descrizione nostra?
  290. $out.='<div class="baloo"><span class="ourfield">'.$cols['OurDesc']['name'].':</span> '.nully($row['OurDesc'],true,'strip').'</div>'.N;
  291. $out.='<div class="baloo"><span class="ourfield">'.$cols['PlaceID']['name'].':</span> '.nully($row['PlaceID'],true,'strip').'</div>'.N;
  292. $sres=mysqli_query($link,'SELECT * FROM InstLangs LEFT JOIN Languages ON Languages.ID=LangID WHERE InstID='.$row['IID'].' ORDER BY Pos ASC')
  293. or muoribene(mysqli_error($link),true);
  294. if (mysqli_num_rows($sres)>0) {
  295. $i=0;
  296. $buf=array();
  297. while ($srow=mysqli_fetch_assoc($sres)) {
  298. $i++;
  299. $buf[]=$i.': '.hspech($srow['Code'].' ['.ucfirst(locale_get_display_name($srow['Code'])).']');
  300. }
  301. $out.='<div class="baloo"><span class="field">'.$cols['LangID']['name'].':</span> '.implode('; ',$buf).'</div>'.N;
  302. } else {
  303. $out.='<div class="baloo"><span class="field">'.$cols['LangID']['name'].':</span> <span class="nully">Non definite</span></div>'.N;
  304. }
  305. $sres=mysqli_query($link,'SELECT * FROM InstOurLangs LEFT JOIN Languages ON Languages.ID=OurLangID WHERE InstID='.$row['IID'].' ORDER BY Pos ASC')
  306. or muoribene(mysqli_error($link),true);
  307. if (mysqli_num_rows($sres)>0) {
  308. $i=0;
  309. $buf=array();
  310. while ($srow=mysqli_fetch_assoc($sres)) {
  311. $i++;
  312. $buf[]=$i.': '.hspech($srow['Code'].' ['.ucfirst(locale_get_display_name($srow['Code'],'it')).']');
  313. }
  314. $out.='<div class="baloo"><span class="ourfield">'.$cols['OurLangID']['name'].':</span> '.implode('; ',$buf).'</div>'.N;
  315. } else {
  316. $out.='<div class="baloo"><span class="ourfield">'.$cols['OurLangID']['name'].':</span> <span class="nully">Non definite</span></div>'.N;
  317. }
  318. $sres=mysqli_query($link,'SELECT * FROM InstFinancing LEFT JOIN Financing ON Financing.ID=FinID WHERE InstID='.$row['IID'].' ORDER BY Pos ASC')
  319. or muoribene(mysqli_error($link),true);
  320. if (mysqli_num_rows($sres)>0) {
  321. $i=0;
  322. $buf=array();
  323. while ($srow=mysqli_fetch_assoc($sres)) {
  324. $i++;
  325. $buf[]=$i.': '.hspech($srow['Type']).' ('.hspech($row['Details']).')';
  326. }
  327. $out.='<div class="baloo"><span class="ourfield">'.$cols['FinID']['name'].':</span> '.implode('; ',$buf).'</div>'.N;
  328. } else {
  329. $out.='<div class="baloo"><span class="ourfield">'.$cols['FinID']['name'].':</span> <span class="nully">Non definite</span></div>'.N;
  330. }
  331. $sres=mysqli_query($link,'SELECT * FROM InstPolicies LEFT JOIN Policies ON Policies.ID=PolID WHERE InstID='.$row['IID'].' ORDER BY Pos ASC')
  332. or muoribene(mysqli_error($link),true);
  333. if (mysqli_num_rows($sres)>0) {
  334. $i=0;
  335. $buf=array();
  336. while ($srow=mysqli_fetch_assoc($sres)) {
  337. $i++;
  338. $buf[]=$i.': '.hspech($srow['Name']);
  339. }
  340. $out.='<div class="baloo"><span class="ourfield">'.$cols['PolID']['name'].':</span> '.implode('; ',$buf).'</div>'.N;
  341. } else {
  342. $out.='<div class="baloo"><span class="ourfield">'.$cols['PolID']['name'].':</span> <span class="nully">Non definite</span></div>'.N;
  343. }
  344. $sres=mysqli_query($link,'SELECT * FROM InstTags LEFT JOIN Tags ON Tags.ID=TagID WHERE InstID='.$row['IID'].' ORDER BY Pos ASC')
  345. or muoribene(mysqli_error($link),true);
  346. if (mysqli_num_rows($sres)>0) {
  347. $i=0;
  348. $buf=array();
  349. while ($srow=mysqli_fetch_assoc($sres)) {
  350. $i++;
  351. $buf[]=$i.': '.hspech($srow['Name']);
  352. }
  353. $out.='<div class="baloo"><span class="ourfield">'.$cols['TagID']['name'].':</span> '.implode('; ',$buf).'</div>'.N;
  354. } else {
  355. $out.='<div class="baloo"><span class="ourfield">'.$cols['TagID']['name'].':</span> <span class="nully">Non definite</span></div>'.N;
  356. }
  357. $out.='<div class="baloo"><span class="field">'.$cols['Email']['name'].':</span> '.nully($row['Email'],true,'email').'</div>'.N;
  358. $out.='<div class="baloo"><span class="field">'.$cols['Software']['name'].':</span> '.nully($row['Software'],false,'strip').'</div>'.N;
  359. $out.='<div class="baloo"><span class="field">'.$cols['Version']['name'].':</span> '.nully($row['Version'],true,'strip').'</div>'.N;
  360. $out.='<div class="baloo"><span class="field">'.$cols['UserCount']['name'].':</span> '.nully($row['UserCount'],false,'strip').'</div>'.N;
  361. $out.='<div class="baloo"><span class="field">'.$cols['StatusCount']['name'].':</span> '.nully($row['StatusCount'],false,'strip').'</div>'.N;
  362. $out.='<div class="baloo"><span class="field">'.$cols['DomainCount']['name'].':</span> '.nully($row['DomainCount'],false,'strip').'</div>'.N;
  363. $out.='<div class="baloo"><span class="field">'.$cols['ActiveUsersMonth']['name'].':</span> '.nully($row['ActiveUsersMonth'],false,'strip').'</div>'.N;
  364. $out.='<div class="baloo"><span class="field">'.$cols['ActiveUsersHalfYear']['name'].':</span> '.nully($row['ActiveUsersHalfYear'],false,'strip').'</div>'.N;
  365. $out.='<div class="baloo"><span class="field">'.$cols['RegOpen']['name'].':</span> '.nully($row['RegOpen'],false,'boolt').'</div>'.N;
  366. $out.='<div class="baloo"><span class="field">'.$cols['RegReqApproval']['name'].':</span> '.nully($row['RegReqApproval'],false,'boolf').'</div>'.N;
  367. $out.='<div class="baloo"><span class="field">'.$cols['MaxTootChars']['name'].':</span> '.nully($row['MaxTootChars'],false,'strip','500').'</div>'.N;
  368. $out.='<div class="baloo"><span class="field">'.$cols['AdmAccount']['name'].':</span> '.nully($row['AdmAccount'],false,'strip').'</div>'.N;
  369. $out.='<div class="baloo"><span class="field">'.$cols['AdmDisplayName']['name'].':</span> '.nully($row['AdmDisplayName'],false,'strip').'</div>'.N;
  370. $out.='<div class="baloo"><span class="field">'.$cols['AdmCreatedAt']['name'].':</span> '.nully($row['AdmCreatedAt'],true,'timestamp').'</div>'.N;
  371. $out.='<div class="baloo"><span class="field">'.$cols['AdmURL']['name'].':</span> '.nully($row['AdmURL'],true,'url').'</div>'.N;
  372. $out.='<div class="baloo"><span class="field">'.$cols['AdmAvatar']['name'].':</span> '.nully($row['AdmAvatar'],false,'image').'</div>'.N;
  373. $out.='<div><span class="field">'.$cols['AdmNote']['name'].':</span> '.nully($row['AdmNote'],false,'strip').'</div>'.N;
  374. $out.='</td></tr>'.N;
  375. $out.='</tbody>'.N;
  376. $out.='</table>'.N;
  377. }
  378. $out.='<div class="bigtabfoot"></div>';
  379. }
  380. mysqli_close($link);
  381. ?>
  382. <!DOCTYPE HTML>
  383. <html lang="it">
  384. <head>
  385. <title>Mastodon Startpage Admin - Istanze</title>
  386. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  387. <meta name="description" content="Admin pages for Mastodon Startpage">
  388. <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
  389. <link rel="icon" type="image/png" href="imgs/icona-32.png" sizes="32x32">
  390. <link rel="icon" type="image/png" href="imgs/icona-192.png" sizes="192x192">
  391. <link rel="icon" type="image/png" href="imgs/icona-512.png" sizes="512x512">
  392. <link rel="apple-touch-icon-precomposed" href="imgs/icona-180.png">
  393. <script language="JavaScript" src="js/confirma.js?v=<?php echo($cjrand); ?>"></script>
  394. <link rel="stylesheet" type="text/css" href="theme.css?v=<?php echo($cjrand); ?>">
  395. <script language="JavaScript">
  396. <!--
  397. function chulsh(el,sh) {
  398. if (sh)
  399. el.querySelector('ul').style='display:block';
  400. else
  401. el.querySelector('ul').style='display:none';
  402. }
  403. function ulsh(el,sh) {
  404. if (sh)
  405. el.style='display:block';
  406. else
  407. el.style='display:none';
  408. }
  409. function golang(lang) {
  410. var loc=document.location.href;
  411. loc=loc.replace(/#.*$/,'');
  412. loc=loc.replace(/\/$/,'');
  413. if (document.documentElement.lang=='en') {
  414. if (lang!='en')
  415. document.location.href=loc+'/'+lang;
  416. } else {
  417. if (lang!='en')
  418. document.location.href=loc.substr(0,loc.length-3)+'/'+lang;
  419. else
  420. document.location.href=loc.substr(0,loc.length-3);
  421. }
  422. }
  423. function shideplancia() {
  424. var plancia=document.getElementById('plancia');
  425. var rightdiv=document.getElementById('rightdiv');
  426. if (plancia.style.display=='block') {
  427. plancia.style.display='none';
  428. rightdiv.innerHTML='Mostra plancia';
  429. } else {
  430. plancia.style.display='block';
  431. rightdiv.innerHTML='Nascondi plancia';
  432. }
  433. }
  434. function truncsel(el) {
  435. var sel=document.getElementById(el), len=sel.length, i=0;
  436. for (i=len-1; i>=0; i--)
  437. sel.remove(i);
  438. }
  439. function addselopt(el,val,txt) {
  440. option=new Option(txt,val);
  441. el.add(option);
  442. }
  443. function inpdisif(index) {
  444. var source=document.getElementById('condsel-'+index);
  445. var dest1=document.getElementById('valueinp-'+index);
  446. var dest2=document.getElementById('valuesel-'+index);
  447. var conds=['IS NULL','IS NOT NULL'];
  448. if (conds.includes(source.value)) {
  449. dest1.disabled=true;
  450. dest2.disabled=true;
  451. // dest.style='display:none';
  452. } else {
  453. dest1.disabled=false;
  454. dest2.disabled=false;
  455. // dest.style='display:block';
  456. }
  457. }
  458. function popusels(index) {
  459. console.log('Index: '+index);
  460. var key=document.getElementById('fieldsel-'+index).value;
  461. var type=key.replace(/^.*§(.*)§.*$/,'$1');
  462. var subtype=key.replace(/^.*§.*§(.*)$/,'$1');
  463. key=key.replace(/^(.*)§.*§.*$/,'$1');
  464. var condsel=document.getElementById('condsel-'+index);
  465. var valsel=document.getElementById('valuesel-'+index);
  466. var valinp=document.getElementById('valueinp-'+index);
  467. if (type=='joini')
  468. type=subtype;
  469. if (type=='bool') {
  470. truncsel('condsel-'+index);
  471. addselopt(condsel,'IS','è');
  472. truncsel('valuesel-'+index);
  473. addselopt(valsel,'TRUE','vero');
  474. addselopt(valsel,'FALSE','falso');
  475. addselopt(valsel,'NOT NULL','definito');
  476. addselopt(valsel,'NULL','non definito');
  477. valinp.style='display:none';
  478. valinp.disabled=true;
  479. valsel.style='display:block';
  480. valsel.disabled=false;
  481. condsel.removeAttribute('onchange');
  482. } else if (type=='text') {
  483. truncsel('condsel-'+index);
  484. addselopt(condsel,'LIKE','contiene');
  485. addselopt(condsel,'NOT LIKE','non contiene');
  486. addselopt(condsel,'=','è uguale a');
  487. addselopt(condsel,'!=','è diverso da');
  488. addselopt(condsel,'IS NOT NULL','è definito');
  489. addselopt(condsel,'IS NULL','non è definito');
  490. valsel.style='display:none';
  491. valsel.disabled=true;
  492. valinp.style='display:block';
  493. valinp.disabled=false;
  494. condsel.setAttribute('onchange','inpdisif('+index+');');
  495. } else if (type=='int' || type=='time') {
  496. truncsel('condsel-'+index);
  497. addselopt(condsel,'>=','maggiore o uguale a');
  498. addselopt(condsel,'<=','minore o uguale a');
  499. addselopt(condsel,'>','maggiore di');
  500. addselopt(condsel,'<','minore di');
  501. addselopt(condsel,'=','uguale a');
  502. addselopt(condsel,'!=','diverso da');
  503. addselopt(condsel,'IS NOT NULL','è definito');
  504. addselopt(condsel,'IS NULL','non è definito');
  505. valsel.style='display:none';
  506. valsel.disabled=true;
  507. valinp.style='display:block';
  508. valinp.disabled=false;
  509. condsel.setAttribute('onchange','inpdisif('+index+');');
  510. } else if (type=='join') {
  511. truncsel('condsel-'+index);
  512. addselopt(condsel,'=','uguale a');
  513. addselopt(condsel,'!=','diverso da');
  514. addselopt(condsel,'IS NOT NULL','è definito');
  515. addselopt(condsel,'IS NULL','non è definito');
  516. valsel.style='display:block';
  517. valsel.disabled=false;
  518. valinp.style='display:none';
  519. valinp.disabled=true;
  520. condsel.setAttribute('onchange','inpdisif('+index+');');
  521. truncsel('valuesel-'+index);
  522. document.getElementById('helper').setAttribute('src','instancesh.php?key='+key+'&parsel=valuesel-'+index);
  523. } else {
  524. alert('Attenziò: non so che farmene del tipo "'+type+'": diglielo, al programmatore.');
  525. }
  526. }
  527. function addrow(index) {
  528. var table=document.getElementById('planciafil');
  529. var newrow=table.insertRow(index);
  530. var newcell0=newrow.insertCell(0);
  531. var newcell1=newrow.insertCell(1);
  532. var newcell2=newrow.insertCell(2);
  533. var newcell3=newrow.insertCell(3);
  534. var newcell4=newrow.insertCell(4);
  535. var newcell5=newrow.insertCell(5);
  536. var newcell6=newrow.insertCell(6);
  537. var newcell7=newrow.insertCell(7);
  538. newcell0.innerHTML='<select class="openpar"><option value="null"></option><option value="(">(</option><option value="((">((</option><option value="(((">(((</option></select>';
  539. newcell1.innerHTML='<select class="fieldsel"><?php echo($fieldselopts); ?></select>';
  540. newcell2.innerHTML='<select class="condsel"></select>';
  541. newcell3.innerHTML='<select class="valuesel" style="display:none;"></select><input type="text" class="valueinp" maxlength="256" style="display:none;">';
  542. newcell4.innerHTML='<select class="closepar"><option value="null"></option><option value=")">)</option><option value="))">))</option><option value=")))">)))</option></select>';
  543. newcell5.innerHTML='<select class="andor"><option value="AND">E</option><option value="OR">O</option></select>';
  544. newcell6.innerHTML='<img class="plus" src="imgs/plus.svg">';
  545. newcell7.innerHTML='<img class="minus" src="imgs/minus.svg">';
  546. synctai();
  547. popusels(index);
  548. }
  549. function synctai() {
  550. var i=0;
  551. var table=document.getElementById('planciafil');
  552. var nodes=table.querySelectorAll('.minus');
  553. var cnodes=nodes.length;
  554. for (i=0; i<cnodes; i++)
  555. // +1 sempre per via della row iniziale
  556. nodes[i].setAttribute('onclick','remrow('+(i+1)+');');
  557. nodes=table.querySelectorAll('.plus');
  558. for (i=0; i<cnodes; i++)
  559. // +2 perché la devi aggiungere dopo la corrente
  560. nodes[i].setAttribute('onclick','addrow('+(i+2)+');');
  561. // da qui in poi faccio a scendere per non avere mai id e nomi duplicati
  562. cnodes--;
  563. nodes=table.querySelectorAll('.openpar');
  564. for (i=cnodes; i>-1; i--) {
  565. nodes[i].setAttribute('id','openpar-'+(i+1));
  566. nodes[i].setAttribute('name','openpar-'+(i+1));
  567. }
  568. nodes=table.querySelectorAll('.fieldsel');
  569. for (i=cnodes; i>-1; i--) {
  570. nodes[i].setAttribute('id','fieldsel-'+(i+1));
  571. nodes[i].setAttribute('name','fieldsel-'+(i+1));
  572. nodes[i].setAttribute('onchange','popusels('+(i+1)+');');
  573. }
  574. nodes=table.querySelectorAll('.condsel');
  575. for (i=cnodes; i>-1; i--) {
  576. nodes[i].setAttribute('id','condsel-'+(i+1));
  577. nodes[i].setAttribute('name','condsel-'+(i+1));
  578. }
  579. nodes=table.querySelectorAll('.valuesel');
  580. for (i=cnodes; i>-1; i--) {
  581. nodes[i].setAttribute('id','valuesel-'+(i+1));
  582. nodes[i].setAttribute('name','valuesel-'+(i+1));
  583. }
  584. nodes=table.querySelectorAll('.valueinp');
  585. for (i=cnodes; i>-1; i--) {
  586. nodes[i].setAttribute('id','valueinp-'+(i+1));
  587. nodes[i].setAttribute('name','valueinp-'+(i+1));
  588. }
  589. nodes=table.querySelectorAll('.closepar');
  590. for (i=cnodes; i>-1; i--) {
  591. nodes[i].setAttribute('id','closepar-'+(i+1));
  592. nodes[i].setAttribute('name','closepar-'+(i+1));
  593. }
  594. nodes=table.querySelectorAll('.andor');
  595. for (i=cnodes; i>-1; i--) {
  596. nodes[i].setAttribute('id','andor-'+(i+1));
  597. nodes[i].setAttribute('name','andor-'+(i+1));
  598. nodes[i].disabled=false;
  599. }
  600. if (cnodes>=0)
  601. nodes[cnodes].disabled=true;
  602. }
  603. function remrow(index) {
  604. var table=document.getElementById('planciafil');
  605. table.deleteRow(index);
  606. synctai();
  607. if (table.rows.length<2)
  608. document.getElementById('filbut').value='Aggiungi criteri di ricerca';
  609. }
  610. function truncfil() {
  611. var table=document.getElementById('planciafil');
  612. while (table.rows.length>1)
  613. remrow(1);
  614. }
  615. function manfil() {
  616. var filbut=document.getElementById('filbut');
  617. var table=document.getElementById('planciafil');
  618. var crows=table.rows.length;
  619. if (crows<2) {
  620. addrow(1);
  621. filbut.value='Rimuovi tutti i criteri di ricerca';
  622. } else {
  623. confirma('Confermi di voler rimuovere tutti i criteri di ricerca?','truncfil();filbut.value=\'Aggiungi criteri di ricerca\'');
  624. }
  625. }
  626. function ckf() {
  627. document.getElementById('f').submit();
  628. }
  629. //-->
  630. </script>
  631. </head>
  632. <body>
  633. <nav>
  634. <div id="hmenu">
  635. <ul>
  636. <?php echo($menuout); ?>
  637. </ul>
  638. <div id="rightdiv" onclick="shideplancia();">Mostra plancia</div>
  639. </div>
  640. </nav>
  641. <div id="popup">
  642. <div id="inpopup">
  643. <div id="popupcont">
  644. ...
  645. </div>
  646. </div>
  647. </div>
  648. <iframe name="helper" id="helper"></iframe>
  649. <div id="footer">
  650. <form action="edinst.php" name="addinst" method="post">
  651. <table><tr><td>Aggiungi un’istanza:</td><td><input type="text" name="URI" maxlength="512"></td><td><input type="button" value="Vai" onClick="ckaif();"></td></tr></table>
  652. </form>
  653. </div>
  654. <div id="debug">
  655. <?php echo($dbg); ?>
  656. </div>
  657. <div id="fullscreen">
  658. <div id="middlerow">
  659. <form method="post" id="f">
  660. <div id="plancia">
  661. <table id="planciafil" class="planciatab">
  662. <tr><td colspan="8"><input type="button" id="filbut" value="Aggiungi criteri di ricerca" class="ctrlbut" onclick="manfil();"></td></tr>
  663. </table>
  664. <table id="planciaord" class="planciatab">
  665. <tr><td colspan="8"><input type="button" id="ordbut" value="Aggiungi criteri di ordinamento" class="ctrlbut" onclick="alert('Aspetta!')"></td></tr>
  666. </table>
  667. <table id="planciaothers" class="planciatab">
  668. <tr><td><input type="button" id="subbut" value="Applica" class="ctrlbut" onclick="ckf();"></td></tr>
  669. </table>
  670. </div>
  671. </form>
  672. <?php echo($out); ?>
  673. </div>
  674. </div>
  675. </body>
  676. </html>