/**********************************************/
/*  サイト内のページURLを算出する             */
/**********************************************/
function getPageUrl(){

	var pageUrl = location.href;
    var index = pageUrl.indexOf('#');
    if( index != -1 ){
        pageUrl = pageUrl.substring(-1,index);
    }
    index = pageUrl.indexOf('?');
    if( index != -1 ){
        pageUrl = pageUrl.substring(-1,index);
    }

	return pageUrl;
}

/**********************************************/
/*  Ping-URLを表示する  */
/**********************************************/
function displayTrackbackUrl(){

    /* wycoリンクの表示(1)・非表示(0)フラグ */
    var wycoLinkFlag = 1;

    /* トラックバック受付URL */
    var trackbackAcceptUrl = "http://tb.ptja.jp/site_trackback/accept";


    var pingUrlTag = document.getElementById("trackback_url_insert");
    if( pingUrlTag == null ){    // trackback_urlタグが存在しない場合は表示しない
        return;
    }

    var tbRequestUrl = trackbackAcceptUrl;
    var displayTitle = "この記事について、ブログで感想を書こう！";
    var paramName = "site_url";

    /* Ping-URLの算出 */
    var pingUrl = tbRequestUrl + '?' + paramName + '=' + getPageUrl();

    /* テキスト表示領域を生成＆追加 */
    var tbUrlHeader = document.createElement('DIV');
    tbUrlHeader.setAttribute('id','tb_url_header');
    tbUrlHeader.innerHTML = displayTitle;
    pingUrlTag.appendChild(tbUrlHeader);

    var tbUrlCont = document.createElement('INPUT');
    tbUrlCont.setAttribute('id','tb_url_container');
    tbUrlCont.setAttribute('type','text');
	tbUrlCont.setAttribute('onfocus', function(){this.select();});
    tbUrlCont.setAttribute('value', pingUrl);
    tbUrlCont.setAttribute('size', '100');
    pingUrlTag.appendChild(tbUrlCont);


    /* wycoLink表示 */
    if( wycoLinkFlag == 1 ){

      var spaceSpan =  document.createElement('SPAN');
      spaceSpan.innerHTML = "&nbsp;&nbsp;<br/>&nbsp;";
      pingUrlTag.appendChild(spaceSpan);

	  var rechref = "http://wyco.jp/recieve_trackback/" +  UTF8encodeURL(UTF8encodeURL(pingUrl));
	  var recLink = document.createElement('A');
	  recLink.setAttribute('id','wycotburl');
	  recLink.setAttribute('href', rechref);
	  recLink.setAttribute('target', '_blank');
	  recLink.innerHTML = "wycoブログで書く";
	  pingUrlTag.appendChild(recLink);

   }

    spaceSpan =  document.createElement('SPAN');
    spaceSpan.innerHTML = "&nbsp;&nbsp;";
	pingUrlTag.appendChild(spaceSpan);

	var helphref = "http://cobs.jp/help/wycotb.html";
	var helpLink = document.createElement('A');
	helpLink.setAttribute('id','wycotbhelp');
	helpLink.setAttribute('href', helphref);
	helpLink.setAttribute('target', '_blank');
	helpLink.innerHTML = "使い方";
	pingUrlTag.appendChild(helpLink);

    spaceSpan =  document.createElement('SPAN');
    spaceSpan.innerHTML = "&nbsp;&nbsp;";
	pingUrlTag.appendChild(spaceSpan);


    return;
}

/**********************************************/
/*  JSONPを取得する  */
/**********************************************/
var trackbackRequestObj = null;

function trackbackRequestFunc(){

    /* トラックバック一覧取得URL */
    var trackbackListUrl = "http://tb.ptja.jp/trackback_list/delivery";


	var tbListUrl = trackbackListUrl + "?site_url=";
	var pageUrl = getPageUrl();
	var callFunc = "&callback=trackbackCallbackFunc";

    trackbackRequestObj = new JSONscriptRequest(tbListUrl + pageUrl + callFunc);
    trackbackRequestObj.buildScriptTag();                                                     
    trackbackRequestObj.addScriptTag();                                                       
                                                        
}

function trackbackCallbackFunc(jsonData){

 	try{

		var trackListTag = document.getElementById("trackback_list_insert");
		if( trackListTag == null ){  
		    return;
		}

		if( jsonData.error != null ){    // Error発生の場合
        	return;
    	}

		var listCnt = jsonData.trackback.length;    //登録されている件数

		var listHead = document.createElement('DIV');
		listHead.setAttribute('id','tb_list_header');
		listHead.innerHTML = "トラックバックリスト(" + listCnt +")";
		trackListTag.appendChild(listHead);

		var listContent = document.createElement('DIV');
		listContent.setAttribute('id','tb_list_content');
		var listTable = document.createElement('TABLE');
		listTable.setAttribute('id','list_content_table');
		var tbd = document.createElement("TBODY");
		tbd.setAttribute('id','list_content_tbody');

		for( var i=0; i<listCnt; i++ ){

			var tbLink = jsonData.trackback[i].tb_url;
			var title = sanitizeString(jsonData.trackback[i].title);
			var excerpt = sanitizeString(jsonData.trackback[i].excerpt);
			var rdate = jsonData.trackback[i].reg_date;

			var listPrimary = document.createElement('TR');
			tbd.setAttribute('id','list_content_tr');
			var listTitle = document.createElement('TD');
			listTitle.setAttribute('id','list_content_td');

			var listLink = document.createElement('A');
			listLink.setAttribute('id','list_content_title');
			listLink.setAttribute('href', tbLink);
			listLink.setAttribute('target', '_blank');
			listLink.innerHTML = title;
			listTitle.appendChild(listLink);

			var listDate = document.createElement('TD');
			listDate.setAttribute('id','list_content_regdate');
			listDate.innerHTML = rdate;

			var listSecondary = document.createElement('TR');
			listSecondary.setAttribute('id','list_content_tr');
			var listSummary = document.createElement('TD');
			listSummary.setAttribute('id','list_content_summary');
			listSummary.setAttribute('colSpan', '2');
			listSummary.innerHTML = excerpt;

			listPrimary.appendChild(listTitle);
			listPrimary.appendChild(listDate);
			listSecondary.appendChild(listSummary);

			tbd.appendChild(listPrimary);
			tbd.appendChild(listSecondary);
			listTable.appendChild(tbd);
			listContent.appendChild(listTable);
			trackListTag.appendChild(listContent);
		}

	
	}catch(e){
		alert("エラーです。"+e);
	}

}

/**********************************************/
/*  　トラックバック実行 　*/
/**********************************************/
function runTrackbackModule(){

    displayTrackbackUrl();
    trackbackRequestFunc();

    return;
}



/**********************************************/
/*  URLエンコード(UTF-8)                      */
/**********************************************/
function UTF8encodeURL(str){
    var s0, i, s, u;
    s0 = "";                // encoded str
    for (i = 0; i < str.length; i++){   // scan the source
        s = str.charAt(i);
        u = str.charCodeAt(i);          // get unicode of the char
        if (s == " "){s0 += "+";}       // SP should be converted to "+"
        else {
            if ( u == 0x2a || u == 0x2d || u == 0x2e || u == 0x5f || ((u >= 0x30) && (u <= 0x39)) || ((u >= 0x41) && (u <= 0x5a)) || ((u >= 0x61) && (u <= 0x7a))){       // check for escape
                s0 = s0 + s;            // don't escape
            }
            else {                  // escape
                if ((u >= 0x0) && (u <= 0x7f)){     // single byte format
                    s = "0"+u.toString(16);
                    s0 += "%"+ s.substr(s.length-2);
                }
                else if (u > 0x1fffff){     // quaternary byte format (extended)
                    s0 += "%" + (oxf0 + ((u & 0x1c0000) >> 18)).toString(16);
                    s0 += "%" + (0x80 + ((u & 0x3f000) >> 12)).toString(16);
                    s0 += "%" + (0x80 + ((u & 0xfc0) >> 6)).toString(16);
                    s0 += "%" + (0x80 + (u & 0x3f)).toString(16);
                }
                else if (u > 0x7ff){        // triple byte format
                    s0 += "%" + (0xe0 + ((u & 0xf000) >> 12)).toString(16);
                    s0 += "%" + (0x80 + ((u & 0xfc0) >> 6)).toString(16);
                    s0 += "%" + (0x80 + (u & 0x3f)).toString(16);
                }
                else {                      // double byte format
                    s0 += "%" + (0xc0 + ((u & 0x7c0) >> 6)).toString(16);
                    s0 += "%" + (0x80 + (u & 0x3f)).toString(16);
                }
            }
        }
    }
    return s0;
}


/**********************************************/
/*  URLデコード(UTF-8)                      */
/**********************************************/
function UTF8decodeURL(str){
    var s0, i, j, s, ss, u, n, f;
    s0 = "";                // decoded str
    for (i = 0; i < str.length; i++){   // scan the source str
        s = str.charAt(i);
        if (s == "+"){s0 += " ";}       // "+" should be changed to SP
        else {
            if (s != "%"){s0 += s;}     // add an unescaped char
            else{               // escape sequence decoding
                u = 0;          // unicode of the character
                f = 1;          // escape flag, zero means end of this sequence
                while (true) {
                    ss = "";        // local str to parse as int
                        for (j = 0; j < 2; j++ ) {  // get two maximum hex characters for parse
                            sss = str.charAt(++i);
                            if (((sss >= "0") && (sss <= "9")) || ((sss >= "a") && (sss <= "f"))  || ((sss >= "A") && (sss <= "F"))) {
                                ss += sss;      // if hex, add the hex character
                            } else {--i; break;}    // not a hex char., exit the loop
                        }
                    n = parseInt(ss, 16);           // parse the hex str as byte
                    if (n <= 0x7f){u = n; f = 1;}   // single byte format
                    if ((n >= 0xc0) && (n <= 0xdf)){u = n & 0x1f; f = 2;}   // double byte format
                    if ((n >= 0xe0) && (n <= 0xef)){u = n & 0x0f; f = 3;}   // triple byte format
                    if ((n >= 0xf0) && (n <= 0xf7)){u = n & 0x07; f = 4;}   // quaternary byte format (extended)
                    if ((n >= 0x80) && (n <= 0xbf)){u = (u << 6) + (n & 0x3f); --f;}         // not a first, shift and add 6 lower bits
                    if (f <= 1){break;}         // end of the utf byte sequence
                    if (str.charAt(i + 1) == "%"){ i++ ;}                   // test for the next shift byte
                    else {break;}                   // abnormal, format error
                }
            s0 += String.fromCharCode(u);           // add the escaped character
            }
        }
    }
    return s0;
}

/**********************************************/
/*  Sanitizing (&, <, >, \, ')                */
/**********************************************/
function sanitizeString( aString ) {
    var thisvalue = "";
    for ( var i = 0; i < aString.length; i++ ) {
        thischar = aString.charAt( i );
        if (thischar == '&') { 
			thisvalue += "&amp;"; 
		} else if (thischar == '<') {
			thisvalue += "&lt;";
		} else if (thischar == '>') {
			thisvalue += "&gt;";
		} else if (thischar == 0x5C) {
			thisvalue += "&quot;";
		} else if (thischar == 0x27) {
			thisvalue += "&#39;";
		} else {
			thisvalue += thischar;
		}
	}
    return( thisvalue );
}
