This method checks the surrounding array elements of non empty elements and assigns them as POSSIBLE this indicates where the player can set the next marker
flips one line at a time (above method) given x y as the starting point and direction constants up, left, right, down, top-left, bottom-left, top-right, bottom-right
this method is called by the CReversiBoard::Play() method passing input parameters x and y (given by the user). It recursively calls the CReversiBoard::flipLine() method with different delta values This is to check all 8 directions for possible flips
called by CReversiBoard::flip(), this method checks if the row and col + respective deltas is the opponent player, if yes then return true This is done one "flip" at a time but it is a recursive function so it this method keeps calling itself until the pieces in a line have been flipped
Checks if the game is over by the score of each player, if white's score is 0 then black wins and if black's score is 0 white wins This is checked in the main superloop after each player has set a marker INPUT: void OUTPUT: 1 (black wins), 2 (white wins), 0 (game continues)
This method prints the board passed as a double pointer from the CReversiBoard class. It also prints the current player's turn and makes the board look pretty
-Generated by
-
- 1.8.16
+Generated by 1.9.8
diff --git a/menu.js b/menu.js
new file mode 100644
index 0000000..b0b2693
--- /dev/null
+++ b/menu.js
@@ -0,0 +1,136 @@
+/*
+ @licstart The following is the entire license notice for the JavaScript code in this file.
+
+ The MIT License (MIT)
+
+ Copyright (C) 1997-2020 by Dimitri van Heesch
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ and associated documentation files (the "Software"), to deal in the Software without restriction,
+ including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all copies or
+ substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+ BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+ @licend The above is the entire license notice for the JavaScript code in this file
+ */
+function initMenu(relPath,searchEnabled,serverSide,searchPage,search) {
+ function makeTree(data,relPath) {
+ var result='';
+ if ('children' in data) {
+ result+='
';
+ for (var i in data.children) {
+ var url;
+ var link;
+ link = data.children[i].url;
+ if (link.substring(0,1)=='^') {
+ url = link.substring(1);
+ } else {
+ url = relPath+link;
+ }
+ result+='
');
+ $('#main-nav').append(makeTree(menudata,relPath));
+ $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu');
+ if (searchBoxHtml) {
+ $('#main-menu').append('');
+ }
+ var $mainMenuState = $('#main-menu-state');
+ var prevWidth = 0;
+ if ($mainMenuState.length) {
+ function initResizableIfExists() {
+ if (typeof initResizable==='function') initResizable();
+ }
+ // animate mobile menu
+ $mainMenuState.change(function(e) {
+ var $menu = $('#main-menu');
+ var options = { duration: 250, step: initResizableIfExists };
+ if (this.checked) {
+ options['complete'] = function() { $menu.css('display', 'block') };
+ $menu.hide().slideDown(options);
+ } else {
+ options['complete'] = function() { $menu.css('display', 'none') };
+ $menu.show().slideUp(options);
+ }
+ });
+ // set default menu visibility
+ function resetState() {
+ var $menu = $('#main-menu');
+ var $mainMenuState = $('#main-menu-state');
+ var newWidth = $(window).outerWidth();
+ if (newWidth!=prevWidth) {
+ if ($(window).outerWidth()<768) {
+ $mainMenuState.prop('checked',false); $menu.hide();
+ $('#searchBoxPos1').html(searchBoxHtml);
+ $('#searchBoxPos2').hide();
+ } else {
+ $menu.show();
+ $('#searchBoxPos1').empty();
+ $('#searchBoxPos2').html(searchBoxHtml);
+ $('#searchBoxPos2').show();
+ }
+ if (typeof searchBox!=='undefined') {
+ searchBox.CloseResultsWindow();
+ }
+ prevWidth = newWidth;
+ }
+ }
+ $(window).ready(function() { resetState(); initResizableIfExists(); });
+ $(window).resize(resetState);
+ }
+ $('#main-menu').smartmenus();
+}
+/* @license-end */
diff --git a/menudata.js b/menudata.js
new file mode 100644
index 0000000..4bc191d
--- /dev/null
+++ b/menudata.js
@@ -0,0 +1,41 @@
+/*
+ @licstart The following is the entire license notice for the JavaScript code in this file.
+
+ The MIT License (MIT)
+
+ Copyright (C) 1997-2020 by Dimitri van Heesch
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ and associated documentation files (the "Software"), to deal in the Software without restriction,
+ including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all copies or
+ substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+ BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+ @licend The above is the entire license notice for the JavaScript code in this file
+*/
+var menudata={children:[
+{text:"Main Page",url:"index.html"},
+{text:"Classes",url:"annotated.html",children:[
+{text:"Class List",url:"annotated.html"},
+{text:"Class Index",url:"classes.html"},
+{text:"Class Members",url:"functions.html",children:[
+{text:"All",url:"functions.html"},
+{text:"Functions",url:"functions_func.html"},
+{text:"Variables",url:"functions_vars.html"},
+{text:"Enumerations",url:"functions_enum.html"},
+{text:"Enumerator",url:"functions_eval.html"}]}]},
+{text:"Files",url:"files.html",children:[
+{text:"File List",url:"files.html"},
+{text:"File Members",url:"globals.html",children:[
+{text:"All",url:"globals.html"},
+{text:"Functions",url:"globals_func.html"},
+{text:"Macros",url:"globals_defs.html"}]}]}]}
diff --git a/minus.svg b/minus.svg
new file mode 100644
index 0000000..f70d0c1
--- /dev/null
+++ b/minus.svg
@@ -0,0 +1,8 @@
+
+
diff --git a/minusd.svg b/minusd.svg
new file mode 100644
index 0000000..5f8e879
--- /dev/null
+++ b/minusd.svg
@@ -0,0 +1,8 @@
+
+
diff --git a/myCode/CReversiBoard.cpp b/myCode/CReversiBoard.cpp
deleted file mode 100644
index 534f975..0000000
--- a/myCode/CReversiBoard.cpp
+++ /dev/null
@@ -1,365 +0,0 @@
-/*
- * CReversiBoard.cpp
- *
- * Created on: 7 Nov 2021
- * Author: Mateo C. Querol
- */
-
-#include "CReversiBoard.h"
-#include "CReversiConsoleView.h"
-#include
-
-using namespace std;
-
-/*
- * CReversiBoard::CReversiBoard():
- * The constructor initializes a 2d unsigned int array of size 8x8
- * and sets the starting pieces in the middle of the board
- * as per the rules of the game
- *
- * 0 0 0 0 0 0 0 0
- * 0 0 0 0 0 0 0 0
- * 0 0 0 0 0 0 0 0
- * 0 0 0 1 2 0 0 0
- * 0 0 0 2 1 0 0 0
- * 0 0 0 0 0 0 0 0
- * 0 0 0 0 0 0 0 0
- * 0 0 0 0 0 0 0 0
- *
- * 0 = EMPTY
- * 1 = WHITE
- * 2 = BLACK
- *
- */
-
-CReversiBoard::CReversiBoard()
-{
- //each colour starts with 2 pieces on the board
- wScore = 2;
- bScore = 2;
- currPlayer = BLACK; // black moves first
- board = new unsigned int*[8];
- for (unsigned int index = 0; index < 8; index++)
- {
- board[index] = new unsigned int[8];
- }
- //set all elements to empty
- for(int r = 0; r < 8; r++)
- {
- for(int c = 0; c < 8; c++)
- {
- board[r][c] = EMPTY;
- }
- }
- //BUT...set the middle 4 pieces respectively
- board[3][3] = WHITE;
- board[3][4] = BLACK;
- board[4][3] = BLACK;
- board[4][4] = WHITE;
-}
-
-CReversiBoard::~CReversiBoard()
-{
- for(int index = 0; index <8; index++)
- {
- delete [] board[index];
- }
- delete [] board;
-}
-
-
-/**
- * CReversiBoard::checkNeighbors()
- *
- * This method checks the surrounding array elements
- * of non empty elements and assigns them as POSSIBLE
- * this indicates where the player can set the next marker
- */
-void CReversiBoard::checkNeighbors(unsigned int color)
-{
- for(int r = 0; r < 8; r++)
- {
- for(int c = 0; c < 8; c++)
- {
- if(board[r][c] == EMPTY)
- {
- // don't care if position is empty
- continue;
- }
- if(board[r][c] == POSSIBLE)
- {
- // position already set, don't care
- continue;
- }
-
- //switch player prespective
-
- if (currPlayer == WHITE)
- {
- color = BLACK;
- }
- if (currPlayer == BLACK)
- {
- color = WHITE;
- }
-
- //only show the possible (adjacent) moves
- if (board[r][c] == color)
- {
- //down
- if(board[r+1][c] == EMPTY)
- {
- board[r+1][c] = POSSIBLE;
- }
-
- //up
- if(board[r-1][c] == EMPTY)
- {
- board[r-1][c] = POSSIBLE;
- }
-
- //left
- if(board[r][c-1] == EMPTY)
- {
- board[r][c-1] = POSSIBLE;
- }
-
- //right
- if(board[r][c+1] == EMPTY)
- {
- board[r][c+1] = POSSIBLE;
- }
- }
- }
- }
-}
-
-/**
- * CReversiBoard::isLegalMove()
- *
- * Check if a move is possible AND if it is out of bounds
- * INPUT: x, y (user input)
- * OUTPUT: bool (true/false)
- */
-bool CReversiBoard::isLegalMove(unsigned int x, unsigned int y)
-{
- return (board[x][y] == POSSIBLE && (x > 0 && x < 9 && y > 0 && y < 9));
-}
-
-/**
- * CReversiBoard::setPiece()
- *
- * set the currPlayer's color at position x,y
- * if it can be placed there
- *
- * INPUT: x, y,(user input) and currPlayer
- * OUTPUT: void
- */
-void CReversiBoard::setPiece(unsigned int currPlayer, unsigned int x, unsigned int y)
-{
- board[x][y] = currPlayer;
- if(currPlayer == WHITE)
- {
- wScore++;
- }
- if(currPlayer == BLACK)
- {
- bScore++;
- }
-
-}
-
-/**
- * CReversiBoard::flipLine()
- *
- * called by CReversiBoard::flip(), this method checks if the
- * row and col + respective deltas is the opponent player, if yes then return true
- * This is done one "flip" at a time but it is a recursive function
- * so it this method keeps calling itself until the pieces in a line have been flipped
- *
- * INPUT: r, c, (user input) dr, dc, (direction constants) and currPlayer
- * OUTPUT: bool (true/false)
- */
-bool CReversiBoard::flipLine(unsigned int dr, unsigned int dc, unsigned int r, unsigned int c, unsigned int currPlayer)
-{
- //check for out of bounds
- if (r < 0 || r > 7 || c < 0 || c > 7)
- {
- return false;
- }
- //check for empty
- if (board[r+dr][c+dc]== EMPTY)
- {
- return false;
- }
- if (board[r+dr][c+dc] !=this->currPlayer)
- {
- if(flipLine(dr,dc,r+dr,c+dc,this->currPlayer))
- {
- board[r+dr][c+dc] = this->currPlayer;
- //increment score
- if(currPlayer == WHITE)
- {
- wScore++;
- bScore--;
- }
- if(currPlayer == BLACK)
- {
- bScore++;
- wScore--;
- }
- return true;
- }
- else
- {
- return false;
- }
- }
- return true;
-}
-
-/**
- * CReversiBoard::flip()
- *
- * this method is called by the CReversiBoard::Play() method passing input parameters x and y
- * (given by the user). It recursively calls the CReversiBoard::flipLine() method with different delta values
- * This is to check all 8 directions for possible flips
- *
- * INPUT: x, y (user input)
- * OUTPUT: void
- */
-void CReversiBoard::flip(unsigned int x, unsigned int y)
-{
- flipLine(-1,0,x,y,this->currPlayer); //up
- flipLine(1,0,x,y,this->currPlayer); //down
- flipLine(0,-1,x,y,this->currPlayer); //left
- flipLine(0,1,x,y,this->currPlayer); //right
-
- flipLine(-1,-1,x,y,this->currPlayer); //top-left
- flipLine(-1,1,x,y,this->currPlayer); //top-right
- flipLine(1,-1,x,y,this->currPlayer); //bottom-left
- flipLine(1,1,x,y,this->currPlayer); //bottom-right
-}
-
-/**
- * CReversiBoard::isGameOver()
- *
- * Checks if the game is over by the score of each player,
- * if white's score is 0 then black wins and if black's score is 0 white wins
- * This is checked in the main superloop after each player has set a marker
- * INPUT: void
- * OUTPUT: 1 (black wins), 2 (white wins), 0 (game continues)
- */
-int CReversiBoard::isGameOver()
-{
- if(wScore == 0) // black wins
- {
- return 1;
- }
- else if(bScore == 0) // white wins
- {
- return 2;
- }
- else
- {
- return 0; // game continues
- }
-}
-
-/**
- * CReversiBoard::switchPlayer()
- *
- * This method changes the class attribute from
- * WHITE to BLACK or vice versa
- *
- * INPUT: void
- * OUTPUT: void
- */
-void CReversiBoard::switchPlayer()
-{
- if (currPlayer == WHITE)
- {
- currPlayer = BLACK;
- }
- else if (currPlayer == BLACK)
- {
- currPlayer = WHITE;
- }
-}
-
-/**
- * CReversiBoard::play()
- *
- * This method creates a control flow for the reversi game by combining
- * all of the methods from this class to make a 2 player reversi game
- *
- * This method is looped 64 times in main.cpp because there are 64
- * spaces and if no one wins after 64 rounds then the game is a TIE
- *
- * This method calls the CReversiConsoleView class' print function by passing the
- * board array as a pointer
- *
- * INPUT: x, y (user input)
- * OUTPUT: void
- */
-void CReversiBoard::play()
-{
- CReversiConsoleView screen((unsigned int**)board); //create local screen object
- unsigned int x; //x user input
- unsigned int y; //y user input
- string playerStr;
-
-
- if(currPlayer == WHITE)
- {
- playerStr = "WHITE";
- }
- else if(currPlayer == BLACK)
- {
- playerStr = "BLACK";
- }
- checkNeighbors(currPlayer);
-
- //call the print function passing the player string
- screen.print(playerStr, this->wScore, this->bScore);
-
- //x,y input validation
- do
- {
- cout <<"enter x and y coordinate (0-8) "<> x;
- cin >> y;
- if (((x<1) || (x>8)) || ((y<1) || (y>8)))
- {
- cout << "INVALID INPUT" << endl;
- }
-
- }while (((x<=1) || (x>=8)) || ((y<=1) || (y>=8)));
- setPiece(currPlayer, y-1, x-1); // x and y - 1 because arrays are 0 indexed
- flip(y-1,x-1);
- resetBoard();
- switchPlayer();
-}
-
-/**
- * CReversiBoard::play()
- *
- * This method loops through the entire board and if it finds a POSSIBLE
- * element, it clears it. This is to reset the prespective when switching players
- *
- * INPUT: void
- * OUTPUT: void
- */
-void CReversiBoard::resetBoard()
-{
- for(int r = 0; r < 8; r++)
- {
- for (int c = 0; c < 8; c++)
- {
- if(board[r][c] == POSSIBLE)
- {
- board[r][c] = EMPTY;
- }
- }
- }
-}
diff --git a/myCode/CReversiBoard.h b/myCode/CReversiBoard.h
deleted file mode 100644
index d27dde9..0000000
--- a/myCode/CReversiBoard.h
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * CReversiBoard.h
- *
- * Created on: 7 Nov 2021
- * Author: Mateo C. Querol
- */
-
-#ifndef CREVERSIBOARD_H_
-#define CREVERSIBOARD_H_
-
-
-class CReversiBoard
-{
-
-private:
-
- /** states
- *
- * this enum defines the state of each element
- * of the board array
- */
- enum states
- {
- EMPTY,
- WHITE,
- BLACK,
- POSSIBLE
- };
-
- /** currPlayer
- *
- * keeps track of the current player (black or white)
- */
- unsigned int currPlayer;
-
- /** wScore
- *
- * keeps track of the white player score
- */
- unsigned int wScore; //score of white player
-
- /** bScore
- *
- * keeps track of the black player score
- */
- unsigned int bScore; //score of white player
-
- /** checkNeighbors()
- *
- * checks surrounding pieces of non empty elements
- */
- void checkNeighbors(unsigned int color);
-
- /** isLegalMove()
- *
- * checks if a piece can be placed at the position x, y
- */
- bool isLegalMove(unsigned int x, unsigned int y);
-
- /** setPiece()
- *
- * places the piece of currPlayer's color at position x, y
- */
- void setPiece(unsigned int currPlayer, unsigned int x, unsigned int y);
-
- /** flipLine
- *
- * flips one piece of the opposite player's color given an x,y (r,c) coordinate with delta constants (direction of travel)
- * (called recursively)
- */
- bool flipLine(unsigned int dr, unsigned int dc, unsigned int r, unsigned int c, unsigned int currPlayer);
-
- /** flip()
- *
- * flips one line at a time (above method) given x y as the starting point and direction constants
- * up, left, right, down, top-left, bottom-left, top-right, bottom-right
- */
- void flip(unsigned int x, unsigned int y);
-
- /** switchPlayer()
- *
- * switches the current player
- */
- void switchPlayer();
-
- /** resetBoard()
- *
- * clear all the POSSIBLE elements on the board to switch player prespective
- */
- void resetBoard();
-
-public:
-
- /**
- * Constructor
- */
- CReversiBoard();
-
- /**
- * Destructor
- */
- ~CReversiBoard();
-
- /**
- * 2d board of size 8x8
- */
- unsigned int** board;
-
- /** play()
- *
- * this methods executes all the methods for one player to make a move
- * and switch player, this is in the superloop in main.cpp
- */
- void play();
-
- /** isGameOver()
- *
- * this method is called after the play() method in main,
- * it checks if either player won the game or if the game should continue
- */
- int isGameOver();
-
-};
-
-#endif /* CREVERSIBOARD_H_ */
diff --git a/myCode/CReversiConsoleView.cpp b/myCode/CReversiConsoleView.cpp
deleted file mode 100644
index a3ebd92..0000000
--- a/myCode/CReversiConsoleView.cpp
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * CReversiConsoleView.cpp
- *
- * Created on: 8 Nov 2021
- * Author: Mateo C. Querol
- */
-
-#include "CReversiConsoleView.h"
-#include
-
-using namespace std;
-
-CReversiConsoleView::CReversiConsoleView(unsigned int **board)
-{
- boardptr = board;
-}
-
-CReversiConsoleView::~CReversiConsoleView()
-{
-
-}
-
-/** CReversiConsoleView::print()
- *
- * This method prints the board passed as a double pointer from the
- * CReversiBoard class. It also prints the current player's turn
- * and makes the board look pretty
- */
-void CReversiConsoleView::print(std::string playerStr, unsigned int wScore, unsigned int bScore)
-{
- cout << "-----------------" << endl;
- cout << playerStr << "'s turn" << endl;
- cout << "-----------------" << endl;
- cout << " ";
- for(int col = 0; col < 8; col++)
- {
- cout << " " << col+1; //column numbers
- }
- cout << endl;
- for(int row = 0; row < 8; row++)
- {
- cout << row+1 << " "; // row numbers
- for(int col = 0; col < 8; col++)
- {
- switch(boardptr[row][col])
- {
- case 0:
- cout << '-' << " ";
- break;
- case 1:
- cout << 'W' << " ";
- break;
- case 2:
- cout << 'B' << " ";
- break;
- case 3:
- cout << '*' << " ";
- }
- }
- cout << endl;
- }
- //output scores
- cout << "-----------------" << endl;
- cout << "BLACK's score: " << bScore << endl;
- cout << "WHITE's score: " << wScore << endl;
- cout << "-----------------" << endl;
-}
diff --git a/myCode/CReversiConsoleView.h b/myCode/CReversiConsoleView.h
deleted file mode 100644
index e356cc2..0000000
--- a/myCode/CReversiConsoleView.h
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * CReversiConsoleView.h
- *
- * Created on: 8 Nov 2021
- * Author: Mateo C. Querol
- */
-
-#ifndef CREVERSICONSOLEVIEW_H_
-#define CREVERSICONSOLEVIEW_H_
-#include
-
-class CReversiConsoleView
-{
-
-private:
- unsigned int **boardptr;
-public:
-
- /*
- * Constructor of this class takes the double pointer from the CReversiBoard class and
- */
- CReversiConsoleView(unsigned int **board);
- ~CReversiConsoleView();
-
- /** print()
- *
- * print the board pass from the CReversiBoard class with each player's score
- */
- void print(std::string playerStr, unsigned int wScore, unsigned int bScore);
-};
-
-#endif /* CREVERSICONSOLEVIEW_H_ */
diff --git a/myCode/main.cpp b/myCode/main.cpp
deleted file mode 100644
index f653292..0000000
--- a/myCode/main.cpp
+++ /dev/null
@@ -1,37 +0,0 @@
-#include "CReversiBoard.h"
-#include
-#include
-#include
-
-
-using namespace std;
-
-
-int main (void)
-{
-
- CReversiBoard game;
- cout << "REVERSI GAME" << endl;
- for (int round = 0; round < 64; round++)
- {
- game.play(); //start the game
- if(game.isGameOver() == 1)
- {
- cout << "BLACK WINS!!" << endl;
- }
- else if (game.isGameOver() == 2)
- {
- cout << "WHITE WINS!!" << endl;
- }
- else
- {
- continue;
- }
- }
- cout << "TIE GAME" << endl;
-
-
-//TODO finish the rest of the loop and implement the other class
-
- return 0;
-}
diff --git a/html/nav_f.png b/nav_f.png
similarity index 100%
rename from html/nav_f.png
rename to nav_f.png
diff --git a/nav_fd.png b/nav_fd.png
new file mode 100644
index 0000000..032fbdd
Binary files /dev/null and b/nav_fd.png differ
diff --git a/html/nav_g.png b/nav_g.png
similarity index 100%
rename from html/nav_g.png
rename to nav_g.png
diff --git a/html/nav_h.png b/nav_h.png
similarity index 100%
rename from html/nav_h.png
rename to nav_h.png
diff --git a/nav_hd.png b/nav_hd.png
new file mode 100644
index 0000000..de80f18
Binary files /dev/null and b/nav_hd.png differ
diff --git a/html/open.png b/open.png
similarity index 100%
rename from html/open.png
rename to open.png
diff --git a/plus.svg b/plus.svg
new file mode 100644
index 0000000..0752016
--- /dev/null
+++ b/plus.svg
@@ -0,0 +1,9 @@
+
+
diff --git a/plusd.svg b/plusd.svg
new file mode 100644
index 0000000..0c65bfe
--- /dev/null
+++ b/plusd.svg
@@ -0,0 +1,9 @@
+
+
diff --git a/html/splitbar.png b/splitbar.png
similarity index 100%
rename from html/splitbar.png
rename to splitbar.png
diff --git a/splitbard.png b/splitbard.png
new file mode 100644
index 0000000..8367416
Binary files /dev/null and b/splitbard.png differ
diff --git a/html/sync_off.png b/sync_off.png
similarity index 100%
rename from html/sync_off.png
rename to sync_off.png
diff --git a/html/sync_on.png b/sync_on.png
similarity index 100%
rename from html/sync_on.png
rename to sync_on.png
diff --git a/html/tab_a.png b/tab_a.png
similarity index 100%
rename from html/tab_a.png
rename to tab_a.png
diff --git a/tab_ad.png b/tab_ad.png
new file mode 100644
index 0000000..e34850a
Binary files /dev/null and b/tab_ad.png differ
diff --git a/html/tab_b.png b/tab_b.png
similarity index 100%
rename from html/tab_b.png
rename to tab_b.png
diff --git a/tab_bd.png b/tab_bd.png
new file mode 100644
index 0000000..91c2524
Binary files /dev/null and b/tab_bd.png differ
diff --git a/html/tab_h.png b/tab_h.png
similarity index 100%
rename from html/tab_h.png
rename to tab_h.png
diff --git a/tab_hd.png b/tab_hd.png
new file mode 100644
index 0000000..2489273
Binary files /dev/null and b/tab_hd.png differ
diff --git a/html/tab_s.png b/tab_s.png
similarity index 100%
rename from html/tab_s.png
rename to tab_s.png
diff --git a/tab_sd.png b/tab_sd.png
new file mode 100644
index 0000000..757a565
Binary files /dev/null and b/tab_sd.png differ
diff --git a/tabs.css b/tabs.css
new file mode 100644
index 0000000..71c8a47
--- /dev/null
+++ b/tabs.css
@@ -0,0 +1 @@
+.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.main-menu-btn{position:relative;display:inline-block;width:36px;height:36px;text-indent:36px;margin-left:8px;white-space:nowrap;overflow:hidden;cursor:pointer;-webkit-tap-highlight-color:rgba(0,0,0,0)}.main-menu-btn-icon,.main-menu-btn-icon:before,.main-menu-btn-icon:after{position:absolute;top:50%;left:2px;height:2px;width:24px;background:var(--nav-menu-button-color);-webkit-transition:all .25s;transition:all .25s}.main-menu-btn-icon:before{content:'';top:-7px;left:0}.main-menu-btn-icon:after{content:'';top:7px;left:0}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon{height:0}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon:before{top:0;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon:after{top:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}#main-menu-state{position:absolute;width:1px;height:1px;margin:-1px;border:0;padding:0;overflow:hidden;clip:rect(1px,1px,1px,1px)}#main-menu-state:not(:checked) ~ #main-menu{display:none}#main-menu-state:checked ~ #main-menu{display:block}@media(min-width:768px){.main-menu-btn{position:absolute;top:-99999px}#main-menu-state:not(:checked) ~ #main-menu{display:block}}.sm-dox{background-image:var(--nav-gradient-image)}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0 12px;padding-right:43px;font-family:var(--font-family-nav);font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:var(--nav-text-normal-shadow);color:var(--nav-text-normal-color);outline:0}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a.current{color:#d23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace !important;text-align:center;text-shadow:none;background:var(--nav-menu-toggle-color);-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox a span.sub-arrow:before{display:block;content:'+'}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{-moz-border-radius:5px 5px 0 0;-webkit-border-radius:5px;border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{-moz-border-radius:0 0 5px 5px;-webkit-border-radius:0;border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox ul{background:var(--nav-menu-background-color)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:var(--nav-menu-background-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:0 1px 1px black}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media(min-width:768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:var(--nav-gradient-image);line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:var(--nav-text-normal-color) transparent transparent transparent;background:transparent;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0 12px;background-image:var(--nav-separator-image);background-repeat:no-repeat;background-position:right;-moz-border-radius:0 !important;-webkit-border-radius:0;border-radius:0 !important}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a:hover span.sub-arrow{border-color:var(--nav-text-hover-color) transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent var(--nav-menu-background-color) transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:var(--nav-menu-background-color);-moz-border-radius:5px !important;-webkit-border-radius:5px;border-radius:5px !important;-moz-box-shadow:0 5px 9px rgba(0,0,0,0.2);-webkit-box-shadow:0 5px 9px rgba(0,0,0,0.2);box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent var(--nav-menu-foreground-color);border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:var(--nav-menu-foreground-color);background-image:none;border:0 !important;color:var(--nav-menu-foreground-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent var(--nav-text-hover-color)}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:var(--nav-menu-background-color);height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #d23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#d23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent var(--nav-menu-foreground-color) transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:var(--nav-menu-foreground-color) transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px !important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:var(--nav-gradient-image)}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:var(--nav-menu-background-color)}}
\ No newline at end of file