/*
 * Comment Search
 *
 * Copyright: (c) 2009 九州旅客鉄道株式会社
 *
 * Depends Script:
 *	js/jQuery/jquery.js (1.3.2)
 *	js/jQuery/ui.core.js (1.6rc6)
 *	js/jQuery/ui.draggable.js (1.6rc6)
 *	js/pagescroll.js
 *	js/dialog.js
 */

var commentsearch = {
	jQuery: $,

	settings: {
		vsort: {
			created: {
				def: 'desc',
				asc: '日付が古い順',
				desc: '日付が新しい順'
			},
			rank: {
				def: 'desc',
				asc: '星の数が少ない順',
				desc: '星の数が多い順'
			}
		}
	},

	selectors: {
		cs_fname: 'commentsearch-form',
		cs_fname_keyword: 'keyword',
		cs_fname_target: 'search-target',
		cs_fname_sort: 'sort',
		cs_container: 'commentsearch-container',
		cs_form_item: 'commentsearch-form-item',
		cs_sort_key: 'commentsearch-sort-key',
		cls_wrapper: 'comment-list-wrapper',
		cls_mask: 'comment-list-wrapper-mask',
		cld_container: 'comment-list-data-container',
		cld_own: 'comment-list-data-own',
		cld_loading: 'comment-list-data-loading',
		clp_container: 'comment-list-paging-container',
		clp_prev: 'comment-list-paging-prev',
		clp_next: 'comment-list-paging-next',
		clp_page: 'comment-list-paging-page',
		mv_point: 'comment-area'
	},

/* objects~ */
	_ready: false,
	_action: false,
	_msie6: false,
	_msie7: false,
	_path: false,
	_contents: false,
	_hostname: '',
	_ajax_id: 0,
	_query: '',
	_data: {
		count: 0,
		html: ''
	},
	_navi: {
		active: false,
		total: '0',
		html: ''
	},
/* ~objects */

/* action~ */
	init: function(path, contents, callback) {
		this._path = path;
		this._contents = contents;
		if (location.protocol != 'http:') this._hostname = 'http://' + location.hostname;
		if (this.jQuery.browser.msie) {
			var msie_ver = parseInt(this.jQuery.browser.version);
			if (msie_ver < 8) {
				if (msie_ver <= 6) this._msie6 = true;
				else this._msie7 = true;
			}
		}
		this.setCommentSearchItems(callback);
	},

	setvalue: function(fname, value) {
		var commentsearch = this,
			$ = this.jQuery,
			settings = this.settings,
			selectors = this.selectors;

		var form = document[selectors.cs_fname][fname];
		if (form) form.value = value ? value : '';
	},

	submit: function() {
		var commentsearch = this,
			$ = this.jQuery,
			settings = this.settings,
			selectors = this.selectors;

		if (commentsearch._action) {
			if (commentsearch.getSearchTarget() != 'all') {
				commentsearch.disableAction();
					var query = commentsearch.getSearchQuery();
					if (query != commentsearch._query) {
						pagescroll.go('#' + selectors.mv_point, function() {
							commentsearch._ready = false;
							commentsearch.viewLoadingImage();
							commentsearch.ajax(commentsearch._ajax_id, query, function() {
								commentsearch.resetSort();
								commentsearch._query = query;
								commentsearch.result(query);
							}, function() {
								commentsearch._ready = true;
								commentsearch.unviewLoadingImage();
							});
						});
					} else {
						commentsearch.enableAction();
					}
			} else {
				location.href = commentsearch._hostname + commentsearch._path + 'comment' + '/' + 'search.php' + commentsearch.getSearchQuery(true).replace(/^&/, '?');
			}
		}
	},

	sort: function(key, direction) {
		var commentsearch = this,
			$ = this.jQuery,
			settings = this.settings,
			selectors = this.selectors;

		if (commentsearch._action) {
			commentsearch.disableAction();
			var sel_vsort = settings.vsort[key],
				form = document[selectors.cs_fname],
				form_sort_key = form[selectors.cs_fname_sort + '[key]'],
				form_sort_direction = form[selectors.cs_fname_sort + '[direction]'];
			if (sel_vsort && sel_vsort[direction] && (key != form_sort_key.value || direction != form_sort_direction.value)) {
				var query = commentsearch._query
							+ '&comment' + '[' + selectors.cs_fname_sort + ']' + '[key]' + '=' + encodeURI(key)
							+ '&comment' + '[' + selectors.cs_fname_sort + ']' + '[direction]' + '=' + encodeURI(direction);
				commentsearch._ready = false;
				commentsearch.viewLoadingImage();
				commentsearch.ajax(commentsearch._ajax_id, query, function() {
					form_sort_key.value = key;
					form_sort_direction.value = direction;
					commentsearch.result(query, function() {
						var $sel_sort_key = $('#' + selectors.cs_sort_key + '_' + key),
							sel_sort_now = $sel_sort_key.hasClass('active');
						$.each(settings.vsort, function(sort_key, vsort) {
							if (key == sort_key) {
								if (sel_vsort.asc && sel_vsort.desc) {
									$sel_sort_key.text(sel_vsort[(direction == 'asc' ? 'desc' : 'asc')]).unbind('click').click(function() {
										commentsearch.sort(key, (direction == 'asc' ? 'desc' : 'asc'));
										return false;
									});
									if (!sel_sort_now) $sel_sort_key.addClass('active');
								} else if (sel_vsort.def && sel_vsort[sel_vsort.def]) {
									var sel_sort_html = '<strong id="' + selectors.cs_sort_key + '_' + key + '" class="' + selectors.cs_sort_key + ' active">'
															+ sel_vsort[sel_vsort.def]
														+ '</strong>';
									$sel_sort_key.replaceWith(sel_sort_html);
								}
							} else {
								var $ss_sort_key = $('#' + selectors.cs_sort_key + '_' + sort_key);
								if ($ss_sort_key.hasClass('active')) {
									if (vsort.asc && vsort.desc) {
										$ss_sort_key.text(vsort[vsort.def]).removeClass('active').unbind('click').click(function() {
											commentsearch.sort(sort_key, vsort.def);
											return false;
										});
									} else if (vsort.def && vsort[vsort.def]) {
										var ss_sort_html = $('<a href="#" id="' + selectors.cs_sort_key + '_' + sort_key + '" class="' + selectors.cs_sort_key + '">'
																+ vsort[vsort.def]
															+ '</a>').click(function() {
																commentsearch.sort(sort_key, vsort.def);
																return false;
															});
										$ss_sort_key.replaceWith(ss_sort_html);
									}
								}
							}
						});
					});
				}, function() {
					commentsearch._ready = true;
					commentsearch.unviewLoadingImage();
				});
			} else {
				commentsearch.enableAction();
			}
		}
	},

	page: function(key) {
		var commentsearch = this,
			$ = this.jQuery,
			settings = this.settings,
			selectors = this.selectors;

		if (commentsearch._action) {
			commentsearch.disableAction();
			pagescroll.go('#' + selectors.mv_point, function() {
				var query = commentsearch._query + commentsearch.getSortQuery() + (key != '0' ? '&comment[page]=' + key : '');
				commentsearch._ready = false;
				commentsearch.viewLoadingImage();
				commentsearch.ajax(commentsearch._ajax_id, query, function() {
					commentsearch.result(query);
				}, function() {
					commentsearch._ready = true;
					commentsearch.unviewLoadingImage();
				});
			});
		}
	},

	result: function(query, callback1, callback2) {
		var commentsearch = this,
			$ = this.jQuery,
			settings = this.settings,
			selectors = this.selectors;

		commentsearch._ready = true;
		commentsearch.unviewContents(function() {
			commentsearch.unviewLoadingImage();
			if ($.isFunction(callback1)) callback1();
			commentsearch.changeListData();
			commentsearch.changeListPage();
			commentsearch.viewContents(function() {
				if ($.isFunction(callback2)) callback2();
				commentsearch.enableAction();
			});
		});
	},
/* ~action */

	ajax: function(ajax_id, query, success, error) {
		var commentsearch = this,
			$ = this.jQuery,
			settings = this.settings,
			selectors = this.selectors;

		var timeout = 60000,
			uri = '/' + location.pathname.replace(/^\//, '') + query.replace(/^&/, '?');
		$.ajax({
			cache: false,
			dataType: 'script',
			timeout: timeout,
			type: 'GET',
			url: uri,
			dataFilter: function(d) {
				if (commentsearch._ajax_id == ajax_id) {
					try {
						eval(d);
						if ($.isFunction(success)) success(search, sort, page);
					} catch(e) {
						commentsearch.ajaxError(error);
					}
					commentsearch._ajax_id ++;
				}
			},
			error: function() {
				commentsearch.ajaxError(error);
			}
		});
	},

	ajaxError: function(fn) {
		var commentsearch = this,
			$ = this.jQuery,
			settings = this.settings,
			selectors = this.selectors;

		var err_msg = '通信エラーが発生しました。<br />ページの更新を行うか、時間がたってからもう一度接続してください。<br />ご迷惑をおかけして、申し訳ございません。';
		if ($.isFunction(fn)) fn();
		commentsearch.disableAction();
		dialog.alert('注&nbsp;&nbsp;&nbsp;意', err_msg, function(r) {
			if (r) commentsearch.enableAction();
		});
	},

	enableAction: function() {
		var commentsearch = this,
			$ = this.jQuery,
			settings = this.settings,
			selectors = this.selectors;

		commentsearch._ready = true;
		commentsearch._action = true;
	},

	disableAction: function() {
		var commentsearch = this,
			$ = this.jQuery,
			settings = this.settings,
			selectors = this.selectors;

		commentsearch._action = false;
	},

	setCommentSearchItems: function(callback) {
		var commentsearch = this,
			$ = this.jQuery,
			settings = this.settings,
			selectors = this.selectors;

		commentsearch.setSortAction();
		commentsearch.setPageAction();
		if ($.isFunction(callback)) callback();
		commentsearch._query = commentsearch.getSearchQuery();
		commentsearch.enableAction();
	},

	setSortAction: function() {
		var commentsearch = this,
			$ = this.jQuery,
			settings = this.settings,
			selectors = this.selectors;

		var reg = new RegExp('^' + selectors.cs_sort_key + '_');
		$('.' + selectors.cs_sort_key, '#' + selectors.cs_sort_key).each(function() {
			var sort_key = (this.id).replace(reg, ''),
				vsort = settings.vsort[sort_key];
			if (vsort) {
				var $cs_sort_key = $(this),
					sort_click_flg = false,
					sort_direction = false,
					sort_text = $cs_sort_key.text();
				if (vsort.asc && vsort.desc) {
					sort_direction = (vsort.asc == sort_text ? 'asc' : 'desc');
					sort_click_flg = true;
				} else if (vsort.def && vsort[vsort.def]) {
					sort_direction = vsort.def;
					if (!$cs_sort_key.hasClass('active')) sort_click_flg = true;
				}
				if (sort_click_flg) {
					$cs_sort_key.click(function() {
						commentsearch.sort(sort_key, sort_direction);
						return false;
					});
				}
			}
		});
	},

	setPageAction: function() {
		var commentsearch = this,
			$ = this.jQuery,
			settings = this.settings,
			selectors = this.selectors;

		$('#' + selectors.clp_prev + ',' + '#' + selectors.clp_next).each(function() {
			if (this.href) {
				var $cs_page_key = $(this);
				$cs_page_key.click(function() {
					commentsearch.page(commentsearch.getPageKey(this.href));
					return false;
				});
			}
		});
		$('.' + selectors.clp_page, '#' + selectors.clp_page).each(function() {
			if (this.href) {
				var $cs_page_key = $(this);
				$cs_page_key.click(function() {
					commentsearch.page(commentsearch.getPageKey(this.href));
					return false;
				});
			}
		});
	},

	getPageKey: function(uri) {
		var page_key,
			uri_split = uri.split('?');
		if (uri_split.length > 1) {
			var query_split = uri_split[1].split('&');
			for (var i = 0; i < query_split.length; i ++) {
				var get_split = query_split[i].split('=');
				if (get_split[0].toLowerCase() == 'comment[page]') {
					return get_split[1];
				}
			}
		}
		return 0;
	},

	getSearchTarget: function() {
		var commentsearch = this,
			$ = this.jQuery,
			settings = this.settings,
			selectors = this.selectors;

		var form = document[selectors.cs_fname],
			form_target = form[selectors.cs_fname_target];
		if (form_target && form_target.value) return form_target.value;
	},

	getSearchQuery: function(all_flg) {
		var commentsearch = this,
			$ = this.jQuery,
			settings = this.settings,
			selectors = this.selectors;

		var form = document[selectors.cs_fname],
			form_keyword = form[selectors.cs_fname_keyword],
			query = '';
		if (form_keyword && form_keyword.value) {
			if (!all_flg) query += '&comment[search][' + selectors.cs_fname_keyword + ']=' + encodeURI(form_keyword.value);
				else query += '&search[' + selectors.cs_fname_keyword + ']=' + encodeURI(form_keyword.value);
		}
		return query;
	},

	getSortQuery: function() {
		var commentsearch = this,
			$ = this.jQuery,
			settings = this.settings,
			selectors = this.selectors;

		var form = document[selectors.cs_fname],
			query = '';
		if (form[selectors.cs_fname_sort + '[key]'].value) query += '&comment' + '[' + selectors.cs_fname_sort + ']' + '[key]' + '=' + encodeURI(form[selectors.cs_fname_sort + '[key]'].value);
		if (form[selectors.cs_fname_sort + '[direction]'].value) query += '&comment' + '[' + selectors.cs_fname_sort + ']' + '[direction]' + '=' + encodeURI(form[selectors.cs_fname_sort + '[direction]'].value);
		return query;
	},

	resetSort: function(sel_sort) {
		var commentsearch = this,
			$ = this.jQuery,
			settings = this.settings,
			selectors = this.selectors;

		var form = document[selectors.cs_fname],
			sel_flg = false,
			on_flg = false;
		if (sel_sort && sel_sort.key && sel_sort.direction) {
			sel_flg = true;
			on_flg = true;
		}
		$.each(settings.vsort, function(sort_key, vsort) {
			if (vsort.def && vsort[vsort.def]) {
				var $cs_sort_key = $('#' + selectors.cs_sort_key + '_' + sort_key)
					cs_sort_html = '';
				if (!on_flg || (sel_flg && sort_key == sel_sort.key)) {
					if (vsort.asc && vsort.desc) {
						cs_sort_html = '<a href="#" id="' + selectors.cs_sort_key + '_' + sort_key + '" class="' + selectors.cs_sort_key + ' active">'
											+ vsort[sel_flg ? sel_sort.direction == 'asc' ? 'desc' : 'asc' : vsort.def == 'asc' ? 'desc' : 'asc']
										+ '</a>';
					} else {
						cs_sort_html = '<strong id="' + selectors.cs_sort_key + '_' + sort_key + '" class="' + selectors.cs_sort_key + ' active">'
										+ vsort[vsort.def]
									+ '</strong>';
					}
					on_flg = true;
				} else {
					cs_sort_html = '<a href="#" id="' + selectors.cs_sort_key + '_' + sort_key + '" class="' + selectors.cs_sort_key + '">'
										+ vsort[vsort.def]
									+ '</a>';
				}
				$cs_sort_key.replaceWith(cs_sort_html);
			}
		});
		commentsearch.setvalue(selectors.cs_fname_sort + '[key]', sel_flg ? sel_sort.key : '');
		commentsearch.setvalue(selectors.cs_fname_sort + '[direction]', sel_flg ? sel_sort.direction : '');
		commentsearch.setSortAction();
		var $cs_sort = $('#' + selectors.cs_sort_key);
		if (!$cs_sort.hasClass('active')) $cs_sort.addClass('active');
	},

	viewLoadingImage: function() {
		var commentsearch = this,
			$ = this.jQuery,
			settings = this.settings,
			selectors = this.selectors;

		commentsearch.unviewLoadingImage();
		var $cld_container = $('#' + selectors.cld_container),
			$cld_loadings = new Array(),
			i = 1;
		$('.' + selectors.cld_own, '#' + selectors.cld_container).each(function() {
			var $this = $(this),
				position = $this.position(),
				top = position.top - i;
				height = $this.outerHeight() + i;
				$cld_loadings.push($('<div class="' + selectors.cld_loading + '"></div>').css({
					top: top,
					height: height
				}));
			i = 0;
		});
		if ($cld_loadings.length < 1) {
			$cld_loadings.push($('<div class="' + selectors.cld_loading + '"></div>').css({
				top: - 1,
				height: $cld_container.outerHeight() + 1
			}));
		}
		var timer_id = setTimeout(function() {
			if (!commentsearch._ready) {
				$.each($cld_loadings, function(i) {
					this.appendTo('#' + selectors.cld_container);
				});
			}
			clearTimeout(timer_id);
		}, 50);
	},

	unviewLoadingImage: function() {
		var commentsearch = this,
			$ = this.jQuery,
			settings = this.settings,
			selectors = this.selectors;

		var $cld_loading = $('.' + selectors.cld_loading, '#' + selectors.cld_container);
		$cld_loading.remove();
	},

	changeListData: function() {
		var commentsearch = this,
			$ = this.jQuery,
			settings = this.settings,
			selectors = this.selectors;

		var $cld_container = $('#' + selectors.cld_container),
			cld_html = commentsearch._data.html;
		$cld_container.removeClass('empty').html(cld_html).css({opacity: 0});
		if (commentsearch._data.count < 1) $cld_container.addClass('empty');
		commentsearch.resizeMask();
		$cld_container.css({opacity: 1});
	},

	changeListPage: function() {
		var commentsearch = this,
			$ = this.jQuery,
			settings = this.settings,
			selectors = this.selectors;

		var $clp_container = $('#' + selectors.clp_container),
			clp_html = commentsearch._navi.html;
		$clp_container.removeClass('active').html(clp_html).css({opacity: 0});
		if (commentsearch._navi.active) {
			$clp_container.addClass('active');
			commentsearch.setPageAction();
		}
		commentsearch.resizeMask();
		$clp_container.css({opacity: 1});
	},

	viewContents: function(callback) {
		var commentsearch = this,
			$ = this.jQuery,
			settings = this.settings,
			selectors = this.selectors;

		var $cls_mask = $('#' + selectors.cls_mask);
		$cls_mask.animate(
			{opacity: 0},
			400,
			'swing',
			function() {
				commentsearch.removeMask();
				if ($.isFunction(callback)) callback();
			}
		);
	},

	unviewContents: function(callback) {
		var commentsearch = this,
			$ = this.jQuery,
			settings = this.settings,
			selectors = this.selectors;

		commentsearch.setMask();
		var $cls_mask = $('#' + selectors.cls_mask);
		$cls_mask.animate(
			{opacity: 1},
			400,
			'swing',
			function() {
				if ($.isFunction(callback)) callback();
			}
		);
	},

	setMask: function() {
		var commentsearch = this,
			$ = this.jQuery,
			settings = this.settings,
			selectors = this.selectors;

		commentsearch.removeMask();
		var $cls_wrapper = $('#' + selectors.cls_wrapper);
		$('<div id="' + selectors.cls_mask + '"></div>').css({
			opacity: 0,
			height: $cls_wrapper.outerHeight()
		}).appendTo($cls_wrapper);
	},

	resizeMask: function() {
		var commentsearch = this,
			$ = this.jQuery,
			settings = this.settings,
			selectors = this.selectors;

		var $cls_wrapper = $('#' + selectors.cls_wrapper),
			$cls_mask = $('#' + selectors.cls_mask);
		$cls_mask.css({
			height: $cls_wrapper.outerHeight()
		});
	},

	removeMask: function() {
		var commentsearch = this,
			$ = this.jQuery,
			settings = this.settings,
			selectors = this.selectors;

		var $cls_mask = $('#' + selectors.cls_mask);
		$cls_mask.remove();
	}
};

$(window).unload(function() {
	clearTimeout();
});
