//** IE高速化用
/*@cc_on _d=document;eval('var document=_d')@*/


//** Utility Func ********************************************************************************//
//* getElementById
function $(obj_id) {
	var element = document.getElementById(obj_id);
	return (element!=false)? element:false;
}

//* オブジェクトの拡張
function extendObj(destination, source) {
  for (var property in source) {
    destination[property] = source[property];
  }
  return destination;
}

//* XMLHttpRequestオブジェクトの生成
function createHttpRequest(){
	if(window.ActiveXObject){
		try {
			return new ActiveXObject("Msxml2.XMLHTTP");
		} catch (e) {
			try {
				return new ActiveXObject("Microsoft.XMLHTTP");
			} catch (e2) {
				return null;
			}
		}
	} else if(window.XMLHttpRequest){
		return new XMLHttpRequest();
	} else {
		return null;
	}
}

/**
 * CSV文字列を配列に変更
 * @param csv_txt CSV文字列
 * @return CSVを配列化したデータ
 */
function getCsvData(csv_txt){
	//文中にある改行を変換
	var tmp_1 = "";
	var tmp_2 = "";
	//CSVのエスケープを変更「\"」->「""」
	csv_txt = csv_txt.replace(/([^\\])\\\"([^,])/ig,"$1\"\"$2");
	//改行がある場合はループ
	while(csv_txt.search(/\n/i) != -1){
		tmp_1 = "";
		//取得文字列のダブルクォーテーションの数が偶数になるまでループ
		while(csv_txt != "" && (tmp_1 == "" || (tmp_1.split('"').length - 1) % 2 != 0)){
			//先頭から改行までを取得
			csv_txt = csv_txt.replace(/^(.*?\n)/i,"");
			tmp_1 += RegExp.$1;
		}
		//全ての改行を変換する
		tmp_1 = tmp_1.replace(/\n/ig,"@@javascript_csv_enter@@");
		//最後の改行のみ元に戻す
		tmp_1 = tmp_1.replace(/@@javascript_csv_enter@@$/ig,"\n");
		tmp_2 += tmp_1;
	}
	//csv_txtを更新
	csv_txt = tmp_2;
	//行データ数分分割
	var dataArray = csv_txt.split("\n");
	//行データ数分ループ
	var csv_data = new Array();
	var item = new Array();
	var data = new Array();
	var tmp_data = "";
	var tmp_data = new Object();
	for(i = 0;i < dataArray.length;i++){
		//行データが空で無い場合
		if(dataArray[i] != ""){
			data = new Array();
			while(dataArray[i] != ""){
				tmp_data = "";
				//行データに含まれる「,」で区切り、列データを抽出する
				while(dataArray[i] != "" && (tmp_data == "" || (tmp_data.split('"').length - 1) % 2 != 0)){
					dataArray[i] = dataArray[i].replace(/(.*?(,|\n|$))/i,"");
					tmp_data += RegExp.$1;
				}
				tmp_data = tmp_data.replace(/(,|\n)$/i,"");
				data[data.length] = tmp_data;
			}
			//一時データ
			tmp_data = new Object();
			//列データ分ループ
			for(j = 0;j < data.length;j++){
				//改行データのみの行を空白にする
				if(data[j].match(/^\s$/i)) data[j] = "";
				//列データが空白でない場合
				if(data[j] != ""){
					//「"」を取り除く
					data[j] = data[j].replace(/(^\"|\"$)/ig,"");
					//改行を元に戻す
					data[j] = data[j].replace(/@@javascript_csv_enter@@/ig,"\n");
					//項目名の取得
					if(i == 0) item[j] = data[j];
					//データの取＆エスケープ変換「""」->「\"」
					else tmp_data[item[j]] = data[j].replace(/\"\"/ig,"\"");
				}
			}
			//配列に入れる
			if(i != 0) csv_data[csv_data.length] = tmp_data;
		}
	}
	return csv_data;
}

//* デバック
function Debug(msg, area) {
	($(area))? $(area).innerHTML += msg+"<br>" : alert(msg);
}

var $A = Array.from = function(iterable) {
  if (!iterable) return [];
  if (iterable.toArray) {
    return iterable.toArray();
  } else {
    var results = [];
    for (var i = 0, length = iterable.length; i < length; i++)
      results.push(iterable[i]);
    return results;
  }
}

Function.prototype.bind = function() {
  var __method = this, args = $A(arguments), object = args.shift();
  return function() {
    return __method.apply(object, args.concat($A(arguments)));
  }
}

Function.prototype.bindAsEventListener = function(object) {
  var __method = this, args = $A(arguments), object = args.shift();
  return function(event) {
    return __method.apply(object, [event || window.event].concat(args));
  }
}
