var tweetScrollIndex = 0;
var isNgAccount = false;
var stopFlag = 0;
var reloadFlag = 0;
var newTweetCreatedId = 0;
var g_deleteTweetId = '';
var tweets = new Array;
var bTweets = new Array;
var ngWords = new Array();
var ngAccounts = new Array();
var hideAccounts = new Array();





function checkStatusLength(){
	var maxLen = 115;
	var str = $("#tweetPost textarea").val();
	var statusCounter = maxLen - str.length;
	if(maxLen < str.length){
		$('#charCounter').html('<span style="font-size:0.78em; color:#029BD4;">つぶやく文字数は115文字以内にしてね！</span>'+statusCounter);
		$("#tweetPost a").css('cursor','default');
		$("#tweetPost img").attr('src','/assets/images/btn_send_gray.gif');
	}else{
		$('#charCounter').html(statusCounter);
		$("#tweetPost a").css('cursor','pointer');
		$("#tweetPost img").attr('src','/assets/images/btn_send.gif');
	}
}



$(function(){

	checkStatusLength();
	$("#tweetPost textarea").keyup(checkStatusLength);

	var url = 'http://twitter.com/statuses/user_timeline/twtv_info.json?callback=?';

	$.getJSON(url, function(json){

		var info = "";
		var i,m,created_at;
		var created = new Date();

		// ツイテレ最新情報
		for(i in json){
			created_at = json[i].created_at.replace(/^(\w+) (\w+) (\w+) (.*?)( .{4})$/,"$1, $3 $2$5 $4");
			created.setTime(getTweetTimestamp(created_at));
			created_at = (created.getYear()+1900) +'/'+ (created.getMonth()+1) +'/'+ created.getDate();

			if(! json[i].text.match(/^@/)){
				info += "<dd>\n";
				info += '<p class="tweetText">'+json[i].text+'</p>';
				info += '<p class="date">'+created_at+'</p>';
				info += "</dd>\n";
			}
		}
		$('#latestInformation dl dt').append(info);

		$.get('system/data/hide_accounts.txt',function(data){
			data = $.trim(data);
			hideAccounts = data.split("\n");
			$.get('system/data/ban_remove_accounts.txt',function(data){
				data = $.trim(data);
				ngAccounts = data.split("\n");
				$.get('system/data/ng_word.txt',function(data){
					data = decodeURIComponent(data);
					data = $.trim(data);
					ngWords = data.split("\n");
					$.get('system/data/block_tweets.txt',function(data){
						data = $.trim(data);
						bTweets = data.split("\n");
						init_show_status();
						//more_show_status();
				  	});
			  	});
			});
		});
	});
});


function z2h_word(src) {
	src = src.replace(/([Ａ-Ｚａ-ｚ０-９＿＠])/g,function ($0){return String.fromCharCode($0.charCodeAt(0)-65248);});
	return src.replace(/　/g,'');
}


function update_created_at(){
	var len = $("#scrollList li input[name='timestamp']").length;
	if(len == $("#scrollList li .created_at").length){
		var i,created_at;
		for(i=0;i<len;i++){
			created_at = convert_tweet_created_at($("#scrollList li input[name='timestamp']").eq(i).val());
			$("#scrollList li .created_at").eq(i).html(created_at);
		}
	}
}

function getSearchKeyword(chAccountName){
	var searchKeyword;

	switch(chAccountName){
	case 'nhk_twtv':
		searchKeyword='%40nhk_twtv+OR+%23nhk'; // '@nhk_twtv+OR+#nhk'
		break;
	case 'etv_twtv':
		searchKeyword='%40etv_twtv+OR+%23etv';
		break;
	case 'ntv_twtv':
		searchKeyword='%40ntv_twtv+OR+%23ntv';
		break;
	case 'tbs_twtv':
		searchKeyword='%40tbs_twtv+OR+%23tbs';
		break;
	case 'tv_asahi_twtv':
		searchKeyword='%40tv_asahi_twtv+OR+%23tvasahi';
		break;
	case 'tv_tokyo_twtv':
		searchKeyword='%40tv_tokyo_twtv+OR+%23tvtokyo';
		break;
	case 'fujitv_twtv':
		searchKeyword='%40fujitv_twtv+OR+%23fujitv';
		break;
	}
	
	return searchKeyword;
}



function init_show_status(){
	tweets = [];
	var rpp = 100;
	var chAccountName = $("body").attr("id");
	var searchKeyword = getSearchKeyword(chAccountName);
	var url="http://search.twitter.com/search.json?q="+searchKeyword+"&lang=ja&page=1&rpp="+rpp+"&callback=?";

	$.getJSON(url, function(json) {
		var tmp = $.cookie('DT');
		var hideLists = new Array();
		if(tmp){
			hideLists = tmp.split('-');
		}

		var i,j,key,re;
		// [0]新 - [15]古 降順にループ
		for(i=json["results"].length-1;i>=0;i--){
			key = $.inArray(json["results"][i].id.toString(),bTweets);
			if(key != -1){ continue; }

			key = $.inArray(json['results'][i].from_user, hideAccounts);
			if(key != -1){ continue; }

			key = $.inArray(json['results'][i].id.toString(), hideLists);
			if(key != -1){ continue; }

			for(j=0;j<ngWords.length;j++){
				re = new RegExp(ngWords[j],"");
				json["results"][i].text = json["results"][i].text.replace(re,"****");
			}

			var status = json["results"][i].text;
			status = z2h_word(status);

			// メルアド・TEL置換
			re = /[\w_!#\$\%&'*+\/=?\^`{}~|\-\.]+@[\w]+(\.[\w]+)+/g; //"'
			status = status.replace(re,'###@###.###');

			re = /\d{2,5}(\-| )\d{2,4}(\-| )\d{4}/g;
			status = status.replace(re,'##-####-####');
			json["results"][i].text = status;
			json['results'][i].timestamp = getTweetTimestamp(json['results'][i].created_at);
			json['results'][i].created_at = convert_tweet_created_at(json['results'][i].timestamp);

			if(newTweetCreatedId < json['results'][i].id){
				newTweetCreatedId = json['results'][i].id;
				// tweetsの先頭に時系列で新しいのを追加していく。
				tweets.unshift(json['results'][i]);
			}
        }

		//tweetScrollIndex = tweets.length;
		tweetScrollIndex = (json["results"].length < 10) ? json["results"].length : 10;
		add_list(100,"fast");

		// 30 秒に一度確認
		$.timer(30000, function (timer){
			timer.stop();

			reloadFlag |= 2;
			// 30秒経過 && スクロールが完了したら次を取得
			if(reloadFlag == 3){
				update_created_at();
				reloadFlag = 0;
				more_show_status();
			}
		});
    });
}




function more_show_status(){
	tweets = [];
	var rpp = 10;
	var chAccountName = $("body").attr("id");
	var searchKeyword = getSearchKeyword(chAccountName);

	var url="http://search.twitter.com/search.json?q="+searchKeyword+"&lang=ja&page=1&rpp="+rpp+"&callback=?";

	$.getJSON(url, function(json) {
		var tmp = $.cookie('DT');
		var hideLists = new Array();
		if(tmp){
			hideLists = tmp.split('-');
		}

		var i,j,key,re;
		// [0]新 - [15]古 降順にループ
		for(i=json["results"].length-1;i>=0;i--){
			key = $.inArray(json["results"][i].id.toString(),bTweets);
			if(key != -1){ continue; }

			key = $.inArray(json['results'][i].from_user, hideAccounts);
			if(key != -1){ continue; }

			key = $.inArray(json['results'][i].id.toString(), hideLists);
			if(key != -1){ continue; }

			for(j=0;j<ngWords.length;j++){
				re = new RegExp(ngWords[j],"");
				json["results"][i].text = json["results"][i].text.replace(re,"****");
			}

			var status = json["results"][i].text;
			status = z2h_word(status);

			// メルアド・TEL置換
			re = /[\w_!#\$\%&'*+\/=?\^`{}~|\-\.]+@[\w]+(\.[\w]+)+/g; //"'
			status = status.replace(re,'###@###.###');
			re = /\d{2,5}(\-| )\d{2,4}(\-| )\d{4}/g;
			status = status.replace(re,'##-####-####');

			json["results"][i].text = status;
			json['results'][i].timestamp = getTweetTimestamp(json['results'][i].created_at);
			json['results'][i].created_at = convert_tweet_created_at(json['results'][i].timestamp);

			if(newTweetCreatedId < json['results'][i].id){
				newTweetCreatedId = json['results'][i].id;
				// tweetsの先頭に時系列で新しいのを追加していく。
				tweets.unshift(json['results'][i]);
			}
        }

		tweetScrollIndex = tweets.length;

		add_list(3000,"normal");
    });


	// 30 秒に一度確認
	$.timer(30000, function (timer){
		timer.stop();

		reloadFlag |= 2;
		// 30秒経過 && スクロールが完了したら次を取得
		if(reloadFlag == 3){
			update_created_at();
			reloadFlag = 0;
			more_show_status();
		}
	});
}


function getTweetLiTag(tweet){
	var liTag = document.createElement('li');
	//liTag.id = 'list_'+tweetScrollIndex;
	liTag.id = 'list_'+tweet.id;
	liTag.style.display = 'none';

	var toolSrc = tweet.source.replace(/&lt;/g,"<");
	toolSrc = toolSrc.replace(/&gt;/g,">");
	toolSrc = toolSrc.replace(/&quot;/g,'"');
	toolSrc = toolSrc.replace(/">/,'" style="color:#777777;" target="_blank">');

	var text = tweet.text;
	text = text.replace(/@(.*?)(:| |$)/g,'@<a href="http://twitter.com/$1" target="_blank">$1</a> ');
	text = text.replace(/#(.*?)(:| |$)/g,'#<a href="http://twitter.com/#search?q=%23$1" target="_blank">$1</a> ');

	var s = '<table border="0">';
	s+= '<tr><td><input type="hidden" name="timestamp" value="'+tweet.timestamp+'" />';
	s+= '<img src="assets/images/spacer.gif" width="58" height="1" /><br />';
	s+= '<a href="http://twitter.com/'+tweet.from_user+'" target="_blank">';
	s+= '<img src="'+ tweet.profile_image_url+ '" width="48" height="48" />';
	s+= '</a>';
	s+= '</td>';
	s+= '<td>';
	s+= '<p style="text-align:left; width:544px; background-color:#fff;">';
	s+= '<a href="http://twitter.com/'+tweet.from_user+'" id="'+liTag.id+'_from_user" target="_blank">'+tweet.from_user+'</a> ';
	s+= text;
	s+= '</p>';
	s+= '<p style="font-size: 85%; margin-top:4px;">';
	if(tweet.id){
		s+= '<a href="http://twitter.com/'+tweet.from_user+'/status/'+tweet.id+'" style="color: #777777;" id="'+liTag.id+'_comment_id" class="created_at" target="_blank">'+tweet.created_at+'</a> ';
	}else{
		// 自分で投稿した内容
		s+= '<a href="http://twitter.com/'+tweet.from_user+'" style="color: #777777;" id="'+liTag.id+'_comment_id" class="created_at" target="_blank">'+tweet.created_at+'</a> ';
	}
	s+= toolSrc+"で </p>";
	s+= '</td>';
	s+= '<td class="trashTd" style="vertical-align:bottom;">';

	if(isNgAccount){
		s+= '<img src="assets/images/btn_ng_trash.gif" alt="削除" title="削除" width="16" height="16" />';
	}else{
		s+= '<a href="javascript:void(0);" onclick="clickTrashBtn(\''+liTag.id+'\');">';
		s+= '<img src="assets/images/btn_trash.gif" alt="削除" title="削除" width="16" height="16" /></a>';
	}
	s+= '</td></tr></table>';

	liTag.innerHTML = s;

	return liTag;
}


function moreReadOldStatuses(){
	var h = $('#scrollList').height();

	h += 800;
	if(h <= 8000){
		$('#scrollList').css("height",h+"px");
	}
	if(8000 <= h){
		$('#tweetsList .btnMore').html('<img src="assets/images/btn_more_off.gif" alt="もっと読む" title="もっと読む" class="hover" />');
	}
}



function add_list(millisecond,showSpeed){

	if(tweetScrollIndex <= 0){
		// 初回完了
		if(millisecond == 100){
			$('#tweetsList .btnMore').html('<a href="javascript:void(0);" onclick="moreReadOldStatuses();"><img src="assets/images/btn_more.gif" alt="もっと読む" title="もっと読む" onmouseover="this.src=\'assets/images/btn_more_on.gif\'" onmouseout="this.src=\'assets/images/btn_more.gif\'" class="hover" /></a>');

			var initViewLength = (tweets.length < 10) ? tweets.length : 10;
			var i;
			for(i=initViewLength;i<tweets.length;i++){
				var liTag = getTweetLiTag(tweets[i]);
				liTag.style.display = 'block';
				$('#scrollList').append(liTag);
			}

			while(1){
				var lastLiTagPosY = Math.floor($("#scrollList li:last").offset()["top"] - $("#scrollList").offset()["top"]);
				if(8000 < lastLiTagPosY){
					$("#scrollList li:last").remove();
				}else{
					break;
				}
			}
		}

		reloadFlag |= 1;
		// 30秒経過 && スクロールが完了したら次を取得
		if(reloadFlag == 3){
			update_created_at();
			reloadFlag = 0;
			more_show_status();
		}
		return;
	}

	var liTag = getTweetLiTag(tweets[tweetScrollIndex-1]);
	if(stopFlag == 0){
		$('#scrollList').prepend(liTag);
		tweetScrollIndex--;
	}

	$(liTag).show(showSpeed,function(){ //showSpeed [slow normal fast]
		var lastLiTagPosY = Math.floor($("#scrollList li:last").offset()["top"] - $("#scrollList").offset()["top"]);
		if(lastLiTagPosY > 8000){ $("#scrollList li:last").remove(); }
		lastLiTagPosY = Math.floor($("#scrollList li:last").offset()["top"] - $("#scrollList").offset()["top"]);
		if(lastLiTagPosY > 8000){ $("#scrollList li:last").remove(); }

		$.timer(millisecond, function (timer){
			timer.stop();
			add_list(millisecond,showSpeed);
		});
	});
}




function getTweetTimestamp(created_at){
	var twtime = created_at; //'Tue, 10 Nov 2009 03:25:47 +0000';
	twtime = twtime.replace(/^(.*?), /,"");
	twtime = twtime.replace(/ \+(.*?)$/,"");
	twtime = twtime.replace(/^(.*?) (.*?) /,"$1 $2 ");

	var created = new Date(twtime);
	return created.getTime() + 32400000;
}




function convert_tweet_created_at(timestamp){
	var created = new Date();
	created.setTime(timestamp);

	var now = new Date();
	var t = now.getTime() - created.getTime();

	t = Math.floor(t/1000);
	if(t<86400){
		if(t < 3600){
			if(t < 60){
				return t + "秒前 ";
			}else{
				return Math.floor(t/60) + "分前 ";
			}
		}else{
			return '約'+Math.floor(t/3600) + "時間前 ";
		}
	}

	var d = new Date();
	var month = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'];
	var minutes = created.getMinutes();
	if(minutes < 10){minutes = '0'+minutes.toString();}
	t = created.getHours()+':'+minutes+' ';
	t+= (12 <= created.getHours()) ? 'PM ':'AM ';
	t+= month[created.getMonth()]+' ';
	t+= created.getDate()+'th';
	if(now.getFullYear() != created.getFullYear()){
		t += ", "+created.getFullYear();
	}

	return t;
}



function clickTrashBtn(deleteTweetId){
	if(deleteTweetId != 'list_'){
		g_deleteTweetId = deleteTweetId;
		showBox('boxDelete');
	}
}

function deleteTweet(json){
	if(-1 != jQuery.inArray(json["screen_name"], ngAccounts)){
		alert("can not delete.");
		isNgAccount = 1;
		$(".trashTd").each(function (i) {
			$(this).html('<img src="assets/images/btn_ng_trash.gif" alt="削除" title="削除" width="16" height="16" />');
		});
		hideBox();
		return;
	}

	var list_id = g_deleteTweetId;
	var comment_id = $('#'+list_id+'_comment_id').attr('href').replace(/^(.*)\//,"");
	var username = $('#'+list_id+'_from_user').html();
	
	var query = 'delete_username='+json["screen_name"]+'&username='+username+'&comment_id='+comment_id;
	var url = 'system/delete_tweet.php';

    var httpObj = $.post(url,query,function(data,status){
        var str = "";
		if(httpObj.responseText == '1'){
			isNgAccount = 1;
			$(".trashTd").each(function (i) {
				$(this).html('<img src="assets/images/btn_ng_trash.gif" alt="削除" title="削除" width="16" height="16" />');
			});
			return;
		}

		if($.cookie('DT') == null){
			$.cookie("DT",comment_id);
		}else{
			var tmp = $.cookie('DT');
			$.cookie("DT",tmp+'-'+comment_id);
		}

		var list_id_number = list_id.replace(/\D/g,"");
		if(tweets[list_id_number]){
			tweets.splice(list_id_number,1);
		}

		$('#'+list_id).remove();

		if(stopFlag == 1){
			$("#alertDeleteList").fadeOut(300);
		}
		stopFlag = 0;

		hideBox();
    });
}