<?php $data = new DomDocument(); $data->load('data.xml'); $dataNode = $data->getElementsByTagName('data')->item(0); $mcupdatesNode = $dataNode->getElementsByTagName('mcupdates')->item(0); $releaseS = $mcupdatesNode->getElementsByTagName('release'); $text = ''; for ($i = $releaseS->length; $i > 1; $i--) { $release = $releaseS->item($i-1); $releaseInfos = $release->getElementsByTagName('infos')->item(0); $text .= '<h3>Minecraft '.$release->getAttribute('name').' '; if (isset($prevRelease)) { if ($release->getAttribute('name') == $prevRelease->getAttribute('name')) { $text .= '(version enterrée) '; } } $shortDescription = $releaseInfos->getAttribute('shortDescription'); if ($shortDescription == 'false') { $shortDescription = 'Pas de description.'; } $text .= '</h3><div class="release" id="R'.$release->getAttribute('id').'"><div class="shortDescription">'.$shortDescription.' <input type="button" value="+" class="more" /></div><div class="content"></div></div>'; $prevRelease = $release; } ?> <!DOCTYPE html> <html lang="fr"> <head> <title>Minecraft Checker</title> <meta charset="utf-8"> <link rel="stylesheet" media="screen" type="text/css" title="design" href="design.css"> <script type="text/javascript"> var checkIntervalForm; var checkState; var checkTimeout; var addXhr; var allReleases; var checkXhr; var lastId = <?php echo $mcupdatesNode->getAttribute('total'); ?>; window.onload = function () { checkIntervalForm = document.getElementById('checkActivate'); checkState = document.getElementById('checkState'); checkIntervalForm.addEventListener('change', function(e) { if (e.target.checked) { checkState.innerHTML = 'activé'; checkTimeout = true; check(); console.log('Checking activated'); } else { checkState.innerHTML = 'désactivé'; clearTimeout(checkTimeout); // TODO Annulation de checkXhr checkTimeout = false; checkXhr.abort(); console.log('Checking stopped'); } }, false); allReleases = document.getElementById('allreleases'); allReleaseS = allReleases.getElementsByClassName('more'); for (var allReleaseI = 0; allReleaseI < allReleaseS.length; allReleaseI++) { allReleaseS[allReleaseI].addEventListener('click', releaseOpen, false); } console.log('System initialised'); } function releaseOpen(e) { e.target.value = '...'; var releaseXhr = new XMLHttpRequest(); releaseXhr.onreadystatechange = function() { if (releaseXhr.readyState == 4 && (releaseXhr.status == 200 || releaseXhr.status == 0)) { e.target.removeEventListener('click', releaseOpen, false); console.log(' Infos recevied'); var content = e.target.parentNode.parentNode.getElementsByClassName('content')[0]; content.innerHTML = releaseXhr.responseText; if (content.getElementsByClassName('releaseFiles')[0]) { content.getElementsByClassName('releaseFilesButton')[0].addEventListener('click', releaseFilesOpen, false); filesDirExpandS = content.getElementsByClassName('dir'); for (var filesDirExpandI = 0; filesDirExpandI < filesDirExpandS.length; filesDirExpandI++) { filesDirExpandS[filesDirExpandI].addEventListener('click', releaseFilesDirOpen, false); } var releaseFilesSelectionS = content.getElementsByClassName('releaseFiles')[0].getElementsByTagName('input'); for (var releaseFilesSelectionI = 0; releaseFilesSelectionI < releaseFilesSelectionS.length; releaseFilesSelectionI++) { if (releaseFilesSelectionS[releaseFilesSelectionI].name == 'filesSelectionChangement' || releaseFilesSelectionS[releaseFilesSelectionI].name == 'filesSelectionClass') { releaseFilesSelectionS[releaseFilesSelectionI].addEventListener('click', releaseFilesOrderEvent, false); } } } e.target.value = '-'; e.target.addEventListener('click', releaseClose, false); } }; var releaseId = e.target.parentNode.parentNode.id.split('R')[1]; console.log('Searching details for release ID = '+releaseId+'.'); releaseXhr.open('GET', 'moreinfos.php?i='+releaseId, true); releaseXhr.send(null); } function releaseFilesDirOpen(e) { e.target.parentNode.getElementsByClassName('dirUl')[0].style.display = ''; e.target.className = 'dir opened'; e.target.removeEventListener('click', releaseFilesDirOpen, false); e.target.addEventListener('click', releaseFilesDirClose, false); } function releaseFilesDirClose(e) { e.target.parentNode.getElementsByClassName('dirUl')[0].style.display = 'none'; e.target.className = 'dir closed'; e.target.removeEventListener('click', releaseFilesDirClose, false); e.target.addEventListener('click', releaseFilesDirOpen, false); } function releaseClose(e) { e.target.value = '...'; e.target.parentNode.parentNode.getElementsByClassName('content')[0].innerHTML = ''; e.target.removeEventListener('click', releaseClose, false); e.target.addEventListener('click', releaseOpen, false); e.target.value = '+'; } function releaseFilesOpen(e) { e.target.value = '...'; var releaseFiles = e.target.parentNode.parentNode.getElementsByClassName('releaseFiles')[0]; releaseFiles.style.display = ''; releaseFilesOrder(releaseFiles); e.target.removeEventListener('click', releaseFilesOpen, false); e.target.addEventListener('click', releaseFilesClose, false); e.target.value = '-'; } function releaseFilesOrder(releaseFiles) { var releaseFilesFileS = releaseFiles.getElementsByClassName('file'); var releaseFilesSelectionClassAll = releaseFiles.getElementsByClassName('fileSelectionClassAll')[0].checked; var releaseFilesSelectionClassNonTechnic = releaseFiles.getElementsByClassName('fileSelectionClassNontechnic')[0].checked; var releaseFilesSelectionClassNone = releaseFiles.getElementsByClassName('fileSelectionClassNone')[0].checked; var releaseFilesSelectionChangementAll = releaseFiles.getElementsByClassName('fileSelectionChangementAll')[0].checked; var releaseFilesSelectionChangementChanged = releaseFiles.getElementsByClassName('fileSelectionChangementChanged')[0].checked; var releaseFilesSelectionChangementAdded = releaseFiles.getElementsByClassName('fileSelectionChangementAdded')[0].checked; for (var releaseFilesFileI = 0; releaseFilesFileI < releaseFilesFileS.length; releaseFilesFileI++) { var releaseFilesFileClassE = releaseFilesFileS[releaseFilesFileI].className.split(' '); var releaseFilesFileTechnic = in_array('technic', releaseFilesFileClassE); var releaseFilesFileClass = in_array('class', releaseFilesFileClassE); var releaseFilesFileChanged = in_array('change', releaseFilesFileClassE); var releaseFilesFileAdded = in_array('added', releaseFilesFileClassE); if ((releaseFilesSelectionClassAll || (releaseFilesSelectionClassNonTechnic && (!releaseFilesFileTechnic)) || (releaseFilesSelectionClassNone && (!releaseFilesFileClass))) && (releaseFilesSelectionChangementAll || (releaseFilesSelectionChangementChanged && (releaseFilesFileChanged || releaseFilesFileAdded)) || (releaseFilesSelectionChangementAdded && releaseFilesFileAdded))) { releaseFilesFileS[releaseFilesFileI].parentNode.style.display = ''; } else { releaseFilesFileS[releaseFilesFileI].parentNode.style.display = 'none'; } } } function releaseFilesOrderEvent(e) { releaseFilesOrder(e.target.parentNode.parentNode); } function releaseFilesClose(e) { e.target.value = '+'; e.target.parentNode.parentNode.getElementsByClassName('releaseFiles')[0].style.display = 'none'; e.target.removeEventListener('click', releaseFilesClose, false); e.target.addEventListener('click', releaseFilesOpen, false); } function check() { checkXhr = new XMLHttpRequest(); checkXhr.onreadystatechange = function() { if (checkXhr.readyState == 4 && (checkXhr.status == 200 || checkXhr.status == 0)) { console.log('Check finished, with information : '+checkXhr.responseText); var newReleaseE = checkXhr.responseText.split('|'); if (newReleaseE.length == 8 && checkTimeout) { if (newReleaseE[5] == lastId) { console.log(' Information analysed : no new release (date: '+newReleaseE[0]+').'); checkState.innerHTML = 'attente'; } else if (newReleaseE[5] > lastId) { console.log(' Information analysed : new release.'); checkState.innerHTML = 'nouvelle version'; // TODO Vérifier si (newReleaseE[5] == lastId+1) lastRelease = newReleaseE[6]; if (newReleaseE[7] == 'r' && newReleaseE[5] == lastId+1) { var newReleaseAlertType = 'La release complète'; } else if (newReleaseE[7] == 'apr' && newReleaseE[5] == lastId+1) { var newReleaseAlertType = 'La pre-release automatique'; } else if (newReleaseE[7] == 'pr' && newReleaseE[5] == lastId+1) { var newReleaseAlertType = 'La pre-release'; } else { console.error(' Bad informations on the new release. Reloading page.'); checkState.innerHTML = 'erreur'; location.reload(); return false; } lastId = newReleaseE[5]; console.info('New release: name: '+lastRelease+' id:'+newReleaseE[5]+' type: '+newReleaseE[7]+'.'); checkState.innerHTML = 'nouvelle version'; document.title='Version '+lastRelease+' sortie !'; alert(newReleaseAlertType+' '+lastRelease+' est sortie !'); location.reload(); } else { console.error('Database upset. Reloading page.'); checkState.innerHTML = 'erreur'; location.reload(); } checkTimeout = setTimeout('check()', 5000); } else if (!checkTimeout) { return false; } else { console.error('Error comited server-side.'); checkState.innerHTML = 'erreur'; } } }; checkXhr.open('GET', 'test.php', true); checkState.innerHTML = 'recherche'; checkXhr.send(null); } function in_array(needle, haystack) { for (key in haystack) { if (haystack[key] == needle) { return true; } } return false; } </script> </head> <body> <h1>Minecraft Checker</h1> <div id="body"> <h2>Rechercher des versions</h2> <p class="RL_search"><input type="checkbox" id="checkActivate" name="checkActivate"/><label for="checkActivate"> Rechercher les nouvelles releases (<span id="checkState">désactivé</span>)</label></p> <h2>Versions référencées</h2> <div id="allreleases"> <?php echo $text; ?> </div> </div> <footer> <p id="copyright">Copyright © <a href="https://twitter.com/#!/WebFrogeye">WebFrogeye</a> 2012</p> <p>Créé par <a href="https://twitter.com/#!/WebFrogeye">@WebFrogeye</a>.<br/> Avec l'aide d'<a href="https://twitter.com/#!/EphysPotato">@EphysPotato</a>.<br/> Sur un design de <a href="http://dlp.host56.com/">DLProduction</a>.<br/> D'après un script de <a href="https://twitter.com/#!/shellgratuit">@shellgratuit</a>.</p> </footer> <div id="cache" style="display: none;"></div> </body> </html>