WykopBingo!

Graj znaleziskami w Bingo na Wykopie

// ==UserScript==
// @name        WykopBingo!
// @namespace   Wykop scripts
// @description Graj znaleziskami w Bingo na Wykopie
// @include     *://www.wykop.pl/link/*
// @version     0.86a
// @grant       GM_xmlhttpRequest
// @author      Orlin
// ==/UserScript==

// linijka poniżej na potrzeby skryptozakładki, pamiętaj tylko o usunięciu pozostałych komentarzy zaczynających się od //
//javascript:function GM_xmlhttpRequest(a){ alert('Wersja skryptozakładkowa na razie nie potrafi łączyć się z serwerem, więc nie prześle poniższego żądania:\n'+JSON.stringify(a));}; 
/**
 * Wartości pól planszy do gry w WykopBingo!
 */
var boardSquares = [
  'IDIOTA NA DRODZE',
  'IMIGRANCI',
  'JAK XYZ TRAKTUJE KLIENTÓW',
  'PLANETA PODOBNA DO ZIEMI',
  'SKRADZIONO SAMOCHÓD / ROWER',
  'MARIUSZ MAX KOLONKO',
  'AFERA NA WYKOPIE',
  '"POLSKIE OBOZY" W ZACHODNICH MEDIACH',
  'ISLAM',
  'ARTYKUŁ O TESLI',
  'PRZEŁOMOWY WYNALAZEK POLAKÓW',
  'KOTY',
  '[W]',
  'ELON MUSK',
  'KORWIN',
  'A.M.A.',
  'VIKTOR ORBAN',
  'BATERIE NOWEJ GENERACJI',
  'GRAFEN',
  'KWOTA WOLNA OD PODATKU',
  'LEK NA RAKA',
  'KONTROWER-\nSYJNY POMYSŁ RZĄDU/UE',
  'NOWE ŹRÓDŁO ENERGII',
  'OKRADŁ GO ZUS / KOMORNIK',
  'AMERYKAŃSCY NAUKOWCY ODKRYLI'
];

var zalogowany = false;
/*===========================================================================================================================*/

/**
 * Dodaje przycisk gry WykopBingo! do przycisków w formularzu komentarza
 */
function addBingoButton()
{
    var bb = document.createElement('a');
    bb.className = 'button bingoButton';
    /*    bb.innerHTML='▦';*/
    bb.innerHTML = '⌧';
    bb.title = 'WykopBingo!';
    bb.onclick = function () {
      playBingo(this);
    };
/*    var bbb = JSON.parse(JSON.stringify(bb));*/
    var bbb = bb.cloneNode(true);
    bbb.onclick = function () {
      playBingo(this);
    };

  var survButt = document.getElementsByClassName('button openAddSurveyOverlay');
  if(survButt.length > 0)
  {
    survButt[0].parentNode.insertBefore(bb, survButt[0].nextSibling);
    zalogowany = true;
  }
  else
  {
    zalogowany = false;
  }
  var navbar = document.getElementsByClassName('nav fix-b-border');
  if(navbar.length > 0)
  {
    navbar[0].insertBefore(bbb, navbar[0].firstChild);
  }
  else
  {
    alert('Skrypt(ozakładka) działa poprawnie tylko na stronach ze znaleziskami @ wykop.pl.');
  }
}
/*===========================================================================================================================*/

/**
 * Tworzy/pokazuje okienko z planszą gry
 * @param {DOM element reference} buttonNodeRef Żeby po kliknięciu 'Publikuj', komentarz trafił do pola tekstowego, przy którym kliknięto wcześniej przycisk WykopBingo!
 */
function playBingo(buttonNodeRef)
{
  var bingoButtonTst = document.getElementById('bingoTableWrap');
  var overlayDiv;
  
  if(bingoButtonTst !== null)
  {
    bingoButtonTst.style.display = 'block';
    document.getElementById('bingoPublishButton').onclick = function(){
                   generateComment(buttonNodeRef);
                   document.getElementById('bingoTableWrap').style.display = 'none';
                   var ovrls = document.getElementsByClassName('overlay');
                   for(i=0; i<ovrls.length; ++i)
                   {
                     ovrls[i].parentNode.removeChild(ovrls[i]);
                   }
    };
    overlayDiv = document.createElement('div');
    overlayDiv.className = 'overlay';
    overlayDiv.style.display = 'block';
    document.body.insertBefore(overlayDiv, document.body.firstChild);
    resetGame(true);
    fillBoard();
    return;
  }
  var closeBGC, rowBGC, wrapperBGC;
  if(document.body.className.indexOf('night') >= 0)
  {
    /* nocny */
    closeBGC = '000';
    wrapperBGC = '333';
    rowBGC = 'rgba(81,81,81,0.5)';
    
  }
  else
  {
    /* dzienny */
    closeBGC = 'ccc';
    wrapperBGC = '777';
    rowBGC = 'rgba(208,208,208,0.5)';
  }
  
  addCss('.bingoTab\n{\n\tborder-collapse:collapse;\n\tborder-spacing:0;\n}\n\n#bingoTableWrap\n{\n\tdisplay: table;\n\tz-index: 999999;\n\tleft: 25%;\n\ttop: 30px;\n\tposition: fixed;\n\tbackground-color: #'+wrapperBGC+';\n}\n\n#bingoTableWrap > a\n{\n\tcursor: pointer;\n\tposition: absolute;\n\tright: 0px;\n\ttop: -20px;\n\tbackground-color: #'+closeBGC+';\n}\n\n.bingoTab\n{\n\tbackground-size: contain;\n\tbackground-repeat: no-repeat;\n\tbackground-position: center;\n}\n\n.bingoTab tr, .bingoTab tr:hover, .bingoTab tr:nth-child(even)\n{\n\tbackground-color: '+rowBGC+';\n}\n\n.bingoTab td:hover\n{\n\tbackground-color: #888888;\n}\n\n.bingoTab td\n{\n\tposition: relative;\n\tfont-family:Arial, sans-serif;\n\tfont-weight: bold;\n\tfont-size:10px;\n\tpadding:1px;\n\tborder-style:solid;\n\tborder-width:1px;\n\toverflow:hidden;\n\tword-break:normal;\n\ttext-align:center;\n\twidth:80px;\n\theight:80px;\n\tmax-width:80px;\n\tmax-height:80px;\n\tmin-width:80px;\n\tmin-height:80px;\n\tcursor:crosshair;\n\tvertical-align: middle;\n}\n\n.bingoLine\n{\n\tbackground-color: rgba(0,255,0,0.5);\n}\n\n.bingoCrossed\n{\n\tposition: absolute;\n\tdisplay:none; \n\ttop: 40%;\n\twidth: 100%;\n\tfont-color: red;\n\tcolor: red;\n\tfont-weight: bold;\n\tfont-size:68px;\n\n}\n\n.bingoNotCrossed\n{\n\tdisplay:none; \n}\n\n.bingoProofLinks\n{\n    position: absolute;\n\tright: 0;\n    bottom: 0;\n\ttext-align:right;\n\tz-index: 2;\n}\n\n.bingoProofLinksOff\n{\n\tdisplay:none;\n}\n\n#bingoCtxMenu\n{\n\tposition: absolute;\n\tdisplay:none;\n\tbackground-color: lightgrey;\n\tborder: 1px dashed blue;\n\tz-index: 5;\n}\n\n#bingoCtxMenu\n{\n\tpadding: 5px 10px;\n\tposition: fixed;\n\tdisplay:none;\n\tbackground-color: lightgrey;\n\tborder: 1px dashed blue;\n\tz-index: 5;\n}\n\n#bingoCtxMenu a\n{\n\tdisplay:block;\n\tcursor:pointer;\n\tcolor: blue;\n}\n\n#bingoCtxMenu a:hover\n{\n\ttext-decoration: underline;\n}\n\n#bingoCtxMenu a:before\n{\n\tcontent:"• ";\n}\n\n.bingoButtons\n{\n\tcolor: #000;\n\tmargin: 5px\n}\n\n.bingoButtons :focus\n{\n\tcolor: #000;\n\tmargin: 5px\n}\n\n#bingoLinksEditor\n{\n\tposition: fixed;\n\tleft: 10%;\n\ttop:50px;\n\tcolor: #000;\n\tbackground-color: #aaa;\n\tz-index:5;\n\twidth: 75%;\n\tmin-width: 640px;\n}\n\n#bingoLinksEditor > a\n{\n\tcursor: pointer;\n\tposition: absolute;\n\tright: 0px;\n\ttop: -20px;\n\tbackground-color: #'+closeBGC+';\n}\n\n#bingoLinksEditor table\n{\n\tbackground-color: #aaa;\n}\n\n#bingoLinksEditor thead\n{\n\tbackground-color: #888;\n}\n\n#bingoLinksEditor thead tr\n{\n\tbackground-color: #888;\n}\n\n#bingoLinksEditor thead td\n{\n\ttext-align: center;\n\tvertical-align: middle;\n\tfont-weight: bold;\n}\n\n#bingoLinksEditor tbody\n{\n\tbackground-color: #aaa;\n}\n\n#bingoLinksEditor tbody tr\n{\n\tbackground-color: #aaa;\n}\n\n#bingoLinksEditor tbody td\n{\n\ttext-align: center;\n\tvertical-align: middle;\n\tpadding: 1px;\n}\n\n#bingoLinksEditor input\n{\n\tpadding: 0px;\n\tmargin: 0px;\n}\n\n#bingoLinksEditor > input[type=text], #bingoLinksEditor > input[type=password]\n{\n\twidth: 100px;\n}\n\n#bingoLinksEditor > span, #bingoLinksEditor > input[type=checkbox]\n{\n\tmargin: 0 5px;\n}');
  overlayDiv = document.createElement('div');
  overlayDiv.className = 'overlay';
  overlayDiv.style.display = 'block';
  document.body.insertBefore(overlayDiv, document.body.firstChild);
  document.body.insertBefore(buildBoard(boardSquares, buttonNodeRef), document.body.firstChild);
  fillBoard();
  
  var lastReset = localStorage.getItem('bingoLastReset');
  var shouldReset = false;
  if(lastReset)
  {
    var lastResetDate = new Date(parseInt(lastReset));
    var now = new Date();
    if(+now - +lastResetDate > 604800000) /* > 7*3600*24000*/
    {
      shouldReset = true;
    }
    if(!shouldReset)
    {
      var lastMonday = new Date();
      var dow = now.getDay()||7;
      lastMonday.setTime(now.getTime()-(dow-1)*86400000); /* *3600*24000*/
      lastMonday.setHours(0);
      lastMonday.setMinutes(0);
      lastMonday.setSeconds(0);
      if((+lastResetDate) < (+lastMonday))
      {
        shouldReset = true;
      }
    }
  }
  else
  {
    shouldReset = true;
  }
  if(shouldReset)
  {
    var answ = confirm('Wygląda, że plansza nie była jeszcze resetowana w tym tygodniu.\nCzy chcesz zresetować ją teraz?\n' +
                       '\nPamiętaj, że w każdym tygodniu zabawy\nliczą się tylko wykopy dodane między początkiem poniedziałku a końcem niedzieli.');
    if(answ)
    {
      resetGame(false);
      fillBoard();
    }
  }
  
}
/*===========================================================================================================================*/

/**
 * Tworzy planszę do gry
 * @param {string[]} squares Tablica z nazwami pól
 * @param {DOM element reference} buttonNodeRef Żeby po kliknięciu 'Publikuj', komentarz trafił do pola tekstowego, przy którym kliknięto wcześniej przycisk WykopBingo!
 */
function buildBoard(squares, buttonNodeRef)
{
  var i,
  j,
  k;
  var tr,
  td,
  div,
  div2,
  div3,
  aLink,
  inpt,
  lbl;
  
  /*var frag = document.createDocumentFragment();*/
  
  var tbl = document.createElement('table');
  tbl.className = 'bingoTab';
  tbl.id = 'bingoTable';
  var tabSize = Math.sqrt(squares.length);
  if(Math.floor(tabSize) !== tabSize)
  {
    alert('Nieprawidłowa ilość opisów dla pól planszy. Aby plansza była kwadratowa, potrzeba opisów w ilości będącej kwadratem liczby naturalnej > 0');
    return null;
  }
  if(tabSize > 8)
  {
    alert('Za dużo pól. Dodatek w tej wersji obsługuje maksymalnie planszę 8x8.');
    return null;
  }
  for(i=0, k=0; i<tabSize; ++i)
  {
    tr = tbl.insertRow();
    for(j=0; j<tabSize; ++j)
    {
      td = tr.insertCell();
      td.setAttribute('cellID', k);
      td.id = 'bingoSquareNo' + k;
      td.title = squares[k];
      div = document.createElement('div');
      div.innerHTML = squares[k];
      ++k;
      td.appendChild(div);
      div = document.createElement('div');
      div.innerHTML = '&#x2718;';
      div.className = 'bingoCrossed';
      td.appendChild(div);
      div = document.createElement('div');
      div.className = 'bingoProofLinks';
      td.appendChild(div);
      /*				td.onmouseover = drawMenu;*/
      td.onclick = drawMenu;
      /*				td.appendChild(document.createTextNode(squares[k++]));*/
    }
  }
  
  tbl.style.backgroundImage = "url('data:image/png;base64,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')";
  
  div2 = document.createElement('div');
  div2.id = 'bingoTableWrap';
  div2.className = 'normal m-set-fullwidth m-reset-top m-reset-margin m-reset-left';
  
  aLink = document.createElement('a');
  aLink.innerHTML = '[x]';
  aLink.title = 'Zamknij';
  aLink.onclick = function () {
    document.getElementById('bingoTableWrap').style.display = 'none';
    var ovrls = document.getElementsByClassName('overlay');
    for(i=0; i<ovrls.length; ++i)
    {
      ovrls[i].parentNode.removeChild(ovrls[i]);
    }
  };
  div2.appendChild(aLink);
  div2.appendChild(tbl);
  div3 = document.createElement('div');
  div3.id = 'bingoCtxMenu';
  /*		div3.innerHTML = '<strong>Menu</strong>';	*/
  aLink = document.createElement('a');
  aLink.innerHTML = 'skreśl pole / dodaj link';
  aLink.onclick = function () {
    this.parentNode.style.display = 'none';
    var cellId = this.parentNode.getAttribute('sourceCell');
    /* sprawdzenie, czy już nie dodano tego samego...*/
    var pLinks = document.getElementById('bingoSquareNo' + cellId).getElementsByClassName('bingoProofLinks')[0].getElementsByTagName('a');
    for(var l=0; l<pLinks.length; ++l)
    {
      if(pLinks[l].href == document.location.href)
      {
        alert('Taki sam link został już wcześniej dodany do tego pola.\nPor. link #' + pLinks[l].innerHTML.replace(/[\[\]*]/g, ''));
        return;
      }
    }
    var timestamp = +new Date();
    var isAlisko;
    var navLinks = document.getElementById('nav').getElementsByTagName('a');
    for(var i=0; i<navLinks.length; ++i)
    {
      if(navLinks[i].href.indexOf('wykopalisko') >= 0 )
      {
        if(navLinks[i].parentNode.className.indexOf('active') >= 0)
        {
          isAlisko = true;
        }
        else
        {
          isAlisko = false;
        }
      }
    }
    var indeks = addRecordToLS(document.location.href, cellId, timestamp, isAlisko, -1);
    addLinkToCell(indeks, document.location.href, cellId, timestamp, isAlisko);
    crossSquare(cellId);
    var bingoFound = localStorage.getItem('bingoFound');
    if(bingoFound > 0)
    {
      checkBingoLines(true);  
    }
/*				alert(this.innerHTML);*/
  };
  div3.appendChild(aLink);
  aLink = document.createElement('a');
  aLink.innerHTML = 'wyczyść pole ze wszystkich linków';
  aLink.onclick = function () {
    this.parentNode.style.display = 'none';
    var cellId = this.parentNode.getAttribute('sourceCell');
    uncrossSquare(cellId);
/*    document.getElementById('bingoSquareNo' + cellId).className = '';*/
    var bingoFound = localStorage.getItem('bingoFound');
    if(bingoFound > 0)
    {
      checkBingoLines(true);  
    }
    deleteAllProofLinksInCell(cellId, true);
  };
  div3.appendChild(aLink);
  aLink = document.createElement('a');
  aLink.innerHTML = 'edytuj listę linków';
  aLink.onclick = function () {
    this.parentNode.style.display = 'none';
    var cellId = this.parentNode.getAttribute('sourceCell');
    bingoLinkEditor(cellId);
  };
  div3.appendChild(aLink);
  aLink = document.createElement('a');
  aLink.innerHTML = 'zamknij menu';
  aLink.title = 'możesz też po prostu kliknąć jeszcze raz w to samo pole na planszy...';
  aLink.onclick = function () {
    this.parentNode.style.display = 'none';
  };
  div3.appendChild(aLink);
  div2.appendChild(div3);
  
  /* Przyciski */
  inpt = document.createElement('input');
  inpt.type = 'button';
  inpt.id = 'bingoPublishButton';
  inpt.className = 'bingoButtons';
  inpt.value = 'Publikuj';
  inpt.title = 'Dodaj do wpisu';
  inpt.onclick = function(){
                   generateComment(buttonNodeRef);
                   document.getElementById('bingoTableWrap').style.display = 'none';
                   var ovrls = document.getElementsByClassName('overlay');
                   for(i=0; i<ovrls.length; ++i)
                   {
                     ovrls[i].parentNode.removeChild(ovrls[i]);
                   }
  };
  div2.appendChild(inpt);
  
  inpt = document.createElement('input');
  inpt.type = 'button';
  inpt.className = 'bingoButtons';
  inpt.value = 'Bingo!';
  inpt.title = 'Jest 5 skreśleń w jednej linii';
  inpt.onclick = function(){ checkBingoLines(false); };
  div2.appendChild(inpt);
    
  inpt = document.createElement('input');
  inpt.type = 'button';
  inpt.className = 'bingoButtons';
  inpt.value = 'Zgłoś';
  inpt.title = 'Zgłoś do konkursu na wykop-bingo.ml';
  inpt.onclick = function(){
    var myComments = document.getElementsByClassName('ownComment');
    var i, time, postLink, imgLink, toSubmit, txt;
    var myBingoComments = [];
    for(i=0; i<myComments.length; ++i)
    {
      time = myComments[i].getElementsByTagName('time')[0];
      postLink = time.parentNode.parentNode.href;
      txt = myComments[i].getElementsByClassName('text')[0];
      if((imgLink=txt.innerHTML.match(/https?:\/\/wykop-bingo\.ml\/wb-001\/[0-9a-f]{10}x\.jpg/i)) && txt.innerHTML.indexOf('Komentarz wygenerowany z pomocą dodatku')>0)
      {
        myBingoComments.push({postLink: postLink, dateTime: time.title, imgLink: imgLink[0].replace(/^https?:\/\/wykop-bingo\.ml\//, '/')}); 
      }
    }
    if(myBingoComments.length === 0)
    {
      toSubmit = null;
      alert('Nie znaleziono żadnych Twoich komentarzy z opublikowaną planszą do gry (w postaci linka lub załączonego obrazka).\nUpewnij się, że jesteś zalogowany/zalogowana i że dodano na bieżącej stronie odpowiedni komentarz.\nPamiętaj także, iż przed opublikowaniem i zgłoszeniem musisz kliknąć przycisk Bingo! - by zostały zaznaczone pola / narysowane linie przechodzące przez komplet skreślonych pól.\nJeśli nadal nie możesz zgłosić komentarza - dodaj go ręcznie (podając link do komentarza) przez formularz na stronie wykop-bingo.ml i ew. zgłoś problem autorowi.');
    }
    else if(myBingoComments.length == 1)
    {
      toSubmit = myBingoComments[0];
    }
    else
    {
      myBingoComments.sort(function(a, b) {
           return +new Date(b.dateTime) - +new Date(a.dateTime); /* newest first*/
      });
      toSubmit = myBingoComments[0];
    }
    if(toSubmit)
    {
      var username = document.getElementById('nav').getElementsByClassName('fa fa-user')[0].parentNode.href.replace(/^.*wykop\.pl\/ludzie\/(.*)\/$/, '$1');
/* z wykorzystaniem GM_xmlhttpRequest() */ 
/*      
          GM_xmlhttpRequest({
                method: 'POST',
                url: 'https://wykop-bingo.ml/submit-bingo.php',
                data: 'user='+encodeURIComponent(username)+'&post_url='+encodeURIComponent(toSubmit.postLink)+'&img='+encodeURIComponent(toSubmit.imgLink),
                headers: {
                  'Content-Type': 'application/x-www-form-urlencoded'
                },
                onload: function(response) {
                        alert(response.responseText);              
                }
          });
*/
      /* alternatywa powyższego dla wersji skryptozakładkowej (w sumie nie tylko) - z wykorzystaniem image.src */

      var submitImg = new Image();
      submitImg.addEventListener('load', function(){
             if(this.width==1)
             {
               alert('Post zgłoszony');
             }
             else if(this.width==2)
             {
               alert('Post został już wcześniej zgłoszony\nW konkursie brany pod uwagę jest tylko autor posta, nie zgłaszający');
             }
             else
             {
               alert('Wysyłanie zgłoszenia nie powiodło się');
             }
      }, false);  
      
      submitImg.src = 'https://wykop-bingo.ml/submit-bingo-via-img.php?x='+(+new Date())+'&user='+encodeURIComponent(username) +'&img='+encodeURIComponent(toSubmit.imgLink) +
                      '&post_url='+encodeURIComponent(toSubmit.postLink);
      
    }
    
  };
  div2.appendChild(inpt);

  inpt = document.createElement('input');
  inpt.type = 'checkbox';
  inpt.className = 'bingoButtons';
  inpt.checked = 'checked';
  inpt.id = 'bingoShowLinks';
  inpt.onchange = function(){/*if(this.checked) switchProofLinks(true); else switchProofLinks(false);*/switchProofLinks(this.checked);};
  div2.appendChild(inpt);
  
  lbl = document.createElement('label');
  lbl.for = 'bingoShowLinks';
  lbl.innerHTML = 'Pokaż linki';
  div2.appendChild(lbl);
  
/*  var br = document.createElement('br');
  div2.appendChild(br);*/
  
  inpt = document.createElement('input');
  inpt.type = 'button';
  inpt.className = 'bingoButtons';
/*  inpt.style.display = 'none';*/
  inpt.value = 'Odśwież';
  inpt.title = 'Odświeża planszę (np. po zmianach dokonanych w innej karcie czy bezpośrednio w pamięci)';
  inpt.onclick = function(){ resetGame(true); fillBoard();};
  div2.appendChild(inpt);
  
  inpt = document.createElement('input');
  inpt.type = 'button';
  inpt.className = 'bingoButtons';
/*  inpt.style.display = 'none';*/
  inpt.value = 'Edytuj linki';
  inpt.title = 'Otwiera okno edycji zapisanych linków';
  inpt.onclick = function(){ bingoLinkEditor(-1); };
  div2.appendChild(inpt);
  
  return div2;
}
var evCntr = 0, wrongChar='\\';
/*===========================================================================================================================*/

/**
 * Dodaje przekazany kod CSS do strony
 * @param {string} code kod CSS
 */
function addCss(code)
{
  var style = document.createElement('style');
  style.type = 'text/css';
  if(style.styleSheet)
  { /* IE*/
    style.styleSheet.cssText = code;
  } 
  else
  { /* Other browsers*/
    style.innerHTML = code;
  }
  document.getElementsByTagName('head')[0].appendChild(style);
}
/*===========================================================================================================================*/

/**
 * Zwraca pierwszy wolny, nieużywany indeks dla nowego linka
 * @return {number} Indeks nowego linka
 * @TODO Naprawa uszkodzonego (umyślnie?) rekordu 'bingoLinks'
 */
function genNewLinkIdx()
{
  var lastId;
  var bingoLinks = localStorage.getItem('bingoLinks');
  if(bingoLinks === null || bingoLinks === '')
  {
/*    localStorage.setItem('bingoLinks', ',1,');*/
    return 1;
  } 
  else
  {
/* pierwszy wolny*/
    for(var i=1; bingoLinks.indexOf(','+i+',')>=0; ++i)
      ;
/*    localStorage.setItem('bingoLinks', bingoLinks + (i) + ',');*/
    return i;
  }
}
/*===========================================================================================================================*/

/**
 * Dodaje do wskazanej komórki w tabeli/planszy link (wraz z jego numerem)
 * @param {string} url - adres strony
 * @param {number} idx - numer linka
 * @param {number} squareNum - numer pola na planszy z przedziału <0, boardSquares.length)
 * @param {number} timestamp - kiedy dodano link
 * @param {boolean} isAlisko - czy w chwili dodawania znalezisko było w wykopalisku
 * @TODO url - sprawdzić poparawność?
 */
function addLinkToCell(idx, url, squareNum, timestamp, isAlisko)
{
  var link;
  var cell = document.getElementById('bingoSquareNo' + squareNum);
  if(cell === undefined || cell === null)
  {
    alert('Czyżby próba dodania linka do nieistniejącej komórki?');
    return;
  }
  link = document.createElement('a');
  link.href = url;
  link.title = (new Date(parseInt(timestamp))).toISOString().substring(0,19).replace('T', ' ');
  link.innerHTML = '[' + idx +  (isAlisko?'*':'') + ']';
  link.setAttribute('timestamp', timestamp);
  cell.getElementsByClassName('bingoProofLinks')[0].appendChild(link);
}
/*===========================================================================================================================*/

/**
	 * Dodaje do localStorage, pod kolejnym indeksem (bingoLink_??), link wraz z przypisanym numerem pola planszy,
	 * przekazanym 'timestampem' i informacją, czy w chwili dodawania znalezisko było w wykopalisku;
   * nr dodanego/zaktualizowanego linka dopisuje (jeśli go jeszcze tam nie ma) do bingoLinks w localStorage
	 * @param {string} url - adres strony
	 * @param {number} squareNum - numer pola na planszy z przedziału <0, boardSquares.length)
   * @param {number} timestamp - kiedy dodano link
	 * @param {boolean} isAlisko - czy w chwili dodawania znalezisko było w wykopalisku
	 * @param {boolean} idx - nr/indeks z jakim ma być dodany rekord do localStorage; jeśli idx == -1, to zostanie wygenerowany nowy numer, o 1 większy od ostatniego
	 * @return {number} Indeks nowego linka
	 * @TODO url - sprawdzić poparawność?
	 */
function addRecordToLS(url, squareNum, timestamp, isAlisko, idx)
{
  var newIdx;
  if(idx == -1) /* chcemy nowy id/numer dla linka*/
  {
    newIdx = genNewLinkIdx();
  }
  else
  {
    newIdx = idx;
  }
  var bingoLinks = localStorage.getItem('bingoLinks');
  if(bingoLinks === null || bingoLinks === '')
  {
    localStorage.setItem('bingoLinks', ',' + newIdx + ',');
  }
  else if(bingoLinks.indexOf(','+newIdx+',') < 0)
  {
    localStorage.setItem('bingoLinks', bingoLinks + (newIdx) + ',');
  }
  localStorage.setItem('bingoLink_' + newIdx, squareNum + '|' + timestamp + '|' + url.replace(/^https:\/\/www\.wykop\.pl\//, '/').replace(/[|]/g, '%7C').replace(/#.*$/, '') + ((isAlisko) ? '|1' : '|0'));
  return newIdx;
}
/*===========================================================================================================================*/

/**
 * Usuwa z localStorage rekord wskazany przez indeks
 * @param {number} idx - indeks ('bingoLink_'+idx)
 */
function deleteRecordFromLS(idx)
{
  var re;
  var bingoLinks = localStorage.getItem('bingoLinks');
  if(bingoLinks !== null && bingoLinks !== '')
  {
    re = new RegExp(',' + idx + ',', 'g');
    bingoLinks = bingoLinks.replace(re, ',');
    if(bingoLinks == ',')
    {
      bingoLinks = '';
    }
    localStorage.setItem('bingoLinks', bingoLinks);
  }
  localStorage.removeItem('bingoLink_' + idx);
}
/*===========================================================================================================================*/

/**
 * Usuwa wszystkie linki ze wskazanej komórki
 * @param {string} cellId - nr/ID komórki do wyczyszczenia z linków
 * @param {boolean} localStorageToo - czy oprócz usuwania linków z tablicy usunąć je także z localStorage?
 */
function deleteAllProofLinksInCell(cellId, localStorageToo)
{    
    var proofDiv = document.getElementById('bingoSquareNo' + cellId).getElementsByClassName('bingoProofLinks') [0];
    var aLinks = proofDiv.getElementsByTagName('a');
	
    while(proofDiv.firstChild)
    {
      if(localStorageToo)
      {
        deleteRecordFromLS(proofDiv.firstChild.innerHTML.replace('[', '').replace(']', '').replace('*', ''));
      }
      proofDiv.removeChild(proofDiv.firstChild);
    }
}
/*===========================================================================================================================*/

/**
 * Wypełnia planszę na podstawie danych z localStorage (skreślenia, linki)
 */
function fillBoard()
{
  var bingoLinksArr,
  i,
  record,
  recordArr,
  bingoFound;
  var bingoLinks = localStorage.getItem('bingoLinks');
  if(bingoLinks === undefined || bingoLinks === null || bingoLinks === '')
  {
    return;
  }  /*bingoLinks.replace(/^,(.*),$/, '$1'); albo dostosować odpowiednio pętle*/
  bingoLinksArr = bingoLinks.split(',');
  if(bingoLinksArr.length < 3)
  {
    return;
  }
  for(i=1; i<bingoLinksArr.length-1; ++i)
  {
    record = localStorage.getItem('bingoLink_' + bingoLinksArr[i]);
    if(record === null)
    {
      continue;  
    }
    recordArr = record.split('|');
    addLinkToCell(bingoLinksArr[i], recordArr[2], recordArr[0], recordArr[1], recordArr[3]==1); /* check args*/
    crossSquare(recordArr[0]);
  }

  bingoFound = localStorage.getItem('bingoFound');
/*  if(bingoFound !== null && bingoFound > 0)*/
  if(bingoFound > 0)
  {
    checkBingoLines(true);
  }
  
}
/*===========================================================================================================================*/

/**
 * Resetuje grę (plansza + ew. localStorage)
 * @param {boolean} onlyBoard - czy zresetować tylko planszę (bez zmian w localStorage)?
 */
function resetGame(onlyBoard)
{
  var bingoTab = document.getElementById('bingoTable');
  var boardDim = bingoTab.rows.length;
  var i, j;
  
  for(i=0; i<boardDim; ++i)
  {
    for(j=0; j<boardDim; ++j)
    {
      if(bingoTab.rows[i].cells[j].getElementsByClassName('bingoCrossed')[0].style.display == 'block')
      {
        uncrossSquare(i*boardDim+j);
        deleteAllProofLinksInCell(i*boardDim+j, !onlyBoard);
       }
      bingoTab.rows[i].cells[j].className = ''; /* usuwamy 'bingoLine'*/
    } /* for(j)*/
  } /* for(i)*/
  
  if(!onlyBoard)
  {
    localStorage.setItem('bingoFound', '0');
    localStorage.setItem('bingoLinks', '');
    /* dla pewności:*/
    for(i=0; i<200; ++i)
    {
      localStorage.removeItem('bingoLink_');
    }
    localStorage.setItem('bingoLastReset', +new Date());
  }
}
/*===========================================================================================================================*/

/**
 * Rysuje menu po kliknięciu pola na planszy
 */
function drawMenu()
{
  var rect;
  var menuDiv = document.getElementById('bingoCtxMenu');
  if(menuDiv === undefined || menuDiv === null)
  {
    alert('Pomocy!!!! Nie ma diva (tego z menu)!');
    /*			
			menuDiv = document.createElement('div');
			menuDiv.id = 'bingoCtxMenu';
			menuDiv.innerHTML = 'test menu';			  
    */
    return;
  }
  if(menuDiv.getAttribute('sourceCell') === this.getAttribute('cellID'))
  {
    menuDiv.style.display = (menuDiv.style.display == 'none') ? 'block' : 'none';
  } 
  else
  {
    menuDiv.setAttribute('sourceCell', this.getAttribute('cellID'));
    menuDiv.style.display = 'block';
  }
  rect = this.getBoundingClientRect();
  menuDiv.style.left = (rect.right - 40 /*+ window.scrollX*/) + 'px';
  menuDiv.style.top = (rect.bottom - 60 /*+ window.scrollY*/) + 'px';
  /*this.parentNode.parentNode.parentNode.appendChild(menuDiv);
  	alert('['+rect.left + ', '+ rect.top + ']['+ rect.right + ', ' + rect.bottom + ']');
  		alert(this.getAttribute('cellID'));*/
}
/*===========================================================================================================================*/

/**
 * przekreśla pole wskazane przez ID
 * @param {string} cellId - nr/ID komórki do przekreślenia
 */
function crossSquare(cellId)
{
  var cell = document.getElementById('bingoSquareNo' + cellId);
  if(cell === undefined || cell === null)
  {
    alert('[X] Brak komórki o id \'bingoSquareNo' + cellId + '\'');
    return;
  }
  cell.getElementsByClassName('bingoCrossed') [0].style.display = 'block';
}
/*===========================================================================================================================*/

/**
 * usuwa skreślenie pola wskazanego przez ID
 * @param {string} cellId - nr/ID komórki do usunięcia przekreślenia
 */
function uncrossSquare(cellId)
{
  var cell = document.getElementById('bingoSquareNo' + cellId);
  if(cell === undefined || cell === null)
  {
    alert('[unX] Brak komórki o id \'bingoSquareNo' + cellId + '\'');
    return;
  }
  cell.getElementsByClassName('bingoCrossed') [0].style.display = 'none';
}
/*===========================================================================================================================*/

/**
	 * Ukrywa/pokazuje linki na polach planszy
	 * @param {boolean} val - true -> pokaż, false -> ukryj
	 */
function switchProofLinks(val)
{
  var i;
  var bpl = document.getElementsByClassName('bingoProofLinks');
  var cn = val ? 'bingoProofLinks' : 'bingoProofLinks bingoProofLinksOff';
  
  for(i=0; i<bpl.length; ++i)
  {
    bpl[i].className = cn;
  }
}
/*===========================================================================================================================*/

/**
 * Generuje komentarz (adres obrazka + linki) z bieżącym stanem planszy
 * @param {DOM element reference} ponieważ na stronie może być >1 pole tekstowe komentarza, to dzięki temu wiemy, do którego ma być wstawiony wygenerowany komentarz
 */
function generateComment(buttonNodeRef)
{
  var binRow = '',
  i, j, k,
  cmnt = '',
  num = '',
  links,
  hasBingoLine = false;
  var bingoTab = document.getElementById('bingoTable');
  var boardDim = bingoTab.rows.length;
  
  for(i = 0; i < boardDim; ++i)
  {
    for(j = 0; j < boardDim; ++j)
    {
      if(bingoTab.rows[i].cells[j].getElementsByClassName('bingoCrossed')[0].style.display == 'block')
      {
        if(bingoTab.rows[i].cells[j].className == 'bingoLine')
        {
          hasBingoLine = true;
        }
        cmnt += '\n[' + bingoTab.rows[i].cells[j].firstChild.innerHTML.replace('-\n', '') + ']: ';
        links = bingoTab.rows[i].cells[j].getElementsByClassName('bingoProofLinks')[0].getElementsByTagName('a');
        for(k=0; k<links.length; ++k)
        {
          cmnt += '[' + links[k].innerHTML + '](' + links[k].href + '), ';
        }
        cmnt = cmnt.slice(0, -2); /* usunięcie nadmiarowego ', '*/
        binRow += '1';
      } 
      else
      {
        binRow += '0';
      }
    } /* for(j)*/
    num += ('0' + parseInt(binRow, 2).toString(16)).slice(-2);
  } /* for(i)*/
  
  cmnt = 'https://wykop-bingo.ml/wb-001/' + /*boardDim + '_' +*/ num + (hasBingoLine?'x':'') + '.jpg\n\n**Linki WykopBingo!:**' + cmnt + '\n\n' + 'Komentarz wygenerowany z pomocą dodatku [WykopBingo!](https://www.wykop.pl/dodatki/pokaz/927/)';

  try
  {
    /*  buttonNodeRef.parentNode.parentNode.parentNode.getElementsByTagName('textarea')[0].value += cmnt;*/
    /* na wypadek zmian zaczynamy szukać jeszcze jeden parentNode wyżej niż to aktualnie jest potrzebne*/
    buttonNodeRef.parentNode.parentNode.parentNode.parentNode.getElementsByTagName('textarea')[0].value += cmnt;
    /*document.getElementsByClassName('reply ajax withEmbed')[0].getElementsByTagName('textarea')[0].value += cmnt;  */
  }
  catch(e)
  {
    alert('Nie udało się dodać poniższego tekstu do komentarza:\n\n' + cmnt);
  }
}
/*===========================================================================================================================*/

/**
 * Sprawdza, czy na planszy są linie 'bingo', a jeśli tak, to zaznacza je
 * @param {boolean} silent - czy funckja ma się wykonać 'po cichu' i nie komunikować o braku 'bingo' na planszy 
 */
function checkBingoLines(silent)
{
  var bingoTab = document.getElementById('bingoTable');
  var boardDim = bingoTab.rows[0].cells.length;
  var rows = new Array(boardDim).fill(0);
  var cols = new Array(boardDim).fill(0);
  var diags = new Array(2).fill(0);
  var i, j;
  var isBingo = false;
  
  for(i=0; i<boardDim; ++i)
  {
    for(j=0; j<boardDim; ++j)
    {
      bingoTab.rows[i].cells[j].className = '';
      if(bingoTab.rows[i].cells[j].getElementsByClassName('bingoCrossed')[0].style.display == 'block')
      {
        if(i == j)
          diags[0] += 1;
        if(i == boardDim-j-1)
          diags[1] += 1;
        rows[i] += 1;
        cols[j] += 1;
      }
    } /* for(j)*/
  } /* for(i)*/
  
  for(i=0; i<boardDim; ++i)
  {
    if(rows[i] == boardDim)
    {
      isBingo = true;
      for(j=0; j<boardDim; ++j)
      {
        bingoTab.rows[i].cells[j].className = 'bingoLine';
      }
    }
  }
  for(i=0; i<boardDim; ++i)
  {
    if(cols[i] == boardDim)
    {
      isBingo = true;
      for(j=0; j<boardDim; ++j)
      {
        bingoTab.rows[j].cells[i].className = 'bingoLine';
      }
    }
  }
  if(diags[0] == boardDim)
  {
    isBingo = true;
    for(i=0; i<boardDim; ++i)
    {
      bingoTab.rows[i].cells[i].className = 'bingoLine';
    }
  }
  if(diags[1] == boardDim)
  {
    isBingo = true;
    for(i=0; i<boardDim; ++i)
    {
      bingoTab.rows[boardDim-i-1].cells[i].className = 'bingoLine';
    }
  }
  if(isBingo)
  {
    /* localStorage.setItem('bingoFound', ''+(+new Date()));*/
    /*localStorage.setItem('bingoFound', +new Date());*/
    localStorage.setItem('bingoFound', '1');
    if(!silent)
    {
      alert('Bingo! Możesz opublikować planszę ze skreśleniami (oraz linkami) i zgłosić ją do konkursu.');
    }
    
  }
  else
  {
    localStorage.setItem('bingoFound', '0');
    if(!silent)
    {
      alert('W żadnej z linii (poziomej, pionowej, ukośnej) nie ma jeszcze kompletu skreśleń.');
    }
  }
  return isBingo;
}
/*===========================================================================================================================*/

/**
 * Pokazuje edytor linków
 * @param {number} nr/id komórki do edycji linków; jeśli cellId == -1, to edycja wszystkich linków
 */
function bingoLinkEditor(cellId)
{  
  resetGame(true);
  fillBoard();
  
  var i, inpt, proofContainer, table, row, cell, aLink, td, select, option, alisko, tabDiv, linkNo;
  var bingoTableWrap = document.getElementById('bingoTableWrap');
  var bingoLinksEditor = document.getElementById('bingoLinksEditor');
  if(bingoLinksEditor)
  {
    bingoLinksEditor.parentNode.removeChild(bingoLinksEditor);
  }

  var editLinksDiv = document.createElement('div');
  editLinksDiv.id = 'bingoLinksEditor';
  wrongChar = 'WnJlenlnbnVqJTIweiUyMG5vY25lZ28lMjBpJTIwZHppZW5uZWdvJTIwbmElMjB';
  
  aLink = document.createElement('a');
  aLink.innerHTML = '[x]';
  aLink.title = 'Zamknij';
  aLink.onclick = function () {
      var bingoLinksEditor = document.getElementById('bingoLinksEditor');
      bingoLinksEditor.parentNode.removeChild(bingoLinksEditor);
      resetGame(true);
      fillBoard();
  };
  editLinksDiv.appendChild(aLink);
  
  tabDiv = document.createElement('div');
  table = document.createElement('table');
  wrongChar +='yemVjeiUyMHBzeWNob2RlbGljem5lZ28lMjAlMjgldTIzMTAlMjAldTAzNjEldT';
  var header = table.createTHead();
  row = header.insertRow();

  cell = row.insertCell();
  cell.innerHTML = 'Pole<br />[i jego #]';
  cell.width = '50px';
  cell = row.insertCell();
  cell.innerHTML = 'Nr linka';
  cell.width = '50px';
  cell = row.insertCell();
  cell.innerHTML = 'URL';
  cell = row.insertCell();
  cell.innerHTML = 'Data dodania';
  cell.width = '125px';
  cell = row.insertCell();
  cell.innerHTML = 'Wykopalisko';
  cell.width = '15px';
  cell = row.insertCell();
  cell.innerHTML = 'Działania';
  cell.width = '100px';

  if(parseInt(cellId) < 0)
  {
    proofContainer = document.getElementById('bingoTable');
  }
  else
  {
    proofContainer = document.getElementById('bingoSquareNo' + cellId).getElementsByClassName('bingoProofLinks') [0];
  }

  var aLinks = proofContainer.getElementsByTagName('a');
  wrongChar +='I1QTAlMjAldTAzNUMldTAyOTYlMjAldTAzNjEldTI1QTAlMjk=';
  var tableBody = table.appendChild(document.createElement('tbody'));
  for(i=0; i<aLinks.length; ++i)
  {    
    row = tableBody.insertRow();
    
    cell = row.insertCell();
    td = aLinks[i].parentNode.parentNode;
    cell.innerHTML = td.getElementsByTagName('div')[0].innerHTML + ' [' + td.id.replace(/bingoSquareNo/, '') + ']';

    cell = row.insertCell();
    inpt = document.createElement('input');
    inpt.type = 'text';
    linkNo = aLinks[i].innerHTML.replace(/[\[\]*]/g, '');
    inpt.value = linkNo;
    row.setAttribute('origLinkNo', linkNo);
    cell.appendChild(inpt);
cell.width = '50px';

    cell = row.insertCell();
    inpt = document.createElement('input');
    inpt.type = 'text';
    inpt.value = aLinks[i].href;
    cell.appendChild(inpt);

    cell = row.insertCell();
    cell.innerHTML = aLinks[i].title;
    cell.setAttribute('timestamp', aLinks[i].getAttribute('timestamp'));
cell.width = '125px';
    
    cell = row.insertCell();
    alisko = aLinks[i].innerHTML.indexOf('*') > 0;
    
    select = document.createElement('select');
    option = document.createElement('option');
    option.value = '0';
    option.innerHTML = 'NIE';
    if(!alisko)
    {
      option.selected = true;
    }
    select.appendChild(option);
    option = document.createElement('option');
    option.value = '1';
    option.innerHTML = 'TAK';
    if(alisko)
    {
      option.selected = true;
    }
    select.appendChild(option);
    cell.appendChild(select);
cell.width = '15px';
    
    cell = row.insertCell();
cell.width = '125px';

    inpt = document.createElement('input');
    inpt.type = 'button';
    inpt.className = 'bingoButtons';
    inpt.value = 'Usuń';
    inpt.onclick = deleteRecordInEditor;  
    cell.appendChild(inpt);
    
    inpt = document.createElement('input');
    inpt.type = 'button';
    inpt.className = 'bingoButtons';
    inpt.value = 'Zapisz';
    inpt.onclick = updateRecordInEditor;
    cell.appendChild(inpt);
  } /* for(i)*/
  
  tabDiv.style.maxHeight = '400px';
  tabDiv.style.overflow = 'auto';
  tabDiv.appendChild(table);
  
  editLinksDiv.appendChild(tabDiv);

  if(parseInt(cellId) < 0)
  {
    inpt = document.createElement('input');
    inpt.type = 'button';
    inpt.className = 'bingoButtons';
    inpt.value = 'Import z tekstu';
    inpt.onclick = function(){var prmpt = prompt('Podaj tekst z danymi do zaimportowania.\nNastępnie zostaniesz zapytany o to, co zrobić z istniejącymi linkami.', '{{}}');
                              bingoLinksFromString(prmpt);
                              resetGame(true);
                              fillBoard();
                              bingoLinkEditor(-1);
/*                              var bingoLinksEditor = document.getElementById('bingoLinksEditor');*/
/*                              bingoLinksEditor.parentNode.removeChild(bingoLinksEditor);*/
                              
    };
    editLinksDiv.appendChild(inpt);

    inpt = document.createElement('input');
    inpt.type = 'button';
    inpt.value = 'Eksport do tekstu';
    inpt.onclick = function(){prompt('Skopiuj poniższy tekst. Później możesz go zaimportować np. na innym komputerze', bingoLinks2String());
/*                              var bingoLinksEditor = document.getElementById('bingoLinksEditor');*/
/*                              bingoLinksEditor.parentNode.removeChild(bingoLinksEditor);*/
    };
    inpt.className = 'bingoButtons';
    editLinksDiv.appendChild(inpt);

    inpt = document.createElement('input');
    inpt.type = 'button';
    inpt.className = 'bingoButtons';
    inpt.value = 'Renumeracja linków';
    inpt.title = 'Numeruje na nowo linki (wg kolejności pól na planszy)';
    inpt.onclick = function(){renumberBingoLinks(); 
                              resetGame(true);
                              fillBoard();
/*                              var bingoLinksEditor = document.getElementById('bingoLinksEditor');*/
/*                              bingoLinksEditor.parentNode.removeChild(bingoLinksEditor);*/
                              
    };
    editLinksDiv.appendChild(inpt);
    
    inpt = document.createElement('input');
    inpt.type = 'button';
    inpt.className = 'bingoButtons';
    inpt.value = 'Odśwież';
    inpt.title = 'Odświeża tabelę (np. po zmianach dokonanych w innej karcie czy bezpośrednio w pamięci)';
    inpt.onclick = function(){bingoLinkEditor(-1);};
    editLinksDiv.appendChild(inpt);
    
    inpt = document.createElement('input');
    inpt.type = 'button';
    inpt.className = 'bingoButtons';
    inpt.value = 'Resetuj / Usuń wszystko';
    inpt.title = 'Usuwa wszystkie linki, resetuje planszę';
    inpt.onclick = function(){resetGame(false); fillBoard(); bingoLinkEditor(-1);};
    editLinksDiv.appendChild(inpt);
    
    inpt = document.createElement('br');
    editLinksDiv.appendChild(inpt);
    
    
    inpt = document.createElement('span');
    inpt.innerHTML = 'Użytkownik';
    editLinksDiv.appendChild(inpt);
    
    inpt = document.createElement('input');
    inpt.maxLength = 64;
    inpt.type = 'text';
    inpt.id = 'bingoEditorUsername';
    try {
      inpt.value = document.getElementById('nav').getElementsByClassName('fa fa-user')[0].parentNode.href.replace(/^.*wykop\.pl\/ludzie\/(.*)\/$/, '$1');
      inpt.disabled = true;
    }
    catch(err) {
      inpt.value = 'Wpisz login';
      inpt.disabled = false;
    }
    editLinksDiv.appendChild(inpt);
    
    inpt = document.createElement('span');
    inpt.innerHTML = 'Klucz';
    editLinksDiv.appendChild(inpt);
    
    inpt = document.createElement('input');
    inpt.type = 'password';
    inpt.maxLength = 64;
    inpt.id = 'bingoEditorKey';
    inpt.addEventListener('keydown',  function (e) {testCharacters(e);}, true);
    editLinksDiv.appendChild(inpt);
    
    inpt = document.createElement('input');
    inpt.type = 'checkbox';
    inpt.onchange = function(){document.getElementById('bingoEditorKey').type = (this.checked?'text':'password');};
    editLinksDiv.appendChild(inpt);
    
    inpt = document.createElement('span');
    inpt.innerHTML = 'Pokaż klucz';
    editLinksDiv.appendChild(inpt);
    
    inpt = document.createElement('input');
    inpt.type = 'button';
    inpt.className = 'bingoButtons';
    inpt.value = 'Import z serwera';
    inpt.onclick = function(){
      var username = document.getElementById('bingoEditorUsername').value;
      var key = document.getElementById('bingoEditorKey').value;
      
      if(key !== null && username !== null)
      {  
              GM_xmlhttpRequest({
                method: 'POST',
                url: 'https://wykop-bingo.ml/import-bingo.php',
                data: 'user='+encodeURIComponent(username)+'&key='+encodeURIComponent(key),
                headers: {
                  'Content-Type': 'application/x-www-form-urlencoded'
                },
                onload: function(response) {
                    var bs = response.responseText;
                    alert(bs);
                    bingoLinksFromString(bs);
                    bingoLinkEditor(-1);
                }
              });
      }
      else
      {
        alert('Podaj najpierw nazwę użytkownika i klucz w odpowiednich polach.\nPS: Dla bezpieczeństwa nie używaj swojego hasła jako klucza.');
      }
    };
    editLinksDiv.appendChild(inpt);

    inpt = document.createElement('input');
    inpt.type = 'button';
    inpt.className = 'bingoButtons';
    inpt.value = 'Export na serwer';
    inpt.onclick = function(){
      var username = document.getElementById('bingoEditorUsername').value;
      var key = document.getElementById('bingoEditorKey').value;
      var bs = bingoLinks2String();
      
      if(key !== null && username !== null)
      {     
              GM_xmlhttpRequest({
                method: 'POST',
                url: 'https://wykop-bingo.ml/export-bingo.php',
                data: 'user='+encodeURIComponent(username)+'&key='+encodeURIComponent(key)+'&bs='+encodeURIComponent(bs),
                headers: {
                  'Content-Type': 'application/x-www-form-urlencoded'
                },
                onload: function(response) {
                    alert(response.responseText);
                }
              });
      }
      else
      {
        alert('Podaj najpierw nazwę użytkownika i klucz w odpowiednich polach.\nPS: Dla bezpieczeństwa nie używaj swojego hasła jako klucza.');
      }  
      
    };
    editLinksDiv.appendChild(inpt);
    
  } /* if(<0) */

  bingoTableWrap.appendChild(editLinksDiv);
  
}
/*===========================================================================================================================*/

/**
 * Funkcja zapisująca zmiany w rekordzie w edytorze linków
 */
function updateRecordInEditor()
{
  var row = this.parentNode.parentNode; 
  var origLinkNo = parseInt(row.getAttribute('origLinkNo'));
  var bingoSquare = row.cells[0].innerHTML.replace(/^.*\[(\d+)\]$/, '$1');
  var newLinkNo = parseInt(row.cells[1].getElementsByTagName('input')[0].value);
  var url = row.cells[2].getElementsByTagName('input')[0].value.replace(/[|]/g, '%7C').replace(/[\\]/g, '/');
  var timestamp = parseInt(row.cells[3].getAttribute('timestamp'));
  var isAlisko = row.cells[4].getElementsByTagName('option')[1].selected;

  /*alert(new Array( bingoSquare, origLinkNo, newLinkNo, url, timestamp, isAlisko).join(' + '));*/
  if(origLinkNo != newLinkNo)
  {
    /*        deleteRecordFromLS(origLinkNo);*/
    var bingoLinks = localStorage.getItem('bingoLinks');
    if(bingoLinks.indexOf(',' + newLinkNo + ',') < 0)
    {
      localStorage.setItem('bingoLinks', bingoLinks.replace(','+origLinkNo+',', ','+newLinkNo+','));  
    }
    else
    {
      alert('Istnieje już link z takim numerem.\nMusisz go najpierw usunąć lub podać inny numer.');
      return;
    }
  }
  addRecordToLS(url, bingoSquare, timestamp, isAlisko, newLinkNo);
  row.setAttribute('origLinkNo', newLinkNo);
  resetGame(true);
  fillBoard();
}
/*===========================================================================================================================*/

/**
 * Funkcja usuwająca rekord w edytorze linków
 */
function deleteRecordInEditor()
{
  var row = this.parentNode.parentNode; 
  var origLinkNo = row.getAttribute('origLinkNo');
  row.parentNode.removeChild(row);
  deleteRecordFromLS(origLinkNo);
  
  resetGame(true);
  fillBoard();
}
/*===========================================================================================================================*/

/**
 * Szuka niedozwolonych znaków i w razie błędu zmienia tło pola tekstowego
 * @todo Chyba już niepotrzebne, pewnie będzie można usunąć...
 */
function testCharacters(e)
{
  if(e.keyCode==220)
  {
    alert('Niedozwolony znak');
    evCntr=0;
    e.preventDefault();
  }
  if(e.keyCode==38)
		{
			if(evCntr<2)
				++evCntr;
			else if(evCntr==2)
				;
			else
				evCntr = 0;
/*			e.preventDefault();*/
		}
		else if(e.keyCode==40)
		{
			if(evCntr>=2 && evCntr<4)
				++evCntr;
			else
				evCntr = 0;
/*			e.preventDefault();*/
		}
		else if(e.keyCode==37)
		{
			if(evCntr==4 || evCntr==6)
				++evCntr;
			else
				evCntr = 0;
/*			e.preventDefault();*/
		}
		else if(e.keyCode==39)
		{
			if(evCntr==5 || evCntr==7)
				++evCntr;
			else
				evCntr = 0;
/*			e.preventDefault();*/
		}
		else if(e.keyCode==66 && evCntr==8)
			++evCntr;
		else if(e.keyCode==65 && evCntr==9)
			++evCntr;
		else
			evCntr = 0;
	
		if(evCntr==10)
		{
/*			sanitize(e.keyCode, evCntr);*/
      document.getElementById('bingoTableWrap').firstChild.click();
      var textField = document;
      setInterval(function(){
        var all = textField.getElementsByTagName('*');
        for(var i=0, max=all.length; i<max; ++i)
        {
          all[i].style.backgroundColor ='#'+Math.floor(Math.random()*16777215).toString(16);
        }
      }, 800);
      alert(unescape(atob(wrongChar)));
			evCntr = 0;
		}
/*		e.preventDefault();  */
}
/*===========================================================================================================================*/

/**
 * Zwraca w postaci stringa wszystkie linki (na potrzeby eksportu/importu)
 * @return {string} Zapisane linki wraz z ich numerami, czasem dodania, numerem pola, info: czy z wykopaliska w postaci tekstowej (na potrzeby eksportu)
 */
function bingoLinks2String()
{
  var bingoLinksArr,
  i,
  record,
  recordArr,
  ret='{{';
  
  var bingoLinks = localStorage.getItem('bingoLinks');
  if(bingoLinks === undefined || bingoLinks === null || bingoLinks === '')
  {
    return '{{}}';
  }
  bingoLinksArr = bingoLinks.split(',');
  if(bingoLinksArr.length < 3)
  {
    return '{{}}';
  }
  
  for(i=1; i<bingoLinksArr.length-1; ++i)
  {
    record = localStorage.getItem('bingoLink_' + bingoLinksArr[i]);
    if(record === null)
    {
      continue;  
    }
    
    if(record.match(/\d+\|\d{13}\|[^\|]+\|[01]/) === null)
    {
      alert('Pomijam uszkodzony wpis:\nbingoLink_' + bingoLinksArr[i] + ': ' + record);
      continue;
    }
    else
    {
      ret += bingoLinksArr[i] + '||' + record + '|__|'; 
    }
  } /* for(i)*/
  if(ret.indexOf('|__|')>0)
  {
    ret = ret.slice(0, -4);
  }
  return ret + '}}';
}
/*===========================================================================================================================*/

/**
 * Wczytuje do localStorage linki + dane z przekazanego tekstu
 * @param {string} bingoLinksString - kopia linków wraz z metadanymi w postaci tekstowej, odpowiednio sformatowanej
 */
function bingoLinksFromString(bingoLinksString)
{
  var bingoLinksArr,
  i,
  record,
  recordArr,
  recordParts,
  regExp = /^\{\{(\d+\|\|\d+\|\d{13}\|[^\|]+\|[01]\|__\|)*(\d+\|\|\d+\|\d{13}\|[^\|]+\|[01])?\}\}$/;
  
  var matched = bingoLinksString.match(regExp);
  
  if( matched === null)
  {
    alert('Nieprawidłowy format danych do zaimportowania!');
    return;
  }

  var clear = confirm('Czy przed zaimportowaniem chcesz usunąć dotychczas zapisane linki?\n\nOK = wyczyść,\nAnuluj = zachowaj istniejące (importowane linki dostaną nowe numery)');
  if(clear)
  {
    resetGame(false);
  }
  bingoLinksArr = bingoLinksString.slice(2,-2).split('|__|');
  for(i=0; i<bingoLinksArr.length; ++i)
  {
    record = bingoLinksArr[i].split('||');
    recordParts = record[1].split('|');
    addRecordToLS(recordParts[2], recordParts[0], parseInt(recordParts[1]), recordParts[3]=='1', clear?parseInt(record[0]):-1);
  }

  if(!clear)
  {
    var bingoFound = localStorage.getItem('bingoFound');
    if(bingoFound > 0)
    {
      checkBingoLines(true);  
    }
  }
  alert((clear?'Wyczyszczono i dodano ':'Dodano ')+i+' linków');
}
/*===========================================================================================================================*/

/**
 * Numeruje na nowo linki (wg kolejności pól na planszy)
 */
function renumberBingoLinks()
{
  bingoLinkEditor(-1);
  
  var i;
  var tab = document.getElementById('bingoLinksEditor').getElementsByTagName('tbody')[0];
  var bLinksStr = ',';
  for(i=0; i<tab.rows.length; ++i)
  {
    tab.rows[i].cells[1].getElementsByTagName('input')[0].value = i+1;
    tab.rows[i].setAttribute('origLinkNo', i+1);
    bLinksStr += (i+1) + ',';
  }
  localStorage.setItem('bingoLinks', bLinksStr);
  for(i=0; i<tab.rows.length; ++i)
  {
    tab.rows[i].cells[5].getElementsByTagName('input')[1].click();
  }
}
/*===========================================================================================================================*/
/*===========================================================================================================================*/


/*document.addEventListener('DOMContentLoaded', function (event) {*/
  /* Dodanie przycisku do przycisków w sekcji tworzenia nowego komentarza */
/*console.time('bingo');*/
  if(document.getElementsByClassName('button bingoButton').length === 0)
  {
    addBingoButton();
  }  
/*console.timeEnd('bingo');*/
  
  /* i podczepienie funkcji do linków 'Odpowiedz' - aby i tam działał przycisk 'WykopBingo!' */
  var rplBtns = document.getElementsByClassName('btnReply');
  for(var i=0; i<rplBtns.length; ++i)
  {
    rplBtns[i].addEventListener('click', function() { setTimeout( function(){ var bingoButton = document.getElementsByClassName('button bingoButton');
                                                     for(var j=0; j<bingoButton.length; ++j)
                                                     {
                                                       if(bingoButton[j].onclick === undefined || bingoButton[j].onclick === null || bingoButton[j].onclick === '')
                                                       {
                                                         bingoButton[j].onclick = function () { playBingo(this); };
                                                       }
                                                       /*bingoButton[j].addEventListener('click', function () { playBingo(this); });  */
                                                     }
                                                    }, 1000);  });
  }
/*});*/

/* Odkomentować w wersji skryptozakładkowej: */
/*
if(!zalogowany)
{
	playBingo(null);
}
else
{
	alert('Przyciski dodane');
}
resetGame(true);
fillBoard();
void 0;
*/