Greasy Fork is available in English.

GameFAQs Post and Track

Enables option to automatically track a topic when you post a new message

// ==UserScript==
// @name        GameFAQs Post and Track
// @namespace   OTACON120
// @author      OTACON120
// @version     1.0
// @description Enables option to automatically track a topic when you post a new message
// @website     http://otacon120.com/scripts/post-and-track
// @include     http://www.gamefaqs.com/boards/*-*
// @include     http://www.gamefaqs.com/boards/post.php?*
// @match       http://www.gamefaqs.com/boards/*-*
// @match       http://www.gamefaqs.com/boards/post.php?*
// @grant       GM_addStyle
// ==/UserScript==

/**
 * Fallback for Chrome which doesn't support GM_addStyle
 */
if ( !this.GM_addStyle ) {
	this.GM_addStyle = function(css) {
		var newStyle = document.createElement('style');

		newStyle.type        = 'text/css';
		newStyle.textContent = css;

		document.head.appendChild(newStyle);
	}
}

/**
 * Get specified CSS property value
 * @param  {node}   el        HTML Element from which to grab CSS
 * @param  {string} styleProp CSS property to grab
 * @return {string}           Value of CSS property
 */
function getStyle(el, styleProp) {
	return document.defaultView.getComputedStyle(el, null).getPropertyValue(styleProp)
}

/**
 * Get Board/Topic IDs on Post New Message page
 * @param  {string} name    Query string attribute to return
 * @return {string|boolean} Returns query string value if it exists, else returns false
 */
function getQueryValue( name ) {
	name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");

	var regexS = "[\\?&]" + name + "=([^&#]*)",
		regex = new RegExp( regexS ),
		results = regex.exec( window.location.search );

	if ( results === null ) {
		return false;
	} else {
		return results[1];
	}
}

if ( document.getElementsByName( 'messagetext' ).length > 0 ) {
	var userOS, userBrowser, userBrowserVersion, trackedStatusReq, trackedStatus,
		trackBtn      = document.contains( document.getElementsByClassName( 'board_nav' )[0] ) ? document.getElementsByClassName( 'board_nav' )[0].getElementsByClassName( 'icon-flag' )[0].parentNode : false,
		spacer        = document.createTextNode( ' ' ),
		postTrackBtn  = document.createElement( 'button' ),
		postForm      = document.getElementById('content').querySelector('.span8 > form .pod .body .details, .span8 > .body form .pod .body .details'),
		postBtn       = postForm.querySelector( 'input[type="submit"]' ),
		trackLink     = document.getElementsByName( 'qp' ).length > 0 ? trackBtn.href : window.location.protocol + '//' + window.location.hostname + '/boards/' + getQueryValue( 'board' ) + '-/' + getQueryValue( 'topic' ) + '?action=tracktopic',
		BrowserDetect = {
			init: function () {
				this.browser = this.searchString(this.dataBrowser) || "An unknown browser";
				this.version = this.searchVersion(navigator.userAgent)
					|| this.searchVersion(navigator.appVersion)
					|| "an unknown version";
				this.OS = this.searchString(this.dataOS) || "an unknown OS";
			},
			searchString: function (data) {
				var i,
					dataString,
					dataString;
				for (i = 0; i < data.length; i++)	{
					dataString = data[i].string;
					dataProp = data[i].prop;
					this.versionSearchString = data[i].versionSearch || data[i].identity;
					if (dataString) {
						if (dataString.indexOf(data[i].subString) != -1)
							return data[i].identity;
					}
					else if (dataProp)
						return data[i].identity;
				}
			},
			searchVersion: function (dataString) {
				var index = dataString.indexOf(this.versionSearchString);
				if (index == -1) return;
				return parseFloat(dataString.substring(index+this.versionSearchString.length+1));
			},
			dataBrowser: [
				{
					string: navigator.userAgent,
					subString: "Waterfox",
					identity: "Firefox"
				},
				{
					string: navigator.userAgent,
					subString: "Firefox",
					identity: "Firefox"
				},
				{
					string: navigator.userAgent,
					subString: "Chrome",
					identity: "Chrome"
				}
			],
			dataOS : [
				{
					string: navigator.platform,
					subString: "Win",
					identity: "Windows"
				},
				{
					string: navigator.platform,
					subString: "Mac",
					identity: "Mac"
				},
				{
					string: navigator.platform,
					subString: "Linux",
					identity: "Linux"
				}
			]
		};

	/**
	 * Get tracked status of topic if not viewing message list
	 */
	if ( ! trackBtn ) {
		trackedStatusReq        = new XMLHttpRequest();
		trackedStatusReq.onload = function() {
			if ( this.status === 200 ) {
				var responseContain = document.createElement( 'div' );

				responseContain.style.display = 'none';
				responseContain.innerHTML     = this.responseText;
				document.body.appendChild( responseContain );

				trackBtn = responseContain.getElementsByClassName( 'board_nav' )[0].getElementsByClassName( 'icon-flag' )[0].parentNode;

				if ( trackBtn.href.indexOf( '?action=tracktopic' ) !== -1 ) {
					trackedStatus = false;
				} else if ( trackBtn.href.indexOf( '?action=stoptrack' ) ) {
					trackedStatus = true;
				}

				trackBtn = false;
			}
		};
		trackedStatusReq.open( 'get', trackLink.replace( '?action=tracktopic', '' ), false );
		trackedStatusReq.send();
	}

	if ( ( trackBtn && trackBtn.textContent.trim() === 'Track Topic' ) || ( ! trackBtn && ! trackedStatus ) ) {
		BrowserDetect.init();

		userOS				= BrowserDetect.OS;
		userBrowser			= BrowserDetect.browser;
		userBrowserVersion	= BrowserDetect.version + (BrowserDetect.version.toString().indexOf('.') === -1 ? '.0' : '');

		if (userOS === 'Windows' || userOS === 'Linux') {
			switch (userBrowser) {
				case 'Firefox':
					akHotkey = 'Alt + Shift + ';
					break;

				case 'Chrome':
					akHotkey = 'Alt + ';
					break;
			}
		}

		if (userOS === 'Mac') {
			switch (userBrowser) {
				case 'Firefox':
					akHotkey = !versionNewer(userBrowserVersion, '13.0') ? 'Ctrl + ' : 'Ctrl + Alt + ';
					break;

				case 'Chrome':
					akHotkey = 'Ctrl + Alt + ';
			}
		}

		GM_addStyle('\
		#o120-post-track {\
			line-height: ' + getStyle( postBtn, 'line-height' ) + ';\
		}');

		postTrackBtn.setAttribute( 'accesskey', 's' );
		postTrackBtn.className  = 'btn btn_primary';
		postTrackBtn.id         = 'o120-post-track';
		postTrackBtn.type       = 'submit';
		postTrackBtn.name       = 'post';
		postTrackBtn.value      = 'Post without Preview';
		postTrackBtn.title      = 'Post Message, Track Topic [' + akHotkey + 'S]';
		postTrackBtn.innerHTML  = '<i class="icon icon-flag"></i> Post Message, Track Topic';
		postTrackBtn.onclick    = function() {
			var startTrackReq = new XMLHttpRequest();

			startTrackReq.onload = function() {
				if ( this.status === 200 ) {
					postTrackBtn.onclick = '';
					postTrackBtn.click();
				}
			}
			startTrackReq.open( 'get', trackLink, false );
			startTrackReq.send();
			return false;
		}

		postForm.insertBefore( postTrackBtn, postBtn );
		postForm.insertBefore( spacer, postBtn );
	}
}