/**
 * コラム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: {
			'window': {
				'scroll resize': 'scrollResizeWindow',
				'scroll': 'scrollWindow',
				'resize': 'resizeWindow'
			}
		},
		/**
		 * 初期実行
		 *
		 * @return void
		 */
		init: function(){
			// はてブの画像サイズ変更
			setInterval(function(){
				$('.hatena-bookmark-button-frame').removeAttr('style');
			}, 100);
			
			// figure内imgのトリミング
			this.trimmingFigureImg();
		},
		/**
		 * [event] scrollResizeWindow
		 *
		 * @param object	event
		 * @param object	target
		 */
		scrollResizeWindow: function(event, target) {
		},
		/**
		 * [event] scrollWindow
		 *
		 * @param object	event
		 * @param object	target
		 */
		scrollWindow: function(event, target) {
		},
		/**
		 * [event] resizeWindow
		 *
		 * @param object	event
		 * @param object	target
		 */
		resizeWindow: function(event, target) {
			// figure内imgのトリミング
			this.trimmingFigureImg();
		},
		//////////////////////////////////////////////////////////////////////////////////
		/**
		 * figure内のimgのトリミングを行う
		 *
		 * @return void
		 */
		trimmingFigureImg: function() {
			$('#column-content figure img').each(function(){
				var imgHeight = $(this).height();
				var figureHeight = $(this).parent().height();
				if (figureHeight < imgHeight) {
					$(this).css({'margin-top': (figureHeight - imgHeight)/2 + 'px'});
				} else {
					$(this).removeAttr('style');
				}
			});
		}
	};
	/**
	 * タイマー
	 *
	 * @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);
					});
				}
			});
		});
	});
})();