/**
 * キーコントロールクラス
 */
function KeyControl() {};
// クラス名
KeyControl.prototype.ClassName = "KeyControl";
// バージョン名
KeyControl.prototype.Version = "0.0.1";

// キーのリスト
KeyControl.prototype.KeyKana = 229;
KeyControl.prototype.KeyBackSpace = 8;
KeyControl.prototype.KeyTab = 9;
KeyControl.prototype.KeyReturn = 13;
KeyControl.prototype.KeyShift = 16;
KeyControl.prototype.KeyControl = 17;
KeyControl.prototype.KeyAlt = 18;
KeyControl.prototype.KeyEnd = 35;
KeyControl.prototype.KeyHome = 36;
KeyControl.prototype.KeyLeft = 37;
KeyControl.prototype.KeyUp = 38;
KeyControl.prototype.KeyRight = 39;
KeyControl.prototype.KeyDown = 40;
KeyControl.prototype.KeyDel = 46;
KeyControl.prototype.Key0 = 48;
KeyControl.prototype.Key9 = 57;
KeyControl.prototype.KeyA = 65;
KeyControl.prototype.KeyC = 67;
KeyControl.prototype.KeyV = 86;
KeyControl.prototype.KeyX = 88;
KeyControl.prototype.KeyZ = 90;
KeyControl.prototype.KeyHyphen = 189;
KeyControl.prototype.KeyDot = 190;
KeyControl.prototype.KeySlash = 191;
KeyControl.prototype.KeyColon = 186;
KeyControl.prototype.KeySpace = 32;
KeyControl.prototype.KeyUnderbar = 226;
KeyControl.prototype.KeyAtmark = 192;

KeyControl.prototype.TenKey0 = 96;
KeyControl.prototype.TenKey9 = 105;
KeyControl.prototype.TenKeyHyphen = 109;
KeyControl.prototype.TenKeyDot = 110;
KeyControl.prototype.TenKeySlash = 111;

function KeyControl() {
	var events = ["keydown"];  
	for (var i = 0; i < events.length; i++){
		if (window.addEventListener) {
			window.addEventListener(events[i], function(e){ window.event = e; }, true);
		}
	}
}

// イベント元取得
KeyControl.prototype.getSrc = function (ev) { ev = ev || window.event; var src = ev.target || ev.srcElement; return src; };
// イベントキャンセル
KeyControl.prototype.cancelEvent = function(ev) {ev = ev || window.event; if (ev.preventDefault) {ev.preventDefault()} else {ev.returnValue = false; ev.cancelBubble = false;}};

// キー制御
KeyControl.prototype.checkKey = function(keyArray) {
	var ret = -1;
	var code = event.keyCode;
	
	for (key in keyArray) {
		if (keyArray[key] == code) {
			this.cancelEvent();
			ret = 1;
			break;
		}
	}
	return ret;
}

// リターンキー制御
KeyControl.prototype.checkReturn = function(enableReturn) {
	var ret = 0;
	var code = event.keyCode;
	if (code == this.KeyReturn) {
		if (typeof enableReturn == 'undefined' || !enableReturn) {
			this.cancelEvent();
			ret = -1;
		} else {
			ret = 1;
		}
	} else {
		var keyArray = new Array(
				this.KeyBackSpace, this.KeyTab, this.KeyShift, this.KeyControl,
				this.KeyAlt, this.KeyEnd, this.KeyHome, this.KeyLeft,
				this.KeyUp, this.KeyRight, this.KeyDown, this.KeyDel);
		for (key in keyArray) {
			if (keyArray[key] == code) {
				ret = 1;
				break;
			}
		}
	}
	
	return ret;
}

// 数字キーのチェック
KeyControl.prototype.checkNumberChar = function(enableReturn, throwEvent) {
	throwEvent = throwEvent || false;
	var ret = this.checkReturn(enableReturn, throwEvent);
	var code = event.keyCode;
	
	if (ret == 0) {
		if (event.ctrlKey && (this.KeyC || this.KeyX || this.KeyZ)) {
		} else if (event.shiftKey
		|| (code < this.Key0 || code > this.Key9) && (code < this.TenKey0 || code > this.TenKey9)) {
			if (!throwEvent) this.cancelEvent();
			ret = -1;
		}
	}
	
	return ret;
}

// 数字キーのチェック
KeyControl.prototype.checkAlphaNum = function(enableReturn, throwEvent) {
	throwEvent = throwEvent || false;
	var ret = this.checkReturn(enableReturn, throwEvent);
	var code = event.keyCode;
	
	if (ret == 0) {
		if (event.ctrlKey && (this.KeyC || this.KeyX || this.KeyZ)) {
			// Ctrl + C, X, Zは許可
		} else if (this.KeyA <= code && code <= this.KeyZ) {
			// アルファベットは許可
		} else if (event.shiftKey
		|| (code < this.Key0 || code > this.Key9) && (code < this.TenKey0 || code > this.TenKey9)) {
			if (!throwEvent) this.cancelEvent();
			ret = -1;
		}
	}
	
	return ret;
}

// 数字とハイフン
KeyControl.prototype.checkHyphen = function(enableReturn, throwEvent) {
	throwEvent = throwEvent || false;
	var ret = this.checkNumberChar(enableReturn, true);
	var code = event.keyCode;
	
	if (ret == -1 && !event.shiftKey && code == this.KeyHyphen || code == this.TenKeyHyphen) ret = 0;
	if (ret == -1 && !throwEvent) this.cancelEvent();
}

// 数字とドット
KeyControl.prototype.checkDot = function(enableReturn, throwEvent) {
	throwEvent = throwEvent || false;
	var ret = this.checkNumberChar(enableReturn, true);
	var code = event.keyCode;
	
	if (ret == -1 && !event.shiftKey && code == this.KeyDot || code == this.TenKeyDot) ret = 0;
	if (ret == -1 && !throwEvent) this.cancelEvent();
}

// 数字とスラッシュ
KeyControl.prototype.checkSlash = function(enableReturn, throwEvent) {
	throwEvent = throwEvent || false;
	var ret = this.checkNumberChar(enableReturn, true);
	var code = event.keyCode;
	
	if (ret == -1 && !event.shiftKey && code == this.KeySlash || code == this.TenKeySlash) ret = 0;
	if (ret == -1 && !throwEvent) this.cancelEvent();
}

// 数字とコロン
KeyControl.prototype.checkColon = function(enableReturn, throwEvent) {
	throwEvent = throwEvent || false;
	var ret = this.checkNumberChar(enableReturn, true);
	var code = event.keyCode;
	
	if (ret == -1 && !event.shiftKey && code == this.KeyColon) ret = 0;
	if (ret == -1 && !throwEvent) this.cancelEvent();
}

// 数字とスラッシュ、コロン、スペース
KeyControl.prototype.checkDateTimeChar = function(enableReturn, throwEvent) {
	throwEvent = throwEvent || false;
	var ret = this.checkSlash(enableReturn, true);
	var code = event.keyCode;
	
	if (ret == -1 && !event.shiftKey && code == this.KeyColon || code == this.KeySpace) ret = 0;
	if (ret == -1 && !throwEvent) this.cancelEvent();
}

// 英数字とドット、ハイフン、アンダーバー、@
KeyControl.prototype.checkMailChar = function(enableReturn, throwEvent) {
	throwEvent = throwEvent || false;
	var ret = this.checkReturn(enableReturn, throwEvent);
	var code = event.keyCode;
	
	if (ret == 0) {
		if (event.ctrlKey && (this.KeyC || this.KeyX || this.KeyZ)) {
		} else if (!event.shiftKey) {
			if ((code < this.Key0 || code > this.Key9) 
			&& (code < this.TenKey0 || code > this.TenKey9)
			&& (code < this.KeyA || code > this.KeyZ)
			&& (code != this.KeyDot && code != this.KeyHyphen && code != this.KeyAtmark)) {
				if (!throwEvent) this.cancelEvent();
				ret = -1;
			}
		} else if(code == this.KeyUnderbar || (code >= this.KeyA && code <= this.KeyZ)) {
		} else {
			if (!throwEvent) this.cancelEvent();
			ret = -1;
		}
	}
}

var keyControl = new KeyControl();