// $Id: HatenaStarTrac.js 5418 2008-01-24 10:36:44Z drry $
// vim:expandtab:
//
// Options:
//
//  * Hatena.Star.EntryLoader.DisableTracTimeline
//  * Hatena.Star.EntryLoader.DisableTracBrowser
//  * Hatena.Star.EntryLoader.DisableTracBrowserDirList
//  * Hatena.Star.EntryLoader.DisableTracBrowserSourceCode
//  * Hatena.Star.EntryLoader.DisableTracChangeset
//  * Hatena.Star.EntryLoader.DisableTracRevisionLog
//
Hatena.Star.EntryLoader.loadEntries = function () {
    var entries = [];

    var content = document.getElementById('content');
    if (content == null)
        return;

    // timeline
    if (!Hatena.Star.EntryLoader.DisableTracTimeline && content.className == "timeline") {
        var elements = Ten.DOM.getElementsByTagAndClassName('dt', 'changeset', document.body);
        for (var i = 0, l = elements.length; i < l; i++) {
            entries.push(new Hatena.Star.Entry.TracTimeline(elements[i]));
        }
    }

    // browser
    else if (!Hatena.Star.EntryLoader.DisableTracBrowser && content.className == "browser") {
        SavingStarSpace();

        // dir list
        if (!Hatena.Star.EntryLoader.DisableTracBrowserDirList) {
            elements = Ten.DOM.getElementsByTagAndClassName('td', 'name', document.body);
            if (elements.length > 0) {
                var thead = document.getElementById('dirlist').getElementsByTagName('thead')[0];
                var tr = thead.getElementsByTagName('tr')[0];
                var th = document.createElement('th');
                th.className = 'hatenastar';
                tr.appendChild(th);

                for (var i = 0, l = elements.length; i < l; i++) {
                    entries.push(new Hatena.Star.Entry.TracBrowserDirList(content, elements[i]));
                }

            }
        }

        entries.push(new Hatena.Star.Entry.TracBrowser(content));

/* ソースコードの行ごとはてなスター解除
        // source code
        if (!Hatena.Star.EntryLoader.DisableTracBrowserSourceCode) {
            // info
            var info = document.getElementById('info');
            if (info != null) {
                entries.push(new Hatena.Star.Entry.TracBrowserSourceLog(info));
            }
            // code lines
            var preview = document.getElementById('preview');
            if (preview != null) {
                var codeTable = Ten.DOM.getElementsByTagAndClassName('table', 'code', preview);
                if (codeTable != null && codeTable.length > 0) {
                    var lines = codeTable[0].getElementsByTagName('th');
                    for (var i = 1, n = lines.length; i < n; i++) {
                        if (/^L\d+/.test(lines[i].id)) {
                            entries.push(new Hatena.Star.Entry.TracBrowserCode(content, lines[i], info));
                        }
                    }
                }
            }
        }
*/
    }

    // changeset
    else if (!Hatena.Star.EntryLoader.DisableTracChangeset && content.className == "changeset") {
        entries.push(new Hatena.Star.Entry.TracChangeset(content));
    }

    // revision log
    else if (!Hatena.Star.EntryLoader.DisableTracRevisionLog && content.className == "log") {
        SavingStarSpace();

        var th = Ten.DOM.getElementsByTagAndClassName("th", "chgset", content)[0];
        // th.style.width = th.offsetWidth + 20 + "px";
        var chgsets = Ten.DOM.getElementsByTagAndClassName("td", "chgset", content);
        for (var i = 0, len = chgsets.length; i < len; i++) {
            var td = chgsets[i];
            entries.push(new Hatena.Star.Entry.TracRevisionLog(td));
            // td.style.width = td.offsetWidth + 20 + "px";
        }
    }

    // wiki
    else if (!Hatena.Star.EntryLoader.DisableTracChangeset && content.className == "wiki") {
        // entries.push( new Hatena.Star.Entry.TracWiki( document.getElementById('wiki-hatena-star') ) );

        for ( var i = 1; i < 7; i++ ) {
            var tagName = 'h'+i;
            var elements = content.getElementsByTagName(tagName);
            for (var j = 0, l = elements.length; j < l; j++) {
                entries.push(new Hatena.Star.Entry.TracWiki(elements[j]));
            }
        }
    }

    return entries;


    function SavingStarSpace () {
        var orig_bindStarEntry = Hatena.Star.Entry.prototype.bindStarEntry;
        Hatena.Star.Entry.prototype.bindStarEntry = function (se) {
            // If called from InnerCount JSONP, pass this.
            if (!this.starEntry && se.stars.length > 1) {
                var count = 0;
                for (var i = 0, l = se.stars.length; i < l; i++) {
                    if (typeof se.stars[i] == "number") {
                        count += se.stars[i];
                    } else {
                        count++;
                    }
                }
                se.stars = [se.stars[0], count-1];
            }
            orig_bindStarEntry.call(this, se);
        };
    }
}

Hatena.Star.Entry.TracBrowserCode = new Ten.Class({
    initialize: function(content, th, infoTable) {
        var rev;
        var h1 = content.getElementsByTagName('h1')[0];
        var a = th.getElementsByTagName('a')[0];
        var href = a.href;
        if (infoTable) {
            var infoTh = infoTable.getElementsByTagName('th')[0];
            var aInTh = infoTh.getElementsByTagName('a')[0];
            rev = Ten.DOM.scrapeText(aInTh);
            if (!/\?rev=\d+/.test(href)) {
                href = href.replace(/#/, '?rev='+rev+'#');
            }
        }

        this.title = Ten.DOM.scrapeText(h1) + ' (Line: ' +Ten.DOM.scrapeText(a) + (rev ? '/ Rev: '+rev : '') + ')';
        this.uri = href;

        this.comment_container = Hatena.Star.EntryLoader.createCommentContainer();
        th.appendChild(this.comment_container);
        this.star_container = Hatena.Star.EntryLoader.createStarContainer();
        th.appendChild(this.star_container);
    }
});

Hatena.Star.Entry.TracChangeset = new Ten.Class({
    initialize: function(content) {
        var h1 = content.getElementsByTagName('h1')[0];
        this.title = Ten.DOM.scrapeText(h1);
        this.uri = window.location;

        this.comment_container = Hatena.Star.EntryLoader.createCommentContainer();
        h1.appendChild(this.comment_container);
        this.star_container = Hatena.Star.EntryLoader.createStarContainer();
        h1.appendChild(this.star_container);
    }
});

Hatena.Star.Entry.TracTimeline = new Ten.Class({
    initialize: function(dt) {
        var a = dt.getElementsByTagName('a')[0];
        this.title = Ten.DOM.scrapeText(a);
        this.uri = a.href;

        this.comment_container = Hatena.Star.EntryLoader.createCommentContainer();
        dt.nextSibling.appendChild(this.comment_container);
        this.star_container = Hatena.Star.EntryLoader.createStarContainer();
        dt.nextSibling.appendChild(this.star_container);
    }
});

Hatena.Star.Entry.TracBrowser = new Ten.Class({
    initialize: function(content) {
        var h1 = content.getElementsByTagName('h1')[0];
        var a = h1.getElementsByTagName('a');
        a = a[a.length - 1];
        this.title = Ten.DOM.scrapeText(h1);
        this.uri = a.href;

        this.comment_container = Hatena.Star.EntryLoader.createCommentContainer();
        h1.appendChild(this.comment_container);
        this.star_container = Hatena.Star.EntryLoader.createStarContainer();
        h1.appendChild(this.star_container);
    }
});

Hatena.Star.Entry.TracBrowserSourceLog = new Ten.Class({
    initialize: function(infoTable) {
        var th = infoTable.getElementsByTagName('th')[0];
        var as = th.getElementsByTagName('a');
        for (var a, i = 0, len = as.length; a = as[i], i < len; i++)
            if (a.href.indexOf("changeset") != -1) break;
        this.title = 'Changeset ' + Ten.DOM.scrapeText(a);
        this.uri = a.href;

        this.comment_container = Hatena.Star.EntryLoader.createCommentContainer();
        th.appendChild(this.comment_container);
        this.star_container = Hatena.Star.EntryLoader.createStarContainer();
        th.appendChild(this.star_container);
    }
});

Hatena.Star.Entry.TracBrowserDirList = new Ten.Class({
    initialize: function(content, td) {
        var h1 = content.getElementsByTagName('h1')[0];
        var tr = td.parentNode;
        var a = td.getElementsByTagName('a')[0];
        this.title = Ten.DOM.scrapeText(h1) + '/' + Ten.DOM.scrapeText(a);
        this.uri = a.href;

        var tdNew = document.createElement("td");
        tdNew.className = "hatenastar";
        this.comment_container = Hatena.Star.EntryLoader.createCommentContainer();
        tdNew.appendChild(this.comment_container);
        this.star_container = Hatena.Star.EntryLoader.createStarContainer();
        tdNew.appendChild(this.star_container);
        tr.appendChild(tdNew);
    }
});

Hatena.Star.Entry.TracRevisionLog = new Ten.Class({
    initialize: function(td) {
        var a = td.getElementsByTagName("a")[0];
        this.title = 'Changeset ' + Ten.DOM.scrapeText(a);
        this.uri = a.href;

        this.comment_container = Hatena.Star.EntryLoader.createCommentContainer();
        td.appendChild(this.comment_container);
        this.star_container = Hatena.Star.EntryLoader.createStarContainer();
        td.appendChild(this.star_container);
    }
});

Hatena.Star.Entry.TracWiki = new Ten.Class({
    initialize: function(ele) {
        var a = ele.getElementsByTagName("a")[0];
        if (a == null)
            return;

        this.title = Ten.DOM.scrapeText(content);
        this.uri = a.href;

        // もし h1 要素なら、フラグメント以降削除する
        if ( ele.tagName.match('H1') ) {
          this.uri = this.uri.replace(/(#.*)/,''); // replace て破壊的なんだっけ？
        }

        // さらに http://lazy-people.org/wiki だったら、http://lazy-people.org/ にするように
        if ( this.uri == 'http://lazy-people.org/wiki' ) {
          this.uri = 'http://lazy-people.org/';
        }

        this.comment_container = Hatena.Star.EntryLoader.createCommentContainer();
        ele.appendChild(this.comment_container);
        this.star_container = Hatena.Star.EntryLoader.createStarContainer();
        ele.appendChild(this.star_container);
    }
});
