Gamefaqs Quick PM and Quick Edit

PM and edit from within topic in gamefaqs

As of 2014-05-02. See the latest version.

You will need to install an extension such as Tampermonkey, Greasemonkey or Violentmonkey to install this script.

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

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

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

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

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

(I already have a user script manager, let me install it!)

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.

(I already have a user style manager, let me install it!)

// ==UserScript==
// @name       Gamefaqs Quick PM and Quick Edit
// @namespace  N-eil
// @version    0.8
// @description  PM and edit from within topic in gamefaqs 
// @include *.gamefaqs.com/boards/*
// @grant		none
// ==/UserScript==

if(document.getElementsByName('key').length) // Looks for the key, which is only included on the page if quickpost is available. Without the key, nothing in this script works, so the buttons are not added.
											// There doesn't seem to be a realistic fix for this.  
{
    var username = $(".board_nav:first a:first").html();
    username = username.substring(0,username.indexOf('(')-1);
    
    var $details = $(".msg_stats_left")
    ,	displayLeft = true;
    
    if (!$details.length){ //If nothing was found, they must have user details displayed above the message
        $details = $(".msg_stats");
        displayLeft = false;
    }
    
    $details.each(function(index, el) {
        var $el = $(el);
        if ($el.html().match(username))
        { //Ones with your username in them are your posts, and can be edited
            var editLink = $("<a> Edit </a>");
            editLink.click(function() {
                if (displayLeft)
                    showEditWindow($(el).closest(".msg").find(".msg_body").clone());
                else
                    showEditWindow($(el).closest(".top").next().find(".msg_body").clone());
            });
            $el.append(editLink);
        }
        else 
        { //Other ones are posts from other users, and they can be PM'd 
            var pmLink = $("<a> PM </a>");   
            pmLink.click(function() {showPMWindow($el.find("a.name").html());});
            $el.append(pmLink);
        }
            
    });
}

function replaceButtons(){} //Placeholder function, modified when the edit window appears to replace the buttons in the relevant place

function createPopup(text){
    replaceButtons();
	$("#popup-window").remove();
	var $window = $("<div id='popup-window'> " + text + " </div>")
		.css("left", "30%")
		.css("top","30%")
		.css("position", "fixed")
		.toggleClass("reg_dialog", true);
    $("body").prepend($window);
	return $window; 
}

function showPMWindow(name) {
    var $PMWindow = createPopup("Send a PM to " + name)
    ,   $subject = $("<div>Subject: <input type='text' maxlength='100' /></div>")
    ,   $message = $("<div><textarea rows ='" + Math.floor($(window).height() / 45) + "' cols='80' maxlength='1024'></textarea></div>");
    
    var $send = $("<button style='margin: 5px;'>Send</button>").click(function() {sendPM(name, $subject.find("input").val(), $message.find("textarea").val()); setTimeout(function() {$PMWindow.remove();},5000);})
    ,   $cancel = $("<button style='margin: 5px;'>Cancel</button>").click(function() {$PMWindow.remove();});
    
    $PMWindow.append($subject).append($message).append($send).append($cancel);
}

function sendPM(name, subject, message) {
    var key = document.getElementsByName( 'key' )[0].value ; //A key unique to users required to post/PM
    name = name.slice(3,-4);
    $.post('/pm/new', {key: key, to: name, subject: subject, message: message, submit: 'Quick PM'}).done(function(){$("#popup-window textarea").val("PM sent.");});
}

function showEditWindow(message) {
        
    function stripTags(index, el) {
        //Function to strip out tags like links, TTI images, etc from the message.
            var $el = $(el);
            console.log(el);
            if ($el.hasClass("fspoiler"))  //Things hidden in spoilers get this class, but should be turned back into tags
                $el.replaceWith("<spoiler>" + $el.html() + "</spoiler>");
            else if ($el.is("img"))
                $el.replaceWith($el.attr("src"));
            else
                $el.replaceWith($el.html());
    }

    
    //Parse the HTML message back into the way it looks while a user is typing
    message.html(message.html().replace(/<br>(?:<\/br>)?/g, '\n'));
    var tags = [1];
    while (tags.length) {
        tags = message.find("a, span, img, video");
        tags.each(stripTags);
    }
    var reg = /\/(\d+)/g //Makes a regex to get board and message ID from the url
    ,	boardID = reg.exec(location.href)[1]
    ,	topicID = reg.exec(location.href)[1]
    ,	messageID = message.attr("name")
    ,	$editWindow = createPopup("Edit your post")
    ,   $message = $("<div><textarea rows ='" + Math.floor($(window).height() / 45) + "' cols='80' maxlength='4096' name='messagetext'>" + message.html() + "</textarea></div>") //Height of textbox based roughly off height of screen, nothing exact but should ensure all the buttons are visible
    ,	$send = $("<button style='margin: 5px;'>Send</button>").click(function() {makeEdit($message.find("textarea").val(), boardID, topicID, messageID);})
    ,   $cancel = $("<button style='margin: 5px;'>Cancel</button>").click(function() {replaceButtons(); $editWindow.remove(); window.msgArea = document.getElementsByName('messagetext')[0];})
    ,	$buttons = $(".tagbuttons");
    
    if (!$buttons.length) //Either gameweasel or gamefox has replaced the html buttons with their own, so fetch those instead
        $buttons = $("#gamefox-html-buttons");
    
    var $buttonHolder = $buttons.prev();
    replaceButtons = function() {$buttonHolder.after($buttons);}; //Fills in the placeholder to replace the desired buttons, called either on cancelling the edit or when you edit another post
    $editWindow.append($("</br>")).append($buttons).append($message).append($send).append($cancel);
    window.msgArea = document.getElementsByName('messagetext')[0];

}

function makeEdit(message, board, topic, ID) {
    var url = "/boards/post.php?board=" + board + "&topic=" + topic + "&message=" + ID 
    ,	key = document.getElementsByName( 'key' )[0].value ; //A key unique to users required to post/PM
    $.post(url, {key: key, messagetext: message, post: 'Post without Preview'}).done(function() {location.reload();}).fail(function() {$("#popup-window textarea").val("Could not edit the post.  Are you sure you are within the 1 hour timeframe for edits?");});
}