/*!
 * Blog aggregator Library v1.0
 * URL: http://racoo.co.jp
 *
 * Description: Google AJAX Feed API を用いて複数のブログ RSS を統合する
 * Author: Utsuda, Ohe
 *
 * Date: Mar Mon 15 18:00:00 2011 +0900
 */



// Variable declaration
var feeds = {};
feeds.globalConfig = {};
var entryArray = [];
var entryNum = 0;
var printHTML = [];

// Display Elements ID
feeds.globalConfig.conteiner = "news2"; 

// RSS Feed URL
$.ajax({
	type: "GET",
	url: "/js/blog.html",
	success: function(result) {
		feeds.globalConfig.feedUrl = $(result.split("\n")).map(function(index, text) {
			var token = text.split("@");
			return {title:token[0], url:token[1], rss:token[2]}
		});
	}
});

// Number of Outputs
feeds.globalConfig.dispNum = 10;
// 日付フォーマット Ymdはそれぞれ年、月、日が置き換えられます
feeds.globalConfig.dateFmt = "Y.m.d";
// Contents number display.
feeds.globalConfig.maxTextLen = 20;
// sprint_f for JavaScript library
feeds.globalConfig.addHtml = '<dt>%7$s</dt><dd>%6$s<br />%3$s <a href="%5$s" target="_blank">%1$s</a><br />%2$s<br /></dd>';

google.load("feeds", "1");
feeds.init = function () {
	var Cfg = feeds.globalConfig;	// GlobalConfigの引継ぎ
	for (n = 0; n < Cfg.feedUrl.length;n++ ) {
		if(n == (Cfg.feedUrl.length) - 1) {
			var num = 1;
		} else {
			var num = 0;
		}
		feedAdd(Cfg.feedUrl[n].rss, Cfg.feedUrl[n].url, num);
	}
};

// 取得するフィードの追加
// (rssUrl：フィードのURL , boolNum：追加するフィードURLが最後の場合「1」を入れる)
function feedAdd(rssUrl, siteUrl, boolNum) {
	var Cfg = feeds.globalConfig;				// GlobalConfigの引継ぎ
	var feed = new google.feeds.Feed(rssUrl);	// フィードの取得
	feed.setNumEntries(255);					// ブログ1つあたりの取得するフィード数
	feed.load(function(result) {
		if (!result.error) {
			for (var i = 0; i < result.feed.entries.length; i++) {
				//Debugger(result.feed.entries[i]);
				entryArray[entryNum] = result.feed.entries[i];
				var date = new Date(result.feed.entries[i].publishedDate);
				entryArray[entryNum].sortDate = ( date.getFullYear()*10000 ) + ( (date.getMonth() + 1)*100 ) + date.getDate();	//ソート用（日付）を連想配列に代入
				entryArray[entryNum].blogName = result.feed.title;	//ブログ名を連想配列に代入
				entryArray[entryNum].blogURL = siteUrl;
				entryNum+=1;
			}
		}
		if(boolNum==1){
			feedOutput(Cfg.conteiner, Cfg.dispNum);	//フィードの出力
		}
	});
}

//フィードの出力（feedId：出力するオブジェクトのID , listNum：出力するリスト数。「0」の場合全て）
function feedOutput(feedId, listNum)
{
	setTimeout(function() {
		var Cfg = feeds.globalConfig;	// GlobalConfigの引継ぎ
		var htmlConteiner = document.getElementById(feedId);
		var _HTML = "";
		entryArray = asort(entryArray, "sortDate");	//日付でソート
		if (listNum==0) {
			listNum = entryNum;
		}
		for (var i = 0; i < listNum; i++) {
			var entry = entryArray[i];
			if(typeof(entry) != 'undefined') {

				// console.dir(entry);

				// Content character limit
				var entText  = entry.contentSnippet;
				if(Cfg.maxTextLen < entText.length) {
					entText = entText.substring(0, Cfg.maxTextLen);
				}
				// Create contentSnippet
				var entDate = new Date(entry.publishedDate).getTime();
				var dispEntDate = changeDate(entDate,Cfg.dateFmt);

				// GET Image Element
				var entImage = entry.content.match("<img.*?>");


				//console.dir(entImage);
				if(entImage != null) {
					//console.log(entImage[0]);
					//console.log(entImage[0].indexOf("http"));
					if (entImage[0].indexOf("http") == -1) {
						entImage = entImage[0].replace('src="', 'src="' + entry.blogURL);
					}
				}

				var entCategory = entry.categories[0];
				printHTML.push(
					sprintf(
						Cfg.addHtml,
						entry.title,
						entText,
						dispEntDate,
						entCategory,
						entry.link,
						entry.blogName,
						entImage
					)
				);
			}
			if(listNum - 1 == i) {
				// console.dir(printHTML);
				var htmlTmp = '';
				for (n = 0; n < printHTML.length; n++ ) {
					htmlTmp += printHTML[n];
					if(n == 2) {
						htmlTmp += '</dl><dl class="more">';
					}
					if(n == printHTML.length-1) {
						htmlConteiner.innerHTML = '<dl>' + htmlTmp + '</dl>';
					}
				}
				$('#news2 img')
					.css('width', 'auto')
					.css('height', '60px');
			}
		}
	}, 1000);
}
google.setOnLoadCallback(feeds.init);

/*****
 * sprintf() php風sprintfのjavascriptver
 * thanks -> latest log (uupaa.js)
 * http://d.hatena.ne.jp/uupaa/20091214/1260737607
 * !{id:"uupaa.js",ver:0.7,license:"MIT",author:"uupaa.js@gmail.com"}
 */
window.sprintf||(function(){var _BITS={i:0x8011,d:0x8011,u:0x8021,o:0x8161,x:0x8261,X:0x9261,f:0x92,c:0x2800,s:0x84},_PARSE=/%(?:(\d+)\$)?(#|0)?(\d+)?(?:\.(\d+))?(l)?([%iduoxXfcs])/g;window.sprintf=_sprintf;function _sprintf(format){function _fmt(m,argidx,flag,width,prec,size,types){if(types==="%"){return"%"}var v="",w=_BITS[types],overflow,pad;idx=argidx?parseInt(argidx):next++;w&0x400||(v=(av[idx]===void 0)?"":av[idx]);w&3&&(v=(w&1)?parseInt(v):parseFloat(v),v=isNaN(v)?"":v);w&4&&(v=((types==="s"?v:types)||"").toString());w&0x20&&(v=(v>=0)?v:v%0x100000000+0x100000000);w&0x300&&(v=v.toString(w&0x100?8:16));w&0x40&&(flag==="#")&&(v=((w&0x100)?"0":"0x")+v);w&0x80&&prec&&(v=(w&2)?v.toFixed(prec):v.slice(0,prec));w&0x6000&&(overflow=(typeof v!=="number"||v<0));w&0x2000&&(v=overflow?"":String.fromCharCode(v));w&0x8000&&(flag=(flag==="0")?"":flag);v=w&0x1000?v.toString().toUpperCase():v.toString();if(!(w&0x800||width===void 0||v.length>=width)){pad=Array(width-v.length+1).join(!flag?" ":flag==="#"?" ":flag);v=((w&0x10&&flag==="0")&&!v.indexOf("-"))?("-"+pad+v.slice(1)):(pad+v)}return v}var next=1,idx=0,av=arguments;return format.replace(_PARSE,_fmt)}})();
/*
 * 日付のフォーマット変更関数
 */
function changeDate(str,fmt){fmt=new String(fmt);fmt=fmt.replace("Y","%1$s");fmt=fmt.replace("m","%2$s");fmt=fmt.replace("d","%3$s");var myDate=new Date(str);var YY=myDate.getFullYear();var MM=myDate.getMonth()+1;if(MM<10){MM="0"+MM}var DD=myDate.getDate();if(DD<10){DD="0"+DD}var date=sprintf(fmt,YY,MM,DD);return date;}
/*
 * ソート機能
 */
function asort(myArray,key){return myArray.sort(function(b1,b2){return b1[key]>b2[key]?-1:1})}

function Debugger(obj) {
	var debugElem = document.createElement('div');
	debugElem.style.backgroundColor = '#ffffff';
	debugElem.style.border = '1px solid #f00';
	debugElem.style.position = 'absolute';
	debugElem.style.top = 0;
	debugElem.style.left = 0;
	debugElem.style.width = '100%';
	debugElem.style.padding = '10px';
	var objBody = document.getElementsByTagName("body").item(0); 
	objBody.appendChild(debugElem);
	debugElem.innerHTML = 'Debug***<br />';
	if(typeof(obj) == 'object') {
		debugElem.innerHTML += uneval(obj);
	}
}

