// ==UserScript==
// @name        Yahoo Team Links
// @author      Kees Cook
// @version     1.1
// @namespace   http://outflux.net/greasemonkey
// @description Adds links to Yahoo Sports NFL Teams when it finds team abbrv.
// @include     http://*fantasysports.yahoo.com/*
// @include     https://*fantasysports.yahoo.com/*
// @include     http://*.fantasysports.yahoo.com/*
// @include     https://*.fantasysports.yahoo.com/*
// @license     GNU General Public License
// ==/UserScript==
(function() {
  window.addEventListener("load", function(e) {
    var team_list = new Array();

    team_list["Ari"] = "http://sports.yahoo.com/nfl/teams/ari";
    team_list["Atl"] = "http://sports.yahoo.com/nfl/teams/atl";
    team_list["Bal"] = "http://sports.yahoo.com/nfl/teams/bal";
    team_list["Buf"] = "http://sports.yahoo.com/nfl/teams/buf";
    team_list["Car"] = "http://sports.yahoo.com/nfl/teams/car";
    team_list["Chi"] = "http://sports.yahoo.com/nfl/teams/chi";
    team_list["Cin"] = "http://sports.yahoo.com/nfl/teams/cin";
    team_list["Cle"] = "http://sports.yahoo.com/nfl/teams/cle";
    team_list["Dal"] = "http://sports.yahoo.com/nfl/teams/dal";
    team_list["Den"] = "http://sports.yahoo.com/nfl/teams/den";
    team_list["Det"] = "http://sports.yahoo.com/nfl/teams/det";
    team_list["GB"]  = "http://sports.yahoo.com/nfl/teams/gnb";
    team_list["Hou"] = "http://sports.yahoo.com/nfl/teams/hou";
    team_list["Ind"] = "http://sports.yahoo.com/nfl/teams/ind";
    team_list["Jac"] = "http://sports.yahoo.com/nfl/teams/jac";
    team_list["KC"]  = "http://sports.yahoo.com/nfl/teams/kan";
    team_list["Mia"] = "http://sports.yahoo.com/nfl/teams/mia";
    team_list["Min"] = "http://sports.yahoo.com/nfl/teams/min";
    team_list["NE"]  = "http://sports.yahoo.com/nfl/teams/nwe";
    team_list["NO"]  = "http://sports.yahoo.com/nfl/teams/nor";
    team_list["NYG"] = "http://sports.yahoo.com/nfl/teams/nyg";
    team_list["NYJ"] = "http://sports.yahoo.com/nfl/teams/nyj";
    team_list["Oak"] = "http://sports.yahoo.com/nfl/teams/oak";
    team_list["Phi"] = "http://sports.yahoo.com/nfl/teams/phi";
    team_list["Pit"] = "http://sports.yahoo.com/nfl/teams/pit";
    team_list["SD"]  = "http://sports.yahoo.com/nfl/teams/sdg";
    team_list["Sea"] = "http://sports.yahoo.com/nfl/teams/sea";
    team_list["SF"]  = "http://sports.yahoo.com/nfl/teams/sfo";
    team_list["StL"] = "http://sports.yahoo.com/nfl/teams/stl";
    team_list["Tam"] = "http://sports.yahoo.com/nfl/teams/tam";
    team_list["Ten"] = "http://sports.yahoo.com/nfl/teams/ten";
    team_list["Was"] = "http://sports.yahoo.com/nfl/teams/was";

    function linkify(textnode,pattern,link) {
        var regex = new RegExp(pattern,'g');
        var span = document.createElement("span");
        var text = textnode.nodeValue;

        // only do the span replacement if we find text
        var spanned = 0;

        // for each text match, build text and links
        regex.lastIndex = 0;
        for (var match = null, lastLastIndex = 0;
             (match = regex.exec(text)); ) {
            if (!spanned) {
                // replace the nextnode with our new span
                textnode.parentNode.replaceChild(span, textnode); 
                spanned = 1;
            }


            // add the text to the right of the match
            span.appendChild(document.createTextNode(text.substring(lastLastIndex,match.index)));

            // attach the linkified-matching text
            var a = document.createElement("a");
            a.setAttribute("href",link);
            a.appendChild(document.createTextNode(match[0]));
            span.appendChild(a);
            
            lastLastIndex = regex.lastIndex;
        }

        if (spanned) {
            // attach any remaining text
            span.appendChild(document.createTextNode(text.substring(lastLastIndex)));
            // what does this do?
            span.normalize();
        }
    }

    // tags we will scan looking for un-hyperlinked urls
    var allowedParents = [
        "span", "td"
//        "abbr", "acronym", "address", "applet", "b", "bdo", "big", "blockquote", "body", 
//        "caption", "center", "cite", "code", "dd", "del", "div", "dfn", "dt", "em", 
//        "fieldset", "font", "form", "h1", "h2", "h3", "h4", "h5", "h6", "i", "iframe",
//        "ins", "kdb", "li", "object", "pre", "p", "q", "samp", "small", "span", "strike", 
//        "s", "strong", "sub", "sup", "td", "th", "tt", "u", "var"
        ];
    nodes = document.evaluate(
        '//text()[parent::' + allowedParents.join(" or parent::") + ']',
        document,
        null,
        XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
        null);
    for (var i = 0; i < nodes.snapshotLength; i++) {
        for (var team_display in team_list) {
            linkify(nodes.snapshotItem(i),
                    '\\b'+team_display+'\\b',
                    team_list[team_display]);
        }
    }
    //alert("Searched "+nodes.snapshotLength+" text nodes");
  }, false);
})();

