/*------------------------------------------------------------------------------
PiyoFeeds JavaScript モードを HTML 化する。

$Id: WritePiyoFeed.js,v 1.5 2005/04/28 16:27:00 okamura Exp $
Copyright (C) 2004-2005 OKAMURA Yuji, All rights reserved.
------------------------------------------------------------------------------*/
//// WritePiyoFeeds オブジェクト ///////////////////////////////////////////////
function WritePiyoFeeds(rss) {
	/*---- PiyoFeeds RSS オブジェクト ----*/
	this.m_RSS = rss;

	/*---- 表示制御変数 ----*/
	// チャンネルのタイトル - 設定すると RSS の記述の代わりに用いられる
	this.m_ChannelTitle;
	// チャンネルをリンクにするかどうか
	this.m_ChannelIsLink = false;
	// チャンネルへのリンクのターゲット
	this.m_ChannelLinkTarget = '_self';
	// アイテムの取捨選択関数
	this.ChoiceItemFunc = function(item) { return true; };
	// アイテムへのリンクのターゲット
	this.m_ItemLinkTarget = '_self';
	// アイテムのデスクリプションを a タグの title 属性とするかどうか
	this.m_UseItemDescriptionAsTitle = true;

	/*---- スタイルシート用クラス ----*/
	// チャンネルの class
	this.m_ChannelClass = 'PiyoFeedChannel';
	// チャンネルのリンクのクラス
	this.m_ChannelLinkClass = 'PiyoFeedChannelLink';
	// アイテム全体の class
	this.m_ItemListClass = 'PiyoFeedItemList';
	// 各アイテムの class
	this.m_ItemClass = 'PiyoFeedItem';
	// 各アイテムのリンクのクラス
	this.m_ItemlLinkClass = 'PiyoFeedItemlLink';

	/*---- インターフェース関数 ----*/
	// rss を HTML(文字列)に変換する
	this.GetHTMLStr = function () {
		var	i;
		var	html = '';
		var	channel = this.m_RSS.channel;
		var	item = this.m_RSS.items;

		// channel の書き出し
		if (this.m_ChannelIsLink) {
			html += '<div class="'+this.m_ChannelClass+'">';
			html += '<a class="'+this.m_ChannelLinkClass+'" href="'+channel.url+'" target="'+this.m_ChannelLinkTarget+'">';
			html += this.m_ChannelTitle ? this.m_ChannelTitle : this.SafeStr4HTML(channel.title);
			html += '</a>';
			html += '</div>';
		}
		else {
			html += '<div class="'+this.m_ChannelClass+'">';
			html += this.m_ChannelTitle ? this.m_ChannelTitle : this.SafeStr4HTML(channel.title);
			html += '</div>';
		}

		// item の書き出し
		html += '<div class="'+this.m_ItemListClass+'">';
		for (i = 0; i < item.length; i++) {
			if (!this.ChoiceItemFunc(item[i])) continue;

			html += '<div class="'+this.m_ItemClass+'">';
			html += '<a class="'+this.m_ItemlLinkClass+'" href="'+item[i].link+'" target="'+this.m_ItemLinkTarget+'"';
			if (this.m_UseItemDescriptionAsTitle) {
				html += ' title="'+this.SafeStr4Attr(item[i].description)+'"';
			}
			html += '>';
			html += this.SafeStr4HTML(item[i].title);
			html += '</a>';
			html += '</div>';
		}
		html += '</div>';

		return html;
	}

	// rss を HTML にしたものを出力する
	this.Write = function () {
		var	html = this.GetHTMLStr();

		if (!html) return false;
		document.write(html);
		return true;
	}

	// ID属性が id の HTML 要素の内容を rss を HTML にしたものに置き換える
	this.ReplaceInnerHTML = function (id, win) {
		var	elmt;
		var	html;

		if (win) {
			elmt = win.document.getElementById(id);
		}
		else {
			elmt = document.getElementById(id);
		}
		if (!elmt) return false;
		html = this.GetHTMLStr();
		if (!html) return false;

		elmt.innerHTML = html;

		return true;
	}

	/*---- 内部関数 ----*/
	this.SafeStr4HTML = function (str) {
		var	newStr;

		str = str.replace(/&/g, '&amp;');
		str = str.replace(/</g, '&lt;');
		str = str.replace(/"/g, '&quot;');
		str = str.replace(/>/g, '&gt;');

		return str;
	}

	this.SafeStr4Attr = function (str) {
		var	newStr;

		str = this.SafeStr4HTML(str);
		str = str.replace(/\n/g, ' ');

		return str;
	}
}
