
// constant

E_ERROR = 1; // fatal error, show up
E_WARNING = 2; // warning message, show up
E_NOTICE = 4; // notice message, not show up
E_LOG = 8; // log only, not show up
BS = String.fromCharCode(8);
HT = String.fromCharCode(9);
LF = String.fromCharCode(10);
VT = String.fromCharCode(11);
FF = String.fromCharCode(12);
CR = String.fromCharCode(13);
ESC = String.fromCharCode(27);

// debug toolkit

function __deme(args)
{
	var fn = get_function_name(args);
	try { if (_devmode === true) console.info('[fn] ' + fn + '()'); } catch(e) {}
	return fn;
}

// message

function mm(msg, level)
{
	if (msg === undefined || msg == '')
		return false;
	msg = msg.toString().replace(/[\f\b\r\n]/g, '<br>');
	var level = level || E_NOTICE;
	options = {
		sticky: level & (E_ERROR | E_WARNING) ? true : false,
		theme: level & E_ERROR ? 'e_error' : (level & E_WARNING ? 'e_warning' : '')
	}
	$.extend($.jGrowl.defaults, options); //t// move to index.php <script/>
	$.jGrowl(msg);
	try {
		switch (level)
		{
			case E_NOTICE: console.info(msg);  break;
			case E_WARNING: console.warn(msg);  break;
			case E_ERROR: console.error(msg);  break;
		}
	} catch(e) {}
}

function chk_email(s)
{
	return s.toLowerCase().search(/^([a-z0-9]+)([a-z0-9\-\_\.]{0,100})([a-z0-9]+)\@([a-z0-9]+)([a-z0-9\-\.]*)([a-z0-9]+)\.([a-z]{2,6})$/) != -1;
}

function chk_nonempty(s)
{
	if (typeof s == 'string')
		return $.trim(s) != '';

	if (!(s instanceof jQuery))
		s = $(s);
	if (!s.attr || !s.attr('type'))
		return false;
	switch (s.attr('type'))
	{
		case 'text':
		case 'textarea':
			return s.val() != '';
			break;
		case 'password':
			var sv = s.val();
			var ss = s.parents('form:eq(0)').find(':password[name="' + s.attr('name') + '"]');
			// if (ss.length == 1) return sv != '';
			ss.each(function(){
				if ($(this).val() != sv)
				{
					sv = '';
					return false;
				}
			});
			return sv != '';
		case 'radio':
			var ss = s.parents('form:eq(0)').find(':radio[name="' + s.attr('name') + '"]');
			if (ss.filter(':checked').length > 0)
				return true;
			break;
		case 'checkbox':
			var ss = s.parents('form:eq(0)').find(':checkbox[name="' + s.attr('name') + '"]');
			if (ss.length == 1 || (ss.length > 1 && ss.filter(':checked').length > 0))
				return true;
			break;
		case 'select-one':
		case 'select-multiple':
			var ss = s.find('option:selected');
			if (ss.length == 1)
				return chk_nonempty(ss.eq(0).val());
			else
				return (ss.length > 1); // return false with none selected, true with multiple selected
		default:
			return true;
	}

	/*
	var n = $(this).attr('name');
	if (rc[n] !== undefined) return true;
	var r = $('[name="' + n + '"]', f);
	if (r.filter(':checked').length == 0)
	{
		emptynum == 0 && (firstelm = r.eq(0));
		r.parent().addClass('errorfield').end()
			.click(function(){ r.parent().removeClass('errorfield'); });
		rc[n] = false;
		emptynum++;
	}
	*/
}

function chk_hiragana(s) // 平假名 ひらがな Hiragana
{
	var a = s.match(/[あ-ん]+/);
	return a && a[0] == s;
}

function chk_katakana(s) // 片假名 カタカナ Katakana
{
	var a = s.match(/[ア-ン]+/);
	return a && a[0] == s;
}

function chk_letterspace(s) // A-Za-z and space
{
	var a = s.match(/[A-Za-z\s]+/);
	return a && a[0] == s;
}

function chk_letterspace2(s) // A-Za-z and space
{
	var a = s.match(/[\d-]+/);
	return a && a[0] == s;
}

function chk_letterspace3(s) // A-Za-z and space
{
	var a = s.match(/[\u4E00-\u9fa5]+/);
	return a && a[0] == s;
}

function chk_number(s) // \d or 0-9
{
	var a = s.match(/\d+/);
	return a && a[0] == s;
}

function chk_doublebyte(s) // \W or [^A-Za-z0-9_]
{
	var a = s.match(/\W+/);
	return a && a[0] == s;
}

// get function name

function get_function_name(args)
{
	return args.callee.toString().match(/function\s([^\(]+).+/i)[1];
}

// return parameter of url

function urlpara()
{
	var s = location.search.substr(1).split('&');
	var r = [];
	for (var i in s)
	{
		var pair = s[i].split('=');
		r[pair[0]] = pair[1] || '';
	}
	return r;
}

function basename()
{
	var s = location.pathname.match(/^.*\/([^\.]+)\..+$/);
	return s ? s[1] : '';
}

function basepath()
{
	var s = location.pathname.match(/(\/.+\/)([^\/]*)/);
	return s;
}

// custom

function init()
{
	_rootpath = _rootpath || '';

	// ajax session for admin page only
	$.ajaxSetup({
		url: _rootpath + 'ajaxlet_frontend.php',
		type: 'POST',
		global: true,
		dataType: 'json',
		timeout: 10 * 1000,
		error: function(xhr, status, errorThrown){
			switch (status)
			{
				case 'timeout': mm(lc('server_timeout'), E_ERROR); break;
				case 'error': mm('error', E_ERROR); break;
				case 'notmodified': mm(lc('notmodified'), E_ERROR); break;
				case 'parsererror': mm(xhr.responseText, E_ERROR); break;
				default: mm('DEBUG: AJAX error (status ' + status + ')', E_ERROR);
			}
		}
	});

	// get url parameter
	var urlcmd = urlpara();
	if (urlcmd['logout'] !== undefined)
		return logout();

	// event listener
	$('[rel^="cmd_"]').live('click', page_command);

	// process form
	$('form')
		.find(':not(.natural)')
			// suppress native submit by key ENTER
			.submit(function(){ return false; })
			.attr('onsubmit', 'return false')
		.end()
		// emulate key ENTER
		.keypress(function(e){
			var ecode = e.keyCode ? e.keyCode : e.which;
			var eo = e.target || e.srcElement;
			if (!ecode || !eo) return true;
			if (ecode == 13 && eo.tagName != 'TEXTAREA')
			{
				$(this).find('[rel^="cmd_"]:eq(0)').trigger('click'); //?// what if not live-binded as click ?
				return false;
			}
		})
		.find(':input')
			.bind('click', function(){
				$(this).parent('.errorfield').andSelf().removeClass('errorfield')
			})
			.bind('blur', function(){
				if ($(this).is(':disabled,.skipcheck'))
				{
					$(this).parent().andSelf().removeClass('errorfield');
					return true;
				}
				// nonempty email hiragana katakana letterspace number
				var eo = $(this);
				var et = eo.attr('type');
				var ev = $(this).val();
				var flag = true;
				flag = flag && chk_nonempty(eo)
				if (eo.hasClass('email')) flag = flag && chk_email(ev);
				if (eo.hasClass('hiragana')) flag = flag && chk_hiragana(ev);
				if (eo.hasClass('katakana')) flag = flag && chk_katakana(ev);
				if (eo.hasClass('letterspace')) flag = flag && chk_letterspace(ev);
				if (eo.hasClass('letterspace2')) flag = flag && chk_letterspace2(ev);
				if (eo.hasClass('letterspace3')) flag = flag && chk_letterspace3(ev);
				if (eo.hasClass('number')) flag = flag && chk_number(ev);
				if (eo.hasClass('doublebyte')) flag = flag && chk_doublebyte(ev);
				// mark or unmark
				if (et.match(/radio|checkbox|select/))
					eo.parent().andSelf().toggleClass('errorfield', !flag);
				else if (et == 'password' && (es = eo.parents('form:eq(0)').find(':password[name="' + eo.attr('name') + '"]')) && es.length > 1)
					es.toggleClass('errorfield', !flag);
				else
					eo.toggleClass('errorfield', !flag);
			})
		.end()
		.bind('validate', function(){
			$(':input', this).trigger('blur');
		});

	// specific action by page
	_page = basename();
	if (/^join[23]$|memberpage1/.test(_page))
		fill_profile({obj_type: 'user', id: '#'});
	else if (/^register\d+$|memberpage2/.test(_page))
		fill_profile({obj_type: 'ex14', id: '#'});

	// shorten news in news/school index page
	$('.excerpt').css({height: '200px', overflow: 'auto'});

	// check session
	// check_session();
}

	function adjust_light_num(power_num)
	{
		var fn = __deme(arguments);

		var s0 = $('[name="ex_option_power"]');
		var s1 = $('[name="ex_option_light"]');
		var s1index = s1.attr('selectedIndex');
		if (typeof power_num == 'object')
			var power_num = s0.find('option:selected').val();
		var n = 6 * power_num + 1;

		var s1html = '';
		s1.html('');
		for (var i=0; i < n; i++)
		{
			var txt = option_lights[i] || (i + ' &yen;' + i * 1500);
			s1html += '<option value="' + i + '">' + txt + '</option>';
		}
		s1.html(s1html).attr('selectedIndex', Math.min(s1index, n-1));
	}

function check_session()
{
	var fn = __deme(arguments);

	$.ajax({
		data: {cmd: 'check_session'},
		success: function(res){
		}
	});
}

function logout()
{
	var fn = __deme(arguments);

	$.ajax({
		data: {cmd: 'logout'},
		success: function(res) {
			location.href = location.pathname;
			return false;
		}
	});
}

// page command (without parameter)

function count_empty_field(f)
{
	var emptynum = 0;
	var firstelm = false;
	$(':input:not(.skipcheck)', f).each(function(){
		if ($(this).val() == '')
		{
			emptynum == 0 && (firstelm = this);
			$(this).addClass('errorfield')
				.click(function(){ $(this).removeClass('errorfield'); })
				.blur(function(){ $(this).toggleClass('errorfield', $(this).val() == ''); });
			emptynum++;
		}
	})
	// radio & checkbox
	var rc = {};
	$(':radio:not(.skipcheck),:checkbox:not(.skipcheck)', f).each(function(){
		var n = $(this).attr('name');
		if (rc[n] !== undefined) return true;
		var r = $('[name="' + n + '"]', f);
		if (r.filter(':checked').length == 0)
		{
			emptynum == 0 && (firstelm = r.eq(0));
			r.parent().addClass('errorfield').end()
				.click(function(){ r.parent().removeClass('errorfield'); });
			rc[n] = false;
			emptynum++;
		}
	});
	firstelm && firstelm.focus();
	return emptynum;
}

function page_command(event)
{
	var fn = __deme(arguments);
	try { if (_devmode === true) console.info('- ' + $(this).attr('rel')); } catch(e) {}

	var relcmd = $(this).attr('rel').toString().replace(/^cmd_/, '');
	var ego = this;
	ego.blur();
	switch (relcmd)
	{
		case 'help_submit_content':
			var f = $(ego).parents('form').trigger('validate');
			var errorfield = $('.errorfield', f);
			if (errorfield.length == 0)
			{
				$.ajax({
					data: {cmd: relcmd, q: $(':input', f).serialize()},
					success: function(res){
						mm(res.msg);
						if (res.status == 1)
							location.href = 'contact_complete.php';
					}
				});
			}
			else
				errorfield.eq(0).focus();
			break;

		case 'user_submit_email':
			//var f = $(ego).parents('form').trigger('validate');
			var f = $(ego).parents('form');
			var errorfield = $('.errorfield', f);
			if (errorfield.length == 0)
			{
				$.ajax({
					data: {cmd: relcmd, q: $(':input', f).serialize()},
					success: function(res){
						mm(res.msg);
						if (res.status == 1)
							location.href = 'join1-2.php';
					}
				});
			}
			else
				errorfield.eq(0).focus();
			break;

		case 'user_pre_update':
			location.href = 'join2.php';
			break;

		case 'user_comfirm_update':
			var f = $(ego).parents('form');
			$.ajax({
				data: {cmd: relcmd},
				success: function(res){
					mm(res.msg);
					res.status && (location.href = 'register1.php');
				}
			});
			break;

		case 'user_submit_update':
			var f = $(ego).parents('form').trigger('validate');
			var errorfield = $('.errorfield', f);
			if (errorfield.length == 0)
			{
				$.ajax({
					data: {cmd: relcmd, q: $(':input', f).serialize()},
					success: function(res){
						mm(res.msg);
						res.status && (location.href = 'join3.php');
					}
				});
			}
			else
				errorfield.eq(0).focus();
			break;

		case 'user_submit_login':
			var f = $(ego).parents('form').trigger('validate');
			var errorfield = $('.errorfield', f);
			if (errorfield.length == 0)
			{
				$.ajax({
					data: {cmd: relcmd, q: $(':input', f).serialize()},
					success: function(res){
						mm(res.msg);
						location.href = res.nextpage || location.pathname;
					}
				});
			}
			else
				errorfield.eq(0).focus();
			break;

		case 'reset_password':
			var f = $(ego).parents('form').trigger('validate');
			var errorfield = $('.errorfield', f);
			if (errorfield.length == 0)
			{
				$.ajax({
					data: {cmd: relcmd, q: $(':input', f).serialize()},
					success: function(res){
						alert(res.msg);
					}
				});
			}
			else
				errorfield.eq(0).focus();
			break;

		case 'pre_dlagree':
			if ($(':checkbox:checked').length)
			{
				$(ego).parents('form:eq(0)')
					// .attr({method: 'post', action: 'download2.php', target: 'download_frame'})
					// .append($('<input type="hidden"/>').attr({name: 'dl'}))
					.submit();
			}
			else
			{
				alert('ダウンロード規約に同意してください');
			}
			break;

		case 'ex_pre_update':
			location.href = 'register1.php';
			break;

		case 'ex_submit_update':
			var f = $(ego).parents('form').trigger('validate');
			var errorfield = $('.errorfield', f);
			if (errorfield.length == 0)
			{
				$.ajax({
					data: {cmd: relcmd, q: $(':input', f).serialize(), page: _page},
					success: function(res){
						mm(res.msg);
						location.href = res.nextpage || location.pathname;
					}
				});
			}
			else
				errorfield.eq(0).focus();
			break;

		case 'form_reset':
			$(ego).parents('form').get(0).reset();
			tinyMCE.activeEditor && tinyMCE.activeEditor.load();
			break;

		default:
			if ($.isFunction(window[relcmd]))
				window[relcmd](event);
			else
				mm(relcmd + ' not defined');
	}

	return false; // for <A> & <BUTTON> to prevent default action
}

function fill_profile(options)
{
	var fn = __deme(arguments);
	options.cmd = 'get_obj';
	options.page = _page;

	$.ajax({
		data: options,
		success: function(res){
			mm(res.msg);
			if (res.status == 0)
				return false;
			if (res.rows)
			{
				if (_page == 'register3')
				{
					if (res.rows.ex_booth_type != 2)
					{
						$('[name="ex_option_light"]')
							.html('<option value="0"></option>')
							.parents('.formbox:eq(0)').hide();
					}
					else
					{
						adjust_light_num(res.rows.ex_option_power);
						$('[name="ex_option_power"]').change(adjust_light_num).keyup(adjust_light_num);
					}
				}

				var s;
				for (var i in res.rows)
				{
					s = res.rows[i];
					if (i.indexOf('[]') != -1 && $.isArray(s) && $(':input[name="' + i + '"]').attr('type') != 'checkbox')
					{
						$(':input[name="' + i + '"]').each(function(i){ $(this).val([s[i]]); });
						$('span[name="' + i + '"],div[name="' + i + '"]').each(function(i){ $(this).html(s[i]); });
					}
					else
					{
						$(':input[name="' + i + '"]').val($.isArray(s) ? s : [s]);
						$('span[name="' + i + '"],div[name="' + i + '"]').html(s);
					}
				}
			}

		}
	});
}


