Advertisement
Guest User

TW

a guest
Nov 30th, 2016
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /*jslint vars: true, plusplus: true, devel: true, nomen: true, indent: 4, maxerr: 50, white: true, bitwise: true */
  2. /*global $, window, document*/
  3.  
  4. var levelSize =
  5. {
  6.     "beginner" : { linhas: 5, colunas: 7},
  7.     "intermediate" : { linhas: 9, colunas: 11},
  8.     "advanced" : { linhas: 13, colunas: 17},
  9.     "expert" : {linhas: 19, colunas: 23}
  10. };
  11.  
  12. var data =
  13. {
  14.     board : {/*level, line, column*/},
  15.     points : {/*user, other*/},
  16.     time : {/*user, other, userNow*/},
  17.     login : {/*logged, username, password*/},
  18.     game : {/*running, canPlay, clock, time, singlePlayer, possibilities*/},
  19.     server : {/*key, gameID, opponent*/ }
  20. };
  21.  
  22. // MultiArray
  23. var board;  // Table
  24. var scores; // HighScores
  25.  
  26. var menuUserHidden = true;
  27. var highScoresHidden = true;
  28.  
  29.  
  30. function getCell(l, c, where) // where == board or boardHS
  31. {
  32.     'use strict';
  33.    
  34.     var boardElement = document.getElementById(where);
  35.     return boardElement.rows[l].cells[c];
  36. }
  37.  
  38. function createBoardHS()
  39. {
  40.     'use strict';
  41.    
  42.     var i, j;
  43.     scores = [];
  44.     for(i = 0; i < 40; i++)
  45.     {
  46.         scores[i] = new Array(3);
  47.     }
  48.  
  49.     for(i = 0; i < (scores.length / 4); i++)
  50.     {
  51.         var r = document.getElementById('boardHS').insertRow();
  52.  
  53.         for(j = 0; j < scores[i].length; j++)
  54.         {
  55.             var c = r.insertCell();
  56.            
  57.             var cellHS = getCell(i, j, 'boardHS');
  58.            
  59.             if(j===0)
  60.             {
  61.                 cellHS.className = 'namesHS';
  62.             }
  63.             else if(j===1)
  64.             {
  65.                 cellHS.className = 'boxesHS';
  66.             }
  67.             else if(j===2)
  68.             {
  69.                 cellHS.className = 'timeHS';
  70.             }
  71.         }
  72.     }
  73.    
  74.     // all scores start with zero
  75.     for(i = 0; i < scores.length; i++)
  76.     {
  77.         for(j = 0; j < scores[i].length; j++)
  78.         {
  79.             scores[i][j] = 0;
  80.         }
  81.     }
  82. }
  83.  
  84. function highScores(winner) // date HighScores
  85. {
  86.     'use strict';
  87.    
  88.     var i, j, a, b;
  89.     var timeTemp;
  90.     var pointsTemp;
  91.    
  92.     if(winner === "PC")    
  93.     {
  94.         timeTemp = data.time.other;
  95.         pointsTemp = data.points.other;
  96.     }
  97.     else
  98.     {
  99.         timeTemp = data.time.user;
  100.         pointsTemp = data.points.user;
  101.     }
  102.    
  103.     if(data.board.level === "beginner")
  104.     {
  105.         a = 0;
  106.         b = 10;
  107.     }
  108.     else if(data.board.level === "intermediate")
  109.     {
  110.         a = 10;
  111.         b = 20;
  112.     }
  113.     else if(data.board.level === "advanced")
  114.     {
  115.         a = 20;
  116.         b = 30;
  117.     }
  118.     else
  119.     {
  120.         a = 30;
  121.         b = 40;
  122.     }
  123.  
  124.     for(i = a; i < b; i++)
  125.     {
  126.         if(pointsTemp > scores[i][1]) // score > highScore (squares)
  127.         {
  128.             for(j = b - 1; j > i; j--) // Swap
  129.             {  
  130.                 scores[j][0] = scores[j-1][0];
  131.                 scores[j][1] = scores[j-1][1];
  132.                 scores[j][2] = scores[j-1][2];
  133.             }
  134.             scores[i][0] = winner;
  135.             scores[i][1] = pointsTemp;
  136.             scores[i][2] = timeTemp;
  137.  
  138.             break;
  139.         }
  140.         else if(pointsTemp === scores[i][1] && timeTemp < scores[i][2]) // score > highScore (time)
  141.         {
  142.             for(j = b - 1; j > i; j--) // Swap
  143.             {  
  144.                 scores[j][0] = scores[j-1][0];
  145.                 scores[j][1] = scores[j-1][1];
  146.                 scores[j][2] = scores[j-1][2];
  147.             }
  148.             scores[i][0] = winner;
  149.             scores[i][1] = pointsTemp;
  150.             scores[i][2] = timeTemp;
  151.  
  152.             break;
  153.         }
  154.     }
  155. }
  156.  
  157. /* RESET VARS AND BOARD */
  158. function clearBoard()
  159. {
  160.     'use strict';
  161.    
  162.     var i;
  163.     data.game.running = false;
  164.    
  165.     for(i = 0; i < data.board.line; i++)
  166.     {
  167.         document.getElementById("board").deleteRow(0);
  168.     }  
  169.     clearInterval(data.game.clock);
  170. }
  171.  
  172. function clearData() // Reset variables (new game)
  173. {
  174.     'use strict';
  175.    
  176.     clearInterval(data.game.clock);
  177.    
  178.     document.getElementById('minutes').innerHTML = "000";
  179.     document.getElementById('minutes').style.color = 'deepskyblue';
  180.     document.getElementById('seconds').innerHTML = "000";
  181.     document.getElementById('seconds').style.color = 'deepskyblue';
  182.    
  183.     data.game.time = 0;
  184.     data.time.user = 0;
  185.     data.time.other = 0;
  186.     data.points.user = 0;
  187.     data.points.other = 0;
  188.     data.time.userNow = true;
  189.    
  190.     if(data.game.running)
  191.     {
  192.         clearBoard();
  193.     }
  194. }
  195.  
  196. function messageBox(color, message) // Final message
  197. {
  198.     'use strict';
  199.  
  200.     document.getElementById('message').innerHTML = message;  
  201.     document.getElementById('boxMessage').style.backgroundColor = color;
  202. }
  203.  
  204. /* CHOOSE THE FINAL MESSAGE */
  205. function finalState()
  206. {
  207.     'use strict';
  208.      document.getElementById('loading').style.display = 'none';
  209.     console.log("finalState!!");
  210.     if(data.server.updsrc !== null)
  211.     {
  212.         data.server.updsrc.close();
  213.         data.server.updsrc = null;
  214.         leave();
  215.     }
  216.    
  217.  
  218.     var winner;
  219.    
  220.     if(data.points.user > data.points.other)
  221.     {
  222.         messageBox('lightgreen', "YOU WIN");
  223.         winner = data.login.username;
  224.     }
  225.     else if(data.points.user < data.points.other)
  226.     {
  227.         messageBox('coral', "YOU LOSE");
  228.         winner = "PC";
  229.     }  
  230.     else
  231.     {        
  232.         if(data.time.other > data.time.user)
  233.         {
  234.             messageBox('lightgreen', "YOU WIN");
  235.             winner = "user";
  236.         }
  237.         else
  238.         {
  239.             messageBox('coral', "YOU LOSE");
  240.             winner = "PC";
  241.         }
  242.     }
  243.        
  244.     document.getElementById('seconds').style.color = 'lightgreen';
  245.     document.getElementById('minutes').style.color = 'coral';
  246.    
  247.     document.getElementById('loading').style.display = 'none';
  248.     document.getElementById('boxMessage').style.display = 'table';
  249.  
  250.     clearInterval(data.game.clock);
  251.    
  252.     /*if(data.login.logged)
  253.     {
  254.         highScores(winner);
  255.     }*/
  256. }
  257.  
  258. /* WHO DO SQUARE */
  259. function square(who,l,c)
  260. {
  261.     'use strict';
  262.    
  263.     var cell = getCell(l, c, 'board');
  264.    
  265.     if(who === -1)    
  266.     {
  267.         cell.className = "square_1";
  268.         data.points.user++;
  269.     }
  270.     else
  271.     {
  272.         cell.className = "square_2";
  273.         data.points.other++;
  274.     }
  275. }
  276.  
  277.  
  278. //if(who == 1) client
  279. //if(who == 2) PC/other
  280. //play on board[l][c]
  281. function someonePlay(who,l,c)
  282. {
  283.     'use strict';
  284.    
  285.     var vertical;
  286.     var change = false;
  287.    
  288.     if(l%2 === 0)
  289.     {
  290.         vertical = true;      
  291.     }
  292.     else
  293.     {
  294.         vertical = false;
  295.     }
  296.    
  297.     if(vertical)
  298.     {
  299.         if(l > 0) // Possivel quadrado de cima
  300.         {
  301.             if(board[l-2][c] !== 0 && board[l-1][c-1] !== 0 && board[l-1][c+1] !== 0)
  302.             {
  303.                 change = true;
  304.                 square(who,l-1,c);
  305.             }
  306.         }
  307.         if(l < data.board.line-1) // Possivel quadrado de baixo
  308.         {
  309.             if(board[l+2][c] !== 0 && board[l+1][c-1] !== 0 && board[l+1][c+1] !== 0)
  310.             {
  311.                 change = true;
  312.                 square(who,l+1,c);
  313.             }
  314.         }
  315.     }
  316.     else
  317.     {
  318.         if(c > 0) // Possivel quadrado da esquerda
  319.         {
  320.             if(board[l][c-2] !== 0 && board[l-1][c-1] !== 0 && board[l+1][c-1] !== 0)
  321.             {
  322.                 change = true;
  323.                 square(who,l,c-1);
  324.             }
  325.         }
  326.         if(c < data.board.column-1) // Possivel quadrado da direita
  327.         {
  328.             if(board[l][c+2] !== 0 && board[l-1][c+1] !== 0 && board[l+1][c+1] !== 0)
  329.             {
  330.                 change = true;
  331.                 square(who,l,c+1);
  332.             }
  333.         }
  334.     }
  335.  
  336.     if(change)
  337.     {
  338.         /* Update data */
  339.         document.getElementById('userPoints').innerHTML = data.points.user;
  340.         document.getElementById('pcPoints').innerHTML = data.points.other;
  341.        
  342.         /* End game? */
  343.         if(data.points.user + data.points.other === ((data.board.line-1)/2) * ((data.board.column-1)/2))
  344.         {
  345.             finalState();
  346.         }
  347.        
  348.         /* To know if change something */
  349.         return true;
  350.     }
  351.     /* Or not have changes */
  352.     return false;
  353. }
  354.  
  355. function playPC() // Single Player
  356. {
  357.     'use strict';
  358.    
  359.     var i, j;
  360.     var number_random = Math.random() * (data.game.possibilities - 1) + 1;
  361.     number_random = Math.round(number_random);
  362.    
  363.     var count = 0;
  364.     for(i = 0; i < data.board.line; i++)
  365.     {  
  366.         for(j = 0; j < data.board.column; j++)
  367.         {        
  368.             if((i%2 !== 0 && j%2 === 0) || (i%2 === 0 && j%2 !== 0))
  369.             {
  370.                
  371.                 if(board[i][j] !== -1 && board[i][j] !== -2)
  372.                 {
  373.                     count ++;
  374.                     if(count === number_random)
  375.                     {
  376.                         board[i][j] = -2;
  377.  
  378.                         var change = someonePlay(-2,i,j);
  379.                         getCell(i, j, 'board').className = "active_2";
  380.                         data.game.possibilities--;
  381.                         if(change)
  382.                         {
  383.                             var temp = Math.random() * (3000 - 1000) + 1000;
  384.                             setTimeout(playPC, temp);
  385.                            // data.time.other += temp;
  386.                         }
  387.                         else
  388.                         {
  389.                             document.getElementById('loading').style.display = 'none';
  390.                             data.game.canPlay = true;
  391.                             data.time.userNow = true;
  392.                         }
  393.                         return;
  394.                     }
  395.                 }
  396.             }
  397.         }
  398.     }
  399. }
  400.  
  401. function play(cell, l, c)
  402. {
  403.     'use strict';
  404.  
  405.     cell.onclick=function()
  406.     {
  407.         if(board[l][c] !== 0 || !data.game.canPlay)
  408.         {
  409.             return;
  410.         }
  411.        
  412.         data.game.possibilities--;
  413.         cell.className = "active_1";
  414.         board[l][c] = -1;
  415.        
  416.         var change = someonePlay(-1,l,c);
  417.        
  418.         if(!data.game.singlePlayer)
  419.         {
  420.             data.game.canPlay = false;
  421.            
  422.             notify(l,c);
  423.             data.time.userNow = false;
  424.         }
  425.        
  426.         else if(data.game.singlePlayer && !change) // SinglePlayer
  427.         {  
  428.             //alert(1);
  429.             data.time.userNow = false;
  430.             document.getElementById('loading').style.display = 'block';
  431.             data.game.canPlay = false;
  432.            
  433.             var temp = Math.random() * (3000 - 1000) + 1000;
  434.             //alert(1);
  435.             setTimeout(playPC, temp);
  436.             //alert(2);
  437.             //data.time.other += temp;
  438.         }  
  439.     };      
  440. }
  441.  
  442. function color(l,c,flag)
  443. {
  444.     'use strict';
  445.    
  446.     var cell = getCell(l, c, 'board');
  447.    
  448.     if(flag === 1)
  449.     {
  450.         cell.className = "dots";
  451.     }
  452.     else if(flag === 0)
  453.     {
  454.         cell.className = "squares";
  455.     }
  456.     else
  457.     {
  458.         cell.className = "lines";
  459.         play(cell, l, c);
  460.         data.game.possibilities++;
  461.     }
  462. }
  463.  
  464. function timer()
  465. {
  466.     'use strict';
  467.    
  468.     if(data.time.userNow)
  469.     {
  470.         data.time.user++;
  471.     }
  472.     else
  473.     {
  474.         data.time.other++;
  475.     }
  476.  
  477.     data.game.time++;
  478.    
  479.     if(data.time.user < 10)
  480.     {
  481.         document.getElementById('seconds').innerHTML = "00" + data.time.user;
  482.     }
  483.     else if(data.time.user < 100)
  484.     {
  485.         document.getElementById('seconds').innerHTML = "0" + data.time.user;
  486.     }
  487.     else
  488.     {
  489.         document.getElementById('seconds').innerHTML = data.time.user;
  490.     }
  491.    
  492.     if(data.time.other < 10)
  493.     {
  494.         document.getElementById('minutes').innerHTML = "00" + data.time.other;
  495.     }
  496.     else if(data.time.other < 100)
  497.     {
  498.         document.getElementById('minutes').innerHTML = "0" + data.time.other;
  499.     }
  500.     else
  501.     {
  502.         document.getElementById('minutes').innerHTML = data.time.other;
  503.     }
  504. }
  505.  
  506. function draw() //make dots, lines and squares
  507. {
  508.     'use strict';
  509.    
  510.     var i, j;
  511.     data.game.possibilities = 0;
  512.    
  513.     for(i = 0; i < data.board.line; i++)
  514.     {  
  515.         for(j = 0; j < data.board.column; j++)
  516.         {        
  517.             if(i%2 === 0 && j%2 === 0)
  518.             {
  519.                 color(i,j,1);
  520.             }
  521.             else if(i%2 !== 0 && j%2 !== 0)
  522.             {
  523.                 color(i,j,0);
  524.             }
  525.             else
  526.             {
  527.                 color(i,j,2);
  528.             }
  529.         }
  530.     }
  531. }
  532.  
  533. function createBoard() // Game Board
  534. {
  535.     'use strict';
  536.    
  537.     clearData();
  538.     document.getElementById('userPoints').innerHTML = "0";
  539.     document.getElementById('pcPoints').innerHTML = "0";
  540.     document.getElementById('message').innerHTML = "";  
  541.    
  542.     var i;
  543.     data.game.canPlay = true;
  544.     data.game.running = true;
  545.    
  546.     data.board.line = levelSize[data.board.level].linhas;
  547.     data.board.column = levelSize[data.board.level].colunas;  
  548.    
  549.     document.getElementById('selectArea').style.display = 'none';
  550.     document.getElementById('header').style.display = 'none';
  551.     document.getElementById('gameArea').style.display = 'block';
  552.     document.getElementById('topBar').style.display = 'none';
  553.     document.getElementById('divSpace').style.display = 'none';
  554.     document.getElementById('menuUser').style.display = 'none';
  555.  
  556.     board = [];
  557.     board.length = data.board.line;
  558.        
  559.     for(i = 0; i < data.board.line; i++)
  560.     {
  561.         var r = document.getElementById('board').insertRow();
  562.         var j;
  563.        
  564.         board[i] = [];
  565.         board[i].length = data.board.column;
  566.        
  567.         for(j = 0; j < data.board.column; j++)
  568.         {
  569.             var c = r.insertCell();
  570.             board[i][j] = 0;
  571.         }
  572.     }
  573.     draw();
  574.     var divWidth = document.getElementById('board').offsetWidth;
  575.     document.getElementById('gameInfo').style.width= divWidth + "px";
  576.     document.getElementById('message').style.width= divWidth + "px";
  577.  
  578.    
  579.     data.game.clock = setInterval(timer, 1000);
  580. }
  581.  
  582. function checkLogin()
  583. {
  584.     'use strict';
  585.    
  586.     var nameRegex = /^[a-zA-Z0-9\_]+$/;
  587.     data.login.username = document.getElementById('username').value;
  588.     data.login.password = document.getElementById('password').value;
  589.     var match = document.getElementById('username').value.match(nameRegex);
  590.    
  591.     if(data.login.username.length === 0)
  592.     {
  593.         alert("Your username is empty!");
  594.         return false;      
  595.     }
  596.    
  597.     if(match === null)
  598.     {
  599.         alert("Your username is not valid. Only characters A-Z, a-z and '_' are  acceptable.");
  600.         return false;
  601.     }
  602.    
  603.     if(data.login.username.length > 15)
  604.     {
  605.         alert("You have more than 15 characters on username!");
  606.         return false;
  607.     }
  608.    
  609.     if(data.login.password.length === 0)
  610.     {
  611.         alert("Your password is empty!");
  612.         return false;
  613.     }
  614.    
  615.     if(data.login.password.length < 5)
  616.     {
  617.         alert("Your password is too small!");
  618.         return false;
  619.     }
  620.    
  621.     document.getElementById('userName').innerHTML = data.login.username;
  622.     return true;
  623. }
  624.  
  625. function chooseButtons() // Myaccount bar (back || logOut)
  626. {
  627.     'use strict';
  628.    
  629.     if(data.login.logged)
  630.     {
  631.         document.getElementById('myAccountButton').style.display = "table";
  632.         document.getElementById('goBackButton').style.display = "none";
  633.     }
  634.     else
  635.     {
  636.         document.getElementById('goBackButton').style.display = "table";
  637.         document.getElementById('myAccountButton').style.display = "none";
  638.     }
  639. }
  640.  
  641. function selectMode(button) // Levels
  642. {
  643.     'use strict';
  644.    
  645.     button.onclick = function()
  646.     {
  647.         data.board.level = button.id;
  648.         if(data.login.logged)
  649.         {
  650.             document.getElementById('selectLevel').style.display = 'none';
  651.             document.getElementById('selectMode').style.display = 'block';
  652.  
  653.             document.getElementById('singleplayer').onclick = function()
  654.             {
  655.                 data.game.singlePlayer = true;
  656.                 createBoard(data.board.level);  
  657.             };
  658.            
  659.             document.getElementById('multiplayer').onclick = function()
  660.             {
  661.                 data.game.singlePlayer = false;
  662.                 //document.getElementById('loading').style.display = 'block';  
  663.                 join();
  664.                 //update();
  665.             };
  666.         }
  667.         else
  668.         {
  669.              createBoard(data.board.level);
  670.         }
  671.     };
  672. }
  673.  
  674. Number.prototype.round = function(places) // Arredonda direito as casas decimais
  675. {
  676.     'use strict';
  677.    
  678.     return +(Math.round(this + "e+" + places)  + "e-" + places);
  679. };
  680.  
  681. function writeBoardHS(a, b) // highscores
  682. {
  683.     'use strict';
  684.    
  685.     var i, j;
  686.     for(i = a; i < b; i++)
  687.     {
  688.         for(j= 0; j < scores[i].length; j++)
  689.         {          
  690.             if(scores[i][j] === 0)
  691.             {
  692.                 if(j === 1)
  693.                 {
  694.                     document.getElementById('boardHS').rows[i-a].cells[j].innerHTML = '--';
  695.  
  696.                 }
  697.                 else
  698.                 {
  699.                     document.getElementById('boardHS').rows[i-a].cells[j].innerHTML = '---';
  700.                 }
  701.             }
  702.             else
  703.             {
  704.                 if(j === 0)
  705.                 {
  706.                     document.getElementById('boardHS').rows[i-a].cells[j].innerHTML = (i-a+1) + '. ' + scores[i][j];
  707.                 }
  708.                 else if(j === 1)
  709.                 {
  710.                     if(scores[i][j] < 10)
  711.                     {
  712.                         document.getElementById('boardHS').rows[i-a].cells[j].innerHTML = "0" + scores[i][j];
  713.                     }
  714.                     else
  715.                     {
  716.                         document.getElementById('boardHS').rows[i-a].cells[j].innerHTML = scores[i][j];
  717.                     }
  718.                 }
  719.                 else
  720.                 {
  721.                     if(scores[i][j] < 10)
  722.                     {
  723.                         document.getElementById('boardHS').rows[i-a].cells[j].innerHTML = "00" + scores[i][j];
  724.                     }
  725.                     else if(scores[i][j] < 100)
  726.  
  727.                     {
  728.                         document.getElementById('boardHS').rows[i-a].cells[j].innerHTML = "0" + scores[i][j];//.round(2);
  729.                     }
  730.                     else
  731.                     {
  732.                         document.getElementById('boardHS').rows[i-a].cells[j].innerHTML = scores[i][j];
  733.                     }
  734.                 }
  735.             }  
  736.         }
  737.     }
  738. }
  739.  
  740. function boardHighScores(button)
  741. {
  742.     'use strict';
  743.    
  744.     if(button === "beginner")
  745.     {
  746.         writeBoardHS(0, 10);
  747.     }
  748.     else if(button === "intermediate")
  749.     {
  750.         writeBoardHS(10, 20);
  751.     }
  752.     else if(button === "advanced")
  753.     {
  754.         writeBoardHS(20, 30);
  755.     }
  756.     else if(button === "expert")
  757.     {
  758.         writeBoardHS(30, 40);
  759.     }
  760. }
  761.  
  762. function showHighScores(button) // HighScore window
  763. {
  764.     'use strict';
  765.    
  766.      button.onclick = function()
  767.      {
  768.         document.getElementById('titleHS').innerHTML = '&xlArr;' + " " + button.value;
  769.         document.getElementById('buttonsHS').style.display = 'none';
  770.         document.getElementById('infoHS').style.display = 'table';
  771.         boardHighScores(button.value);
  772.      };
  773. }
  774.  
  775. function createSelectArea() // Levels page
  776. {
  777.     'use strict';
  778.    
  779.     chooseButtons();
  780.    
  781.     document.getElementById('myAccountText').innerHTML = "MyAccount " + '&dtrif;';  
  782.     document.getElementById('header').style.display = 'block';
  783.     document.getElementById('selectArea').style.display = 'block';
  784.     document.getElementById('topBar').style.display = 'block';
  785.     document.getElementById('selectLevel').style.display='block';    
  786.  
  787.     document.getElementById('waitingForOpponent').style.display='none';
  788.     document.getElementById('highScores').style.display='none';
  789.     document.getElementById('selectMode').style.display='none';    
  790.     document.getElementById('loginArea').style.display = 'none';
  791.     document.getElementById('gameArea').style.display = 'none';
  792.     document.getElementById('divSpace').style.display = 'none';
  793.     document.getElementById('menuUser').style.display = 'none';
  794.     document.getElementById('boxMessage').style.display = 'none';
  795.     menuUserHidden = true;
  796. }
  797.  
  798. function createLoginArea() // Initial page
  799. {
  800.     'use strict';
  801.    
  802.     menuUserHidden = true;
  803.     document.getElementById('loginArea').style.display = 'block';
  804.     document.getElementById('header').style.display = 'block';
  805.  
  806.     document.getElementById('selectArea').style.display = 'none';    
  807.     document.getElementById('gameArea').style.display = 'none';
  808.     document.getElementById('topBar').style.display = 'none';  
  809.     document.getElementById('divSpace').style.display = 'none';
  810.     document.getElementById('menuUser').style.display = 'none';
  811. }
  812.  
  813. // ========================================================================
  814. //                          Server connection
  815. // ========================================================================
  816.  
  817.  
  818. function calculatePositionForServer(l, c)
  819. {
  820.     'use strict';
  821.  
  822.     var struct = {};
  823.     if(l%2 === 0 && c%2 !== 0)
  824.     {
  825.         struct.o = "h";
  826.         struct.l = 1 + (l / 2);
  827.         struct.c = (c + 1) / 2;
  828.     }
  829.     else if(l%2 !== 0 && c%2 === 0)
  830.     {
  831.         struct.o = "v";
  832.         struct.l = (l + 1) / 2;
  833.         struct.c = 1 + (c / 2);
  834.     }
  835.    
  836.     return struct;    
  837. }
  838.  
  839. function calculatePositionForHere(o, l, c)
  840. {
  841.         'use strict';
  842.  
  843.     var struct = {};
  844.     if(o === "h")
  845.     {
  846.         struct.l = 2 * (l - 1);
  847.         struct.c = (2 * c) - 1;
  848.     }
  849.     else
  850.     {
  851.         struct.l = (2 * l) - 1;
  852.         struct.c = 2 * (c - 1);
  853.     }
  854.     return struct;    
  855. }
  856.  
  857. function register()
  858. {
  859.     'use strict';
  860.    
  861.     var requestObject;
  862.     var requestJSON;
  863.     var responseJSON;
  864.     var responseObject;
  865.     var request;
  866.    
  867.     requestObject = {};
  868.    
  869.     requestObject.name = document.getElementById('username').value;
  870.     requestObject.pass = document.getElementById('password').value;
  871.     requestJSON = JSON.stringify(requestObject);
  872.    
  873.     request = new XMLHttpRequest();
  874.    
  875.     request.open("POST", "http://twserver.alunos.dcc.fc.up.pt:8000/register", true);
  876.     request.setRequestHeader("Content-type", "application/json");
  877.    
  878.     request.onload = function()
  879.     {
  880.         responseJSON = request.responseText;
  881.         responseObject = JSON.parse(responseJSON);
  882.        
  883.         if(request.readyState !== 4)
  884.         {
  885.             alert(1);
  886.             return;
  887.         }
  888.         if(request.status !== 200)
  889.         {
  890.             alert(2);
  891.             return;
  892.         }
  893.  
  894.         if(responseObject.error === undefined)
  895.         {
  896.             data.login.logged = true;
  897.             data.game.singlePlayer=false;
  898.             createSelectArea();
  899.         }
  900.         else
  901.         {
  902.              alert(responseObject.error);
  903.         }    
  904.     };
  905.     request.send(requestJSON);
  906. }
  907.  
  908. function leave()
  909. {
  910.     'use strict';
  911.    
  912.     var requestObject;
  913.     var responseObject;
  914.     var requestJSON;
  915.     var responseJSON;
  916.     var request;
  917.    
  918.     requestObject = {};
  919.    
  920.     requestObject.name = data.login.username;
  921.     requestObject.key = data.server.key;
  922.     requestObject.game = data.server.gameID;
  923.     requestJSON = JSON.stringify(requestObject);
  924.    
  925.     request = new XMLHttpRequest();
  926.    
  927.     request.open("POST", "http://twserver.alunos.dcc.fc.up.pt:8000/leave", true);
  928.     request.setRequestHeader("Content-type", "application/json");
  929.    
  930.     request.onload = function()
  931.     {
  932.         responseJSON = request.responseText;
  933.    
  934.         responseObject = JSON.parse(responseJSON);
  935.        
  936.         /*if(request.readyState !== 4)
  937.         {
  938.             return;
  939.         }
  940.         if(request.status !== 200)
  941.         {
  942.             return;
  943.         }*/
  944.     };
  945.     request.send(requestJSON);
  946. }
  947.  
  948. function notify(l, c)
  949. {
  950.     'use strict';
  951.    
  952.     var requestObject;
  953.     var responseObject;
  954.     var requestJSON;
  955.     var responseJSON;
  956.     var request;
  957.    
  958.     requestObject = {};
  959.  
  960.     var struct = calculatePositionForServer(l, c);
  961.  
  962.     requestObject.name = data.login.username;
  963.     requestObject.key = data.server.key;
  964.     requestObject.game = data.server.gameID;  
  965.     requestObject.orient = struct.o;
  966.     requestObject.row = struct.l;
  967.     requestObject.col = struct.c;
  968.    
  969.     requestJSON = JSON.stringify(requestObject);
  970.    
  971.     request = new XMLHttpRequest();
  972.    
  973.     request.open("POST", "http://twserver.alunos.dcc.fc.up.pt:8000/notify", true);
  974.     request.setRequestHeader("Content-type", "application/json");
  975.    
  976.     request.onload = function()
  977.     {
  978.         responseJSON = request.responseText;
  979.    
  980.         responseObject = JSON.parse(responseJSON);
  981.        
  982.         if(responseObject.error !== undefined)
  983.         {
  984.             alert(responseObject.error);
  985.         }
  986.        
  987.        /* if(request.readyState !== 4)
  988.         {
  989.             return;
  990.         }
  991.         if(request.status !== 200)
  992.         {
  993.             return;
  994.         }*/
  995.        
  996.     };
  997.     request.send(requestJSON);
  998.    
  999. }
  1000.  
  1001. function update(gameid, keyy)
  1002. {
  1003.     'use strict';
  1004.  
  1005.     data.server.updsrc = new EventSource('http://twserver.alunos.dcc.fc.up.pt:8000/update?name=' + data.login.username + '&game=' + gameid + '&key=' + keyy);
  1006.    
  1007.     data.server.updsrc.onmessage = function (ev)
  1008.     {
  1009.         console.log(ev.data);
  1010.         var evjava = JSON.parse(ev.data);
  1011.            
  1012.         if(evjava.opponent !== undefined)
  1013.         {
  1014.             data.server.opponent = evjava.opponent;
  1015.             data.login.logged = true;
  1016.             data.game.singlePlayer = false;
  1017.             createBoard();
  1018.                             document.getElementById('waitingForOpponent').style.display = 'none';
  1019.  
  1020.             if(evjava.turn === data.login.username)
  1021.             {
  1022.                 data.game.canPlay = true;
  1023.                 data.time.userNow = true;
  1024.                 document.getElementById('loading').style.display = 'none';
  1025.  
  1026.             }
  1027.             else
  1028.             {
  1029.                 document.getElementById('loading').style.display = 'block';
  1030.             }
  1031.         }
  1032.         else if(evjava.move !== undefined)
  1033.         {
  1034.            
  1035.             if(evjava.move.name === data.server.opponent)
  1036.             {
  1037.                 var struct = calculatePositionForHere(evjava.move.orient, evjava.move.row, evjava.move.col);
  1038.                
  1039.                 someonePlay(2, struct.l, struct.c);
  1040.                 board[struct.l][struct.c] = -2;
  1041.                 data.time.other = Math.round(evjava.move.time);
  1042.                
  1043.                 getCell(struct.l, struct.c, 'board').className = "active_2";
  1044.             }
  1045.             else
  1046.             {
  1047.                 data.time.user = Math.round(evjava.move.time);
  1048.             }
  1049.            
  1050.             if(evjava.turn === data.login.username)
  1051.             {
  1052.                 data.game.canPlay = true;
  1053.                 data.time.userNow = true;
  1054.                 document.getElementById('loading').style.display = 'none';
  1055.             }
  1056.             else if(evjava.winner !== undefined)
  1057.             {
  1058.                 if(evjava.move.name === data.login.username)
  1059.                 {
  1060.                     data.time.user = Math.round(evjava.move.time);
  1061.                 }
  1062.                 else
  1063.                 {
  1064.                     data.time.other = Math.round(evjava.move.time);
  1065.                 }
  1066.                
  1067.                 document.getElementById('loading').style.display = 'none';
  1068.             }
  1069.             else
  1070.             {
  1071.                 document.getElementById('loading').style.display = 'block';
  1072.             }
  1073.         }
  1074.         else
  1075.         {
  1076.             alert(evjava.error);
  1077.         }
  1078.     };
  1079. }
  1080.  
  1081. function join()
  1082. {
  1083.     'use strict';
  1084.    
  1085.     var requestObject;
  1086.     var responseObject;
  1087.     var requestJSON;
  1088.     var responseJSON;
  1089.     var request;
  1090.    
  1091.     requestObject = {};
  1092.    
  1093.     requestObject.name = document.getElementById('username').value;
  1094.     requestObject.pass = document.getElementById('password').value;
  1095.     requestObject.level = data.board.level;
  1096.     requestObject.group = 36;
  1097.     requestJSON = JSON.stringify(requestObject);
  1098.    
  1099.     request = new XMLHttpRequest();
  1100.    
  1101.     request.open("POST", "http://twserver.alunos.dcc.fc.up.pt:8000/join", true);
  1102.     request.setRequestHeader("Content-type", "application/json");
  1103.      
  1104.     request.onload = function()
  1105.     {
  1106.         responseJSON = request.responseText;
  1107.    
  1108.         responseObject = JSON.parse(responseJSON);
  1109.        
  1110.         /*if(request.readyState !== 4)
  1111.         {
  1112.             return;
  1113.         }
  1114.         if(request.status !== 200)
  1115.         {
  1116.             return;
  1117.         }*/
  1118.        
  1119.         data.server.gameID = responseObject.game;
  1120.         data.server.key = responseObject.key;
  1121.         document.getElementById('selectArea').style.display = 'none';
  1122.         document.getElementById('waitingForOpponent').style.display = 'block';
  1123.  
  1124.         update(responseObject.game, responseObject.key);
  1125.     };
  1126.     request.send(requestJSON);
  1127. }
  1128.  
  1129.  
  1130. function ranking(level)
  1131. {
  1132.     'use strict';
  1133.    
  1134.     var requestObject;
  1135.     var responseObject;
  1136.     var requestJSON;
  1137.     var responseJSON;
  1138.     var request;
  1139.    
  1140.     requestObject = {};
  1141.    
  1142.     requestObject.level = level;
  1143.     requestJSON = JSON.stringify(requestObject);
  1144.    
  1145.     request = new XMLHttpRequest();
  1146.    
  1147.     request.open("POST", "http://twserver.alunos.dcc.fc.up.pt:8000/ranking", true);
  1148.     request.setRequestHeader("Content-type", "application/json");
  1149.      
  1150.     request.onload = function()
  1151.     {
  1152.         responseJSON = request.responseText;
  1153.         //alert("1 " + responseJSON);
  1154.         responseObject = JSON.parse(responseJSON);
  1155.         //alert("2 " + responseObject.ranking[0].name);
  1156.        
  1157.         var a, b;
  1158.  
  1159.         if(level === "beginner")
  1160.         {
  1161.             a = 0;
  1162.             b = 10;
  1163.         }
  1164.         else if(level === "intermediate")
  1165.         {
  1166.             a = 10;
  1167.             b = 20;
  1168.         }
  1169.         else if(level === "advanced")
  1170.         {
  1171.             a = 20;
  1172.             b = 30;
  1173.         }
  1174.         else
  1175.         {
  1176.             a = 30;
  1177.             b = 40;
  1178.         }
  1179.  
  1180.         var i;
  1181.         for(i = a; i < b; i++)
  1182.         {
  1183.             scores[i][0] = responseObject.ranking[i-a].name;
  1184.             scores[i][1] = responseObject.ranking[i-a].boxes;
  1185.             scores[i][2] = responseObject.ranking[i-a].time;
  1186.  
  1187.         }
  1188.     };
  1189.     request.send(requestJSON);
  1190. }
  1191.  
  1192. // ========================================================================
  1193. //                        Final server connection
  1194. // ========================================================================
  1195.  
  1196. window.onload = function ()
  1197. {
  1198.     'use strict';
  1199.  
  1200.     createBoardHS();
  1201.    
  1202.     document.getElementById("password").addEventListener("keyup",
  1203.                                                          function(event)
  1204.                                                          {
  1205.                                                             event.preventDefault();    
  1206.                                                             if (event.keyCode === 13)
  1207.                                                             {
  1208.                                                                 document.getElementById("loginButton").click();
  1209.                                                             }
  1210.                                                          });
  1211.    
  1212.     document.getElementById("username").addEventListener("keyup",
  1213.                                                          function(event)
  1214.                                                          {
  1215.                                                             event.preventDefault();
  1216.                                                             if (event.keyCode === 13)
  1217.                                                             {
  1218.                                                                 document.getElementById("loginButton").click();
  1219.                                                             }
  1220.                                                          });
  1221.    
  1222.     var buttons = document.getElementsByClassName('levelButton');
  1223.     var i;
  1224.     for(i=0; i<buttons.length; i++)
  1225.     {
  1226.        selectMode(buttons[i]);
  1227.     }
  1228.    
  1229.     var buttonsHS = document.getElementsByClassName('HSButton');
  1230.     var j;
  1231.     for(j=0; j<buttonsHS.length; j++)
  1232.     {
  1233.         showHighScores(buttonsHS[j]);
  1234.         ranking(buttonsHS[j].value);
  1235.     }
  1236.    
  1237.     document.getElementById('reStartButton').onclick = function()
  1238.     {
  1239.         document.getElementById('boxMessage').style.display = 'none';
  1240.         createBoard(data.board.level);
  1241.     };
  1242.    
  1243.     document.getElementById('howToPlay').onmouseover = function()
  1244.     {
  1245.         document.getElementById('rules').style.display = 'table';
  1246.     };
  1247.    
  1248.     document.getElementById('howToPlay').onmouseout = function()
  1249.     {  
  1250.         document.getElementById('rules').style.display = 'none';
  1251.     };
  1252.    
  1253.     document.getElementById('rules').onmouseover = function()
  1254.     {
  1255.         document.getElementById('rules').style.display = 'table';
  1256.     };
  1257.    
  1258.     document.getElementById('rules').onmouseout = function()
  1259.     {  
  1260.         document.getElementById('rules').style.display = 'none';
  1261.     };
  1262.    
  1263.     document.getElementById('loginButton').onclick = function()
  1264.     {
  1265.         if(checkLogin())
  1266.         {
  1267.             register();
  1268.         }
  1269.     };
  1270.    
  1271.     document.getElementById('offlineButton').onclick = function()
  1272.     {
  1273.         data.login.logged = false;
  1274.         data.game.singlePlayer = true;
  1275.         createSelectArea();
  1276.     };
  1277.    
  1278.     document.getElementById('quitButton').onclick = function()
  1279.     {
  1280.         clearData();
  1281.         if(data.server.updsrc !== null)
  1282.         {
  1283.             data.server.updsrc.close();
  1284.             data.server.updsrc = null;
  1285.             leave();
  1286.         }
  1287.         data.game.running = false;
  1288.         createSelectArea();
  1289.     };
  1290.    
  1291.     document.getElementById('goBackButton').onclick = function()
  1292.     {
  1293.         createLoginArea();
  1294.     };
  1295.    
  1296.     document.getElementById('myAccountButton').onclick = function()
  1297.     {    
  1298.         if(menuUserHidden)
  1299.         {
  1300.             document.getElementById('myAccountText').innerHTML = "MyAccount " + '&utrif;';
  1301.             document.getElementById('divSpace').style.display = 'block';
  1302.             document.getElementById('menuUser').style.display = 'block';
  1303.             menuUserHidden = false;    
  1304.         }
  1305.         else
  1306.         {
  1307.             document.getElementById('myAccountText').innerHTML = "MyAccount " + '&dtrif;';  
  1308.             document.getElementById('divSpace').style.display = 'none';
  1309.             document.getElementById('menuUser').style.display = 'none';
  1310.             menuUserHidden = true;
  1311.         }
  1312.     };
  1313.    
  1314.     document.getElementById('highScoresButton').onclick = function()
  1315.     {    
  1316.         if(highScoresHidden)
  1317.         {
  1318.             document.getElementById('highScores').style.display = 'block';
  1319.             document.getElementById('buttonsHS').style.display = 'block';
  1320.            
  1321.             document.getElementById('infoHS').style.display = 'none';
  1322.             highScoresHidden = false;
  1323.         }
  1324.         else
  1325.         {
  1326.             document.getElementById('highScores').style.display = 'none';
  1327.             highScoresHidden = true;
  1328.         }
  1329.     };
  1330.    
  1331.     document.getElementById('titleHSDiv').onclick = function()
  1332.     {
  1333.          document.getElementById('buttonsHS').style.display = 'block';
  1334.          document.getElementById('infoHS').style.display = 'none';
  1335.     };
  1336.    
  1337.     document.getElementById('logoutButton').onclick = function()
  1338.     {
  1339.         createLoginArea();
  1340.     };
  1341.    
  1342.     document.getElementById('settingsButton').onclick = function()
  1343.     {
  1344.           document.getElementById('total').style.display = 'block';
  1345.           document.getElementById('window').style.display = 'block';
  1346.     };
  1347.    
  1348.     document.getElementById('closeWindow').onclick = function()
  1349.     {
  1350.           document.getElementById('total').style.display = 'none';
  1351.           document.getElementById('window').style.display = 'none';
  1352.     };
  1353.    
  1354.     document.getElementById('total').onclick = function()
  1355.     {
  1356.           document.getElementById('total').style.display = 'none';
  1357.           document.getElementById('window').style.display = 'none';
  1358.     };
  1359.    
  1360.     document.getElementById('selectAgain').onclick = function()
  1361.     {
  1362.           createSelectArea();
  1363.     };
  1364.    
  1365.     document.getElementById('leave').onclick = function()
  1366.     {
  1367.         createSelectArea();
  1368.         leave();
  1369.        
  1370.     };
  1371. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement