/**
 * rssreader.js - http://dis.ne.jp
 *
 * (c) 2008 DOORS CORPORATION. and is released under the MIT License:
 * http://www.opensource.org/licenses/mit-license.php
 *
 */

var rssreader = function(){

	/**
	 * 表示する内容の設定
	 */
	var config = {
		'addTime' : false,		//true = 日付＋時間   false = 日付のみ
		'title'   : true,		//true = タイトル表示 false = タイトル非表示
		'summary' : 20,			//サマリーの文字数
		'count'   : 5,			//表示件数
		''        : ''
	};

	//通信用のオブジェクト
	var connection = function(){
		/* ------------------------- [ private method ] ------------------------- */
		/**
		 * XmlHttpのオブジェクトを返す
		 * @param	なし
		 * @return	XmlHttpオブジェクト
		 * @type	XmlHttp
		 */
		var createXmlHttp = function(){
			if(window.ActiveXObject){
				// IE5, IE6, IE7
				try{
					return new ActiveXObject("Msxml2.XMLHTTP");		// MSXML3
				}catch(e){
					return new ActiveXObject("Microsoft.XMLHTTP");	// MSXML2まで
				}
			}else if( window.XMLHttpRequest && 
					!typeof document.documentElement.style.msInterpolationMode != "undefined")
			{
				// Mozilla, Firefox, Safari
				return new XMLHttpRequest();
			}else{
				return null;
			}
		};

		/* ------------------------- [ public values ] ------------------------- */
		var pub = {};					//publicアクセス用変数

		/* ------------------------- [ public method ] ------------------------- */
		/**
		 * 同期通信でXML取得を行う(現状GETのみ)
		 * ローカルのXMLも取得可能
		 * @param	url		string	URL
		 * @return	XMLDOMオブジェクト
		 * @type	XMLDOM
		 */
		pub.syncXMLRequest = function (url){
			if(window.ActiveXObject){
				// IE5, IE6, IE7
				var xmlDom = new ActiveXObject("Microsoft.XMLDOM");	// MSXML2まで
				xmlDom.async = false;
				xmlDom.load(url);
				return xmlDom;
			}else if ( window.XMLHttpRequest ){
				// Mozilla, Firefox, Safari
				var xmlHttp = new XMLHttpRequest();
				xmlHttp.open("GET", url, false);
				xmlHttp.send(null);
				return xmlHttp.responseXML;
			}
			return null;
		};

		return pub;
	}();

	//変換用のオブジェクト
	var convert = function(){
		/* ------------------------- [ private values ] ------------------------- */
		/* DOM定数宣言 */
		var ATTRIBUTE_NODE = 2;
		var TEXT_NODE	   = 3;
		var CDATA_NODE	   = 4;
		var NODE_VALUE	   = "nodeValue";

		/* ------------------------- [ private method ] ------------------------- */
		/**
		 * 文字列の\や\"をエスケープする
		 * 文字列以外はそのままのデータを返す
		 * @param	string
		 * @return	string
		 * @type	string
		 */
		var escapeString = function(targetStr){
			return typeof targetStr === "string" ? targetStr.replace( /\\/g, "\\\\" ).replace( /\"/g, "\\\"" ) : targetStr;
		};

		//xmlObjectをJsonObjectに変換
		var createXmlJson = function(processingNode,createingObject){

			//各属性を格納
			if ( typeof processingNode.attributes != "undefined" && processingNode.attributes != null){
				var attr = processingNode.attributes;
				for (var i = 0, length = attr.length; i < length; i++){
					var procAttr = attr[i];
					if ( procAttr.nodeType != ATTRIBUTE_NODE ){continue;}
					createingObject[procAttr.nodeName] =  procAttr.nodeValue;
				}
			}

			var children = processingNode.childNodes;
			var childrenLength = children.length;

			//子どもがいない場合nodeValueにブランクを代入し返却
			if ( childrenLength == 0 ){
				createingObject[NODE_VALUE] = "";
				return createingObject;
			}

			//配下の子どもがデータのみの場合格納し返却
			if ( children && childrenLength == 1 && 
				(children[0].nodeType == TEXT_NODE || children[0].nodeType == CDATA_NODE) )
			{
				createingObject[NODE_VALUE] = children[0].nodeValue;
				return createingObject;
			}

			//配下の子供を代入する
			for ( var i = 0; i < childrenLength; i++){
				if( children[i].nodeType === TEXT_NODE || children[i].nodeType === CDATA_NODE ){
					continue;
				}
				var key = children[i].nodeName;
				var value = createXmlJson(children[i], {});
				if ( typeof createingObject[key] == "undefined" ){
					createingObject[key] = [];
				}
				createingObject[key].push(value);
			}

			return createingObject;
		};

		/* ------------------------- [ public values ] ------------------------- */
		var pub = {};					//publicアクセス用変数

		/* ------------------------- [ public method ] ------------------------- */
		/**
		 * 文字列や配列、連想配列等をJsonの形式に変換して返す
		 * @param	object
		 * @return	json
		 * @type	string
		 */
		pub.jsonObjectToJsonString = function(data){
			switch ( typeof data ) {
				case "string":
					return '"' + escapeString(data) + '"';
				case "object":
					if( data === null ){
						return null;
					}else if( data.constructor == Array ){
						var array = [];
						for( var i = 0 ; i < data.length ; i++ ){
							array[i] = this.jsonObjectToJsonString( data[i] );
						}
						return "[" + array.join( "," ) + "]";
					}else{
						var array = [];
						for( var key in data ){
							if( !data.hasOwnProperty(key) ){continue;}
							array[array.length] = '"' + escapeString( key ) + '":' + this.jsonObjectToJsonString( data[key] );
						}
						return "{" + array.join( "," ) + "}";
					}
				default:
					return data;
			}
		};

		/**
		 * Jsonの文字列からObjectに変換する
		 * @param	string(json)
		 * @return	object
		 * @type	object
		 */
		pub.jsonStringToJsonObject = function(json){
			return eval("(" + json + ")");
		};

		/**
		 * XMLをJsonObjectに変換する
		 * @param	object(xml)
		 * @return	object(json)
		 * @type	object
		 */
		pub.xmlObjectToJsonObject = function(xmlResponse){
			return createXmlJson(xmlResponse,{});
		};

		return pub;
	}();

	var pub = {};

	/**
	 * htmlを読み込みtargetに吐き出す
	 */
	pub.write = function(html){
		//xml取得
		var xml = connection.syncXMLRequest(html);
		//json取得
		var json = convert.xmlObjectToJsonObject(xml);
		//rssの配信部分取得
		var items = json['rss'][0]['channel'][0]['item'];

		//jsonから各種データをHTMLとして作成
		var text = "";
		//text += '<div id="rss-feed">';
		if( config['title'] ){
			//ブログのタイトル
			//text += '<h2>'+json['rss'][0]['channel'][0]['title'][0]['nodeValue']+'</h2>';
		}
		for( var i = 0 ; i < items.length && i < config['count'] ; i++ ){
			text += '<dl>';

			//日付部分
			var date = new Date(items[i]['pubDate'][0]['nodeValue']);
			text += '<dt>';
			if( config['addTime'] ){
				text += date.toLocaleString();
			}else{
				text += date.getFullYear()+'年'+(date.getMonth()+1)+'月'+date.getDate()+'日';
			}
			text += '</dt>';

			//タイトル部分
			text += '<dd><a href="'+items[i]['link'][0]['nodeValue']+'">'+items[i]['title'][0]['nodeValue']+'</a></dd>';

			//本文
			/*text += '<p class="summary">';
			var description = items[i]['description'][0]['nodeValue'];
			text += description.substr(0, config['summary']);
			text += '...<a href="'+items[i]['link'][0]['nodeValue']+'">続きを読む</a>';
			text += '</p>';*/

			text += '</dl>';
		}
		//text += '</div>';

		//書き出し
		document.write(text);
	};

	return pub;
}();
//HTMLにdocument.writeで書き出し
rssreader.write('http://www.kanameishi.com/blog/feed');
