(function($){
$.ExhibitCommunicateComment = function(s){

	var isOpened = false,     // 開閉フラグ
	    isSended = false,     // 押下フラグ
	    isNowLoading = false; // 読込フラグ

	// settings
	var defaultSettings = {
		default_title   : 'タイトルを入力してください',
		default_comment : '本文を入力してください',
		exhibit_id      : null,
		page            : 1
	};
	s = $.extend({}, defaultSettings, s);

  	var tpl_list = '';
	tpl_list += '<div id="ExhibitCC-id-${id}" class="ExhibitCC-box clearfix">';
		tpl_list += '<p class="ExhibitCC-photo">';
			tpl_list += '<a href="/creator/${poster.id}"><img src="${poster.profile_image}" width="44" height="44" /></a><br />';
			tpl_list += '<a class="ExhibitCC-nickname" data-id="${poster.id}" href="/creator/${poster.id}">${poster.nickname}</a>';
		tpl_list += '</p>';
		tpl_list += '<div class="ExhibitCC-content">';
			tpl_list += '<div class="ExhibitCC-title clearfix">';
				tpl_list += '<h3>${title}</h3>';
				tpl_list += '<div class="ExhibitCC-subinfo">';
					tpl_list += '{{if is_authenticated}}';
					tpl_list += '<div>';
						tpl_list += '<a href="javascript:void(0);" class="ExhibitCC-reply" data-id="${id}">&gt;&gt;このコメントに返信する</a>';
						tpl_list += '{{if can_delete}}';
							tpl_list += '&nbsp;&nbsp;<a href="javascript:void(0);" class="ExhibitCC-delete" data-id="${id}">[×]</a>';
						tpl_list += '{{/if}}';
					tpl_list += '</div>';
					tpl_list += '{{/if}}';
					tpl_list += '<div class="ExhibitCC-time">${updated_at}</div>';
				tpl_list += '</div>';
			tpl_list += '</div>';
			tpl_list += '<div class="ExhibitCC-comment">${comment}</div>';
		tpl_list += '</div>';
  	tpl_list += '</div>';

	/**
	 * 一覧取得関数
	 */
	function list (next)
	{
		// 一覧取得処理中だったら
		if (isNowLoading) return error('ただいま一覧を読み込み中です。');

		// 作品IDがなかったら
		if (!s.exhibit_id) return error('ただいま作品掲示板は正常に動作しません。');

		// NEXTフラグが立っていたら
		if (next) s.page += 1;

		$('.ExhibitCC-view-nowloading').show();
		var page = s.page;
		isNowLoading = true; // 一覧取得処理中

		$.ajax({
			url      : __root + 'api/exhibit-communicate-comment/list',
			type     : 'POST',
			dataType : 'json',
			data     : {
				exhibit_id : s.exhibit_id,
				page       : page
			},
			success : function(response, status)
			{
				// 1ページ目だったら結果表示HTMLを空にする
				if (page === 1) $('.ExhibitCC-view-result').empty();

				if (response && response.success)
				{
					$('.ExhibitCC-view-nowloading').slideUp();
					$('.ExhibitCC-view-nothing').slideUp();

					$.each(response.data, function(key){
						this.key = key;
						$('.ExhibitCC-view-result').append($.tmpl( tpl_list, this ));
					});

					// 5件あったら次へボタン表示
					if (response.data.length === 5) $('.ExhibitCC-view-next').show();

					$('.ExhibitCC-view-result').slideDown(function(){bind();});
				}
				else
				{
					$('.ExhibitCC-view-nowloading').slideUp();
					// 1ページ目以外で読み込みが失敗したらそこが最初の投稿
					if (page > 1) $('.ExhibitCC-view-nothing').text('ここが最初の投稿です。');
					$('.ExhibitCC-view-nothing').slideDown();
					$('.ExhibitCC-view-next').hide();
				}
				isNowLoading = false; // 一覧取得処理終了
			}
		});
	}

	/**
	 * 共通エラー関数
	 */
	function error(msg)
	{
		alert(msg);
		return false;
	}

	/**
	 * 共通リセット関数
	 */
	function reset(callback)
	{
		$('#ExhibitCC-form').slideUp(function()
		{
			$('#ExhibitCC-input-reply-zone').hide();
			$('#ExhibitCC-input-comment').val('').focus();
			$('#ExhibitCC-input-title').val('').focus();
			$('#ExhibitCC-input-reply-id').val('0');
			$('#ExhibitCC-input-reply').html('');
			isOpened = false;

			if (typeof callback === 'function')
			{
				callback();
			}
		});
	}

	/**
	 * リバインドしなければならないイベントリバインド関数
	 */
	function bind ()
	{
		/**
		 * タイトル欄が空だったら
		 */
		if ($('#ExhibitCC-input-title').val() == '')
		{
			$('#ExhibitCC-input-title').val(s.default_title);
		}

		/**
		 * コメント欄が空だったら
		 */
		if ($('#ExhibitCC-input-comment').val() == '')
		{
			$('#ExhibitCC-input-comment').val(s.default_comment);
		}

		/**
		 * タイトル欄のフォーカス、ブラー時
		 */
		$('#ExhibitCC-input-title')
			.unbind('focus blur').bind(
			{
				'focus': function()
				{
					if ($(this).val() == s.default_title)
					{
						$(this).val('');
						$(this).css('color', '#000');
					}
				},
				'blur': function()
				{
					if ($(this).val() == '')
					{
						$(this).val(s.default_title);
						$(this).css('color', '#999');
					}
				}
			});

		/**
		 * コメント欄のフォーカス、ブラー時
		 */
		$('#ExhibitCC-input-comment')
			.unbind('focus blur').bind(
			{
				'focus': function()
				{
					if ($(this).val() == s.default_comment)
					{
						$(this).val('');
						$(this).css('color', '#000');
					}
				},
				'blur': function()
				{
					if ($(this).val() == '')
					{
						$(this).val(s.default_comment);
						$(this).css('color', '#999');
					}
				}
			});

		/**
		 * 返信ボタンをクリック
		 */
		$('.ExhibitCC-reply')
			.unbind('click').bind('click', function()
			{
				var $comment = $('#ExhibitCC-id-' + $(this).attr('data-id'));

				reset(function()
				{
					var reply_title, reply_nickname, reply_id;

					reply_title = $comment.find('h3').text();
					reply_nickname = $comment.find('.ExhibitCC-nickname').text();
					reply_id = $comment.find('.ExhibitCC-nickname').attr('data-id');

					$('#ExhibitCC-input-reply').html('<b>' + $.trim(reply_nickname) + '</b>さんへの返信コメントです。');
					$('#ExhibitCC-input-title').val('Re:' + $.trim(reply_title)).css('color', '#000');
					$('#ExhibitCC-input-comment').focus().val('＞' + $.trim(reply_nickname) + 'さん\n').css('color', '#000');
					$('#ExhibitCC-input-reply-id').val(reply_id);
					$('#ExhibitCC-input-reply-zone').show();
					$('#ExhibitCC-form').slideDown();
					isOpened = true;
				});
			});

		/**
		 * 返信キャンセルボタンをクリック
		 */
		$('#ExhibitCC-input-reply-cancel')
			.unbind('click').bind('click', function(){reset();});

		/**
		 * 次へボタンをクリック
		 */
		$('.ExhibitCC-view-next')
			.unbind('click').bind('click', function(){list(true);});

		/**
		 * 削除ボタンをクリック
		 */
		$('.ExhibitCC-delete')
			.unbind('click').bind('click', function()
			{
				if (!$(this).attr('data-id')) alert('このコメントは削除できません。');

				if (confirm('このコメントを削除しますか？'))
				{
					$.ajax({
						url      : __root + 'api/exhibit-communicate-comment/delete',
						type     : 'POST',
						dataType : 'json',
						data     : {id: $(this).attr('data-id')},
						success : function(response, status)
						{
							if (response && response.success)
							{
								s.page = 1;
								reset();
								list();
							}
							else
							{
								alert('何らかの理由でコメントを削除できませんでした。時間をおいて再度お試しください。');
							}
						}
					});
				}
			});

		/**
		 * 投稿ボタンをクリック
		 */
		$('#ExhibitCC-input-submit')
			.unbind('click').bind('click', function()
			{
				// 投稿処理中だったら
				if (isSended) return error('ただいま投稿処理中です。連続でクリックしないでください。');

				var posts = {
					exhibit_id : s.exhibit_id,
					title      : $.trim($('#ExhibitCC-input-title').val()),
					comment    : $.trim($('#ExhibitCC-input-comment').val()),
					reply_id   : $.trim($('#ExhibitCC-input-reply-id').val())
				};

				if (!posts.title || posts.title == s.default_title) return error('タイトルを入力してください');
				if (!posts.comment || posts.comment == s.default_comment) return error('本文を入力してください');

				isSended = true; // 投稿処理中

				$.ajax({
					url      : __root + 'api/exhibit-communicate-comment/post',
					type     : 'POST',
					dataType : 'json',
					data     : posts,
					success : function(response, status)
					{
						if (response && response.success)
						{
							s.page = 1;
							reset();
							list();
						}
						else
						{
							alert('何らかの理由でコメントできませんでした。時間をおいて再度お試しください。');
						}
						isSended = false; // 投稿処理終了
					}
				});
			});

	} // end bind

	$(document).ready(function()
	{
		bind();
		list();

		$('.ExhibitCC-cancel').click(function(){
			$('#ExhibitCC-form').slideUp();
			isOpened = false;
		});

		$('.ExhibitCC-switch').click(function(){
			if (isOpened)
			{
				$('#ExhibitCC-form').slideUp();
				isOpened = false;
			}
			else
			{
				$('#ExhibitCC-form').slideDown();
				isOpened = true;
			}
		});
	});
};
})(jQuery);
