
$(function(){
    insertRelativeLink();
});

DEBUG=true;

//Get Feed URL
var feedURL="";
var elms = getElementsByAttribute("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("div","post-body");
    
    // Do not insert relativeLink, when there are multiple "post-body".
    if(elms.length > 1 ) return;
    debug("o_o!!!!!!!");
    // 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 )
            insertScriptTag(feedURL, sLabel, m_maxResults);
            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]);
                                debug(eA.href);
            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");
        $('<a></a>').html(m_arLink[i].title).attr('href', m_arLink[i].link).appendTo(eLi);
        eUl.appendChild(eLi);
        
        if(i>=m_maxResults)break;
    }
    eDiv.appendChild(eUl);
    $(eUl).css('margin', '0 0 0 0.5em').css('padding', '0 0 1em 1em');
    
}


function getTargetElement(sElmName)
{
    var eDiv = document.getElementById(sElmName);
    
    if(eDiv){
        eDiv.innerHTML="";
        return eDiv;
    }
        // Create Tags;
        //eDiv = $(document.createElement("div"));
        eDiv = $("<div></div>");
        eDiv.attr("id", sElmName );
        eDiv.css("margin", "0 0 0 2em");
        eDiv.css("padding", "0 0 0 1em");
        eDiv.css("border-color", "#aabbcc");
        eDiv.css("border-style", "solid");
        eDiv.css("background-color", "black");
        eDiv.css("border-width", "1px");
        
        var e=document.createElement("h4");
        e.appendChild(document.createTextNode("多分、関連のありそうな記事"));
        eDiv.append(e);

        // add s.nakawaka 
        var elms=getElementsByClassName("div","post-body-empty");
        elms[0].appendChild(eDiv.get()[0]);
        debug("this li ne OK");
        //m_ePost.parentNode.appendChild(eDiv);
    
    return eDiv.get()[0];
}

//
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("*","post-header-line-1");
        if(elms.length<=0) break;

        elms = getElementsByAttribute("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("*","post-footer");
        if(elms.length<=0) break;

        elms = getElementsByAttribute("a","title","permanent link");
        if(elms.length<=0) break;
        
        sURL=elms[0].href;
        
    }while(false);

    return sURL;
}// __getPostURL

//Insert Script Tag (for JSONP )
function insertScriptTag(feedURL, label, max){
   // var s = document.createElement("script");
    var sUrl = feedURL + "/-/" + encodeURIComponent(label)
                        + "?alt=json-in-script"
                        + "&orderby=published"
                        + "&max-results=" + max
                        + "&callback={callback}";
                        //+ "&callback=cbBloggerFeed";
    // s.src = sUrl;
   // document.body.appendChild(s);
    
    $.getJSONP( sUrl, function(json) { cbBloggerFeed(json); });
}

function getElementsByClassName(tagName, className){
    var arRslt = $(tagName + "." + className);
    return arRslt;
}
//
function getElementsByAttribute(tagName, attrName, attrValue){
    var arRslt = $(tagName+"[@"+attrName+"="+attrValue+"]");
    return arRslt;
}

function debug(s){
   $.log(s) ;
}