/**
 * twitter Statuses API JSON表示JS
 */
(function($) {
	//既に定義済みであれば終了
	if($.isFunction($.fn.twitterStatuses)){
		return;
	}
	//twitter検索API用表示
	$.fn.twitterStatuses = function(options){
		//オプション拡張
		options = $.extend({}, $.fn.twitterStatuses.defaults, options);

		//URLが未指定であれば終了
		if(!options.url){
			return this;
		}

		//対象を走査
		return this.each(function(){
			//代替エレメント
			var $this = $(this);
			//ローディングエレメント
			var $loading;

			//指定があれば生成、前に追加、非表示
			if(options.loading){
				$loading = $(options.loading).insertBefore($this).hide();
			}

			//ajaxリクエスト
			$.ajax({
				//URL
				url: options.url,
				//JSON（JSONP）
				dataType: options.dataType,
				//送信前処理
				beforeSend: function (XMLHttpRequest) {
					if(options.loading){
						//ローディングがあれば、代替コンテンツを非表示にして、ローディング表示
						$this.hide();
						$loading.show();
					}
				},
				//成功時（JSONPのcallback）
				success: function(data, textStatus) {
					//前処理
					if(options.preSuccess && $.isFunction(options.preSuccess)){
						options.preSuccess.apply(this, arguments);
					}
					//selectorメンバ
					var selectors = [];
					for (var n in options.tweet.selector){
						selectors.push(n);
					}

					//ラッパーを前に追加、非表示
					var $tweetWrapper = $(options.tweet.wrapper).insertBefore($this).hide();
					if(options.loading){
						//ローディングがあれば、ローディングを非表示
						$loading.hide();
					}else{
						//ローディングがなければ、代替コンテンツを非表示
						$this.hide();
					}
					//ローディング表示
					$tweetWrapper.show();

					//つぶやき配列取得
					var tweets = options.dataParser.tweet(data);

					//つぶやきを走査
					$.each(tweets, function(i,tweet){
						//表示個数に達していれば終了
						if(options.count <= i){
							return false;
						}

						//1つのつぶやきエレメントをテンプレートから生成
						var $tweet = $(options.tweet.template);

						//データ
						var tweetData = {
							//ID
							id: options.dataParser.id(tweet),
							//テキスト
							text: options.dataParser.text(tweet),
							//作成日
							createdAt: options.dataParser.createdAt(tweet),
							//ユーザ
							userId: options.dataParser.userId(tweet),
							userName:  options.dataParser.userName(tweet),
							userScreenName:  options.dataParser.userScreenName(tweet)
						};

						//selectorメンバに対応する挿入コンテンツ
						var contents = {};
						for(var n in tweetData){
							contents[n] = tweetData[n];
						}
						
						//URL部分にリンク
						if(options.convertText.linkUrl){
							contents.text = $.twitterCommon.convertTextLinkUrl(contents.text, options.linkTarget);
						}
						//ユーザ部分にリンク
						if(options.convertText.linkUser){
							contents.text = $.twitterCommon.convertTextLinkUser(contents.text, options.linkTarget);
						}
						//ハッシュ部分にリンク
						if(options.convertText.linkHash){
							contents.text = $.twitterCommon.convertTextLinkHash(contents.text, options.linkTarget);
						}
						//ハートマーク置換
						if(options.convertText.heart){
							contents.text = $.twitterCommon.convertTextHeart(contents.text);
						}

						//日時
						if(contents.createdAt && options.convertCreatedAt && $.isFunction(options.convertCreatedAt)){
							contents.createdAt = options.convertCreatedAt(contents.createdAt);
						}

						//相対時間
						contents.relativeTime = $.twitterCommon.relativeTime(tweetData.createdAt, options.relativeTimeText);

						//selectorメンバに対応するエレメント
						var $elems = {};
						//selectorメンバを走査
						for(var i=0;i<selectors.length;i++){
							var $elem = null;
							var id = selectors[i];
							var selector = options.tweet.selector[id];
							if(selector){
								//対象エレメント抽出
								$elem = $tweet.find(selector);
								//テキスト挿入
								if($elem.size() && contents[id]){
									$elem.html(contents[id]);
								}
							}
							//対象エレメント保持
							$elems[id] = $elem;
						};

						//返答URL
						if($elems.anchorReply){
							$elems.anchorReply.attr("href", $.twitterCommon.getReplyUrl(tweetData.userName, tweetData.id)).attr("target", options.linkTarget);
						}

						//ラッパーにつぶやきエレメントを追加
						$tweet.appendTo($tweetWrapper);
						
					});
					//後処理
					if(options.postSuccess && $.isFunction(options.postSuccess)){
						options.postSuccess.apply(this, arguments);
					}
				},
				//失敗時のコールバック
				error: function(XMLHttpRequest, textStatus, errorThrown) {
					//前処理
					if(options.preError && $.isFunction(options.preError)){
						options.preError.apply(this, arguments);
					}
					if(options.loading){
						//ローディングがあれば、ローディングを非表示にして、代替コンテンツを表示
						$loading.hide();
						$this.show();
					}
					//後処理
					if(options.postError && $.isFunction(options.postError)){
						options.postError.apply(this, arguments);
					}
				}
			});

		});
	};

	//標準設定
	$.fn.twitterStatuses.defaults = {
		//JSONのパス
		url: null,
		//データタイプ（json、jsonp）
		dataType: 'json',
		//表示件数
		count: 5,
		//リンクのターゲット
		linkTarget: "_blank",
		//メッセージ
		relativeTimeText:{
			lessThanMinute  : "1分以内",
			aboutMinuteAgo  : "約1分前",
			aboutMinutesAgo : "約%%NUM%%分前",
			aboutHourAgo    : "約1時間前",
			aboutHoursAgo   : "約%%NUM%%時間前",
			aboutDayAgo     : "約1日前",
			aboutDaysAgo    : "約%%NUM%%日前"
		},
		//リンク変換
		convertText: {
			//URL
			linkUrl: true,
			//ユーザ
			linkUser: true,
			//ハッシュ
			linkHash: true,
			//ハート
			heart: true
		},
		//作成日次表示内容
		convertCreatedAt: function (datetimeStr) {
			var date = new Date(datetimeStr);
			return ""
				//+ (date.getYear() + 1900) + "年"
				+ (date.getMonth() + 1) + "月"
				+ date.getDate() + "日 "
				+ ("0" + date.getHours()).slice(-2) + ":"
				+ ("0" + date.getMinutes()).slice(-2) + ":"
				+ ("0" + date.getSeconds()).slice(-2);
		},
		//ローディング
		loading : '<div>読み込み中</div>',
		//1 tweetのフォーマット
		tweet: {
			wrapper: "<ul>",
			template: "<li><p></p><p><span></span>(<span></span>) <a>REPLY</a></p></li>",
			selector: {
				id           : null,
				text         : "p:eq(0)",
				createdAt     : "p:eq(1) span:eq(0)",
				userId       : null,
				userName     : null,
				userScreen   : null,
				relativeTime : "p:eq(1) span:eq(1)",
				anchorReply  : "p:eq(1) a"
			}
		},
		dataParser: {
			tweet: function(data) {
				return data;
			},
			id: function (tweet){
				return tweet.id;
			},
			text: function (tweet){
				return tweet.text;
			},
			createdAt: function (tweet){
				//convert "Fri Dec 04 01:06:08 +0000 2009" to "Fri, 04 Dec 2009 01:06:08 +0000"
				return $.twitterCommon.normalizeDatetime(tweet.created_at)
			},
			userId: function (tweet){
				return tweet.user.id;
			},
			userName: function (tweet){
				return tweet.user.name;
			},
			userScreenName: function (tweet){
				return tweet.user.screen_name;
			}
		},
		//成功時前処理
		preSuccess: null,
		//成功時後処理
		postSuccess: null,
		//失敗時前処理
		preError: null,
		//失敗時後処理
		postError: null
	};

})(jQuery);


