$( function(){

	$.fn.setTweets = function( i_complete ) {
	
		var $self = $( this );
		//表示する件数( -1で全件表示 )
		var showNum = -1;
		//テンプレート
		var templete = $self.html().replace( /\t/g, "" ).replace( /\n/g, "" ).replace( /(\<\!\-\-).+?(\-\-\>)/g, "" );
		//Twitterアカウント
		var accounts = $self.attr( "title" ).split( "," );
		//つぶやきデータ
		var tweets = [];
		//対象を空に
		$self.empty();
		
		//回避
		$( window ).error( function(){ loaded() } );
		
		//ロード開始
		var loadedCount = 0;
		var loadCount = accounts.length;
		//ロード項目が無いとき
		if( !loadCount ) {
			return;
		}
		for( var i = 0; i<loadCount; i++ ) {
			getTweets( accounts[i] );
		}
		
		/*-------------------------------------------
		* つぶやきをロード
		-------------------------------------------*/
		function getTweets( i_account ) {
			var url = "http://www.twitter.com/statuses/user_timeline/" + i_account + ".json?callback=?";
			$.getJSON( url, loaded );
		}
		
		/*-------------------------------------------
		* ロード後
		-------------------------------------------*/
		function loaded( i_tweets ) {
			
			//つぶやきデータ取得時
			if( i_tweets ) {
				var l = i_tweets.length;
				for( var i = 0; i<l; i++ ) {
					
					//@付き呟きは省く
					if( i_tweets[i]["text"].match(/@/g) ) {
						continue;
					}
					
					//日付をDateクラスに変更
					var date = i_tweets[i]["created_at"].split(" ");
					date = date[1]+" "+date[2]+", "+date[5]+" "+date[3];
					i_tweets[i]["date"] = new Date( Date.parse( date ) );
					i_tweets[i]["time"] = i_tweets[i]["date"].getTime();
					
					tweets.push( i_tweets[i] );
				}
			}
			
			loadedCount++;
			//ロード総数に達した時
			if( loadCount <= loadedCount ) {
				//HTMLに反映
				append( sortTweet( tweets ) );
			}
		}
		
		/*-------------------------------------------
		* 結果をHTMLに追加
		-------------------------------------------*/
		function append( i_tweets ) {
			var html;
			var text;
			var date;
			var data;
			var l = i_tweets.length;
			if( showNum > 0 ) {
				l = showNum;
			}
			for( var i = 0; i<l; i++ ) {
				
				data = i_tweets[i];
				text = data["text"].replace( /\r\n/g, "" ).replace( /(\n|\r)/g, "" );
				text = byteText( text, 300 );
				date = prettyDate( data["date"] );
				
				//テキスト置換
				html = templete.replace( /(\{|%7B)\$text(\}|%7D)/g, text );
				//日付置換
				html = html.replace( /(\{|%7B)\$time(\}|%7D)/g, date );
				//URLがはいっていたらリンクに変換
				html = html.replace( /((http|https):\/\/[0-9a-zA-Z-\/._?=&%\[\]~;+]+)/g, '<a href="$1" target="_blank">$1</a>' );
				html = $( html ).appendTo( $self );
				
			}
			
			//コールバック関数が登録されていたら
			if( typeof( i_complete ) == "function" ) {
				i_complete( i );
			}
			
		}
		
		/*-------------------------------------------
		* つぶやきをソート
		-------------------------------------------*/
		function sortTweet( i_tweets ){
			var num = i_tweets.length;
			for( var i = 0; i < num; i++ ){
				for( var j = num - 1; j > i; j -- ){
					if( i_tweets[ j ]["time"] > i_tweets[ j - 1 ]["time"] ){
						var tmp = i_tweets[ j ];
						i_tweets[ j ] = i_tweets[ j - 1 ];
						i_tweets[ j - 1 ] = tmp;
					}
				}
			}
			return i_tweets;	
		}
		
		/*-------------------------------------------
		* 時間を精製
		-------------------------------------------*/
		var timeZoneOffset = new Date().getTimezoneOffset()*60;
		function prettyDate( i_time ){
			var diff = ((( new Date() ).getTime() - i_time.getTime() ) / 1000) + timeZoneOffset;
			var day_diff = Math.floor( diff / 86400 );
			
			return day_diff == 0 && (
				diff < 60 && "1分以内" ||
				diff < 120 && "1分前" ||
				diff < 3600 && Math.floor( diff / 60 ) + "分前" ||
				diff < 7200 && "1時間前" ||
				diff < 86400 && Math.floor( diff / 3600 ) + "時間前") ||
				day_diff == 1 && "昨日" ||
				day_diff < 7 && day_diff + "日前" ||
				day_diff < 31 && Math.ceil( day_diff / 7 ) + "週間前";
		};
		
		/*-------------------------------------------
		* バイト単位で文字列長を調整
		-------------------------------------------*/
		function byteText( i_text, i_byte ) {
			var count = 0;
			var l = i_text.length;
			var append = false;
			i_byte -= 3;
			for ( var i = 0; i < l; i++ ){
				if( escape( i_text.charAt( i ) ).length < 4 ) count++; 
				else count += 2;
				if( count > i_byte ) {
					append = true;
					break;
				}
			}
			var t = i_text.substring( 0, i );
			if( append ) t += "...";
			return t;
		}
	}
	
	//Tweet表示領域がある時
	$TweetContent = $( "#TwitterContent" );
	if( $TweetContent.length ) {
	
		//開始
		$TweetContent.setTweets( function( i_tweetNum ){
			/*--------------------------------------------------
			* ロード完了後
			--------------------------------------------------*/
			var tweetContentHeight = $TweetContent.height();
			var $tweets = $TweetContent.find( ".tweet" );
			var $prevBtn = $( "#TweetNavi .prev" );
			var $nextBtn = $( "#TweetNavi .next" );
			var nowIndex = 0;
			var maxIndex = i_tweetNum - 1;
			var minMarginTop = $( "#TwitterContentContainer" ).height() - tweetContentHeight;
			var timer;
			
			/*---------------------------------------------------
			* Tweetインデックス変更時
			---------------------------------------------------*/
			function onChangeIndex() {
			
				//タイマーをストップ
				if( timer ) {
					clearInterval( timer );
				}
				
				if( nowIndex <= 0 ) {
					nowIndex = 0;
					$prevBtn.addClass( "disable" );
				}else {
					$prevBtn.removeClass( "disable" );
				}
				
				if( nowIndex >= maxIndex ) {
					nowIndex = maxIndex;
					$nextBtn.addClass( "disable" );
				}else {
					$nextBtn.removeClass( "disable" );
				}
			
				var marginTop = -5;
				for( var i = 0; i<nowIndex; i++ ) {
					marginTop -= $tweets.eq( i ).height() + 5;
				}
				
				//表示領域に空白を作らないように
				if( marginTop < minMarginTop ){
					marginTop = minMarginTop;
					$nextBtn.addClass( "disable" );
				}
				
				//アニメーション
				$TweetContent.stop().animate( { "marginTop": marginTop }, 300, function(){
					timer = setInterval( onTimer, 5000 );				
				} );
			
			};
			
			/*---------------------------------------------------
			* Timerイベント
			---------------------------------------------------*/
			function onTimer() {
			
				nowIndex++;
				if( $nextBtn.hasClass( "disable" ) ) {
					nowIndex = 0;
				}
				onChangeIndex();
				
			};
			
			/*---------------------------------------------------
			* ナビをクリック時
			---------------------------------------------------*/
			$( "#TweetNavi a" ).click( function(){
				
				var $self = $( this );
				if( $self.hasClass( "disable" ) ) {
					return false;
				}
				
				if( $self.hasClass( "prev" ) ) {
					nowIndex--;
				}else {
					nowIndex++;
				}
				
				onChangeIndex();
				return false;
				
			} );
			$prevBtn.click();
		} );
	};
} );
