Текущая версия |
Ваш текст |
Строка 21: |
Строка 21: |
| | | |
| | | |
− | == Клиент == | + | == Результат == |
| | | |
| {{#widget:Iframe|url=https://ailurus.ru/utilities/scape/|width=900|height=760|border=1}} | | {{#widget:Iframe|url=https://ailurus.ru/utilities/scape/|width=900|height=760|border=1}} |
| | | |
− | <div class="mw-collapsible mw-collapsed"> | + | <big>[https://ailurus.ru/utilities/scape/ Страница полного решения]</big> |
− | '''Исходный код клиента [JavaScript]:''' <div class="mw-collapsible-content">
| |
− | <syntaxhighlight lang="javascript" line start="1" enclose="div">
| |
− | /* | |
− | ------<====== Prelusive JS ======>------
| |
− | */
| |
− | function setCookie(cookieName, cookieValue){
| |
− | document.cookie = cookieName + "=" + encodeURIComponent(cookieValue) + ";expires=" +
| |
− | (new Date(new Date().getFullYear() + 2,0,0)).toUTCString();
| |
− | }
| |
− | function setCookieWithSpecifiedUTCDate(cookieName, cookieValue, cookieDate){
| |
− | document.cookie = cookieName + "=" + encodeURIComponent(cookieValue) + ";expires=" +
| |
− | cookieDate;
| |
− | }
| |
− | function getCookie(cookieName){
| |
− | var cookieValue = document.cookie.match('(^|;)?' + cookieName + '=([^;]*)(;|$)');
| |
− | return cookieValue ? decodeURIComponent(cookieValue[2]) : '';
| |
− | }
| |
− | function deleteCookie(cookieName){
| |
− | document.cookie = cookieName + "=" + ";expires=Thu Jan 01 1970 00:00:00";
| |
− | }
| |
− | /*
| |
− | ------<====== End ======>------
| |
− | ------<====== Generic JS ======>------
| |
− | */
| |
− | function runScapeClient(){
| |
− | document.getElementById('chooseTaskButton').onclick = function(){
| |
− | document.getElementById('createTask').style.display = 'none';
| |
− | document.getElementById('chooseTask').style.display = 'block';
| |
− | };
| |
− | document.getElementById('uploadFilesButton').onclick = function(){
| |
− | document.getElementById('createTask').style.display = 'none';
| |
− | document.getElementById('uploadFiles').style.display = 'block';
| |
− | };
| |
− | document.getElementById('sendTask').onclick = function(){
| |
− | if(!document.getElementById('tasks').selectedIndex){
| |
− | document.getElementById('creation').className = 'error';
| |
− | return;
| |
− | }
| |
− |
| |
− | var id = generateId();
| |
− | var task = document.getElementById('tasks').value;
| |
− | var numberOfRealisations = document.getElementById('numberOfRealisations').valueAsNumber;
| |
− | var parameters = document.getElementById('parameters').value;
| |
− |
| |
− | chooseTaskClean();
| |
− | | |
− | var taskElement = document.createElement('div');
| |
− | taskElement.id = 'task' + id;
| |
− | taskElement.className = 'task';
| |
− | taskElement.innerHTML = '<span class="title">' + task + ' [' + numberOfRealisations + ']</span><br>' +
| |
− | 'Параметры: ' + (parameters ? parameters : 'по умолчанию') +
| |
− | '<br>Прошло: <span id="timeWindow' + id + '" data-time="' + new Date() + '">-</span><br>' +
| |
− | '<span id="stop' + id + '" class="button">Прервать</span>' +
| |
− | '<span id="reload' + id + '" class="button">Перезапустить</span>' +
| |
− | '<span id="result' + id + '" class="button">Результаты</span>';
| |
− | document.getElementById('workspace')
| |
− | .insertBefore(taskElement, document.getElementById('creation').nextSibling);
| |
− | var taskWindow = document.getElementById('task' + id);
| |
− | setTimeout(function(){
| |
− | taskWindow.style.height = '86px';
| |
− | taskWindow.style.color = '#fff';
| |
− | taskWindow.style.opacity = '1';
| |
− | }, 1);
| |
− | var timer = setInterval(function(){
| |
− | var timeWindow = document.getElementById('timeWindow' + id);
| |
− | var startDate = timeWindow.getAttribute('data-time');
| |
− | var elapsedTime = (new Date() - new Date(startDate)) / 1000;
| |
− | timeWindow.innerText = formatTime(elapsedTime);
| |
− | }, 1000);
| |
− | sendTask(id, task, numberOfRealisations, parameters, timer);
| |
− | };
| |
− | document.getElementById('uploadFiles').onclick = function(){
| |
− | uploadFiles(document.getElementById('files').files);
| |
− | };
| |
− | document.getElementById('chooseTaskCancel').onclick = chooseTaskClean;
| |
− | document.getElementById('uploadFilesCancel').onclick = uploadFilesClean;
| |
− | document.getElementById('updateSpecsButton').onclick = updateSpecs;
| |
− | try{
| |
− | if(document.queryCommandEnabled('copy')){
| |
− | document.getElementById('copyResults').onclick = function(){
| |
− | document.getElementById('results').select();
| |
− | document.execCommand('copy');
| |
− | };
| |
− | document.getElementById('copyResults').style.display = 'inline';
| |
− | }else{
| |
− | document.getElementById('selectResults').onclick = function(){
| |
− | document.getElementById('results').select();
| |
− | };
| |
− | document.getElementById('selectResults').style.display = 'inline';
| |
− | }
| |
− | }catch(e){}
| |
− | document.getElementById('saveResults').onclick = saveResult;
| |
− | document.getElementById('closeResults').onclick = function(){
| |
− | document.getElementById('results').innerText = '';
| |
− | document.getElementById('resultsWindow').style.display = 'none';
| |
− | };
| |
− | document.getElementById('message').onclick = function(e){
| |
− | this.style.display = 'none';
| |
− | this.innerHtml = '';
| |
− | this.className = '';
| |
− | }
| |
− | setInterval(updateSpecs, 60000);
| |
− | updateSpecs();
| |
− | updateTasks();
| |
− | }
| |
− | | |
− | var generateId = (function(){var i = 0; return (function(){return ++i;});})();
| |
− | | |
− | function createCORSInstance(method, url){
| |
− | var r = new XMLHttpRequest;
| |
− | "withCredentials" in r ? r.open(method, url, !0) : "undefined" != typeof XDomainRequest ? (r = new XDomainRequest, r.open(method,url)) : r = null
| |
− | return r;
| |
− | }
| |
− | function updateSpecs(){
| |
− | var r = createCORSInstance('GET', 'http://tm.spbstu.ru:8100/specs/');
| |
− | var elements = document.querySelectorAll('[id^=\'specs_\']');
| |
− | for(var key in elements) elements[key].innerText = '-';
| |
− | r.onerror = function(){
| |
− | var message = document.getElementById('message');
| |
− | message.innerHTML = message.innerHTML + 'Не удалось загрузить характеристики.<br>'
| |
− | message.className = 'error';
| |
− | message.style.display = 'block';
| |
− | }
| |
− | r.onload = function(){
| |
− | var specs = JSON.parse(this.response);
| |
− | for(var key in specs) document.getElementById('specs_' + key).innerText = specs[key];
| |
− | };
| |
− | r.send();
| |
− | }
| |
− | function updateTasks(){
| |
− | var r = createCORSInstance('GET', 'http://tm.spbstu.ru:8100/tasks/');
| |
− | var tasks = document.querySelectorAll('#tasks option[value]');
| |
− | for(var i = 0; i < tasks.length; ++i) tasks[i].remove();
| |
− | r.onerror = function(){
| |
− | var message = document.getElementById('message');
| |
− | message.innerHTML = message.innerHTML + 'Не удалось загрузить список заданий.<br>'
| |
− | message.className = 'error';
| |
− | message.style.display = 'block';
| |
− | }
| |
− | r.onload = function(){
| |
− | var tasks = JSON.parse(this.response);
| |
− | var tasksList = document.getElementById('tasks');
| |
− | for(var i = 0; i < tasks.length; ++i){
| |
− | var task = document.createElement('option');
| |
− | task.value = task.innerText = tasks[i].slice(0, -3);
| |
− | tasksList.appendChild(task);
| |
− | }
| |
− | };
| |
− | r.send();
| |
− | }
| |
− | function sendTask(id, task, numberOfRealisations, parameters, timer){
| |
− | var r = createCORSInstance('GET', 'http://tm.spbstu.ru:8100/' + encodeURIComponent(task) + '/' +
| |
− | numberOfRealisations + '/' + parameters.replace(/, /g, '&'));//fix encode
| |
− | console.log('http://tm.spbstu.ru:8100/' + encodeURIComponent(task) + '/' +
| |
− | numberOfRealisations + '/' + parameters.replace(/, /g, '&'));
| |
− | var taskElement = document.getElementById('task' + id);
| |
− | var stopButton = document.getElementById('stop' + id);
| |
− | var reloadButton = document.getElementById('reload' + id);
| |
− | var resultButton = document.getElementById('result' + id);
| |
− | stopButton.style.display = 'inline';
| |
− | reloadButton.style.display = 'none';
| |
− | resultButton.style.display = 'none';
| |
− | stopButton.onclick = function(){
| |
− | r.abort();
| |
− | clearTimeout(timer);
| |
− | taskElement.className = 'default';
| |
− | stopButton.style.display = 'none';
| |
− | reloadButton.style.display = 'inline';
| |
− | resultButton.style.display = 'none';
| |
− | };
| |
− | reloadButton.onclick = function(){
| |
− | r.send();
| |
− | };
| |
− | r.onerror = function(){
| |
− | clearTimeout(timer);
| |
− | taskElement.className = 'error';
| |
− | stopButton.style.display = 'none';
| |
− | reloadButton.style.display = 'inline';
| |
− | resultButton.style.display = 'none';
| |
− | }
| |
− | r.onload = function(){
| |
− | var result = this.response;
| |
− | console.log(result);
| |
− | clearTimeout(timer);
| |
− | taskElement.className = 'success';
| |
− | stopButton.style.display = 'none';
| |
− | reloadButton.style.display = 'none';
| |
− | resultButton.style.display = 'inline';
| |
− | resultButton.onclick = function(){
| |
− | document.getElementById('results').innerText = result;
| |
− | document.getElementById('resultsWindow').style.display = 'block';
| |
− | };
| |
− | };
| |
− | r.send();
| |
− | }
| |
− | function uploadFiles(files){
| |
− | var r = createCORSInstance('POST', 'http://tm.spbstu.ru:8100/upload/');
| |
− | var f = new FormData();
| |
− | for (var i = 0; i < files.length; ++i){
| |
− | var file = files[i];
| |
− | if(!file.type.match('application/x-javascript')){
| |
− | continue;
| |
− | }
| |
− | f.append('files', file, file.name);
| |
− | }
| |
− | r.onerror = function(){
| |
− | var message = document.getElementById('message');
| |
− | message.innerHTML = message.innerHTML + 'Не удалось загрузить файлы.<br>'
| |
− | message.className = 'error';
| |
− | message.style.display = 'block';
| |
− | }
| |
− | r.onload = function(){
| |
− | console.log(this.response);
| |
− | };
| |
− | r.send(f);
| |
− | }
| |
− | function saveResult(){
| |
− | var r = createCORSInstance('POST', './server/give.php');
| |
− | var f = new FormData();
| |
− | f.append('data', document.getElementById('results').innerText);
| |
− | | |
− | r.onerror = function(){
| |
− | var message = document.getElementById('message');
| |
− | message.innerHTML = message.innerHTML + 'Запрос на сохранение не отправлен.<br>'
| |
− | message.className = 'error';
| |
− | message.style.display = 'block';
| |
− | }
| |
− | r.onload = function(){
| |
− | var response = JSON.parse(this.response);
| |
− | if(response['error']){
| |
− | var message = document.getElementById('message');
| |
− | message.innerHTML = message.innerHTML + response + ' Файл не может быть сохранён.<br>'
| |
− | message.className = 'error';
| |
− | message.style.display = 'block';
| |
− | }else{
| |
− | var url = 'http://ailurus.ru/scape/' + decodeURIComponent(response['link']);
| |
− | console.log(url);
| |
− | window.open(url, '_blank');
| |
− | }
| |
− | };
| |
− | r.send(f);
| |
− | }
| |
− | function chooseTaskClean(){
| |
− | document.getElementById('creation').className = 'default';
| |
− | document.getElementById('createTask').style.display = 'block';
| |
− | document.getElementById('chooseTask').style.display = 'none';
| |
− | document.getElementById('defaultTask').selected = 'selected';
| |
− | document.getElementById('numberOfRealisations').value = 50;
| |
− | document.getElementById('parameters').value = '';
| |
− | }
| |
− | function uploadFilesClean(){
| |
− | document.getElementById('creation').className = 'default';
| |
− | document.getElementById('createTask').style.display = 'block';
| |
− | document.getElementById('uploadFiles').style.display = 'none';
| |
− | document.getElementById('files').value = '';
| |
− | }
| |
− | function formatTime(input){
| |
− | var hoursString = '00';
| |
− | var minutesString = '00';
| |
− | var secondsString = '00';
| |
− | var hours = 0;
| |
− | var minutes = 0;
| |
− | var seconds = 0;
| |
− |
| |
− | input = Math.ceil(input);
| |
− | hours = Math.floor(input / (60 * 60));
| |
− | input = input % (60 * 60);
| |
− |
| |
− | minutes = Math.floor(input / 60);
| |
− | input = input % 60;
| |
− |
| |
− | seconds = input;
| |
− |
| |
− | hoursString = (hours >= 10) ? hours.toString() : '0' + hours.toString();
| |
− | minutesString = (minutes >= 10) ? minutes.toString() : '0' + minutes.toString();
| |
− | secondsString = (seconds >= 10) ? seconds.toString() : '0' + seconds.toString();
| |
− |
| |
− | return hoursString + ':' + minutesString + ':' + secondsString;
| |
− | }
| |
− | /*
| |
− | ------<====== End ======>------
| |
− | */
| |
− | </syntaxhighlight>
| |
− | </div>
| |
− | </div> | |