// ==UserScript==
// @name        gist raw perm HEAD
// @namespace   https://www.hatena.ne.jp/noromanba/
// @description Add permanently HEAD links on Gist. Use for install user.js or load xxx.js with (at)require etc.
// @include     https://gist.github.com/*
// @version     2012.5.1.0.31
// @homepage    https://userscripts.org/scripts/show/130781
// @downloadURL https://userscripts.org/scripts/source/130781.user.js
// @installURL  https://userscripts.org/scripts/source/130781.user.js
// @updateURL   https://userscripts.org/scripts/source/130781.meta.js
// @license     MIT License; http://nrm.mit-license.org/2012
// @copyright   (c) 2012+, noromanba (https://www.hatena.ne.jp/noromanba/)
// @author      noromanba
// @icon        https://upload.wikimedia.org/wikipedia/commons/thumb/4/46/Button_Icon_Orange.svg/32px-Button_Icon_Orange.svg.png
// @icon64      https://upload.wikimedia.org/wikipedia/commons/thumb/4/46/Button_Icon_Orange.svg/64px-Button_Icon_Orange.svg.png
// ==/UserScript==

// [Detail]
// https://gist.github.com/2370972

(function() {
    var raws = document.querySelectorAll('.actions > a');
    if (!raws) return;
    
    var gist = function(rawNode) {
        var raw = rawNode,
            meta = raw.pathname.match(/\/raw\/(\d+)\/\w+\/(.*)/),
            baseurl = 'https://raw.github.com/gist/',
            id = meta[1],
            basename = meta[2];
        return {
            raw: raw,
            id: id,
            name: basename,
            file: {
                name: basename.slice(basename.lastIndexOf('/') + 1),
                type: basename.split('.').length > 1 ? basename.split('.').pop() : 'N/D'
            },
            permalink: baseurl + id + '/'
        };
    };
    
    var files = []; // more smart, into gist{}
    Array.prototype.forEach.call(raws, function(raw) {
        var namedHead = raw.cloneNode(true);
        var g = gist(raw);
        files.push(g);
        
        namedHead.href = g.permalink + g.name;
        namedHead.textContent = 'HEAD(named)';
        namedHead.title = g.name;
        // Fx must be needs 2nd args https://developer.mozilla.org/en/DOM/element.insertBefore
        raw.parentNode.insertBefore(namedHead, null);
    });
    
    // 1st file only (Gist API constrains)
    (function(g) {
        if (g) {
            var head = g.raw.cloneNode(true);
            head.href = g.permalink;
            head.textContent = 'HEAD';
            head.title = g.id + '.txt';
            g.raw.parentNode.insertBefore(head, g.raw.nextSibling);
        }
    })(files[0]);
})();