
var timerID;
var dateObj = new Date;
//alert(dateObj.format('Y-m-d H:i:s'));


function set_article(source) {
	var httpRegExp = RegExp(/[^>"](http|https):\/\/([-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)/);
	var nameRegExp = RegExp(/@([_a-zA-Z0-9]+)/);
	var hashtagRegExp = RegExp(/#([_a-zA-Z0-9]+)/);

	var article = source;

	while(article.match(httpRegExp)) {
		article = article.replace(httpRegExp,' <a href="$1://$2" target="_blank">$1://$2</a>');
	}
	
	while(article.match(nameRegExp)) {
		article = article.replace(nameRegExp,'@<a href="http://twitter.com/$1" target="_blank">$1</a>');
	}
	
	while(article.match(hashtagRegExp)) {
		article = article.replace(hashtagRegExp,'#<a href="http://twitter.com/search?q=%23$1" target="_blank">$1</a>');
	}
	
	return article;
}

function get_reply_link(tweet_id,screen_name) {
	var reply_link = 'http://twitter.com/?status=@' + screen_name + '&in_reply_to_status_id=' + tweet_id + '&in_reply_to=' + screen_name;
	return reply_link;
}

var on_reply_link = false;
var on_retweet_link = false;

function get_reply_html(tweet_id,screen_name) {
	var reply_link = get_reply_link(tweet_id,screen_name);
	var reply_html = $("<span/>")
						.addClass('reply')
						.append(
							$("<a/>")
								.attr('href',reply_link)
								.attr('target','_blank')
								.text('返信')
								.mouseover(function(event) {
									$(this)
										.css('color','#f00')
										.css('background-image','url(/img/top/icon_reply_on.gif)')
										.css('background-repeat','no-repeat')
										.css('background-position','0 0');
									on_reply_link = true;
								})
								.mouseout(function() {
									on_reply_link = false;
								})
							);
	return reply_html;
}

function get_retweet_link(screen_name,article) {
	var retweet_link = 'http://twitter.com/home?status= RT @' + screen_name + ': ' + encodeURIComponent(article);
	return retweet_link;
}

function get_retweet_html(screen_name,article) {
	var retweet_link = get_retweet_link(screen_name,article);
	var retweet_html = $("<span/>")
						.addClass('retweet')
						.append(
							$("<a/>")
								.attr('href',retweet_link)
								.attr('target','_blank')
								.text('リツイート')
								.mouseover(function(event) {
									$(this)
										.css('color','#f00')
										.css('background-image','url(/img/top/icon_retweet_on.gif)')
										.css('background-repeat','no-repeat')
										.css('background-position','0 0');
									on_retweet_link = true;
								})
								.mouseout(function() {
									on_retweet_link = false;
								})
							);
	return retweet_html;
}

function get_screen_name_link(screen_name) {
	var screen_name_link = 'http://twitter.com/' + screen_name;
	return screen_name_link;
}

function get_screen_name_html(screen_name, retweetby) {
	var screen_name_link = get_screen_name_link(screen_name);
	var screen_name_html = $("<span/>")
		.addClass("screen_name")
		.html($("<a/>")
			.attr("href",screen_name_link)
			.attr("target","_blank")
			.text(screen_name)
		);

	if(retweetby) {
		$(screen_name_html).addClass('retweet_icon');
	}
	return screen_name_html;
}

function make_tweet_row(tweet_id,img,screen_name,article,tweet_date,retweetby) {
	var screen_name_html = get_screen_name_html(screen_name, retweetby);
	var reply_html = get_reply_html(tweet_id,screen_name);
	var retweet_html = get_retweet_html(screen_name,article);

	var text_box = $("<div/>")
					.addClass('text_box')
					.append($("<div/>")
								.addClass('article_box')
								.append(screen_name_html)
								.append($("<span/>")
									.addClass("article")
									.html(set_article(article))
									)
						)
					.append($("<div/>")
								.addClass('date_reply_box')
								.addClass('container')
								.append($("<div/>")
									.addClass('date_box')
									.append('<span class="tweet_date">'+tweet_date+'</span>')
									)
								.append($("<div/>")
									.addClass('reply_box')
									.append(reply_html)
									.append(retweet_html)
									)
						);
	if(retweetby) {
		$(text_box)
			.append($("<div/>")
					.append(
						$("<a/>")
							.attr('href','http://twitter.com/'+retweetby)
							.text(retweetby)
						)
					.append(' がリツイート')
				);
	}


	var tweet = $("<tr/>")
		.attr('id',tweet_id)
		.addClass("container")
		.append($('<td/>')
			.append($("<img/>")
				.attr("src", img).attr('width','36px').attr('height','36px'))
			)
		.append($('<td/>')
			.append(text_box)
			)
		.mouseover(function() {
			$(this).css('background-color','#f7f7f7')
			$("span.reply a",this).css('color','#2276BB');
			if(on_reply_link == false) {
				$("span.reply a",this)
					.css('background-image','url(/img/top/icon_reply_off.gif)')
					.css('background-repeat','no-repeat')
					.css('background-position','0 0');
			}
			$("span.retweet a",this).css('color','#2276BB');
			if(on_retweet_link == false) {
				$("span.retweet a",this)
					.css('background-image','url(/img/top/icon_retweet_off.gif)')
					.css('background-repeat','no-repeat')
					.css('background-position','0 0');
			}
		})
		.mouseout(function() {
			$(this).css('background-color','#fff')
			$("span.reply a",this).css('color','#fff');
			$("span.reply a",this)
				.css('background-image','none');
			$("span.retweet a",this).css('color','#fff');
			$("span.retweet a",this)
				.css('background-image','none');
		});


	return tweet;
}


function get_row_ids(display_id) {
	var tweet_ids = new Array();
	
	$(display_id+' tbody tr').each(function(i,item){
		var id = $(item).attr('id');
		tweet_ids.push(id);
	});
	return tweet_ids;
}


function display_timeline(url, display_id, mode, num) {
	$.ajax({
	    url: url,
		type: "GET",
		data: {
				"num":num
			},
	    dataType: "xml",
	    cache: false,
	    success: function(data, status, xhr) {
			
			var tweet_ids = get_row_ids(display_id);
			var prepend_stack = new Array();
		
			$("status",data).each(function(){
				
				var tweet_id = $('id',this).text();
				if(!tweet_ids.contains(tweet_id)) {
					var img = '';
					var screen_name = '';
					var article = '';
					var tmp_date = '';
					var tweet_date = '';
					var retweetby = '';
					if($("screen_name",$(this).find('retweeted_status')).text()) {
						img = $("profile_image_url",$(this).find('retweeted_status')).text();
						screen_name = $("screen_name",$(this).find('retweeted_status')).text();
						article = $("text",$(this).find('retweeted_status')).text();
						tmp_date = replaceTwTimeStr($("created_at:first",$(this).find('retweeted_status')).text());
						tweet_date = dateObj.format('Y/m/d H:i:s',tmp_date);
						retweetby = $("screen_name:last",this).text();
					} else {
						img = $("profile_image_url",this).text();
						screen_name = $("screen_name",this).text();
						article = $("text",this).text();
						tmp_date = replaceTwTimeStr($("created_at:first",this).text());
						tweet_date = dateObj.format('Y/m/d H:i:s',tmp_date);

					}

					var tweet_row = make_tweet_row(tweet_id,img,screen_name,article,tweet_date,retweetby);

					if(mode=='append') {
						$(display_id).append(tweet_row);
					} else if(mode=='prepend'){
						prepend_stack.unshift(tweet_row);
					}
				}
			});
	    	
			if(prepend_stack.length>0) {
				for(var i in prepend_stack) {

					var new_id = $(prepend_stack[i]).attr('id');

					if(new_id) {
						$(display_id+' tr:last').remove();

						$(prepend_stack[i])
							.prependTo(display_id)
							.hide()
							.animate(
									{opacity: "show"},
									{duration:1500,queue: false}
								);
					}
				}
			}

		}
	});
}


function stopTimer() {
	clearInterval(timerID);
}

// php_date.js IE対策
function replaceTwTimeStr(time) {
	var tArray = time.split(" ");
	var timeStr = tArray[0] + " " + tArray[1] + " " + tArray[2] + " " + tArray[5] + " " + tArray[3] + " " + tArray[4];
	return timeStr;
}

// 配列内を検索
if( ! Array.prototype.contains ){
        /**
        * @access public
        * @param value mixed 検索するオブジェクト
        * @return boolean 対象配列に既にオブジェクトが存在していれば true, そうでなければ false
        * 配列の値の重複チェックなどに使用。
        */
        Array.prototype.contains = function( value ){
            for(var i in this){
                if( this.hasOwnProperty(i) && this[i] === value){
                    return true;
                }
            }
            return false;
        }
}

$(function(){
	display_timeline('/top_tweet', '#m_special', 'append', 5);
	
	timerID = setInterval("display_timeline('/top_tweet', '#m_special', 'prepend', 5)", 1000*30);
});

