MediaWiki:Antier.js

Материал из свободной русской энциклопедии «Традиция»
Перейти к: навигация, поиск

Замечание: Чтобы после сохранения вступили в силу изменения стилей, перезагрузите файл //traditio.wiki/w/load.php?debug=false&lang=ru&modules=site&only=styles&skin=vector&*, если используете скин Vector, или //traditio.wiki/w/load.php?debug=false&lang=ru&modules=site&only=styles&skin=common&*, если используете скин Common.

Чтобы вступили в силу изменения скриптов, перезагрузите файл //traditio.wiki/w/load.php?debug=false&lang=ru&modules=site&only=scripts&skin=vector&*, если используете скин Vector, или //traditio.wiki/w/load.php?debug=false&lang=ru&modules=site&only=scripts&skin=common&*, если используете скин Common.

Гаджеты и импортируемые скрипты загружаются отдельными файлами.

//Скрипт для избежания конфликтов редактирования; адаптирован в Традиции участником Afinogenoff.


var acoD = new Date()
var acoShift
var acoDiff = wgCurRevisionId
var acoSave
var acoRevs
var acoReq

// feel free to translate to any languages you know
// and attribute yourself, but be careful:
// keep that any missed or misplaced comma
// will break the whole script

var acoMsg = {
    'en': { // original
      'unknown':'Loading page history…',
      'failed':'Unable to load data.',
      'attempt':'Save anyway',
      'clear':'No edit conflicts found. Saving…',
      'conflicted':'Edit conflict detected.',
      'confmsg':'Someone else has changed this page since you started editing it. Please look through the changes made during the editing time (see below) and reflect these changes in your text before saving. Hint: you may use "Show changes" button to ensure that you didn\'t miss anything.',
      'loading':'Loading…',
      'differr':'Unable to load diff. Please refer to edit history manually.',
      'updtime':'Reflect all marked changes and click here',
      'readytosave':'Page is ready to be saved now'
    },
    
    'de': { // Dank an [[:ru:User:stassats]] und [[:ru:User:Obersachse]]
     'unknown':'Laden der Versionsgeschichte…',
     'failed':'Daten können nicht gespeichert werden.',
     'attempt':'Trotzdem speichern',
     'clear':'Es gibt keinen Bearbeitungskonflikt. Speichern…',
     'conflicted':'Es gibt einen Bearbeitungskonflikt.',
     'confmsg':'Während Du diese Seite bearbeitet hast, wurde sie von jemand anderem verändert. Bitte schau Dir die Veränderungen an (siehe weiter unten) und füge sie in den Text ein, bevor Du die Seite speicherst. Tip: Du kannst den Knopf "Änderungen zeigen", benutzen, um sicher zu sein, dass Du nichts vergessen hast.',
     'loading':'Laden…',
     'differr':'Der Versionsunterschied kann nicht ermittelt werden. Versuche, die Versionsgeschichte manuell zu ermitteln.',
     'updtime':'trage die oben angezeigten Änderungen ein und klicke hier',
     'readytosave':'Die Seite ist fertig und kann gespeichert werden.'
    },
    
    'it': { // grazie [[:ru:User:Wulfson]]
      'unknown':'Caricando la cronologia delle modifiche…',
      'failed':'Non è riuscito a caricare i dati.',
      'attempt':'Salvare lo stesso',
      'clear':'No confliti delle modifiche sono stati scoperti. Salvando…',
      'conflicted':'Un conflito delle modifiche é stato scoperto.',
      'confmsg':'Mentre modificavate questa pagina, altre modifiche sono state fatte nella stessa. Per favore, controllate i cambiamenti fatti durante la vostra redazione (mostrati abbasso) e inseriteli nel testo prima di salvare la pagina. Consiglio: potete utilizzare il bottone «Mostra cambiamenti» per verificare che non avete dimenticato niente.',
      'loading':'Caricando…',
      'differr':'Non è riuscito a ottenere il confronto tra versioni. Controllate la cronologia delle modifiche a mano.',
      'updtime':'Inserite le suindicate modifiche e premete qui',
      'readytosave':'La pagina è pronta per salvare'
    },
    
    'ru': { // спасибо [[:en:User:Kalan]]
      'unknown':'Загрузка истории правок…',
      'failed':'Не удаётся загрузить данные.',
      'attempt':'Всё равно сохранить',
      'clear':'Конфликтов правок не обнаружено. Сохранение…',
      'conflicted':'Обнаружен конфликт правок.',
      'confmsg':'Пока вы редактировали эту страницу, в неё были внесены другие правки. Пожалуйста, просмотрите изменения, сделанные в процессе редактирования (они показаны ниже) и внесите их в текст, прежде чем сохранять страницу. Совет: вы можете воспользоваться кнопкой «Внесённые изменения», чтобы удостовериться, что вы ничего не забыли.',
      'loading':'Загрузка…',
      'differr':'Не удалось получить сравнение версий. Обратитесь к истории правок вручную.',
      'updtime':'Внесите показанные выше правки и нажмите сюда',
      'readytosave':'Страница готова к сохранению'
    },
    
    'uk': { // дякуємо [[:ru:User:Yakiv Gluck]]
      'unknown':'Завантаження історії редагувань…',
      'failed':'Не вдається завантажити дані.',
      'attempt':'Все одно зберегти',
      'clear':'Конфліктів редакцій не виявлено. Збереження…',
      'conflicted':'Виявлено конфлікт редакцій.',
      'confmsg':'Ще хтось змінив цю статтю з того часу, як ви розпочали її змінювати. Будь ласка, перегляньте зміни, зроблені в процесі редагування (вони показані нижче) і внесіть їх в текст, пред тим як зберегти сторінку. Порада: ви можете скоритатися кнопкою «Показати зміни», щоб переконатися, що ви нічого не забули.',
      'loading':'Завантаження…',
      'differr':'Не вдалося отримати порівняння версій. Зверніться до історії редагувань вручну.',
      'updtime':'Внесіть означені вище редагування і натисніть тут',
      'readytosave':'Сторінка готова до збереження'
    }
  }

var acoLang = acoMsg[wgUserLanguage]?wgUserLanguage:'en'
  
if (wgAction == 'edit' || wgAction == 'submit') {

  // false: continue editing
  // true:  save the page
  acoMode = false
  
  // initialize output: div#acoDiv
  var acoDiv = document.createElement('div')
  with (acoDiv) {
    innerHTML = acoMsg[acoLang].unknown
    id        = 'acoDiv'
    className = 'acoUnknown'
    with (style) {
      position   = 'absolute'
      paddingLeft = paddingRight = '0.3em'
      marginTop  = '2.25em' // calculated using trial-and-error method
      fontSize   = 'smaller'
      background = '#FFFBC6'
      border     = '1px solid #FFDB00'
      display    = 'none'
    }
  }
  
  function acoR (arg) {
    if ( arg < 10 ) { return '0' + arg } else { return arg }
  }
  
  // perform the AJAX request to somewhere
  function acoAjax (url, func) {
    if (window.XMLHttpRequest) {
      acoReq = new XMLHttpRequest()
    } else {
      try {
         acoReq = new ActiveXObject('Msxml2.XMLHTTP')
      } 
      catch (e) {
        try {
          acoReq = new ActiveXObject('Microsoft.XMLHTTP')
        } 
        catch (e) {
          acoAjaxFailMsg()
        }
      }
    }
    acoReq.onreadystatechange = func
    acoReq.open('GET', wgServer + url, true)
    acoReq.send(null)
  }
  
  // showing the AJAX error message
  function acoAjaxFailMsg() {
    acoSave.disabled = false
    with (acoDiv) {
      className        = 'acoFailed'
      innerHTML        = acoMsg[acoLang].failed + ' '
      style.display    = 'inline'
      style.background = '#FFC2B6'
      style.border     = '1px solid #FF7055'
    }
    var acoLink = document.createElement('a')
        acoLink.innerHTML = acoMsg[acoLang].attempt
        acoLink.style.fontWeight = 'bold'
        acoLink.href = 'javascript:acoMode=true;acoSave.click()'
    acoDiv.appendChild(acoLink)
  }
  
  // executing this when button is clicked
  function acoClick() {
    if (!acoMode) {
      with (acoDiv) {
        innerHTML = acoMsg[acoLang].unknown
        className = 'acoUnknown'
        style.background = '#FFFBC6'
        style.border     = '1px solid #FFDB00'
        style.display    = 'inline'
      }
      acoSave.disabled = true
      
      acoAjax (wgScriptPath+'/api.php?action=query&titles='+
        encodeURI(wgPageName)+
        '&prop=revisions&rvprop=timestamp|ids&rvlimit=500&rvdir=newer&format=json&rvstart='+
        acoD.getUTCFullYear()+''+acoR(acoD.getUTCMonth()+1)+acoR(acoD.getUTCDate())+
        acoR(acoD.getUTCHours())+acoR(acoD.getUTCMinutes())+acoR(acoD.getUTCSeconds()),
        acoCheck)
    }
    return acoMode
  }
  
  // do the main job
  function acoCheck () {
    if (acoReq.readyState == 4) {
      if (acoReq.status == 200) {
        acoRevs = eval('(' + acoReq.responseText + ')')
        if (acoRevs.query.pages[wgArticleId==0?-1:wgArticleId] === undefined ||
            acoRevs.query.pages[wgArticleId==0?-1:wgArticleId].revisions !== undefined) {
          // edit conflict discovered
          with (acoDiv) {
            innerHTML = acoMsg[acoLang].conflicted + ' '
            className = 'acoConflicted'
            style.background = '#FFD2C6'
            style.border     = '1px solid #FFA090'
            style.display    = 'inline'
          }
          var acoLn = document.createElement('a')
          acoLn.innerHTML = acoMsg[acoLang].updtime
          acoLn.style.fontWeight = 'bold'
          acoLn.href = 'javascript:acoUpdTime()'
          acoDiv.appendChild(acoLn)
          if (!document.getElementById('acoDiffHolder')) {
            var acoWikiPreview = document.getElementById('wikiPreview')
            acoNotice = document.createElement('div')
            acoDiffHolder = document.createElement('div')
            acoWikiPreview.parentNode.insertBefore (acoNotice, acoWikiPreview)
            acoWikiPreview.parentNode.insertBefore (acoDiffHolder, acoWikiPreview)
          }
          acoNotice.innerHTML = acoMsg[acoLang].confmsg
          acoNotice.id = 'acoConflictNotice'
          with (acoNotice.style) {
            border = '1px solid #D5D9E6'
            background = '#F4FBFF'
            padding = '0.7em'
            fontSize = '92%'
          }
          acoDiffHolder.id = 'acoDiffHolder'
          acoDiffHolder.innerHTML = acoMsg[acoLang].loading
          acoDiffHolder.style.padding = '1em 0'
          acoAjax(wgScript+'?diff=cur&action=render&oldid='+acoDiff, acoShowDiff)
          // update start points
          acoD = new Date(new Date().getTime() - acoShift)
          acoDiff = acoRevs.query.pages[wgArticleId==0?-1:wgArticleId].revisions
            [acoRevs.query.pages[wgArticleId==0?-1:wgArticleId].revisions.length-1].revid
        } else {
          // all is OK, saving
          with (acoDiv) {
            innerHTML = acoMsg[acoLang].clear
            className = 'acoClear'
            style.background = '#D2FFC6'
            style.border     = '1px solid #60BF40'
            style.display    = 'inline'
          }
          acoMode = true
          acoSave.disabled = false
          // doesn't work when simply specifying these actions
          window.setTimeout('acoSave.onclick = function(){};acoSave.click()', 100)
        }
      } else {
        acoAjaxFailMsg()
      }
    } 
  }
  
  // show changes made during the editing period
  function acoShowDiff() {
    if (acoReq.readyState == 4) {
      if (acoReq.status == 200) {
        // diff.css reference
        var acoLnEl = document.createElement('link')
        acoLnEl.href = stylepath + '/common/diff.css'
        acoLnEl.rel = 'stylesheet'
        acoLnEl.type = 'text/css'
        document.getElementsByTagName('head')[0].insertBefore(
          acoLnEl,
          document.getElementsByTagName('head')[0].firstChild
        )
        // putting diff in the holder
        document.getElementById('acoDiffHolder').innerHTML = acoReq.responseText
      } else {
        document.getElementById('acoDiffHolder').innerHTML = acoMsg[acoLang].differr
      }
    }
  }
  
  // updating timestamps
  function acoUpdTime() {
    var acoLastRev = new Date(acoRevs.query.pages[wgArticleId==0?-1:wgArticleId].revisions
      [acoRevs.query.pages[wgArticleId==0?-1:wgArticleId].revisions.length-1].timestamp)
    document.getElementById('editform').elements.wpEdittime.value =
      acoLastRev.getUTCFullYear()+''+acoR(acoLastRev.getUTCMonth()+1)+acoR(acoLastRev.getUTCDate())+
      acoR(acoLastRev.getUTCHours())+acoR(acoLastRev.getUTCMinutes())+acoR(acoLastRev.getUTCSeconds())
    acoLastRev = new Date(acoLastRev.getTime() + 1000)
    document.getElementById('editform').elements.wpStarttime.value =
      acoLastRev.getUTCFullYear()+''+acoR(acoLastRev.getUTCMonth()+1)+acoR(acoLastRev.getUTCDate())+
      acoR(acoLastRev.getUTCHours())+acoR(acoLastRev.getUTCMinutes())+acoR(acoLastRev.getUTCSeconds())
    with (acoDiv) {
      innerHTML = acoMsg[acoLang].readytosave
      className = 'acoReadyToSave'
      style.background = '#FFFBC6'
      style.border     = '1px solid #FFDB00'
    }
    acoSave.disabled = false
  }
  
  addOnloadHook( function() {
    var acoSh = new Date()
    acoShift = acoSh.getTime() - new Date(document.getElementById(
      'editform').elements.wpStarttime.value.replace(/(....)(..)(..)(..)(..)(..)/,
      '$1-$2-$3 $4:$5:$6 +0000')).getTime()
    acoD = new Date(acoD.getTime() - acoShift)
    acoSave = document.getElementById('wpSave')
    if (!acoSave) return
    with (acoSave) {
      if (!window.acoNoEllipsis) value += '…'
      parentNode.insertBefore(acoDiv, acoSave)
      acoSave.onclick = acoClick
    }
  } )
}