// ==UserScript==
// @name           Splitview
// @namespace      splitview
// @description    Adds links to most news websites to allow easy viewing of story and comments side by side. Works for Hacker News, Reddit, Digg and Techcrunch.
// @include        http://news.ycombinator.com/*
// @include        http://www.reddit.com/*
// @include        http://digg.com/*
// @include        http://www.techcrunch.com/*
// @include        http://www.undrln.com/*
// @include        http://undrln.com/*
// @include        http://www.google.com/reader/view/*
// ==/UserScript==


var SPLITTER_URL = "http://nirmalpatel.com/splitview/splitview.html#";
var LINK_INNARDS = document.createTextNode("SPLIT VIEW");

var _timer = null;
var called = false;

String.prototype.trim = function() {
    return this.replace(/^\s+|\s+$/g,"");
}

function HN_findLinks() {
    var tds = document.getElementsByTagName("td");
    var article = null;
    var discuss = null;

    var splittable = new Array();
    
    for (var i=0; i < tds.length; i++) {
        var td = tds[i];
        if (td.className == "title") {
            if (td.firstChild.href) {
                article = td.firstChild.href;
            }
        } else if (td.className == "subtext") {
            
            for (var c=0; c < td.childNodes.length; c++) {
                var child = td.childNodes[c];
                if (child.href && (child.href.indexOf("http://news.ycombinator.com/item?") == 0)) {
                    discuss = child.href;
                }
            }
            
            if (article && discuss  && (article != discuss)) {
                var split = new Array(0);
                split.push(article);
                split.push(discuss);
                split.push(td);
                splittable.push(split);
            }
            
            article = discuss = holder = null;
        }
    }
    
    return splittable;
}

function Reddit_findLinks() {
    var as = document.getElementsByTagName("a");
    var article = null;
    var discuss = null;
    var splittable = new Array();
        
    for (var i=0; i < as.length; i++) {
        var a = as[i];
        if (a.className.trim().indexOf("title") == 0) {
            article = a.href;
        } else if (a.className.trim() == "comments") {
            discuss = a.href;
            if (article && discuss && (article != discuss)) {
                var split = new Array(0);
                split.push(article);
                split.push(discuss);
                split.push(a.parentNode);
                splittable.push(split);
                article = discuss = null;
            }
        }
    }
    
    return splittable;
}

function Digg_findLinks() {
    var as = document.getElementsByTagName("a");
    var article = null;
    var discuss = null;
    var splittable = new Array();
        
    for (var i=0; i < as.length; i++) {
        var a = as[i];
        if (a.className.trim().indexOf("offsite") == 0) {
            article = a.href;
        } else if (a.className.trim() == "tool comments") {
            discuss = a.href;
            if (article && discuss && (article != discuss)) {
                var split = new Array(0);
                split.push(article);
                split.push(discuss);
                split.push(a.parentNode);
                split.push(createLink(article, discuss, "tool"));
                splittable.push(split);
                article = discuss = null;
            }
        }
    }
    
    return splittable;
}

function TC_findLinks() {
    var divs = document.getElementsByTagName("div");
    var article = null;
    var discuss = null;

    var splittable = new Array();

    for (var d=0; d < divs.length; d++) {
        var postDiv = divs[d];
        if (postDiv.className == "post") {
            for (var c=0; c < postDiv.childNodes.length; c++) {
                var child = postDiv.childNodes[c];
                if (child.tagName == "H1") {
                    article = child.firstChild.href;
                } else if (child.tagName == "H4") {
                    discuss = child.firstChild.href;
                    var split = new Array(0);
                    split.push(article);
                    split.push(discuss);
                    split.push(child);
                    splittable.push(split);
                    article = discuss = null;
                }
            }
        }
    }
    
    return splittable;
}

function Undrln_findLinks() {
    var divs = document.getElementsByTagName("div");
    var article = null;
    var discuss = null;
    var splittable = new Array();

    for (var i=0; i < divs.length; i++) {
        var d = divs[i];
        if (d.className == "offset") {            
            var as = d.getElementsByTagName("a");
            for (var j=0; j < as.length; j++) {
                var a = as[j];
                if (a.parentNode.tagName == "H2") {
                    article = a.href;
                }
                else if (a.className == "comment_comments") {
                    discuss = a.href;
                }
                if (article && discuss) {
                    var split = new Array(0);
                    split.push(article);
                    split.push(discuss);
                    split.push(a.parentNode);
                    split.push(createLink(article, discuss));
                    splittable.push(split);
                    article = discuss = null;
                }
            }
        }
    }
    
    return splittable;
}

var _timer = null;
function Reader_checkLoaded(timeToWait) {
    called = false;
    _timer = setInterval(function() {
        var entryHolder = document.getElementById("entries");
        if (entryHolder.childNodes.length > 1) {
            addSplitview(); // call the onload handler
            if (_timer) clearInterval(_timer);
        }}, 
        timeToWait);
    }

function Reader_findLinks() {

    var article = null;
    var discuss = null;
    var splittable = new Array();

    var entryHolder = document.getElementById("entries");
    if (entryHolder.childNodes.length == 1) {
        Reader_checkLoaded(20);
    } else {
        entryHolder.addEventListener("onscroll", Reader_checkLoaded(20));
        var divs = entryHolder.getElementsByTagName("div");
        for (var i=0; i < divs.length; i++) {
            var d = divs[i];
            if (d.className == "entry-main") {
                var as = d.getElementsByTagName("a");
                for (var j=0; j < as.length; j++) {
                    var a = as[j];
                    if (a.className == "entry-title-link") {
                        article = a.href;
                    } else if (a.innerHTML == "Comments") {
                        discuss = a.href;
                    }
                    if (article && discuss) {
                        var split = new Array(0);
                        split.push(article);
                        split.push(discuss);
                        split.push(a.parentNode);
                        split.push(createLink(article, discuss));
                        splittable.push(split);
                        article = discuss = null;
                        d.className = "entry-main splitviewed";
                    }
                }
            }
        }
    }
    
    return splittable;    
}

var findLinks = {
    "HN"     : HN_findLinks,
    "Reddit" : Reddit_findLinks,
    "Digg"   : Digg_findLinks,
    "TC"     : TC_findLinks,
    "undrln" : Undrln_findLinks,
    "reader" : Reader_findLinks
}


function siteKey() {
    var host = location.host;
    if (host == "news.ycombinator.com") {
        return "HN";
    } else if (host == "www.reddit.com") {
        return "Reddit";
    } else if (host == "digg.com") {
        return "Digg";
    } else if (host == "www.techcrunch.com") {
        return "TC";
    } else if (host == "www.undrln.com") {
        return "undrln";
    } else if (host == "undrln.com") {
        return "undrln";
    } else if (location.href.indexOf("http://www.google.com/reader/view/#stream/") == 0) {
        return "reader";
    }
    return null;
}



function createLink(article, discuss, cssClass) {
    var s = document.createElement("span");
    s.appendChild(document.createTextNode(" | "));
    var a = document.createElement("a");
    a.href = SPLITTER_URL + "a=" + encodeURIComponent(article) + "&d=" + encodeURIComponent(discuss);
    a.appendChild(LINK_INNARDS.cloneNode(true));
    if (cssClass) {
        s.className = cssClass;
    }
    s.appendChild(a);
    return s;
}

function addSplitview() {
    if (called) return;
    called = true;
    var key = siteKey();
    if (findLinks[key]) {
        var splittables = (findLinks[key])();
        for (var s=0; s < splittables.length; s++) {
            var link = splittables[s][3];
            if (!link) {
                link = createLink(splittables[s][0], splittables[s][1])
            }
            splittables[s][2].appendChild(link);
        }
    }
}

/* for Safari */
if (/WebKit/i.test(navigator.userAgent)) { // sniff
    _timer = setInterval(function() {
        if (/loaded|complete/.test(document.readyState)) {
            addSplitview(); // call the onload handler
            if (_timer) clearInterval(_timer);
        }}, 10);
    }

window.addEventListener('load', addSplitview, true);
