/**
 * コラムJS
 *
 * @author Tsue Shogo
 * @version
 *	1.0.0	2018/10/25(木) 11:32	新規作成
 *	1.1.0	2018/11/09(金) 15:08	figure内imgのトリミング追加
 */
(function() {
	/**
	 * コントローラ
	 *
	 * @var Object
	 */
	var Controller = {
		/**
		 * パラメータ
		 *
		 * @var Object
		 */
		params: {},
		/**
		 * イベント
		 *
		 * @var Object
		 */
		events: {
			".tags_crowd li": {
				click: "clickTagsCrowdLi"
			}
		},
		/**
		 * 初期実行
		 *
		 * @return void
		 */
		init: function() {},
		/**
		 * [event] clickTagsCrowdLi
		 *
		 * @param object	event
		 * @param object	target
		 */
		clickTagsCrowdLi: function(event, target) {
			location.href = "/faq/search/?fw=" + $(target).data("tag");
		}
	};
	/**
	 * タイマー
	 *
	 * @return Object
	 */
	var Timer = function() {
		return {
			/**
			 * 現在の時刻ミリ秒
			 *
			 * @return int
			 */
			now: function() {
				if (false && typeof performance !== "undefined" && typeof performance.now !== "undefined") {
					return performance.now();
				} else {
					var d = new Date();
					return d.getTime();
				}
			},
			/**
			 * セッター
			 *
			 * @param string tag
			 * @return int
			 */
			set: function(tag) {
				return (this._memory[tag] = this.now());
			},
			/**
			 * ゲッター
			 *
			 * @param string fromTag
			 * @param string toTag
			 * @return int
			 */
			get: function(fromTag, toTag) {
				var to = typeof toTag === "undefined" || typeof this._memory[toTag] === "undefined" ? this.now() : this._memory[toTag];
				var from = typeof fromTag === "undefined" || typeof this._memory[fromTag] === "undefined" ? this.now() : this._memory[fromTag];
				return to - from;
			},
			/**
			 * メモリ
			 *
			 * @var Object
			 */
			_memory: {},
			/**
			 * アニメーションフレーム
			 *
			 * @param function func
			 * @return void
			 */
			frame: function(func) {
				if (typeof window.requestAnimationFrame !== "undefined") {
					window.requestAnimationFrame(func);
				} else {
					window.setTimeout(func, this.delay);
				}
			},
			/**
			 * setTimeout遅延
			 *
			 * @var number
			 */
			delay: 1000 / 60
		};
	};
	/**
	 * UserAgentによるブラウザ・OSの判別
	 *
	 */
	var UserAgent = function() {
		var ua = navigator.userAgent.toLowerCase();
		var ver = navigator.appVersion.toLowerCase();

		// [1] ブラウザ
		var isMSIE = ua.indexOf("msie") > -1 && ua.indexOf("opera") == -1; // ※IE11以外
		var isIE6 = isMSIE && ver.indexOf("msie 6.") > -1;
		var isIE7 = isMSIE && ver.indexOf("msie 7.") > -1;
		var isIE8 = isMSIE && ver.indexOf("msie 8.") > -1;
		var isIE9 = isMSIE && ver.indexOf("msie 9.") > -1;
		var isIE10 = isMSIE && ver.indexOf("msie 10.") > -1;
		var isIE11 = ua.indexOf("trident/7") > -1;
		var isIE = isMSIE || isIE11;
		var isEdge = ua.indexOf("edge") > -1;
		var isChrome = ua.indexOf("chrome") > -1 && ua.indexOf("edge") == -1;
		var isFirefox = ua.indexOf("firefox") > -1;
		var isSafari = ua.indexOf("safari") > -1 && ua.indexOf("chrome") == -1;
		var isOpera = ua.indexOf("opera") > -1;

		// [2] スマホ
		var isiPhone = ua.indexOf("iphone") > -1;
		var isiPad = ua.indexOf("ipad") > -1;
		var isAndroid = ua.indexOf("android") > -1 && ua.indexOf("mobile") > -1;
		var isAndroidTablet = ua.indexOf("android") > -1 && ua.indexOf("mobile") == -1;

		return {
			isMSIE: isMSIE,
			isIE6: isIE6,
			isIE7: isIE7,
			isIE8: isIE8,
			isIE9: isIE9,
			isIE10: isIE10,
			isIE11: isIE11,
			isIE: isIE,
			isEdge: isEdge,
			isChrome: isChrome,
			isFirefox: isFirefox,
			isSafari: isSafari,
			isOpera: isOpera,
			isiPhone: isiPhone,
			isiPad: isiPad,
			isAndroid: isAndroid,
			isAndroidTablet: isAndroidTablet
		};
	};
	/**
	 * チェッカー
	 *
	 * @var object
	 */
	var Checker = {
		/**
		 * 必須チェック
		 *
		 * @param mixed		val
		 * @param object	rule
		 * @return bool
		 */
		notEmpty: function(val, rule) {
			if (val === null || typeof val === "undefined") {
				val = "";
			}
			return val !== "";
		},
		/**
		 * 長さチェック
		 *
		 * @param mixed		val
		 * @param object	rule
		 * @return bool
		 */
		length: function(val, rule) {
			var ret = true;
			if (val === "") {
				return ret;
			}
			var len = val.length;
			if (typeof rule.min !== "undefined") {
				// 最小長さチェック
				if (len < rule.min) {
					ret = false;
				}
			}
			if (typeof rule.max !== "undefined") {
				// 最大長さチェック
				if (len > rule.max) {
					ret = false;
				}
			}
			return ret;
		},
		/**
		 * 数値チェック
		 *
		 * @param mixed		val
		 * @param object	rule
		 * @return bool
		 */
		between: function(val, rule) {
			var ret = true;
			if (val === "") {
				return ret;
			}
			val = val * 1;
			if (typeof rule.min !== "undefined") {
				// 最小長さチェック
				if (val < rule.min) {
					ret = false;
				}
			}
			if (typeof rule.max !== "undefined") {
				// 最大長さチェック
				if (val > rule.max) {
					ret = false;
				}
			}
			return ret;
		},
		/**
		 * 全角ひらがなチェック
		 *
		 * @param mixed		val
		 * @param object	rule
		 * @return bool
		 */
		zenHiragana: function(val, rule) {
			if (typeof rule !== "undefined" && typeof rule.allowSpace !== "undefined" && rule.allowSpace) {
				return val.match(/^([ぁ-ん]|ー|\s)*$/) ? true : false;
			} else {
				return val.match(/^([ぁ-ん]|ー)*$/) ? true : false;
			}
		},
		/**
		 * 全角カタカナチェック
		 *
		 * @param mixed		val
		 * @param object	rule
		 * @return bool
		 */
		zenKatakana: function(val, rule) {
			if (typeof rule !== "undefined" && typeof rule.allowSpace !== "undefined" && rule.allowSpace) {
				return val.match(/^([ァ-ン]|ー|－|\s)*$/) ? true : false;
			} else {
				return val.match(/^([ァ-ン]|ー|－)*$/) ? true : false;
			}
		},
		/**
		 * 全角チェック
		 *
		 * @param mixed		val
		 * @param object	rule
		 * @return bool
		 */
		zenkaku: function(val, rule) {
			var ret = val.match(/^([０-９ぁ-んァ-ン－一-龥ー。、？＋　\n])*$/) ? true : false;
			return ret;
		},
		/**
		 * 半角チェック
		 *
		 * @param mixed		val
		 * @param object	rule
		 * @return bool
		 */
		hankaku: function(val, rule) {
			var ret = val.match(/^([0-9a-zA-Zｧ-ﾝﾞﾟ\-.\x20\n])*$/) ? true : false;
			return ret;
		},
		/**
		 * 半角英数チェック
		 *
		 * @param mixed		val
		 * @param object	rule
		 * @return bool
		 */
		hanEisu: function(val, rule) {
			var ret = val.match(/^([0-9a-zA-Z])*$/) ? true : false;
			return ret;
		},
		/**
		 * 半角数チェック
		 *
		 * @param mixed		val
		 * @param object	rule
		 * @return bool
		 */
		hanSu: function(val, rule) {
			var ret = val.match(/^([0-9])*$/) ? true : false;
			return ret;
		},
		/**
		 * メールアドレスチェック
		 *
		 * @param mixed		val
		 * @param object	rule
		 * @return bool
		 */
		email: function(val, rule) {
			if (val === "") {
				return true;
			}
			var ret = val.match(/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/) ? true : false;
			return ret;
		},
		/**
		 * URLチェック
		 *
		 * @param mixed		val
		 * @param object	rule
		 * @return bool
		 */
		url: function(val, rule) {
			if (val === "") {
				return true;
			}
			var ret = val.match(/(https?:\/\/[\w\-\.\/\?\,\#\:\u3000-\u30FE\u4E00-\u9FA0\uFF01-\uFFE3]+)/) ? true : false;
			return ret;
		}
	};
	/**
	 * 校正
	 *
	 * @var Object
	 */
	var Calibrator = {
		/**
		 * 半角に変換する
		 *
		 * @param string	str
		 * @return string
		 */
		toHankaku: function(str) {
			str = str.replace(/[Ａ-Ｚａ-ｚ０-９]/g, function(s) {
				return String.fromCharCode(s.charCodeAt(0) - 0xfee0);
			});
			str = this.toKatakana(str);
			Object.keys(Map.kana).forEach(function(zenkana) {
				var hankana = Map.kana[zenkana];
				str = str.split(zenkana).join(hankana);
			});
			return str;
		},
		/**
		 * 全角に変換する
		 *
		 * @param string	str
		 * @return string
		 */
		toZenkaku: function(str) {
			str = str.replace(/[A-Za-z0-9]/g, function(s) {
				return String.fromCharCode(s.charCodeAt(0) + 0xfee0);
			});
			Object.keys(Map.kana).forEach(function(zenkana) {
				var hankana = Map.kana[zenkana];
				str = str.split(hankana).join(zenkana);
			});
			return str;
		},
		/**
		 * ひらがなに変換する
		 *
		 * @param string	str
		 * @return string
		 */
		toHiragana: function(str) {
			Object.keys(Map.kana).forEach(function(zenkana) {
				var hankana = Map.kana[zenkana];
				str = str.split(hankana).join(zenkana);
			});
			str = str.replace(/[\u30a1-\u30f6]/g, function(match) {
				var chr = match.charCodeAt(0) - 0x60;
				return String.fromCharCode(chr);
			});
			return str;
		},
		/**
		 * カタカナに変換する
		 *
		 * @param string	str
		 * @return string
		 */
		toKatakana: function(str) {
			Object.keys(Map.kana).forEach(function(zenkana) {
				var hankana = Map.kana[zenkana];
				str = str.split(hankana).join(zenkana);
			});
			str = str.replace(/[\u3041-\u3096]/g, function(match) {
				var chr = match.charCodeAt(0) + 0x60;
				return String.fromCharCode(chr);
			});
			return str;
		},
		/**
		 * 補助単位を付ける
		 *
		 * @param int	num
		 * @param string	unit
		 * @return string
		 */
		addSubUnit: function(num, unit) {
			var subUnits = ["", "K", "M", "G", "T"];
			subUnits.forEach(function(subUnit, index) {
				if (num < 1000 || index === subUnits.length - 1) {
					return Math.round(num * 100) / 100 + subUnit + unit;
				}
				num = num / 1000;
			});
		},
		/**
		 * 数字を3桁区切りでカンマを付ける
		 *
		 * @param string	str
		 * @return string
		 */
		numberFormat: function(str) {
			return str.toString().replace(/(\d+?)(?=(?:\d{3})+$)/g, function(x) {
				return x + ",";
			});
		}
	};
	/**
	 * 簡易マップ
	 *
	 * @var Object
	 */
	var Map = {
		// 半角カナ
		kana: {
			ア: "ｱ",
			イ: "ｲ",
			ウ: "ｳ",
			エ: "ｴ",
			オ: "ｵ",
			カ: "ｶ",
			キ: "ｷ",
			ク: "ｸ",
			ケ: "ｹ",
			コ: "ｺ",
			サ: "ｻ",
			シ: "ｼ",
			ス: "ｽ",
			セ: "ｾ",
			ソ: "ｿ",
			タ: "ﾀ",
			チ: "ﾁ",
			ツ: "ﾂ",
			テ: "ﾃ",
			ト: "ﾄ",
			ナ: "ﾅ",
			ニ: "ﾆ",
			ヌ: "ﾇ",
			ネ: "ﾈ",
			ノ: "ﾉ",
			ハ: "ﾊ",
			ヒ: "ﾋ",
			フ: "ﾌ",
			ヘ: "ﾍ",
			ホ: "ﾎ",
			マ: "ﾏ",
			ミ: "ﾐ",
			ム: "ﾑ",
			メ: "ﾒ",
			モ: "ﾓ",
			ヤ: "ﾔ",
			ユ: "ﾕ",
			ヨ: "ﾖ",
			ラ: "ﾗ",
			リ: "ﾘ",
			ル: "ﾙ",
			レ: "ﾚ",
			ロ: "ﾛ",
			ワ: "ﾜ",
			ヲ: "ｦ",
			ン: "ﾝ",
			ー: "ｰ",
			ヴ: "ｳﾞ",
			ガ: "ｶﾞ",
			ギ: "ｷﾞ",
			グ: "ｸﾞ",
			ゲ: "ｹﾞ",
			ゴ: "ｺﾞ",
			ザ: "ｻﾞ",
			ジ: "ｼﾞ",
			ズ: "ｽﾞ",
			ゼ: "ｾﾞ",
			ゾ: "ｿﾞ",
			ダ: "ﾀﾞ",
			ヂ: "ﾁﾞ",
			ヅ: "ﾂﾞ",
			デ: "ﾃﾞ",
			ド: "ﾄﾞ",
			バ: "ﾊﾞ",
			ビ: "ﾋﾞ",
			ブ: "ﾌﾞ",
			ベ: "ﾍﾞ",
			ボ: "ﾎﾞ",
			パ: "ﾊﾟ",
			ピ: "ﾋﾟ",
			プ: "ﾌﾟ",
			ペ: "ﾍﾟ",
			ポ: "ﾎﾟ",
			ァ: "ｧ",
			ィ: "ｨ",
			ゥ: "ｩ",
			ェ: "ｪ",
			ォ: "ｫ",
			ャ: "ｬ",
			ュ: "ｭ",
			ョ: "ｮ",
			ッ: "ｯ",
			ヮ: "ﾜ",
			"－": "-",
			"‐": "-",
			"―": "-",
			"！": "!",
			"”": '"',
			"＃": "#",
			"＄": "$",
			"％": "%",
			"＆": "&",
			"’": "'",
			"（": "(",
			"）": ")",
			"＝": "=",
			"～": "~",
			"｜": "|",
			"＠": "@",
			"‘": "`",
			"｛": "{",
			"｝": "}",
			"＋": "+",
			"＊": "*",
			"；": ";",
			"：": ":",
			"＜": "<",
			"＞": ">",
			"、": ",",
			"。": ".",
			"？": "?",
			"／": "/",
			"＿": "_",
			"￥": "\\"
		},
		// 都道府県
		pref: {
			"1": "北海道",
			"2": "青森県",
			"3": "岩手県",
			"4": "宮城県",
			"5": "秋田県",
			"6": "山形県",
			"7": "福島県",
			"8": "茨城県",
			"9": "栃木県",
			"10": "群馬県",
			"11": "埼玉県",
			"12": "千葉県",
			"13": "東京都",
			"14": "神奈川県",
			"15": "新潟県",
			"16": "富山県",
			"17": "石川県",
			"18": "福井県",
			"19": "山梨県",
			"20": "長野県",
			"21": "岐阜県",
			"22": "静岡県",
			"23": "愛知県",
			"24": "三重県",
			"25": "滋賀県",
			"26": "京都府",
			"27": "大阪府",
			"28": "兵庫県",
			"29": "奈良県",
			"30": "和歌山県",
			"31": "鳥取県",
			"32": "島根県",
			"33": "岡山県",
			"34": "広島県",
			"35": "山口県",
			"36": "徳島県",
			"37": "香川県",
			"38": "愛媛県",
			"39": "高知県",
			"40": "福岡県",
			"41": "佐賀県",
			"42": "長崎県",
			"43": "熊本県",
			"44": "大分県",
			"45": "宮崎県",
			"46": "鹿児島県",
			"47": "沖縄県"
		}
	};
	jQuery(function($) {
		// 初期実行
		Controller.init();
		// イベント登録
		Object.keys(Controller.events).forEach(function(selector) {
			var events = Controller.events[selector];
			Object.keys(events).forEach(function(event) {
				var func = events[event];
				if (selector !== "window") {
					$(document).on(event, selector, function(eve) {
						Controller[func](eve, this);
					});
				} else {
					$(window).on(event, function(eve) {
						Controller[func](eve, this);
					});
				}
			});
		});
	});
})();
