/* 
	JavaScript of RSS Reading
	Yu Sekiguchi
	2007
*/
//グローバル変数の定義
var httpObj;               // HTTP通信用オブジェクト
var timerId;               // HTTP通信用タイマーオブジェクト
var timeout_sec = 10;      // HTTP通信タイムアウト秒数
var url_data = 'rss/rss2.xml'; // RSSファイルURLの定義

function dispXmlElement(xml) {
	// ルート要素を特定する
	var base_node;
	var base_tagname;
	var item_tagname;
	var i;
	for(i=0; i<xml.childNodes.length; i++) {
		if(xml.childNodes[i].tagName) {
			base_tagname = xml.childNodes[i].tagName;
			base_node = xml.childNodes[i];
			break;
		}
	}
	// ルート要素のタグ名からRSSフォーマットを特定する
	if(base_tagname == 'rdf:RDF') {

	} else if(base_tagname == 'rss' && base_node.getAttribute('version') == '2.0' ) {
		base_node = xml.getElementsByTagName('channel')[0];
	} else {
		alert('Unknown RSS Format : ' + xml.childNodes.length);
		return false;
	}
	// 記事要素のリストを抽出する
	var items = base_node.getElementsByTagName('item');
	// 記事要素の内容を解析する
	var displayframe = document.getElementById('displayframe');
	var itemframe = document.getElementById('itemframe');
	for (i=0; i<items.length; i++) {
		var item_title;
		var item_link;
		var item_desc = '';
		var item_date = '';
		var j=0;
		for(j=0; j<items[i].childNodes.length; j++) {
			var child = items[i].childNodes[j];
			var child_tag = items[i].childNodes[j].tagName;
			// 記事タイトル
			if(child_tag == 'title') {
				item_title = child.firstChild.nodeValue;
			// 記事URL
			} else if(child_tag == 'link') {
				item_link = child.firstChild.nodeValue;
			// 記事概要
			} else if(child_tag == 'description') {
				if(child.firstChild) {
					item_desc = child.firstChild.nodeValue;
				}
			// 発行日時
			} else if(child_tag == 'dc:date') {	   // RSS1.0
				if(child.firstChild) {
					item_date = child.firstChild.nodeValue;
				}
			} else if(child_tag == 'pubDate') {	  // RSS2.0
				if(child.firstChild) {
					item_date = child.firstChild.nodeValue;
				}
			}
		}
		// 今日と更新日の日付を入手
		var date = new Date();
		var i_date = new Date(item_date);
		// 今日と更新日の差を求める
		x_date = date.getTime() - i_date.getTime();
		// 差が３０日（２４時間６０分６０秒１０００ｍ秒）以内だったら、新しい。
		if(x_date < (24*60*60*1000*30)) {
			var item_new = "NEW";
		} else {
			var item_new = "";
		}
		// 時間をローカルタイムに変更
		var locale_date = getItemDate(item_date);
		// テンプレートとなるタグ要素を複製
		var new_itemframe = itemframe.cloneNode(true);
		new_itemframe.removeAttribute('id');
		new_itemframe.id = 'item' + i;
		// 取り出した記事情報をタグに格納する
		var divs = new_itemframe.getElementsByTagName('div');
		divs[0].innerHTML = '<a href="' + item_link + '">' + item_title + '</a>';
		divs[1].innerHTML = item_desc;
		divs[2].innerHTML = locale_date + '更新';
		divs[3].innerHTML = item_new;
		// 生成したタグ要素をドキュメントに追加し表示する
		displayframe.appendChild(new_itemframe);
		new_itemframe.style.display = 'block';
	}
}

function loadXml() {
	// XMLをHTTP通信で取得
	httpXmlRequest(url_data, 'GET', '', dispXmlElement, httpError);
	return false;
}

function httpError(error) {
	alert(error);
}

// 引数に与えられたURLにHTTPリクエストを行ない、指定された関数を実行
function httpXmlRequest(target_url, method, data, success_func, error_func) {
	try {
		if(window.XMLHttpRequest) {
			httpObj = new XMLHttpRequest();
		} else if(window.ActiveXObject) {
			httpObj = new ActiveXObject("Microsoft.XMLHTTP");
			target_url = 'http://www.jutoku.ed.jp/junior/RSS/rss2.xml';
		} else {
			httpObj = false;
		}
	} catch(e) {
		httpObj = false;
	}
	if(! httpObj) {
		httpObjGenerateFail();
	}
	timerId = setInterval('timeoutCheck()', 1000);
	httpObj.open(method, target_url, true);
	httpObj.onreadystatechange = function() {
		if (httpObj.readyState == 4) {
			clearInterval(timerId);
			if (httpObj.status == 200 || httpObj.status == 0) {
				success_func(httpObj.responseXML);
			} else {
				error_func(httpObj.status + ' : ' + httpObj.statusText);
				return false;
			}
		}
	}
	httpObj.send(data);
}

// HTTPタイムアウト処理
function timeoutCheck() {
	timeout_sec --;
	if(timeout_sec <= 0) {
		// タイマーをストップする
		clearInterval(timerId);
		// HTTPリクエストを中断する
		httpObj.abort();
		// エラーダイアログを表示
		alert('タイムアウトです。');
		return false;
	}
}

// 時間をローカルタイムに変更
function getItemDate(date) {
	var year;
	var month;
	var day;
	var locale_date;

	ItemDate = new Date(date);

	year = ItemDate.getFullYear();
	month = ItemDate.getMonth()+1;
	day = ItemDate.getDate();
	locale_date = year + "年" + month + "月" + day + "日";
	return locale_date;
}

loadXml();