// ==UserScript==
// @name         Tag list
// @namespace    http://stackapps.com/questions/4207/burninator-toolkit
// @author       Will Sullivan (Will)
// @developer    David Bingham (Mogsdad)
// @version      1.2.7
// @grant        none
// @description  Adds an expandable list containing a link to every question on the current tag page.  Useful when you want to open many questions with the same tag at the same time.
// @include      /^https?://\w*.?(stackoverflow|stackexchange|serverfault|superuser|askubuntu|stackapps)\.com/((questions/(new|popular|need-answers)|search).*)?/
// ==/UserScript==

var runTagList = tagList();

$(document).ajaxComplete(tagList);

function tagList() {
    // If list already present, quit.
    if ($('.linkylist').length) return;
    
    var App = {};

    userscriptCSS();
        
    // Locate the element containing list of posts.
    App.linkytarget = $('.question-summary').parent();

    // re-sort list; move all the already handled cruff to the top
    $.each(["closed", "on hold", "migrated", "duplicate"], function(index) {
        App.items = $('.question-summary .summary:contains(' + this + ')');
        App.items.closest('.question-summary').detach().appendTo(App.linkytarget);
    });

    // get all the hrefs
    App.root = App.linkytarget;
    App.hrefs = App.root.find('.question-hyperlink,.result-link');  // .result-link on searches, .question-hyperlink everywhere else
    if (App.hrefs.length === 0) {
        console.log("No post hyperlinks found");
        return;
    }

    App.listroot = $('<div class="linkylist"/>');
    App.listhead = $('<p class="linkyhead">Click here to <span id="linkyaction">open</span> a list of all links on this page</p>');
    App.listbody = $('<div class="linkybody"/>');
    App.linkytarget.before(App.listroot);
    App.listroot.prepend(App.listbody);
    App.listroot.prepend(App.listhead);
    App.listbody.hide();
    App.listhead.click(function() {
        App.listbody.slideToggle(600);
        $('#linkyaction').text(function (index, text) {
           return (text == 'open' ? 'close' : 'open');
        });
    });
    // note that when you click a link it gets removed from the list.  
    App.hrefs.each(function() {
        App.parent = $('<span class="linkeyspan"/>');
        App.linkey = $(this).clone().attr('target', '_blank');
        App.linkey.click(function() {
            $(this).closest('.linkeyspan').remove();
        });
        App.parent.prepend(App.linkey);
        App.parent.prepend($('<br/>'));
        App.listbody.prepend(App.parent);
    });

    /**
     * Define "CSS" for this user script
     */
    function userscriptCSS() {
        addCss(
            '.linkylist {margin: 0px;padding: 0px;}' +
            '.linkyhead {text-align: right;padding: 5px 10px;cursor: pointer;position: relative;background-color:#FFCCCC;margin:1px;}' +
            '.linkybody {padding: 5px 10px 15px;background-color:#F4F4F8;}'
        );
    }

    /**
     * Stuff string of styles into doc head.
     */
    function addCss(cssString) {
        var head = document.getElementsByTagName('head')[0];
        if (!head) return;
        var newCss = document.createElement('style');
        newCss.type = "text/css";
        newCss.innerHTML = cssString;
        head.appendChild(newCss);
    }    
}