// ==UserScript==
// @name			鳴叫!
// @namespace		https://noctis.im
// @version	  		0.2.1
// @description		将您 Twitter 網頁版的“推文”按鈕改爲“鳴叫!”。
// @author			Blair Noctis
// @match			https://twitter.com/*
// @match			https://mobile.twitter.com/*
// @match			https://tweetdeck.twitter.com/*
// @grant			window.onurlchange
// @downloadURL		https://raw.githubusercontent.com/bnoctis/tweet-button-userscript/main/%E9%B3%B4%E5%8F%AB%EF%BC%81.user.js
// ==/UserScript==

(function() {
	'use strict'

	var text = '鳴叫!'

	var $ = document.querySelector.bind(document)
	var sidebarTweetButtonSelector = 'a[data-testid="SideNav_NewTweet_Button"]'
	var sidebarTweetButtonSpanSelector = sidebarTweetButtonSelector + ' span'
	var inlineTweetButtonSpanSelector = 'div[data-testid="tweetButtonInline"] span'
	var modalTweetButtonSpanSelector = 'div[data-testid="tweetButton"] span'
	var tweetDeckCTAButtonSelector = 'button.js-show-drawer.tweet-button'
	var tweetDeckCTAButtonSpanSelector = 'span[data-test-id="tweet-call-to-action"]'
	var tweetDeckSendButtonSelector = 'button.js-send-button'

	var sidebarButtonListener

	var periodicInterval = 100
	var totalRunCount = 0

	var sidebarChanged = false
	var inlineChanged = false
	var modalChanged = false

	function reset() {
		sidebarChanged = inlineChanged = modalChanged = false
	}

	function 鳴叫() {
		console.log('[鳴叫!] replacement run #' + (++totalRunCount).toString())
		/* 行動版 Twitter 網頁只在發推頁面有一個“推文”按鈕 */
		if(window.location.hostname === 'mobile.twitter.com' && window.location.pathname !== '/compose/tweet') return
		if(window.location.hostname === 'tweetdeck.twitter.com') {
			var tweetDeckCTAButton = $(tweetDeckCTAButtonSelector)
			if(!tweetDeckCTAButton) return setTimeout(鳴叫, periodicInterval)
			$(tweetDeckCTAButtonSpanSelector).textContent = text
			tweetDeckCTAButton.addEventListener('click', () => {
				var i = setInterval(() => {
					var tweetDeckSendButton = $(tweetDeckSendButtonSelector)
					if(tweetDeckSendButton) {
						tweetDeckSendButton.textContent = text
						clearInterval(i)
					}
				}, periodicInterval)
			})
			return
		}
		var sidebarButton = $(sidebarTweetButtonSelector)
		var sidebarSpan = $(sidebarTweetButtonSpanSelector)
		var inlineSpan = $(inlineTweetButtonSpanSelector)
		var modalSpan = $(modalTweetButtonSpanSelector)
		if(sidebarButton !== null && sidebarSpan.textContent !== text) {
			sidebarSpan.textContent = text
			sidebarChanged = true
			if(!sidebarButtonListener) {
				sidebarButtonListener = sidebarButton.addEventListener('click', function() {
					console.log('[鳴叫!] 侧栏按鈕按下,開始替換過程')
					setTimeout(鳴叫, periodicInterval)
				})
			}
		}
		if(inlineSpan !== null && inlineSpan.textContent !== text) {
			inlineSpan.textContent = text
			inlineChanged = true
		}
		if(modalSpan !== null && modalSpan.textContent !== text) {
			modalSpan.textContent = text
			modalChanged = true
		}

		if(window.location.pathname === '/compose/tweet') {
			if(modalChanged) return console.log('[鳴叫!] modal 框按鈕替換完成')
			else return setTimeout(鳴叫, periodicInterval)
		} else if(window.location.pathname === '/home') {
			if(inlineChanged) return console.log('[鳴叫!] inline 框按鈕替換完成')
			else return setTimeout(鳴叫, periodicInterval)
		}
		if(sidebarSpan && sidebarSpan.textContent === text) sidebarChanged = true
		if(sidebarChanged) { return }
		setTimeout(鳴叫, periodicInterval)
	}

	if(window.onurlchange || window.onurlchange === null) {
		window.addEventListener('urlchange', () => {
			console.log('[鳴叫!] URL 變化,開始替換過程')
			reset()
			鳴叫()
		})
	}

	鳴叫()
})()