/**
 * @fileOverView 基本JSファイル
 */

/**
 * @namespace 名前空間 rnmp
 */
var rnmp = rnmp || {};

/**
 * @namespace 名前空間 便利関数置場
 */
rnmp.util = rnmp.util || {};

/**
 * XMLHttpObject生成
 * @return {Object}
 */
rnmp.util.createHttpRequest = function(){
	var req = window.XMLHttpRequest ? new XMLHttpRequest() :
	(function () {
		try { return new ActiveXObject('Msxml2.XMLHTTP'); }
		catch(e) {
			try { return new ActiveXObject('Microsoft.XMLHTTP'); }
			catch(e) { return null; }
		}
	})();
	return req;
}
/**
 * XMLHttpRequestでデータを取得
 * @return {void}
 * @param {String} url 外部データのパス
 * @param {Function} callback コールバック関数
 */
rnmp.util.getData = function(url, callback){
	var req = rnmp.util.createHttpRequest();
	req.onreadystatechange = function(){
		if (req.readyState == 4 && req.status == 200) {
			callback(req);
		}
	}
	var timestamp = new Date().getTime();
	req.open('GET', url + '?time=' + timestamp, true);
	req.send(null);
}
/**
 * ノードを空にする
 * @return {void}
 * @param {Object} node 空にしたいノード
 */
rnmp.util.clearNode = function(node){
	while (node.firstChild){
		node.removeChild(node.lastChild);
	}
}
/**
 * ノードリストを配列化して返す
 * @return {Array}
 * @param {Object} nodeList 配列化したいノードリスト
 */
rnmp.util.node2Array = function(nodeList){
	var a = [];
	for(var i=0,l=nodeList.length; i<l; i++){
		a.push(nodeList[i]);
	}
	return a;
}
/**
 * 配列をシャッフルして返す
 * @return {Array}
 * @param {Array} array シャッフルしたい配列
 */
rnmp.util.shuffleArray = function(array){
	var i = array.length;
	while (--i){
		var j = Math.floor(Math.random() * (i+1));
		if(i==j)continue;
		var k = array[i];
		array[i] = array[j];
		array[j] = k;
	}
	return array;
}
/**
 * 数値を指定した桁数にして返す
 * @return {Number}
 * @param {Number} n 元になる数値
 * @param {Number} keta 桁数
 */
rnmp.util.setDigit = function(n, keta){
	n = String(n + Math.pow(10, keta));
	n = n.substr(n.length - keta);
	return n;
}
/**
 * 今日の日付を8桁の文字列（YYYYMMDD）で取得
 * @return {String}
 */
rnmp.util.getStrDate = function(){
	var date = new Date();
	var y = date.getFullYear();
	var m = rnmp.util.setDigit(date.getMonth() + 1, 2);
	var d = rnmp.util.setDigit(date.getDate(), 2);
	return y + m + d;
}
/**
 * 新規ウィンドウ対象のa要素にtarget="_blank"指定をして返す
 * @return {Object}
 * @param {Object} a href属性値を持ったA要素
 */
rnmp.util.newWinCheck = function(a){
	if ((
			a.getAttribute('href').indexOf('/media/') != -1 ||
			a.getAttribute('href').indexOf('%2fmedia%2f') != -1 ||
			a.getAttribute('href').indexOf('%2fNAVG65100%2ecgi%3fTHEME%5f') != -1
		)&&(
			a.getAttribute('href').indexOf('%2fCNT%2fQA%2f') == -1
		)){
			a.setAttribute('target', '_blank');
		}
	if (a.getAttribute('href').indexOf('%2fmedia%2fqa%2f') != -1){
		a.setAttribute('href', 'javascript:void(window.open(\'' + href + '\', \'\', \'width=500, height=600, scrollbars=yes\'));');
		a.removeAttribute('target');
	}
	return a;
}
/**
 * iframeの高さを中身に応じて自動調整します
 * @return {void}
 * @param {String} targetId 対象iframeのid
 */
rnmp.util.iframeResize = function(targetId){
	var iframe = $(targetId);
	if(document.height){
		iframe.style.height = iframe.contentWindow.document.height + "px";
	}else{
		iframe.style.height = iframe.contentWindow.document.body.scrollHeight + "px";
	}
}
/**
 * 変数を監視します
 * @return {void}
 * @param {Object} obj 監視対象のオブジェクト、グローバルであればwindow
 * @param {String} val 監視するプロパティ名
 * @param {Function} callback 変更検知後の実行関数
 * @example
 * グローバル変数'val'を監視する場合。
 * var val = 'aaa';
 * rnmp.util,onChangeValue(window, 'val', function(obj, val){alert(obj[val]);});
 * コールバックにはwindowと'val'が渡されます。
 *
 * オブジェクト'obj'のプロパティ'prop'を監視する場合。
 * var obj = {prop:'aaa'};
 * rnmp.util.onChangeValue(obj, 'prop', function(obj, val){alert(obj[val]);});
 */
rnmp.util.onChangeValue = function(obj, val, callback){
	(function(obj, val){
		var _v = obj[val];
		var interval = setInterval(
			function(){
				if(_v != obj[val]){
					clearInterval(interval);
					callback(obj, val);
				}
			},
			100
		);
	})(obj, val);
}
/**
 * 子要素も含めてユニークなナンバリングを施すcloneNodeメソッドラッパー<br>
 * for文の中で引数numに変数iなどを入れて使ったりなどを想定
 * @return {Object} 複製されたノード
 * @param {Object} node 複製したいノード
 * @param {Number} num id名の末尾に割り振る番号
 * @example
 * for (var i=0,l=hoge.length; i<l; i++){
 *   clone = jimo.cloneNodeUnique(node, i);
 * }
 */
rnmp.util.cloneNodeUnique = function(node, num){
	var clone = node.cloneNode(true);
	clone.setAttribute('id', clone.getAttribute('id') + num);
	var elms = clone.getElementsByTagName('*');
	for (var i=0,l=elms.length; i<l; i++){
		if (elms[i].getAttribute('id')){
			elms[i].setAttribute('id', elms[i].getAttribute('id') + num);
		}
	}
	return clone;
}
/**
 * HTML要素を生成する
 * @return {Object} HTML要素
 * @param {String} tagName 要素名
 * @param {Object} attr 属性名と属性値を収めたオブジェクト
 */
rnmp.util.makeElement = function(tagName, attr){
	var elm = document.createElement(tagName);
	if(attr){
		for(var i in attr){
			if(attr[i] !== 'class'){
				elm.setAttribute(i, attr[i]);
			}else if(attr[i] === 'class'){
				elm.className = attr[i];
			}
		}
	}
	return elm;
}
/**
 * thisの委譲処理<br>
 * クラスを作りながらイベント処理を行う際にthisのスコープが<br>
 * windowになってしまう際にもきちんとthisのスコープを保持してくれます
 * @see http://d.hatena.ne.jp/ytksn/20091024/1256370705
 * @example
 * var f = this.myFunction;
 * f = rnmp.util.createDelegate(f, this);
 * setInterval(f, 1000);
 */
rnmp.util.createDelegate = function(func, thisObj){
	var del = function(){
		return func.apply(thisObj, arguments);
	};
	del.func = func;
	del.thisObj = thisObj;
	return del; 
}
/**
 * 透明な全画面レイヤーを作成して返す<br>
 * モーダルウィンドウやツールチップを使う際の下敷きレイヤーを作ります。<br>
 * これを基に色をつけたりイベントを与えたりしてあげてください。
 * @return {Object}
 */ 
rnmp.util.createBaseLayer = function(){
	if(document.getElementById('rnmp_base_layer')) return;
	var layer = document.createElement('div');
	layer.id = 'rnmp_base_layer';
	layer.style.height = document.body.scrollHeight + 'px';
	return layer;
}
/**
 * 要素のx座標を求めて返す
 * @return {Number}
 * @param {Object} element 要素
 */
rnmp.util.getPosX = function(element){
	var x = 0;
	for(var e = element; e; e = e.offsetParent){
		x += e.offsetLeft;
	}
	for(e = element.parentNode; e && e != document.body; e = e.parentNode){
		if(e.scrollLeft) x -= e.scrollLeft;
	}
	return x;
}
/**
 * 要素のy座標を求めて返す
 * @return {Number}
 * @param {Object} element 要素
 */
rnmp.util.getPosY = function(element){
	var y = 0;
	for(var e = element; e; e = e.offsetParent){
		y += e.offsetTop;
	}
	for(e = element.parentNode; e && e != document.body; e = e.parentNode){
		if(e.scrollTop) y -= e.scrollTop;
	}
	return y;
}
