// 五十音で入力

$(function(){
	var fifkeys = new FiftyKeys();
});

var FiftyKeys = function(){
	
	this.keys = [];
	this.holder = [];
	this.kana = [];
	this.kana_label = {};
	this.kana_label.aa = 'あ';	this.kana_label.ai = 'い';	this.kana_label.au = 'う';
	this.kana_label.ae = 'え';	this.kana_label.ao = 'お';
	this.kana_label.ka = 'か';	this.kana_label.ki = 'き';	this.kana_label.ku = 'く';
	this.kana_label.ke = 'け';	this.kana_label.ko = 'こ';
	this.kana_label.sa = 'さ';	this.kana_label.si = 'し';	this.kana_label.su = 'す';
	this.kana_label.se = 'せ';	this.kana_label.so = 'そ';
	this.kana_label.ta = 'た';	this.kana_label.ti = 'ち';	this.kana_label.tu = 'つ';
	this.kana_label.te = 'て';	this.kana_label.to = 'と';
	this.kana_label.na = 'な';	this.kana_label.ni = 'に';	this.kana_label.nu = 'ぬ';
	this.kana_label.ne = 'ね';	this.kana_label.no = 'の';
	this.kana_label.ha = 'は';	this.kana_label.hi = 'ひ';	this.kana_label.hu = 'ふ';
	this.kana_label.he = 'へ';	this.kana_label.ho = 'ほ';
	this.kana_label.ma = 'ま';	this.kana_label.mi = 'み';	this.kana_label.mu = 'む';
	this.kana_label.me = 'め';	this.kana_label.mo = 'も';
	this.kana_label.ya = 'や';	this.kana_label.yu = 'ゆ';	this.kana_label.yo = 'よ';
	this.kana_label.ra = 'ら';	this.kana_label.ri = 'り';	this.kana_label.ru = 'る';
	this.kana_label.re = 'れ';	this.kana_label.ro = 'ろ';
	this.kana_label.wa = 'わ';	this.kana_label.n = 'ん';	this.kana_label.choon = 'ー';
	this.kana_label.ten = '濁点';	this.kana_label.maru = '半濁点';
	
	this.lockedflag = false;
	
	var owner = this;
	
	// 初期化
	for (var i in this.kana_label) {
		$('#input-kana .layout .keys').append(this.getKeyImage(i));
	}
	
	$('#input-kana .layout .keys').append(this.getKeyImage('backspace'));
	$('#input-kana .layout .keys').append(this.getKeyImage('reset'));
	
	// イベントをバインド
	$('#input-kana .layout .keys img').hover(
		function(){
			if ($(this).hasClass('disabled')) {
				return;
			}
			$(this).addClass('hover');
			this.src = owner.holder[$(this).data('kana')]['hover'];
		},
		function(){
			if ($(this).hasClass('disabled')) {
				return;
			}
			$(this).removeClass('hover');
			this.src = owner.holder[$(this).data('kana')]['normal'];
		}
	).
	click(function(){
		if ($(this).hasClass('disabled') || owner.locked()) {
			return;
		}
		if ($(this).hasClass('backspace')) {
			owner.removeKana();
			if (owner.kana.length==0) {
				return;
			}
		} else if ($(this).hasClass('reset')) {
			owner.reset();
			return;
		} else {
			owner.addKana($(this).data('kana'));
		}
		var kana = owner.getKana().join(',');
		owner.lock();	// 問い合わせ前にロック
		if (owner.kana.length==1 && $('.layout .candidates ul li').length==0) {
			$('.layout .searching').show();
		}
		$.post(FiftyKeys.PHP_PATH, {kana:kana}, function(response){
			var response = JSON.parse(response);
			$('.layout .candidates ul').html('');
			for (var i in response.results) {
				var li = $(document.createElement('li'));
				var a = $(document.createElement('a'));
				a.append(response.results[i]);
				a.attr('href', 'javascript:void(0);');
				li.append(a);
				$('.layout .candidates ul').append(li);
			}
			$('.layout .candidates ul li a').mousedown(function(){
				$(this).css('padding', '4px 5px 2px 7px');
			})
			.mouseup(function(){
				$(this).css('padding', '3px 6px');
				SELECTED_LIST.add($(this).text());
			});
			owner.setKeyMask(response.next_candidates);
			// 200件以上の場合
			if (response.limit) {
				$('#input-kana .limit').show();
			} else {
				$('#input-kana .limit').hide();
			}
			owner.unlock();	// ロック解除
			$('.layout .searching').hide();
		});
	}).
	mousedown(function(){
		if ($(this).hasClass('disabled')) {
			return;
		}
		this.src = owner.holder[$(this).data('kana')]['pressed'];
	}).
	mouseup(function(){
		if ($(this).hasClass('disabled')) {
			return;
		}
		this.src = owner.holder[$(this).data('kana')]['normal'];
	});
	
	this.reset();
};

FiftyKeys.PHP_PATH = 'kana_search.php';

FiftyKeys.TEN = {
	'か':'が', 'き':'ぎ', 'く':'ぐ', 'け':'げ', 'こ':'ご',
	'さ':'ざ', 'し':'じ', 'す':'ず', 'せ':'ぜ', 'そ':'ぞ',
	'た':'だ', 'ち':'ぢ', 'つ':'づ', 'て':'で', 'と':'ど',
	'は':'ば', 'ひ':'び', 'ふ':'ぶ', 'へ':'べ', 'ほ':'ぼ'
};
FiftyKeys.TEN_R = {
	'が':'か', 'ぎ':'き', 'ぐ':'く', 'げ':'け', 'ご':'こ',
	'ざ':'さ', 'じ':'し', 'ず':'す', 'ぜ':'せ', 'ぞ':'そ',
	'だ':'た', 'ぢ':'ち', 'づ':'つ', 'で':'て', 'ど':'と',
	'ば':'は', 'び':'ひ', 'ぶ':'ふ', 'べ':'へ', 'ぼ':'ほ'
};

FiftyKeys.MARU = {
	'は':'ぱ', 'ひ':'ぴ', 'ふ':'ぷ', 'へ':'ぺ', 'ほ':'ぽ'
};
FiftyKeys.MARU_R = {
	'ぱ':'は', 'ぴ':'ひ', 'ぷ':'ふ', 'ぺ':'へ', 'ぽ':'ほ'
};

FiftyKeys.prototype.getKeyImage = function(file){
	var normal = new Image();
	normal.src = 'keys/'+file+'.png';
	$(normal).addClass(file);
	$(normal).data('kana', file);
	// hover, pressed, disabled も作成しておく
	var hover = new Image();
	hover.src = 'keys/'+file+'_over.png';
	var pressed = new Image();
	pressed.src = 'keys/'+file+'_pressed.png';
	disabled = new Image();
	disabled.src = 'keys/'+file+'_disabled.png';
	this.holder[file] = [];
	this.holder[file]['normal'] = normal.src;
	this.holder[file]['hover'] = hover.src;
	this.holder[file]['pressed'] = pressed.src;
	this.holder[file]['disabled'] = disabled.src;
	return normal;
};

FiftyKeys.prototype.addKana = function(str){
	this.kana.push(str);
	// 濁点だった場合
	if (str=='ten') {
		var prevkana = $('#input-kana .layout .inputed span:last-child');
		prevkana.text(FiftyKeys.TEN[prevkana.text()]);
	} 
	// 半濁点だった場合
	else if (str=='maru') {
		var prevkana = $('#input-kana .layout .inputed span:last-child');
		prevkana.text(FiftyKeys.MARU[prevkana.text()]);
	} else {
		$('#input-kana .layout .inputed').append($('<span>'+this.kana_label[str]+'</span>'));
	}
	$('#input-kana .layout .firstnavi').hide();
};

FiftyKeys.prototype.removeKana = function(){
	this.kana.pop();
	var lastchar = $('#input-kana .layout .inputed span:last-child');
	if (FiftyKeys.TEN_R[lastchar.text()]) {
		lastchar.text(FiftyKeys.TEN_R[lastchar.text()]);
	} else if (FiftyKeys.MARU_R[lastchar.text()]) {
		lastchar.text(FiftyKeys.MARU_R[lastchar.text()]);
	} else {
		$('#input-kana .layout .inputed span:last-child').remove();
	}
	if (this.kana.length==0) {
		this.reset();
	}
};

FiftyKeys.prototype.getKana = function(){
	return this.kana;
};

FiftyKeys.prototype.reset = function(){
	var owner = this;
	this.kana = [];
	$('#input-kana .layout .inputed').html('');
	$('#input-kana .layout .keys img').each(function(){
		$(this).attr('src', owner.holder[$(this).data('kana')]['normal']);
		$(this).removeClass('disabled');
	});
	$('.layout .candidates ul').html('');
	$('#input-kana .limit').hide();
	$('#input-kana .layout .firstnavi').show();
	
	$('.keys img.choon').addClass('disabled')
		.attr('src', owner.holder[$('.keys img.choon').data('kana')]['disabled']);
	$('.keys img.maru').addClass('disabled')
		.attr('src', owner.holder[$('.keys img.maru').data('kana')]['disabled']);
	$('.keys img.ten').addClass('disabled')
		.attr('src', owner.holder[$('.keys img.ten').data('kana')]['disabled']);
};

FiftyKeys.prototype.setKeyMask = function(keys) {
	keys = ','+keys+',';
	var counter = 0;
	for (var i in this.kana_label) {
		var img = $('.keys img.'+i);
		if (keys.indexOf(','+i+',')==-1) {
			img.attr('src', this.holder[img.data('kana')]['disabled']);
			img.addClass('disabled');
		} else {
			img.attr('src', this.holder[img.data('kana')]['normal']);
			img.removeClass('disabled');
		}
	}
	// 濁点がつく可能性がある文字だった場合
	if ($.inArray(this.kana[this.kana.length-1], ['ka','ki','ku','ke','ko','sa','si','su','se','so','ta','ti','tu','te','to','ha','hi','hu','he','ho'])!=-1) {
		$('.keys img.ten').attr('src', this.holder[$('.keys img.ten').data('kana')]['normal']);
		$('.keys img.ten').removeClass('disabled');
	}
	// 半濁点がつく可能性がある文字だった場合
	if ($.inArray(this.kana[this.kana.length-1], ['ha','hi','hu','he','ho'])!=-1) {
		$('.keys img.maru').attr('src', this.holder[$('.keys img.maru').data('kana')]['normal']);
		$('.keys img.maru').removeClass('disabled');
	}
};

FiftyKeys.prototype.lock = function() {
	this.lockedflag = true;
};

FiftyKeys.prototype.locked = function() {
	return this.lockedflag;
};

FiftyKeys.prototype.unlock = function() {
	this.lockedflag = false;
};


/**
 * 医薬品の候補
 */
var SELECTED_LIST = function(){};

SELECTED_LIST.selected = [];
SELECTED_LIST.NO_SYNC = 100;

/**
 * 追加
 */
SELECTED_LIST.add = function(medicine, option){
	if (SELECTED_LIST.selected.length>=30) {
		alert('一度に検索できるのは30件までです。不要なものを削除してから、追加してください。');
		return;
	}
	var owner = this;
	SELECTED_LIST.selected.push(medicine);
	$('#input-kana .selected').append('<li><div class="bg">'+Ut.htmlspecialchars(medicine)+'<a href="javascript:void(0);" class="remove" onclick="SELECTED_LIST.remove(\''+Ut.htmlspecialchars(medicine)+'\');"></a></div></li>');
	if (!option || option!=SELECTED_LIST.NO_SYNC) {
		this.sync();
	}
};

/**
 * 直接入力と同期
 */
SELECTED_LIST.sync = function(){
	$('#input-medicine :text.medi_name').val('');
	if ($('#input-medicine :text.medi_name').length<SELECTED_LIST.selected.length) {
		for (var i=0; i<SELECTED_LIST.selected.length-$('#input-medicine :text.medi_name').length; i++) {
			JPGE.addRow();
		}
	}
	for (var i=0; i<SELECTED_LIST.selected.length; i++) {
		$('#input-medicine :text.medi_name').get(i).value = SELECTED_LIST.selected[i];
	}
};

/**
 * リストから削除
 */
SELECTED_LIST.remove = function(title){
	if (confirm(title+' を削除してもよろしいですか？')) {
		$('#input-kana .selected li').each(function(){
			if ($(this).text()==title) {
				$(this).remove();
			}
		});
		var newarray = [];
		for (var i in SELECTED_LIST.selected) {
			if (SELECTED_LIST.selected[i]!=title) {
				newarray.push(SELECTED_LIST.selected[i]);
			}
		}
		SELECTED_LIST.selected = newarray;
		SELECTED_LIST.sync();
	}
};

/**
 * リストのクリア
 */
SELECTED_LIST.clear = function(){
	SELECTED_LIST.selected = [];
	$('#input-kana .selected').html('');
};


/**
 * Utilityクラス
 */
var Ut = function(){};

Ut.htmlspecialchars = function(str){
	str = str.replace(/&/g, '&');
	str = str.replace(/</g, '&lt;');
	str = str.replace(/>/g, '&gt;');
	str = str.replace(/"/g, '"');
	return str;
};
