diff --git a/README.md b/README.md
new file mode 100644
index 0000000..1130d49
--- /dev/null
+++ b/README.md
@@ -0,0 +1,9 @@
+# Session Manager
+Session Manager allows you to manage your Firefox session by backing up or loading your saved sessions.
+
+# Download
+https://addons.mozilla.org/en-US/firefox/addon/tab-groups-with-search-manager/
+
+
+# Version: 0.0.1
+Released Program
diff --git a/src/images/icons/delete.png b/src/images/icons/delete.png
new file mode 100644
index 0000000..e9b3fa9
Binary files /dev/null and b/src/images/icons/delete.png differ
diff --git a/src/images/icons/download.png b/src/images/icons/download.png
new file mode 100644
index 0000000..17ea75e
Binary files /dev/null and b/src/images/icons/download.png differ
diff --git a/src/images/icons/edit.png b/src/images/icons/edit.png
new file mode 100644
index 0000000..7c2a22a
Binary files /dev/null and b/src/images/icons/edit.png differ
diff --git a/src/images/icons/save.png b/src/images/icons/save.png
new file mode 100644
index 0000000..751469f
Binary files /dev/null and b/src/images/icons/save.png differ
diff --git a/src/images/icons/sessionManager.png b/src/images/icons/sessionManager.png
new file mode 100644
index 0000000..c9efe50
Binary files /dev/null and b/src/images/icons/sessionManager.png differ
diff --git a/src/manifest.json b/src/manifest.json
new file mode 100644
index 0000000..4453f78
--- /dev/null
+++ b/src/manifest.json
@@ -0,0 +1,31 @@
+{
+ "manifest_version": 2,
+ "name": "Session Manager",
+ "version": "0.0.1",
+ "description": "Session Manager allows you to manage your Firefox session by backing up or loading your saved sessions.",
+
+ "applications": {
+ "gecko": {
+ "id": "sessionManager@itdominator.com",
+ "strict_min_version": "55.0"
+ }
+ },
+
+ "icons": {
+ "48": "images/icons/sessionManager.png",
+ "96": "images/icons/sessionManager.png"
+ },
+
+ "permissions": [
+ "tabs",
+ "storage",
+ "unlimitedStorage"
+ ],
+
+ "browser_action": {
+ "default_icon": "images/icons/sessionManager.png",
+ "default_title": "Session Manager",
+ "default_popup": "pages/sessionManager.html"
+ }
+
+}
diff --git a/src/pages/sessionManager.html b/src/pages/sessionManager.html
new file mode 100755
index 0000000..93e02ef
--- /dev/null
+++ b/src/pages/sessionManager.html
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/scripts/events.js b/src/scripts/events.js
new file mode 100644
index 0000000..9dfd3c4
--- /dev/null
+++ b/src/scripts/events.js
@@ -0,0 +1,37 @@
+let selectedItem = null;
+
+document.addEventListener("click", (e) => {
+ if (e.button == 0) { // Left click
+ if (e.target.tagName == "LI") {
+ if (selectedItem) {
+ if (selectedItem == e.target && selectedItem.className == "selected") {
+ selectedItem.setAttribute("class", "");
+ } else {
+ selectedItem.setAttribute("class", "");
+ selectedItem = e.target;
+ selectedItem.setAttribute("class", "selected");
+ }
+ } else {
+ selectedItem = e.target;
+ selectedItem.setAttribute("class", "selected");
+ }
+ } else if (e.target.name == "save") {
+ saveSession();
+ } else if (selectedItem) {
+ if (e.target.name == "download")
+ downloadSession();
+ else if (e.target.name == "delete")
+ deleteFromStorage();
+ else if (e.target.name == "edit")
+ editSession();
+ }
+ }
+});
+
+document.addEventListener("dblclick", (e) => {
+ if (e.button == 0) { // Left click
+ if (e.target.tagName == "LI") {
+ loadSession(e.target.innerHTML.trim());
+ }
+ }
+});
diff --git a/src/scripts/sessionManager.js b/src/scripts/sessionManager.js
new file mode 100644
index 0000000..e5f8ce7
--- /dev/null
+++ b/src/scripts/sessionManager.js
@@ -0,0 +1,137 @@
+const storage = browser.storage.local;
+const windowSys = browser.windows;
+
+
+const saveSession = () => {
+ let enteryName = prompt("What is this session's name?", "" + new Date().toLocaleString()
+ .split(',')[0]);
+
+ if (enteryName) {
+ console.log("Saving session...");
+ windowSys.getAll({ populate: true, windowTypes: ["normal"] }).then((windows) => {
+ let sessionData = {};
+ for (let i = 0; i < windows.length; i++) {
+ let links = [];
+ for (var ii = 0; ii < windows[i].tabs.length; ii++) {
+ if (!windows[i].tabs[ii].url.includes("about:")) {
+ links.push(
+ {"link" : windows[i].tabs[ii].url.trim()}
+ );
+ }
+
+ }
+ sessionData["WindowID:" + windows[i].id] = links;
+ }
+ saveToStorage(enteryName, JSON.stringify(sessionData));
+ }).then(() => {
+ if (document.getElementsByName(enteryName).length == 0) {
+ appendToSavedSessionsList(enteryName);
+ }
+ });
+ } else {
+ console.log("Canceled save...");
+ }
+}
+
+const saveToStorage = (name, data) => {
+ storage.set({[name]: data});
+}
+
+const downloadSession = () => {
+ var dlAnchorElem = document.getElementById('downloadAnchorElem');
+ let id = selectedItem.innerHTML;
+ fileName = "session:" + id + ":" +
+ new Date().toLocaleString().split(',')[0]
+ .replace("/", "-") + ".json";
+
+ storage.get(id).then((storageResults) => {
+ let json = JSON.parse(storageResults[id]);
+ let dataStr = "data:text/json;charset=utf-8," + encodeURIComponent(JSON.stringify(json));
+ dlAnchorElem.setAttribute("href", dataStr);
+ dlAnchorElem.setAttribute("download", fileName);
+ dlAnchorElem.click();
+ });
+
+}
+
+const deleteFromStorage = () => {
+ let action = confirm("Do you wish to delete session: " + selectedItem.innerHTML + "?");
+
+ if (action) {
+ storage.remove(selectedItem.innerHTML).then(() => {
+ selectedItem.parentElement.removeChild(selectedItem);
+ });
+ }
+}
+
+const editSession = () => {
+ let id = selectedItem.innerHTML;
+ let newName = prompt("Editing selected session...", id);
+
+ if (newName != null) {
+ storage.get(id).then((storageResults) => {
+ storage.remove(id);
+ json = JSON.parse(storageResults[id]);
+ saveToStorage(newName, JSON.stringify(json));
+ });
+ selectedItem.innerHTML = newName;
+ }
+}
+
+const loadSession = (id = null) => {
+ console.log("Loading session...");
+ try {
+ storage.get(id).then((storageResults) => {
+ let json = JSON.parse(storageResults[id]);
+ let keys = Object.keys(json);
+
+ browser.windows.getAll().then((windows) => {
+ windowSys.getCurrent({populate: true}).then((currentWindow) => {
+ // Clear out windows
+ for (var i = 0; i < windows.length; i++) {
+ if (currentWindow.id != windows[i].id) {
+ windowSys.remove(windows[i].id);
+ }
+ }
+ }, windows);
+ });
+
+ // Open windows and populate with proper tabs
+ keys.forEach((key) => {
+ let store = json[key];
+ let urls = [];
+
+ for (var i = 0; i < store.length; i++) {
+ urls.push(store[i].link);
+ }
+
+ windowSys.create({ url: urls });
+ });
+
+ // Finalize clear out windows
+ windowSys.getCurrent({populate: true}).then((currentWindow) => {
+ windowSys.remove(currentWindow.id);
+ });
+ });
+ } catch (e) { console.log(e); }
+}
+
+const getSavedSessionIDs = () => {
+ console.log("Getting saved sessions...");
+ storage.get(null).then((storageResults) => {
+ let keys = Object.keys(storageResults);
+ for (let key of keys) {
+ appendToSavedSessionsList(key);
+ }
+ });
+}
+
+const appendToSavedSessionsList = (enteryName) => {
+ let liTag = document.createElement("LI");
+ let text = document.createTextNode(enteryName);
+ liTag.setAttribute("name", enteryName);
+ liTag.append(text);
+ document.getElementById("savedSessions").append(liTag);
+}
+
+getSavedSessionIDs();
diff --git a/src/styles/styles.css b/src/styles/styles.css
new file mode 100644
index 0000000..09da9de
--- /dev/null
+++ b/src/styles/styles.css
@@ -0,0 +1,30 @@
+body { width: 450px; }
+ul, li { list-style: none; }
+
+li {
+ background-color: #0a1827;
+ color: #ffffff;
+ margin: 1em 0em;
+ padding: 1.5em;
+ text-align: center;
+}
+
+li:hover {
+ background-color: #1e4573;
+ cursor: pointer;
+}
+
+button {
+ background-color: #ffffff;
+ color: #000000;
+}
+
+.selected {
+ background-color: #a3b83b;
+ box-shadow: 0px 5px 5px 5px #444444;
+}
+
+.icon {
+ width: 25px;
+ height: 25px;
+}