jQuery.noConflict();

(function($){//BEGIN jQuery
$(function(){//BEGIN jQuery.ready()

	//var isMSIE = /*@cc_on!@*/false;
	//if(isMSIE && typeof window.console != 'object') window.console = {log: function(){}};


	/**
	 * 選択
	 */
	$('#tag_nav_list_ul')
		.find('li:not(:last)')
			.chimg({exclude:'current', autoActive:true})
			.hover(function(){
				$(this).addClass('active');
			}, function(){
				$(this).removeClass('active');
			});


	/**
	 * topの最新表示
	 */
	$('#recents_box div.recent_box')
		.each(function(){
			var $this = $(this);
			var $list = $this.find('ul:eq(0)');
			var query = create_search_query($.trim($list.attr('query')));
			$list.empty();
			
			var params = {
				rpp:20
			};
			var lang = $list.attr('lang');
			if(lang) params.lang = lang;
			
			get_search_result(query, params, {}, function(json, results, rows, args){
				$list.html(rows.join(''));
			}, {type: 'recents'});
			
			window.setInterval(function(){
				$list
					.find('li:last')
						.hide()
						.prependTo($list)
						.slideDown(500)
			}, 10000);
		});


	/**
	 * detailでの表示
	 */
	$('#tweet_box')
		.each(function(){
			var $this = $(this);
			var $list = $this.find('ul:eq(0)');
			var query = create_search_query($.trim($list.attr('query')));
			var anime_silde_speed = 3000;
			var latest_id;
			var $new_post_json = $('#new_post_json');
			
			$list.empty();
			
			var params = {
				rpp:20
			};
			var lang = $list.attr('lang');
			if(lang) params.lang = lang;
			
			get_search_result(query, params, {}, function(json, results, rows, args){
				latest_id = json.max_id
				var $tmp_div = $wrap_div(rows.join(''));
				$tmp_div
					.hide()
					.appendTo($list)
					.slideDown(anime_silde_speed, function(){
						$unwrap_div($tmp_div);
						if($new_post_json.length){ //post後、最新1件を追加
							var new_post = eval($new_post_json.html()); //IEはtext()では取得できず
							new_post[0].profile_image_url = new_post[0].user.profile_image_url;
							new_post[0].from_user = new_post[0].user.screen_name;
							var rows = format_rows(new_post, 'detail');
							var $new_tmp_div = $wrap_div(rows.join('')).hide();
							$new_tmp_div
								.prependTo($list)
								.slideDown(700, function(){
									$unwrap_div($new_tmp_div);
								});
						}
					});
			}, {type: 'detail'});
			
			
			function $wrap_div(elm){
				return $(['<div>', elm, '</div>'].join(''));
			}
			
			function $unwrap_div($elm){
				$children = $elm.children().insertBefore($elm);
				$elm.remove();
				return $children;
			}


			//もっと読む
			var $tweet_more_btn = $('#tweet_more_btn');
			var current_page = 1;
			$tweet_more_btn
				.click(function(){
					get_search_result(query, {rpp:20, page:++current_page}, {}, function(json, results, rows, args){
						var $tmp_div = $wrap_div(rows.join(''));
						$tmp_div
							.hide()
							.appendTo($list)
							.slideDown(anime_silde_speed, function(){
								$unwrap_div($tmp_div);
							});
					}, {type: 'detail'});
					
					return false;
				});


			//最新を取得
			window.setInterval(function(){
				get_search_result(query, {since_id:latest_id}, {}, function(json, results, rows, args){
					latest_id = json.max_id
					var $tmp_div = $wrap_div(rows.join(''));
					$tmp_div
						.hide()
						.prependTo($list)
						.slideDown(700, function(){
							$unwrap_div($tmp_div);
						});
				}, {type: 'detail'});
			}, 1000 * 60 * 5);
			
		});






	/**
	 * query文字列を生成
	 */
	function create_search_query(query){
		var q_arr = query.split(/\s/);
		for(var i = 0, l = q_arr.length; i< l; i++){q_arr[i] = encodeURIComponent(q_arr[i]);}
		return q_arr.join('+OR+');
	}


	/**
	 * 検索
	 */
	function get_search_result(query, params, options, callback, args){
		args = args || {};
		params = $.extend({
			  lang: 'ja'
			, rpp: 100
			, page : 1
			, since_id : 0
		}, params || {});
		if(params.lang == 'all') params.lang = '';
		var uri = [
			  'http://search.twitter.com/search.json?q='
			, [
				  query
				, $.param(params)
				, 'callback=?'
			].join('&')
		].join('');

		/*
		options = $.extend({
			  url: uri
			, dataType: 'jsonp'
			, cache: false
			, success: function(json){
				//console.log(json);
				var results = json.results;
				if(!results || !results.length) return;

				var rows = format_rows(results, args);

				if(callback && $.isFunction(callback)) callback(json, results, rows, args);
			}
			, error: function(){}
		}, options || {});
		$.ajax(options);
		*/
		var retry_count = 5;
		$.getJSON(uri, function(json){
			var results = json.results;
			
			//結果が無ければ1秒後にリトライ
			if(!results || !results.length){
				if(!retry_count--) return;
				var get_json_cb = arguments.callee;
				window.setTimeout(function(){$.getJSON(uri, get_json_cb)}, 1000);
			}
			
			var rows = format_rows(results, args);
			
			if(callback && $.isFunction(callback)) callback(json, results, rows, args);
		});
	}


	/**
	 * NGワードフィルター
	 */
	function filter_ng_words(row){
		if(!row.text) return false;
		
		var ng_words = [
			'キャッシュバック'
			, '(^|\\s)Ads?(\\s|$)'
			, '^PR:'
			, '@usd_jp'
			, 'NGワードを増やす場合はこのように行を増やす'
			, '1行目以外は頭のカンマを忘れないようにする'
		];
		if(row.text.match(new RegExp(ng_words.join('|'), 'im'))) return false;
		
		return row;
	}


	/**
	 * 整形：最新のつぶやき
	 */
	function format_rows(results, args){
		var type = (args && args.type) ? args.type : 'detail';
		var related_time_options = {
			  sec: false
			, min: false
			, hour: false
			, other: function(c, d, diff){
				var dd = new Date(c);
				var m = dd.getMonth() + 1;
				var d = dd.getDate();
				var h = dd.getHours();
				var i = dd.getMinutes();
				var s = dd.getSeconds();
				
				return [
					  [
						  dd.getFullYear() || dd.getYear()
						, m < 10 ? ['0', m].join('') : m
						, d < 10 ? ['0', d].join('') : d
					].join('/')
					, [
						  h < 10 ? ['0', h].join('') : h
						, i < 10 ? ['0', i].join('') : i
						, s < 10 ? ['0', s].join('') : s
					].join(':')
				].join(' ');
			}
		};
		var rows = [];
		var format_row = function(row){return row};
		switch(type){
			case 'recents':
				format_row = function(row){
					var tr = [
						  ['<td class="img"><a href="http://twitter.com/', row.from_user, '" target="_blank"><img src="', row.profile_image_url, '" width="48" height="48" alt="', row.from_user, '" /></a></td>'].join('')
						, [
							  '<td class="txt">'
							, '<div class="user"><a href="http://twitter.com/', row.from_user, '" target="_blank">', row.from_user, '</a></div>'
							, '<p class="comment">', $.twitter.convert_link(row.text), '</p>'
							, '</td>'
						].join('')
					].join("\n");
					return [
						  '<li id="tw-', row.id, '"><table><tr>'
						, tr
						, '</tr></table></li>'
					].join('');
				}
				break;
			case 'detail':
				format_row = function(row){
					var tr = [
						  ['<td class="img"><a href="http://twitter.com/', row.from_user, '" target="_blank"><img src="', row.profile_image_url, '" width="48" height="48" alt="', row.from_user, '" /></a></td>'].join('')
						, [
							  '<td class="txt">'
							, '<div class="comment"><strong class="user"><a href="http://twitter.com/', row.from_user, '" target="_blank">', row.from_user, '</a></strong> ', $.twitter.convert_link(row.text), '</div>'
							, '<div class="foot">'
							, 	'<span class="date"><a target="" href="http://twitter.com/', row.from_user, '/status/', row.id, '" target="_blank">', $.twitter.related_time(row.created_at, related_time_options), '</a></span>'
							, 	'<span class="source"> from ', $.decode_html(row.source), '</span>'
							, '</div>'
							, '</td>'
						].join('')
					].join("\n");
					return [
						  '<li id="tw-', row.id, '"><table><tr>'
						, tr
						, '</tr></table></li>'
					].join('');
				}
				break;
		}
		for(var i = 0, l = results.length; i < l; i++){
			var row = filter_ng_words(results[i]);
			if(!row) continue;
			rows.push(format_row(row));
		}
		return rows;
	}




	/**
	 * 文字数カウント
	 */
	(function($post_form){
		if(!$post_form.length) return;

		var limit = 110;
		var $post_count = $('#post_count');
		var $textarea = $('#post_status');

		//func
		var update_count = function(){
			var count = limit - $textarea.val().length;
			$post_count[(count < 0 ? 'add' : 'remove') + 'Class']('minus').text(count);
			return count;
		};

		//attach
		$textarea
			.keyup(function(){
				update_count();
			});
		$post_form
			.submit(function(){
				if(update_count() < 0){
					alert('投稿は'+limit+'文字以内にしてください');
					return false;
				}
			});

		//init
		update_count();

	})($('#post_form'));




	/**
	 * 友達に教える
	 */
	(function(){
		var o = new $.overlay({
			  bg_color: 'white'
			, opacity: 0.6
			, click_close: false
		});
		
		var $win = $(window);
		
		var pageSize = $.overlay.pageSize;
		var $popup = $('#popup_tell_friend');
		var popup_w = 242;
		var popup_h = $popup.height();
		o.$obj.after($popup);
		
		//close
		var func_close = function(){
			$popup.hide();
			o.close(function(){
				$win
					.unbind('resize', func_resize)
					.unbind('scroll', func_scroll)
			});
		};
		$popup.find('img.btn_close_img')
			.click(func_close);
		o.$obj.click(func_close);
		
		//resize & scroll
		function func_resize(){
			var pageSize = $.overlay.pageSize;
			$popup
				.css({
					  top: (pageSize[3] - popup_h) / 2 + $win.scrollTop()
					, left: (pageSize[2] - popup_w) / 2
				});
		}
		function func_scroll(){
			var pageSize = $.overlay.pageSize;
			$popup
				.css({
					  top: (pageSize[3] - popup_h) / 2 + $win.scrollTop()
				});
		}
		
		//submit
		$form = $popup.find('form');
		$form
			.submit(function(){
				var data = {};
				$.each($form.serializeArray(), function(i, v){
					data[v.name] = v.value;
				});
				$.post($form.attr('action'), data);
				func_close();
				return false;
			});
		
		
		//define
		var tell_friend = window.tell_friend = function(){
			$popup
				.css({
					  top: (pageSize[3] - popup_h) / 2 + $win.scrollTop()
					, left: (pageSize[2] - popup_w) / 2
				});
			$win
				.resize(func_resize)
				.scroll(func_scroll);
			o.open(function(){
				$popup.show();
			});
		};
		
		
	}());


	/**
	 * 投稿成功時のflashメッセージ
	 */
	$('#flash_message_success_post')
		.blink(5, 300, function(){
			$(this).slideUp();
		});


});//END jQuery.ready()


})(jQuery);//END jQuery

