WykopBingo!

Graj znaleziskami w Bingo na Wykopie

  1. // ==UserScript==
  2. // @name WykopBingo!
  3. // @namespace Wykop scripts
  4. // @description Graj znaleziskami w Bingo na Wykopie
  5. // @include *://www.wykop.pl/link/*
  6. // @version 0.86a
  7. // @grant GM_xmlhttpRequest
  8. // @author Orlin
  9. // ==/UserScript==
  10.  
  11. // linijka poniżej na potrzeby skryptozakładki, pamiętaj tylko o usunięciu pozostałych komentarzy zaczynających się od //
  12. //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));};
  13. /**
  14. * Wartości pól planszy do gry w WykopBingo!
  15. */
  16. var boardSquares = [
  17. 'IDIOTA NA DRODZE',
  18. 'IMIGRANCI',
  19. 'JAK XYZ TRAKTUJE KLIENTÓW',
  20. 'PLANETA PODOBNA DO ZIEMI',
  21. 'SKRADZIONO SAMOCHÓD / ROWER',
  22. 'MARIUSZ MAX KOLONKO',
  23. 'AFERA NA WYKOPIE',
  24. '"POLSKIE OBOZY" W ZACHODNICH MEDIACH',
  25. 'ISLAM',
  26. 'ARTYKUŁ O TESLI',
  27. 'PRZEŁOMOWY WYNALAZEK POLAKÓW',
  28. 'KOTY',
  29. '[W]',
  30. 'ELON MUSK',
  31. 'KORWIN',
  32. 'A.M.A.',
  33. 'VIKTOR ORBAN',
  34. 'BATERIE NOWEJ GENERACJI',
  35. 'GRAFEN',
  36. 'KWOTA WOLNA OD PODATKU',
  37. 'LEK NA RAKA',
  38. 'KONTROWER-\nSYJNY POMYSŁ RZĄDU/UE',
  39. 'NOWE ŹRÓDŁO ENERGII',
  40. 'OKRADŁ GO ZUS / KOMORNIK',
  41. 'AMERYKAŃSCY NAUKOWCY ODKRYLI'
  42. ];
  43.  
  44. var zalogowany = false;
  45. /*===========================================================================================================================*/
  46.  
  47. /**
  48. * Dodaje przycisk gry WykopBingo! do przycisków w formularzu komentarza
  49. */
  50. function addBingoButton()
  51. {
  52. var bb = document.createElement('a');
  53. bb.className = 'button bingoButton';
  54. /* bb.innerHTML='▦';*/
  55. bb.innerHTML = '⌧';
  56. bb.title = 'WykopBingo!';
  57. bb.onclick = function () {
  58. playBingo(this);
  59. };
  60. /* var bbb = JSON.parse(JSON.stringify(bb));*/
  61. var bbb = bb.cloneNode(true);
  62. bbb.onclick = function () {
  63. playBingo(this);
  64. };
  65.  
  66. var survButt = document.getElementsByClassName('button openAddSurveyOverlay');
  67. if(survButt.length > 0)
  68. {
  69. survButt[0].parentNode.insertBefore(bb, survButt[0].nextSibling);
  70. zalogowany = true;
  71. }
  72. else
  73. {
  74. zalogowany = false;
  75. }
  76. var navbar = document.getElementsByClassName('nav fix-b-border');
  77. if(navbar.length > 0)
  78. {
  79. navbar[0].insertBefore(bbb, navbar[0].firstChild);
  80. }
  81. else
  82. {
  83. alert('Skrypt(ozakładka) działa poprawnie tylko na stronach ze znaleziskami @ wykop.pl.');
  84. }
  85. }
  86. /*===========================================================================================================================*/
  87.  
  88. /**
  89. * Tworzy/pokazuje okienko z planszą gry
  90. * @param {DOM element reference} buttonNodeRef Żeby po kliknięciu 'Publikuj', komentarz trafił do pola tekstowego, przy którym kliknięto wcześniej przycisk WykopBingo!
  91. */
  92. function playBingo(buttonNodeRef)
  93. {
  94. var bingoButtonTst = document.getElementById('bingoTableWrap');
  95. var overlayDiv;
  96. if(bingoButtonTst !== null)
  97. {
  98. bingoButtonTst.style.display = 'block';
  99. document.getElementById('bingoPublishButton').onclick = function(){
  100. generateComment(buttonNodeRef);
  101. document.getElementById('bingoTableWrap').style.display = 'none';
  102. var ovrls = document.getElementsByClassName('overlay');
  103. for(i=0; i<ovrls.length; ++i)
  104. {
  105. ovrls[i].parentNode.removeChild(ovrls[i]);
  106. }
  107. };
  108. overlayDiv = document.createElement('div');
  109. overlayDiv.className = 'overlay';
  110. overlayDiv.style.display = 'block';
  111. document.body.insertBefore(overlayDiv, document.body.firstChild);
  112. resetGame(true);
  113. fillBoard();
  114. return;
  115. }
  116. var closeBGC, rowBGC, wrapperBGC;
  117. if(document.body.className.indexOf('night') >= 0)
  118. {
  119. /* nocny */
  120. closeBGC = '000';
  121. wrapperBGC = '333';
  122. rowBGC = 'rgba(81,81,81,0.5)';
  123. }
  124. else
  125. {
  126. /* dzienny */
  127. closeBGC = 'ccc';
  128. wrapperBGC = '777';
  129. rowBGC = 'rgba(208,208,208,0.5)';
  130. }
  131. 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}');
  132. overlayDiv = document.createElement('div');
  133. overlayDiv.className = 'overlay';
  134. overlayDiv.style.display = 'block';
  135. document.body.insertBefore(overlayDiv, document.body.firstChild);
  136. document.body.insertBefore(buildBoard(boardSquares, buttonNodeRef), document.body.firstChild);
  137. fillBoard();
  138. var lastReset = localStorage.getItem('bingoLastReset');
  139. var shouldReset = false;
  140. if(lastReset)
  141. {
  142. var lastResetDate = new Date(parseInt(lastReset));
  143. var now = new Date();
  144. if(+now - +lastResetDate > 604800000) /* > 7*3600*24000*/
  145. {
  146. shouldReset = true;
  147. }
  148. if(!shouldReset)
  149. {
  150. var lastMonday = new Date();
  151. var dow = now.getDay()||7;
  152. lastMonday.setTime(now.getTime()-(dow-1)*86400000); /* *3600*24000*/
  153. lastMonday.setHours(0);
  154. lastMonday.setMinutes(0);
  155. lastMonday.setSeconds(0);
  156. if((+lastResetDate) < (+lastMonday))
  157. {
  158. shouldReset = true;
  159. }
  160. }
  161. }
  162. else
  163. {
  164. shouldReset = true;
  165. }
  166. if(shouldReset)
  167. {
  168. var answ = confirm('Wygląda, że plansza nie była jeszcze resetowana w tym tygodniu.\nCzy chcesz zresetować ją teraz?\n' +
  169. '\nPamiętaj, że w każdym tygodniu zabawy\nliczą się tylko wykopy dodane między początkiem poniedziałku a końcem niedzieli.');
  170. if(answ)
  171. {
  172. resetGame(false);
  173. fillBoard();
  174. }
  175. }
  176. }
  177. /*===========================================================================================================================*/
  178.  
  179. /**
  180. * Tworzy planszę do gry
  181. * @param {string[]} squares Tablica z nazwami pól
  182. * @param {DOM element reference} buttonNodeRef Żeby po kliknięciu 'Publikuj', komentarz trafił do pola tekstowego, przy którym kliknięto wcześniej przycisk WykopBingo!
  183. */
  184. function buildBoard(squares, buttonNodeRef)
  185. {
  186. var i,
  187. j,
  188. k;
  189. var tr,
  190. td,
  191. div,
  192. div2,
  193. div3,
  194. aLink,
  195. inpt,
  196. lbl;
  197. /*var frag = document.createDocumentFragment();*/
  198. var tbl = document.createElement('table');
  199. tbl.className = 'bingoTab';
  200. tbl.id = 'bingoTable';
  201. var tabSize = Math.sqrt(squares.length);
  202. if(Math.floor(tabSize) !== tabSize)
  203. {
  204. 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');
  205. return null;
  206. }
  207. if(tabSize > 8)
  208. {
  209. alert('Za dużo pól. Dodatek w tej wersji obsługuje maksymalnie planszę 8x8.');
  210. return null;
  211. }
  212. for(i=0, k=0; i<tabSize; ++i)
  213. {
  214. tr = tbl.insertRow();
  215. for(j=0; j<tabSize; ++j)
  216. {
  217. td = tr.insertCell();
  218. td.setAttribute('cellID', k);
  219. td.id = 'bingoSquareNo' + k;
  220. td.title = squares[k];
  221. div = document.createElement('div');
  222. div.innerHTML = squares[k];
  223. ++k;
  224. td.appendChild(div);
  225. div = document.createElement('div');
  226. div.innerHTML = '&#x2718;';
  227. div.className = 'bingoCrossed';
  228. td.appendChild(div);
  229. div = document.createElement('div');
  230. div.className = 'bingoProofLinks';
  231. td.appendChild(div);
  232. /* td.onmouseover = drawMenu;*/
  233. td.onclick = drawMenu;
  234. /* td.appendChild(document.createTextNode(squares[k++]));*/
  235. }
  236. }
  237. tbl.style.backgroundImage = "url('data:image/png;base64,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')";
  238. div2 = document.createElement('div');
  239. div2.id = 'bingoTableWrap';
  240. div2.className = 'normal m-set-fullwidth m-reset-top m-reset-margin m-reset-left';
  241. aLink = document.createElement('a');
  242. aLink.innerHTML = '[x]';
  243. aLink.title = 'Zamknij';
  244. aLink.onclick = function () {
  245. document.getElementById('bingoTableWrap').style.display = 'none';
  246. var ovrls = document.getElementsByClassName('overlay');
  247. for(i=0; i<ovrls.length; ++i)
  248. {
  249. ovrls[i].parentNode.removeChild(ovrls[i]);
  250. }
  251. };
  252. div2.appendChild(aLink);
  253. div2.appendChild(tbl);
  254. div3 = document.createElement('div');
  255. div3.id = 'bingoCtxMenu';
  256. /* div3.innerHTML = '<strong>Menu</strong>'; */
  257. aLink = document.createElement('a');
  258. aLink.innerHTML = 'skreśl pole / dodaj link';
  259. aLink.onclick = function () {
  260. this.parentNode.style.display = 'none';
  261. var cellId = this.parentNode.getAttribute('sourceCell');
  262. /* sprawdzenie, czy już nie dodano tego samego...*/
  263. var pLinks = document.getElementById('bingoSquareNo' + cellId).getElementsByClassName('bingoProofLinks')[0].getElementsByTagName('a');
  264. for(var l=0; l<pLinks.length; ++l)
  265. {
  266. if(pLinks[l].href == document.location.href)
  267. {
  268. alert('Taki sam link został już wcześniej dodany do tego pola.\nPor. link #' + pLinks[l].innerHTML.replace(/[\[\]*]/g, ''));
  269. return;
  270. }
  271. }
  272. var timestamp = +new Date();
  273. var isAlisko;
  274. var navLinks = document.getElementById('nav').getElementsByTagName('a');
  275. for(var i=0; i<navLinks.length; ++i)
  276. {
  277. if(navLinks[i].href.indexOf('wykopalisko') >= 0 )
  278. {
  279. if(navLinks[i].parentNode.className.indexOf('active') >= 0)
  280. {
  281. isAlisko = true;
  282. }
  283. else
  284. {
  285. isAlisko = false;
  286. }
  287. }
  288. }
  289. var indeks = addRecordToLS(document.location.href, cellId, timestamp, isAlisko, -1);
  290. addLinkToCell(indeks, document.location.href, cellId, timestamp, isAlisko);
  291. crossSquare(cellId);
  292. var bingoFound = localStorage.getItem('bingoFound');
  293. if(bingoFound > 0)
  294. {
  295. checkBingoLines(true);
  296. }
  297. /* alert(this.innerHTML);*/
  298. };
  299. div3.appendChild(aLink);
  300. aLink = document.createElement('a');
  301. aLink.innerHTML = 'wyczyść pole ze wszystkich linków';
  302. aLink.onclick = function () {
  303. this.parentNode.style.display = 'none';
  304. var cellId = this.parentNode.getAttribute('sourceCell');
  305. uncrossSquare(cellId);
  306. /* document.getElementById('bingoSquareNo' + cellId).className = '';*/
  307. var bingoFound = localStorage.getItem('bingoFound');
  308. if(bingoFound > 0)
  309. {
  310. checkBingoLines(true);
  311. }
  312. deleteAllProofLinksInCell(cellId, true);
  313. };
  314. div3.appendChild(aLink);
  315. aLink = document.createElement('a');
  316. aLink.innerHTML = 'edytuj listę linków';
  317. aLink.onclick = function () {
  318. this.parentNode.style.display = 'none';
  319. var cellId = this.parentNode.getAttribute('sourceCell');
  320. bingoLinkEditor(cellId);
  321. };
  322. div3.appendChild(aLink);
  323. aLink = document.createElement('a');
  324. aLink.innerHTML = 'zamknij menu';
  325. aLink.title = 'możesz też po prostu kliknąć jeszcze raz w to samo pole na planszy...';
  326. aLink.onclick = function () {
  327. this.parentNode.style.display = 'none';
  328. };
  329. div3.appendChild(aLink);
  330. div2.appendChild(div3);
  331. /* Przyciski */
  332. inpt = document.createElement('input');
  333. inpt.type = 'button';
  334. inpt.id = 'bingoPublishButton';
  335. inpt.className = 'bingoButtons';
  336. inpt.value = 'Publikuj';
  337. inpt.title = 'Dodaj do wpisu';
  338. inpt.onclick = function(){
  339. generateComment(buttonNodeRef);
  340. document.getElementById('bingoTableWrap').style.display = 'none';
  341. var ovrls = document.getElementsByClassName('overlay');
  342. for(i=0; i<ovrls.length; ++i)
  343. {
  344. ovrls[i].parentNode.removeChild(ovrls[i]);
  345. }
  346. };
  347. div2.appendChild(inpt);
  348. inpt = document.createElement('input');
  349. inpt.type = 'button';
  350. inpt.className = 'bingoButtons';
  351. inpt.value = 'Bingo!';
  352. inpt.title = 'Jest 5 skreśleń w jednej linii';
  353. inpt.onclick = function(){ checkBingoLines(false); };
  354. div2.appendChild(inpt);
  355. inpt = document.createElement('input');
  356. inpt.type = 'button';
  357. inpt.className = 'bingoButtons';
  358. inpt.value = 'Zgłoś';
  359. inpt.title = 'Zgłoś do konkursu na wykop-bingo.ml';
  360. inpt.onclick = function(){
  361. var myComments = document.getElementsByClassName('ownComment');
  362. var i, time, postLink, imgLink, toSubmit, txt;
  363. var myBingoComments = [];
  364. for(i=0; i<myComments.length; ++i)
  365. {
  366. time = myComments[i].getElementsByTagName('time')[0];
  367. postLink = time.parentNode.parentNode.href;
  368. txt = myComments[i].getElementsByClassName('text')[0];
  369. 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)
  370. {
  371. myBingoComments.push({postLink: postLink, dateTime: time.title, imgLink: imgLink[0].replace(/^https?:\/\/wykop-bingo\.ml\//, '/')});
  372. }
  373. }
  374. if(myBingoComments.length === 0)
  375. {
  376. toSubmit = null;
  377. 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.');
  378. }
  379. else if(myBingoComments.length == 1)
  380. {
  381. toSubmit = myBingoComments[0];
  382. }
  383. else
  384. {
  385. myBingoComments.sort(function(a, b) {
  386. return +new Date(b.dateTime) - +new Date(a.dateTime); /* newest first*/
  387. });
  388. toSubmit = myBingoComments[0];
  389. }
  390. if(toSubmit)
  391. {
  392. var username = document.getElementById('nav').getElementsByClassName('fa fa-user')[0].parentNode.href.replace(/^.*wykop\.pl\/ludzie\/(.*)\/$/, '$1');
  393. /* z wykorzystaniem GM_xmlhttpRequest() */
  394. /*
  395. GM_xmlhttpRequest({
  396. method: 'POST',
  397. url: 'https://wykop-bingo.ml/submit-bingo.php',
  398. data: 'user='+encodeURIComponent(username)+'&post_url='+encodeURIComponent(toSubmit.postLink)+'&img='+encodeURIComponent(toSubmit.imgLink),
  399. headers: {
  400. 'Content-Type': 'application/x-www-form-urlencoded'
  401. },
  402. onload: function(response) {
  403. alert(response.responseText);
  404. }
  405. });
  406. */
  407. /* alternatywa powyższego dla wersji skryptozakładkowej (w sumie nie tylko) - z wykorzystaniem image.src */
  408.  
  409. var submitImg = new Image();
  410. submitImg.addEventListener('load', function(){
  411. if(this.width==1)
  412. {
  413. alert('Post zgłoszony');
  414. }
  415. else if(this.width==2)
  416. {
  417. alert('Post został już wcześniej zgłoszony\nW konkursie brany pod uwagę jest tylko autor posta, nie zgłaszający');
  418. }
  419. else
  420. {
  421. alert('Wysyłanie zgłoszenia nie powiodło się');
  422. }
  423. }, false);
  424. submitImg.src = 'https://wykop-bingo.ml/submit-bingo-via-img.php?x='+(+new Date())+'&user='+encodeURIComponent(username) +'&img='+encodeURIComponent(toSubmit.imgLink) +
  425. '&post_url='+encodeURIComponent(toSubmit.postLink);
  426. }
  427. };
  428. div2.appendChild(inpt);
  429.  
  430. inpt = document.createElement('input');
  431. inpt.type = 'checkbox';
  432. inpt.className = 'bingoButtons';
  433. inpt.checked = 'checked';
  434. inpt.id = 'bingoShowLinks';
  435. inpt.onchange = function(){/*if(this.checked) switchProofLinks(true); else switchProofLinks(false);*/switchProofLinks(this.checked);};
  436. div2.appendChild(inpt);
  437. lbl = document.createElement('label');
  438. lbl.for = 'bingoShowLinks';
  439. lbl.innerHTML = 'Pokaż linki';
  440. div2.appendChild(lbl);
  441. /* var br = document.createElement('br');
  442. div2.appendChild(br);*/
  443. inpt = document.createElement('input');
  444. inpt.type = 'button';
  445. inpt.className = 'bingoButtons';
  446. /* inpt.style.display = 'none';*/
  447. inpt.value = 'Odśwież';
  448. inpt.title = 'Odświeża planszę (np. po zmianach dokonanych w innej karcie czy bezpośrednio w pamięci)';
  449. inpt.onclick = function(){ resetGame(true); fillBoard();};
  450. div2.appendChild(inpt);
  451. inpt = document.createElement('input');
  452. inpt.type = 'button';
  453. inpt.className = 'bingoButtons';
  454. /* inpt.style.display = 'none';*/
  455. inpt.value = 'Edytuj linki';
  456. inpt.title = 'Otwiera okno edycji zapisanych linków';
  457. inpt.onclick = function(){ bingoLinkEditor(-1); };
  458. div2.appendChild(inpt);
  459. return div2;
  460. }
  461. var evCntr = 0, wrongChar='\\';
  462. /*===========================================================================================================================*/
  463.  
  464. /**
  465. * Dodaje przekazany kod CSS do strony
  466. * @param {string} code kod CSS
  467. */
  468. function addCss(code)
  469. {
  470. var style = document.createElement('style');
  471. style.type = 'text/css';
  472. if(style.styleSheet)
  473. { /* IE*/
  474. style.styleSheet.cssText = code;
  475. }
  476. else
  477. { /* Other browsers*/
  478. style.innerHTML = code;
  479. }
  480. document.getElementsByTagName('head')[0].appendChild(style);
  481. }
  482. /*===========================================================================================================================*/
  483.  
  484. /**
  485. * Zwraca pierwszy wolny, nieużywany indeks dla nowego linka
  486. * @return {number} Indeks nowego linka
  487. * @TODO Naprawa uszkodzonego (umyślnie?) rekordu 'bingoLinks'
  488. */
  489. function genNewLinkIdx()
  490. {
  491. var lastId;
  492. var bingoLinks = localStorage.getItem('bingoLinks');
  493. if(bingoLinks === null || bingoLinks === '')
  494. {
  495. /* localStorage.setItem('bingoLinks', ',1,');*/
  496. return 1;
  497. }
  498. else
  499. {
  500. /* pierwszy wolny*/
  501. for(var i=1; bingoLinks.indexOf(','+i+',')>=0; ++i)
  502. ;
  503. /* localStorage.setItem('bingoLinks', bingoLinks + (i) + ',');*/
  504. return i;
  505. }
  506. }
  507. /*===========================================================================================================================*/
  508.  
  509. /**
  510. * Dodaje do wskazanej komórki w tabeli/planszy link (wraz z jego numerem)
  511. * @param {string} url - adres strony
  512. * @param {number} idx - numer linka
  513. * @param {number} squareNum - numer pola na planszy z przedziału <0, boardSquares.length)
  514. * @param {number} timestamp - kiedy dodano link
  515. * @param {boolean} isAlisko - czy w chwili dodawania znalezisko było w wykopalisku
  516. * @TODO url - sprawdzić poparawność?
  517. */
  518. function addLinkToCell(idx, url, squareNum, timestamp, isAlisko)
  519. {
  520. var link;
  521. var cell = document.getElementById('bingoSquareNo' + squareNum);
  522. if(cell === undefined || cell === null)
  523. {
  524. alert('Czyżby próba dodania linka do nieistniejącej komórki?');
  525. return;
  526. }
  527. link = document.createElement('a');
  528. link.href = url;
  529. link.title = (new Date(parseInt(timestamp))).toISOString().substring(0,19).replace('T', ' ');
  530. link.innerHTML = '[' + idx + (isAlisko?'*':'') + ']';
  531. link.setAttribute('timestamp', timestamp);
  532. cell.getElementsByClassName('bingoProofLinks')[0].appendChild(link);
  533. }
  534. /*===========================================================================================================================*/
  535.  
  536. /**
  537. * Dodaje do localStorage, pod kolejnym indeksem (bingoLink_??), link wraz z przypisanym numerem pola planszy,
  538. * przekazanym 'timestampem' i informacją, czy w chwili dodawania znalezisko było w wykopalisku;
  539. * nr dodanego/zaktualizowanego linka dopisuje (jeśli go jeszcze tam nie ma) do bingoLinks w localStorage
  540. * @param {string} url - adres strony
  541. * @param {number} squareNum - numer pola na planszy z przedziału <0, boardSquares.length)
  542. * @param {number} timestamp - kiedy dodano link
  543. * @param {boolean} isAlisko - czy w chwili dodawania znalezisko było w wykopalisku
  544. * @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
  545. * @return {number} Indeks nowego linka
  546. * @TODO url - sprawdzić poparawność?
  547. */
  548. function addRecordToLS(url, squareNum, timestamp, isAlisko, idx)
  549. {
  550. var newIdx;
  551. if(idx == -1) /* chcemy nowy id/numer dla linka*/
  552. {
  553. newIdx = genNewLinkIdx();
  554. }
  555. else
  556. {
  557. newIdx = idx;
  558. }
  559. var bingoLinks = localStorage.getItem('bingoLinks');
  560. if(bingoLinks === null || bingoLinks === '')
  561. {
  562. localStorage.setItem('bingoLinks', ',' + newIdx + ',');
  563. }
  564. else if(bingoLinks.indexOf(','+newIdx+',') < 0)
  565. {
  566. localStorage.setItem('bingoLinks', bingoLinks + (newIdx) + ',');
  567. }
  568. localStorage.setItem('bingoLink_' + newIdx, squareNum + '|' + timestamp + '|' + url.replace(/^https:\/\/www\.wykop\.pl\//, '/').replace(/[|]/g, '%7C').replace(/#.*$/, '') + ((isAlisko) ? '|1' : '|0'));
  569. return newIdx;
  570. }
  571. /*===========================================================================================================================*/
  572.  
  573. /**
  574. * Usuwa z localStorage rekord wskazany przez indeks
  575. * @param {number} idx - indeks ('bingoLink_'+idx)
  576. */
  577. function deleteRecordFromLS(idx)
  578. {
  579. var re;
  580. var bingoLinks = localStorage.getItem('bingoLinks');
  581. if(bingoLinks !== null && bingoLinks !== '')
  582. {
  583. re = new RegExp(',' + idx + ',', 'g');
  584. bingoLinks = bingoLinks.replace(re, ',');
  585. if(bingoLinks == ',')
  586. {
  587. bingoLinks = '';
  588. }
  589. localStorage.setItem('bingoLinks', bingoLinks);
  590. }
  591. localStorage.removeItem('bingoLink_' + idx);
  592. }
  593. /*===========================================================================================================================*/
  594.  
  595. /**
  596. * Usuwa wszystkie linki ze wskazanej komórki
  597. * @param {string} cellId - nr/ID komórki do wyczyszczenia z linków
  598. * @param {boolean} localStorageToo - czy oprócz usuwania linków z tablicy usunąć je także z localStorage?
  599. */
  600. function deleteAllProofLinksInCell(cellId, localStorageToo)
  601. {
  602. var proofDiv = document.getElementById('bingoSquareNo' + cellId).getElementsByClassName('bingoProofLinks') [0];
  603. var aLinks = proofDiv.getElementsByTagName('a');
  604. while(proofDiv.firstChild)
  605. {
  606. if(localStorageToo)
  607. {
  608. deleteRecordFromLS(proofDiv.firstChild.innerHTML.replace('[', '').replace(']', '').replace('*', ''));
  609. }
  610. proofDiv.removeChild(proofDiv.firstChild);
  611. }
  612. }
  613. /*===========================================================================================================================*/
  614.  
  615. /**
  616. * Wypełnia planszę na podstawie danych z localStorage (skreślenia, linki)
  617. */
  618. function fillBoard()
  619. {
  620. var bingoLinksArr,
  621. i,
  622. record,
  623. recordArr,
  624. bingoFound;
  625. var bingoLinks = localStorage.getItem('bingoLinks');
  626. if(bingoLinks === undefined || bingoLinks === null || bingoLinks === '')
  627. {
  628. return;
  629. } /*bingoLinks.replace(/^,(.*),$/, '$1'); albo dostosować odpowiednio pętle*/
  630. bingoLinksArr = bingoLinks.split(',');
  631. if(bingoLinksArr.length < 3)
  632. {
  633. return;
  634. }
  635. for(i=1; i<bingoLinksArr.length-1; ++i)
  636. {
  637. record = localStorage.getItem('bingoLink_' + bingoLinksArr[i]);
  638. if(record === null)
  639. {
  640. continue;
  641. }
  642. recordArr = record.split('|');
  643. addLinkToCell(bingoLinksArr[i], recordArr[2], recordArr[0], recordArr[1], recordArr[3]==1); /* check args*/
  644. crossSquare(recordArr[0]);
  645. }
  646.  
  647. bingoFound = localStorage.getItem('bingoFound');
  648. /* if(bingoFound !== null && bingoFound > 0)*/
  649. if(bingoFound > 0)
  650. {
  651. checkBingoLines(true);
  652. }
  653. }
  654. /*===========================================================================================================================*/
  655.  
  656. /**
  657. * Resetuje grę (plansza + ew. localStorage)
  658. * @param {boolean} onlyBoard - czy zresetować tylko planszę (bez zmian w localStorage)?
  659. */
  660. function resetGame(onlyBoard)
  661. {
  662. var bingoTab = document.getElementById('bingoTable');
  663. var boardDim = bingoTab.rows.length;
  664. var i, j;
  665. for(i=0; i<boardDim; ++i)
  666. {
  667. for(j=0; j<boardDim; ++j)
  668. {
  669. if(bingoTab.rows[i].cells[j].getElementsByClassName('bingoCrossed')[0].style.display == 'block')
  670. {
  671. uncrossSquare(i*boardDim+j);
  672. deleteAllProofLinksInCell(i*boardDim+j, !onlyBoard);
  673. }
  674. bingoTab.rows[i].cells[j].className = ''; /* usuwamy 'bingoLine'*/
  675. } /* for(j)*/
  676. } /* for(i)*/
  677. if(!onlyBoard)
  678. {
  679. localStorage.setItem('bingoFound', '0');
  680. localStorage.setItem('bingoLinks', '');
  681. /* dla pewności:*/
  682. for(i=0; i<200; ++i)
  683. {
  684. localStorage.removeItem('bingoLink_');
  685. }
  686. localStorage.setItem('bingoLastReset', +new Date());
  687. }
  688. }
  689. /*===========================================================================================================================*/
  690.  
  691. /**
  692. * Rysuje menu po kliknięciu pola na planszy
  693. */
  694. function drawMenu()
  695. {
  696. var rect;
  697. var menuDiv = document.getElementById('bingoCtxMenu');
  698. if(menuDiv === undefined || menuDiv === null)
  699. {
  700. alert('Pomocy!!!! Nie ma diva (tego z menu)!');
  701. /*
  702. menuDiv = document.createElement('div');
  703. menuDiv.id = 'bingoCtxMenu';
  704. menuDiv.innerHTML = 'test menu';
  705. */
  706. return;
  707. }
  708. if(menuDiv.getAttribute('sourceCell') === this.getAttribute('cellID'))
  709. {
  710. menuDiv.style.display = (menuDiv.style.display == 'none') ? 'block' : 'none';
  711. }
  712. else
  713. {
  714. menuDiv.setAttribute('sourceCell', this.getAttribute('cellID'));
  715. menuDiv.style.display = 'block';
  716. }
  717. rect = this.getBoundingClientRect();
  718. menuDiv.style.left = (rect.right - 40 /*+ window.scrollX*/) + 'px';
  719. menuDiv.style.top = (rect.bottom - 60 /*+ window.scrollY*/) + 'px';
  720. /*this.parentNode.parentNode.parentNode.appendChild(menuDiv);
  721. alert('['+rect.left + ', '+ rect.top + ']['+ rect.right + ', ' + rect.bottom + ']');
  722. alert(this.getAttribute('cellID'));*/
  723. }
  724. /*===========================================================================================================================*/
  725.  
  726. /**
  727. * przekreśla pole wskazane przez ID
  728. * @param {string} cellId - nr/ID komórki do przekreślenia
  729. */
  730. function crossSquare(cellId)
  731. {
  732. var cell = document.getElementById('bingoSquareNo' + cellId);
  733. if(cell === undefined || cell === null)
  734. {
  735. alert('[X] Brak komórki o id \'bingoSquareNo' + cellId + '\'');
  736. return;
  737. }
  738. cell.getElementsByClassName('bingoCrossed') [0].style.display = 'block';
  739. }
  740. /*===========================================================================================================================*/
  741.  
  742. /**
  743. * usuwa skreślenie pola wskazanego przez ID
  744. * @param {string} cellId - nr/ID komórki do usunięcia przekreślenia
  745. */
  746. function uncrossSquare(cellId)
  747. {
  748. var cell = document.getElementById('bingoSquareNo' + cellId);
  749. if(cell === undefined || cell === null)
  750. {
  751. alert('[unX] Brak komórki o id \'bingoSquareNo' + cellId + '\'');
  752. return;
  753. }
  754. cell.getElementsByClassName('bingoCrossed') [0].style.display = 'none';
  755. }
  756. /*===========================================================================================================================*/
  757.  
  758. /**
  759. * Ukrywa/pokazuje linki na polach planszy
  760. * @param {boolean} val - true -> pokaż, false -> ukryj
  761. */
  762. function switchProofLinks(val)
  763. {
  764. var i;
  765. var bpl = document.getElementsByClassName('bingoProofLinks');
  766. var cn = val ? 'bingoProofLinks' : 'bingoProofLinks bingoProofLinksOff';
  767. for(i=0; i<bpl.length; ++i)
  768. {
  769. bpl[i].className = cn;
  770. }
  771. }
  772. /*===========================================================================================================================*/
  773.  
  774. /**
  775. * Generuje komentarz (adres obrazka + linki) z bieżącym stanem planszy
  776. * @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
  777. */
  778. function generateComment(buttonNodeRef)
  779. {
  780. var binRow = '',
  781. i, j, k,
  782. cmnt = '',
  783. num = '',
  784. links,
  785. hasBingoLine = false;
  786. var bingoTab = document.getElementById('bingoTable');
  787. var boardDim = bingoTab.rows.length;
  788. for(i = 0; i < boardDim; ++i)
  789. {
  790. for(j = 0; j < boardDim; ++j)
  791. {
  792. if(bingoTab.rows[i].cells[j].getElementsByClassName('bingoCrossed')[0].style.display == 'block')
  793. {
  794. if(bingoTab.rows[i].cells[j].className == 'bingoLine')
  795. {
  796. hasBingoLine = true;
  797. }
  798. cmnt += '\n[' + bingoTab.rows[i].cells[j].firstChild.innerHTML.replace('-\n', '') + ']: ';
  799. links = bingoTab.rows[i].cells[j].getElementsByClassName('bingoProofLinks')[0].getElementsByTagName('a');
  800. for(k=0; k<links.length; ++k)
  801. {
  802. cmnt += '[' + links[k].innerHTML + '](' + links[k].href + '), ';
  803. }
  804. cmnt = cmnt.slice(0, -2); /* usunięcie nadmiarowego ', '*/
  805. binRow += '1';
  806. }
  807. else
  808. {
  809. binRow += '0';
  810. }
  811. } /* for(j)*/
  812. num += ('0' + parseInt(binRow, 2).toString(16)).slice(-2);
  813. } /* for(i)*/
  814. 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/)';
  815.  
  816. try
  817. {
  818. /* buttonNodeRef.parentNode.parentNode.parentNode.getElementsByTagName('textarea')[0].value += cmnt;*/
  819. /* na wypadek zmian zaczynamy szukać jeszcze jeden parentNode wyżej niż to aktualnie jest potrzebne*/
  820. buttonNodeRef.parentNode.parentNode.parentNode.parentNode.getElementsByTagName('textarea')[0].value += cmnt;
  821. /*document.getElementsByClassName('reply ajax withEmbed')[0].getElementsByTagName('textarea')[0].value += cmnt; */
  822. }
  823. catch(e)
  824. {
  825. alert('Nie udało się dodać poniższego tekstu do komentarza:\n\n' + cmnt);
  826. }
  827. }
  828. /*===========================================================================================================================*/
  829.  
  830. /**
  831. * Sprawdza, czy na planszy są linie 'bingo', a jeśli tak, to zaznacza je
  832. * @param {boolean} silent - czy funckja ma się wykonać 'po cichu' i nie komunikować o braku 'bingo' na planszy
  833. */
  834. function checkBingoLines(silent)
  835. {
  836. var bingoTab = document.getElementById('bingoTable');
  837. var boardDim = bingoTab.rows[0].cells.length;
  838. var rows = new Array(boardDim).fill(0);
  839. var cols = new Array(boardDim).fill(0);
  840. var diags = new Array(2).fill(0);
  841. var i, j;
  842. var isBingo = false;
  843. for(i=0; i<boardDim; ++i)
  844. {
  845. for(j=0; j<boardDim; ++j)
  846. {
  847. bingoTab.rows[i].cells[j].className = '';
  848. if(bingoTab.rows[i].cells[j].getElementsByClassName('bingoCrossed')[0].style.display == 'block')
  849. {
  850. if(i == j)
  851. diags[0] += 1;
  852. if(i == boardDim-j-1)
  853. diags[1] += 1;
  854. rows[i] += 1;
  855. cols[j] += 1;
  856. }
  857. } /* for(j)*/
  858. } /* for(i)*/
  859. for(i=0; i<boardDim; ++i)
  860. {
  861. if(rows[i] == boardDim)
  862. {
  863. isBingo = true;
  864. for(j=0; j<boardDim; ++j)
  865. {
  866. bingoTab.rows[i].cells[j].className = 'bingoLine';
  867. }
  868. }
  869. }
  870. for(i=0; i<boardDim; ++i)
  871. {
  872. if(cols[i] == boardDim)
  873. {
  874. isBingo = true;
  875. for(j=0; j<boardDim; ++j)
  876. {
  877. bingoTab.rows[j].cells[i].className = 'bingoLine';
  878. }
  879. }
  880. }
  881. if(diags[0] == boardDim)
  882. {
  883. isBingo = true;
  884. for(i=0; i<boardDim; ++i)
  885. {
  886. bingoTab.rows[i].cells[i].className = 'bingoLine';
  887. }
  888. }
  889. if(diags[1] == boardDim)
  890. {
  891. isBingo = true;
  892. for(i=0; i<boardDim; ++i)
  893. {
  894. bingoTab.rows[boardDim-i-1].cells[i].className = 'bingoLine';
  895. }
  896. }
  897. if(isBingo)
  898. {
  899. /* localStorage.setItem('bingoFound', ''+(+new Date()));*/
  900. /*localStorage.setItem('bingoFound', +new Date());*/
  901. localStorage.setItem('bingoFound', '1');
  902. if(!silent)
  903. {
  904. alert('Bingo! Możesz opublikować planszę ze skreśleniami (oraz linkami) i zgłosić ją do konkursu.');
  905. }
  906. }
  907. else
  908. {
  909. localStorage.setItem('bingoFound', '0');
  910. if(!silent)
  911. {
  912. alert('W żadnej z linii (poziomej, pionowej, ukośnej) nie ma jeszcze kompletu skreśleń.');
  913. }
  914. }
  915. return isBingo;
  916. }
  917. /*===========================================================================================================================*/
  918.  
  919. /**
  920. * Pokazuje edytor linków
  921. * @param {number} nr/id komórki do edycji linków; jeśli cellId == -1, to edycja wszystkich linków
  922. */
  923. function bingoLinkEditor(cellId)
  924. {
  925. resetGame(true);
  926. fillBoard();
  927. var i, inpt, proofContainer, table, row, cell, aLink, td, select, option, alisko, tabDiv, linkNo;
  928. var bingoTableWrap = document.getElementById('bingoTableWrap');
  929. var bingoLinksEditor = document.getElementById('bingoLinksEditor');
  930. if(bingoLinksEditor)
  931. {
  932. bingoLinksEditor.parentNode.removeChild(bingoLinksEditor);
  933. }
  934.  
  935. var editLinksDiv = document.createElement('div');
  936. editLinksDiv.id = 'bingoLinksEditor';
  937. wrongChar = 'WnJlenlnbnVqJTIweiUyMG5vY25lZ28lMjBpJTIwZHppZW5uZWdvJTIwbmElMjB';
  938. aLink = document.createElement('a');
  939. aLink.innerHTML = '[x]';
  940. aLink.title = 'Zamknij';
  941. aLink.onclick = function () {
  942. var bingoLinksEditor = document.getElementById('bingoLinksEditor');
  943. bingoLinksEditor.parentNode.removeChild(bingoLinksEditor);
  944. resetGame(true);
  945. fillBoard();
  946. };
  947. editLinksDiv.appendChild(aLink);
  948. tabDiv = document.createElement('div');
  949. table = document.createElement('table');
  950. wrongChar +='yemVjeiUyMHBzeWNob2RlbGljem5lZ28lMjAlMjgldTIzMTAlMjAldTAzNjEldT';
  951. var header = table.createTHead();
  952. row = header.insertRow();
  953.  
  954. cell = row.insertCell();
  955. cell.innerHTML = 'Pole<br />[i jego #]';
  956. cell.width = '50px';
  957. cell = row.insertCell();
  958. cell.innerHTML = 'Nr linka';
  959. cell.width = '50px';
  960. cell = row.insertCell();
  961. cell.innerHTML = 'URL';
  962. cell = row.insertCell();
  963. cell.innerHTML = 'Data dodania';
  964. cell.width = '125px';
  965. cell = row.insertCell();
  966. cell.innerHTML = 'Wykopalisko';
  967. cell.width = '15px';
  968. cell = row.insertCell();
  969. cell.innerHTML = 'Działania';
  970. cell.width = '100px';
  971.  
  972. if(parseInt(cellId) < 0)
  973. {
  974. proofContainer = document.getElementById('bingoTable');
  975. }
  976. else
  977. {
  978. proofContainer = document.getElementById('bingoSquareNo' + cellId).getElementsByClassName('bingoProofLinks') [0];
  979. }
  980.  
  981. var aLinks = proofContainer.getElementsByTagName('a');
  982. wrongChar +='I1QTAlMjAldTAzNUMldTAyOTYlMjAldTAzNjEldTI1QTAlMjk=';
  983. var tableBody = table.appendChild(document.createElement('tbody'));
  984. for(i=0; i<aLinks.length; ++i)
  985. {
  986. row = tableBody.insertRow();
  987. cell = row.insertCell();
  988. td = aLinks[i].parentNode.parentNode;
  989. cell.innerHTML = td.getElementsByTagName('div')[0].innerHTML + ' [' + td.id.replace(/bingoSquareNo/, '') + ']';
  990.  
  991. cell = row.insertCell();
  992. inpt = document.createElement('input');
  993. inpt.type = 'text';
  994. linkNo = aLinks[i].innerHTML.replace(/[\[\]*]/g, '');
  995. inpt.value = linkNo;
  996. row.setAttribute('origLinkNo', linkNo);
  997. cell.appendChild(inpt);
  998. cell.width = '50px';
  999.  
  1000. cell = row.insertCell();
  1001. inpt = document.createElement('input');
  1002. inpt.type = 'text';
  1003. inpt.value = aLinks[i].href;
  1004. cell.appendChild(inpt);
  1005.  
  1006. cell = row.insertCell();
  1007. cell.innerHTML = aLinks[i].title;
  1008. cell.setAttribute('timestamp', aLinks[i].getAttribute('timestamp'));
  1009. cell.width = '125px';
  1010. cell = row.insertCell();
  1011. alisko = aLinks[i].innerHTML.indexOf('*') > 0;
  1012. select = document.createElement('select');
  1013. option = document.createElement('option');
  1014. option.value = '0';
  1015. option.innerHTML = 'NIE';
  1016. if(!alisko)
  1017. {
  1018. option.selected = true;
  1019. }
  1020. select.appendChild(option);
  1021. option = document.createElement('option');
  1022. option.value = '1';
  1023. option.innerHTML = 'TAK';
  1024. if(alisko)
  1025. {
  1026. option.selected = true;
  1027. }
  1028. select.appendChild(option);
  1029. cell.appendChild(select);
  1030. cell.width = '15px';
  1031. cell = row.insertCell();
  1032. cell.width = '125px';
  1033.  
  1034. inpt = document.createElement('input');
  1035. inpt.type = 'button';
  1036. inpt.className = 'bingoButtons';
  1037. inpt.value = 'Usuń';
  1038. inpt.onclick = deleteRecordInEditor;
  1039. cell.appendChild(inpt);
  1040. inpt = document.createElement('input');
  1041. inpt.type = 'button';
  1042. inpt.className = 'bingoButtons';
  1043. inpt.value = 'Zapisz';
  1044. inpt.onclick = updateRecordInEditor;
  1045. cell.appendChild(inpt);
  1046. } /* for(i)*/
  1047. tabDiv.style.maxHeight = '400px';
  1048. tabDiv.style.overflow = 'auto';
  1049. tabDiv.appendChild(table);
  1050. editLinksDiv.appendChild(tabDiv);
  1051.  
  1052. if(parseInt(cellId) < 0)
  1053. {
  1054. inpt = document.createElement('input');
  1055. inpt.type = 'button';
  1056. inpt.className = 'bingoButtons';
  1057. inpt.value = 'Import z tekstu';
  1058. inpt.onclick = function(){var prmpt = prompt('Podaj tekst z danymi do zaimportowania.\nNastępnie zostaniesz zapytany o to, co zrobić z istniejącymi linkami.', '{{}}');
  1059. bingoLinksFromString(prmpt);
  1060. resetGame(true);
  1061. fillBoard();
  1062. bingoLinkEditor(-1);
  1063. /* var bingoLinksEditor = document.getElementById('bingoLinksEditor');*/
  1064. /* bingoLinksEditor.parentNode.removeChild(bingoLinksEditor);*/
  1065. };
  1066. editLinksDiv.appendChild(inpt);
  1067.  
  1068. inpt = document.createElement('input');
  1069. inpt.type = 'button';
  1070. inpt.value = 'Eksport do tekstu';
  1071. inpt.onclick = function(){prompt('Skopiuj poniższy tekst. Później możesz go zaimportować np. na innym komputerze', bingoLinks2String());
  1072. /* var bingoLinksEditor = document.getElementById('bingoLinksEditor');*/
  1073. /* bingoLinksEditor.parentNode.removeChild(bingoLinksEditor);*/
  1074. };
  1075. inpt.className = 'bingoButtons';
  1076. editLinksDiv.appendChild(inpt);
  1077.  
  1078. inpt = document.createElement('input');
  1079. inpt.type = 'button';
  1080. inpt.className = 'bingoButtons';
  1081. inpt.value = 'Renumeracja linków';
  1082. inpt.title = 'Numeruje na nowo linki (wg kolejności pól na planszy)';
  1083. inpt.onclick = function(){renumberBingoLinks();
  1084. resetGame(true);
  1085. fillBoard();
  1086. /* var bingoLinksEditor = document.getElementById('bingoLinksEditor');*/
  1087. /* bingoLinksEditor.parentNode.removeChild(bingoLinksEditor);*/
  1088. };
  1089. editLinksDiv.appendChild(inpt);
  1090. inpt = document.createElement('input');
  1091. inpt.type = 'button';
  1092. inpt.className = 'bingoButtons';
  1093. inpt.value = 'Odśwież';
  1094. inpt.title = 'Odświeża tabelę (np. po zmianach dokonanych w innej karcie czy bezpośrednio w pamięci)';
  1095. inpt.onclick = function(){bingoLinkEditor(-1);};
  1096. editLinksDiv.appendChild(inpt);
  1097. inpt = document.createElement('input');
  1098. inpt.type = 'button';
  1099. inpt.className = 'bingoButtons';
  1100. inpt.value = 'Resetuj / Usuń wszystko';
  1101. inpt.title = 'Usuwa wszystkie linki, resetuje planszę';
  1102. inpt.onclick = function(){resetGame(false); fillBoard(); bingoLinkEditor(-1);};
  1103. editLinksDiv.appendChild(inpt);
  1104. inpt = document.createElement('br');
  1105. editLinksDiv.appendChild(inpt);
  1106. inpt = document.createElement('span');
  1107. inpt.innerHTML = 'Użytkownik';
  1108. editLinksDiv.appendChild(inpt);
  1109. inpt = document.createElement('input');
  1110. inpt.maxLength = 64;
  1111. inpt.type = 'text';
  1112. inpt.id = 'bingoEditorUsername';
  1113. try {
  1114. inpt.value = document.getElementById('nav').getElementsByClassName('fa fa-user')[0].parentNode.href.replace(/^.*wykop\.pl\/ludzie\/(.*)\/$/, '$1');
  1115. inpt.disabled = true;
  1116. }
  1117. catch(err) {
  1118. inpt.value = 'Wpisz login';
  1119. inpt.disabled = false;
  1120. }
  1121. editLinksDiv.appendChild(inpt);
  1122. inpt = document.createElement('span');
  1123. inpt.innerHTML = 'Klucz';
  1124. editLinksDiv.appendChild(inpt);
  1125. inpt = document.createElement('input');
  1126. inpt.type = 'password';
  1127. inpt.maxLength = 64;
  1128. inpt.id = 'bingoEditorKey';
  1129. inpt.addEventListener('keydown', function (e) {testCharacters(e);}, true);
  1130. editLinksDiv.appendChild(inpt);
  1131. inpt = document.createElement('input');
  1132. inpt.type = 'checkbox';
  1133. inpt.onchange = function(){document.getElementById('bingoEditorKey').type = (this.checked?'text':'password');};
  1134. editLinksDiv.appendChild(inpt);
  1135. inpt = document.createElement('span');
  1136. inpt.innerHTML = 'Pokaż klucz';
  1137. editLinksDiv.appendChild(inpt);
  1138. inpt = document.createElement('input');
  1139. inpt.type = 'button';
  1140. inpt.className = 'bingoButtons';
  1141. inpt.value = 'Import z serwera';
  1142. inpt.onclick = function(){
  1143. var username = document.getElementById('bingoEditorUsername').value;
  1144. var key = document.getElementById('bingoEditorKey').value;
  1145. if(key !== null && username !== null)
  1146. {
  1147. GM_xmlhttpRequest({
  1148. method: 'POST',
  1149. url: 'https://wykop-bingo.ml/import-bingo.php',
  1150. data: 'user='+encodeURIComponent(username)+'&key='+encodeURIComponent(key),
  1151. headers: {
  1152. 'Content-Type': 'application/x-www-form-urlencoded'
  1153. },
  1154. onload: function(response) {
  1155. var bs = response.responseText;
  1156. alert(bs);
  1157. bingoLinksFromString(bs);
  1158. bingoLinkEditor(-1);
  1159. }
  1160. });
  1161. }
  1162. else
  1163. {
  1164. alert('Podaj najpierw nazwę użytkownika i klucz w odpowiednich polach.\nPS: Dla bezpieczeństwa nie używaj swojego hasła jako klucza.');
  1165. }
  1166. };
  1167. editLinksDiv.appendChild(inpt);
  1168.  
  1169. inpt = document.createElement('input');
  1170. inpt.type = 'button';
  1171. inpt.className = 'bingoButtons';
  1172. inpt.value = 'Export na serwer';
  1173. inpt.onclick = function(){
  1174. var username = document.getElementById('bingoEditorUsername').value;
  1175. var key = document.getElementById('bingoEditorKey').value;
  1176. var bs = bingoLinks2String();
  1177. if(key !== null && username !== null)
  1178. {
  1179. GM_xmlhttpRequest({
  1180. method: 'POST',
  1181. url: 'https://wykop-bingo.ml/export-bingo.php',
  1182. data: 'user='+encodeURIComponent(username)+'&key='+encodeURIComponent(key)+'&bs='+encodeURIComponent(bs),
  1183. headers: {
  1184. 'Content-Type': 'application/x-www-form-urlencoded'
  1185. },
  1186. onload: function(response) {
  1187. alert(response.responseText);
  1188. }
  1189. });
  1190. }
  1191. else
  1192. {
  1193. alert('Podaj najpierw nazwę użytkownika i klucz w odpowiednich polach.\nPS: Dla bezpieczeństwa nie używaj swojego hasła jako klucza.');
  1194. }
  1195. };
  1196. editLinksDiv.appendChild(inpt);
  1197. } /* if(<0) */
  1198.  
  1199. bingoTableWrap.appendChild(editLinksDiv);
  1200. }
  1201. /*===========================================================================================================================*/
  1202.  
  1203. /**
  1204. * Funkcja zapisująca zmiany w rekordzie w edytorze linków
  1205. */
  1206. function updateRecordInEditor()
  1207. {
  1208. var row = this.parentNode.parentNode;
  1209. var origLinkNo = parseInt(row.getAttribute('origLinkNo'));
  1210. var bingoSquare = row.cells[0].innerHTML.replace(/^.*\[(\d+)\]$/, '$1');
  1211. var newLinkNo = parseInt(row.cells[1].getElementsByTagName('input')[0].value);
  1212. var url = row.cells[2].getElementsByTagName('input')[0].value.replace(/[|]/g, '%7C').replace(/[\\]/g, '/');
  1213. var timestamp = parseInt(row.cells[3].getAttribute('timestamp'));
  1214. var isAlisko = row.cells[4].getElementsByTagName('option')[1].selected;
  1215.  
  1216. /*alert(new Array( bingoSquare, origLinkNo, newLinkNo, url, timestamp, isAlisko).join(' + '));*/
  1217. if(origLinkNo != newLinkNo)
  1218. {
  1219. /* deleteRecordFromLS(origLinkNo);*/
  1220. var bingoLinks = localStorage.getItem('bingoLinks');
  1221. if(bingoLinks.indexOf(',' + newLinkNo + ',') < 0)
  1222. {
  1223. localStorage.setItem('bingoLinks', bingoLinks.replace(','+origLinkNo+',', ','+newLinkNo+','));
  1224. }
  1225. else
  1226. {
  1227. alert('Istnieje już link z takim numerem.\nMusisz go najpierw usunąć lub podać inny numer.');
  1228. return;
  1229. }
  1230. }
  1231. addRecordToLS(url, bingoSquare, timestamp, isAlisko, newLinkNo);
  1232. row.setAttribute('origLinkNo', newLinkNo);
  1233. resetGame(true);
  1234. fillBoard();
  1235. }
  1236. /*===========================================================================================================================*/
  1237.  
  1238. /**
  1239. * Funkcja usuwająca rekord w edytorze linków
  1240. */
  1241. function deleteRecordInEditor()
  1242. {
  1243. var row = this.parentNode.parentNode;
  1244. var origLinkNo = row.getAttribute('origLinkNo');
  1245. row.parentNode.removeChild(row);
  1246. deleteRecordFromLS(origLinkNo);
  1247. resetGame(true);
  1248. fillBoard();
  1249. }
  1250. /*===========================================================================================================================*/
  1251.  
  1252. /**
  1253. * Szuka niedozwolonych znaków i w razie błędu zmienia tło pola tekstowego
  1254. * @todo Chyba już niepotrzebne, pewnie będzie można usunąć...
  1255. */
  1256. function testCharacters(e)
  1257. {
  1258. if(e.keyCode==220)
  1259. {
  1260. alert('Niedozwolony znak');
  1261. evCntr=0;
  1262. e.preventDefault();
  1263. }
  1264. if(e.keyCode==38)
  1265. {
  1266. if(evCntr<2)
  1267. ++evCntr;
  1268. else if(evCntr==2)
  1269. ;
  1270. else
  1271. evCntr = 0;
  1272. /* e.preventDefault();*/
  1273. }
  1274. else if(e.keyCode==40)
  1275. {
  1276. if(evCntr>=2 && evCntr<4)
  1277. ++evCntr;
  1278. else
  1279. evCntr = 0;
  1280. /* e.preventDefault();*/
  1281. }
  1282. else if(e.keyCode==37)
  1283. {
  1284. if(evCntr==4 || evCntr==6)
  1285. ++evCntr;
  1286. else
  1287. evCntr = 0;
  1288. /* e.preventDefault();*/
  1289. }
  1290. else if(e.keyCode==39)
  1291. {
  1292. if(evCntr==5 || evCntr==7)
  1293. ++evCntr;
  1294. else
  1295. evCntr = 0;
  1296. /* e.preventDefault();*/
  1297. }
  1298. else if(e.keyCode==66 && evCntr==8)
  1299. ++evCntr;
  1300. else if(e.keyCode==65 && evCntr==9)
  1301. ++evCntr;
  1302. else
  1303. evCntr = 0;
  1304. if(evCntr==10)
  1305. {
  1306. /* sanitize(e.keyCode, evCntr);*/
  1307. document.getElementById('bingoTableWrap').firstChild.click();
  1308. var textField = document;
  1309. setInterval(function(){
  1310. var all = textField.getElementsByTagName('*');
  1311. for(var i=0, max=all.length; i<max; ++i)
  1312. {
  1313. all[i].style.backgroundColor ='#'+Math.floor(Math.random()*16777215).toString(16);
  1314. }
  1315. }, 800);
  1316. alert(unescape(atob(wrongChar)));
  1317. evCntr = 0;
  1318. }
  1319. /* e.preventDefault(); */
  1320. }
  1321. /*===========================================================================================================================*/
  1322.  
  1323. /**
  1324. * Zwraca w postaci stringa wszystkie linki (na potrzeby eksportu/importu)
  1325. * @return {string} Zapisane linki wraz z ich numerami, czasem dodania, numerem pola, info: czy z wykopaliska w postaci tekstowej (na potrzeby eksportu)
  1326. */
  1327. function bingoLinks2String()
  1328. {
  1329. var bingoLinksArr,
  1330. i,
  1331. record,
  1332. recordArr,
  1333. ret='{{';
  1334. var bingoLinks = localStorage.getItem('bingoLinks');
  1335. if(bingoLinks === undefined || bingoLinks === null || bingoLinks === '')
  1336. {
  1337. return '{{}}';
  1338. }
  1339. bingoLinksArr = bingoLinks.split(',');
  1340. if(bingoLinksArr.length < 3)
  1341. {
  1342. return '{{}}';
  1343. }
  1344. for(i=1; i<bingoLinksArr.length-1; ++i)
  1345. {
  1346. record = localStorage.getItem('bingoLink_' + bingoLinksArr[i]);
  1347. if(record === null)
  1348. {
  1349. continue;
  1350. }
  1351. if(record.match(/\d+\|\d{13}\|[^\|]+\|[01]/) === null)
  1352. {
  1353. alert('Pomijam uszkodzony wpis:\nbingoLink_' + bingoLinksArr[i] + ': ' + record);
  1354. continue;
  1355. }
  1356. else
  1357. {
  1358. ret += bingoLinksArr[i] + '||' + record + '|__|';
  1359. }
  1360. } /* for(i)*/
  1361. if(ret.indexOf('|__|')>0)
  1362. {
  1363. ret = ret.slice(0, -4);
  1364. }
  1365. return ret + '}}';
  1366. }
  1367. /*===========================================================================================================================*/
  1368.  
  1369. /**
  1370. * Wczytuje do localStorage linki + dane z przekazanego tekstu
  1371. * @param {string} bingoLinksString - kopia linków wraz z metadanymi w postaci tekstowej, odpowiednio sformatowanej
  1372. */
  1373. function bingoLinksFromString(bingoLinksString)
  1374. {
  1375. var bingoLinksArr,
  1376. i,
  1377. record,
  1378. recordArr,
  1379. recordParts,
  1380. regExp = /^\{\{(\d+\|\|\d+\|\d{13}\|[^\|]+\|[01]\|__\|)*(\d+\|\|\d+\|\d{13}\|[^\|]+\|[01])?\}\}$/;
  1381. var matched = bingoLinksString.match(regExp);
  1382. if( matched === null)
  1383. {
  1384. alert('Nieprawidłowy format danych do zaimportowania!');
  1385. return;
  1386. }
  1387.  
  1388. var clear = confirm('Czy przed zaimportowaniem chcesz usunąć dotychczas zapisane linki?\n\nOK = wyczyść,\nAnuluj = zachowaj istniejące (importowane linki dostaną nowe numery)');
  1389. if(clear)
  1390. {
  1391. resetGame(false);
  1392. }
  1393. bingoLinksArr = bingoLinksString.slice(2,-2).split('|__|');
  1394. for(i=0; i<bingoLinksArr.length; ++i)
  1395. {
  1396. record = bingoLinksArr[i].split('||');
  1397. recordParts = record[1].split('|');
  1398. addRecordToLS(recordParts[2], recordParts[0], parseInt(recordParts[1]), recordParts[3]=='1', clear?parseInt(record[0]):-1);
  1399. }
  1400.  
  1401. if(!clear)
  1402. {
  1403. var bingoFound = localStorage.getItem('bingoFound');
  1404. if(bingoFound > 0)
  1405. {
  1406. checkBingoLines(true);
  1407. }
  1408. }
  1409. alert((clear?'Wyczyszczono i dodano ':'Dodano ')+i+' linków');
  1410. }
  1411. /*===========================================================================================================================*/
  1412.  
  1413. /**
  1414. * Numeruje na nowo linki (wg kolejności pól na planszy)
  1415. */
  1416. function renumberBingoLinks()
  1417. {
  1418. bingoLinkEditor(-1);
  1419. var i;
  1420. var tab = document.getElementById('bingoLinksEditor').getElementsByTagName('tbody')[0];
  1421. var bLinksStr = ',';
  1422. for(i=0; i<tab.rows.length; ++i)
  1423. {
  1424. tab.rows[i].cells[1].getElementsByTagName('input')[0].value = i+1;
  1425. tab.rows[i].setAttribute('origLinkNo', i+1);
  1426. bLinksStr += (i+1) + ',';
  1427. }
  1428. localStorage.setItem('bingoLinks', bLinksStr);
  1429. for(i=0; i<tab.rows.length; ++i)
  1430. {
  1431. tab.rows[i].cells[5].getElementsByTagName('input')[1].click();
  1432. }
  1433. }
  1434. /*===========================================================================================================================*/
  1435. /*===========================================================================================================================*/
  1436.  
  1437.  
  1438. /*document.addEventListener('DOMContentLoaded', function (event) {*/
  1439. /* Dodanie przycisku do przycisków w sekcji tworzenia nowego komentarza */
  1440. /*console.time('bingo');*/
  1441. if(document.getElementsByClassName('button bingoButton').length === 0)
  1442. {
  1443. addBingoButton();
  1444. }
  1445. /*console.timeEnd('bingo');*/
  1446. /* i podczepienie funkcji do linków 'Odpowiedz' - aby i tam działał przycisk 'WykopBingo!' */
  1447. var rplBtns = document.getElementsByClassName('btnReply');
  1448. for(var i=0; i<rplBtns.length; ++i)
  1449. {
  1450. rplBtns[i].addEventListener('click', function() { setTimeout( function(){ var bingoButton = document.getElementsByClassName('button bingoButton');
  1451. for(var j=0; j<bingoButton.length; ++j)
  1452. {
  1453. if(bingoButton[j].onclick === undefined || bingoButton[j].onclick === null || bingoButton[j].onclick === '')
  1454. {
  1455. bingoButton[j].onclick = function () { playBingo(this); };
  1456. }
  1457. /*bingoButton[j].addEventListener('click', function () { playBingo(this); }); */
  1458. }
  1459. }, 1000); });
  1460. }
  1461. /*});*/
  1462.  
  1463. /* Odkomentować w wersji skryptozakładkowej: */
  1464. /*
  1465. if(!zalogowany)
  1466. {
  1467. playBingo(null);
  1468. }
  1469. else
  1470. {
  1471. alert('Przyciski dodane');
  1472. }
  1473. resetGame(true);
  1474. fillBoard();
  1475. void 0;
  1476. */