您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
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 = '✘'; 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; */
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址