/**
	数値編集JavaScriptライブラリ

	このライブラリを使用する場合は、
	・input.comma.cssをインポートする必要があります。
	・common.jsをインポートする必要があります。
	
	inputタグの属性に、classを割り当ててください。
	number : 数値のみ編集、右寄せ、ゼロサプレスあり
	bignumber : 3桁カンマ編集、右寄せ、ゼロサプレスあり
	digitset : 数値のみ編集、右寄せ、ゼロサプレスなし
 */

/**
	すべてのbignumber入力に","付けイベントを割り当て、編集する。
	すべてのnumber入力に数値の正規化イベントを割り当て、編集する。
	すべてのdigitset入力に数字の正規化イベントを割り当て、編集する。
 */
function initNumberInputFields() {
	var inputs = document.getElementsByClassName("digitset");
	for(i in inputs) {
		if(!inputs[i].tagName.match(/input/i)) continue;
		with (jp.co.takarakujinet.Event) {
			addEventListener(inputs[i], "focus", eventRemoveComma);
			addEventListener(inputs[i], "blur",  eventAddComma);
		}
		inputs[i].value = forceInsertComma(inputs[i].value);
	}
	var inputs = document.getElementsByClassName("number");
	for(i in inputs) {
		if(!inputs[i].tagName.match(/input/i)) continue;
		with (jp.co.takarakujinet.Event) {
			addEventListener(inputs[i], "blur",  eventNormalizeNumber);
		}
		inputs[i].value = normalizeZeroSuppressNumber(inputs[i].value);
	}

	var inputs = document.getElementsByClassName("digitset");
	for(i in inputs) {
		if(!inputs[i].tagName.match(/input/i)) continue;
		with (jp.co.takarakujinet.Event) {
			addEventListener(inputs[i], "blur",  eventNormalizeDigitSet);
		}
		inputs[i].value = normalizeNumber(inputs[i].value);
	}
}
/**
	指定したexcludeNamesに該当しないbignumberの","を取り除く。
	excludeNamesを指定しない場合には、全てのbignumberの","を取り除く。
	submitする前などに使う。
 */
function removeNumberInputFieldsFormat(excludeNames) {
	var inputs = document.getElementsByClassName("bignumber");
	var i;
	for(i in inputs) {
		if(contains(excludeNames, inputs[i].name))continue;
		inputs[i].value = delComma(inputs[i].value);
	}
}

function contains(arr, obj) {
	if (arr == null) return false;

	for(i in arr) {
		if (arr[i] == obj) return true;
	}
	
	return false;
}

function eventAddComma(evt){
	var element = getEventElement(evt);
	element.value = forceInsertComma(element.value);
	return true;
}

function eventRemoveComma(evt) {
	var element = getEventElement(evt);
	element.value = delComma(element.value);
	element.select();
	return true;
}
function eventNormalizeNumber(evt) {
	var element = getEventElement(evt);
	element.value = normalizeZeroSuppressNumber(element.value);
	return true;
}
function eventNormalizeDigitSet(evt) {
	var element = getEventElement(evt);
	element.value = normalizeNumber(element.value);
	return true;
}

function getEventElement(evt) {
	var element;
	try {
		if (evt.currentTarget) {
			element = evt.currentTarget;
		} else {
			element = evt.srcElement;
		}
	}
	catch(e){
		element = event.srcElement;
	}
	return element;
}

function forceInsertComma(str) {
	str = normalizeZeroSuppressNumber(str);
	str = insertComma(str);
	return str;
}

function normalizeZeroSuppressNumber(str) {
	str = normalizeNumber(str);
	str = zeroSuppress(str);
	return str;
}

function insertComma(str) {
	if(str==""||str==null||escape(str)=="%20")return "";
	
	var temp1 = delComma(str);
	if(isNaN(temp1)){ alert("数字を入力してください");return str; }
	temp1 = parseInt(temp1.split(".")[0],10);
	temp1 = "" + Math.abs(temp1);
	temp1 = temp1.match(/./g).reverse().join("");
	temp1 = temp1.replace(/(\d{3})/g,"$1,");
	temp1 = temp1.match(/./g).reverse().join("").replace(/^,/,"");
	
	if (str.charAt(0)=='-') temp1 = "-" + temp1;
	if(!!str.split(".")[1])temp1 = temp1 +"."+ str.split(".")[1];
	
	return temp1;
}

function delComma(w) {
	return w.split(",").join("")
}
function normalizeNumber(str) {
	try {
		str = str.match(/(\d+)/g).join("");
	} catch(e) {
		str = "";
	}
	return str;
}

/**
	ゼロサプレスした文字列を返します。
	normalizeした数値を対象とします。
*/
function zeroSuppress(str) {
	try {
		str = str.match(/[1-9](\d*)$/g).join("");
	} catch(e) {
		str = "";
	}
	return str;
}