instances.php 23 KB

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