Blur Title Reddit

Blurring a title which marked as spoiler in reddit, just like in fallout subreddit.

θα χρειαστεί να εγκαταστήσετε μια επέκταση όπως το Tampermonkey, το Greasemonkey ή το Violentmonkey για να εγκαταστήσετε αυτόν τον κώδικα.

You will need to install an extension such as Tampermonkey to install this script.

θα χρειαστεί να εγκαταστήσετε μια επέκταση όπως το Tampermonkey ή το Violentmonkey για να εγκαταστήσετε αυτόν τον κώδικα.

θα χρειαστεί να εγκαταστήσετε μια επέκταση όπως το Tampermonkey ή το Userscripts για να εγκαταστήσετε αυτόν τον κώδικα.

You will need to install an extension such as Tampermonkey to install this script.

Θα χρειαστεί να εγκαταστήσετε μια επέκταση διαχείρισης κώδικα χρήστη για να εγκαταστήσετε αυτόν τον κώδικα.

(Έχω ήδη έναν διαχειριστή κώδικα χρήστη, επιτρέψτε μου να τον εγκαταστήσω!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(Έχω ήδη έναν διαχειριστή στυλ χρήστη, επιτρέψτε μου να τον εγκαταστήσω!)

// ==UserScript==
// @name        Blur Title Reddit
// @namespace   https://greasyfork.org/users/102866
// @description Blurring a title which marked as spoiler in reddit, just like in fallout subreddit.
// @include     https://*.reddit.com/*
// @include     http://*.reddit.com/*
// @exclude     https://*.reddit.com/r/*/comments/*
// @exclude     http://*.reddit.com/r/*/comments/*
// @author      TiLied
// @version     0.8.00
// @grant       GM_listValues
// @grant       GM_getValue
// @grant       GM_setValue
// @grant       GM_deleteValue
// @require     https://greasemonkey.github.io/gm4-polyfill/gm4-polyfill.js
// @grant       GM.listValues
// @grant       GM.getValue
// @grant       GM.setValue
// @grant       GM.deleteValue
// ==/UserScript==

class BlurTitleReddit
{
	constructor()
	{
		console.log("Blur Title Reddit v" + GM.info.script.version + " initialization");

		this.Debug = false;

		this.btr_pTitle = false;
		this.asterisk = true;
		
		this.Scroll = 1;

		this._FirstTime();
		this._SetCSS();
	}

	_SetCSS()
	{
		document.head.append("<!--Start of Blur Title Reddit v" + GM.info.script.version + " CSS-->");

		document.head.insertAdjacentHTML("beforeend", `<style type="text/css">bdi.btr_title:hover \
	{                                         \
		color:inherit!important;          \
		background:transparent!important;     \
		text-decoration:none!important;       \
		text-shadow:0 0.1px 0 #dcddce         \
	}</style>`);

		document.head.insertAdjacentHTML("beforeend", `<style type="text/css">bdi.btr_title   { \
		color:rgba(255,60,231,0) !important;        \
		text-shadow: 0px 0px 1em black;               \
		padding: 0 2px;                               \
	}</style>`);

		document.head.insertAdjacentHTML("beforeend", `<style type="text/css">bdi.btr_trans                             \
	{                                         \
		transition: all 0.5s ease;            \
	}</style>`);

		document.head.insertAdjacentHTML("beforeend", `<style type="text/css">.btr_closeButton\
	{                         \
		cursor: pointer; \
		text-align: center; \
		font-size: 11px; \
		float:right;                           \
		margin-top:0px;                     \
		border:1px solid #AAA;               \
		width:16px;                         \
		height:16px;                        \
	}</style>`);

		document.head.insertAdjacentHTML("beforeend", `<style type="text/css">.btr_closeButton:hover                             \
	{                         \
		border:1px solid #999;               \
		background-color: #ddd;                          \
	}</style>`);

		document.head.insertAdjacentHTML("beforeend", `<style type="text/css">.title                                    \
	{                                         \
		overflow: visible !important;         \
	}</style>`);

		document.head.insertAdjacentHTML("beforeend", `<style type="text/css">"div.btr_opt { \
	position: fixed; bottom: 0; right: 0; border: 0; z-index: 500;\
	}</style>`);

		document.head.append("<!--End of Blur Title Reddit v" + GM.info.script.version + " CSS-->");
	}

	async _FirstTime()
	{
		if (this.HasValueGM("btr_GMTitle", false))
		{
			this.btr_pTitle = await GM.getValue("btr_GMTitle");
		}

		if (this.HasValueGM("btr_asterisk", true))
		{
			this.asterisk = await GM.getValue("btr_asterisk");
		}

		//Console log prefs with value
		console.log("*prefs:");
		console.log("*-----*");
		let vals = await GM.listValues();

		//Find out that var in for block is not local... Seriously js?
		for (let i = 0; i < vals.length; i++)
		{
			console.log("*" + vals[i] + ":" + await GM.getValue(vals[i]));
		}
		console.log("*-----*");
	}

	Main()
	{
		window.onscroll = function (ev)
		{
			if (window.pageYOffset >= window.innerHeight * btr.Scroll)
			{
				btr.Core();

				btr.Scroll += 1;
			}
		};

		this.Core();

		//Set UI of settings
		//TODO UI!
		//this.OptionsUI();
	}

	Core()
	{
		let _titlesDivQ = document.querySelectorAll("div.spoiler");
		let _titlesDiv = [];

		if (_titlesDivQ.length == 0)
		{
			function _IsSpoiler(_el)
			{
				let _spans = _el.querySelectorAll("span");

				if (btr.Debug)
					console.log(_el.querySelectorAll("span"));

				for (let i = 0; i <= _spans.length; i++)
				{
					if (i == _spans.length)
						return false;

					if (_spans[i].textContent == 'spoiler')
						return true;
				}
			}

			let _titles = document.querySelectorAll(".Post");

			for (let i = 0; i < _titles.length; i++)
			{
				if (_IsSpoiler(_titles[i]))
				{
					_titlesDiv.push(_titles[i]);
				}
			}
		} else
		{
			for (let i = 0; i < _titlesDivQ.length; i++)
			{
				_titlesDiv.push(_titlesDivQ[i]);
			}
		}

		if (_titlesDiv != this.titlesDiv)
		{
			if (this.Debug)
				console.log(_titlesDiv);

			this.titlesDiv = _titlesDiv;

			for (let i = 0; i < _titlesDiv.length; i++)
			{
				if (_titlesDiv[i].querySelectorAll(".btr_title").length > 0)
					continue;

				let _title = _titlesDiv[i].querySelectorAll("h3, a.title");

				if (this.Debug)
					console.log(_title);

				if (this.btr_pTitle == true)
				{
					let lengthOfIndexes = 0;

					this.ChangeString(_title[0].textContent.length, _title[0].textContent, _title[0], lengthOfIndexes);
				}
				else if (this.asterisk == true)
				{
					let lengthOfIndexes = this.GetAllIndexes(_title[0].textContent, "[", "(").length;

					lengthOfIndexes += this.GetAllIndexes(_title[0].textContent, "*", "even").length;

					this.ChangeString(_title[0].textContent.length, _title[0].textContent, _title[0], lengthOfIndexes);
				} else
				{
					let lengthOfIndexes = this.GetAllIndexes(_title[0].textContent, "[", "(").length;

					this.ChangeString(_title[0].textContent.length, _title[0].textContent, _title[0], lengthOfIndexes);
				}
			}
		}
	}

	ChangeString(l, sArr, tTitle, amountL)
	{
		const stringStartbdi = '<bdi class = "btr_main btr_title btr_trans">',
			stringEndbdi = '</bdi>';

		let amount = amountL;

		let string = "";

		if (amount > 3)
			amount = 1;

		let arrBeg = this.GetAllIndexes(sArr, "[", "(");
		let arrEnd = this.GetAllIndexes(sArr, "]", ")");

		if (this.asterisk === true)
		{
			arrBeg = arrBeg.concat(this.GetAllIndexes(sArr, "*", "even"));
			arrEnd = arrEnd.concat(this.GetAllIndexes(sArr, "*", "odd"));
		}

		arrBeg.sort(function (a, b)
		{
			return a - b;
		});

		arrEnd.sort(function (a, b)
		{
			return a - b;
		});

		if (amount === 0)
		{
			string = stringStartbdi + ' ' + sArr + ' ' + stringEndbdi;
			if (this.Debug)
			{
				console.info(string);
			}
			tTitle.innerHTML = string;
			return;
		}

		if (amount === 1)
		{
			if (this.Debug)
			{
				console.log("*words in brackets :", sArr.substring(arrBeg[0], arrEnd[0] + 1));
			}
			//IF WHOLE TITLE IN BRACKETS
			if (arrBeg[0] <= 2 && arrEnd[0] >= l - 2)
			{
				string = stringStartbdi + ' ' + sArr + ' ' + stringEndbdi;
				if (this.Debug)
				{
					console.info(string);
				}
				tTitle.innerHTML = string;
				return;
			}

			if (arrBeg[0] <= 2)
			{
				string = sArr.substring(arrBeg[0], arrEnd[0] + 1) + ' ' + stringStartbdi + ' ' + sArr.substring(arrEnd[0] + 1, l) + ' ' + stringEndbdi;
				if (this.Debug)
				{
					console.info(string);
				}
				tTitle.innerHTML = string;
				return;
			} else if (arrEnd[0] >= l - 2)
			{
				string = stringStartbdi + ' ' + sArr.substring(0, arrBeg[0]) + ' ' + stringEndbdi + ' ' + sArr.substring(arrBeg[0], l);
				if (this.Debug)
				{
					console.info(string);
				}
				tTitle.innerHTML = string;
				return;
			} else
			{
				string = stringStartbdi + ' ' + sArr.substring(0, arrBeg[0]) + ' ' + stringEndbdi + ' ' + sArr.substring(arrBeg[0], arrEnd[0] + 1) + ' ' + stringStartbdi + ' ' + sArr.substring(arrEnd[0] + 1, l) + ' ' + stringEndbdi;
				if (this.Debug)
				{
					console.info(string);
				}
				tTitle.innerHTML = string;
				return;
			}
		}

		if (amount === 2)
		{
			let s = '';
			for (let a = 0; a < arrBeg.length; a++)
			{
				s += sArr.substring(arrBeg[a], arrEnd[a] + 1) + ' ';
			}
			if (this.Debug)
			{
				console.log("*words in brackets :", s);
			}

			//IF TITLE HAS ONE BRACKET WITHOUT CLOSING ONE
			if (arrBeg.length !== arrEnd.length)
			{
				ChangeString(l, sArr, tTitle, 1);
				return;
			}

			//IF WHOLE TITLE IN BRACKETS, NOT WORKING CORRECTLY TODO!
			if ((arrBeg[0] <= 2 && arrEnd[0] >= l - 2) || (arrBeg[1] <= 2 && arrEnd[1] >= l - 2))
			{
				string = stringStartbdi + ' ' + sArr + ' ' + stringEndbdi;
				if (this.Debug)
				{
					console.info(string);
				}
				tTitle.innerHTML = string;
				return;
			}

			if (arrBeg[0] <= 2)
			{
				if (arrEnd[0] + 4 > arrBeg[1])
				{
					string = sArr.substring(arrBeg[0], arrEnd[1] + 1) + ' ' + stringStartbdi + ' ' + sArr.substring(arrEnd[1] + 1, l) + ' ' + stringEndbdi;
					if (this.Debug)
					{
						console.info(string);
					}
					tTitle.innerHTML = string;
					return;
				} else if (arrEnd[1] >= l - 2)
				{
					string = sArr.substring(arrBeg[0], arrEnd[0] + 1) + ' ' + stringStartbdi + ' ' + sArr.substring(arrEnd[0] + 1, arrBeg[1]) + ' ' + stringEndbdi + ' ' + sArr.substring(arrBeg[1], l);
					if (this.Debug)
					{
						console.info(string);
					}
					tTitle.innerHTML = string;
					return;
				} else
				{
					string = sArr.substring(arrBeg[0], arrEnd[0] + 1) + ' ' + stringStartbdi + ' ' + sArr.substring(arrEnd[0] + 1, arrBeg[1]) + ' ' + stringEndbdi + ' ' + sArr.substring(arrBeg[1], arrEnd[1] + 1) + ' ' + stringStartbdi + ' ' + sArr.substring(arrEnd[1] + 1, l) + ' ' + stringEndbdi;
					if (this.Debug)
					{
						console.info(string);
					}
					tTitle.innerHTML = string;
					return;
				}
			} else if (arrEnd[1] >= l - 2)
			{
				if (arrBeg[1] - 4 < arrEnd[0])
				{
					string = stringStartbdi + ' ' + sArr.substring(0, arrBeg[0]) + ' ' + stringEndbdi + ' ' + sArr.substring(arrBeg[0], l);
					if (this.Debug)
					{
						console.info(string);
					}
					tTitle.innerHTML = string;
					return;
				} else if (arrBeg[0] <= 2)
				{
					string = sArr.substring(arrBeg[0], arrEnd[0] + 1) + ' ' + stringStartbdi + ' ' + sArr.substring(arrEnd[0] + 1, arrBeg[1]) + ' ' + stringEndbdi + ' ' + sArr.substring(arrBeg[1], l);
					if (this.Debug)
					{
						console.info(string);
					}
					tTitle.innerHTML = string;
					return;
				} else
				{
					string = stringStartbdi + ' ' + sArr.substring(0, arrBeg[0]) + ' ' + stringEndbdi + ' ' + sArr.substring(arrBeg[0], arrEnd[0] + 1) + ' ' + stringStartbdi + ' ' + sArr.substring(arrEnd[0] + 1, arrBeg[1]) + ' ' + stringEndbdi + ' ' + sArr.substring(arrBeg[1], l);
					if (this.Debug)
					{
						console.info(string);
					}
					tTitle.innerHTML = string;
					return;
				}
			} else
			{
				if (arrEnd[0] + 3 >= arrBeg[1])
				{
					string = stringStartbdi + ' ' + sArr.substring(0, arrBeg[0]) + ' ' + stringEndbdi + ' ' + sArr.substring(arrBeg[0], arrEnd[1] + 1) + ' ' + stringStartbdi + ' ' + sArr.substring(arrEnd[1] + 1, l) + ' ' + stringEndbdi;
					if (this.Debug)
					{
						console.info(string);
					}
					tTitle.innerHTML = string;
					return;
				} else
				{
					string = stringStartbdi + ' ' + sArr.substring(0, arrBeg[0]) + ' ' + stringEndbdi + ' ' + sArr.substring(arrBeg[0], arrEnd[0] + 1) + ' ' + stringStartbdi + ' ' + sArr.substring(arrEnd[0] + 1, arrBeg[1]) + ' ' + stringEndbdi + ' ' + sArr.substring(arrBeg[1], arrEnd[1] + 1) + ' ' + stringStartbdi + ' ' + sArr.substring(arrEnd[1] + 1, l) + ' ' + stringEndbdi;
					if (this.Debug)
					{
						console.info(string);
					}
					tTitle.innerHTML = string;
					return;
				}
			}
		}

		//Three groups of brackets
		//example sentence: "[spoiler0]_text1_[spoiler1]_text2_[spoiler2]"
		if (amount === 3)
		{
			let s = '';
			for (let a = 0; a < arrBeg.length; a++)
			{
				s += sArr.substring(arrBeg[a], arrEnd[a] + 1) + ' ';
			}
			if (this.Debug)
			{
				console.log("*words in brackets :", s);
			}

			//IF TITLE HAS ONE BRACKET WITHOUT CLOSING ONE
			if (arrBeg.length !== arrEnd.length)
			{
				ChangeString(l, sArr, tTitle, 1);
				return;
			}

			//IF WHOLE TITLE IN BRACKETS, NOT WORKING CORRECTLY TODO!
			if ((arrBeg[0] <= 2 && arrEnd[0] >= l - 2) || (arrBeg[1] <= 2 && arrEnd[1] >= l - 2) || (arrBeg[2] <= 2 && arrEnd[2] >= l - 2))
			{
				string = stringStartbdi + ' ' + sArr + ' ' + stringEndbdi;
				if (this.Debug)
				{
					console.info(string);
				}
				tTitle.innerHTML = string;
				return;
			}

			//case one:"[spoiler0]..."
			if (arrBeg[0] <= 2)
			{
				//case one:one:"[spoiler0][spoiler1]..."
				if (arrEnd[0] + 4 > arrBeg[1])
				{
					//case one:one:one:"[spoiler0][spoiler1][spoiler2]_text"
					if (arrEnd[1] + 4 > arrBeg[2])
					{
						//"[spoiler0][spoiler1][spoiler2]<blur>text</blur>"
						string = sArr.substring(arrBeg[0], arrEnd[2] + 1) + ' ' + stringStartbdi + ' ' + sArr.substring(arrEnd[2] + 1, l) + ' ' + stringEndbdi;
						if (this.Debug)
						{
							console.info(string);
						}
						tTitle.innerHTML = string;
						return;
						//case one:one:two:"[spoiler0][spoiler1]_text_[spoiler2]"
					} else if (arrEnd[2] >= l - 2)
					{
						//"[spoiler0][spoiler1]<blur>text</blur>[spoiler2]"
						string = sArr.substring(arrBeg[0], arrEnd[1] + 1) + ' ' + stringStartbdi + ' ' + sArr.substring(arrEnd[1] + 1, arrBeg[2]) + ' ' + stringEndbdi + ' ' + sArr.substring(arrBeg[2], l);
						if (this.Debug)
						{
							console.info(string);
						}
						tTitle.innerHTML = string;
						return;
						//case one:one:three:"[spoiler0][spoiler1]_text1_[spoiler2]_text2"
					} else
					{
						//"[spoiler0][spoiler1]<blur>text1</blur>[spoiler2]<blur>text2</blur>"
						string = sArr.substring(arrBeg[0], arrEnd[1] + 1) + ' ' + stringStartbdi + ' ' + sArr.substring(arrEnd[1] + 1, arrBeg[2]) + ' ' + stringEndbdi + ' ' + sArr.substring(arrBeg[2], arrEnd[2] + 1) + ' ' + stringStartbdi + ' ' + sArr.substring(arrEnd[2] + 1, l) + ' ' + stringEndbdi;
						if (this.Debug)
						{
							console.info(string);
						}
						tTitle.innerHTML = string;
						return;
					}
					//case one:two:"[spoiler0]...[spoiler2]"
					//"[spoiler0]...[spoiler1]":NEVER HAPPEND
				} else if (arrEnd[2] >= l - 2)
				{
					//case one:two:one:"[spoiler0]_text_[spoiler1][spoiler2]"
					if (arrEnd[1] + 4 > arrBeg[2])
					{
						//"[spoiler0]<blur>text</blur>[spoiler1][spoiler2]"
						string = sArr.substring(arrBeg[0], arrEnd[0] + 1) + ' ' + stringStartbdi + ' ' + sArr.substring(arrEnd[0] + 1, arrBeg[1]) + ' ' + stringEndbdi + ' ' + sArr.substring(arrBeg[1], l);
						if (this.Debug)
						{
							console.info(string);
						}
						tTitle.innerHTML = string;
						return;
					}
					//case one:two:two:"[spoiler0]_text1_[spoiler1]_text2_[spoiler2]"
					else
					{
						//"[spoiler0]<blur>text1</blur>[spoiler1]<blur>text2</blur>[spoiler2]"
						string = sArr.substring(arrBeg[0], arrEnd[0] + 1) + ' ' + stringStartbdi + ' ' + sArr.substring(arrEnd[0] + 1, arrBeg[1]) + ' ' + stringEndbdi + ' ' + sArr.substring(arrBeg[1], arrEnd[1] + 1) + ' ' + stringStartbdi + ' ' + sArr.substring(arrEnd[1] + 1, arrBeg[2]) + ' ' + stringEndbdi + ' ' + sArr.substring(arrBeg[2], l);
						if (this.Debug)
						{
							console.info(string);
						}
						tTitle.innerHTML = string;
						return;
					}
					//case one:three:"[spoiler0]_text1_[spoiler1]_text2_[spoiler2]_text3"
				} else
				{
					//"[spoiler0]<blur>text1</blur>[spoiler1]<blur>text2</blur>[spoiler2]<blur>text3</blur>"
					string = sArr.substring(arrBeg[0], arrEnd[0] + 1) + ' ' + stringStartbdi + ' ' + sArr.substring(arrEnd[0] + 1, arrBeg[1]) + ' ' + stringEndbdi + ' ' + sArr.substring(arrBeg[1], arrEnd[1] + 1) + ' ' + stringStartbdi + ' ' + sArr.substring(arrEnd[1] + 1, arrBeg[2]) + ' ' + stringEndbdi + ' ' + sArr.substring(arrBeg[2], arrEnd[2] + 1) + ' ' + stringStartbdi + ' ' + sArr.substring(arrEnd[2] + 1, l) + ' ' + stringEndbdi;
					if (this.Debug)
					{
						console.info(string);
					}
					tTitle.innerHTML = string;
					return;
				}
				//case two:"...[spoiler2]"
			} else if (arrEnd[2] >= l - 2)
			{
				//case two:one:"...[spoiler1][spoiler2]"
				if (arrEnd[1] + 4 > arrBeg[2])
				{
					//case two:one:one:"text_[spoiler0][spoiler1][spoiler2]"
					if (arrEnd[0] + 4 > arrBeg[1])
					{
						//"<blur>text</blur>[spoiler0][spoiler1][spoiler2]"
						string = stringStartbdi + ' ' + sArr.substring(0, arrBeg[0]) + ' ' + stringEndbdi + ' ' + sArr.substring(arrBeg[0], l);
						if (this.Debug)
						{
							console.info(string);
						}
						tTitle.innerHTML = string;
						return;
						//case two:one:one:"text1_[spoiler0]_text2_[spoiler1][spoiler2]"
						//"[spoiler0]_text_[spoiler1][spoiler2]":NEVER HAPPEND
					} else
					{
						//"<blur>text1</blur>[spoiler0]<blur>text2</blur>[spoiler1][spoiler2]"
						string = stringStartbdi + ' ' + sArr.substring(0, arrBeg[0]) + ' ' + stringEndbdi + ' ' + sArr.substring(arrBeg[0], arrEnd[0] + 1) + ' ' + stringStartbdi + ' ' + sArr.substring(arrEnd[0] + 1, arrBeg[1]) + ' ' + stringEndbdi + ' ' + sArr.substring(arrEnd[1] + 1, l);
						if (this.Debug)
						{
							console.info(string);
						}
						tTitle.innerHTML = string;
						return;
					}
					//case two:two:"text1_[spoiler0][spoiler1]_text2_[spoiler2]"
				} else if (arrEnd[0] + 4 > arrBeg[1])
				{
					//"<blur>text1</blur>[spoiler0][spoiler1]<blur>text2</blur>[spoiler2]"
					string = stringStartbdi + ' ' + sArr.substring(0, arrBeg[0]) + ' ' + stringEndbdi + ' ' + sArr.substring(arrBeg[0], arrEnd[1] + 1) + ' ' + stringStartbdi + ' ' + sArr.substring(arrEnd[1] + 1, arrBeg[2]) + ' ' + stringEndbdi + ' ' + sArr.substring(arrEnd[2] + 1, l);
					if (this.Debug)
					{
						console.info(string);
					}
					tTitle.innerHTML = string;
					return;
					//case two:two:"text1_[spoiler0]_text2_[spoiler1]_text3_[spoiler2]"
				} else
				{
					//"<blur>text1</blur>[spoiler0]<blur>text2</blur>[spoiler1]<blur>text3</blur>[spoiler2]"
					string = stringStartbdi + ' ' + sArr.substring(0, arrBeg[0]) + ' ' + stringEndbdi + ' ' + sArr.substring(arrBeg[0], arrEnd[0] + 1) + ' ' + stringStartbdi + ' ' + sArr.substring(arrEnd[0] + 1, arrBeg[1]) + ' ' + stringEndbdi + ' ' + sArr.substring(arrBeg[1], arrEnd[1] + 1) + ' ' + stringStartbdi + ' ' + sArr.substring(arrEnd[1] + 1, arrBeg[2]) + ' ' + stringEndbdi + ' ' + sArr.substring(arrBeg[2], l);
					if (this.Debug)
					{
						console.info(string);
					}
					tTitle.innerHTML = string;
					return;
				}
				//case three:"text1_[spoiler0]_text2_[spoiler1]_text3_[spoiler2]_text4"
				//DO I NEED ALL CASES??? TODO!
			} else
			{
				//"<blur>text1</blur>[spoiler0]<blur>text2</blur>[spoiler1]<blur>text3</blur>[spoiler2]<blur>text4</blur>"
				string = stringStartbdi + ' ' + sArr.substring(0, arrBeg[0]) + ' ' + stringEndbdi + ' ' + sArr.substring(arrBeg[0], arrEnd[0] + 1) + ' ' + stringStartbdi + ' ' + sArr.substring(arrEnd[0] + 1, arrBeg[1]) + ' ' + stringEndbdi + ' ' + sArr.substring(arrBeg[1], arrEnd[1] + 1) + ' ' + stringStartbdi + ' ' + sArr.substring(arrEnd[1] + 1, arrBeg[2]) + ' ' + stringEndbdi + ' ' + sArr.substring(arrBeg[2], arrEnd[2] + 1) + ' ' + stringStartbdi + ' ' + sArr.substring(arrEnd[2] + 1, l) + ' ' + stringEndbdi;
				if (this.Debug)
				{
					console.info(string);
				}
				tTitle.innerHTML = string;
				return;
			}

		}
	}

	//second value can be "even" or "odd"
	GetAllIndexes(arr, val1, val2)
	{
		let indexes = [], temp = [], x, i;
		switch (val2)
		{
			case "even":
				for (x = 0; x < arr.length; x++)
					if (arr[x] === val1)
						temp.push(x);
				for (i = 0; i < temp.length; i++)
				{
					if (this.IsEven(i))
					{
						indexes.push(temp[i]);
					}
				}
				break;
			case "odd":
				for (x = 0; x < arr.length; x++)
					if (arr[x] === val1)
						temp.push(x);
				for (i = 0; i < temp.length; i++)
				{
					if (!this.IsEven(i))
					{
						indexes.push(temp[i]);
					}
				}
				break;
			default:
				for (x = 0; x < arr.length; x++)
					if (arr[x] === val1 || arr[x] === val2)
						indexes.push(x);
				break;
		}
		return indexes;
	}

	IsEven(n)
	{
		return n === parseFloat(n) ? !(n % 2) : void 0;
	}

	OptionsUI()
	{
		document.body.insertAdjacentHTML("beforeend", `<div id=btrSettings class='side jAyrXr'><div class=spaser ><div class=sidecontentbox><span class=btr_closeButton>&times</span> \
  <div class=title><h1>Settings of Blur Title Reddit` + GM.info.script.version + `</h1></div>\
  <ul class=content><li> \
  <form> \
  <br> \
  <p>Bluring option:</p>\
  <input type=radio name=title id=btr_showTitle >Show brackets</input><br> \
  <input type=radio name=title id=btr_hideTitle >Hide brackets</input><br><br> \
	<input type=checkbox name=asterisk id=asterisk >Show what between asterisks like brackets</input><br><br> \
  <input type=checkbox name=debug id=debug >Debug</input><br> \
  </form> <br> \
  <button id=btr_hide class=hauwm>Hide Settings</button></li></ul></div></div></div>`);


		//SET UI SETTINGS
		document.getElementById("debug").setAttribute("checked", this.Debug);
		document.getElementById("asterisk").setAttribute("checked", this.asterisk);
		

		if (this.btr_pTitle === true)
		{
			document.getElementById("btr_hideTitle").setAttribute("checked", true);
		} else
		{
			document.getElementById("btr_showTitle").setAttribute("checked", true);
		}

		document.getElementById("btrSettings").style.display = "none";

		//CHANGE SETTINGS BY INTERACT WITH UI
		document.getElementById("debug").addEventListener("click", async (e) =>
		{
			if (btr.Debug === true)
			{
				GM.setValue("btr_debug", false);
				btr.Debug = await GM.getValue("btr_debug");
			} else
			{
				GM.setValue("btr_debug", true);
				btr.Debug = await GM.getValue("btr_debug");
			}

			confirm("Settings has been changed.");
			if (btr.Debug)
			{
				console.log('debug: ' + await GM.getValue("btr_debug") + ' and debug: ' + btr.Debug);
			}
		});

		document.getElementById("asterisk").addEventListener("click", async (e) =>
		{
			if (btr.asterisk === true)
			{
				GM.setValue("btr_asterisk", false);
				btr.asterisk = await GM.getValue("btr_asterisk");
			} else
			{
				GM.setValue("btr_asterisk", true);
				btr.asterisk = await GM.getValue("btr_asterisk");
			}

			confirm("Settings has been changed.");
			if (btr.Debug)
			{
				console.log('btr_asterisk: ' + await GM.getValue("btr_asterisk") + ' and asterisk: ' + btr.asterisk);
			}
		});

		/* TODO!
		document.getElementById("#btr_showTitle").onclick((e) =>
		{
			GM.setValue("btr_GMTitle", false);
			btr_pTitle = await GM.getValue("btr_GMTitle");
			ReplaceOriginalTitles();
			MyFunction();
			alert("Settings has been changed. Now brackets showing.");
			if (debug)
			{
				console.log('btr_GMTitle: ' + await GM.getValue("btr_GMTitle") + ' and btr_pTitle: ' + btr_pTitle);
			}
		});
		

		$("#btr_hideTitle").change(async function ()
		{
			GM.setValue("btr_GMTitle", true);
			btr_pTitle = await GM.getValue("btr_GMTitle");
			ReplaceOriginalTitles();
			MyFunction();
			alert("Settings has been changed. Now brackets hiding.");
			if (debug)
			{
				console.log('btr_GMTitle: ' + await GM.getValue("btr_GMTitle") + ' and btr_pTitle: ' + btr_pTitle);
			}
		});
		*/

		//TODO ???
		//$(".side").append("<div class=spacer><div class=sidecontentbox><div class=title><h1>BLUR TITLE REDDIT</h1></div><ul class=content><li><button id=btr_show >Show settings</button></li></ul></div></div>");
		//console.log(currentLocation.pathname);
		//if (currentLocation.pathname === "/r/Steam")
		//{
		//    $(".debuginfo").after("<p><a id=btr_show style={float=right;}>show settings blur title reddit</a></p>");
		//} else {
		//$(".side").append("<div class=spacer><div class=account-activity-box><p><a id=btr_show >show settings blur title reddit</a></p></div></div>");
		//}

		document.querySelector("div[data-testid='subreddit-sidebar'], div.side").insertAdjacentHTML("beforeend", `<div class=spacer><div class=account-activity-box style=cursor:pointer;><p><a id=btr_show >show settings for blur title reddit</a></p></div></div>`);

		document.getElementById("btr_hide").addEventListener("click", (e) =>
		{
			document.getElementById("btrSettings").style.display = "none";
		});

		document.querySelector(".btr_closeButton").addEventListener("click", (e) =>
		{
			document.getElementById("btrSettings").style.display = "none";
		});

		document.getElementById("btr_show").addEventListener("click", (e) =>
		{
			document.getElementById("btrSettings").style.display = "block";

			if (!document.getElementById("btrSettings").classList.contains("btr_opt"))
				document.getElementById("btrSettings").className += " btr_opt";
		});
	}

	//Start
	//async Methods/Functions GM_VALUE
	async HasValueGM(nameVal, optValue)
	{
		let vals = await GM.listValues();

		if (vals.length === 0)
		{
			if (optValue !== undefined)
			{
				GM.setValue(nameVal, optValue);
				return true;
			} else
			{
				return false;
			}
		}

		if (typeof nameVal !== "string")
		{
			return alert("name of value: '" + nameVal + "' are not string");
		}

		for (let i = 0; i < vals.length; i++)
		{
			if (vals[i] === nameVal)
			{
				return true;
			}
		}

		if (optValue !== undefined)
		{
			GM.setValue(nameVal, optValue);
			return true;
		} else
		{
			return false;
		}
	}
	async DeleteValuesGM(nameVal)
	{
		let vals = await GM.listValues();

		if (vals.length === 0 || typeof nameVal !== "string")
		{
			return;
		}

		switch (nameVal)
		{
			case "all":
				for (let i = 0; i < vals.length; i++)
				{
					if (vals[i] !== "adm")
					{
						GM.deleteValue(vals[i]);
					}
				}
				break;
			case "old":
				for (let i = 0; i < vals.length; i++)
				{
					if (vals[i] === "debug" || vals[i] === "debugA")
					{
						GM.deleteValue(vals[i]);
					}
				}
				break;
			default:
				for (let i = 0; i < vals.length; i++)
				{
					if (vals[i] === nameVal)
					{
						GM.deleteValue(nameVal);
					}
				}
				break;
		}
	}
	async UpdateGM(what)
	{
		var gmVal;

		switch (what)
		{
			case "options":
				gmVal = JSON.stringify(options.values);
				GM.setValue("pp_options", gmVal);
				break;
			default:
				alert("class:Options.UpdateGM(" + what + "). default switch");
				break;
		}
	}
	//async Methods/Functions GM_VALUE
	//End
}

let btr;

window.onload = function ()
{
	btr = new BlurTitleReddit();

	setTimeout(() =>
	{
		btr.Main();
		console.log(btr);
	}, 1000);
};