edinsth.php 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515
  1. <?php
  2. require('include/glob.php');
  3. require('include/muoribene.php');
  4. require('include/sessionstart.php');
  5. require('include/myconn.php');
  6. require('include/getadmacc.php');
  7. require('include/tables.php');
  8. $tables=tables($link);
  9. require('include/mb_ucfirst.php');
  10. require('include/jsencode.php');
  11. $dbg='';
  12. use function mysqli_real_escape_string as myesc;
  13. // praticamente una macro
  14. function hspech($str) {
  15. return(htmlspecialchars($str,ENT_QUOTES|ENT_HTML5,'UTF-8'));
  16. }
  17. $contextopts=array(
  18. 'http'=>array(
  19. 'timeout'=>5
  20. ),
  21. 'socket'=>array(
  22. 'tcp_nodelay'=>true
  23. )
  24. );
  25. $context=stream_context_create($contextopts);
  26. $langs=array('xx'=>'Local language','ca'=>'Català','en'=>'English','es'=>'Español','fr'=>'Français','it'=>'Italiano');
  27. $exvalsjsarr='null;'.N;
  28. $morejs='';
  29. $dbg.='<pre>GET:'.N.print_r($_GET,1).'POST:'.N.print_r($_POST,1).'</pre>';
  30. function check(&$link,&$account,$mode,$table,$lntable,$lncolumn,$id) {
  31. if ($mode=='edit' || $mode=='remove') {
  32. $res=mysqli_query($link,'SELECT * FROM '.$table.' WHERE ID='.$id)
  33. or muoribene(__LINE__.': '.mysqli_error($link),true);
  34. if (mysqli_num_rows($res)==1) {
  35. $row=mysqli_fetch_assoc($res);
  36. if ($account['Level']=='guest') {
  37. if ($row['AddedBy']!=$account['ID'])
  38. muoribene('You can’t modify an entry you didn’t add.',true);
  39. if ($table!='Localities') {
  40. $que='SELECT * FROM '.$lntable.' LEFT JOIN Instances ON Instances.ID='.$lntable.'.InstID WHERE '.$lntable.'.'.$lncolumn.'='.$id.' AND Instances.ID NOT IN (SELECT ID FROM Instances WHERE GuestID='.$account['ID'].')';
  41. } else {
  42. $que='SELECT * FROM Instances WHERE LocalityID='.$id.' AND Instances.ID NOT IN (SELECT ID FROM Instances WHERE GuestID='.$account['ID'].')';
  43. }
  44. $rres=mysqli_query($link,$que)
  45. or muoribene(__LINE__.': '.mysqli_error($link).'<br>Query: '.hspech($que),true);
  46. if (mysqli_num_rows($rres)>0)
  47. muoribene('You can’t modify an entry that<br>has already been linked by others.',true);
  48. }
  49. } else {
  50. muoribene('There is no «'.$table.'» entry with ID='.$id.N,true);
  51. }
  52. } elseif ($mode=='add') {
  53. if ($account['Level']=='guest') {
  54. $res=mysqli_query($link,'SELECT * FROM '.$table.' WHERE AddedBy='.$account['ID'])
  55. or muoribene(__LINE__.': '.mysqli_error($link),true);
  56. if (mysqli_num_rows($res)>=$account['Max'.$table])
  57. muoribene('You can’t add more «'.$table.'»<br>entries ('.$account['Max'.$table].' max).',true);
  58. }
  59. }
  60. }
  61. function edaddrem($id,$table,$column,$dispselarr,$lntable,$lncolumn,$searchid,$dispselid,$recbid) {
  62. global $link, $morejs, $account, $dlang;
  63. check($link,$account,$_POST['m'],$table,$lntable,$lncolumn,$id);
  64. if ($_POST['m']=='edit' || $_POST['m']=='add') {
  65. $res=mysqli_query($link,'SELECT * FROM '.$table.' WHERE '.$column.'=\''.myesc($link,$_POST['v']).'\'')
  66. or muoribene(__LINE__.': '.mysqli_error($link),true);
  67. if (mysqli_num_rows($res)>0)
  68. muoribene('«'.hspech($_POST['v']).'» already exists!',true);
  69. }
  70. if ($_POST['m']=='edit') {
  71. if ($table!='Languages') {
  72. mysqli_query($link,'UPDATE '.$table.' SET '.$column.'=\''.myesc($link,$_POST['v']).'\' WHERE ID='.$id)
  73. or muoribene(__LINE__.': '.mysqli_error($link),true);
  74. } else {
  75. $langs=array('NameOrig'=>mb_ucfirst(locale_get_display_name($_POST['v'],$_POST['v'])),
  76. 'NameCA'=>mb_ucfirst(locale_get_display_name($_POST['v'],'ca')),
  77. 'NameEN'=>mb_ucfirst(locale_get_display_name($_POST['v'],'en')),
  78. 'NameES'=>mb_ucfirst(locale_get_display_name($_POST['v'],'es')),
  79. 'NameFR'=>mb_ucfirst(locale_get_display_name($_POST['v'],'fr')),
  80. 'NameIT'=>mb_ucfirst(locale_get_display_name($_POST['v'],'it')));
  81. if ($_POST['v']==$langs['NameOrig']) {
  82. muoribene('«'.$_POST['v'].'»: unknown language identifier.',true);
  83. } else {
  84. mysqli_query($link,'UPDATE '.$table.' SET Code=\''.myesc($link,$_POST['v']).'\', NameOrig=\''.myesc($link,$langs['NameOrig']).'\', NameCA=\''.myesc($link,$langs['NameCA']).'\', NameEN=\''.myesc($link,$langs['NameEN']).'\', NameES=\''.myesc($link,$langs['NameES']).'\', NameFR=\''.myesc($link,$langs['NameFR']).'\', NameIT=\''.myesc($link,$langs['NameIT']).'\' WHERE ID='.$id)
  85. or muoribene(__LINE__.': '.mysqli_error($link),true);
  86. $_POST['v']=$langs['Name'.$dlang].' ['.$_POST['v'].']';
  87. }
  88. }
  89. $morejs.='parent.'.$dispselarr.'=parent.cheltxtbyval(parent.'.$dispselarr.','.$id.',"'.jsencode($_POST['v']).'");'.N;
  90. $morejs.='parent.'.$dispselarr.'=parent.sortByKey(parent.'.$dispselarr.',0);'.N;
  91. $morejs.='parent.'.$dispselarr.'=parent.selonebyval(parent.'.$dispselarr.','.$id.');'.N;
  92. } elseif ($_POST['m']=='add') {
  93. if ($table!='Languages') {
  94. mysqli_query($link,'INSERT INTO '.$table.' (ID, '.$column.', AddedBy) VALUES (NULL, \''.myesc($link,$_POST['v']).'\', \''.$account['ID'].'\')')
  95. or muoribene(__LINE__.': '.mysqli_error($link),true);
  96. $newid=mysqli_insert_id($link);
  97. } else {
  98. $langs=array('NameOrig'=>mb_ucfirst(locale_get_display_name($_POST['v'],$_POST['v'])),
  99. 'NameCA'=>mb_ucfirst(locale_get_display_name($_POST['v'],'ca')),
  100. 'NameEN'=>mb_ucfirst(locale_get_display_name($_POST['v'],'en')),
  101. 'NameES'=>mb_ucfirst(locale_get_display_name($_POST['v'],'es')),
  102. 'NameFR'=>mb_ucfirst(locale_get_display_name($_POST['v'],'fr')),
  103. 'NameIT'=>mb_ucfirst(locale_get_display_name($_POST['v'],'it')));
  104. if (strtolower($_POST['v'])==strtolower($langs['NameOrig'])) {
  105. muoribene('«'.$_POST['v'].'»: unknown language identifier.',true);
  106. } else {
  107. mysqli_query($link,'INSERT INTO '.$table.' (ID, Code, NameOrig, NameCA, NameEN, NameES, NameFR, NameIT, AddedBy) VALUES (NULL, \''.myesc($link,$_POST['v']).'\', \''.myesc($link,$langs['NameOrig']).'\', \''.myesc($link,$langs['NameCA']).'\', \''.myesc($link,$langs['NameEN']).'\', \''.myesc($link,$langs['NameES']).'\', \''.myesc($link,$langs['NameFR']).'\', \''.myesc($link,$langs['NameIT']).'\', '.$account['ID'].')')
  108. or muoribene(__LINE__.': '.mysqli_error($link),true);
  109. $newid=mysqli_insert_id($link);
  110. $_POST['v']=$langs['Name'.$dlang].' ['.$_POST['v'].']';
  111. }
  112. }
  113. $morejs.='parent.'.$dispselarr.'.push(["'.jsencode($_POST['v']).'",'.$newid.',true]);'.N;
  114. $morejs.='parent.'.$dispselarr.'=parent.sortByKey(parent.'.$dispselarr.',0);'.N;
  115. $morejs.='parent.'.$dispselarr.'=parent.selonebyval(parent.'.$dispselarr.','.$newid.');'.N;
  116. } elseif ($_POST['m']=='remove') {
  117. if (!array_key_exists('subst',$_POST) || preg_match('/^[0-9]+$/',$_POST['subst'])!==1)
  118. muoribene(__LINE__.': Malformed input.',true);
  119. $newid=$_POST['subst']+0;
  120. mysqli_query($link,'DELETE FROM '.$table.' WHERE ID='.$id)
  121. or muoribene(__LINE__.': '.mysqli_error($link),true);
  122. if ($newid==0) {
  123. $res=mysqli_query($link,'SELECT * FROM '.$lntable.' WHERE '.$lncolumn.'='.$id)
  124. or muoribene(__LINE__.': '.mysqli_error($link),true);
  125. mysqli_query($link,'DELETE FROM '.$lntable.' WHERE '.$lncolumn.'='.$id)
  126. or muoribene(__LINE__.': '.mysqli_error($link),true);
  127. while ($row=mysqli_fetch_assoc($res)) {
  128. $rres=mysqli_query($link,'SELECT * FROM '.$lntable.' WHERE InstID='.$row['InstID'].' ORDER BY Pos ASC') or muoribene(__LINE__.': '.mysqli_error($link),true);
  129. $pos=0;
  130. while ($rrow=mysqli_fetch_assoc($rres)) {
  131. $pos++;
  132. mysqli_query($link,'UPDATE '.$lntable.' SET Pos='.$pos.' WHERE InstID='.$rrow['InstID'].' AND '.$lncolumn.'='.$rrow[$lncolumn].' AND Pos='.$rrow['Pos'])
  133. or muoribene(__LINE__.': '.mysqli_error($link),true);
  134. }
  135. }
  136. } else {
  137. $res=mysqli_query($link,'SELECT * FROM '.$lntable.' WHERE '.$lncolumn.'='.$id)
  138. or muoribene(__LINE__.': '.mysqli_error($link),true);
  139. while ($row=mysqli_fetch_assoc($res)) {
  140. $rres=mysqli_query($link,'SELECT * FROM '.$lntable.' WHERE InstID='.$row['InstID'].' AND '.$lncolumn.'='.$newid) or muoribene(__LINE__.': '.mysqli_error($link),true);
  141. if (mysqli_num_rows($rres)==0) {
  142. mysqli_query($link,'UPDATE '.$lntable.' SET '.$lncolumn.'='.$newid.' WHERE InstID='.$row['InstID'].' AND '.$lncolumn.'='.$id.' AND Pos='.$row['Pos']) or muoribene(__LINE__.': '.mysqli_error($link),true);
  143. //+++ potrebbe aver senso mettere js qui che sposti la voce agli associati se non è già lì, magari con un alerta
  144. } else {
  145. mysqli_query($link,'DELETE FROM '.$lntable.' WHERE InstID='.$row['InstID'].' AND '.$lncolumn.'='.$id.' AND Pos='.$row['Pos']) or muoribene(__LINE__.': '.mysqli_error($link),true);
  146. $rres=mysqli_query($link,'SELECT * FROM '.$lntable.' WHERE InstID='.$row['InstID'].' ORDER BY Pos ASC') or muoribene(__LINE__.': '.mysqli_error($link),true);
  147. $pos=0;
  148. while ($rrow=mysqli_fetch_assoc($rres)) {
  149. $pos++;
  150. mysqli_query($link,'UPDATE '.$lntable.' SET Pos='.$pos.' WHERE InstID='.$rrow['InstID'].' AND '.$lncolumn.'='.$rrow[$lncolumn].' AND Pos='.$rrow['Pos'])
  151. or muoribene(__LINE__.': '.mysqli_error($link),true);
  152. }
  153. }
  154. }
  155. }
  156. $morejs.='parent.'.$dispselarr.'=parent.rmelbyval(parent.'.$dispselarr.','.$id.');'.N;
  157. }
  158. $morejs.='parent.filtsel (parent.'.$dispselarr.', parent.document.getElementById("'.$searchid.'").value, "'.$dispselid.'", "'.$recbid.'", "'.$searchid.'", "white", "#ff8080");'.N;
  159. $morejs.='parent.closeinpup();'.N;
  160. }
  161. if (array_key_exists('w',$_GET) && array_key_exists('i',$_GET) && preg_match('/^[0-9]+$/',$_GET['i'])===1 && array_key_exists('m',$_GET) && in_array($_GET['m'],array('edit','add','remove'))) {
  162. $id=$_GET['i']+0;
  163. switch ($_GET['w']) {
  164. case 'LocalityID':
  165. $out=buildform($id,'Localities','Name'.$dlang,'Location name','Instances','LocalityID');
  166. $exvalsjsarr=setjsarr('Localities','Name'.$dlang);
  167. break;
  168. case 'DispLangs':
  169. $out=buildform($id,'Languages','Code','Language code','InstOurLangs','OurLangID');
  170. $exvalsjsarr=setjsarr('Languages','Code');
  171. break;
  172. case 'DispFinModes':
  173. $out=buildform($id,'Financing','Type','Financing modality','InstFinancing','FinID');
  174. $exvalsjsarr=setjsarr('Financing','Type');
  175. break;
  176. case 'DispPolicies':
  177. $out=buildform($id,'Policies','Name','Policy','InstPolicies','PolID');
  178. $exvalsjsarr=setjsarr('Policies','Name');
  179. break;
  180. case 'DispTags':
  181. $out=buildform($id,'Tags','Name','Tag','InstTags','TagID');
  182. $exvalsjsarr=setjsarr('Tags','Name');
  183. break;
  184. default:
  185. muoribene(__LINE__.': Malformed input.',true);
  186. break;
  187. }
  188. } elseif (array_key_exists('m',$_POST) && in_array($_POST['m'],array('edit','add','remove')) && array_key_exists('t',$_POST) && in_array($_POST['t'],array('Localities','Languages','Financing','Policies','Tags')) && array_key_exists('i',$_POST) && preg_match('/^[0-9]+$/',$_POST['i'])===1) {
  189. $id=$_POST['i']+0;
  190. if (array_key_exists('v',$_POST)) {
  191. $out='';
  192. if ($_POST['t']=='Localities') {
  193. if ($_POST['m']!='remove') {
  194. //https://nominatim.openstreetmap.org/search?q=bresso,+milano&format=json&accept-language=fr&email=pezcurrel@tiscali.it
  195. //https://nominatim.openstreetmap.org/lookup?osm_ids=R45266&format=json&accept-language=fr&addressdetails=1&email=pezcurrel@tiscali.it
  196. $url='https://nominatim.openstreetmap.org/search?q='.urlencode($_POST['v']).'&format=json&email='.$iniarr['ref_email'];
  197. $osmd=@file_get_contents($url,false,$context);
  198. if ($osmd!==false) {
  199. $osmd=json_decode($osmd,true);
  200. if (count($osmd)>0) {
  201. $addrkeys=array('neighbourhood','borough','suburb','city','municipality','county','district','province','region','state','country');
  202. $onegood=false;
  203. $divs='';
  204. foreach ($osmd as $loc) {
  205. $good=false;
  206. $div='';
  207. //$loc=array(); // simula errore
  208. if (array_key_exists('osm_id',$loc) && array_key_exists('osm_type',$loc) && $loc['osm_type']=='relation') {
  209. $div.='<input type="hidden" id="OSMID-'.$loc['osm_id'].'" value="'.$loc['osm_id'].'">'.N;
  210. $div.='<ul class="hiful">'.N;
  211. foreach ($langs as $code=>$lang) {
  212. $hidval='';
  213. $url='https://nominatim.openstreetmap.org/lookup?osm_ids=R'.$loc['osm_id'].'&format=json&accept-language='.$code.'&addressdetails=1&email='.$iniarr['ref_email'];
  214. $osmdil=@file_get_contents($url,false,$context);
  215. if ($osmdil!==false) {
  216. $osmdil=json_decode($osmdil,true);
  217. if (array_key_exists(0,$osmdil) && array_key_exists('address',$osmdil[0])) {
  218. //$osmdil[0]['address']=array(); // simula errore
  219. $dispname=array();
  220. foreach ($addrkeys as $addrkey)
  221. if (array_key_exists($addrkey,$osmdil[0]['address']))
  222. $dispname[]=$osmdil[0]['address'][$addrkey];
  223. if (count($dispname)>0) {
  224. $dispname=array_unique($dispname);
  225. $dispname=implode(', ',$dispname);
  226. $div.='<li><strong>'.$lang.':</strong> '.hspech($dispname).'</li>'.N;
  227. $hidval=jsencode($dispname);
  228. if ($code=='xx') {
  229. $res=mysqli_query($link,'SELECT NameOrig FROM Localities WHERE NameOrig=\''.myesc($link,$dispname).'\'')
  230. or muoribene(__LINE__.': '.mysqli_error($link),true);
  231. if (mysqli_num_rows($res)==0)
  232. $good=true;
  233. }
  234. } else {
  235. $div.='<li><strong>'.$lang.':</strong> <span class="hiferr">No useful «address» data found in OpenStreetMap lookup data.</span></li>'.N;
  236. }
  237. } else {
  238. $div.='<li><strong>'.$lang.':</strong> <span class="hiferr">No «address» found in OpenStreetMap lookup data.</span></li>'.N;
  239. }
  240. } else {
  241. $div.='<li><strong>'.$lang.':</strong> <span class="hiferr">Couldn’t fetch OpenStreetMap lookup data.</span></li>'.N;
  242. }
  243. $div.='<input type="hidden" id="Loc'.strtoupper($code).'-'.$loc['osm_id'].'" value="'.$hidval.'">'.N;
  244. }
  245. if ($good) {
  246. $onegood=true;
  247. $divs.='<div class="hifloc" onclick="subosmd(\''.$loc['osm_id'].'\');">'.N.$div;
  248. } else {
  249. $divs.='<div class="hiflocno">'.N.$div;
  250. }
  251. $divs.='</ul>'.N.'</div>'.N;
  252. }
  253. }
  254. if ($onegood) {
  255. $out.='<form action="edinsth.php" method="post" id="f">'.N;
  256. $out.='<p><strong>Please choose the most appropriate entry<br>among those with green background</strong></p>'.N;
  257. $out.=$divs;
  258. $out.='<input type="hidden" id="i" name="i" value="'.$_POST['i'].'">'.N;
  259. $out.='<input type="hidden" id="t" name="t" value="'.$_POST['t'].'">'.N;
  260. $out.='<input type="hidden" id="m" name="m" value="'.$_POST['m'].'">'.N;
  261. $out.='<input type="hidden" id="OSMID" name="OSMID" value="">'.N;
  262. $out.='<input type="hidden" id="LocXX" name="LocXX" value="">'.N;
  263. $out.='<input type="hidden" id="LocCA" name="LocCA" value="">'.N;
  264. $out.='<input type="hidden" id="LocEN" name="LocEN" value="">'.N;
  265. $out.='<input type="hidden" id="LocES" name="LocES" value="">'.N;
  266. $out.='<input type="hidden" id="LocFR" name="LocFR" value="">'.N;
  267. $out.='<input type="hidden" id="LocIT" name="LocIT" value="">'.N;
  268. $out.='</form>'.N;
  269. } else {
  270. $out.='<p><strong>Sorry, no good OpenStreetMap entry was found<br>(they are either incomplete or already in our database)</strong></p>'.N;
  271. $out.=$divs;
  272. }
  273. } else {
  274. $out='<p class="hiferr">Couldn’t find OpenStreetMap data for «'.hspech($_POST['v']).'».</p>';
  275. }
  276. } else {
  277. $out='<p class="hiferr">Couldn’t fetch OpenStreetMap search data.</p>'.N;
  278. }
  279. } else {
  280. // locality remove
  281. check($link,$account,$_POST['m'],'Localities','Instances','LocalityID',$id);
  282. $out='CANCELLO!';
  283. if (!array_key_exists('subst',$_POST) || preg_match('/^[0-9]+$/',$_POST['subst'])!==1)
  284. muoribene(__LINE__.': Malformed input.',true);
  285. $_POST['subst']+=0;
  286. if ($_POST['subst']==0) {
  287. mysqli_query($link,'UPDATE Instances SET LocalityID=NULL WHERE LocalityID='.$id)
  288. or muoribene(__LINE__.': '.mysqli_error($link),true);
  289. } else {
  290. mysqli_query($link,'UPDATE Instances SET LocalityID='.$_POST['subst'].' WHERE LocalityID='.$id)
  291. or muoribene(__LINE__.': '.mysqli_error($link),true);
  292. }
  293. mysqli_query($link,'DELETE FROM Localities WHERE ID='.$id)
  294. or muoribene(__LINE__.': '.mysqli_error($link),true);
  295. $morejs.='parent.locselarr=parent.rmelbyval(parent.locselarr,'.$id.');'.N;
  296. $morejs.='parent.filtsel (parent.locselarr, parent.document.getElementById("locsearch").value, "LocalityID", "locselre", "locsearch", "white", "#ff8080");'.N;
  297. $morejs.='parent.closeinpup();'.N;
  298. }
  299. } elseif ($_POST['t']=='Languages') {
  300. edaddrem($id,'Languages','Name'.$dlang,'langselarr','InstOurLangs','OurLangID','langsearch','DispLangs','langselre');
  301. } elseif ($_POST['t']=='Financing') {
  302. edaddrem($id,'Financing','Type','finselarr','InstFinancing','FinID','finsearch','DispFinModes','finselre');
  303. } elseif ($_POST['t']=='Policies') {
  304. edaddrem($id,'Policies','Name','polselarr','InstPolicies','PolID','polsearch','DispPolicies','polselre');
  305. } elseif ($_POST['t']=='Tags') {
  306. edaddrem($id,'Tags','Name','tagselarr','InstTags','TagID','tagsearch','DispTags','tagselre');
  307. } else {
  308. // questo è ridondante ma fa niente
  309. muoribene(__LINE__.': Malformed input.',true);
  310. }
  311. } elseif (array_key_exists('OSMID',$_POST) && preg_match('/^[0-9]+$/',$_POST['OSMID'])===1 && array_key_exists('LocXX',$_POST) && array_key_exists('LocCA',$_POST) && array_key_exists('LocEN',$_POST) && array_key_exists('LocES',$_POST) && array_key_exists('LocFR',$_POST) && array_key_exists('LocIT',$_POST)) {
  312. // locality edit/add
  313. check($link,$account,$_POST['m'],'Localities','Instances','LocalityID',$id);
  314. $res=mysqli_query($link,'SELECT * FROM Localities WHERE Name'.$dlang.'=\''.myesc($link,$_POST['Loc'.$dlang]).'\'')
  315. or muoribene(__LINE__.': '.mysqli_error($link),true);
  316. if (mysqli_num_rows($res)>0)
  317. muoribene('«'.hspech($_POST['Loc'.$dlang]).'» already exists!',true);
  318. $out='EDITO/AGGIUNGO!';
  319. if ($_POST['m']=='add') {
  320. mysqli_query($link,'INSERT INTO Localities (ID, OSMID, NameOrig, NameCA, NameEN, NameES, NameFR, NameIT, AddedBy) VALUES (NULL, \''.myesc($link,$_POST['OSMID']).'\', \''.myesc($link,$_POST['LocXX']).'\', \''.myesc($link,$_POST['LocCA']).'\', \''.myesc($link,$_POST['LocEN']).'\', \''.myesc($link,$_POST['LocES']).'\', \''.myesc($link,$_POST['LocFR']).'\', \''.myesc($link,$_POST['LocIT']).'\', \''.$account['ID'].'\')')
  321. or muoribene(__LINE__.': '.mysqli_error($link),true);
  322. $id=mysqli_insert_id($link);
  323. $morejs.='parent.locselarr.push(["'.jsencode($_POST['Loc'.$dlang]).'",'.$id.',true]);'.N;
  324. } elseif ($_POST['m']=='edit') {
  325. mysqli_query($link,'UPDATE Localities SET OSMID=\''.myesc($link,$_POST['OSMID']).'\', NameOrig=\''.myesc($link,$_POST['LocXX']).'\', NameCA=\''.myesc($link,$_POST['LocCA']).'\', NameEN=\''.myesc($link,$_POST['LocEN']).'\', NameES=\''.myesc($link,$_POST['LocES']).'\', NameFR=\''.myesc($link,$_POST['LocFR']).'\', NameIT=\''.myesc($link,$_POST['LocIT']).'\' WHERE ID='.$id)
  326. or muoribene(__LINE__.': '.mysqli_error($link),true);
  327. $morejs.='parent.locselarr=parent.cheltxtbyval(parent.locselarr,'.$id.',"'.jsencode($_POST['Loc'.$dlang]).'");'.N;
  328. }
  329. $morejs.='parent.locselarr=parent.sortByKey(parent.locselarr,0);'.N;
  330. $morejs.='parent.locselarr=parent.selonebyval(parent.locselarr,'.$id.');'.N;
  331. $morejs.='parent.filtsel (parent.locselarr, parent.document.getElementById("locsearch").value, "LocalityID", "locselre", "locsearch", "white", "#ff8080");'.N;
  332. $morejs.='parent.closeinpup();'.N;
  333. } else {
  334. muoribene(__LINE__.': Malformed input.',true);
  335. }
  336. } else {
  337. muoribene(__LINE__.': Malformed input.',true);
  338. }
  339. function buildform($id,$table,$column,$title,$lntable,$lncolumn) {
  340. global $account, $tables, $link;
  341. check($link,$account,$_GET['m'],$table,$lntable,$lncolumn,$id);
  342. $out='';
  343. if ($_GET['m']=='edit' || $_GET['m']=='remove') {
  344. $res=mysqli_query($link,'SELECT * FROM '.$table.' WHERE ID='.$id)
  345. or muoribene(__LINE__.': '.mysqli_error($link),true);
  346. $row=mysqli_fetch_assoc($res);
  347. if ($_GET['m']=='edit') {
  348. $out.='<div class="hiflab"><label for="v">'.$title.'</label></div>'.N;
  349. $out.='<input type="text" class="hifinp" name="v" id="v" maxlength="'.$tables[$table][$column].'" value="'.hspech($row[$column]).'">'.N;
  350. $out.='<script language="JavaScript">'.N;
  351. $out.='<!--'.N;
  352. $out.='document.getElementById(\'v\').focus();'.N;
  353. $out.='document.getElementById(\'v\').select();'.N;
  354. $out.='//-->'.N;
  355. $out.='</script>'.N;
  356. } elseif ($_GET['m']=='remove') {
  357. $lnres=mysqli_query($link,'SELECT * FROM '.$lntable.' WHERE '.$lncolumn.'='.$id)
  358. or muoribene(__LINE__.': '.mysqli_error($link),true);
  359. $nlinking=mysqli_num_rows($lnres);
  360. if ($nlinking>0) {
  361. $out.='<div class="hiflab">«'.hspech($row[$column]).'» is referenced by '.$nlinking.' '.(($nlinking==1) ? 'instance' : 'instances').'!</div>'.N;
  362. $out.='<div class="hifdiv">What do you want to do with '.(($nlinking==1) ? 'this reference' : 'those '.$nlinking.' references').'?<br>If you choose “Delete” '.(($nlinking==1) ? 'it' : 'they').' will be removed; otherwise you can select a substitution record.</div>'.N;
  363. $out.='<select id="subst" name="subst" class="hifinp">'.N;
  364. $out.='<option value="0">Delete</option>'.N;
  365. $lnres=mysqli_query($link,'SELECT * FROM '.$table.' WHERE ID!='.$id.' ORDER BY '.$column.' ASC')
  366. or muoribene(__LINE__.': '.mysqli_error($link),true);
  367. while ($lnrow=mysqli_fetch_assoc($lnres)) {
  368. $out.='<option value="'.$lnrow['ID'].'">Subst. with «'.hspech($lnrow[$column]).'»</option>'.N;
  369. }
  370. $out.='</select>'.N;
  371. } else {
  372. $out.='<input type="hidden" name="subst" value="0">'.N;
  373. }
  374. $out.='<div class="hiflab">Are you sure you want to remove «'.$row[$column].'»?</div>'.N;
  375. $out.='<input type="hidden" name="v" value="IGNORAMI">'.N;
  376. }
  377. $out.='<input type="hidden" name="i" value="'.$id.'">'.N;
  378. } elseif ($_GET['m']=='add') {
  379. $out.='<div class="hiflab"><label for="v">'.$title.'</label></div>'.N;
  380. $out.='<input type="text" class="hifinp" name="v" id="v" maxlength="'.$tables[$table][$column].'" value="">'.N;
  381. $out.='<script language="JavaScript">'.N;
  382. $out.='<!--'.N;
  383. $out.='document.getElementById(\'v\').focus();'.N;
  384. $out.='document.getElementById(\'v\').select();'.N;
  385. $out.='//-->'.N;
  386. $out.='</script>'.N;
  387. $out.='<input type="hidden" name="i" value="0">'.N;
  388. }
  389. $out.='<input type="hidden" name="m" value="'.$_GET['m'].'">'.N;
  390. $out.='<input type="hidden" name="t" value="'.$table.'">'.N;
  391. $out.='<div id="errmsg"></div>'.N;
  392. $out.='<table class="hiftab"><tr><td style="width:50%"><input type="button" value="Cancel" class="hifbut" onclick="parent.closeinpup()"></td><td style="width:50%"><input type="button" value="Ok" class="hifbut" onclick="ckf(\''.$_GET['m'].'\',\''.$table.'\')"></td></tr></table>'.N;
  393. $out='<form action="edinsth.php" method="post" id="f" onsubmit="return ckf(\''.$_GET['m'].'\',\''.$table.'\');">'.N.$out.'</form>'.N;
  394. return($out);
  395. }
  396. function setjsarr($table,$column) {
  397. global $link;
  398. $jsarr=array();
  399. $res=mysqli_query($link,'SELECT '.$column.' FROM '.$table)
  400. or muoribene(__LINE__.': '.mysqli_error($link),true);
  401. while ($row=mysqli_fetch_assoc($res)) {
  402. $jsarr[]=jsencode(strtolower($row[$column]));
  403. }
  404. $jsarr='["'.implode('","',$jsarr).'"];'.N;
  405. return($jsarr);
  406. }
  407. mysqli_close($link);
  408. ?>
  409. <!DOCTYPE HTML>
  410. <html lang="en">
  411. <head>
  412. <title>Mustard - Little edit’s helper</title>
  413. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  414. <meta name="description" content="Admin pages for Mastodon Startpage">
  415. <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
  416. <script language="JavaScript" src="js/confirma.js?v=<?php echo($cjrand); ?>"></script>
  417. <script language="JavaScript" src="js/alerta.js?v=<?php echo($cjrand); ?>"></script>
  418. <link rel="stylesheet" type="text/css" href="theme.css?v=<?php echo($cjrand); ?>">
  419. <script language="JavaScript">
  420. <!--
  421. exvalsarr=<?php echo($exvalsjsarr); ?>
  422. function ckf(mode,table) {
  423. var ok=false;
  424. if (mode=='remove') {
  425. ok=true;
  426. } else if (mode=='add' || mode=='edit') {
  427. var val=document.getElementById('v').value.trim(), vallow=val.toLowerCase(), len=exvalsarr.length, i=0, found=false;
  428. document.getElementById('v').value=val;
  429. if (val!='') {
  430. for (i=0; i<len; i++) {
  431. if (exvalsarr[i]==vallow) {
  432. found=true;
  433. break;
  434. }
  435. }
  436. if (found) {
  437. document.getElementById('errmsg').innerHTML='«'+val+'» already exists!';
  438. } else {
  439. ok=true;
  440. }
  441. } else {
  442. document.getElementById('errmsg').innerHTML='You can’t submit an empty value!';
  443. }
  444. }
  445. if (ok) {
  446. var wdiv=document.getElementById('wait');
  447. if (table=='Localities' && mode!='remove')
  448. wdiv.innerHTML='Fetching data from OpenStreetMap.org (can take some time) ...';
  449. else
  450. wdiv.innerHTML='Sending data ...';
  451. wdiv.style.display='block';
  452. document.getElementById('f').submit();
  453. } else {
  454. return false;
  455. }
  456. }
  457. function subosmd(osmid) {
  458. if (document.getElementById('OSMID-'+osmid).value=='' || document.getElementById('LocXX-'+osmid).value=='' || document.getElementById('LocCA-'+osmid).value=='' || document.getElementById('LocEN-'+osmid).value=='' || document.getElementById('LocES-'+osmid).value=='' || document.getElementById('LocFR-'+osmid).value=='' || document.getElementById('LocIT-'+osmid).value=='') {
  459. alerta('Error','<p>Couldn’t save this entry: missing data for one or more languages.</p>');
  460. } else {
  461. document.getElementById('OSMID').value=document.getElementById('OSMID-'+osmid).value;
  462. document.getElementById('LocXX').value=document.getElementById('LocXX-'+osmid).value;
  463. document.getElementById('LocCA').value=document.getElementById('LocCA-'+osmid).value;
  464. document.getElementById('LocEN').value=document.getElementById('LocEN-'+osmid).value;
  465. document.getElementById('LocES').value=document.getElementById('LocES-'+osmid).value;
  466. document.getElementById('LocFR').value=document.getElementById('LocFR-'+osmid).value;
  467. document.getElementById('LocIT').value=document.getElementById('LocIT-'+osmid).value;
  468. document.getElementById('f').submit();
  469. }
  470. }
  471. <?php echo($morejs); ?>
  472. //-->
  473. </script>
  474. </head>
  475. <body class="hifbody">
  476. <div id="fullscreen">
  477. <div id="middlerow">
  478. <?php echo($out); ?>
  479. </div>
  480. </div>
  481. <!--
  482. <div id="debugh">
  483. <?php echo($dbg); ?>
  484. </div>
  485. -->
  486. <div id="wait">
  487. ...
  488. </div>
  489. <div id="popup">
  490. <div id="inpopup">
  491. <div id="popupcont">
  492. ...
  493. </div>
  494. </div>
  495. </div>
  496. </body>
  497. </html>