// ArenaDB Webout 共通処理を定義する common.js
// 2008.11.20 yuu@ERO

//------------------------------------------------
//定数の宣言
//------------------------------------------------
//配列インデックス
var idxDate = 0;		//試合日付
var idxVersion = 1;		//WoWバージョン
var idxSize = 2;		//規模
var idxType = 3;		//アリーナタイプ
var idxResult = 4;		//試合結果
var idxRateOld = 5;		//レート変動
var idxRateNew = 6;		//レート変動
var idxTeamMember = 7;	//チーム名
var idxTeamEnemy = 8;	//チーム名
var idxMMRMember = 9;	//マッチメイキング
var idxMMREnemy = 10;	//マッチメイキング
var idxTime = 11;		//試合時間
var idxZone = 12;		//ゾーン
var idxEnemy = 13;		//敵チームメンバー
var idxMember = 14;		//自チームメンバー
var idxRemark = 15;		//ノート
var idxLink = 16;		//リンク
var idxDetail = 17;		//詳細

var idxClass = 0;
var idxRace = 1;
var idxName = 2;
var idxRealm = 3;
var idxDmg = 4;
var idxHeal = 5;
var idxKill = 6;

//idxDetailの子次元
var idxDetailGuid = 0;
var idxDetailAlly = 1;
var idxDetailName = 2;
var idxDetailCtrl = 3;
var idxDetailScore = 4;

//idxDetailScoreの子次元
var idxDestGuid = 0;
var idxDestDmg = 1;
var idxDestHeal = 2;
var idxDestKill = 3;

//クラス配列
var aryClass = new Array();
aryClass[0] = "dk";
aryClass[1] = "dr";
aryClass[2] = "hu";
aryClass[3] = "ma";
aryClass[4] = "pa";
aryClass[5] = "pr";
aryClass[6] = "ro";
aryClass[7] = "sh";
aryClass[8] = "wl";
aryClass[9] = "wr";

//条件格納オブジェクト
var aryCond = new Object();
aryCond["disp"] = 0;
aryCond["ver"] = new Array();
aryCond["type"] = new Array();
aryCond["size"] = new Array();
aryCond["result"] = new Array();
aryCond["zone"] = new Array();
aryCond["date"] = new Array();
aryCond["enemy"] = new Array();
aryCond["member"] = new Array();

//置換配列
var aryRepSize = new Array();
aryRepSize["2"] = "2v2";
aryRepSize["3"] = "3v3";
aryRepSize["5"] = "5v5";
var aryRepType = new Array();
aryRepType["0"] = "Practice";
aryRepType["1"] = "Rated";
var aryRepResult = new Array();
aryRepResult["0"] = "Won";
aryRepResult["1"] = "Lost";
aryRepResult["2"] = "Even";
var aryRepZone = new Array();
aryRepZone["0"] = "BEA";
aryRepZone["1"] = "NA";
aryRepZone["2"] = "RoL";
aryRepZone["3"] = "DS";
aryRepZone["4"] = "RoV";
var aryRepZone2 = new Array();
aryRepZone2["0"] = "Blade's Edge Arena";
aryRepZone2["1"] = "Nagrand Arena";
aryRepZone2["2"] = "Ruins of Lordaeron";
aryRepZone2["3"] = "Dalaran Sewers";
aryRepZone2["4"] = "The Ring of Valor";
var aryRepCls = new Array();
aryRepCls["dk"] = "DK";
aryRepCls["dr"] = "Druid";
aryRepCls["hu"] = "Hunter";
aryRepCls["ma"] = "Mage";
aryRepCls["pa"] = "Pal";
aryRepCls["pr"] = "Priest";
aryRepCls["ro"] = "Rogue";
aryRepCls["sh"] = "Shaman";
aryRepCls["wl"] = "Lock";
aryRepCls["wr"] = "War";
var aryRepRlCls = new Array();
aryRepRlCls["dk"] = "Death Knight";
aryRepRlCls["dr"] = "Druid";
aryRepRlCls["hu"] = "Hunter";
aryRepRlCls["ma"] = "Mage";
aryRepRlCls["pa"] = "Paladin";
aryRepRlCls["pr"] = "Priest";
aryRepRlCls["ro"] = "Rogue";
aryRepRlCls["sh"] = "Shaman";
aryRepRlCls["wl"] = "Warlock";
aryRepRlCls["wr"] = "Warrior";

//---------------------------------------------------------------------
//関数名：initCondition
//入出力：なし
//戻り値：なし
//説明　：条件オブジェクトを初期化する
//作成日：2009.05.20 yuu
//---------------------------------------------------------------------
function initCondition(){
	aryCond["disp"] = 0;
	aryCond["ver"] = new Array();
	aryCond["type"] = new Array();
	aryCond["size"] = new Array();
	aryCond["result"] = new Array();
	aryCond["zone"] = new Array();
	aryCond["date"] = new Array();
	aryCond["enemy"] = new Array();
	aryCond["member"] = new Array();
}

//---------------------------------------------------------------------
//関数名：getCondition
//入出力：URLエンコードパラメータ
//戻り値：条件オブジェクト
//説明　：URLパラメータを受け取って絞り込み条件を取得する
//作成日：2008.11.4 yuu@ERO
//---------------------------------------------------------------------
function getCondition(strArg){

	var strWork = "";
	
	//表示件数取得
	aryCond["disp"] = getArgment(strArg, "n");
	
	//バージョン
	chkVerPre(aryCond["ver"], getArgment(strArg, "vs"), getArgment(strArg, "ve"));

	//アリーナサイズ
	strWork = getArgment(strArg, "ts");
	if(strWork) aryCond["size"] = strWork.match(/\d+/g);
	
	//アリーナタイプ
	strWork = getArgment(strArg, "at");
	if(strWork) aryCond["type"] = strWork.match(/\d+/g);
	
	//勝敗
	strWork = getArgment(strArg, "r");
	if(strWork) aryCond["result"] = strWork.match(/\d+/g);
	
	//ゾーン
	strWork = getArgment(strArg, "z");
	if(strWork) aryCond["zone"] = strWork.match(/\d+/g);
	
	//日付
	aryCond["date"][0] = getArgment(strArg, "df");
	aryCond["date"][1] = getArgment(strArg, "dt");
	
	//敵チーム
	strWork = getArgment(strArg, "ef");
	if(strWork)
		aryCond["enemy"] = strWork.match(/[a-z]+/g);
	else
		aryCond["enemy"] = new Array();
	
	//自チーム
	strWork = getArgment(strArg, "of");
	if(strWork)
		aryCond["member"] = getArgment(strArg, "of").match(/[a-z]+/g);
	else
		aryCond["member"] = new Array();
		
	return aryCond;
}

//---------------------------------------------------------------------
//関数名：getFilter
//入出力：条件オブジェクト
//        インデックス
//戻り値：真偽
//説明　：絞込条件による判定を行う
//作成日：2008.11.4 yuu@ERO
//---------------------------------------------------------------------
function getFilter(aryCond, numIdx){

	var strWork = "";
	var numA = 0;

	//アリーナサイズ
	for(numA = 0; numA < aryCond["size"].length; numA++){
		if(aryCond["size"][numA] == strData[numIdx][idxSize]){
			break;
		}
		if((numA + 1) == aryCond["size"].length){
			return false;
		}
	}
	
	//アリーナタイプ
	for(numA = 0; numA < aryCond["type"].length; numA++){
		if(aryCond["type"][numA] == strData[numIdx][idxType]){
			break;
		}
		if((numA + 1) == aryCond["type"].length){
			return false;
		}
	}
	
	//勝敗
	for(numA = 0; numA < aryCond["result"].length; numA++){
		if(aryCond["result"][numA] == strData[numIdx][idxResult]){
			break;
		}
		if((numA + 1) == aryCond["result"].length){
			return false;
		}
	}
	
	//ゾーン
	for(numA = 0; numA < aryCond["zone"].length; numA++){
		if(aryRepZone2[aryCond["zone"][numA]] == strData[numIdx][idxZone]){
			break;
		}
		if((numA + 1) == aryCond["zone"].length){
			return false;
		}
	}
	
	//敵チーム構成
	//検索条件取得
	strWork = concatArrayExp(aryCond["enemy"]);
	if(strWork != ""){
		regExp = new RegExp(strWork);
		//検索条件とログの、クラス名連結キーを比較する
		if(concatArray(aryEnemyLog).match(regExp) == null){
			return false;
		}
	}
	
	//自チーム構成
	//検索条件取得
	strWork = concatArrayExp(aryCond["member"]);
	if(strWork != ""){
		regExp = new RegExp(strWork);
		//検索条件とログの、クラス名連結キーを比較する
		if(concatArray(aryMemberLog).match(regExp) == null){
			return false;
		}
	}
	
	//WoW Version
	if(chkVersion(strData[numIdx][idxVersion] + "", aryCond["ver"]) == false){
		return false;
	}
	
	//日付
	strWork = (strData[numIdx][idxDate] + "").substr(0, 8);
	if(aryCond["date"][0] > strWork || strWork > aryCond["date"][1]){
		return false;
	}
	
	return true;
}

//---------------------------------------------------------------------
//関数名：concatArrayExp
//入出力：配列
//戻り値：連結された文字列
//説明　：
//作成日：2008.11.4 yuu@ERO
//---------------------------------------------------------------------
function concatArrayExp(arySrc){

	var strWork = "";
	var numA = 0;

	for(numA=0; numA<arySrc.length; numA++){
		strWork = strWork + arySrc[numA] + "([a-z]{2})?";
	}
	if(strWork != ""){
		strWork = "([a-z]{2})?" + strWork;
	}

	return strWork;
}

//---------------------------------------------------------------------
//関数名：concatArray
//入出力：配列
//戻り値：連結された文字列
//説明　：
//作成日：2008.11.4 yuu@ERO
//---------------------------------------------------------------------
function concatArray(arySrc){

	var strWork = "";
	var numA = 0;
	
	for(numA=0; numA<arySrc.length; numA++){
		strWork = strWork + arySrc[numA];
	}
	
	return strWork;
}

//---------------------------------------------------------------------
//関数名：chkVersion
//入出力：
//戻り値：真偽
//説明　：
//作成日：2008.11.6 yuu@ERO
//---------------------------------------------------------------------
function chkVersion(strSrc, aryVer){
	
	var idx = 0;
	arySrc = strSrc.match(/\d+/g);
	
	if(aryVer[0].length < arySrc.length){
		for(idx=0; idx<arySrc.length - aryVer[0].length; idx++){
			aryVer[0][arySrc.length - (1 + idx)] = 0;
			aryVer[1][arySrc.length - (1 + idx)] = 0;
		}
	}
	else if(aryVer[0].length > arySrc.length){
		for(idx=0; idx<aryVer[0].length - arySrc.length; idx++){
			arySrc[aryVer[0].length - (1 + idx)] = 0;
		}
	}
	
	//チェックする（From）
	for(idx=0; idx<aryVer[0].length; idx++){
		if(aryVer[0][idx] > arySrc[idx]){
			return false;
		}
		else if(aryVer[0][idx] < arySrc[idx]){
			break;
		}
	}
	//チェックする（To）
	for(idx=0; idx<aryVer[1].length; idx++){
		if(aryVer[1][idx] < arySrc[idx]){
			return false;
		}
		else if(aryVer[1][idx] > arySrc[idx]){
			break;
		}
	}
}

//---------------------------------------------------------------------
//関数名：chkVerPre
//入出力：O:バージョンを、ピリオドで分割して格納した配列
//戻り値：
//説明　：配列の長さを揃える。以降のチェック処理にて使用する。
//作成日：2008.11.6 yuu@ERO
//---------------------------------------------------------------------
function chkVerPre(aryCond, strFr, strTo){
	
	var idx = 0;
	var numLenFr;
	var numLenTo;
	aryFr = strFr.match(/\d+/g);
	aryTo = strTo.match(/\d+/g);
	
	//引数をチェックする
	if(aryTo == null){
		//大きい数字を仮にいれるが、Versionが999を超えるとバグになります。
		aryTo = new Array(999,0,0);
	}
	if(aryFr == null){
		aryFr = new Array(0,0,0);
	}
	
	//配列の長さを合わせる
	numLenFr = aryFr.length;
	numLenTo = aryTo.length;
	if(numLenFr < aryTo.length){
		for(idx=0; idx<numLenTo - numLenFr; idx++){
			aryFr[numLenTo - (idx + 1)] = 0;
		}
	}
	else if(numLenFr > numLenTo){
		for(idx=0; idx<numLenFr - numLenTo; idx++){
			aryTo[numLenFr - (idx + 1)] = 0;
		}
	}
	
	aryCond[0] = aryFr;
	aryCond[1] = aryTo;
}

//---------------------------------------------------------------------
//関数名：getArgment
//入出力：
//戻り値：
//説明　：パラメータを取得する
//作成日：2008.11.6 yuu@ERO
//---------------------------------------------------------------------
function getArgment(strSrc, strPrm){

	//パラメータの開始位置を取得する
	var numPos = strSrc.indexOf(strPrm + "=");
	if(numPos > 0){
		numPos = numPos + strPrm.length + 1;
		
		//パラメータの終了位置を取得する
		var numEnd = strSrc.indexOf("&", numPos);
		
		return strSrc.substring(numPos, numEnd);
	}
	return;
}

//---------------------------------------------------------------------
//関数名：getPad
//入出力：strSrc=元の文字列、valToken=左埋めしたい値、numSize=文字列の長さ
//説明　：左埋め
//---------------------------------------------------------------------
function getLpad(strSrc, valToken, numSize){
	return new Array(numSize - strSrc.length + 1).join(valToken) + strSrc;
}

//---------------------------------------------------------------------
//関数名：IsArray
//説明　：配列か判断する
//---------------------------------------------------------------------
function IsArray(array) {
	return !!(array && array.constructor &&
		array.constructor.toString().indexOf(" Array(") >= 0);
}

function getTrim(strSrc){
	return strSrc.replace(/^\s+|\s+$/g, '');
}

//---------------------------------------------------------------------
//関数名：getMinSec
//入出力：
//説明　：
//---------------------------------------------------------------------
function getMinSec(numSec){
	var strReturn = "";
	var numWork;
	
	numWork = Math.floor(numSec / 60);
	if(numWork > 0){
		strReturn = numWork + "m ";
	}
	
	return strReturn + (numSec % 60) + "s";
}

//---------------------------------------------------------------------
//関数名：test
//説明　：テスト用
//---------------------------------------------------------------------
function test(arg1){
	window.alert("test[" + arg1 + "]");
}

