instances.php 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999
  1. <?php
  2. require '../../lib/glob.php';
  3. require '../../lib/muoribene.php';
  4. require '../../lib/sessionstart.php';
  5. require '../../lib/myconn.php';
  6. require '../../lib/getadmacc.php';
  7. if ($account['Level']=='guest')
  8. muoribene('Sorry, you are not authorized.',true);
  9. require '../../lib/n2es.php';
  10. require '../../lib/menu.php';
  11. $menu['menu']['selected']=true;
  12. $menu['menu']['submenu']['instances']['href']=null;
  13. $menu['menu']['submenu']['instances']['selected']=true;
  14. buildmenu($menu);
  15. $dbg='';
  16. $dbg.='$account: <pre>'.print_r($account,1).'</pre>'.N;
  17. use function mysqli_real_escape_string as myesc;
  18. // praticamente una macro
  19. function hspech($str) {
  20. return(htmlspecialchars($str,ENT_QUOTES|ENT_HTML5,'UTF-8'));
  21. }
  22. require '../../lib/columns.php';
  23. $types=array('bool','int','time','text','join','joini');
  24. $fieldselopts='';
  25. $ordfieldselopts='';
  26. foreach ($cols as $key=>$arr) {
  27. if (!array_key_exists('search',$arr) || $arr['search']==true) {
  28. if ($arr['type']=='joini') {
  29. $fieldselopts.='<option value="'.$key.':'.$arr['type'].':'.$arr['subtype'].'">'.$arr['name'].'</option>';
  30. } else {
  31. $fieldselopts.='<option value="'.$key.':'.$arr['type'].':null">'.$arr['name'].'</option>';
  32. }
  33. }
  34. if (!array_key_exists('ord',$arr) || $arr['ord']==true) {
  35. if (!array_key_exists('ordname',$arr))
  36. $name=$arr['name'];
  37. else
  38. $name=$arr['ordname'];
  39. if ($arr['type']=='joini') {
  40. $ordfieldselopts.='<option value="'.$key.':'.$arr['type'].':'.$arr['subtype'].'">'.$name.'</option>';
  41. } else {
  42. $ordfieldselopts.='<option value="'.$key.':'.$arr['type'].':null">'.$name.'</option>';
  43. }
  44. }
  45. }
  46. $dbg.='$_POST: <pre>'.print_r($_POST,1).'</pre>';
  47. $page=$account['Page'];
  48. if (array_key_exists('filt',$_POST) && $_POST['filt']=='filt') {
  49. $page=0;
  50. $blocks=0;
  51. foreach ($_POST as $key=>$val)
  52. if (preg_match('/^openpar-\d+$/',$key)===1)
  53. $blocks++;
  54. $fi=0;
  55. $oi=0;
  56. $admpresques=array('DELETE FROM PresFiltCondsAdm WHERE AdmID='.$account['ID'],'DELETE FROM PresOrdCondsAdm WHERE AdmID='.$account['ID']);
  57. foreach ($_POST as $key=>$val) {
  58. if (preg_match('/^openpar-\d+$/',$key)===1) {
  59. $fi++;
  60. $admpresque='INSERT INTO PresFiltCondsAdm SET AdmID='.$account['ID'].', ';
  61. if (preg_match('/^\(+$/',$val)===1)
  62. $admpresque.='OpenPar=\''.myesc($link,$val).'\', ';
  63. else
  64. $admpresque.='OpenPar=NULL, ';
  65. }
  66. if (preg_match('/^fieldsel-\d+$/',$key)===1 && preg_match('/^(.+):(.+):(.+)$/',$val,$buf)===1) {
  67. $tagk=$buf[1];
  68. $type=$buf[2];
  69. $subtype=$buf[3];
  70. if (array_key_exists($tagk,$cols) && in_array($type,$types)) {
  71. $admpresque.='Field=\''.myesc($link,$val).'\', ';
  72. } else {
  73. muoribene($dbg.'<br>Dati POST corrotti.<br>Puoi <a href="instances.php">riprovare resettando i parametri</a> o <a href="index.php">tornare al login</a>.',true);
  74. }
  75. }
  76. if (preg_match('/^condsel-\d+$/',$key)===1) {
  77. $admpresque.='Cond=\''.myesc($link,$val).'\', ';
  78. }
  79. if (preg_match('/^valuesel-\d+$/',$key)===1) {
  80. $admpresque.='ValueSel=\''.myesc($link,$val).'\', ';
  81. }
  82. if (preg_match('/^valueinp-\d+$/',$key)===1) {
  83. $admpresque.='ValueInp=\''.myesc($link,$val).'\', ';
  84. }
  85. if (preg_match('/^closepar-\d+$/',$key)===1) {
  86. if (preg_match('/^\)+$/',$val)===1)
  87. $admpresque.='ClosePar=\''.myesc($link,$val).'\', ';
  88. else
  89. $admpresque.='ClosePar=NULL, ';
  90. }
  91. if (preg_match('/^andor-\d+$/',$key)===1 && preg_match('/^AND|OR$/',$val)===1) {
  92. if ($fi<$blocks)
  93. $admpresque.='AndOr=\''.myesc($link,$val).'\', ';
  94. else
  95. $admpresque.='AndOr=NULL, ';
  96. $admpresque.='Pos='.$fi;
  97. $admpresques[]=$admpresque;
  98. }
  99. if (preg_match('/^ordfieldsel-\d+$/',$key)===1 && preg_match('/^(.+):(.+):(.+)$/',$val,$buf)===1) {
  100. $oi++;
  101. $tagk=$buf[1];
  102. $type=$buf[2];
  103. $subtype=$buf[3];
  104. if (array_key_exists($tagk,$cols) && in_array($type,$types)) {
  105. $admpresque='INSERT INTO PresOrdCondsAdm SET AdmID='.$account['ID'].', Field=\''.myesc($link,$val).'\', ';
  106. } else {
  107. muoribene($dbg.'<br>Dati POST corrotti.<br>Puoi <a href="instances.php">riprovare resettando i parametri</a> o <a href="index.php">tornare al login</a>.',true);
  108. }
  109. }
  110. if (preg_match('/^ascdesc-\d+$/',$key)===1 && preg_match('/^ASC|DESC$/',$val)===1) {
  111. $admpresque.='Sort=\''.myesc($link,$val).'\', Pos='.$oi;
  112. $admpresques[]=$admpresque;
  113. }
  114. }
  115. $dbg.='$admpresques: <pre>'.print_r($admpresques,1).'</pre>'.N;
  116. foreach ($admpresques as $que)
  117. mysqli_query($link,$que)
  118. or muoribene(__LINE__.': '.$dbg.'<br>'.N.mysqli_error($link),true);
  119. } elseif (array_key_exists('pageselect',$_POST) && preg_match('/^[0-9]+$/',$_POST['pageselect'])===1) {
  120. $page=$_POST['pageselect']+0;
  121. mysqli_query($link,'UPDATE Admins SET Page='.$page.' WHERE ID='.$account['ID'])
  122. or muoribene(__LINE__.': '.$dbg.'<br>'.N.mysqli_error($link),true);
  123. }
  124. $fi=0;
  125. $ji=0;
  126. $oi=0;
  127. $filtordon=false;
  128. $jsaddrows='';
  129. $jssetrows='';
  130. $jsordaddrows='';
  131. $jsordsetrows='';
  132. $sels=array();
  133. $joins=array();
  134. $havings=array();
  135. $where='';
  136. $order='';
  137. $res=mysqli_query($link,'SELECT * FROM PresFiltCondsAdm WHERE AdmID='.$account['ID'].' ORDER BY Pos ASC')
  138. or muoribene(__LINE__.': '.mysqli_error($link));
  139. $blocks=mysqli_num_rows($res);
  140. if ($blocks>0) $filtordon=true;
  141. while ($row=mysqli_fetch_assoc($res)) {
  142. $fi++;
  143. if (preg_match('/^\(+$/',n2es($row['OpenPar']))===1) {
  144. $where.=$row['OpenPar'];
  145. $jssetrows.='setrow('.$fi.','.json_encode($row['OpenPar']);
  146. } else {
  147. $jssetrows.='setrow('.$fi.',"null"';
  148. }
  149. $jsaddrows.='addrow('.$fi.',false);'.N;
  150. preg_match('/^(.+):(.+):(.+)$/',$row['Field'],$buf);
  151. $tagk=$buf[1];
  152. $type=$buf[2];
  153. $subtype=$buf[3];
  154. if (array_key_exists($tagk,$cols) && in_array($type,$types)) {
  155. ($tagk=='Instances.AdmCreatedAt') ? $inpisdate=true : $inpisdate=false;
  156. if (strpos($cols[$tagk]['field'],'%')!==false)
  157. $ji++;
  158. $where.=str_replace('%',$ji,$cols[$tagk]['field']);
  159. if ($type=='join' || $type=='joini') {
  160. foreach ($cols[$tagk]['join'] as $join) {
  161. $join=str_replace('%',$ji,$join);
  162. if (!in_array($join,$joins))
  163. $joins[]=$join;
  164. }
  165. }
  166. if (array_key_exists('havings',$cols[$tagk]) && !in_array($cols[$tagk]['havings'],$havings))
  167. $havings[]=$cols[$tagk]['havings'];
  168. if (array_key_exists('selmore',$cols[$tagk]) && !in_array($cols[$tagk]['selmore'],$sels))
  169. $sels[]=$cols[$tagk]['selmore'];
  170. $jssetrows.=','.json_encode($row['Field']);
  171. }
  172. $where.=' '.$row['Cond'].' ';
  173. $cond=$row['Cond'];
  174. $jssetrows.=','.json_encode($row['Cond']);
  175. // nel caso qui sotto, valuesel e valueinp sono entrambi disabilitati (non ci sono in $_POST), quindi li riempio di introvabile e nulla
  176. if (preg_match('/^IS NULL|IS NOT NULL$/',$row['Cond'])===1)
  177. $jssetrows.=',"NOMMITROVI!",""';
  178. if (!is_null($row['ValueSel'])) {
  179. $where.=$row['ValueSel'];
  180. $jssetrows.=','.json_encode($row['ValueSel']);
  181. $jssetrows.=',""';
  182. }
  183. if (!is_null($row['ValueInp'])) {
  184. if ($inpisdate && preg_match('/^([0-9]{1,2}) ([0-9]{1,2}) ([0-9]{4,5})$/',$row['ValueInp'],$buf)===1) {
  185. $where.=mktime(0,0,0,$buf[2]+0,$buf[1]+0,$buf[3]+0);
  186. } elseif (preg_match('/^LIKE|NOT LIKE$/',$cond)===1) {
  187. $where.='\'%'.myesc($link,$row['ValueInp']).'%\'';
  188. } else {
  189. $where.='\''.myesc($link,$row['ValueInp']).'\'';
  190. }
  191. $jssetrows.=',"NOMMITROVI!"';
  192. $jssetrows.=','.json_encode($row['ValueInp']);
  193. }
  194. if (preg_match('/^\)+$/',n2es($row['ClosePar']))===1) {
  195. $where.=$row['ClosePar'];
  196. $jssetrows.=','.json_encode($row['ClosePar']);
  197. } else {
  198. $jssetrows.=',"null"';
  199. }
  200. if (preg_match('/^AND|OR$/',n2es($row['AndOr']))===1) {
  201. if ($fi<$blocks)
  202. $where.=' '.$row['AndOr'].' ';
  203. $jssetrows.=','.json_encode($row['AndOr']).');'.N;
  204. } else {
  205. $jssetrows.=',"AND");'.N;
  206. }
  207. }
  208. $res=mysqli_query($link,'SELECT * FROM PresOrdCondsAdm WHERE AdmID='.$account['ID'].' ORDER BY Pos ASC')
  209. or muoribene(__LINE__.': '.mysqli_error($link));
  210. if (mysqli_num_rows($res)>0) $filtordon=true;
  211. while ($row=mysqli_fetch_assoc($res)) {
  212. preg_match('/^(.+):(.+):(.+)$/',$row['Field'],$buf);
  213. $oi++;
  214. $tagk=$buf[1];
  215. $type=$buf[2];
  216. $subtype=$buf[3];
  217. if (array_key_exists($tagk,$cols) && in_array($type,$types)) {
  218. if ($type=='join' || $type=='joini') {
  219. if (!array_key_exists('ordjoin',$cols[$tagk])) {
  220. foreach ($cols[$tagk]['join'] as $join)
  221. if (!in_array($join,$joins))
  222. $joins[]=$join;
  223. } else {
  224. foreach ($cols[$tagk]['ordjoin'] as $join)
  225. if (!in_array($join,$joins))
  226. $joins[]=$join;
  227. }
  228. }
  229. if (!array_key_exists('ordby',$cols[$tagk])) {
  230. $order.=$cols[$tagk]['field'];
  231. } else {
  232. if (!in_array($cols[$tagk]['ordselmore'],$sels))
  233. $sels[]=$cols[$tagk]['ordselmore'];
  234. $order.=$cols[$tagk]['ordby'];
  235. }
  236. if (array_key_exists('havings',$cols[$tagk]) && !in_array($cols[$tagk]['havings'],$havings))
  237. $havings[]=$cols[$tagk]['havings'];
  238. if (array_key_exists('selmore',$cols[$tagk]) && !in_array($cols[$tagk]['selmore'],$sels))
  239. $sels[]=$cols[$tagk]['selmore'];
  240. $jsordaddrows.='ordaddrow('.$oi.',false);'.N;
  241. $jsordsetrows.='ordsetrow('.$oi.','.json_encode($row['Field']);
  242. } else {
  243. muoribene($dbg.'<br>Dati db corrotti.<br>Puoi <a href="instances.php">riprovare resettando i parametri</a> o <a href="index.php">tornare al login</a>.',true);
  244. }
  245. $order.=' '.$row['Sort'].', ';
  246. $jsordsetrows.=','.json_encode($row['Sort']).');'.N;
  247. }
  248. if ($jsaddrows!='') {
  249. $jsaddrows.='document.getElementById("filbut").value="Rimuovi tutti i criteri di filtraggio";'.N;
  250. $jsaddrows.='synctai();'.N;
  251. }
  252. if ($jsordaddrows!='') {
  253. $jsordaddrows.='document.getElementById("ordbut").value="Rimuovi tutti i criteri di ordinamento";'.N;
  254. $jsordaddrows.='synctoi();'.N;
  255. }
  256. if (count($sels)>0)
  257. $sels=', '.implode(', ',$sels);
  258. else
  259. $sels='';
  260. if ($where!='')
  261. $where='WHERE '.$where;
  262. if ($order!='')
  263. $order='ORDER BY '.substr($order,0,-2);
  264. $dbg.='ORDER: '.$order.'<br>';
  265. if (count($joins)>0)
  266. $joins='LEFT JOIN '.implode(' LEFT JOIN ',$joins);
  267. else
  268. $joins='';
  269. if (count($havings)>0)
  270. $havings='HAVING '.implode(' AND ',$havings);
  271. else
  272. $havings='';
  273. $query='SELECT *, Instances.ID AS IID '.$sels.' FROM Instances '.$joins.' '.$where.' GROUP BY IID '.$havings.' '.$order;
  274. $dbg.='QUERONA: '.$query.'<br>'.N;
  275. $tini=microtime(true);
  276. $res=mysqli_query($link,$query)
  277. or muoribene($dbg.'<br>'.$query.': '.mysqli_error($link).'<br>'.'La query è fallita. <a href="instances.php">Resetta</a>.',true);
  278. $dbg.='Durata esecuzione query: '.round(microtime(true)-$tini,4).' sec.<br>'.N;
  279. $cinsts=mysqli_num_rows($res);
  280. $iperp=25;
  281. if ($page*$iperp>$cinsts)
  282. $page=0;
  283. $finst=$page*$iperp;
  284. if (mysqli_num_rows($res)<1) {
  285. $pgout='';
  286. $out='<p>Nessuna istanza da mostrare.</p>'.N;
  287. } else {
  288. // $pgout='Pag. '.($page+1).'/'.(ceil($cinsts/$iperp)-1);
  289. $pgout='<form method="post" id="pform">'.N;
  290. $pgout.='<select id="pageselect" name="pageselect" onchange="document.getElementById(\'pform\').submit()">'.N;
  291. $totp=ceil($cinsts/$iperp);
  292. for ($i=0; $i<$totp; $i++) {
  293. $lastpi=$i*$iperp+$iperp;
  294. if ($lastpi>$cinsts) $lastpi=$cinsts;
  295. ($i!=$page) ? $selected='' : $selected=' selected';
  296. $pgout.='<option value="'.$i.'"'.$selected.'>Pagina '.($i+1).'/'.$totp.' (Istanze '.($i*$iperp+1).'-'.$lastpi.'/'.$cinsts.')</option>'.N;
  297. }
  298. $pgout.='</select>'.N;
  299. $pgout.='</form>';
  300. // ---
  301. mysqli_data_seek($res,$finst);
  302. $out='';
  303. $i=$finst;
  304. $ii=0;
  305. require '../../lib/dispinst.php';
  306. while ($row=mysqli_fetch_assoc($res)) {
  307. $i++;
  308. $ii++;
  309. if ($ii>$iperp) break;
  310. $out.=dispinst($row,$cols,$link,$dlang,$account,true,$i,$cinsts,$graceline);
  311. }
  312. $out.='<div class="bigtabfoot"></div>'.N;
  313. }
  314. $presid=0;
  315. if (array_key_exists('presets',$_POST) && preg_match('/^[0-9]+$/',$_POST['presets'])===1)
  316. $presid=$_POST['presets'];
  317. $presopts='<option value="null"></option>'.N;
  318. $res=mysqli_query($link,'SELECT * FROM Presets ORDER BY LENGTH(Name) ASC, Name ASC')
  319. or muoribene(mysqli_error($link),true);
  320. while ($row=mysqli_fetch_assoc($res)) {
  321. if ($row['ID']!=$presid)
  322. $presopts.='<option value="'.$row['ID'].'">'.hspech($row['Name']).'</option>'.N;
  323. else
  324. $presopts.='<option value="'.$row['ID'].'" selected>'.hspech($row['Name']).'</option>'.N;
  325. }
  326. require '../../lib/notifs.php';
  327. $notifs=notifs($link);
  328. mysqli_close($link);
  329. if ($filtordon) {
  330. $filtordimgoff='imgs/cerca_act_off.svg';
  331. $filtordimgon='imgs/cerca_act_on.svg';
  332. } else {
  333. $filtordimgoff='imgs/cerca_off.svg';
  334. $filtordimgon='imgs/cerca_on.svg';
  335. }
  336. ?>
  337. <!DOCTYPE HTML>
  338. <html lang="it">
  339. <head>
  340. <title>Mustard - Elenco istanze</title>
  341. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  342. <meta name="description" content="Admin pages for Mastodon Help">
  343. <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
  344. <link rel="icon" type="image/png" href="imgs/icona-32.png" sizes="32x32">
  345. <link rel="icon" type="image/png" href="imgs/icona-192.png" sizes="192x192">
  346. <link rel="icon" type="image/png" href="imgs/icona-512.png" sizes="512x512">
  347. <link rel="apple-touch-icon-precomposed" href="imgs/icona-180.png">
  348. <script language="JavaScript" src="js/menu.js?v=<?php echo($cjrand); ?>"></script>
  349. <script language="JavaScript" src="js/confirma.js?v=<?php echo($cjrand); ?>"></script>
  350. <script language="JavaScript" src="js/alerta.js?v=<?php echo($cjrand); ?>"></script>
  351. <link rel="stylesheet" type="text/css" href="css/theme.css?v=<?php echo($cjrand); ?>">
  352. <script language="JavaScript">
  353. <!--
  354. <?php require 'js/notifs.js.php'; ?>
  355. function shideplancia() {
  356. var plancia=document.getElementById('plancia');
  357. var plctrl=document.getElementById('lente');
  358. if (plancia.style.display=='block') {
  359. plancia.style.display='none';
  360. plctrl.src='<?php echo($filtordimgoff); ?>';
  361. plctrl.title='Mostra il pannello di filtraggio e ordinamento';
  362. } else {
  363. plancia.style.display='block';
  364. plctrl.src='<?php echo($filtordimgon); ?>';
  365. plctrl.title='Nascondi il pannello di filtraggio e ordinamento';
  366. }
  367. }
  368. function hent(str) {
  369. return str.replace(/&/g,'&amp;').replace(/>/g,'&gt;').replace(/</g,'&lt;').replace(/"/g,'&quot;');
  370. }
  371. function truncsel(el) {
  372. var sel=document.getElementById(el);
  373. sel.length=0;
  374. }
  375. function inpdisif(index) {
  376. console.log('inpdisif index: '+index);
  377. var source=document.getElementById('condsel-'+index);
  378. var inp=document.getElementById('valueinp-'+index);
  379. var sel=document.getElementById('valuesel-'+index);
  380. var conds=['IS NULL','IS NOT NULL'];
  381. if (conds.includes(source.value)) {
  382. inp.disabled=true;
  383. sel.disabled=true;
  384. } else {
  385. if (inp.style.display!='none') inp.disabled=false;
  386. if (sel.style.display!='none') sel.disabled=false;
  387. }
  388. }
  389. function popusels(index,valselval) {
  390. console.log('popusels index: '+index);
  391. var key=document.getElementById('fieldsel-'+index).value;
  392. var type=key.replace(/^.*:(.*):.*$/,'$1');
  393. var subtype=key.replace(/^.*:.*:(.*)$/,'$1');
  394. key=key.replace(/^(.*):.*:.*$/,'$1');
  395. var condsel=document.getElementById('condsel-'+index);
  396. var valsel=document.getElementById('valuesel-'+index);
  397. var valinp=document.getElementById('valueinp-'+index);
  398. condsel.setAttribute('onchange','inpdisif('+index+');');
  399. if (type=='joini')
  400. type=subtype;
  401. if (type=='bool') {
  402. truncsel('condsel-'+index);
  403. condsel.add(new Option('è','IS'));
  404. truncsel('valuesel-'+index);
  405. valsel.add(new Option('vero','TRUE'));
  406. valsel.add(new Option('falso','FALSE'));
  407. valsel.add(new Option('definit@','NOT NULL'));
  408. valsel.add(new Option('non definit@','NULL'));
  409. if (valselval!==false)
  410. selind('valuesel-'+index,valselval);
  411. valinp.style.display='none';
  412. valinp.disabled=true;
  413. valsel.style.display='block';
  414. valsel.disabled=false;
  415. } else if (type=='text') {
  416. truncsel('condsel-'+index);
  417. condsel.add(new Option('contiene','LIKE'));
  418. condsel.add(new Option('non contiene','NOT LIKE'));
  419. condsel.add(new Option('è uguale a','='));
  420. condsel.add(new Option('è divers@ da','!='));
  421. condsel.add(new Option('è maggiore o uguale a','>='));
  422. condsel.add(new Option('è minore o uguale a','<='));
  423. condsel.add(new Option('è maggiore di','>'));
  424. condsel.add(new Option('è minore di','<'));
  425. condsel.add(new Option('è definit@','IS NOT NULL'));
  426. condsel.add(new Option('non è definit@','IS NULL'));
  427. valsel.style.display='none';
  428. valsel.disabled=true;
  429. valinp.style.display='block';
  430. valinp.disabled=false;
  431. } else if (type=='int' || type=='time') {
  432. truncsel('condsel-'+index);
  433. condsel.add(new Option('è maggiore o uguale a','>='));
  434. condsel.add(new Option('è minore o uguale a','<='));
  435. condsel.add(new Option('è maggiore di','>'));
  436. condsel.add(new Option('è minore di','<'));
  437. condsel.add(new Option('è uguale a','='));
  438. condsel.add(new Option('è divers@ da','!='));
  439. condsel.add(new Option('è definit@','IS NOT NULL'));
  440. condsel.add(new Option('non è definit@','IS NULL'));
  441. valsel.style.display='none';
  442. valsel.disabled=true;
  443. valinp.style.display='block';
  444. valinp.disabled=false;
  445. } else if (type=='join') {
  446. truncsel('condsel-'+index);
  447. condsel.add(new Option('è uguale a','='));
  448. condsel.add(new Option('è divers@ da','!='));
  449. condsel.add(new Option('è definit@','IS NOT NULL'));
  450. condsel.add(new Option('non è definit@','IS NULL'));
  451. valsel.style.display='block';
  452. valsel.disabled=false;
  453. valinp.style.display='none';
  454. valinp.disabled=true;
  455. truncsel('valuesel-'+index);
  456. pupwait(true);
  457. let xhr=new XMLHttpRequest();
  458. xhr.open('GET','instancesh.php?key='+key);
  459. xhr.responseType='json';
  460. xhr.send();
  461. xhr.onload=function() {
  462. let jarr=xhr.response;
  463. for (i=0; i<jarr.length; i++)
  464. valsel.add(new Option(jarr[i][1],jarr[i][0]));
  465. console.log('valsel pronto!');
  466. if (valselval!==false)
  467. selind('valuesel-'+index,valselval);
  468. pupwait(false);
  469. };
  470. xhr.onerror=function() {
  471. pupwait(false);
  472. alert('La richiesta è fallita.');
  473. };
  474. } else {
  475. alert('Attenziò: non so che farmene del tipo "'+type+'": diglielo, al programmatore.');
  476. }
  477. }
  478. function addrow(index,refresh) {
  479. var table=document.getElementById('planciafil');
  480. if (table.rows.length<9) {
  481. var newrow=table.insertRow(index);
  482. var newcell0=newrow.insertCell(0);
  483. var newcell1=newrow.insertCell(1);
  484. var newcell2=newrow.insertCell(2);
  485. var newcell3=newrow.insertCell(3);
  486. var newcell4=newrow.insertCell(4);
  487. var newcell5=newrow.insertCell(5);
  488. var newcell6=newrow.insertCell(6);
  489. var newcell7=newrow.insertCell(7);
  490. newcell0.innerHTML='<select class="openpar"><option value="null"></option><option value="(">(</option><option value="((">((</option><option value="(((">(((</option></select>';
  491. newcell1.innerHTML='<select class="fieldsel"><?php echo($fieldselopts); ?></select>';
  492. newcell2.innerHTML='<select class="condsel"></select>';
  493. newcell3.innerHTML='<select class="valuesel" style="display:none;"></select><input type="text" class="valueinp" maxlength="256" style="display:none;">';
  494. newcell4.innerHTML='<select class="closepar"><option value="null"></option><option value=")">)</option><option value="))">))</option><option value=")))">)))</option></select>';
  495. newcell5.innerHTML='<select class="andor"><option value="AND">E</option><option value="OR">O</option></select>';
  496. newcell6.innerHTML='<img class="plus" src="imgs/plus.svg" title="Aggiungi un criterio sotto questo">';
  497. newcell6.style.width='22px';
  498. newcell7.innerHTML='<img class="minus" src="imgs/minus.svg" title="Rimuovi questo criterio">';
  499. newcell7.style.width='22px';
  500. if (refresh) {
  501. synctai();
  502. popusels(index,false);
  503. }
  504. } else {
  505. alerta('Attenzione','<p>Non è possibile impostare più di 8 criteri di filtraggio.</p>');
  506. }
  507. }
  508. function ordaddrow(index,refresh) {
  509. var table=document.getElementById('planciaord');
  510. if (table.rows.length<7) {
  511. var newrow=table.insertRow(index);
  512. var newcell0=newrow.insertCell(0);
  513. var newcell1=newrow.insertCell(1);
  514. var newcell2=newrow.insertCell(2);
  515. var newcell3=newrow.insertCell(3);
  516. newcell0.style.width='97%';
  517. newcell1.style.width='1%';
  518. newcell2.style.width='1%';
  519. newcell3.style.width='1%';
  520. newcell0.innerHTML='<select class="ordfieldsel"><?php echo($ordfieldselopts); ?></select>';
  521. newcell1.innerHTML='<select class="ascdesc"><option value="ASC">Crescente</option><option value="DESC">Decrescente</option></select>';
  522. newcell2.innerHTML='<img class="plus" src="imgs/plus.svg" title="Aggiungi un criterio sotto questo">';
  523. newcell3.innerHTML='<img class="minus" src="imgs/minus.svg" title="Rimuovi questo criterio">';
  524. if (refresh)
  525. synctoi();
  526. } else {
  527. alerta('Attenzione','<p>Non è possibile impostare più di 6 criteri di ordinamento.<p>');
  528. }
  529. }
  530. function synctai() {
  531. var i=0;
  532. var table=document.getElementById('planciafil');
  533. var nodes=table.querySelectorAll('.minus');
  534. var cnodes=nodes.length;
  535. for (i=0; i<cnodes; i++)
  536. // +1 sempre per via della row iniziale
  537. nodes[i].setAttribute('onclick','remrow('+(i+1)+');');
  538. nodes=table.querySelectorAll('.plus');
  539. for (i=0; i<cnodes; i++)
  540. // +2 perché la devi aggiungere dopo la corrente
  541. nodes[i].setAttribute('onclick','addrow('+(i+2)+',true);');
  542. // da qui in poi faccio a scendere per non avere mai id e nomi duplicati
  543. cnodes--;
  544. nodes=table.querySelectorAll('.openpar');
  545. for (i=cnodes; i>-1; i--) {
  546. nodes[i].setAttribute('id','openpar-'+(i+1));
  547. nodes[i].setAttribute('name','openpar-'+(i+1));
  548. }
  549. nodes=table.querySelectorAll('.fieldsel');
  550. for (i=cnodes; i>-1; i--) {
  551. nodes[i].setAttribute('id','fieldsel-'+(i+1));
  552. nodes[i].setAttribute('name','fieldsel-'+(i+1));
  553. nodes[i].setAttribute('onchange','popusels('+(i+1)+',false);');
  554. }
  555. nodes=table.querySelectorAll('.condsel');
  556. for (i=cnodes; i>-1; i--) {
  557. nodes[i].setAttribute('id','condsel-'+(i+1));
  558. nodes[i].setAttribute('name','condsel-'+(i+1));
  559. nodes[i].setAttribute('onchange','inpdisif('+(i+1)+');');
  560. }
  561. nodes=table.querySelectorAll('.valuesel');
  562. for (i=cnodes; i>-1; i--) {
  563. nodes[i].setAttribute('id','valuesel-'+(i+1));
  564. nodes[i].setAttribute('name','valuesel-'+(i+1));
  565. }
  566. nodes=table.querySelectorAll('.valueinp');
  567. for (i=cnodes; i>-1; i--) {
  568. nodes[i].setAttribute('id','valueinp-'+(i+1));
  569. nodes[i].setAttribute('name','valueinp-'+(i+1));
  570. }
  571. nodes=table.querySelectorAll('.closepar');
  572. for (i=cnodes; i>-1; i--) {
  573. nodes[i].setAttribute('id','closepar-'+(i+1));
  574. nodes[i].setAttribute('name','closepar-'+(i+1));
  575. }
  576. nodes=table.querySelectorAll('.andor');
  577. for (i=cnodes; i>-1; i--) {
  578. nodes[i].setAttribute('id','andor-'+(i+1));
  579. nodes[i].setAttribute('name','andor-'+(i+1));
  580. nodes[i].disabled=false;
  581. }
  582. if (cnodes>=0)
  583. nodes[cnodes].disabled=true;
  584. }
  585. function synctoi() {
  586. var i=0;
  587. var table=document.getElementById('planciaord');
  588. var nodes=table.querySelectorAll('.minus');
  589. var cnodes=nodes.length;
  590. for (i=0; i<cnodes; i++)
  591. // +1 sempre per via della row iniziale
  592. nodes[i].setAttribute('onclick','ordremrow('+(i+1)+');');
  593. nodes=table.querySelectorAll('.plus');
  594. for (i=0; i<cnodes; i++)
  595. // +2 perché la devi aggiungere dopo la corrente
  596. nodes[i].setAttribute('onclick','ordaddrow('+(i+2)+',true);');
  597. // da qui in poi faccio a scendere per non avere mai id e nomi duplicati
  598. cnodes--;
  599. nodes=table.querySelectorAll('.ordfieldsel');
  600. for (i=cnodes; i>-1; i--) {
  601. nodes[i].setAttribute('id','ordfieldsel-'+(i+1));
  602. nodes[i].setAttribute('name','ordfieldsel-'+(i+1));
  603. }
  604. nodes=table.querySelectorAll('.ascdesc');
  605. for (i=cnodes; i>-1; i--) {
  606. nodes[i].setAttribute('id','ascdesc-'+(i+1));
  607. nodes[i].setAttribute('name','ascdesc-'+(i+1));
  608. }
  609. }
  610. function selind(id,val) {
  611. var el=document.getElementById(id), i=0, found=false;
  612. while (!found && i<el.length) {
  613. if (el[i].value==val) {
  614. el.selectedIndex=i;
  615. found=true;
  616. }
  617. i++;
  618. }
  619. if (!found)
  620. console.log('"'+val+'" non è stato trovato in "'+id+'"');
  621. }
  622. function setrow(index,openparv,fieldselv,condselv,valueselv,valueinpv,closeparv,andorv) {
  623. selind('openpar-'+index,openparv);
  624. selind('fieldsel-'+index,fieldselv);
  625. popusels(index,valueselv);
  626. selind('condsel-'+index,condselv);
  627. // selind('valuesel-'+index,valueselv);
  628. document.getElementById('valueinp-'+index).value=valueinpv;
  629. if (condselv=='IS NULL' || condselv=='IS NOT NULL') {
  630. document.getElementById('valueinp-'+index).disabled=true;
  631. document.getElementById('valuesel-'+index).disabled=true;
  632. }
  633. selind('closepar-'+index,closeparv);
  634. selind('andor-'+index,andorv);
  635. }
  636. function ordsetrow(index,ordfieldselv,ascdescv) {
  637. selind('ordfieldsel-'+index,ordfieldselv);
  638. selind('ascdesc-'+index,ascdescv);
  639. }
  640. function remrow(index) {
  641. var table=document.getElementById('planciafil');
  642. table.deleteRow(index);
  643. synctai();
  644. if (table.rows.length<2)
  645. document.getElementById('filbut').value='Aggiungi criteri di filtraggio';
  646. }
  647. function ordremrow(index) {
  648. var table=document.getElementById('planciaord');
  649. table.deleteRow(index);
  650. synctoi();
  651. if (table.rows.length<2)
  652. document.getElementById('ordbut').value='Aggiungi criteri di ordinamento';
  653. }
  654. function truncfil() {
  655. var table=document.getElementById('planciafil');
  656. while (table.rows.length>1)
  657. remrow(1);
  658. }
  659. function truncord() {
  660. var table=document.getElementById('planciaord');
  661. while (table.rows.length>1)
  662. ordremrow(1);
  663. }
  664. function manfil() {
  665. var filbut=document.getElementById('filbut');
  666. var table=document.getElementById('planciafil');
  667. var crows=table.rows.length;
  668. if (crows<2) {
  669. addrow(1,true);
  670. filbut.value='Rimuovi tutti i criteri di filtraggio';
  671. } else {
  672. confirma('Attenzione!', '<p>Confermi di voler rimuovere tutti i criteri di filtraggio?</p>', 'No', 'Si', '','truncfil();filbut.value=\'Aggiungi criteri di filtraggio\';');
  673. }
  674. }
  675. function manord() {
  676. var ordbut=document.getElementById('ordbut');
  677. var table=document.getElementById('planciaord');
  678. var crows=table.rows.length;
  679. if (crows<2) {
  680. ordaddrow(1,true);
  681. ordbut.value='Rimuovi tutti i criteri di ordinamento';
  682. } else {
  683. confirma('Attenzione!', '<p>Confermi di voler rimuovere tutti i criteri di ordinamento?</p>', 'No', 'Si', '', 'truncord();ordbut.value=\'Aggiungi criteri di ordinamento\';');
  684. }
  685. }
  686. function ckpar() {
  687. var i=0;
  688. var table=document.getElementById('planciafil');
  689. var nodes=table.querySelectorAll('.openpar');
  690. var cnodes=nodes.length;
  691. var opars=[];
  692. var cpars=[];
  693. for (i=0; i<cnodes; i++)
  694. opars.push(nodes[i].value);
  695. nodes=table.querySelectorAll('.closepar');
  696. for (i=0; i<cnodes; i++)
  697. cpars.push(nodes[i].value);
  698. var spars='';
  699. for (i=0; i<cnodes; i++) {
  700. if (opars[i]!='null') spars+=opars[i];
  701. if (cpars[i]!='null') spars+=cpars[i];
  702. }
  703. var opq=0, cpq=0, ok=true;
  704. for (i=0; i<spars.length; i++) {
  705. if (spars[i]=='(') {
  706. opq++;
  707. } else if (spars[i]==')') {
  708. cpq++;
  709. }
  710. if (cpq>opq)
  711. break;
  712. }
  713. if (opq!=cpq)
  714. ok=false;
  715. console.log(i+'/'+spars.length+': '+ok);
  716. return ok;
  717. }
  718. function ckf() {
  719. var emsg='';
  720. if (!ckpar()) emsg+='<p>Qualcosa non va con le parentesi!</p>';
  721. // emsg+='Comunque NO!<br>\n';
  722. if (emsg=='') {
  723. var table=document.getElementById('planciafil');
  724. var crows=table.rows.length;
  725. if (crows>1)
  726. document.getElementById('andor-'+(crows-1)).disabled=false;
  727. document.getElementById('f').submit();
  728. } else {
  729. alerta('Errore',emsg);
  730. return false;
  731. }
  732. }
  733. function pupwait(on) {
  734. var pup=document.getElementById('popup'), inpup=document.getElementById('inpopup');
  735. if (on) {
  736. if (pup.style.display!='table') {
  737. inpup.innerHTML='<div class="waitbub"><img src="imgs/loading.gif"><br>&nbsp;<br>Caricamento in corso...</div>';
  738. pup.style.display='table';
  739. } else {
  740. console.log('Sto già aspettando...');
  741. }
  742. } else {
  743. inpup.innerHTML='<div id="popupcont">...</div>';
  744. pup.style.display='none';
  745. }
  746. }
  747. //function setrow(index,openparv,fieldselv,condselv,valueselv,valueinpv,closeparv,andorv)
  748. function loadpres() {
  749. let pres=document.getElementById('presets');
  750. if (pres.value!='null') {
  751. pupwait(true);
  752. let formdata=new FormData();
  753. formdata.append('act','load');
  754. formdata.append('pid',pres.value);
  755. let xhr=new XMLHttpRequest();
  756. xhr.open('POST','loadsaverempres.php');
  757. xhr.responseType='json';
  758. xhr.send(formdata);
  759. xhr.onload=function() {
  760. let jarr=xhr.response;
  761. truncfil();
  762. for (i=0; i<jarr['f'].length; i++) {
  763. console.log(jarr['f'][i]);
  764. addrow(i+1,false);
  765. }
  766. synctai();
  767. for (i=0; i<jarr['f'].length; i++) {
  768. setrow(i+1, jarr['f'][i]['OpenPar'], jarr['f'][i]['Field'], jarr['f'][i]['Cond'], jarr['f'][i]['ValueSel'], jarr['f'][i]['ValueInp'], jarr['f'][i]['ClosePar'], jarr['f'][i]['AndOr']);
  769. }
  770. if (jarr['f'].length>0)
  771. document.getElementById('filbut').value='Rimuovi tutti i criteri di filtraggio';
  772. truncord();
  773. for (i=0; i<jarr['o'].length; i++) {
  774. console.log(jarr['o'][i]);
  775. ordaddrow(i+1,false);
  776. }
  777. synctoi();
  778. for (i=0; i<jarr['o'].length; i++) {
  779. ordsetrow(i+1, jarr['o'][i]['Field'], jarr['o'][i]['Sort']);
  780. }
  781. if (jarr['o'].length>0)
  782. document.getElementById('ordbut').value='Rimuovi tutti i criteri di ordinamento';
  783. pupwait(false);
  784. };
  785. xhr.onerror=function() {
  786. pupwait(false);
  787. alert('La richiesta è fallita.');
  788. };
  789. } else {
  790. alerta('Attenzione','<p>Non hai selezionato alcun preset ;)</p>');
  791. }
  792. }
  793. function rempres() {
  794. pupwait(true);
  795. let pres=document.getElementById('presets');
  796. let formdata=new FormData(document.forms.f);
  797. formdata.append('act','remove');
  798. formdata.append('pid',pres.value);
  799. let xhr=new XMLHttpRequest();
  800. xhr.open('POST','loadsaverempres.php');
  801. xhr.responseType='json';
  802. xhr.send(formdata);
  803. xhr.onload=function() {
  804. console.log(xhr.response);
  805. pres.remove(pres.selectedIndex);
  806. pres.selectedIndex=0;
  807. pupwait(false);
  808. };
  809. xhr.onerror=function() {
  810. pupwait(false);
  811. alert('La richiesta è fallita.');
  812. };
  813. }
  814. function savepres(txt,asnew) {
  815. pupwait(true);
  816. let pres=document.getElementById('presets');
  817. let formdata=new FormData(document.forms.f);
  818. formdata.append('act','save');
  819. formdata.append('txt',txt);
  820. if (!asnew)
  821. formdata.append('pid',pres.value);
  822. let xhr=new XMLHttpRequest();
  823. xhr.open('POST','loadsaverempres.php');
  824. xhr.responseType='json';
  825. xhr.send(formdata);
  826. xhr.onload=function() {
  827. console.log(xhr.response);
  828. if (!asnew) {
  829. pres.options[pres.selectedIndex].text=txt;
  830. } else {
  831. let jarr=xhr.response;
  832. pres.add(new Option(txt,jarr['pid']));
  833. pres.selectedIndex=pres.options.length-1;
  834. }
  835. pupwait(false);
  836. };
  837. xhr.onerror=function() {
  838. pupwait(false);
  839. alert('La richiesta è fallita.');
  840. };
  841. }
  842. function pupsavepres(asnew) {
  843. var pres=document.getElementById('presets');
  844. if (pres.value!='null' || asnew) {
  845. var pup=document.getElementById('popup'), inpup=document.getElementById('inpopup');
  846. var prestext=pres.options[pres.selectedIndex].text;
  847. var pre='<p>Se vuoi puoi modificare il nome del preset che stai per sovrascrivere</p>';
  848. if (asnew) pre='<p>Dai un nuovo nome al nuovo preset che stai per salvare</p>';
  849. inpup.innerHTML='<div class="loadsavepresbub">'+pre+'<input type="text" maxlength="256" value="'+hent(prestext)+'" id="presname"><input type="button" value="Salva" onClick="ckpresname('+asnew+');"><input type="button" value="Annulla" onClick="pupoff();"><div id="ckmsg"></div></div>';
  850. pup.style.display='table';
  851. } else {
  852. alerta('Attenzione','<p>Non hai selezionato alcun preset ;)</p>');
  853. }
  854. }
  855. function puprempres() {
  856. var pres=document.getElementById('presets');
  857. if (pres.value!='null') {
  858. var prestext=pres.options[pres.selectedIndex].text;
  859. confirma('Attenzione!', '<p>Confermi l’eliminazione del preset «'+hent(prestext)+'»?</p>', 'No', 'Si', '', 'rempres();');
  860. } else {
  861. alerta('Attenzione','<p>Non hai selezionato alcun preset ;)</p>');
  862. }
  863. }
  864. function ckpresname(asnew) {
  865. var pres=document.getElementById('presets');
  866. var presname=document.getElementById('presname').value;
  867. var ckmsg=document.getElementById('ckmsg');
  868. var ok=true;
  869. var i;
  870. if (presname.trim=='') {
  871. presname='';
  872. ok=false;
  873. ckmsg.innerHTML='Non puoi salvare un preset senza nome';
  874. }
  875. if (!asnew) {
  876. for (i=0; i<pres.options.length; i++) {
  877. if (i!=pres.selectedIndex && presname==pres.options[i].text) {
  878. ok=false;
  879. ckmsg.innerHTML='<p>Esiste già un altro preset con questo nome</p>';
  880. break;
  881. }
  882. }
  883. } else {
  884. for (i=0; i<pres.options.length; i++) {
  885. if (presname==pres.options[i].text) {
  886. ok=false;
  887. ckmsg.innerHTML='<p>Esiste già un preset con questo nome</p>';
  888. break;
  889. }
  890. }
  891. }
  892. if (ok) {
  893. pupoff();
  894. savepres(presname,asnew);
  895. }
  896. }
  897. function pupoff() {
  898. var pup=document.getElementById('popup'), inpup=document.getElementById('inpopup');
  899. inpup.innerHTML='<div id="popupcont">...</div>';
  900. pup.style.display='none';
  901. }
  902. //-->
  903. </script>
  904. </head>
  905. <body>
  906. <nav>
  907. <div id="hmenu">
  908. <ul>
  909. <?php echo($menuout); ?>
  910. </ul>
  911. <div class="mtit">Elenco istanze</div>
  912. <div id="rightdiv">
  913. <img src="<?php echo($filtordimgoff); ?>" id="lente" class="rlinks" title="Mostra il pannello di filtraggio e ordinamento" onclick="shideplancia();">
  914. <img src="<?php echo($notifs['imgoff']); ?>" id="bell" class="rlinks" title="Show notifications" onclick="shidenotifs();">
  915. <img src="imgs/esci.svg" class="rlinks" title="Logout" onclick="document.location.href='logout.php';">
  916. </div>
  917. </div>
  918. </nav>
  919. <?php echo($notifs['div']); ?>
  920. <div id="popup">
  921. <div id="inpopup">
  922. <div id="popupcont">
  923. ...
  924. </div>
  925. </div>
  926. </div>
  927. <div id="footer">
  928. <?php echo($pgout); ?>
  929. </div>
  930. <div id="debug">
  931. <?php echo($dbg); ?>
  932. </div>
  933. <div id="plancia">
  934. <form method="post" id="f" onsubmit="return ckf();">
  935. <table id="planciafil" class="planciatab">
  936. <tr><td colspan="8"><input type="button" id="filbut" value="Aggiungi criteri di filtraggio" class="ctrlbut" onclick="manfil();"></td></tr>
  937. </table>
  938. <table id="planciaord" class="planciatab">
  939. <tr><td colspan="4"><input type="button" id="ordbut" value="Aggiungi criteri di ordinamento" class="ctrlbut" onclick="manord();"></td></tr>
  940. </table>
  941. <table id="planciaothers" class="planciatab">
  942. <tr><td><input type="button" id="subbut" value="Applica" class="ctrlbut" onclick="ckf();"></td></tr>
  943. </table>
  944. <table class="planciatab"><tr><td style="width:1%">Preset: </td><td style="width:95%"><select name="presets" id="presets" class="presets"><?php echo($presopts); ?></select></td><td style="width:1%"><img src="imgs/fresu.svg" class="lilbut" onclick="loadpres();" title="Carica i criteri dal preset selezionato"></td><td style="width:1%"><img src="imgs/fregiu.svg" class="lilbut" onclick="pupsavepres(false);" title="Salva i criteri impostati nel preset selezionato sovrascrivendolo (permette inoltre di rinominarlo) ..."></td><td style="width:1%"><img src="imgs/fregiuplus.svg" class="lilbut" onclick="pupsavepres(true);" title="Salva i criteri impostati come nuovo preset ..."></td><td style="width:1%"><img src="imgs/minus.svg" class="lilbut" onclick="puprempres();" title="Elimina il preset selezionato"></td></tr></table>
  945. <input type="hidden" name="filt" id="filt" value="filt">
  946. </form>
  947. </div>
  948. <script language="JavaScript">
  949. <!--
  950. <?php
  951. echo($jsaddrows);
  952. echo($jssetrows);
  953. echo($jsordaddrows);
  954. echo($jsordsetrows);
  955. ?>
  956. //-->
  957. </script>
  958. <div id="fullscreen">
  959. <div id="middlerow">
  960. <?php echo($out); ?>
  961. </div>
  962. </div>
  963. </body>
  964. </html>