instances.php 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852
  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(),'ord'=>false),
  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','search'=>false,'ord'=>false),
  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','ord'=>false),
  110. 'AdmAvatar'=>array('name'=>'Avatar admin','type'=>'text','search'=>false,'ord'=>false),
  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'),'ord'=>false),
  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','ord'=>false),
  114. 'InstLangs.LangID'=>array('name'=>'[Lingua primaria dichiarata]','type'=>'join','join'=>array('InstLangs ON InstLangs.InstID=Instances.ID'),'wheremore'=>'AND InstLangs.Pos=1','ord'=>false),
  115. 'Languages.NameIT'=>array('name'=>'Lingua primaria dichiarata','type'=>'joini','join'=>array('InstLangs ON InstLangs.InstID=Instances.ID','Languages ON Languages.ID=InstLangs.LangID'),'subtype'=>'text','wheremore'=>'AND InstLangs.Pos=1'),
  116. 'OurLangID'=>array('name'=>'[Lingue impostate da noi]','type'=>'join','join'=>array('InstOurLangs ON InstOurLangs.InstID=Instances.ID'),'ord'=>false),
  117. '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','ord'=>false),
  118. 'InstOurLangs.OurLangID'=>array('name'=>'[Lingua primaria impostata da noi]','type'=>'join','join'=>array('InstOurLangs ON InstOurLangs.InstID=Instances.ID'),'wheremore'=>'AND InstOurLangs.Pos=1','ord'=>false),
  119. 'OurLanguages.NameIT'=>array('name'=>'Lingua primaria impostata da noi','type'=>'joini','join'=>array('InstOurLangs ON InstOurLangs.InstID=Instances.ID','Languages AS OurLanguages ON OurLanguages.ID=InstOurLangs.OurLangID'),'subtype'=>'text','wheremore'=>'AND InstOurLangs.Pos=1'),
  120. 'FinID'=>array('name'=>'[Modalità di finanziamento]','type'=>'join','join'=>array('InstFinancing ON InstFinancing.InstID=Instances.ID'),'ord'=>false),
  121. 'Financing.Type'=>array('name'=>'Modalità di finanziamento','type'=>'joini','join'=>array('InstFinancing ON InstFinancing.InstID=Instances.ID','Financing ON Financing.ID=InstFinancing.FinID'),'subtype'=>'text'),
  122. 'InstFinancing.FinID'=>array('name'=>'[Modalità di finanziamento primaria]','type'=>'join','join'=>array('InstFinancing ON InstFinancing.InstID=Instances.ID'),'wheremore'=>'AND InstFinancing.Pos=1','ord'=>false),
  123. 'XFinancing.Type'=>array('name'=>'Modalità di finanziamento primaria','type'=>'joini','join'=>array('InstFinancing ON InstFinancing.InstID=Instances.ID','Financing AS XFinancing ON XFinancing.ID=InstFinancing.FinID'),'subtype'=>'text','wheremore'=>'AND InstFinancing.Pos=1'),
  124. 'PolID'=>array('name'=>'[Restrizioni sui contenuti]','type'=>'join','join'=>array('InstPolicies ON InstPolicies.InstID=Instances.ID'),'ord'=>false),
  125. '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'),
  126. 'InstPolicies.PolID'=>array('name'=>'[Restrizione sui contenuti primaria]','type'=>'join','join'=>array('InstPolicies ON InstPolicies.InstID=Instances.ID'),'wheremore'=>'AND InstPolicies.Pos=1','ord'=>false),
  127. 'XPolicies.Name'=>array('name'=>'Restrizione sui contenuti primaria','type'=>'joini','join'=>array('InstPolicies ON InstPolicies.InstID=Instances.ID','Policies AS XPolicies ON XPolicies.ID=InstPolicies.PolID'),'subtype'=>'text','wheremore'=>'AND InstPolicies.Pos=1'),
  128. 'TagID'=>array('name'=>'[Tags]','type'=>'join','join'=>array('InstTags ON InstTags.InstID=Instances.ID'),'ord'=>false),
  129. 'Tags.Name'=>array('name'=>'Tags','type'=>'joini','join'=>array('InstTags ON InstTags.InstID=Instances.ID','Tags ON Tags.ID=InstTags.TagID'),'subtype'=>'text'),
  130. 'InstTags.TagID'=>array('name'=>'[Tag primaria]','type'=>'join','join'=>array('InstTags ON InstTags.InstID=Instances.ID'),'wheremore'=>'AND InstTags.Pos=1','ord'=>false),
  131. 'XTags.Name'=>array('name'=>'Tag primaria','type'=>'joini','join'=>array('InstTags ON InstTags.InstID=Instances.ID','Tags AS XTags ON XTags.ID=InstTags.TagID'),'subtype'=>'text','wheremore'=>'AND InstTags.Pos=1'),
  132. /*'Statuses'=>array('name'=>'Stati ultima settimana','type'=>'joini','join'=>array('InstActivity ON InstActivity.InstID=Instances.ID'),'subtype'=>'int','selmore'=>'MAX(Week) AS maxweek'),
  133. 'Logins'=>array('name'=>'Logins ultima settimana','type'=>'joini','join'=>array('InstActivity ON InstActivity.InstID=Instances.ID'),'subtype'=>'int','selmore'=>'MAX(Week) AS maxweek'),
  134. 'Registrations'=>array('name'=>'Registrazioni ultima settimana','type'=>'joini','join'=>array('InstActivity ON InstActivity.InstID=Instances.ID'),'subtype'=>'int','selmore'=>'MAX(Week) AS maxweek'),*/
  135. );
  136. $types=array('bool','int','time','text','join','joini');
  137. $fieldselopts='';
  138. $ordfieldselopts='';
  139. foreach ($cols as $key=>$val) {
  140. if (!array_key_exists('search',$val)) {
  141. if ($val['type']=='joini') {
  142. $fieldselopts.='<option value="'.$key.':'.$val['type'].':'.$val['subtype'].'">'.$val['name'].'</option>';
  143. } else {
  144. $fieldselopts.='<option value="'.$key.':'.$val['type'].':null">'.$val['name'].'</option>';
  145. }
  146. }
  147. if (!array_key_exists('ord',$val)) {
  148. if ($val['type']=='joini') {
  149. $ordfieldselopts.='<option value="'.$key.':'.$val['type'].':'.$val['subtype'].'">'.$val['name'].'</option>';
  150. } else {
  151. $ordfieldselopts.='<option value="'.$key.':'.$val['type'].':null">'.$val['name'].'</option>';
  152. }
  153. }
  154. }
  155. $i=0;
  156. $jsaddrows='';
  157. $jssetrows='';
  158. $cp=count($_POST)/6; // /6 perché ogni "blocco" contiene 6 righe
  159. $sels=array();
  160. $joins=array();
  161. $where='';
  162. foreach ($_POST as $key=>$val) {
  163. if (preg_match('/^openpar-\d+/',$key)===1) {
  164. $i++;
  165. if (preg_match('/^\(+$/',$val)===1)
  166. $where.=$val;
  167. $jsaddrows.='addrow('.$i.',false);'.N;
  168. $jssetrows.='setrow('.$i.','.json_encode($val);
  169. }
  170. if (preg_match('/^fieldsel-\d+/',$key)===1 && preg_match('/^(.+):(.+):(.+)$/',$val,$buf)===1) {
  171. $col=$buf[1];
  172. $type=$buf[2];
  173. $subtype=$buf[3];
  174. if (array_key_exists($col,$cols) && in_array($type,$types)) {
  175. if (array_key_exists('wheremore',$cols[$col]))
  176. $where.='(';
  177. $where.=$col;
  178. if ($type=='join' || $type=='joini') {
  179. foreach ($cols[$col]['join'] as $join) {
  180. if (!in_array($join,$joins))
  181. $joins[]=$join;
  182. }
  183. if (array_key_exists('selmore',$cols[$col]) && !in_array($cols[$col]['selmore'],$sels))
  184. $sels[]=$cols[$col]['selmore'];
  185. }
  186. $jssetrows.=','.json_encode($val);
  187. } else {
  188. muoribene($dbg.'<br>Dati POST corrotti.<br>Puoi <a href="instances.php">riprovare</a> o <a href="index.php">tornare al login</a>.',true);
  189. }
  190. }
  191. if (preg_match('/^condsel-\d+/',$key)===1) {
  192. $where.=' '.$val.' ';
  193. $cond=$val;
  194. $jssetrows.=','.json_encode($val);
  195. // nel caso qui sotto, valuesel e valueinp sono entrambi disabilitati (non ci sono in $_POST), quindi li riempio di introvabile e nulla
  196. if (preg_match('/^(IS NULL|IS NOT NULL)$/',$val)===1)
  197. $jssetrows.=',"NOMMITROVI!",""';
  198. }
  199. if (preg_match('/^valuesel-\d+/',$key)===1) {
  200. $where.=$val;
  201. if (array_key_exists('wheremore',$cols[$col]))
  202. $where.=' '.$cols[$col]['wheremore'].')';
  203. $jssetrows.=','.json_encode($val);
  204. $jssetrows.=',""';
  205. }
  206. if (preg_match('/^valueinp-\d+/',$key)===1) {
  207. if (preg_match('/^(LIKE|NOT LIKE)$/',$cond)===1)
  208. $where.='\'%'.myesc($link,$val).'%\'';
  209. else
  210. $where.='\''.myesc($link,$val).'\'';
  211. if (array_key_exists('wheremore',$cols[$col]))
  212. $where.=' '.$cols[$col]['wheremore'].')';
  213. $jssetrows.=',"NOMMITROVIHODETTO!"';
  214. $jssetrows.=','.json_encode($val);
  215. }
  216. if (preg_match('/^closepar-\d+/',$key)===1) {
  217. if (preg_match('/^\)+$/',$val)===1)
  218. $where.=$val;
  219. $jssetrows.=','.json_encode($val);
  220. }
  221. if (preg_match('/^andor-\d+/',$key)===1 && preg_match('/^(AND|OR)$/',$val)===1) {
  222. if ($i<$cp)
  223. $where.=' '.$val.' ';
  224. $jssetrows.=','.json_encode($val).');'.N;
  225. }
  226. }
  227. if ($jsaddrows!='') {
  228. $jsaddrows.='document.getElementById("filbut").value="Rimuovi tutti i criteri di ricerca";'.N;
  229. $jsaddrows.='synctai();'.N;
  230. }
  231. if (count($sels)>0)
  232. $sels=', '.implode(', ',$sels);
  233. else
  234. $sels='';
  235. if ($where!='')
  236. $where='WHERE '.$where;
  237. if (count($joins)>0)
  238. $joins='LEFT JOIN '.implode(' LEFT JOIN ',$joins);
  239. else
  240. $joins='';
  241. $query='SELECT *, Instances.ID AS IID'.$sels.' FROM Instances '.$joins.' '.$where.' GROUP BY IID ORDER BY Instances.URI ASC LIMIT 50';
  242. $dbg.='QUERONA: '.$query.'<br>'.N;
  243. $tini=microtime(true);
  244. $res=mysqli_query($link,$query)
  245. or muoribene($dbg.'<br>'.$query.': '.mysqli_error($link).'<br>'.'La query è fallita. <a href="instances.php">Resetta</a>.',true);
  246. $dbg.='Durata esecuzione query: '.round(microtime(true)-$tini,4).' sec.<br>'.N;
  247. if (mysqli_num_rows($res)<1) {
  248. $out='<p>Nessuna istanza da mostrare.</p>'.N;
  249. } else {
  250. $out='';
  251. while ($row=mysqli_fetch_assoc($res)) {
  252. $out.='<table class="bigtab">'.N;
  253. // $out.='<thead><tr><th class="tdattr">Attributi</th><th>Info</th></thead>'.N;
  254. $out.='<tbody>'.N;
  255. $out.='<tr><td colspan="2" class="insthead">'.$row['URI'].' {'.$row['IID'].'}</td></tr>'.N;
  256. $attr=booly($cols['Blacklisted']['name'].': ',$row['Blacklisted'],false,true).N;
  257. $attr.=booly($cols['New']['name'].': ',$row['New'],true).N;
  258. $attr.=booly($cols['Good']['name'].': ',$row['Good']).N;
  259. $attr.=booly($cols['Chosen']['name'].': ',$row['Chosen']).N;
  260. $attr.=booly($cols['Visible']['name'].': ',$row['Visible']).N;
  261. /* $attr.=booly($cols['RegOpen']['name'].': ',$row['RegOpen']).N;
  262. $attr.=booly($cols['RegReqApproval']['name'].': ',$row['RegReqApproval'],true,true).N;*/
  263. $sres=mysqli_query($link,'SELECT * FROM InstChecks WHERE InstID='.$row['IID'].' ORDER BY Time DESC')
  264. or muoribene(mysqli_error($link),true);
  265. $csres=mysqli_num_rows($sres);
  266. if ($csres>0) {
  267. $bene=0;
  268. while ($srow=mysqli_fetch_assoc($sres)) {
  269. if ($srow['Status']==1)
  270. $bene++;
  271. }
  272. $width=str_replace(',','.',100/$csres*$bene);
  273. $attr.='<div class="colsectheader">Percentuale di risposta ai nostri check: '.round($width,1).'%</div>';
  274. $attr.='<div class="percbg"><div class="percfg" style="width:'.$width.'%;"></div></div>'.N;
  275. mysqli_data_seek($sres,0);
  276. $srow=mysqli_fetch_assoc($sres);
  277. $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>';
  278. } else {
  279. $attr.='<div class="colsectheader">Percentuale di risposta ai nostri check</div>'.N;
  280. $attr.='<div class="colsectcont nully">Non disponibile (?!?!?!)</div>'.N;
  281. }
  282. $attr.='<div class="colsectheader">Attività delle ultime 12 settimane</div>'.N;
  283. $sres=mysqli_query($link,'SELECT SUM(Statuses) AS tstatuses, SUM(Logins) AS tlogins, SUM(Registrations) AS tregs FROM InstActivity WHERE InstID='.$row['IID'])
  284. or muoribene(mysqli_error($link),true);
  285. $tot=mysqli_fetch_assoc($sres);
  286. $sres=mysqli_query($link,'SELECT * FROM InstActivity WHERE InstID='.$row['IID'].' ORDER BY Week DESC')
  287. or muoribene(mysqli_error($link),true);
  288. if (mysqli_num_rows($sres)>0) {
  289. $attr.='<div class="colsectcont">Stati: '.$tot['tstatuses'].'<br>Accessi: '.$tot['tlogins'].'<br>Registrazioni: '.$tot['tregs'].'</div>'.N;
  290. while ($srow=mysqli_fetch_assoc($sres)) {
  291. $attr.='<div class="colsectcontb">'.strftime('%e %b %Y',$srow['Week']).'</div>'.N;
  292. ($tot['tstatuses']==0) ? $width=0 : $width=str_replace(',','.',100/$tot['tstatuses']*$srow['Statuses']);
  293. $attr.='<div class="percstatuses" style="width:'.$width.'%;">'.$srow['Statuses'].'&nbsp;stati</div>'.N;
  294. ($tot['tlogins']==0) ? $width=0 : $width=str_replace(',','.',100/$tot['tlogins']*$srow['Logins']);
  295. $attr.='<div class="perclogins" style="width:'.$width.'%;">'.$srow['Logins'].'&nbsp;accessi</div>'.N;
  296. ($tot['tregs']==0) ? $width=0 : $width=str_replace(',','.',100/$tot['tregs']*$srow['Registrations']);
  297. $attr.='<div class="percregs" style="width:'.$width.'%;">'.$srow['Registrations'].'&nbsp;registrazioni</div>'.N;
  298. }
  299. } else {
  300. $attr.='<div class="colsectcont nully">Non disponibile</div>'.N;
  301. }
  302. $attr.='<div class="colsectheader">Hashtags più usati durante l’ultima settimana</div>'.N;
  303. $sres=mysqli_query($link,'SELECT * FROM InstTrends WHERE InstID='.$row['IID'].' ORDER BY Pos ASC')
  304. or muoribene(mysqli_error($link),true);
  305. if (mysqli_num_rows($sres)>0) {
  306. $attr.='<div class="colsectcont"><ol>'.N;
  307. while ($srow=mysqli_fetch_assoc($sres)) {
  308. $attr.='<li><a href="'.$srow['URL'].'">'.hspech($srow['Name']).'</a></li>'.N;
  309. }
  310. $attr.='</ol></div>'.N;
  311. } else {
  312. $attr.='<div class="colsectcont nully">Non disponibili</div>'.N;
  313. }
  314. $out.='<tr><td class="tdattr">'.$attr.'</td><td>'.N;
  315. $out.='<div class="baloo"><span class="field">'.$cols['URI']['name'].':</span> <a href="https://'.$row['URI'].'" target="_blank">'.$row['URI'].'</a></div>'.N;
  316. $out.='<div class="baloo"><span class="field">'.$cols['Title']['name'].':</span> '.nully($row['Title'],false,'strip').'</div>'.N;
  317. $out.='<div class="baloo"><span class="field">'.$cols['Thumb']['name'].':</span> '.nully($row['Thumb'],true,'image').'</div>'.N;
  318. $out.='<div class="baloo"><span class="field">'.$cols['ShortDesc']['name'].':</span> '.nully($row['ShortDesc'],true,'strip').'</div>'.N;
  319. $out.='<div class="baloo"><span class="field">'.$cols['LongDesc']['name'].':</span> '.nully($row['LongDesc'],true,'strip').'</div>'.N;
  320. // 'strip' o 'htmlent' per la descrizione nostra?
  321. $out.='<div class="baloo"><span class="ourfield">'.$cols['OurDesc']['name'].':</span> '.nully($row['OurDesc'],true,'strip').'</div>'.N;
  322. $out.='<div class="baloo"><span class="ourfield">'.$cols['Places.Locality']['name'].':</span> ';
  323. if (!is_null($row['PlaceID'])) {
  324. $sres=mysqli_query($link,'SELECT * FROM Places WHERE Places.ID='.$row['PlaceID'])
  325. or muoribene(mysqli_error($link),true);
  326. $srow=mysqli_fetch_assoc($sres);
  327. $out.=hspech($srow['Locality']).'</div>'.N;
  328. } else {
  329. $out.='<span class="nully">Non definita</span></div>'.N;
  330. }
  331. $sres=mysqli_query($link,'SELECT * FROM InstLangs LEFT JOIN Languages ON Languages.ID=LangID 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['Code'].' ['.ucfirst(locale_get_display_name($srow['Code'])).']');
  339. }
  340. $out.='<div class="baloo"><span class="field">'.$cols['Languages.Code']['name'].':</span> '.implode('; ',$buf).'</div>'.N;
  341. } else {
  342. $out.='<div class="baloo"><span class="field">'.$cols['Languages.Code']['name'].':</span> <span class="nully">Non definite</span></div>'.N;
  343. }
  344. $sres=mysqli_query($link,'SELECT * FROM InstOurLangs LEFT JOIN Languages ON Languages.ID=OurLangID 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['Code'].' ['.ucfirst(locale_get_display_name($srow['Code'],'it')).']');
  352. }
  353. $out.='<div class="baloo"><span class="ourfield">'.$cols['OurLanguages.Code']['name'].':</span> '.implode('; ',$buf).'</div>'.N;
  354. } else {
  355. $out.='<div class="baloo"><span class="ourfield">'.$cols['OurLanguages.Code']['name'].':</span> <span class="nully">Non definite</span></div>'.N;
  356. }
  357. $sres=mysqli_query($link,'SELECT * FROM InstFinancing LEFT JOIN Financing ON Financing.ID=FinID WHERE InstID='.$row['IID'].' ORDER BY Pos ASC')
  358. or muoribene(mysqli_error($link),true);
  359. if (mysqli_num_rows($sres)>0) {
  360. $i=0;
  361. $buf=array();
  362. while ($srow=mysqli_fetch_assoc($sres)) {
  363. $i++;
  364. $buf[]=$i.': '.hspech($srow['Type']);
  365. }
  366. $out.='<div class="baloo"><span class="ourfield">'.$cols['Financing.Type']['name'].':</span> '.implode('; ',$buf).'</div>'.N;
  367. } else {
  368. $out.='<div class="baloo"><span class="ourfield">'.$cols['Financing.Type']['name'].':</span> <span class="nully">Non definite</span></div>'.N;
  369. }
  370. $sres=mysqli_query($link,'SELECT * FROM InstPolicies LEFT JOIN Policies ON Policies.ID=PolID WHERE InstID='.$row['IID'].' ORDER BY Pos ASC')
  371. or muoribene(mysqli_error($link),true);
  372. if (mysqli_num_rows($sres)>0) {
  373. $i=0;
  374. $buf=array();
  375. while ($srow=mysqli_fetch_assoc($sres)) {
  376. $i++;
  377. $buf[]=$i.': '.hspech($srow['Name']);
  378. }
  379. $out.='<div class="baloo"><span class="ourfield">'.$cols['Policies.Name']['name'].':</span> '.implode('; ',$buf).'</div>'.N;
  380. } else {
  381. $out.='<div class="baloo"><span class="ourfield">'.$cols['Policies.Name']['name'].':</span> <span class="nully">Non definite</span></div>'.N;
  382. }
  383. $sres=mysqli_query($link,'SELECT * FROM InstTags LEFT JOIN Tags ON Tags.ID=TagID WHERE InstID='.$row['IID'].' ORDER BY Pos ASC')
  384. or muoribene(mysqli_error($link),true);
  385. if (mysqli_num_rows($sres)>0) {
  386. $i=0;
  387. $buf=array();
  388. while ($srow=mysqli_fetch_assoc($sres)) {
  389. $i++;
  390. $buf[]=$i.': '.hspech($srow['Name']);
  391. }
  392. $out.='<div class="baloo"><span class="ourfield">'.$cols['Tags.Name']['name'].':</span> '.implode('; ',$buf).'</div>'.N;
  393. } else {
  394. $out.='<div class="baloo"><span class="ourfield">'.$cols['Tags.Name']['name'].':</span> <span class="nully">Non definite</span></div>'.N;
  395. }
  396. $out.='<div class="baloo"><span class="field">'.$cols['Email']['name'].':</span> '.nully($row['Email'],true,'email').'</div>'.N;
  397. $out.='<div class="baloo"><span class="field">'.$cols['Software']['name'].':</span> '.nully($row['Software'],false,'strip').'</div>'.N;
  398. $out.='<div class="baloo"><span class="field">'.$cols['Version']['name'].':</span> '.nully($row['Version'],true,'strip').'</div>'.N;
  399. $out.='<div class="baloo"><span class="field">'.$cols['UserCount']['name'].':</span> '.nully($row['UserCount'],false,'strip').'</div>'.N;
  400. $out.='<div class="baloo"><span class="field">'.$cols['StatusCount']['name'].':</span> '.nully($row['StatusCount'],false,'strip').'</div>'.N;
  401. $out.='<div class="baloo"><span class="field">'.$cols['DomainCount']['name'].':</span> '.nully($row['DomainCount'],false,'strip').'</div>'.N;
  402. $out.='<div class="baloo"><span class="field">'.$cols['ActiveUsersMonth']['name'].':</span> '.nully($row['ActiveUsersMonth'],false,'strip').'</div>'.N;
  403. $out.='<div class="baloo"><span class="field">'.$cols['ActiveUsersHalfYear']['name'].':</span> '.nully($row['ActiveUsersHalfYear'],false,'strip').'</div>'.N;
  404. $out.='<div class="baloo"><span class="field">'.$cols['RegOpen']['name'].':</span> '.nully($row['RegOpen'],false,'boolt').'</div>'.N;
  405. $out.='<div class="baloo"><span class="field">'.$cols['RegReqApproval']['name'].':</span> '.nully($row['RegReqApproval'],false,'boolf').'</div>'.N;
  406. $out.='<div class="baloo"><span class="field">'.$cols['MaxTootChars']['name'].':</span> '.nully($row['MaxTootChars'],false,'strip','500').'</div>'.N;
  407. $out.='<div class="baloo"><span class="field">'.$cols['AdmAccount']['name'].':</span> '.nully($row['AdmAccount'],false,'strip').'</div>'.N;
  408. $out.='<div class="baloo"><span class="field">'.$cols['AdmDisplayName']['name'].':</span> '.nully($row['AdmDisplayName'],false,'strip').'</div>'.N;
  409. $out.='<div class="baloo"><span class="field">'.$cols['AdmCreatedAt']['name'].':</span> '.nully($row['AdmCreatedAt'],true,'timestamp').'</div>'.N;
  410. $out.='<div class="baloo"><span class="field">'.$cols['AdmURL']['name'].':</span> '.nully($row['AdmURL'],true,'url').'</div>'.N;
  411. $out.='<div class="baloo"><span class="field">'.$cols['AdmAvatar']['name'].':</span> '.nully($row['AdmAvatar'],false,'image').'</div>'.N;
  412. $out.='<div><span class="field">'.$cols['AdmNote']['name'].':</span> '.nully($row['AdmNote'],false,'strip').'</div>'.N;
  413. $out.='</td></tr>'.N;
  414. $out.='</tbody>'.N;
  415. $out.='</table>'.N;
  416. }
  417. $out.='<div class="bigtabfoot"></div>';
  418. }
  419. mysqli_close($link);
  420. ?>
  421. <!DOCTYPE HTML>
  422. <html lang="it">
  423. <head>
  424. <title>Mastodon Startpage Admin - Istanze</title>
  425. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  426. <meta name="description" content="Admin pages for Mastodon Startpage">
  427. <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
  428. <link rel="icon" type="image/png" href="imgs/icona-32.png" sizes="32x32">
  429. <link rel="icon" type="image/png" href="imgs/icona-192.png" sizes="192x192">
  430. <link rel="icon" type="image/png" href="imgs/icona-512.png" sizes="512x512">
  431. <link rel="apple-touch-icon-precomposed" href="imgs/icona-180.png">
  432. <script language="JavaScript" src="js/confirma.js?v=<?php echo($cjrand); ?>"></script>
  433. <script language="JavaScript" src="js/alerta.js?v=<?php echo($cjrand); ?>"></script>
  434. <link rel="stylesheet" type="text/css" href="theme.css?v=<?php echo($cjrand); ?>">
  435. <script language="JavaScript">
  436. <!--
  437. function chulsh(el,sh) {
  438. if (sh)
  439. el.querySelector('ul').style='display:block';
  440. else
  441. el.querySelector('ul').style='display:none';
  442. }
  443. function ulsh(el,sh) {
  444. if (sh)
  445. el.style='display:block';
  446. else
  447. el.style='display:none';
  448. }
  449. function golang(lang) {
  450. var loc=document.location.href;
  451. loc=loc.replace(/#.*$/,'');
  452. loc=loc.replace(/\/$/,'');
  453. if (document.documentElement.lang=='en') {
  454. if (lang!='en')
  455. document.location.href=loc+'/'+lang;
  456. } else {
  457. if (lang!='en')
  458. document.location.href=loc.substr(0,loc.length-3)+'/'+lang;
  459. else
  460. document.location.href=loc.substr(0,loc.length-3);
  461. }
  462. }
  463. function shideplancia() {
  464. var plancia=document.getElementById('plancia');
  465. var plctrl=document.getElementById('plctrl');
  466. if (plancia.style.display=='block') {
  467. plancia.style.display='none';
  468. plctrl.innerHTML='Mostra plancia';
  469. } else {
  470. plancia.style.display='block';
  471. plctrl.innerHTML='Nascondi plancia';
  472. }
  473. }
  474. function truncsel(el) {
  475. var sel=document.getElementById(el), len=sel.length, i=0;
  476. for (i=len-1; i>=0; i--)
  477. sel.remove(i);
  478. }
  479. function addselopt(el,val,txt) {
  480. option=new Option(txt,val);
  481. el.add(option);
  482. }
  483. function inpdisif(index) {
  484. var source=document.getElementById('condsel-'+index);
  485. var inp=document.getElementById('valueinp-'+index);
  486. var sel=document.getElementById('valuesel-'+index);
  487. var conds=['IS NULL','IS NOT NULL'];
  488. if (conds.includes(source.value)) {
  489. inp.disabled=true;
  490. sel.disabled=true;
  491. } else {
  492. if (inp.style.display!='none') inp.disabled=false;
  493. if (sel.style.display!='none') sel.disabled=false;
  494. }
  495. }
  496. function popusels(index,valselval) {
  497. console.log('Index: '+index);
  498. var key=document.getElementById('fieldsel-'+index).value;
  499. var type=key.replace(/^.*:(.*):.*$/,'$1');
  500. var subtype=key.replace(/^.*:.*:(.*)$/,'$1');
  501. key=key.replace(/^(.*):.*:.*$/,'$1');
  502. var condsel=document.getElementById('condsel-'+index);
  503. var valsel=document.getElementById('valuesel-'+index);
  504. var valinp=document.getElementById('valueinp-'+index);
  505. if (type=='joini')
  506. type=subtype;
  507. if (type=='bool') {
  508. truncsel('condsel-'+index);
  509. addselopt(condsel,'IS','è');
  510. truncsel('valuesel-'+index);
  511. addselopt(valsel,'TRUE','vero');
  512. addselopt(valsel,'FALSE','falso');
  513. addselopt(valsel,'NOT NULL','definito');
  514. addselopt(valsel,'NULL','non definito');
  515. if (valselval!==false)
  516. selind('valuesel-'+index,valselval);
  517. valinp.style='display:none';
  518. valinp.disabled=true;
  519. valsel.style='display:block';
  520. valsel.disabled=false;
  521. condsel.removeAttribute('onchange');
  522. } else if (type=='text') {
  523. truncsel('condsel-'+index);
  524. addselopt(condsel,'LIKE','contiene');
  525. addselopt(condsel,'NOT LIKE','non contiene');
  526. addselopt(condsel,'=','è uguale a');
  527. addselopt(condsel,'!=','è diverso da');
  528. addselopt(condsel,'>=','è maggiore o uguale a');
  529. addselopt(condsel,'<=','è minore o uguale a');
  530. addselopt(condsel,'>','è maggiore di');
  531. addselopt(condsel,'<','è minore di');
  532. addselopt(condsel,'IS NOT NULL','è definito');
  533. addselopt(condsel,'IS NULL','non è definito');
  534. valsel.style='display:none';
  535. valsel.disabled=true;
  536. valinp.style='display:block';
  537. valinp.disabled=false;
  538. condsel.setAttribute('onchange','inpdisif('+index+');');
  539. } else if (type=='int' || type=='time') {
  540. truncsel('condsel-'+index);
  541. addselopt(condsel,'>=','è maggiore o uguale a');
  542. addselopt(condsel,'<=','è minore o uguale a');
  543. addselopt(condsel,'>','è maggiore di');
  544. addselopt(condsel,'<','è minore di');
  545. addselopt(condsel,'=','è uguale a');
  546. addselopt(condsel,'!=','è diverso da');
  547. addselopt(condsel,'IS NOT NULL','è definito');
  548. addselopt(condsel,'IS NULL','non è definito');
  549. valsel.style='display:none';
  550. valsel.disabled=true;
  551. valinp.style='display:block';
  552. valinp.disabled=false;
  553. condsel.setAttribute('onchange','inpdisif('+index+');');
  554. } else if (type=='join') {
  555. truncsel('condsel-'+index);
  556. addselopt(condsel,'=','è uguale a');
  557. addselopt(condsel,'!=','è diverso da');
  558. addselopt(condsel,'IS NOT NULL','è definito');
  559. addselopt(condsel,'IS NULL','non è definito');
  560. valsel.style='display:block';
  561. valsel.disabled=false;
  562. valinp.style='display:none';
  563. valinp.disabled=true;
  564. condsel.setAttribute('onchange','inpdisif('+index+');');
  565. truncsel('valuesel-'+index);
  566. let xhr=new XMLHttpRequest();
  567. xhr.open('GET','instancesh.php?key='+key);
  568. xhr.responseType='json';
  569. xhr.send();
  570. xhr.onload=function() {
  571. let jarr=xhr.response;
  572. for (i=0; i<jarr.length; i++)
  573. addselopt(valsel,jarr[i][0],jarr[i][1]);
  574. console.log('valsel pronto!');
  575. if (valselval!==false)
  576. selind('valuesel-'+index,valselval);
  577. };
  578. xhr.onerror=function() {
  579. alert('Request failed');
  580. };
  581. } else {
  582. alert('Attenziò: non so che farmene del tipo "'+type+'": diglielo, al programmatore.');
  583. }
  584. }
  585. function addrow(index,refresh) {
  586. var table=document.getElementById('planciafil');
  587. var newrow=table.insertRow(index);
  588. var newcell0=newrow.insertCell(0);
  589. var newcell1=newrow.insertCell(1);
  590. var newcell2=newrow.insertCell(2);
  591. var newcell3=newrow.insertCell(3);
  592. var newcell4=newrow.insertCell(4);
  593. var newcell5=newrow.insertCell(5);
  594. var newcell6=newrow.insertCell(6);
  595. var newcell7=newrow.insertCell(7);
  596. newcell0.innerHTML='<select class="openpar"><option value="null"></option><option value="(">(</option><option value="((">((</option><option value="(((">(((</option></select>';
  597. newcell1.innerHTML='<select class="fieldsel"><?php echo($fieldselopts); ?></select>';
  598. newcell2.innerHTML='<select class="condsel"></select>';
  599. newcell3.innerHTML='<select class="valuesel" style="display:none;"></select><input type="text" class="valueinp" maxlength="256" style="display:none;">';
  600. newcell4.innerHTML='<select class="closepar"><option value="null"></option><option value=")">)</option><option value="))">))</option><option value=")))">)))</option></select>';
  601. newcell5.innerHTML='<select class="andor"><option value="AND">E</option><option value="OR">O</option></select>';
  602. newcell6.innerHTML='<img class="plus" src="imgs/plus.svg">';
  603. newcell7.innerHTML='<img class="minus" src="imgs/minus.svg">';
  604. if (refresh) {
  605. synctai();
  606. popusels(index,false);
  607. }
  608. }
  609. function synctai() {
  610. var i=0;
  611. var table=document.getElementById('planciafil');
  612. var nodes=table.querySelectorAll('.minus');
  613. var cnodes=nodes.length;
  614. for (i=0; i<cnodes; i++)
  615. // +1 sempre per via della row iniziale
  616. nodes[i].setAttribute('onclick','remrow('+(i+1)+');');
  617. nodes=table.querySelectorAll('.plus');
  618. for (i=0; i<cnodes; i++)
  619. // +2 perché la devi aggiungere dopo la corrente
  620. nodes[i].setAttribute('onclick','addrow('+(i+2)+',true);');
  621. // da qui in poi faccio a scendere per non avere mai id e nomi duplicati
  622. cnodes--;
  623. nodes=table.querySelectorAll('.openpar');
  624. for (i=cnodes; i>-1; i--) {
  625. nodes[i].setAttribute('id','openpar-'+(i+1));
  626. nodes[i].setAttribute('name','openpar-'+(i+1));
  627. }
  628. nodes=table.querySelectorAll('.fieldsel');
  629. for (i=cnodes; i>-1; i--) {
  630. nodes[i].setAttribute('id','fieldsel-'+(i+1));
  631. nodes[i].setAttribute('name','fieldsel-'+(i+1));
  632. nodes[i].setAttribute('onchange','popusels('+(i+1)+',false);');
  633. }
  634. nodes=table.querySelectorAll('.condsel');
  635. for (i=cnodes; i>-1; i--) {
  636. nodes[i].setAttribute('id','condsel-'+(i+1));
  637. nodes[i].setAttribute('name','condsel-'+(i+1));
  638. }
  639. nodes=table.querySelectorAll('.valuesel');
  640. for (i=cnodes; i>-1; i--) {
  641. nodes[i].setAttribute('id','valuesel-'+(i+1));
  642. nodes[i].setAttribute('name','valuesel-'+(i+1));
  643. }
  644. nodes=table.querySelectorAll('.valueinp');
  645. for (i=cnodes; i>-1; i--) {
  646. nodes[i].setAttribute('id','valueinp-'+(i+1));
  647. nodes[i].setAttribute('name','valueinp-'+(i+1));
  648. }
  649. nodes=table.querySelectorAll('.closepar');
  650. for (i=cnodes; i>-1; i--) {
  651. nodes[i].setAttribute('id','closepar-'+(i+1));
  652. nodes[i].setAttribute('name','closepar-'+(i+1));
  653. }
  654. nodes=table.querySelectorAll('.andor');
  655. for (i=cnodes; i>-1; i--) {
  656. nodes[i].setAttribute('id','andor-'+(i+1));
  657. nodes[i].setAttribute('name','andor-'+(i+1));
  658. nodes[i].disabled=false;
  659. }
  660. if (cnodes>=0)
  661. nodes[cnodes].disabled=true;
  662. }
  663. function selind(id,val) {
  664. var el=document.getElementById(id), i=0, found=false;
  665. while (!found && i<el.length) {
  666. if (el[i].value==val) {
  667. el.selectedIndex=i;
  668. found=true;
  669. }
  670. i++;
  671. }
  672. if (!found)
  673. console.log('"'+val+'" non è stato trovato in "'+id+'"');
  674. }
  675. function setrow(index,openparv,fieldselv,condselv,valueselv,valueinpv,closeparv,andorv) {
  676. selind('openpar-'+index,openparv);
  677. selind('fieldsel-'+index,fieldselv);
  678. popusels(index,valueselv);
  679. selind('condsel-'+index,condselv);
  680. // selind('valuesel-'+index,valueselv);
  681. document.getElementById('valueinp-'+index).value=valueinpv;
  682. if (condselv=='IS NULL' || condselv=='IS NOT NULL') {
  683. document.getElementById('valueinp-'+index).disabled=true;
  684. document.getElementById('valuesel-'+index).disabled=true;
  685. }
  686. selind('closepar-'+index,closeparv);
  687. selind('andor-'+index,andorv);
  688. }
  689. function remrow(index) {
  690. var table=document.getElementById('planciafil');
  691. table.deleteRow(index);
  692. synctai();
  693. if (table.rows.length<2)
  694. document.getElementById('filbut').value='Aggiungi criteri di ricerca';
  695. }
  696. function truncfil() {
  697. var table=document.getElementById('planciafil');
  698. while (table.rows.length>1)
  699. remrow(1);
  700. }
  701. function manfil() {
  702. var filbut=document.getElementById('filbut');
  703. var table=document.getElementById('planciafil');
  704. var crows=table.rows.length;
  705. if (crows<2) {
  706. addrow(1,true);
  707. filbut.value='Rimuovi tutti i criteri di ricerca';
  708. } else {
  709. confirma('Confermi di voler rimuovere tutti i criteri di ricerca?','truncfil();filbut.value=\'Aggiungi criteri di ricerca\'');
  710. }
  711. }
  712. function ckpar() {
  713. var i=0;
  714. var table=document.getElementById('planciafil');
  715. var nodes=table.querySelectorAll('.openpar');
  716. var cnodes=nodes.length;
  717. var opars=[];
  718. var cpars=[];
  719. for (i=0; i<cnodes; i++)
  720. opars.push(nodes[i].value);
  721. nodes=table.querySelectorAll('.closepar');
  722. for (i=0; i<cnodes; i++)
  723. cpars.push(nodes[i].value);
  724. var spars='';
  725. for (i=0; i<cnodes; i++) {
  726. if (opars[i]!='null') spars+=opars[i];
  727. if (cpars[i]!='null') spars+=cpars[i];
  728. }
  729. var opq=0, cpq=0, ok=true;
  730. for (i=0; i<spars.length; i++) {
  731. if (spars[i]=='(') {
  732. opq++;
  733. } else if (spars[i]==')') {
  734. cpq++;
  735. }
  736. if (cpq>opq)
  737. break;
  738. }
  739. if (opq!=cpq)
  740. ok=false;
  741. console.log(i+'/'+spars.length+': '+ok);
  742. return ok;
  743. }
  744. function ckf() {
  745. var emsg='';
  746. if (!ckpar()) emsg+='Qualcosa non va con le parentesi!<br>\n';
  747. // emsg+='Comunque NO!<br>\n';
  748. if (emsg=='') {
  749. var table=document.getElementById('planciafil');
  750. var crows=table.rows.length;
  751. if (crows>1)
  752. document.getElementById('andor-'+(crows-1)).disabled=false;
  753. document.getElementById('f').submit();
  754. } else {
  755. alerta(emsg);
  756. }
  757. }
  758. //-->
  759. </script>
  760. </head>
  761. <body>
  762. <nav>
  763. <div id="hmenu">
  764. <ul>
  765. <?php echo($menuout); ?>
  766. </ul>
  767. <div id="rightdiv">
  768. <div id="plctrl" class="rlinks" onclick="shideplancia();">Mostra plancia</div>
  769. <div id="logout" class="rlinks"><a href="logout.php">Esci</a></div>
  770. </div>
  771. </nav>
  772. <div id="popup">
  773. <div id="inpopup">
  774. <div id="popupcont">
  775. ...
  776. </div>
  777. </div>
  778. </div>
  779. <div id="footer">
  780. <form action="edinst.php" name="addinst" method="post">
  781. <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>
  782. </form>
  783. </div>
  784. <div id="debug">
  785. <?php echo($dbg); ?>
  786. </div>
  787. <form method="post" id="f">
  788. <div id="plancia">
  789. <table id="planciafil" class="planciatab">
  790. <tr><td colspan="8"><input type="button" id="filbut" value="Aggiungi criteri di ricerca" class="ctrlbut" onclick="manfil();"></td></tr>
  791. </table>
  792. <table id="planciaord" class="planciatab">
  793. <tr><td colspan="8"><input type="button" id="ordbut" value="Aggiungi criteri di ordinamento" class="ctrlbut" onclick="alert('Aspetta!')"></td></tr>
  794. </table>
  795. <table id="planciaothers" class="planciatab">
  796. <tr><td><input type="button" id="subbut" value="Applica" class="ctrlbut" onclick="ckf();"></td></tr>
  797. </table>
  798. </div>
  799. </form>
  800. <script language="JavaScript">
  801. <!--
  802. <?php
  803. echo($jsaddrows);
  804. echo($jssetrows);
  805. ?>
  806. //-->
  807. </script>
  808. <div id="fullscreen">
  809. <div id="middlerow">
  810. <?php echo($out); ?>
  811. </div>
  812. </div>
  813. </body>
  814. </html>