WykopBingo!

Graj znaleziskami w Bingo na Wykopie

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==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;
*/