var _common_loaded;
$(document).ready(function() {
	if (_common_loaded) return;
	_common_loaded = true;

	generateSubmenu();

	$('input,select').hover(function() { $(this).addClass('hover'); }, function() { $(this).removeClass('hover'); });
	$('input').focus(function() { $(this).addClass('focus'); });
	$('input').blur(function() { $(this).removeClass('focus'); });

	var setupImageGuide = function() {
		var target = $(this);
		var img = target.css('backgroundImage');
		target.focus(function() { $(this).css('backgroundImage', 'none'); });
		target.blur(function() { if (!$(this).val()) $(this).css('backgroundImage', img); });

		if (target.val() == '') {
			target.css('backgroundImage', img);
		} else {
			target.css('backgroundImage', 'none');
		}
	};
	$('input.img_guide').each(setupImageGuide);

	// lightbox
	$('a[rel*=lightbox]').lightBox({
		imageLoading:  base_url('include') + 'images/lightbox-ico-loading.gif',
		imageBtnPrev:  base_url('include') + 'images/lightbox-btn-prev.gif',
		imageBtnNext:  base_url('include') + 'images/lightbox-btn-next.gif',
		imageBtnClose: base_url('include') + 'images/lightbox-btn-close.gif',
		imageBlank:    base_url('include') + 'images/lightbox-blank.gif'
	});

	$("input[type!='submit'][type!='textarea']").keypress(function(event) {
		if (event.keyCode == 13) {
			return false;
		}
	});
	$('input.submit').keypress(function(event) {
		if (event.keyCode == 13) {
			$(this).parents('form').submit();
		}
	});
	$('a.submit').click(function(event) {
		$(this).parents('form').submit();
	});

	// フォームの多重submit防止
	var submitted = false;
	$('form').submit(function() {
		if (submitted) {
			return false;
		}
		submitted = true;
	});

	// 追加ページロードの実行を少しずらす
	setTimeout(function() {
		jQuery.each(pages, function(i, v) {
			v();
		});
	}, 100);
});

/**
 * サブメニューを生成します。
 * サブメニューの内容はプルダウンメニューと同期します。
 */
function generateSubmenu() {
	var addr = location.href.substr(base_url('include').length);
	var dirs = addr.split('/');
	var cat_id = 'c_' + dirs[0];
	var submenu = $('div#submenu');

	if (addr && addr != 'home') {
		submenu.empty();

		if (!$('li#' + cat_id).size()) {
			cat_id = 'c_other';
		}
		// カテゴリ毎の表示 > サブメニュー
		submenu.append('<div id="sub_top">' + $('li#' + cat_id + ' a:first').text()  + '</div>');
		submenu.append('<div id="sub_middle"></div>');
		$('li#' + cat_id + ' ul.sub li a').each(function() {
			$(this).clone().appendTo($('div#sub_middle'));
		});
		submenu.append('<div id="sub_bottom"></div>');
	}
}

/**
 * ゲームを起動します。
 */
function startGame() {
	if ($.browser.mozilla) {
		// Firefox
		window.top.location.href = base_url() + 'start';
	} else if ($.browser.msie) {
		// IE(location.href変更の場合にリファラが空となるため)
		var a = $('<a></a>').appendTo('body').attr('href', base_url() + 'start');
		a.get(0).click();
	} else {
		// それ以外
		alert('Please use Internet Explorer or Firefox.');
	}
}

/**
 * WordPressページをロードします。
 * 親ページのロード後に1度だけ実行されます。
 * 
 * @param target ロードしたページを埋め込む対象のCSSセレクタ
 * @param args ページのリクエストに使用するパラメータの連想配列
 * @param callback コールバック関数
 * @param noIcon ロードアイコンを表示しない
 */
function getWP(target, args, callback, noIcon) {
	pages.push(function() {
		if (!noIcon) {
			$(target).empty().append('<div><img src="' + base_url() + 'images/loadinfo.net.gif" /></div>');
		}

		var param = args || {};
		$.get(base_url() + 'wordpress/', param, function(res) {
			$(target).fadeOut('fast', function() {
				$(target).html(res).fadeIn('fast');

				if (callback) {
					callback();
				}
			});
		});
	});
}

/**
 * OpenPNEページをロードします。
 * 
 * @param target ロードしたページを埋め込む対象のCSSセレクタ
 * @param args ページのリクエストに使用するパラメータの連想配列
 * @param callback コールバック関数
 * @param noIcon ロードアイコンを表示しない
 */
function getOP(target, args, callback, noIcon) {
	pages.push(function() {
		if (!noIcon) {
			$(target).empty().append('<div><img src="' + base_url() + 'images/loadinfo.net.gif" /></div>');
		}

		var param = args || {};
		$.get(pne_url, param, function(res) {
			$(target).fadeOut('fast', function() {
				$(target).html(res).fadeIn('fast');

				if (callback) {
					callback();
				}
			});
		});
	});
}


/**
 * base_urlを返します。(CIのbase_urlと同じ)
 * 
 * @param type 'include': SSLページにインクルードされる場合
 *             'ssl': SSLページへのリンク等の場合
 *             指定なし: SSLなし
 * @return base_url文字列
 */
function base_url(type) {
	if (type == 'include') {
		return _base_urls.include;
	} else if (type == 'ssl') {
		return _base_urls.ssl;
	} else {
		return _base_urls.base;
	}
}

/**
 * 簡易sprintfです。%sしかつかえません。
 */
function sprintf(){
	var format = arguments[0]; // format
	var args   = arguments;
	var i = 0;
	return format.replace(/%s/g, function(){
		i++;
		return args[i];
	});
}

/**
 * ページャクラスです。
 * ページ移動インターフェイスを生成します。
 */
var ext_pager = function(self, my) {
	self = self || {};
	my = my || {};

	/**
	 * 初期化します。
	 * 
	 * @param string target ページャを入れるコンテナ要素の指定
	 * @param string url ページの基本URL
	 * @param int total 総件数
	 * @param int selected 選択されているページ
	 * @param int per_page 1ページ辺りの件数
	 * @param int max_pix ページャに一度に表示するページ数
	 */
	var setup = function(param) {
		var url = param.url;
		var unit = param.unit || 'item';
		var total = param.total;
		var per_page = param.per_page || 10;

		my.target = $(param.target);
		my.current = param.selected || 1;
		my.max_pix = param.max_pix || 10;

		my.max_page = Math.ceil(total / per_page);

		$('.total', my.target).text(total + ' ' + unit + '(s).');

		for (var i = 0; i < my.max_page; i++) {
			var index = i + 1;
			var p = $('.dummy', my.target).clone().removeClass('dummy');

			if (index == my.current) {
				p.addClass('selected').children().text(index);
			} else {
				p.children().attr('href', url + index).text(index);
			}

			$('.dummy', my.target).before(p);
		}
		$('.dummy', my.target).remove();

		$('.slider_right', my.target).
			attr('href', 'javascript:void(0);').
			click(function() { slide(1); });
		$('.slider_left', my.target).
			attr('href', 'javascript:void(0);').
			click(function() { slide(-1); });

		slide();
	};
	self.setup = setup;

	/**
	 * ページャの表示ページを変更します。
	 * 
	 * @param int pos 移動値
	 */
	var slide = function(pos) {
		if (pos) {
			if (my.current + pos < 1 || my.max_page < my.current + pos) {
				return;
			} else {
				my.current += pos;
			}
		}
		if (my.current > my.max_page - my.max_pix + 1) {
			my.current = my.max_page - my.max_pix + 1;
		}

		$('.pix:has(.page)', my.target).each(function(i, v) {
			var index = i + 1;
			$(v).toggle(my.current <= index && index < (my.current + my.max_pix));
		});

		var active = my.current <= (my.max_page - my.max_pix);
		$('.slider_right', my.target).toggle(active).parent().toggleClass('active', active);
		active = my.current > 1;
		$('.slider_left', my.target).toggle(active).parent().toggleClass('active', active);
	}
	return self;
};

