// Insert Relative Link

// Add Event Listtener
{
    // for Mozilla and Opera9
    if(document.addEventListener){ 
        document.addEventListener("DOMContentLoaded", insertRelativeLink, false);
    }        

    // for Internet Explorer (using conditional comments)        
    /*@cc_on @*/
    /*@if (@_win32)
        document.write('<script id="_decoy_insertRelativeLink" defer src="javascript:void 0"><\/script>');
        document.getElementById("_decoy_insertRelativeLink").onreadystatechange = function(){
            if(this.readyState=='complete'){
                insertRelativeLink();
            }
        };
    /*@end @*/
}

//Get Feed URL
var feedURL="";
var elms = getElementsByAttribute(document,"link","rel",'service.post');
if(elms.length > 0){
    feedURL=elms[0].href;
    feedURL=feedURL.replace("/posts/default","/posts/summary");
    feedURL=feedURL.replace("http://www.blogger.com/feeds/","http://www2.blogger.com/feeds/");
}

//Counter & LinkArray
var m_maxResults=5;
var m_nRelativeLink_CB =0;
var m_selfURL="";
var m_ePost="";
var m_arLink=new Array();

//--Main Function--//
function insertRelativeLink(){

    // Get all "div" elements which class name are "post-body"
    var elms=getElementsByClassName(document.body,"div","post-body");
    
    // Do not insert relativeLink, when there are multiple "post-body".
    if(elms.length > 1 ) return;
    
    // Check all target elements and insert Tags.
    for(var i=0; i<elms.length;i++){
        var e=elms[i];
        var arLabel=getLabelWords(e);
        m_selfURL = getPostURL(e);
        m_ePost = e;
        
        for(var l=0; l<arLabel.length;l++){
            var sLabel=arLabel[l];
            //Insert Script Tag (for JSONP )
            var s = document.createElement("script");
            s.src = feedURL + "/-/" + encodeURIComponent(sLabel)
                        + "?alt=json-in-script"
                        + "&orderby=published"
                        + "&max-results=" + m_maxResults
                        + "&callback=cbBloggerFeed";
            document.body.appendChild(s);
            m_nRelativeLink_CB++;                     
        }
        
        // Insert labels against JSONP Error return.
        var eDiv = getTargetElement("RelativeLinks");
        
        var eUl=document.createElement("ul");
        for(var l=0; l<arLabel.length;l++){
            var eLi=document.createElement("li");
            var eA=document.createElement("a");
            eA.appendChild(document.createTextNode(arLabel[l]));
            eA.href=String(document.location.href).replace(document.location.pathname,"")
                    + "/search/label/" + encodeURIComponent(arLabel[l]);
            eLi.appendChild(eA);
            eUl.appendChild(eLi);
        }
        eDiv.appendChild(eUl);
        
        // Process first post only.
        break;
    
    }//__for(elms)

} //__insertReadMore()


// Call back from GData API
function cbBloggerFeed(rslt)
{
    // Merge result;
    makeLinkArray(rslt);
    m_nRelativeLink_CB--;
    
    if( m_nRelativeLink_CB > 0)return; // wait for other results.
    
    // Sort Results 
    var compare = function (a,b){
        keyA = "0000" + a.HitLabels;
        keyA.substring(keyA.length-4,keyA.length);
        keyA = keyA+a.updated;
        a.sortkey=keyA;

        keyB = "0000" + b.HitLabels;
        keyB.substring(keyB.length-4,keyB.length);
        keyB = keyB+b.updated;
        b.sortKey=keyB;
        
        return( keyA < keyB);
    }
    
    m_arLink.sort(compare);
    
    var eDiv = getTargetElement("RelativeLinks");
    var e=document.createElement("h4");
    e.appendChild(document.createTextNode("多分、関連のありそうな記事"));
    eDiv.appendChild(e);
    var eUl=document.createElement("ul");
    for(var i=0;i<m_arLink.length;i++){
        var eLi=document.createElement("li");
        
        var eA=document.createElement("a");
        eA.appendChild(document.createTextNode(m_arLink[i].title));
        eA.href=m_arLink[i].link;
        eLi.appendChild(eA);
        
        eUl.appendChild(eLi);
        
        if(i>=m_maxResults)break;
    }
    eDiv.appendChild(eUl);

    if (document.documentElement.getAttribute("style") == document.documentElement.style){
        eUl.style.margin="0 0 0 0.5em";
        eUl.style.padding="0 0 1em 1em";
    }
    else{
        eUl.setAttribute("style","margin:0 0 0 0.5em;padding:0 0 1em 1em;");
    }
}


function getTargetElement(sElmName)
{
    var eDiv = document.getElementById(sElmName);
    
    if(eDiv){
        eDiv.innerHTML="";
    }
    else{
        // Create Tags;
        eDiv = document.createElement("div");
        eDiv.id=sElmName;
        if (document.documentElement.getAttribute("style") == document.documentElement.style){
            // IE6 & 7
            eDiv.style.margin ="0 0 0 2em";
            eDiv.style.padding ="0 0 0 1em";
            eDiv.style.borderColor="#aabbcc";
            eDiv.style.borderStyle="solid";
            eDiv.style.background="black";
        }
        else{
            //style="width:180px;height:520px;border:solid 1px #aabbcc;"
            // Firefox and Others
            eDiv.setAttribute("style","margin:0 0 0 2em;padding:0 0 0 1em;border-color:#aabbcc; border-style:solid; background-color:black; border-width:1px;");
        }
        
        var e=document.createElement("h4");
        e.appendChild(document.createTextNode("多分、関連のありそうな記事"));
        eDiv.appendChild(e);
        
        // add s.nakawaka 
        //var elms=getElementsByClassName(document.body,"div","post-body-empty");
        //elms[0].appendChild(eDiv);
        m_ePost.parentNode.appendChild(eDiv);
    }
    
    return eDiv;
}

//
function makeLinkArray(rslt){
    var sLabel="";
    
    for(var i=0;i<rslt.feed.link.length; i++ ){
        if(rslt.feed.link[i].rel=="alternate"){
            sLabel=rslt.feed.link[i].href;
            sLabel=sLabel.split("/").reverse()[0];
            break;
        }
    }//__for
    
    if(!rslt.feed.entry) return; //No Entry.
    
    for(var i=0;i<rslt.feed.entry.length;i++){
        var e=rslt.feed.entry[i];

        var sLink="";
        for(var l=0;l<e.link.length; l++ ){
            if(e.link[l].rel=="alternate"){
                sLink=e.link[l].href;
                break;
            }
        }//__for        

        if(sLink!=m_selfURL){
            var arLabel=new Array();
            for(var l=0;l<e.category.length; l++ )
                arLabel.push(e.category[l].term);

            // exist ID?
            var nExists=-1;
            for(var l=0;l<m_arLink.length;l++)
                if(m_arLink[l].id==e.id.$t)
                    { nExists=l; break;}
            
            if(nExists>=0)
                m_arLink[nExists].HitLabels++;
            else{
                m_arLink.push({
                    id:e.id.$t
                    , published:e.published.$t
                    , updated:e.updated.$t
                    , title:e.title.$t
                    , labels:arLabel
                    , link:sLink
                    , HitLabels:1
                    , sortkey:""
                });
            }//__if(Exists)
            
        }//__if(!m_selfURL)        
    }//__for(feed.entry)   

}

//
function getLabelWords(ePost){
    var arRslt = new Array();
    
    do{
        var elms = getElementsByClassName(ePost.parentNode,"*","post-footer");
        if(elms.length<=0) break;

        elms = getElementsByAttribute(elms[0],"a","rel","tag");
        if(elms.length<=0) break;
        
        for(var l=0;l<elms.length;l++)
            arRslt.push(String(elms[l].innerHTML).replace(/^\s+|\s+$/g, ""));
    }while(false);

    return arRslt;
}// getLabelWords

//
function getPostURL(ePost){
    var sURL="";
    
    do{
        var elms = getElementsByClassName(ePost.parentNode,"*","post-footer");
        if(elms.length<=0) break;

        elms = getElementsByAttribute(elms[0],"a","title","permanent link");
        if(elms.length<=0) break;
        
        sURL=elms[0].href;
        
    }while(false);

    return sURL;
}// __getPostURL

//
function getElementsByClassName(elm, tagName, className){
    var arRslt = new Array();
    var elms = (tagName == "*" && elm.all)
                    ? elm.all : elm.getElementsByTagName(tagName);

    className = className.replace(/\-/g, "\\-");
    var re = new RegExp("(^|\\s)" + className + "(\\s|$)");

    for(var i=0; i<elms.length; i++){
        var e = elms[i];      
        if(re.test(e.className)){
            arRslt.push(e);
        }   
    }
    return arRslt
}

//
function getElementsByAttribute(elm, tagName, attrName, attrValue){
    var arRslt = new Array();
    var elms = (tagName == "*" && elm.all)
                    ? elm.all : elm.getElementsByTagName(tagName);

    attrValue = attrValue.replace(/\-/g, "\\-");
    var re = new RegExp("(^|\\s)" + attrValue + "(\\s|$)");

    for(var i=0; i<elms.length; i++){
        var e = elms[i];
        if(e.attributes.getNamedItem(attrName))      
            if(re.test(e.attributes.getNamedItem(attrName).nodeValue )){
                arRslt.push(e);
            }   
    }
    return arRslt
}


// for debug
function debugWrite(elm,txt){
        var eee=document.createElement("p");
        eee.style.fontSize="75%";
        eee.style.display="block";
        eee.appendChild(document.createTextNode(txt));
}
