instances.php 59 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274
  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. $menu['istanze']['submenu']['elenco']['href']=null;
  9. $menu['istanze']['submenu']['elenco']['selected']=true;
  10. buildmenu($menu);
  11. require('include/myconn.php');
  12. $dbg='';
  13. use function mysqli_real_escape_string as myesc;
  14. // praticamente una macro
  15. function hspech($str) {
  16. return(htmlspecialchars($str,ENT_QUOTES|ENT_HTML5,'UTF-8'));
  17. }
  18. function nully($val,$fem,$filter,$ntext=null) {
  19. if (!is_null($val)) {
  20. if ($filter=='strip') {
  21. return(strip_tags($val,'<a><br><ol><ul><li><p><i><b><strong><em><small>'));
  22. } elseif ($filter=='htmlchars') {
  23. return(hspech($val));
  24. } elseif ($filter=='timestamp') {
  25. return(strftime('%a %d %b %Y, %T',$val));
  26. } elseif ($filter=='email') {
  27. return('<a href="mailto:'.strip_tags($val).'">'.strip_tags($val).'</a>');
  28. } elseif ($filter=='url') {
  29. return('<a href="'.strip_tags($val).'" target="_blank">'.strip_tags($val).'</a>');
  30. } elseif ($filter=='image') {
  31. return('<img src="'.str_replace('"','\\"',strip_tags($val)).'">');
  32. } elseif ($filter=='boolt') {
  33. if ($val)
  34. return('<span class="good">Si</span>');
  35. else
  36. return('<span class="bad">No</span>');
  37. } elseif ($filter=='boolf') {
  38. if ($val)
  39. return('<span class="bad">Si</span>');
  40. else
  41. return('<span class="good">No</span>');
  42. } else {
  43. return($val);
  44. }
  45. } else {
  46. if (is_null($ntext)) {
  47. if ($fem)
  48. return('<span class="nully">Non definita</span>');
  49. else
  50. return('<span class="nully">Non definito</span>');
  51. }
  52. else {
  53. return('<span class="nully">'.$ntext.'</span>');
  54. }
  55. }
  56. }
  57. function booly($pre,$val,$nottoobad=false,$invcol=false) {
  58. if ($val) {
  59. if (!$invcol) {
  60. $p='<p class="good">';
  61. } else {
  62. if (!$nottoobad) {
  63. $p='<p class="bad">';
  64. } else {
  65. $p='<p class="neut">';
  66. }
  67. }
  68. return($p.$pre.'SI</p>');
  69. } else {
  70. if (!$invcol) {
  71. if (!$nottoobad) {
  72. $p='<p class="bad">';
  73. } else {
  74. $p='<p class="neut">';
  75. }
  76. } else {
  77. $p='<p class="good">';
  78. }
  79. return($p.$pre.'NO</p>');
  80. }
  81. }
  82. function trimname($str) {
  83. return(substr($str,1,strlen($str)-2));
  84. }
  85. $dbg.='<pre>'.print_r($_POST,1).'</pre>';
  86. $page=0;
  87. if (array_key_exists('p',$_POST) && preg_match('/^[0-9]*$/',$_POST['p'])==1)
  88. $page=$_POST['p']+0;
  89. /*SELECT *, Instances.ID AS IID, GROUP_CONCAT(OrdOurLanguages.NameIt ORDER BY OrdInstOurLangs.Pos ASC SEPARATOR '; ') AS OrdOurLangs FROM Instances LEFT JOIN InstOurLangs ON InstOurLangs.InstID=Instances.ID LEFT JOIN Languages AS OurLanguages ON OurLanguages.ID=InstOurLangs.OurLangID LEFT JOIN InstOurLangs AS OrdInstOurLangs ON OrdInstOurLangs.InstID=Instances.ID LEFT JOIN Languages AS OrdOurLanguages ON OrdOurLanguages.ID=OrdInstOurLangs.OurLangID WHERE OurLanguages.NameIT LIKE '%italiano%' GROUP BY IID LIMIT 50*/
  90. $cols=array(
  91. 'Instances.New'=>array('field'=>'Instances.New','name'=>'[Nuova]','type'=>'bool'),
  92. 'Instances.Good'=>array('field'=>'Instances.Good','name'=>'[Papabile]','type'=>'bool'),
  93. 'Instances.Chosen'=>array('field'=>'Instances.Chosen','name'=>'[Scelta]','type'=>'bool'),
  94. 'Instances.Visible'=>array('field'=>'Instances.Visible','name'=>'[Visibile]','type'=>'bool'),
  95. 'Instances.Blacklisted'=>array('field'=>'Instances.Blacklisted','name'=>'[Blacklistata]','type'=>'bool'),
  96. 'Instances.URI'=>array('field'=>'Instances.URI','name'=>'URI','type'=>'text'),
  97. 'Instances.Title'=>array('field'=>'Instances.Title','name'=>'Titolo','type'=>'text'),
  98. 'Instances.ShortDesc'=>array('field'=>'Instances.ShortDesc','name'=>'Descrizione breve','type'=>'text'),
  99. 'Instances.LongDesc'=>array('field'=>'Instances.LongDesc','name'=>'Descrizione lunga','type'=>'text'),
  100. 'Instances.OurDesc'=>array('field'=>'Instances.OurDesc','name'=>'[Descrizione nostra]','type'=>'text'),
  101. //--------------------------------
  102. 'Instances.LocalityID'=>array('field'=>'Instances.LocalityID','name'=>'[Località] ⮞','type'=>'join','join'=>array(),'ord'=>false),
  103. 'Localities.Locality'=>array('field'=>'Localities.Locality','name'=>'[Località]','type'=>'joini','join'=>array('Localities ON Localities.ID=Instances.LocalityID'),'subtype'=>'text'),
  104. 'Provinces.ID'=>array('field'=>'Provinces.ID','name'=>'[Provincia] ⮞','type'=>'join','join'=>array('Localities ON Localities.ID=Instances.LocalityID','Provinces ON Provinces.ID=Localities.ProvinceID'),'ord'=>false),
  105. 'Provinces.Province'=>array('field'=>'Provinces.Province','name'=>'[Provincia]','type'=>'joini','join'=>array('Localities ON Localities.ID=Instances.LocalityID','Provinces ON Provinces.ID=Localities.ProvinceID'),'subtype'=>'text'),
  106. 'Regions.ID'=>array('field'=>'Regions.ID','name'=>'[Regione] ⮞','type'=>'join','join'=>array('Localities ON Localities.ID=Instances.LocalityID','Provinces ON Provinces.ID=Localities.ProvinceID','Regions ON Regions.ID=Provinces.RegionID'),'ord'=>false),
  107. 'Regions.Region'=>array('field'=>'Regions.Region','name'=>'[Regione]','type'=>'joini','join'=>array('Localities ON Localities.ID=Instances.LocalityID','Provinces ON Provinces.ID=Localities.ProvinceID','Regions ON Regions.ID=Provinces.RegionID'),'subtype'=>'text'),
  108. 'States.ID'=>array('field'=>'States.ID','name'=>'[Stato] ⮞','type'=>'join','join'=>array('Localities ON Localities.ID=Instances.LocalityID','Provinces ON Provinces.ID=Localities.ProvinceID','Regions ON Regions.ID=Provinces.RegionID','States ON States.ID=Regions.StateID'),'ord'=>false),
  109. 'States.State'=>array('field'=>'States.State','name'=>'[Stato]','type'=>'joini','join'=>array('Localities ON Localities.ID=Instances.LocalityID','Provinces ON Provinces.ID=Localities.ProvinceID','Regions ON Regions.ID=Provinces.RegionID','States ON States.ID=Regions.StateID'),'subtype'=>'text'),
  110. //--------------------------------
  111. 'Instances.Email'=>array('field'=>'Instances.Email','name'=>'Email di contatto','type'=>'text'),
  112. 'Instances.Software'=>array('field'=>'Instances.Software','name'=>'Software','type'=>'text'),
  113. 'Instances.Version'=>array('field'=>'Instances.Version','name'=>'Versione','type'=>'text'),
  114. 'Instances.UserCount'=>array('field'=>'Instances.UserCount','name'=>'Numero utenti','type'=>'int'),
  115. 'Instances.StatusCount'=>array('field'=>'Instances.StatusCount','name'=>'Numero stati','type'=>'int'),
  116. 'Instances.DomainCount'=>array('field'=>'Instances.DomainCount','name'=>'Numero istanze note','type'=>'int'),
  117. 'Instances.ActiveUsersMonth'=>array('field'=>'Instances.ActiveUsersMonth','name'=>'Numero utenti attivi (mese)','type'=>'int'),
  118. 'Instances.ActiveUsersHalfYear'=>array('field'=>'Instances.ActiveUsersHalfYear','name'=>'Numero utenti attivi (6 mesi)','type'=>'int'),
  119. 'Instances.Thumb'=>array('field'=>'Instances.Thumb','name'=>'Logo','type'=>'text','search'=>false,'ord'=>false),
  120. 'Instances.RegOpen'=>array('field'=>'Instances.RegOpen','name'=>'Registrazioni aperte','type'=>'bool'),
  121. 'Instances.RegReqApproval'=>array('field'=>'Instances.RegReqApproval','name'=>'Approvazione registrazioni','type'=>'bool'),
  122. 'Instances.MaxTootChars'=>array('field'=>'Instances.MaxTootChars','name'=>'Limite caratteri','type'=>'int'),
  123. 'Instances.AdmAccount'=>array('field'=>'Instances.AdmAccount','name'=>'Account admin','type'=>'text'),
  124. 'Instances.AdmDisplayName'=>array('field'=>'Instances.AdmDisplayName','name'=>'Nome account admin','type'=>'text'),
  125. 'Instances.AdmCreatedAt'=>array('field'=>'Instances.AdmCreatedAt','name'=>'Data creazione account admin','type'=>'time'),
  126. 'Instances.AdmURL'=>array('field'=>'Instances.AdmURL','name'=>'Pagina dell’admin','type'=>'text','search'=>false,'ord'=>false),
  127. 'Instances.AdmAvatar'=>array('field'=>'Instances.AdmAvatar','name'=>'Avatar admin','type'=>'text','search'=>false,'ord'=>false),
  128. 'Instances.AdmNote'=>array('field'=>'Instances.AdmNote','name'=>'Note dell’admin','type'=>'text'),
  129. //--------------------------------
  130. 'InstLangs'=>array('name'=>'Lingue dichiarate','search'=>false,'ord'=>false),
  131. 'InstLangs.LangID'=>array('field'=>'InstLangs%.LangID','name'=>'Una lingua dichiarata ⮞','type'=>'join','join'=>array('InstLangs AS InstLangs% ON InstLangs%.InstID=Instances.ID'),'ord'=>false),
  132. 'Languages.NameIT'=>array('field'=>'Languages%.NameIT','name'=>'Una lingua dichiarata','type'=>'joini','join'=>array('InstLangs AS InstLangs% ON InstLangs%.InstID=Instances.ID','Languages AS Languages% ON Languages%.ID=InstLangs%.LangID'),'subtype'=>'text','ord'=>true,'ordname'=>'Lingue dichiarate','ordjoin'=>array('InstLangs AS OrdInstLangs ON OrdInstLangs.InstID=Instances.ID','Languages AS OrdLanguages ON OrdLanguages.ID=OrdInstLangs.LangID'),'ordselmore'=>'GROUP_CONCAT(OrdLanguages.NameIT ORDER BY OrdInstLangs.Pos ASC SEPARATOR \'\') AS xOrdLangs','ordby'=>'xOrdLangs'),
  133. 'InstLangs.LangID.First'=>array('field'=>'InstLangs.LangID','name'=>'Lingua primaria dichiarata ⮞','type'=>'join','join'=>array('InstLangs AS InstLangs ON InstLangs.InstID=Instances.ID AND InstLangs.Pos=1'),'ord'=>false),
  134. 'Languages.NameIT.First'=>array('field'=>'Languages.NameIT','name'=>'Lingua primaria dichiarata','type'=>'joini','join'=>array('InstLangs AS InstLangs ON InstLangs.InstID=Instances.ID AND InstLangs.Pos=1','Languages AS Languages ON Languages.ID=InstLangs.LangID'),'subtype'=>'text','ord'=>false),
  135. //--------------------------------
  136. 'InstOurLangs'=>array('name'=>'[Lingue impostate da noi]','search'=>false,'ord'=>false),
  137. 'InstOurLangs.OurLangID'=>array('field'=>'InstOurLangs%.OurLangID','name'=>'[Una lingua impostata da noi] ⮞','type'=>'join','join'=>array('InstOurLangs AS InstOurLangs% ON InstOurLangs%.InstID=Instances.ID'),'ord'=>false),
  138. 'OurLanguages.NameIT'=>array('field'=>'OurLanguages%.NameIT','name'=>'[Una lingua impostata da noi]','type'=>'joini','join'=>array('InstOurLangs AS InstOurLangs% ON InstOurLangs%.InstID=Instances.ID','Languages AS OurLanguages% ON OurLanguages%.ID=InstOurLangs%.OurLangID'),'subtype'=>'text','ord'=>true,'ordname'=>'Lingue impostate da noi','ordjoin'=>array('InstOurLangs AS OrdInstOurLangs ON OrdInstOurLangs.InstID=Instances.ID','Languages AS OrdOurLanguages ON OrdOurLanguages.ID=OrdInstOurLangs.OurLangID'),'ordselmore'=>'GROUP_CONCAT(OrdOurLanguages.NameIT ORDER BY OrdInstOurLangs.Pos ASC SEPARATOR \'\') AS xOrdOurLangs','ordby'=>'xOrdOurLangs'),
  139. 'InstOurLangs.OurLangID.First'=>array('field'=>'InstOurLangs.OurLangID','name'=>'[Lingua primaria impostata da noi] ⮞','type'=>'join','join'=>array('InstOurLangs AS InstOurLangs ON InstOurLangs.InstID=Instances.ID AND InstOurLangs.Pos=1'),'ord'=>false),
  140. 'OurLanguages.NameIT.First'=>array('field'=>'OurLanguages.NameIT','name'=>'[Lingua primaria impostata da noi]','type'=>'joini','join'=>array('InstOurLangs AS InstOurLangs ON InstOurLangs.InstID=Instances.ID AND InstOurLangs.Pos=1','Languages AS OurLanguages ON OurLanguages.ID=InstOurLangs.OurLangID'),'subtype'=>'text','ord'=>false),
  141. //--------------------------------
  142. 'InstFinancing'=>array('name'=>'[Modalità di finanziamento]','search'=>false,'ord'=>false),
  143. 'InstFinancing.FinID'=>array('field'=>'InstFinancing%.FinID','name'=>'[Una modalità di finanziamento] ⮞','type'=>'join','join'=>array('InstFinancing AS InstFinancing% ON InstFinancing%.InstID=Instances.ID'),'ord'=>false),
  144. 'Financing.Type'=>array('field'=>'Financing%.Type','name'=>'[Una modalità di finanziamento]','type'=>'joini','join'=>array('InstFinancing AS InstFinancing% ON InstFinancing%.InstID=Instances.ID','Financing AS Financing% ON Financing%.ID=InstFinancing%.FinID'),'subtype'=>'text','ord'=>true,'ordname'=>'Modalità di finanziamento','ordjoin'=>array('InstFinancing AS OrdInstFinancing ON OrdInstFinancing.InstID=Instances.ID','Financing AS OrdFinancing ON OrdFinancing.ID=OrdInstFinancing.FinID'),'ordselmore'=>'GROUP_CONCAT(OrdFinancing.Type ORDER BY OrdInstFinancing.Pos ASC SEPARATOR \'\') AS xOrdFinancing','ordby'=>'xOrdFinancing'),
  145. 'InstFinancing.FinID.First'=>array('field'=>'InstFinancing.FinID','name'=>'[Modalità di finanziamento primaria] ⮞','type'=>'join','join'=>array('InstFinancing AS InstFinancing ON InstFinancing.InstID=Instances.ID AND InstFinancing.Pos=1'),'ord'=>false),
  146. 'Financing.Type.First'=>array('field'=>'Financing.Type','name'=>'[Modalità di finanziamento primaria]','type'=>'joini','join'=>array('InstFinancing AS InstFinancing ON InstFinancing.InstID=Instances.ID AND InstFinancing.Pos=1','Financing AS Financing ON Financing.ID=InstFinancing.FinID'),'subtype'=>'text','ord'=>false),
  147. //--------------------------------
  148. 'InstPolicies'=>array('name'=>'[Restrizioni sui contenuti]','search'=>false,'ord'=>false),
  149. 'InstPolicies.PolID'=>array('field'=>'InstPolicies%.PolID','name'=>'[Una restrizione sui contenuti] ⮞','type'=>'join','join'=>array('InstPolicies AS InstPolicies% ON InstPolicies%.InstID=Instances.ID'),'ord'=>false),
  150. 'Policies.Name'=>array('field'=>'Policies%.Name','name'=>'[Una restrizione sui contenuti]','type'=>'joini','join'=>array('InstPolicies AS InstPolicies% ON InstPolicies%.InstID=Instances.ID','Policies AS Policies% ON Policies%.ID=InstPolicies%.PolID'),'subtype'=>'text','ord'=>true,'ordname'=>'Restrizioni sui contenuti','ordjoin'=>array('InstPolicies AS OrdInstPolicies ON OrdInstPolicies.InstID=Instances.ID','Policies AS OrdPolicies ON OrdPolicies.ID=OrdInstPolicies.PolID'),'ordselmore'=>'GROUP_CONCAT(OrdPolicies.Name ORDER BY OrdInstPolicies.Pos ASC SEPARATOR \'\') AS xOrdPolicies','ordby'=>'xOrdPolicies'),
  151. 'InstPolicies.PolID.First'=>array('field'=>'InstPolicies.PolID','name'=>'[Restrizione sui contenuti primaria] ⮞','type'=>'join','join'=>array('InstPolicies AS InstPolicies ON InstPolicies.InstID=Instances.ID AND InstPolicies.Pos=1'),'ord'=>false),
  152. 'Policies.Name.First'=>array('field'=>'Policies.Name','name'=>'[Restrizione sui contenuti primaria]','type'=>'joini','join'=>array('InstPolicies AS InstPolicies ON InstPolicies.InstID=Instances.ID AND InstPolicies.Pos=1','Policies AS Policies ON Policies.ID=InstPolicies.PolID'),'subtype'=>'text','ord'=>false),
  153. //--------------------------------
  154. 'InstTags'=>array('name'=>'[Tags]','search'=>false,'ord'=>false),
  155. 'InstTags.TagID'=>array('field'=>'InstTags%.TagID','name'=>'[Una tag] ⮞','type'=>'join','join'=>array('InstTags AS InstTags% ON InstTags%.InstID=Instances.ID'),'ord'=>false),
  156. 'Tags.Name'=>array('field'=>'Tags%.Name','name'=>'[Una tag]','type'=>'joini','join'=>array('InstTags AS InstTags% ON InstTags%.InstID=Instances.ID','Tags AS Tags% ON Tags%.ID=InstTags%.TagID'),'subtype'=>'text','ord'=>true,'ordname'=>'Tags','ordjoin'=>array('InstTags AS OrdInstTags ON OrdInstTags.InstID=Instances.ID','Tags AS OrdTags ON OrdTags.ID=OrdInstTags.TagID'),'ordselmore'=>'GROUP_CONCAT(OrdTags.Name ORDER BY OrdInstTags.Pos ASC SEPARATOR \'\') AS xOrdTags','ordby'=>'xOrdTags'),
  157. 'InstTags.TagID.First'=>array('field'=>'InstTags.TagID','name'=>'[Tag primaria] ⮞','type'=>'join','join'=>array('InstTags AS InstTags ON InstTags.InstID=Instances.ID AND InstTags.Pos=1'),'ord'=>false),
  158. 'Tags.Name.First'=>array('field'=>'Tags.Name','name'=>'[Tag primaria]','type'=>'joini','join'=>array('InstTags AS InstTags ON InstTags.InstID=Instances.ID AND InstTags.Pos=1','Tags AS Tags ON Tags.ID=InstTags.TagID'),'subtype'=>'text','ord'=>false),
  159. //--------------------------------
  160. 'InstActivity.Statuses.First'=>array('field'=>'InstActivity.Statuses','name'=>'Stati ultima settimana','type'=>'joini','join'=>array('InstActivity AS InstActivity ON InstActivity.InstID=Instances.ID AND InstActivity.Pos=1'),'subtype'=>'int','ord'=>true,'ordjoin'=>array('InstActivity AS OrdInstActivity ON OrdInstActivity.InstID=Instances.ID AND OrdInstActivity.Pos=1'),'ordselmore'=>1,'ordby'=>'OrdInstActivity.Statuses'),
  161. 'InstActivity.Logins.First'=>array('field'=>'InstActivity.Logins','name'=>'Logins ultima settimana','type'=>'joini','join'=>array('InstActivity AS InstActivity ON InstActivity.InstID=Instances.ID AND InstActivity.Pos=1'),'subtype'=>'int','ord'=>true,'ordjoin'=>array('InstActivity AS OrdInstActivity ON OrdInstActivity.InstID=Instances.ID AND OrdInstActivity.Pos=1'),'ordselmore'=>1,'ordby'=>'OrdInstActivity.Logins'),
  162. 'IntstActivity.Registrations.First'=>array('field'=>'InstActivity.Registrations','name'=>'Registrazioni ultima settimana','type'=>'joini','join'=>array('InstActivity AS InstActivity ON InstActivity.InstID=Instances.ID AND InstActivity.Pos=1'),'subtype'=>'int','ord'=>true,'ordjoin'=>array('InstActivity AS OrdInstActivity ON OrdInstActivity.InstID=Instances.ID AND OrdInstActivity.Pos=1'),'ordselmore'=>1,'ordby'=>'OrdInstActivity.Registrations'),
  163. //--------------------------------
  164. /*'InstActivity.Statuses.AVG'=>array('field'=>'InstActivity.Statuses','name'=>'Media stati ultima settimana','type'=>'joini','join'=>array('InstActivity ON InstActivity.InstID=Instances.ID'),'subtype'=>'int','ord'=>true,'ordjoin'=>array('InstActivity AS OrdInstActivity ON OrdInstActivity.InstID=Instances.ID'),'ordselmore'=>'AVG(InstActivity.Statuses) AS avgstatuses'),
  165. 'InstActivity.Logins.AVG'=>array('field'=>'InstActivity.Logins','name'=>'Logins ultima settimana','type'=>'joini','join'=>array('InstActivity ON InstActivity.InstID=Instances.ID'),'subtype'=>'int','wheremore'=>'InstActivity.Pos=1','ord'=>false),
  166. 'IntstActivity.Registrations.AVG'=>array('field'=>'InstActivity.Registrations','name'=>'Registrazioni ultima settimana','type'=>'joini','join'=>array('InstActivity ON InstActivity.InstID=Instances.ID'),'subtype'=>'int','wheremore'=>'InstActivity.Pos=1','ord'=>false),*/
  167. );
  168. $types=array('bool','int','time','text','join','joini');
  169. $fieldselopts='';
  170. $ordfieldselopts='';
  171. foreach ($cols as $key=>$arr) {
  172. if (!array_key_exists('search',$arr) || $arr['search']==true) {
  173. if ($arr['type']=='joini') {
  174. $fieldselopts.='<option value="'.$key.':'.$arr['type'].':'.$arr['subtype'].'">'.$arr['name'].'</option>';
  175. } else {
  176. $fieldselopts.='<option value="'.$key.':'.$arr['type'].':null">'.$arr['name'].'</option>';
  177. }
  178. }
  179. if (!array_key_exists('ord',$arr) || $arr['ord']==true) {
  180. if (!array_key_exists('ordname',$arr))
  181. $name=$arr['name'];
  182. else
  183. $name=$arr['ordname'];
  184. if ($arr['type']=='joini') {
  185. $ordfieldselopts.='<option value="'.$key.':'.$arr['type'].':'.$arr['subtype'].'">'.$name.'</option>';
  186. } else {
  187. $ordfieldselopts.='<option value="'.$key.':'.$arr['type'].':null">'.$name.'</option>';
  188. }
  189. }
  190. }
  191. $pblocks=0;
  192. foreach ($_POST as $key=>$val)
  193. if (preg_match('/^openpar-\d+$/',$key)===1)
  194. $pblocks++;
  195. $fi=0;
  196. $ji=0;
  197. $oi=0;
  198. $jsaddrows='';
  199. $jssetrows='';
  200. $jsordaddrows='';
  201. $jsordsetrows='';
  202. $sels=array();
  203. $joins=array();
  204. $havings=array();
  205. $where='';
  206. $order='';
  207. foreach ($_POST as $key=>$val) {
  208. if (preg_match('/^openpar-\d+$/',$key)===1) {
  209. $fi++;
  210. if (preg_match('/^\(+$/',$val)===1)
  211. $where.=$val;
  212. $jsaddrows.='addrow('.$fi.',false);'.N;
  213. $jssetrows.='setrow('.$fi.','.json_encode($val);
  214. }
  215. if (preg_match('/^fieldsel-\d+$/',$key)===1 && preg_match('/^(.+):(.+):(.+)$/',$val,$buf)===1) {
  216. $tagk=$buf[1];
  217. $type=$buf[2];
  218. $subtype=$buf[3];
  219. if (array_key_exists($tagk,$cols) && in_array($type,$types)) {
  220. ($tagk=='Instances.AdmCreatedAt') ? $inpisdate=true : $inpisdate=false;
  221. if (strpos($cols[$tagk]['field'],'%')!==false)
  222. $ji++;
  223. $where.=str_replace('%',$ji,$cols[$tagk]['field']);
  224. if ($type=='join' || $type=='joini') {
  225. foreach ($cols[$tagk]['join'] as $join) {
  226. $join=str_replace('%',$ji,$join);
  227. if (!in_array($join,$joins))
  228. $joins[]=$join;
  229. }
  230. }
  231. if (array_key_exists('havings',$cols[$tagk]) && !in_array($cols[$tagk]['havings'],$havings))
  232. $havings[]=$cols[$tagk]['havings'];
  233. if (array_key_exists('selmore',$cols[$tagk]) && !in_array($cols[$tagk]['selmore'],$sels))
  234. $sels[]=$cols[$tagk]['selmore'];
  235. $jssetrows.=','.json_encode($val);
  236. } else {
  237. 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);
  238. }
  239. }
  240. if (preg_match('/^condsel-\d+$/',$key)===1) {
  241. $where.=' '.$val.' ';
  242. $cond=$val;
  243. $jssetrows.=','.json_encode($val);
  244. // nel caso qui sotto, valuesel e valueinp sono entrambi disabilitati (non ci sono in $_POST), quindi li riempio di introvabile e nulla
  245. if (preg_match('/^IS NULL|IS NOT NULL$/',$val)===1)
  246. $jssetrows.=',"NOMMITROVI!",""';
  247. }
  248. if (preg_match('/^valuesel-\d+$/',$key)===1) {
  249. $where.=$val;
  250. $jssetrows.=','.json_encode($val);
  251. $jssetrows.=',""';
  252. }
  253. if (preg_match('/^valueinp-\d+$/',$key)===1) {
  254. if ($inpisdate && preg_match('/^([0-9]{1,2}) ([0-9]{1,2}) ([0-9]{4,5})$/',$val,$buf)===1) {
  255. $where.=mktime(0,0,0,$buf[2]+0,$buf[1]+0,$buf[3]+0);
  256. } elseif (preg_match('/^LIKE|NOT LIKE$/',$cond)===1) {
  257. $where.='\'%'.myesc($link,$val).'%\'';
  258. } else {
  259. $where.='\''.myesc($link,$val).'\'';
  260. }
  261. $jssetrows.=',"NOMMITROVI!"';
  262. $jssetrows.=','.json_encode($val);
  263. }
  264. if (preg_match('/^closepar-\d+$/',$key)===1) {
  265. if (preg_match('/^\)+$/',$val)===1)
  266. $where.=$val;
  267. $jssetrows.=','.json_encode($val);
  268. }
  269. if (preg_match('/^andor-\d+$/',$key)===1 && preg_match('/^AND|OR$/',$val)===1) {
  270. if ($fi<$pblocks)
  271. $where.=' '.$val.' ';
  272. $jssetrows.=','.json_encode($val).');'.N;
  273. }
  274. if (preg_match('/^ordfieldsel-\d+$/',$key)===1 && preg_match('/^(.+):(.+):(.+)$/',$val,$buf)===1) {
  275. $oi++;
  276. $tagk=$buf[1];
  277. $type=$buf[2];
  278. $subtype=$buf[3];
  279. if (array_key_exists($tagk,$cols) && in_array($type,$types)) {
  280. if ($type=='join' || $type=='joini') {
  281. if (!array_key_exists('ordjoin',$cols[$tagk])) {
  282. foreach ($cols[$tagk]['join'] as $join)
  283. if (!in_array($join,$joins))
  284. $joins[]=$join;
  285. } else {
  286. foreach ($cols[$tagk]['ordjoin'] as $join)
  287. if (!in_array($join,$joins))
  288. $joins[]=$join;
  289. }
  290. }
  291. if (!array_key_exists('ordby',$cols[$tagk])) {
  292. $order.=$cols[$tagk]['field'];
  293. } else {
  294. if (!in_array($cols[$tagk]['ordselmore'],$sels))
  295. $sels[]=$cols[$tagk]['ordselmore'];
  296. $order.=$cols[$tagk]['ordby'];
  297. }
  298. if (array_key_exists('havings',$cols[$tagk]) && !in_array($cols[$tagk]['havings'],$havings))
  299. $havings[]=$cols[$tagk]['havings'];
  300. if (array_key_exists('selmore',$cols[$tagk]) && !in_array($cols[$tagk]['selmore'],$sels))
  301. $sels[]=$cols[$tagk]['selmore'];
  302. $jsordaddrows.='ordaddrow('.$oi.',false);'.N;
  303. $jsordsetrows.='ordsetrow('.$oi.','.json_encode($val);
  304. } else {
  305. 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);
  306. }
  307. }
  308. if (preg_match('/^ascdesc-\d+$/',$key)===1 && preg_match('/^ASC|DESC$/',$val)===1) {
  309. $order.=' '.$val.', ';
  310. $jsordsetrows.=','.json_encode($val).');'.N;
  311. }
  312. }
  313. if ($jsaddrows!='') {
  314. $jsaddrows.='document.getElementById("filbut").value="Rimuovi tutti i criteri di ricerca";'.N;
  315. $jsaddrows.='synctai();'.N;
  316. }
  317. if ($jsordaddrows!='') {
  318. $jsordaddrows.='document.getElementById("ordbut").value="Rimuovi tutti i criteri di ordinamento";'.N;
  319. $jsordaddrows.='synctoi();'.N;
  320. }
  321. if (count($sels)>0)
  322. $sels=', '.implode(', ',$sels);
  323. else
  324. $sels='';
  325. if ($where!='')
  326. $where='WHERE '.$where;
  327. if ($order!='')
  328. $order='ORDER BY '.substr($order,0,-2);
  329. $dbg.='ORDER: '.$order.'<br>';
  330. if (count($joins)>0)
  331. $joins='LEFT JOIN '.implode(' LEFT JOIN ',$joins);
  332. else
  333. $joins='';
  334. if (count($havings)>0)
  335. $havings='HAVING '.implode(' AND ',$havings);
  336. else
  337. $havings='';
  338. $query='SELECT Instances.ID AS IID '.$sels.' FROM Instances '.$joins.' '.$where.' GROUP BY IID '.$havings;
  339. $res=mysqli_query($link,$query)
  340. or muoribene($dbg.'<br>'.$query.': '.mysqli_error($link).'<br>'.'La query è fallita. <a href="instances.php">Resetta</a>.',true);
  341. $cinsts=mysqli_num_rows($res);
  342. $iperp=25;
  343. if ($page*$iperp>$cinsts)
  344. $page=0;
  345. $finst=$page*$iperp;
  346. $query='SELECT *, Instances.ID AS IID '.$sels.' FROM Instances '.$joins.' '.$where.' GROUP BY IID '.$havings.' '.$order.' LIMIT '.$finst.','.$iperp;
  347. $dbg.='QUERONA: '.$query.'<br>'.N;
  348. $tini=microtime(true);
  349. $res=mysqli_query($link,$query)
  350. or muoribene($dbg.'<br>'.$query.': '.mysqli_error($link).'<br>'.'La query è fallita. <a href="instances.php">Resetta</a>.',true);
  351. $dbg.='Durata esecuzione query: '.round(microtime(true)-$tini,4).' sec.<br>'.N;
  352. $cinstsp=mysqli_num_rows($res);
  353. if ($cinstsp<1) {
  354. $pgout='';
  355. $out='<p>Nessuna istanza da mostrare.</p>'.N;
  356. } else {
  357. // $pgout='Pag. '.($page+1).'/'.(ceil($cinsts/$iperp)-1);
  358. $pgout='<select id="pageselect" onchange="gotopage(this.value)">';
  359. $totp=ceil($cinsts/$iperp);
  360. for ($i=0; $i<$totp; $i++) {
  361. $lastpi=$i*$iperp+$iperp;
  362. if ($lastpi>$cinsts) $lastpi=$cinsts;
  363. ($i!=$page) ? $selected='' : $selected=' selected';
  364. $pgout.='<option value="'.$i.'"'.$selected.'>Pagina '.($i+1).'/'.$totp.' (Istanze '.($i*$iperp+1).'-'.$lastpi.'/'.$cinsts.')</option>'.N;
  365. }
  366. $pgout.='</select>';
  367. // ---
  368. $ci=0;
  369. $out='';
  370. while ($row=mysqli_fetch_assoc($res)) {
  371. $ci++;
  372. $out.='<table class="bigtab">'.N;
  373. // $out.='<thead><tr><th class="tdattr">Attributi</th><th>Info</th></thead>'.N;
  374. $out.='<tbody>'.N;
  375. $out.='<tr><td colspan="2" class="insthead">'.$row['URI'].' ('.($finst+$ci).'/'.$cinsts.') - <a href="edinst.php?id='.$row['IID'].'">Modifica</a></td></tr>'.N;
  376. $attr=booly(trimname($cols['Instances.Blacklisted']['name']).': ',$row['Blacklisted'],false,true).N;
  377. $attr.=booly(trimname($cols['Instances.New']['name']).': ',$row['New'],true).N;
  378. $attr.=booly(trimname($cols['Instances.Good']['name']).': ',$row['Good']).N;
  379. $attr.=booly(trimname($cols['Instances.Chosen']['name']).': ',$row['Chosen']).N;
  380. $attr.=booly(trimname($cols['Instances.Visible']['name']).': ',$row['Visible']).N;
  381. /* $attr.=booly($cols['Instances.RegOpen']['name'].': ',$row['RegOpen']).N;
  382. $attr.=booly($cols['Instances.RegReqApproval']['name'].': ',$row['RegReqApproval'],true,true).N;*/
  383. $sres=mysqli_query($link,'SELECT * FROM InstChecks WHERE InstID='.$row['IID'].' ORDER BY Time DESC')
  384. or muoribene(mysqli_error($link),true);
  385. $csres=mysqli_num_rows($sres);
  386. if ($csres>0) {
  387. $bene=0;
  388. while ($srow=mysqli_fetch_assoc($sres)) {
  389. if ($srow['Status']==1)
  390. $bene++;
  391. }
  392. $width=str_replace(',','.',100/$csres*$bene);
  393. $attr.='<div class="colsectheader">Percentuale di risposta ai nostri check ('.$csres.'): '.round($width,1).'%</div>';
  394. $attr.='<div class="percbg"><div class="percfg" style="width:'.$width.'%;"></div></div>'.N;
  395. mysqli_data_seek($sres,0);
  396. $srow=mysqli_fetch_assoc($sres);
  397. $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>';
  398. } else {
  399. $attr.='<div class="colsectheader">Percentuale di risposta ai nostri check</div>'.N;
  400. $attr.='<div class="colsectcont nully">Non disponibile (?!?!?!)</div>'.N;
  401. }
  402. $attr.='<div class="colsectheader">Attività delle ultime 12 settimane</div>'.N;
  403. $sres=mysqli_query($link,'SELECT SUM(Statuses) AS tstatuses, SUM(Logins) AS tlogins, SUM(Registrations) AS tregs FROM InstActivity WHERE InstID='.$row['IID'])
  404. or muoribene(mysqli_error($link),true);
  405. $tot=mysqli_fetch_assoc($sres);
  406. $sres=mysqli_query($link,'SELECT * FROM InstActivity WHERE InstID='.$row['IID'].' ORDER BY Week DESC')
  407. or muoribene(mysqli_error($link),true);
  408. if (mysqli_num_rows($sres)>0) {
  409. $attr.='<div class="colsectcont">Stati: '.$tot['tstatuses'].'<br>Accessi: '.$tot['tlogins'].'<br>Registrazioni: '.$tot['tregs'].'</div>'.N;
  410. while ($srow=mysqli_fetch_assoc($sres)) {
  411. $attr.='<div class="colsectcontb">'.strftime('%e %b %Y',$srow['Week']).'</div>'.N;
  412. ($tot['tstatuses']==0) ? $width=0 : $width=str_replace(',','.',100/$tot['tstatuses']*$srow['Statuses']);
  413. $attr.='<div class="percstatuses" style="width:'.$width.'%;">'.$srow['Statuses'].'&nbsp;stati</div>'.N;
  414. ($tot['tlogins']==0) ? $width=0 : $width=str_replace(',','.',100/$tot['tlogins']*$srow['Logins']);
  415. $attr.='<div class="perclogins" style="width:'.$width.'%;">'.$srow['Logins'].'&nbsp;accessi</div>'.N;
  416. ($tot['tregs']==0) ? $width=0 : $width=str_replace(',','.',100/$tot['tregs']*$srow['Registrations']);
  417. $attr.='<div class="percregs" style="width:'.$width.'%;">'.$srow['Registrations'].'&nbsp;registrazioni</div>'.N;
  418. }
  419. } else {
  420. $attr.='<div class="colsectcont nully">Non disponibile</div>'.N;
  421. }
  422. $attr.='<div class="colsectheader">Hashtags più usati durante l’ultima settimana</div>'.N;
  423. $sres=mysqli_query($link,'SELECT * FROM InstTrends WHERE InstID='.$row['IID'].' ORDER BY Pos ASC')
  424. or muoribene(mysqli_error($link),true);
  425. if (mysqli_num_rows($sres)>0) {
  426. $attr.='<div class="colsectcont"><ol>'.N;
  427. while ($srow=mysqli_fetch_assoc($sres)) {
  428. $attr.='<li><a href="'.$srow['URL'].'">'.hspech($srow['Name']).'</a></li>'.N;
  429. }
  430. $attr.='</ol></div>'.N;
  431. } else {
  432. $attr.='<div class="colsectcont nully">Non disponibili</div>'.N;
  433. }
  434. $out.='<tr><td class="tdattr">'.$attr.'</td><td>'.N;
  435. if ($row['Blacklisted']>0) {
  436. $sres=mysqli_query($link,'SELECT * FROM Blacklist WHERE Domain=\''.myesc($link,$row['URI']).'\'')
  437. or muoribene(mysqli_error($link),true);
  438. if (mysqli_num_rows($sres)>0) {
  439. $srow=mysqli_fetch_assoc($sres);
  440. if (!is_null($srow['PublicComment']) && preg_match('/^\s*$/',$srow['PublicComment'])!==1) {
  441. $out.='<div class="baloo">Questa istanza è blacklistata per questo motivo: '.hspech($srow['PublicComment']).'</div>'.N;
  442. } else {
  443. $out.='<div class="baloo">Questa istanza è blacklistata, ma nella blacklist non è specificato il motivo.</div>'.N;
  444. }
  445. } else {
  446. $out.='<div class="baloo">Questa istanza risulta blacklistata nella tabella delle istanze, ma nella tabella “Blacklist” non è presente: probabilmente è stata rimossa dalla tabella “Blacklist” e il crawler non l’ha ancora aggiornata.</div>'.N;
  447. }
  448. }
  449. $out.='<div class="baloo"><span class="field">'.$cols['Instances.URI']['name'].':</span> <a href="https://'.$row['URI'].'" target="_blank">'.$row['URI'].'</a></div>'.N;
  450. $out.='<div class="baloo"><span class="field">'.$cols['Instances.Title']['name'].':</span> '.nully($row['Title'],false,'strip').'</div>'.N;
  451. $out.='<div class="baloo"><span class="field">'.$cols['Instances.Thumb']['name'].':</span> '.nully($row['Thumb'],true,'image').'</div>'.N;
  452. $out.='<div class="baloo"><span class="field">'.$cols['Instances.ShortDesc']['name'].':</span> '.nully($row['ShortDesc'],true,'strip').'</div>'.N;
  453. $out.='<div class="baloo"><span class="field">'.$cols['Instances.LongDesc']['name'].':</span> '.nully($row['LongDesc'],true,'strip').'</div>'.N;
  454. // 'strip' o 'htmlent' per la descrizione nostra?
  455. $out.='<div class="baloo"><span class="ourfield">'.trimname($cols['Instances.OurDesc']['name']).':</span> '.nully($row['OurDesc'],true,'strip').'</div>'.N;
  456. $out.='<div class="baloo"><span class="ourfield">'.trimname($cols['Localities.Locality']['name']).':</span> ';
  457. if (!is_null($row['LocalityID'])) {
  458. $sres=mysqli_query($link,'SELECT * FROM Localities LEFT JOIN Provinces ON Provinces.ID=Localities.ProvinceID LEFT JOIN Regions ON Regions.ID=Provinces.RegionID LEFT JOIN States ON States.ID=Regions.StateID WHERE Localities.ID='.$row['LocalityID'])
  459. or muoribene(mysqli_error($link),true);
  460. $srow=mysqli_fetch_assoc($sres);
  461. $out.=hspech($srow['Locality']).' ('.$srow['Province'].', '.$srow['Region'].', '.$srow['State'].')</div>'.N;
  462. } else {
  463. $out.='<span class="nully">Non definita</span></div>'.N;
  464. }
  465. $sres=mysqli_query($link,'SELECT * FROM InstLangs LEFT JOIN Languages ON Languages.ID=LangID WHERE InstID='.$row['IID'].' ORDER BY Pos ASC')
  466. or muoribene(mysqli_error($link),true);
  467. if (mysqli_num_rows($sres)>0) {
  468. $i=0;
  469. $buf=array();
  470. while ($srow=mysqli_fetch_assoc($sres)) {
  471. $i++;
  472. $buf[]=$i.': '.hspech($srow['Code'].' ['.$srow['NameIT'].']');
  473. }
  474. $out.='<div class="baloo"><span class="field">'.$cols['InstLangs']['name'].':</span> '.implode('; ',$buf).'</div>'.N;
  475. } else {
  476. $out.='<div class="baloo"><span class="field">'.$cols['InstLangs']['name'].':</span> <span class="nully">Non definite</span></div>'.N;
  477. }
  478. $sres=mysqli_query($link,'SELECT * FROM InstOurLangs LEFT JOIN Languages ON Languages.ID=OurLangID WHERE InstID='.$row['IID'].' ORDER BY Pos ASC')
  479. or muoribene(mysqli_error($link),true);
  480. if (mysqli_num_rows($sres)>0) {
  481. $i=0;
  482. $buf=array();
  483. while ($srow=mysqli_fetch_assoc($sres)) {
  484. $i++;
  485. $buf[]=$i.': '.hspech($srow['Code'].' ['.$srow['NameIT'].']');
  486. }
  487. $out.='<div class="baloo"><span class="ourfield">'.trimname($cols['InstOurLangs']['name']).':</span> '.implode('; ',$buf).'</div>'.N;
  488. } else {
  489. $out.='<div class="baloo"><span class="ourfield">'.trimname($cols['InstOurLangs']['name']).':</span> <span class="nully">Non definite</span></div>'.N;
  490. }
  491. $sres=mysqli_query($link,'SELECT * FROM InstFinancing LEFT JOIN Financing ON Financing.ID=FinID WHERE InstID='.$row['IID'].' ORDER BY Pos ASC')
  492. or muoribene(mysqli_error($link),true);
  493. if (mysqli_num_rows($sres)>0) {
  494. $i=0;
  495. $buf=array();
  496. while ($srow=mysqli_fetch_assoc($sres)) {
  497. $i++;
  498. $buf[]=$i.': '.hspech($srow['Type']);
  499. }
  500. $out.='<div class="baloo"><span class="ourfield">'.trimname($cols['InstFinancing']['name']).':</span> '.implode('; ',$buf).'</div>'.N;
  501. } else {
  502. $out.='<div class="baloo"><span class="ourfield">'.trimname($cols['InstFinancing']['name']).':</span> <span class="nully">Non definite</span></div>'.N;
  503. }
  504. $sres=mysqli_query($link,'SELECT * FROM InstPolicies LEFT JOIN Policies ON Policies.ID=PolID WHERE InstID='.$row['IID'].' ORDER BY Pos ASC')
  505. or muoribene(mysqli_error($link),true);
  506. if (mysqli_num_rows($sres)>0) {
  507. $i=0;
  508. $buf=array();
  509. while ($srow=mysqli_fetch_assoc($sres)) {
  510. $i++;
  511. $buf[]=$i.': '.hspech($srow['Name']);
  512. }
  513. $out.='<div class="baloo"><span class="ourfield">'.trimname($cols['InstPolicies']['name']).':</span> '.implode('; ',$buf).'</div>'.N;
  514. } else {
  515. $out.='<div class="baloo"><span class="ourfield">'.trimname($cols['InstPolicies']['name']).':</span> <span class="nully">Non definite</span></div>'.N;
  516. }
  517. $sres=mysqli_query($link,'SELECT * FROM InstTags LEFT JOIN Tags ON Tags.ID=TagID WHERE InstID='.$row['IID'].' ORDER BY Pos ASC')
  518. or muoribene(mysqli_error($link),true);
  519. if (mysqli_num_rows($sres)>0) {
  520. $i=0;
  521. $buf=array();
  522. while ($srow=mysqli_fetch_assoc($sres)) {
  523. $i++;
  524. $buf[]=$i.': '.hspech($srow['Name']);
  525. }
  526. $out.='<div class="baloo"><span class="ourfield">'.trimname($cols['InstTags']['name']).':</span> '.implode('; ',$buf).'</div>'.N;
  527. } else {
  528. $out.='<div class="baloo"><span class="ourfield">'.trimname($cols['InstTags']['name']).':</span> <span class="nully">Non definite</span></div>'.N;
  529. }
  530. $out.='<div class="baloo"><span class="field">'.$cols['Instances.Email']['name'].':</span> '.nully($row['Email'],true,'email').'</div>'.N;
  531. $out.='<div class="baloo"><span class="field">'.$cols['Instances.Software']['name'].':</span> '.nully($row['Software'],false,'strip').'</div>'.N;
  532. $out.='<div class="baloo"><span class="field">'.$cols['Instances.Version']['name'].':</span> '.nully($row['Version'],true,'strip').'</div>'.N;
  533. $out.='<div class="baloo"><span class="field">'.$cols['Instances.UserCount']['name'].':</span> '.nully($row['UserCount'],false,'strip').'</div>'.N;
  534. $out.='<div class="baloo"><span class="field">'.$cols['Instances.StatusCount']['name'].':</span> '.nully($row['StatusCount'],false,'strip').'</div>'.N;
  535. $out.='<div class="baloo"><span class="field">'.$cols['Instances.DomainCount']['name'].':</span> '.nully($row['DomainCount'],false,'strip').'</div>'.N;
  536. $out.='<div class="baloo"><span class="field">'.$cols['Instances.ActiveUsersMonth']['name'].':</span> '.nully($row['ActiveUsersMonth'],false,'strip').'</div>'.N;
  537. $out.='<div class="baloo"><span class="field">'.$cols['Instances.ActiveUsersHalfYear']['name'].':</span> '.nully($row['ActiveUsersHalfYear'],false,'strip').'</div>'.N;
  538. $out.='<div class="baloo"><span class="field">'.$cols['Instances.RegOpen']['name'].':</span> '.nully($row['RegOpen'],false,'boolt').'</div>'.N;
  539. $out.='<div class="baloo"><span class="field">'.$cols['Instances.RegReqApproval']['name'].':</span> '.nully($row['RegReqApproval'],false,'boolf').'</div>'.N;
  540. $out.='<div class="baloo"><span class="field">'.$cols['Instances.MaxTootChars']['name'].':</span> '.nully($row['MaxTootChars'],false,'strip','500').'</div>'.N;
  541. $out.='<div class="baloo"><span class="field">'.$cols['Instances.AdmAccount']['name'].':</span> '.nully($row['AdmAccount'],false,'strip').'</div>'.N;
  542. $out.='<div class="baloo"><span class="field">'.$cols['Instances.AdmDisplayName']['name'].':</span> '.nully($row['AdmDisplayName'],false,'strip').'</div>'.N;
  543. $out.='<div class="baloo"><span class="field">'.$cols['Instances.AdmCreatedAt']['name'].':</span> '.nully($row['AdmCreatedAt'],true,'timestamp').'</div>'.N;
  544. $out.='<div class="baloo"><span class="field">'.$cols['Instances.AdmURL']['name'].':</span> '.nully($row['AdmURL'],true,'url').'</div>'.N;
  545. $out.='<div class="baloo"><span class="field">'.$cols['Instances.AdmAvatar']['name'].':</span> '.nully($row['AdmAvatar'],false,'image').'</div>'.N;
  546. $out.='<div><span class="field">'.$cols['Instances.AdmNote']['name'].':</span> '.nully($row['AdmNote'],false,'strip').'</div>'.N;
  547. $out.='</td></tr>'.N;
  548. $out.='</tbody>'.N;
  549. $out.='</table>'.N;
  550. }
  551. $out.='<div class="bigtabfoot"></div>';
  552. }
  553. $presid=0;
  554. if (array_key_exists('presets',$_POST) && preg_match('/^[0-9]+$/',$_POST['presets'])===1)
  555. $presid=$_POST['presets'];
  556. $presopts='<option value="null"></option>'.N;
  557. $res=mysqli_query($link,'SELECT * FROM Presets ORDER BY LENGTH(Name) ASC, Name ASC')
  558. or muoribene(mysqli_error($link),true);
  559. while ($row=mysqli_fetch_assoc($res)) {
  560. if ($row['ID']!=$presid)
  561. $presopts.='<option value="'.$row['ID'].'">'.hspech($row['Name']).'</option>'.N;
  562. else
  563. $presopts.='<option value="'.$row['ID'].'" selected>'.hspech($row['Name']).'</option>'.N;
  564. }
  565. mysqli_close($link);
  566. ?>
  567. <!DOCTYPE HTML>
  568. <html lang="it">
  569. <head>
  570. <title>Mastodon Startpage Admin - Elenco istanze</title>
  571. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  572. <meta name="description" content="Admin pages for Mastodon Startpage">
  573. <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
  574. <link rel="icon" type="image/png" href="imgs/icona-32.png" sizes="32x32">
  575. <link rel="icon" type="image/png" href="imgs/icona-192.png" sizes="192x192">
  576. <link rel="icon" type="image/png" href="imgs/icona-512.png" sizes="512x512">
  577. <link rel="apple-touch-icon-precomposed" href="imgs/icona-180.png">
  578. <script language="JavaScript" src="js/menu.js?v=<?php echo($cjrand); ?>"></script>
  579. <script language="JavaScript" src="js/confirma.js?v=<?php echo($cjrand); ?>"></script>
  580. <script language="JavaScript" src="js/alerta.js?v=<?php echo($cjrand); ?>"></script>
  581. <link rel="stylesheet" type="text/css" href="theme.css?v=<?php echo($cjrand); ?>">
  582. <script language="JavaScript">
  583. <!--
  584. function shideplancia() {
  585. var plancia=document.getElementById('plancia');
  586. var plctrl=document.getElementById('lente');
  587. if (plancia.style.display=='block') {
  588. plancia.style.display='none';
  589. lente.src='imgs/cerca_off.svg';
  590. lente.title='Mostra il pannello di ricerca e ordinamento';
  591. } else {
  592. plancia.style.display='block';
  593. lente.src='imgs/cerca_on.svg';
  594. lente.title='Nascondi il pannello di ricerca e ordinamento';
  595. }
  596. }
  597. function hent(str) {
  598. return str.replace(/&/g,'&amp;').replace(/>/g,'&gt;').replace(/</g,'&lt;').replace(/"/g,'&quot;');
  599. }
  600. function truncsel(el) {
  601. var sel=document.getElementById(el), len=sel.length, i=0;
  602. for (i=len-1; i>=0; i--)
  603. sel.remove(i);
  604. }
  605. function inpdisif(index) {
  606. console.log('inpdisif index: '+index);
  607. var source=document.getElementById('condsel-'+index);
  608. var inp=document.getElementById('valueinp-'+index);
  609. var sel=document.getElementById('valuesel-'+index);
  610. var conds=['IS NULL','IS NOT NULL'];
  611. if (conds.includes(source.value)) {
  612. inp.disabled=true;
  613. sel.disabled=true;
  614. } else {
  615. if (inp.style.display!='none') inp.disabled=false;
  616. if (sel.style.display!='none') sel.disabled=false;
  617. }
  618. }
  619. function popusels(index,valselval) {
  620. console.log('popusels index: '+index);
  621. var key=document.getElementById('fieldsel-'+index).value;
  622. var type=key.replace(/^.*:(.*):.*$/,'$1');
  623. var subtype=key.replace(/^.*:.*:(.*)$/,'$1');
  624. key=key.replace(/^(.*):.*:.*$/,'$1');
  625. var condsel=document.getElementById('condsel-'+index);
  626. var valsel=document.getElementById('valuesel-'+index);
  627. var valinp=document.getElementById('valueinp-'+index);
  628. condsel.setAttribute('onchange','inpdisif('+index+');');
  629. if (type=='joini')
  630. type=subtype;
  631. if (type=='bool') {
  632. truncsel('condsel-'+index);
  633. condsel.add(new Option('è','IS'));
  634. truncsel('valuesel-'+index);
  635. valsel.add(new Option('vero','TRUE'));
  636. valsel.add(new Option('falso','FALSE'));
  637. valsel.add(new Option('definit@','NOT NULL'));
  638. valsel.add(new Option('non definit@','NULL'));
  639. if (valselval!==false)
  640. selind('valuesel-'+index,valselval);
  641. valinp.style.display='none';
  642. valinp.disabled=true;
  643. valsel.style.display='block';
  644. valsel.disabled=false;
  645. } else if (type=='text') {
  646. truncsel('condsel-'+index);
  647. condsel.add(new Option('contiene','LIKE'));
  648. condsel.add(new Option('non contiene','NOT LIKE'));
  649. condsel.add(new Option('è uguale a','='));
  650. condsel.add(new Option('è divers@ da','!='));
  651. condsel.add(new Option('è maggiore o uguale a','>='));
  652. condsel.add(new Option('è minore o uguale a','<='));
  653. condsel.add(new Option('è maggiore di','>'));
  654. condsel.add(new Option('è minore di','<'));
  655. condsel.add(new Option('è definit@','IS NOT NULL'));
  656. condsel.add(new Option('non è definit@','IS NULL'));
  657. valsel.style.display='none';
  658. valsel.disabled=true;
  659. valinp.style.display='block';
  660. valinp.disabled=false;
  661. } else if (type=='int' || type=='time') {
  662. truncsel('condsel-'+index);
  663. condsel.add(new Option('è maggiore o uguale a','>='));
  664. condsel.add(new Option('è minore o uguale a','<='));
  665. condsel.add(new Option('è maggiore di','>'));
  666. condsel.add(new Option('è minore di','<'));
  667. condsel.add(new Option('è uguale a','='));
  668. condsel.add(new Option('è divers@ da','!='));
  669. condsel.add(new Option('è definit@','IS NOT NULL'));
  670. condsel.add(new Option('non è definit@','IS NULL'));
  671. valsel.style.display='none';
  672. valsel.disabled=true;
  673. valinp.style.display='block';
  674. valinp.disabled=false;
  675. } else if (type=='join') {
  676. truncsel('condsel-'+index);
  677. condsel.add(new Option('è uguale a','='));
  678. condsel.add(new Option('è divers@ da','!='));
  679. condsel.add(new Option('è definit@','IS NOT NULL'));
  680. condsel.add(new Option('non è definit@','IS NULL'));
  681. valsel.style.display='block';
  682. valsel.disabled=false;
  683. valinp.style.display='none';
  684. valinp.disabled=true;
  685. truncsel('valuesel-'+index);
  686. pupwait(true);
  687. let xhr=new XMLHttpRequest();
  688. xhr.open('GET','instancesh.php?key='+key);
  689. xhr.responseType='json';
  690. xhr.send();
  691. xhr.onload=function() {
  692. let jarr=xhr.response;
  693. for (i=0; i<jarr.length; i++)
  694. valsel.add(new Option(jarr[i][1],jarr[i][0]));
  695. console.log('valsel pronto!');
  696. if (valselval!==false)
  697. selind('valuesel-'+index,valselval);
  698. pupwait(false);
  699. };
  700. xhr.onerror=function() {
  701. pupwait(false);
  702. alert('La richiesta è fallita.');
  703. };
  704. } else {
  705. alert('Attenziò: non so che farmene del tipo "'+type+'": diglielo, al programmatore.');
  706. }
  707. }
  708. function addrow(index,refresh) {
  709. var table=document.getElementById('planciafil');
  710. if (table.rows.length<9) {
  711. var newrow=table.insertRow(index);
  712. var newcell0=newrow.insertCell(0);
  713. var newcell1=newrow.insertCell(1);
  714. var newcell2=newrow.insertCell(2);
  715. var newcell3=newrow.insertCell(3);
  716. var newcell4=newrow.insertCell(4);
  717. var newcell5=newrow.insertCell(5);
  718. var newcell6=newrow.insertCell(6);
  719. var newcell7=newrow.insertCell(7);
  720. newcell0.innerHTML='<select class="openpar"><option value="null"></option><option value="(">(</option><option value="((">((</option><option value="(((">(((</option></select>';
  721. newcell1.innerHTML='<select class="fieldsel"><?php echo($fieldselopts); ?></select>';
  722. newcell2.innerHTML='<select class="condsel"></select>';
  723. newcell3.innerHTML='<select class="valuesel" style="display:none;"></select><input type="text" class="valueinp" maxlength="256" style="display:none;">';
  724. newcell4.innerHTML='<select class="closepar"><option value="null"></option><option value=")">)</option><option value="))">))</option><option value=")))">)))</option></select>';
  725. newcell5.innerHTML='<select class="andor"><option value="AND">E</option><option value="OR">O</option></select>';
  726. newcell6.innerHTML='<img class="plus" src="imgs/plus.svg" title="Aggiungi un criterio sotto questo">';
  727. newcell6.style.width='22px';
  728. newcell7.innerHTML='<img class="minus" src="imgs/minus.svg" title="Rimuovi questo criterio">';
  729. newcell7.style.width='22px';
  730. if (refresh) {
  731. synctai();
  732. popusels(index,false);
  733. }
  734. } else {
  735. alerta('<p>Non è possibile impostare più di 8 criteri di ricerca.</p>');
  736. }
  737. }
  738. function ordaddrow(index,refresh) {
  739. var table=document.getElementById('planciaord');
  740. if (table.rows.length<7) {
  741. var newrow=table.insertRow(index);
  742. var newcell0=newrow.insertCell(0);
  743. var newcell1=newrow.insertCell(1);
  744. var newcell2=newrow.insertCell(2);
  745. var newcell3=newrow.insertCell(3);
  746. newcell0.style.width='97%';
  747. newcell1.style.width='1%';
  748. newcell2.style.width='1%';
  749. newcell3.style.width='1%';
  750. newcell0.innerHTML='<select class="ordfieldsel"><?php echo($ordfieldselopts); ?></select>';
  751. newcell1.innerHTML='<select class="ascdesc"><option value="ASC">Crescente</option><option value="DESC">Decrescente</option></select>';
  752. newcell2.innerHTML='<img class="plus" src="imgs/plus.svg" title="Aggiungi un criterio sotto questo">';
  753. newcell3.innerHTML='<img class="minus" src="imgs/minus.svg" title="Rimuovi questo criterio">';
  754. if (refresh)
  755. synctoi();
  756. } else {
  757. alerta('<p>Non è possibile impostare più di 6 criteri di ordinamento.</p>');
  758. }
  759. }
  760. function synctai() {
  761. var i=0;
  762. var table=document.getElementById('planciafil');
  763. var nodes=table.querySelectorAll('.minus');
  764. var cnodes=nodes.length;
  765. for (i=0; i<cnodes; i++)
  766. // +1 sempre per via della row iniziale
  767. nodes[i].setAttribute('onclick','remrow('+(i+1)+');');
  768. nodes=table.querySelectorAll('.plus');
  769. for (i=0; i<cnodes; i++)
  770. // +2 perché la devi aggiungere dopo la corrente
  771. nodes[i].setAttribute('onclick','addrow('+(i+2)+',true);');
  772. // da qui in poi faccio a scendere per non avere mai id e nomi duplicati
  773. cnodes--;
  774. nodes=table.querySelectorAll('.openpar');
  775. for (i=cnodes; i>-1; i--) {
  776. nodes[i].setAttribute('id','openpar-'+(i+1));
  777. nodes[i].setAttribute('name','openpar-'+(i+1));
  778. }
  779. nodes=table.querySelectorAll('.fieldsel');
  780. for (i=cnodes; i>-1; i--) {
  781. nodes[i].setAttribute('id','fieldsel-'+(i+1));
  782. nodes[i].setAttribute('name','fieldsel-'+(i+1));
  783. nodes[i].setAttribute('onchange','popusels('+(i+1)+',false);');
  784. }
  785. nodes=table.querySelectorAll('.condsel');
  786. for (i=cnodes; i>-1; i--) {
  787. nodes[i].setAttribute('id','condsel-'+(i+1));
  788. nodes[i].setAttribute('name','condsel-'+(i+1));
  789. nodes[i].setAttribute('onchange','inpdisif('+(i+1)+');');
  790. }
  791. nodes=table.querySelectorAll('.valuesel');
  792. for (i=cnodes; i>-1; i--) {
  793. nodes[i].setAttribute('id','valuesel-'+(i+1));
  794. nodes[i].setAttribute('name','valuesel-'+(i+1));
  795. }
  796. nodes=table.querySelectorAll('.valueinp');
  797. for (i=cnodes; i>-1; i--) {
  798. nodes[i].setAttribute('id','valueinp-'+(i+1));
  799. nodes[i].setAttribute('name','valueinp-'+(i+1));
  800. }
  801. nodes=table.querySelectorAll('.closepar');
  802. for (i=cnodes; i>-1; i--) {
  803. nodes[i].setAttribute('id','closepar-'+(i+1));
  804. nodes[i].setAttribute('name','closepar-'+(i+1));
  805. }
  806. nodes=table.querySelectorAll('.andor');
  807. for (i=cnodes; i>-1; i--) {
  808. nodes[i].setAttribute('id','andor-'+(i+1));
  809. nodes[i].setAttribute('name','andor-'+(i+1));
  810. nodes[i].disabled=false;
  811. }
  812. if (cnodes>=0)
  813. nodes[cnodes].disabled=true;
  814. }
  815. function synctoi() {
  816. var i=0;
  817. var table=document.getElementById('planciaord');
  818. var nodes=table.querySelectorAll('.minus');
  819. var cnodes=nodes.length;
  820. for (i=0; i<cnodes; i++)
  821. // +1 sempre per via della row iniziale
  822. nodes[i].setAttribute('onclick','ordremrow('+(i+1)+');');
  823. nodes=table.querySelectorAll('.plus');
  824. for (i=0; i<cnodes; i++)
  825. // +2 perché la devi aggiungere dopo la corrente
  826. nodes[i].setAttribute('onclick','ordaddrow('+(i+2)+',true);');
  827. // da qui in poi faccio a scendere per non avere mai id e nomi duplicati
  828. cnodes--;
  829. nodes=table.querySelectorAll('.ordfieldsel');
  830. for (i=cnodes; i>-1; i--) {
  831. nodes[i].setAttribute('id','ordfieldsel-'+(i+1));
  832. nodes[i].setAttribute('name','ordfieldsel-'+(i+1));
  833. }
  834. nodes=table.querySelectorAll('.ascdesc');
  835. for (i=cnodes; i>-1; i--) {
  836. nodes[i].setAttribute('id','ascdesc-'+(i+1));
  837. nodes[i].setAttribute('name','ascdesc-'+(i+1));
  838. }
  839. }
  840. function selind(id,val) {
  841. var el=document.getElementById(id), i=0, found=false;
  842. while (!found && i<el.length) {
  843. if (el[i].value==val) {
  844. el.selectedIndex=i;
  845. found=true;
  846. }
  847. i++;
  848. }
  849. if (!found)
  850. console.log('"'+val+'" non è stato trovato in "'+id+'"');
  851. }
  852. function setrow(index,openparv,fieldselv,condselv,valueselv,valueinpv,closeparv,andorv) {
  853. selind('openpar-'+index,openparv);
  854. selind('fieldsel-'+index,fieldselv);
  855. popusels(index,valueselv);
  856. selind('condsel-'+index,condselv);
  857. // selind('valuesel-'+index,valueselv);
  858. document.getElementById('valueinp-'+index).value=valueinpv;
  859. if (condselv=='IS NULL' || condselv=='IS NOT NULL') {
  860. document.getElementById('valueinp-'+index).disabled=true;
  861. document.getElementById('valuesel-'+index).disabled=true;
  862. }
  863. selind('closepar-'+index,closeparv);
  864. selind('andor-'+index,andorv);
  865. }
  866. function ordsetrow(index,ordfieldselv,ascdescv) {
  867. selind('ordfieldsel-'+index,ordfieldselv);
  868. selind('ascdesc-'+index,ascdescv);
  869. }
  870. function remrow(index) {
  871. var table=document.getElementById('planciafil');
  872. table.deleteRow(index);
  873. synctai();
  874. if (table.rows.length<2)
  875. document.getElementById('filbut').value='Aggiungi criteri di ricerca';
  876. }
  877. function ordremrow(index) {
  878. var table=document.getElementById('planciaord');
  879. table.deleteRow(index);
  880. synctoi();
  881. if (table.rows.length<2)
  882. document.getElementById('ordbut').value='Aggiungi criteri di ordinamento';
  883. }
  884. function truncfil() {
  885. var table=document.getElementById('planciafil');
  886. while (table.rows.length>1)
  887. remrow(1);
  888. }
  889. function truncord() {
  890. var table=document.getElementById('planciaord');
  891. while (table.rows.length>1)
  892. ordremrow(1);
  893. }
  894. function manfil() {
  895. var filbut=document.getElementById('filbut');
  896. var table=document.getElementById('planciafil');
  897. var crows=table.rows.length;
  898. if (crows<2) {
  899. addrow(1,true);
  900. filbut.value='Rimuovi tutti i criteri di ricerca';
  901. } else {
  902. confirma('<p>Confermi di voler rimuovere tutti i criteri di ricerca?</p>','truncfil();filbut.value=\'Aggiungi criteri di ricerca\'');
  903. }
  904. }
  905. function manord() {
  906. var ordbut=document.getElementById('ordbut');
  907. var table=document.getElementById('planciaord');
  908. var crows=table.rows.length;
  909. if (crows<2) {
  910. ordaddrow(1,true);
  911. ordbut.value='Rimuovi tutti i criteri di ordinamento';
  912. } else {
  913. confirma('<p>Confermi di voler rimuovere tutti i criteri di ordinamento?</p>','truncord();ordbut.value=\'Aggiungi criteri di ordinamento\'');
  914. }
  915. }
  916. function ckpar() {
  917. var i=0;
  918. var table=document.getElementById('planciafil');
  919. var nodes=table.querySelectorAll('.openpar');
  920. var cnodes=nodes.length;
  921. var opars=[];
  922. var cpars=[];
  923. for (i=0; i<cnodes; i++)
  924. opars.push(nodes[i].value);
  925. nodes=table.querySelectorAll('.closepar');
  926. for (i=0; i<cnodes; i++)
  927. cpars.push(nodes[i].value);
  928. var spars='';
  929. for (i=0; i<cnodes; i++) {
  930. if (opars[i]!='null') spars+=opars[i];
  931. if (cpars[i]!='null') spars+=cpars[i];
  932. }
  933. var opq=0, cpq=0, ok=true;
  934. for (i=0; i<spars.length; i++) {
  935. if (spars[i]=='(') {
  936. opq++;
  937. } else if (spars[i]==')') {
  938. cpq++;
  939. }
  940. if (cpq>opq)
  941. break;
  942. }
  943. if (opq!=cpq)
  944. ok=false;
  945. console.log(i+'/'+spars.length+': '+ok);
  946. return ok;
  947. }
  948. function ckf() {
  949. var emsg='';
  950. if (!ckpar()) emsg+='Qualcosa non va con le parentesi!<br>\n';
  951. // emsg+='Comunque NO!<br>\n';
  952. if (emsg=='') {
  953. var table=document.getElementById('planciafil');
  954. var crows=table.rows.length;
  955. if (crows>1)
  956. document.getElementById('andor-'+(crows-1)).disabled=false;
  957. document.getElementById('f').submit();
  958. } else {
  959. alerta('<p>'+emsg+'</p>');
  960. }
  961. }
  962. function pupwait(on) {
  963. var pup=document.getElementById('popup'), inpup=document.getElementById('inpopup');
  964. if (on) {
  965. if (pup.style.display!='table') {
  966. inpup.innerHTML='<div class="waitbub"><img src="imgs/loading.gif"><br>&nbsp;<br>Caricamento in corso...</div>';
  967. pup.style.display='table';
  968. } else {
  969. console.log('Sto già aspettando...');
  970. }
  971. } else {
  972. inpup.innerHTML='<div id="popupcont">...</div>';
  973. pup.style.display='none';
  974. }
  975. }
  976. //function setrow(index,openparv,fieldselv,condselv,valueselv,valueinpv,closeparv,andorv)
  977. function loadpres() {
  978. let pres=document.getElementById('presets');
  979. if (pres.value!='null') {
  980. pupwait(true);
  981. let formdata=new FormData();
  982. formdata.append('act','load');
  983. formdata.append('pid',pres.value);
  984. let xhr=new XMLHttpRequest();
  985. xhr.open('POST','loadsaverempres.php');
  986. xhr.responseType='json';
  987. xhr.send(formdata);
  988. xhr.onload=function() {
  989. let jarr=xhr.response;
  990. truncfil();
  991. for (i=0; i<jarr['f'].length; i++) {
  992. console.log(jarr['f'][i]);
  993. addrow(i+1,false);
  994. }
  995. synctai();
  996. for (i=0; i<jarr['f'].length; i++) {
  997. 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']);
  998. }
  999. if (jarr['f'].length>0)
  1000. document.getElementById('filbut').value='Rimuovi tutti i criteri di ricerca';
  1001. truncord();
  1002. for (i=0; i<jarr['o'].length; i++) {
  1003. console.log(jarr['o'][i]);
  1004. ordaddrow(i+1,false);
  1005. }
  1006. synctoi();
  1007. for (i=0; i<jarr['o'].length; i++) {
  1008. ordsetrow(i+1, jarr['o'][i]['Field'], jarr['o'][i]['Sort']);
  1009. }
  1010. if (jarr['o'].length>0)
  1011. document.getElementById('ordbut').value='Rimuovi tutti i criteri di ordinamento';
  1012. pupwait(false);
  1013. };
  1014. xhr.onerror=function() {
  1015. pupwait(false);
  1016. alert('La richiesta è fallita.');
  1017. };
  1018. } else {
  1019. alerta('<p>Non hai selezionato alcun preset ;)</p>');
  1020. }
  1021. }
  1022. function rempres() {
  1023. pupwait(true);
  1024. let pres=document.getElementById('presets');
  1025. let formdata=new FormData(document.forms.f);
  1026. formdata.append('act','remove');
  1027. formdata.append('pid',pres.value);
  1028. let xhr=new XMLHttpRequest();
  1029. xhr.open('POST','loadsaverempres.php');
  1030. xhr.responseType='json';
  1031. xhr.send(formdata);
  1032. xhr.onload=function() {
  1033. console.log(xhr.response);
  1034. pres.remove(pres.selectedIndex);
  1035. pres.selectedIndex=0;
  1036. pupwait(false);
  1037. };
  1038. xhr.onerror=function() {
  1039. pupwait(false);
  1040. alert('La richiesta è fallita.');
  1041. };
  1042. }
  1043. function savepres(txt,asnew) {
  1044. pupwait(true);
  1045. let pres=document.getElementById('presets');
  1046. let formdata=new FormData(document.forms.f);
  1047. formdata.append('act','save');
  1048. formdata.append('txt',txt);
  1049. if (!asnew)
  1050. formdata.append('pid',pres.value);
  1051. let xhr=new XMLHttpRequest();
  1052. xhr.open('POST','loadsaverempres.php');
  1053. xhr.responseType='json';
  1054. xhr.send(formdata);
  1055. xhr.onload=function() {
  1056. console.log(xhr.response);
  1057. if (!asnew) {
  1058. pres.options[pres.selectedIndex].text=txt;
  1059. } else {
  1060. let jarr=xhr.response;
  1061. pres.add(new Option(txt,jarr['pid']));
  1062. pres.selectedIndex=pres.options.length-1;
  1063. }
  1064. pupwait(false);
  1065. };
  1066. xhr.onerror=function() {
  1067. pupwait(false);
  1068. alert('La richiesta è fallita.');
  1069. };
  1070. }
  1071. function pupsavepres(asnew) {
  1072. var pres=document.getElementById('presets');
  1073. if (pres.value!='null' || asnew) {
  1074. var pup=document.getElementById('popup'), inpup=document.getElementById('inpopup');
  1075. var prestext=pres.options[pres.selectedIndex].text;
  1076. var pre='<p>Se vuoi puoi modificare il nome del preset che stai per sovrascrivere</p>';
  1077. if (asnew) pre='<p>Dai un nuovo nome al nuovo preset che stai per salvare</p>';
  1078. 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>';
  1079. pup.style.display='table';
  1080. } else {
  1081. alerta('<p>Non hai selezionato alcun preset ;)</p>');
  1082. }
  1083. }
  1084. function puprempres() {
  1085. var pres=document.getElementById('presets');
  1086. if (pres.value!='null') {
  1087. var prestext=pres.options[pres.selectedIndex].text;
  1088. confirma('<p>Confermi l’eliminazione del preset «'+hent(prestext)+'»?</p>','rempres()');
  1089. } else {
  1090. alerta('<p>Non hai selezionato alcun preset ;)</p>');
  1091. }
  1092. }
  1093. function ckpresname(asnew) {
  1094. var pres=document.getElementById('presets');
  1095. var presname=document.getElementById('presname').value;
  1096. var ckmsg=document.getElementById('ckmsg');
  1097. var ok=true;
  1098. var i;
  1099. if (presname.trim=='') {
  1100. presname='';
  1101. ok=false;
  1102. ckmsg.innerHTML='Non puoi salvare un preset senza nome';
  1103. }
  1104. if (!asnew) {
  1105. for (i=0; i<pres.options.length; i++) {
  1106. if (i!=pres.selectedIndex && presname==pres.options[i].text) {
  1107. ok=false;
  1108. ckmsg.innerHTML='<p>Esiste già un altro preset con questo nome</p>';
  1109. break;
  1110. }
  1111. }
  1112. } else {
  1113. for (i=0; i<pres.options.length; i++) {
  1114. if (presname==pres.options[i].text) {
  1115. ok=false;
  1116. ckmsg.innerHTML='<p>Esiste già un preset con questo nome</p>';
  1117. break;
  1118. }
  1119. }
  1120. }
  1121. if (ok) {
  1122. pupoff();
  1123. savepres(presname,asnew);
  1124. }
  1125. }
  1126. function pupoff() {
  1127. var pup=document.getElementById('popup'), inpup=document.getElementById('inpopup');
  1128. inpup.innerHTML='<div id="popupcont">...</div>';
  1129. pup.style.display='none';
  1130. }
  1131. function gotopage(pi) {
  1132. document.getElementById('p').value=pi;
  1133. ckf();
  1134. }
  1135. //-->
  1136. </script>
  1137. </head>
  1138. <body>
  1139. <nav>
  1140. <div id="hmenu">
  1141. <ul>
  1142. <?php echo($menuout); ?>
  1143. </ul>
  1144. <div id="rightdiv">
  1145. <img src="imgs/cerca_off.svg" id="lente" class="rlinks" title="Mostra il pannello di ricerca e ordinamento" onclick="shideplancia();">
  1146. <a href="logout.php" class="rlinks"><img src="imgs/esci.svg" title="Esci"></a>
  1147. </div>
  1148. </div>
  1149. </nav>
  1150. <div id="popup">
  1151. <div id="inpopup">
  1152. <div id="popupcont">
  1153. ...
  1154. </div>
  1155. </div>
  1156. </div>
  1157. <div id="footer">
  1158. <?php echo($pgout); ?>
  1159. </div>
  1160. <div id="debug">
  1161. <?php echo($dbg); ?>
  1162. </div>
  1163. <div id="plancia">
  1164. <form method="post" id="f" onsubmit="ckf();">
  1165. <table id="planciafil" class="planciatab">
  1166. <tr><td colspan="8"><input type="button" id="filbut" value="Aggiungi criteri di ricerca" class="ctrlbut" onclick="manfil();"></td></tr>
  1167. </table>
  1168. <table id="planciaord" class="planciatab">
  1169. <tr><td colspan="4"><input type="button" id="ordbut" value="Aggiungi criteri di ordinamento" class="ctrlbut" onclick="manord();"></td></tr>
  1170. </table>
  1171. <table id="planciaothers" class="planciatab">
  1172. <tr><td><input type="button" id="subbut" value="Applica" class="ctrlbut" onclick="ckf();"></td></tr>
  1173. </table>
  1174. <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>
  1175. <input type="hidden" name="p" id="p" value="...">
  1176. </form>
  1177. </div>
  1178. <script language="JavaScript">
  1179. <!--
  1180. <?php
  1181. echo($jsaddrows);
  1182. echo($jssetrows);
  1183. echo($jsordaddrows);
  1184. echo($jsordsetrows);
  1185. ?>
  1186. //-->
  1187. </script>
  1188. <div id="fullscreen">
  1189. <div id="middlerow">
  1190. <?php echo($out); ?>
  1191. </div>
  1192. </div>
  1193. </body>
  1194. </html>