/* ---------------------------------------------------------------- **
   JavaScript for Mabinogi Simulator
   
** ---------------------------------------------------------------- */

var nowap = 0;
var lflg = 0;
var rev = "S2";
var codeIdx = '?';
var mssUrl = "http://www.kuroshin.net";

BaAry = new Array();


function calc(){
	// フォーム読み込み
	InputForm();
	// スキル処理
	ProcessSkill();
	// ボーナス関連値
	BonusTitle();
	BonusEnchant();
	BonusPet();
	BonusMusic();
	BonusFood();
	BonusArrow(); // 矢の処理
	BonusParaDark(); // パラディン・ダークナイト
	// ステータス処理
	ProcessStatus();
	
	// 表示更新
	TitleExp();
	ArrowExp();
	PetExp();
	FoodExp();
	EnchantNameV();	// エンチャントのみ特別
	
	// 戦闘力計算
	ProcessCombatPower();
	
	// AP還元クエ
	APBack();
	
	// 転生計算
	tenseiCalc();
	
}


// フォームデータを読み込む
function InputForm() {
	
	ST_SW = new Array();
	
	// 種族
	CharaType = eval(document.sys_form.chartype.value);
	
	// スキル
	Rank_Attack        = eval(document.sk_form.comb.value);		// アタック
	Rank_Critical      = eval(document.sk_form.cri.value);		// クリティカル
	Rank_Smash         = eval(document.sk_form.sma.value);		// スマッシュ
	Rank_Defense       = eval(document.sk_form.def.value);		// ディフェンス
	Rank_Counter       = eval(document.sk_form.cntatk.value);	// カウンター
	Rank_Windmill      = eval(document.sk_form.wml.value);		// ウィンドミル
	Rank_RangeAttack   = eval(document.sk_form.rcomb.value);	// レンジアタック
	Rank_MagnumShot    = eval(document.sk_form.mag.value);		// マグナムショット
	Rank_ArrowRevolver = eval(document.sk_form.arrow.value);	// アローリボルバー
	Rank_SupportShot   = eval(document.sk_form.spshot.value);	// サポートショット
	Rank_IceBolt       = eval(document.sk_form.ibol.value);		// アイスボルト
	Rank_FireBolt      = eval(document.sk_form.fbol.value);		// ファイアボルト
	Rank_LightingBolt  = eval(document.sk_form.lbol.value);		// ライトニングボルト
	Rank_FireBall      = eval(document.sk_form.fbll.value);		// ファイアボール
	Rank_Thunder       = eval(document.sk_form.thndr.value);	// サンダー
	Rank_MagicMastery  = eval(document.sk_form.magmas.value);	// マジックマスタリ
	Rank_Healing       = eval(document.sk_form.heal.value);		// ヒーリング
	Rank_PartyHealing  = eval(document.sk_form.ptheal.value);	// パーティヒーリング
	Rank_Enchant       = eval(document.sk_form.enc.value);		// エンチャント
	Rank_Meditation    = eval(document.sk_form.med.value);		// メディテーション
	Rank_Rest          = eval(document.sk_form.rest.value);		// 休憩
	Rank_CampFire      = eval(document.sk_form.camp.value);		// キャンプファイア
	Rank_FirstAid      = eval(document.sk_form.fstaid.value);	// 応急治療
	Rank_Herbalism     = eval(document.sk_form.harb.value);		// 薬草学
	Rank_MakingMastery = eval(document.sk_form.makmas.value);	// メイキングマスタリ
	Rank_Weaving       = eval(document.sk_form.weav.value);		// 紡織
	Rank_Tailoring     = eval(document.sk_form.tailor.value);	// 裁縫
	Rank_Blacksmith    = eval(document.sk_form.smith.value);	// 鍛冶
	Rank_Refine        = eval(document.sk_form.refin.value);	// 製錬
	Rank_Cooking       = eval(document.sk_form.cook.value);		// 料理
	Rank_PotionMaking  = eval(document.sk_form.pot.value);		// ポーション調合
	Rank_Fishing       = eval(document.sk_form.fish.value);		// 釣り
	Rank_HandiCraft    = eval(document.sk_form.hcrft.value);	// ハンディクラフト
	Rank_MusicalKnow   = eval(document.sk_form.msckw.value);	// 音楽知識
	Rank_PlayingInst   = eval(document.sk_form.plyins.value);	// 楽器演奏
	Rank_Compose       = eval(document.sk_form.cmpse.value);	// 作曲
	Rank_SharpMind     = eval(document.sk_form.srpmid.value);	// シャープマインド
	Rank_IceSpear      = eval(document.sk_form.icespr.value);	// アイススピア
	Rank_FinalHit      = eval(document.sk_form.finhit.value);	// ファイナルヒット（インフィニットスラッシュ）
	Rank_MirageMissile = eval(document.sk_form.mrgmsl.value);	// ミラージュミサイル
/*  未実装（てか実装されるんかねぇ）
	Rank_ChainGun      = eval(document.sk_form.cngun.value);	// チェーンガン
	Rank_FullSwing     = eval(document.sk_form.flswng.value);	// フルスイング
	Rank_FinalSmash    = eval(document.sk_form.finsma.value);	// ファイナルスマッシュ
	Rank_FuryOfBard    = eval(document.sk_form.fryobd.value);	// フューリーオブバード
*/

	// 特殊系スキル
	Rank_SpiritOfOrder        = eval(document.sk_form.spoo.value);	// スピリットオブオーダー
	Rank_PowerOfOrder         = eval(document.sk_form.poo.value);	// パワーオブオーダー
	Rank_SwordOfOrder         = eval(document.sk_form.swoo.value);	// ソードオブオーダー
	Rank_EyeOfOrder           = eval(document.sk_form.eoo.value);	// アイオブオーダー
	Rank_PaladinHeavyStander  = eval(document.sk_form.phs.value);	// パラディンヘビースタンダー
	Rank_PaladinNaturalShield = eval(document.sk_form.pns.value);	// パラディンナチュラルシールド
	Rank_PaladinManaRefractor = eval(document.sk_form.pmr.value);	// パラディンマナリフレクター
	
	Rank_SoulOfChaos          = eval(document.sk_form.soc.value);	// ソウルオブカオス
	Rank_BodyOfChaos          = eval(document.sk_form.booc.value);	// ボディーオブカオス
	Rank_HandsOfChaos         = eval(document.sk_form.hoc.value);	// ハンズオブカオス
	Rank_BrainOfChaos         = eval(document.sk_form.broc.value);	// ブレインオブカオス
	Rank_DarkHeavyStander     = eval(document.sk_form.dhs.value);	// ダークヘビースタンダー
	Rank_DarkNaturalShield    = eval(document.sk_form.dns.value);	// ダークナチュラルシールド
	Rank_DarkManaRefractor    = eval(document.sk_form.dmr.value);	// ダークマナリフレクター
	Rank_ControlOfDarkness    = eval(document.sk_form.cod.value);	// コントロールオブダークネス


	// ステータス系？
	Title = eval(document.st_form.Title.value);		// タイトル
	
	bAge  = eval(document.st_form.bage.value);		// 転生年齢（スタート年齢）
	nAge  = eval(document.st_form.nage.value);		// 現在年齢
	Lv    = eval(document.st_form.lv.value);		// レベル
	eLv   = eval(document.st_form.elv.value);		// 探検レベル

	// ステータス誤差修正値
	PmLife    = eval(document.st_form.pmlife.value);
	PmMana    = eval(document.st_form.pmmana.value);
	PmStamina = eval(document.st_form.pmstamina.value);
	PmStr     = eval(document.st_form.pmstr.value);
	PmInt     = eval(document.st_form.pmint.value);
	PmDex     = eval(document.st_form.pmdex.value);
	PmWill    = eval(document.st_form.pmwill.value);
	PmLuck    = eval(document.st_form.pmluck.value);
	
	// 状態
	for(var i = 0; i < document.st_form.condi.length; i++){
		if(document.st_form.condi[i].checked) ST_SW[i] = 1; else ST_SW[i] = 0;
	}
	
	// 装備品
	// 防御、保護
	EQ_Acs1Df = eval(document.st_form.eq_acs1_def.value);
	EQ_Acs1Pr = eval(document.st_form.eq_acs1_prot.value);
	EQ_HeadDf = eval(document.st_form.eq_head_def.value);
	EQ_HeadPr = eval(document.st_form.eq_head_prot.value);
	EQ_Acs2Df = eval(document.st_form.eq_acs2_def.value);
	EQ_Acs2Pr = eval(document.st_form.eq_acs2_prot.value);
	EQ_BodyDf = eval(document.st_form.eq_body_def.value);
	EQ_BodyPr = eval(document.st_form.eq_body_prot.value);
	EQ_ArmDf  = eval(document.st_form.eq_arm_def.value);
	EQ_ArmPr  = eval(document.st_form.eq_arm_prot.value);
	EQ_LegDf  = eval(document.st_form.eq_leg_def.value);
	EQ_LegPr  = eval(document.st_form.eq_leg_prot.value);
	EQ_RobeDf = eval(document.st_form.eq_robe_def.value);
	EQ_RobePr = eval(document.st_form.eq_robe_prot.value);
	EQ_LhDf   = eval(document.st_form.eq_lh_def.value);
	EQ_LhPr   = eval(document.st_form.eq_lh_prot.value);
	// 武器
	EQ_RhMinAtk = eval(document.st_form.eq_rh_minatk.value);
	EQ_RhMaxAtk = eval(document.st_form.eq_rh_maxatk.value);
	EQ_RhMinInj = eval(document.st_form.eq_rh_mininju.value);
	EQ_RhMaxInj = eval(document.st_form.eq_rh_maxinju.value);
	EQ_RhCri    = eval(document.st_form.eq_rh_cri.value);
	EQ_RhBala   = eval(document.st_form.eq_rh_bala.value);
	EQ_LhMinAtk = eval(document.st_form.eq_lh_minatk.value);
	EQ_LhMaxAtk = eval(document.st_form.eq_lh_maxatk.value);
	EQ_LhMinInj = eval(document.st_form.eq_lh_mininju.value);
	EQ_LhMaxInj = eval(document.st_form.eq_lh_maxinju.value);
	EQ_LhCri    = eval(document.st_form.eq_lh_cri.value);
	EQ_LhBala   = eval(document.st_form.eq_lh_bala.value);
	// 矢
	EQ_Arrow = eval(document.st_form.eq_arrow.value);
	
	// エンチャ
	En_Acs1Pre  = eval(document.st_form.e_acs1p.value);
	En_Acs1Suf  = eval(document.st_form.e_acs1s.value);
	En_HeadPre  = eval(document.st_form.e_headp.value);
	En_HeadSuf  = eval(document.st_form.e_heads.value);
	En_Acs2Pre  = eval(document.st_form.e_acs2p.value);
	En_Acs2Suf  = eval(document.st_form.e_acs2s.value);
	En_RHandPre = eval(document.st_form.e_rhandp.value);
	En_RHandSuf = eval(document.st_form.e_rhands.value);
	En_BodyPre  = eval(document.st_form.e_bodyp.value);
	En_BodySuf  = eval(document.st_form.e_bodys.value);
	En_LHandPre = eval(document.st_form.e_lhandp.value);
	En_LHandSuf = eval(document.st_form.e_lhands.value);
	En_ArmPre   = eval(document.st_form.e_armp.value);
	En_ArmSuf   = eval(document.st_form.e_arms.value);
	En_LegPre   = eval(document.st_form.e_legp.value);
	En_LegSuf   = eval(document.st_form.e_legs.value);
	
	// 魔法音楽
	BfMscT = eval(document.st_form.bf_music_t.value); // 種類
	BfMscV = eval(document.st_form.bf_music_v.value); // 値
	
	// ペット
	Pet = eval(document.st_form.pet.value);
	
	// 料理
	Food = eval(document.st_form.food.value);
	
	
}


function tenseiCalc(){ 		// 転生計算機 ------------------------------------
	
	var tmp = tmp2 = tmp3 = tmp4 = 0;
	
	var tagea   = eval(document.sk_form.tage.value) - 10;
	var tlvaa   = eval(document.sk_form.tlva.value);
	var twkaa   = eval(document.sk_form.twka.value);
	var tplusaa = eval(document.sk_form.tplusa.value);		// 残りＡＰ
	var apbp    = eval(document.sk_form.apbpa.value);		// ＡＰ還元クエ
	var tqa     = eval(document.sk_form.tqa.value) - 1;		// 探検レベル
	var nwagea  = eval(document.sk_form.nwage.value);		// 現在の年齢
	var tolva   = eval(document.sk_form.tolv.value);		// レベルをあといくつあげるか
	var tolvta  = eval(document.sk_form.tolvt.value);		// 探検レベルをあといくつあげるか
	var toagea  = eval(document.sk_form.toage.value);		// あと何回加齢するか
	
	// 現在値
	var aall  = eval(document.sk_form.aall.value);
	var nowap = eval(document.sk_form.nowapa.value);
	
	// 次の転生までに稼ぐＡＰ
	var torba = tolva + tolvta;
	
	// 全必要ポイントから現在値として保存したポイントを引く
	tmp = aall - nowap;
	document.sk_form.tapa.value = tmp;		// 差分表示
	
	if(tmp>=0){
		// 次回の転生までに稼げるＡＰは先に引いておく
		if((tmp-tplusaa)>0)	tmp -= tplusaa;	else tmp = 0;
		if((tmp-apbp)>0)	tmp -= apbp;	else tmp = 0;
		if((tmp-tolva)>0)	tmp -= tolva;	else tmp = 0;
		if((tmp-tolvta)>0)	tmp -= tolvta;	else tmp = 0;
		
		// 年齢加齢ＡＰを引く（面倒なことになったな…）
		// 11-12:5 , 13-14:4 , 15-16:3 , 17-21:2 , 22-25:1 , 26-:0
		for( var i = 0; i < toagea; i++) {
			nwagea += 1;
			if (nwagea == 11 || nwagea == 12) {
				tmp2 += 5;
			} else if (nwagea == 13 || nwagea == 14) {
				tmp2 += 4;
			} else if (nwagea == 15 || nwagea == 16) {
				tmp2 += 3;
			} else if (nwagea >= 17 && nwagea <= 21) {
				tmp2 += 2;
			} else if (nwagea >= 22 && nwagea <= 25) {
				tmp2 += 1;
			}
		}
		// 加齢による追加ＡＰを引く
		if((tmp-tmp2)>0)	tmp -= tmp2;	else tmp = 0;
		// 次の転生までに稼ぐＡＰ（計算と出力）
		torba += tmp2;
		document.sk_form.torb.value = torba;
		
		
		// 毎回の転生計算
		tmp2 = tlvaa - 1;	// 毎回入手AP（まずはレベルＵＰ分）
		tmp2 += tqa;		// 探検レベル分

		// 年齢別加齢ＡＰ取得
		// 11-12:5 , 13-14:4 , 15-16:3 , 17-21:2 , 22-25:1 , 26-:0
		while(twkaa > 0) {
			tagea = tagea + 1;
			if (tagea == 1 || tagea == 2) {
				tmp2 = tmp2 + 5;
			} else if (tagea == 3 || tagea == 4) {
				tmp2 = tmp2 + 4;
			} else if (tagea == 5 || tagea == 6) {
				tmp2 = tmp2 + 3;
			} else if (tagea >= 7 && tagea <= 11) {
				tmp2 = tmp2 + 2;
			} else if (tagea >= 12 && tagea <= 15) {
				tmp2 = tmp2 + 1;
			}
			// １加齢分計算終了
			twkaa = twkaa - 1;
		}
		
		// 必要転生回数計算
		tmp3 = tmp % tmp2;
		//	alert('tmp2='+tmp2+' : tmp3='+tmp3);
		if(tmp3 != 0) {
			if(tmp2>tmp) {
				tmp4 = 0;
			} else {
				tmp4 = (tmp - tmp3) / tmp2;	// 必要転生回数（+1は必要ないか・・・）転生ｎ回とLv.ｍは計算しない
			}
		} else {
			tmp4 = tmp / tmp2;
		}
		document.sk_form.tta.value  = tmp4;
		document.sk_form.ttaa.value = tmp3;
		document.sk_form.tgts.value = tmp2;
	} else {
		// document.sk_form.tapa.value = 0;	// アントレイン分はマイナス表示ということで
		document.sk_form.tta.value  = 0;
		document.sk_form.ttaa.value = 0;
	}
	
	if (document.sk_form.ttaa.value < 0) document.sk_form.ttaa.value = 0;
	
}

function APBack(){
	var apbp = 0;
	// AP還元クエ分
	for(i = 0; i < document.sk_form.apb.length; i++){
		if(document.sk_form.apb[i].checked){
			apbp += eval(document.sk_form.apb[i].value);
		}
	}
	document.sk_form.apbpa.value = apbp;
}

// システム
function datsv(){
	// セーブ

	skary = new Array();	// 処理用配列宣言
	var ckstr;
	var cn;

	cn = eval(document.sys_form.charno.value);
	
	if(window.confirm("Data Slot "+cn+" will be saved.\nIs this OK？")){
		
		skary = GetData(0);
		
		// AP還元クエのチェック状態は保存しない
		// ステータスの「状態」は保存しない
		
		// エスケープ
		ckstr = "";
		ckstr = "%00" + escape(skary[0]);
		for(i = 1; i < skary.length; i++){
			ckstr += "%00" + escape(skary[i]);
		}
		
		// キャラクタ名を保存する
		CharaName = document.sys_form.charName.value;
		// 名前のチェック
		CharName = CharaName.replace(/%/ig,"");
		if(CharaName.length == 0) CharName = "Character";
		SlotData = escape(CharName);
		
		// 種族
		CharaType = eval(document.sys_form.chartype.value);
		
		times=new Date();
		// 1000日保存する
		times.setTime(times.getTime()+1000*60*60*24*1000);
		
		// 保存
		document.cookie = "MABI_Sim:" + cn + "=" + ckstr + "<>" + SlotData + "<>" + CharaType + "<>" + "; expires=" + times.toGMTString();
		window.defaultStatus="Saved♪";
		
		RefreshName();

	}
}


function datld(){
	// ロード

	var ckstr;
	var char = -1;
	var cn;

	tckstr = new Array();
	cdata  = new Array();

	// 現在のスロット番号を退避
	cn = eval(document.sys_form.charno.value);

	//window.alert('cookie全体\n'+document.cookie);

//	cnc = cn + 1;
	
	if(window.confirm("Data Slot "+cn+" will be loaded.\nIs this OK？")){

		// フォーム内容をリセットしてからロードする
		document.sys_form.reset(); document.sk_form.reset(); document.st_form.reset();
		
		// クッキー読み込み
		tckstr = document.cookie.split("; ");
		//alert(tckstr[0]);

		if(document.cookie.length != 0){
			for(var i = 0; i < tckstr.length; i++){
				if(tckstr[i].indexOf("MABI_Sim:"+cn) != -1) char = i; // 有効クッキー数カウント
			}
		}
		if(char != -1){
			ctemp = tckstr[char].split(":");
			ctemp2 = ctemp[1].split("<>");
			ctemp3  = ctemp2[0].split("%00");	// スキル値のみ抽出
			
			for(i = 0;i < ctemp3.length - 1; i++) { // シフト
				cdata[i] = ctemp3[i + 1];
			}
			
			// 名前の反映
			document.sys_form.charName.value = unescape(ctemp2[1]);
			document.sys_form.chartype.value = ctemp2[2];
			// 種族処理
			CharaTypeS();
			
			// スキル反映
			stcalc(cdata,1);

		}
		
		lflg = 0;
		
		// 現在のスロット復元
		document.sys_form.charno.value = cn;
		
		window.defaultStatus="Loaded♪";
	}
}

function datdel(){
	// 削除
	var cn;

	cn = eval(document.sys_form.charno.value);
	
	if(window.confirm("Data Slot "+cn+" will be deleted.\nIs this OK？")){
	
		// 消去
		document.cookie = "MABI_Sim:" + cn + "=; expires=Thu,01-Jan-70 00:00:01 GMT";
		window.defaultStatus="Deleted";
		
		RefreshName();
	}

}


function RefreshName() { // キャラスロット名更新
	
	// 初期値
	sltData = new Array("no data","no data","no data","no data","no data","no data","no data","no data","no data");
	
	// 現在のスロット
	cn = eval(document.sys_form.charno.value);
	
	// クッキーロード
	tckstr = document.cookie.split("; ");
	//alert(tckstr[0]);
	tmpck = "";
	if(document.cookie.length != 0){
		for(j = 1; j <= 9; j++){
			for(var i = 0; i < tckstr.length; i++){
				if(tckstr[i].indexOf("MABI_Sim:"+j) != -1) {
					tmpck = tckstr[i];
					if(tmpck.indexOf("<>") != -1) {
						ctemp = tmpck.split("<>");
						sltData[j-1] = unescape(ctemp[1]);
						break;
					}
				}
			}
		}
	}
	
	// 反映
	for(j = 1; j <= 9; j++){
		document.sys_form.charno.options[j-1] = new Option(j+"："+sltData[j-1],j);
	}
	
	// 現在のスロット復元
	document.sys_form.charno.value = cn;
	
}

function stcalc(cdata,cflag) {

	skary = new Array();
	
	// アンエスケープしながら配列へ
	for(i = 0; i < cdata.length; i++){
		skary[i] = unescape(cdata[i]);
	}
	// alert(skary);
	// フォームへ反映 cflag = 0: スキルのみ、1: すべて
	PutData(skary,cflag);
	
	// 再計算
	calc();

}

function nowsv() {
	BaAry = GetData(1);
	// フラグ
	lflg = 1;
	// 基準値退避（転生計算機用）
	nowap = document.sk_form.aall.value;
	document.sk_form.nowapa.value = nowap;
	// 再計算
	calc();
	window.defaultStatus="CVR♪";
}

function dclr() {
	// 差分値クリア（転生計算機用）
	tapaa = nowap = 0;
	document.sk_form.tapa.value = tapaa;
	document.sk_form.nowapa.value = nowap;
	
	if(lflg) stcalc(BaAry,0);
	document.sk_form.tta.value = 0;
	document.sk_form.ttaa.value = 0;
}

// コード関連
function ENCode_skl(skc,rev) {

	var xskl = "";
	
	// 種族
	CharaType = eval(document.sys_form.chartype.value);

	for (i=0;i<skc.length;i++) {
		xskl += (skc[i]+10).toString(31).toUpperCase();
	}
	//	alert(xskl);
	// 圧縮
	while (xskl.match(/(\D)\1{8}/)) { xskl = xskl.replace(/(\D)\1{8}/,RegExp.$1+'9'); }
	while (xskl.match(/(\D)\1{7}/)) { xskl = xskl.replace(/(\D)\1{7}/,RegExp.$1+'8'); }
	while (xskl.match(/(\D)\1{6}/)) { xskl = xskl.replace(/(\D)\1{6}/,RegExp.$1+'7'); }
	while (xskl.match(/(\D)\1{5}/)) { xskl = xskl.replace(/(\D)\1{5}/,RegExp.$1+'6'); }
	while (xskl.match(/(\D)\1{4}/)) { xskl = xskl.replace(/(\D)\1{4}/,RegExp.$1+'5'); }
	while (xskl.match(/(\D)\1{3}/)) { xskl = xskl.replace(/(\D)\1{3}/,RegExp.$1+'4'); }
	while (xskl.match(/(\D)\1{2}/)) { xskl = xskl.replace(/(\D)\1{2}/,RegExp.$1+'3'); }
	while (xskl.match(/(\D)\1/))    { xskl = xskl.replace(/(\D)\1/,RegExp.$1+'2'); }

	xskl = rev + CharaType + "=" + xskl;
	
	//	alert(xskl);
	
	var mdcode = mssUrl + window.location.pathname + codeIdx + xskl;
	window.prompt("Copy the URL shown below。\nThis link saves your current skill information\n\n",mdcode);
	document.sys_form.sklcode.value = mdcode;

	// IEじゃないとクリップボードにコピーできん
	if (document.all) {	// IEの場合
		cb_obj = document.sys_form.sklcode.createTextRange();
		cb_obj.execCommand("copy");
	}
	
	window.defaultStatus="Code Generated♪";
	
	return xskl;
}

function DECode_skl(xskl,rev){
	var cdata = new Array();
	var chartype = 0;
	
	// コードチェック
	if(xskl.substring(0,2) != rev){
		alert("This code was formed in another version。\nPlease use this version's code。");
		for(i=0; i<60; i++) cdata[i] = 0;
		return cdata;
	}
	// 種族抽出
	chartype = xskl.substr(2,1);
	// alert(chartype);
	
	// フォーム内容をリセット
	document.sk_form.reset();
	
	// 種族セット
	document.sys_form.chartype.value = chartype;
	// 種族処理
	CharaTypeS();
	
	xskl = xskl.substring(xskl.indexOf("=")+1);

	//	alert(xskl);
	while (xskl.match(/(\D)([2-9])/)) {
		xskl = xskl.replace(/(\D)([2-9])/,DECode_skl_2(RegExp.$1,RegExp.$2))
	}
	
	for(i = 0;i < xskl.length; i++) {
		cdata[i] = "ABCDEFGHIJKLMNOPQRSTU".indexOf(xskl.charAt(i));
	}
	
	return cdata;
}

function DECode_skl_2(skl,skln) {
	//分解用
	skcode = skl;
	for (i = 1;i < skln; i++) { skcode += skl; }
	return skcode;
}

function createCode() {
	skl = new Array();
	
	skl = GetData(1);
	
	return ENCode_skl(skl,rev);
}

function LoadCode() {
	if ((!location.search)||(location.search=="?")) { return false; }
	xskl = location.search.substring(codeIdx.length);
	cdata = DECode_skl(xskl,rev);
	
	stcalc(cdata,0);
	
	window.defaultStatus="Code loaded from URL♪";
}


// フォームのスキル情報を取得する
function GetData(flag) {
	skary = new Array();
	
	skary[0]  = eval(document.sk_form.comb.value);		// アタック
	skary[1]  = eval(document.sk_form.cri.value);		// クリティカル
	skary[2]  = eval(document.sk_form.sma.value);		// スマッシュ
	skary[3]  = eval(document.sk_form.def.value);		// ディフェンス
	skary[4]  = eval(document.sk_form.cntatk.value);	// カウンター
	skary[5]  = eval(document.sk_form.wml.value);		// ウィンドミル
	skary[6]  = eval(document.sk_form.rcomb.value);		// レンジアタック
	skary[7]  = eval(document.sk_form.mag.value);		// マグナムショット
	skary[8]  = eval(document.sk_form.arrow.value);		// アローリボルバー
	skary[9]  = eval(document.sk_form.spshot.value);	// サポートショット
	skary[10] = eval(document.sk_form.ibol.value);		// アイスボルト
	skary[11] = eval(document.sk_form.fbol.value);		// ファイアボルト
	skary[12] = eval(document.sk_form.lbol.value);		// ライトニングボルト
	skary[13] = eval(document.sk_form.fbll.value);		// ファイアボール
	skary[14] = eval(document.sk_form.thndr.value);		// サンダー
	skary[15] = eval(document.sk_form.magmas.value);	// マジックマスタリ
	skary[16] = eval(document.sk_form.heal.value);		// ヒーリング
	skary[17] = eval(document.sk_form.ptheal.value);	// パーティヒーリング
	skary[18] = eval(document.sk_form.enc.value);		// エンチャント
	skary[19] = eval(document.sk_form.med.value);		// メディテーション
	skary[20] = eval(document.sk_form.rest.value);		// 休憩
	skary[21] = eval(document.sk_form.camp.value);		// キャンプファイア
	skary[22] = eval(document.sk_form.fstaid.value);	// 応急治療
	skary[23] = eval(document.sk_form.harb.value);		// 薬草学
	skary[24] = eval(document.sk_form.makmas.value);	// メイキングマスタリ
	skary[25] = eval(document.sk_form.weav.value);		// 紡織
	skary[26] = eval(document.sk_form.tailor.value);	// 裁縫
	skary[27] = eval(document.sk_form.smith.value);		// 鍛冶
	skary[28] = eval(document.sk_form.refin.value);		// 製錬
	skary[29] = eval(document.sk_form.cook.value);		// 料理
	skary[30] = eval(document.sk_form.pot.value);		// ポーション調合
	skary[31] = eval(document.sk_form.fish.value);		// 釣り
	skary[32] = eval(document.sk_form.hcrft.value);		// ハンディクラフト
	skary[33] = eval(document.sk_form.msckw.value);		// 音楽知識
	skary[34] = eval(document.sk_form.plyins.value);	// 楽器演奏
	skary[35] = eval(document.sk_form.cmpse.value);		// 作曲
	skary[36] = eval(document.sk_form.srpmid.value);	// シャープマインド
	skary[37] = eval(document.sk_form.icespr.value);	// アイススピア
	skary[38] = eval(document.sk_form.finhit.value);	// ファイナルヒット（インフィニットスラッシュ）
	skary[39] = eval(document.sk_form.mrgmsl.value);	// ミラージュミサイル
/*
	skary[40] = eval(document.sk_form.cngun.value);		// チェーンガン
	skary[41] = eval(document.sk_form.flswng.value);	// フルスイング
	skary[42] = eval(document.sk_form.finsma.value);	// ファイナルスマッシュ
	skary[43] = eval(document.sk_form.fryobd.value);	// フューリーオブバード
*/

	if(flag) return skary;		// スキル情報のみ入用の場合

	// ステータスなど
	skary[40]  = eval(document.st_form.Title.value);	// タイトル
	skary[41]  = eval(document.st_form.bage.value);		// 転生年齢（スタート年齢）
	skary[42]  = eval(document.st_form.nage.value);		// 現在年齢
	skary[43]  = eval(document.st_form.lv.value);		// レベル
	skary[44]  = eval(document.st_form.elv.value);		// 探検レベル
	skary[45]  = eval(document.st_form.pmlife.value);	// 以下、誤差修正値
	skary[46]  = eval(document.st_form.pmmana.value);
	skary[47]  = eval(document.st_form.pmstamina.value);
	skary[48]  = eval(document.st_form.pmstr.value);
	skary[49]  = eval(document.st_form.pmint.value);
	skary[50]  = eval(document.st_form.pmdex.value);
	skary[51]  = eval(document.st_form.pmwill.value);
	skary[52]  = eval(document.st_form.pmluck.value);
	skary[53]  = eval(document.st_form.eq_acs1_def.value);	// 以下、装備品
	skary[54]  = eval(document.st_form.eq_acs1_prot.value);
	skary[55]  = eval(document.st_form.eq_head_def.value);
	skary[56]  = eval(document.st_form.eq_head_prot.value);
	skary[57]  = eval(document.st_form.eq_acs2_def.value);
	skary[58]  = eval(document.st_form.eq_acs2_prot.value);
	skary[59]  = eval(document.st_form.eq_body_def.value);
	skary[60]  = eval(document.st_form.eq_body_prot.value);
	skary[61]  = eval(document.st_form.eq_arm_def.value);
	skary[62]  = eval(document.st_form.eq_arm_prot.value);
	skary[63]  = eval(document.st_form.eq_leg_def.value);
	skary[64]  = eval(document.st_form.eq_leg_prot.value);
	skary[65]  = eval(document.st_form.eq_robe_def.value);
	skary[66]  = eval(document.st_form.eq_robe_prot.value);
	skary[67]  = eval(document.st_form.eq_lh_def.value);
	skary[68]  = eval(document.st_form.eq_lh_prot.value);
	skary[69]  = eval(document.st_form.eq_rh_minatk.value);
	skary[70]  = eval(document.st_form.eq_rh_maxatk.value);
	skary[71]  = eval(document.st_form.eq_rh_mininju.value);
	skary[72]  = eval(document.st_form.eq_rh_maxinju.value);
	skary[73]  = eval(document.st_form.eq_rh_cri.value);
	skary[74]  = eval(document.st_form.eq_rh_bala.value);
	skary[75]  = eval(document.st_form.eq_lh_minatk.value);
	skary[76]  = eval(document.st_form.eq_lh_maxatk.value);
	skary[77]  = eval(document.st_form.eq_lh_mininju.value);
	skary[78]  = eval(document.st_form.eq_lh_maxinju.value);
	skary[79]  = eval(document.st_form.eq_lh_cri.value);
	skary[80]  = eval(document.st_form.eq_lh_bala.value);
	skary[81]  = eval(document.st_form.eq_arrow.value);		// 矢
	skary[82]  = eval(document.st_form.e_acs1p.value);		// エンチャ
	skary[83]  = eval(document.st_form.e_acs1s.value);
	skary[84]  = eval(document.st_form.e_headp.value);
	skary[85]  = eval(document.st_form.e_heads.value);
	skary[86]  = eval(document.st_form.e_acs2p.value);
	skary[87]  = eval(document.st_form.e_acs2s.value);
	skary[88]  = eval(document.st_form.e_rhandp.value);
	skary[89]  = eval(document.st_form.e_rhands.value);
	skary[90]  = eval(document.st_form.e_bodyp.value);
	skary[91]  = eval(document.st_form.e_bodys.value);
	skary[92]  = eval(document.st_form.e_lhandp.value);
	skary[93]  = eval(document.st_form.e_lhands.value);
	skary[94]  = eval(document.st_form.e_armp.value);
	skary[95]  = eval(document.st_form.e_arms.value);
	skary[96]  = eval(document.st_form.e_legp.value);
	skary[97]  = eval(document.st_form.e_legs.value);
	skary[98]  = eval(document.st_form.bf_music_t.value);	// 魔法音楽
	skary[99]  = eval(document.st_form.bf_music_v.value);
	skary[100] = eval(document.st_form.pet.value);			// ペット
	skary[101] = eval(document.st_form.food.value);			// 料理
	skary[102] = eval(document.cp_form.fixcpw.value); 		// 戦闘力修正値
	
	skary[103] = eval(document.sk_form.spoo.value);		// スピリットオブオーダー
	skary[104] = eval(document.sk_form.poo.value);		// パワーオブオーダー
	skary[105] = eval(document.sk_form.swoo.value);		// ソードオブオーダー
	skary[106] = eval(document.sk_form.eoo.value);		// アイオブオーダー
	skary[107] = eval(document.sk_form.phs.value);		// パラディンヘビースタンダー
	skary[108] = eval(document.sk_form.pns.value);		// パラディンナチュラルシールド
	skary[109] = eval(document.sk_form.pmr.value);		// パラディンマナリフレクター
	
	skary[110] = eval(document.sk_form.soc.value);		// ソウルオブカオス
	skary[111] = eval(document.sk_form.booc.value);		// ボディーオブカオス
	skary[112] = eval(document.sk_form.hoc.value);		// ハンズオブカオス
	skary[113] = eval(document.sk_form.broc.value);		// ブレインオブカオス
	skary[114] = eval(document.sk_form.dhs.value);		// ダークヘビースタンダー
	skary[115] = eval(document.sk_form.dns.value);		// ダークナチュラルシールド
	skary[116] = eval(document.sk_form.dmr.value);		// ダークマナリフレクター
	skary[117] = eval(document.sk_form.cod.value);		// コントロールオブダークネス
	
	return skary;

}

// フォームのスキル情報を更新する
function PutData(skary,flag) {
	
	document.sk_form.comb.value   = skary[0];  // アタック
	document.sk_form.cri.value    = skary[1];  // クリティカル
	document.sk_form.sma.value    = skary[2];  // スマッシュ
	document.sk_form.def.value    = skary[3];  // ディフェンス
	document.sk_form.cntatk.value = skary[4];  // カウンター
	document.sk_form.wml.value    = skary[5];  // ウィンドミル
	document.sk_form.rcomb.value  = skary[6];  // レンジアタック
	document.sk_form.mag.value    = skary[7];  // マグナムショット
	document.sk_form.arrow.value  = skary[8];  // アローリボルバー
	document.sk_form.spshot.value = skary[9];  // サポートショット
	document.sk_form.ibol.value   = skary[10]; // アイスボルト
	document.sk_form.fbol.value   = skary[11]; // ファイアボルト
	document.sk_form.lbol.value   = skary[12]; // ライトニングボルト
	document.sk_form.fbll.value   = skary[13]; // ファイアボール
	document.sk_form.thndr.value  = skary[14]; // サンダー
	document.sk_form.magmas.value = skary[15]; // マジックマスタリ
	document.sk_form.heal.value   = skary[16]; // ヒーリング
	document.sk_form.ptheal.value = skary[17]; // パーティヒーリング
	document.sk_form.enc.value    = skary[18]; // エンチャント
	document.sk_form.med.value    = skary[19]; // メディテーション
	document.sk_form.rest.value   = skary[20]; // 休憩
	document.sk_form.camp.value   = skary[21]; // キャンプファイア
	document.sk_form.fstaid.value = skary[22]; // 応急治療
	document.sk_form.harb.value   = skary[23]; // 薬草学
	document.sk_form.makmas.value = skary[24]; // メイキングマスタリ
	document.sk_form.weav.value   = skary[25]; // 紡織
	document.sk_form.tailor.value = skary[26]; // 裁縫
	document.sk_form.smith.value  = skary[27]; // 鍛冶
	document.sk_form.refin.value  = skary[28]; // 製錬
	document.sk_form.cook.value   = skary[29]; // 料理
	document.sk_form.pot.value    = skary[30]; // ポーション調合
	document.sk_form.fish.value   = skary[31]; // 釣り
	document.sk_form.hcrft.value  = skary[32]; // ハンディクラフト
	document.sk_form.msckw.value  = skary[33]; // 音楽知識
	document.sk_form.plyins.value = skary[34]; // 楽器演奏
	document.sk_form.cmpse.value  = skary[35]; // 作曲
	document.sk_form.srpmid.value = skary[36]; // シャープマインド
	document.sk_form.icespr.value = skary[37]; // アイススピア
	document.sk_form.finhit.value = skary[38]; // ファイナルヒット（インフィニットスラッシュ）
	document.sk_form.mrgmsl.value = skary[39]; // ミラージュミサイル
/*
	document.sk_form.cngun.value  = skary[40]; // チェーンガン
	document.sk_form.flswng.value = skary[41]; // フルスイング
	document.sk_form.finsma.value = skary[42]; // ファイナルスマッシュ
	document.sk_form.fryobd.value = skary[43]; // フューリーオブバード
*/

	if(flag){		// 完全反映の場合
		document.st_form.Title.value         = skary[40];	// タイトル
		document.st_form.bage.value          = skary[41];	// 転生年齢（スタート年齢）
		document.st_form.nage.value          = skary[42];	// 現在年齢
		document.st_form.lv.value            = skary[43];	// レベル
		document.st_form.elv.value           = skary[44];	// 探検レベル
		document.st_form.pmlife.value        = skary[45];	// 以下、誤差修正値
		document.st_form.pmmana.value        = skary[46];
		document.st_form.pmstamina.value     = skary[47];
		document.st_form.pmstr.value         = skary[48];
		document.st_form.pmint.value         = skary[49];
		document.st_form.pmdex.value         = skary[50];
		document.st_form.pmwill.value        = skary[51];
		document.st_form.pmluck.value        = skary[52];
		document.st_form.eq_acs1_def.value   = skary[53];	// 以下、装備品
		document.st_form.eq_acs1_prot.value  = skary[54];
		document.st_form.eq_head_def.value   = skary[55];
		document.st_form.eq_head_prot.value  = skary[56];
		document.st_form.eq_acs2_def.value   = skary[57];
		document.st_form.eq_acs2_prot.value  = skary[58];
		document.st_form.eq_body_def.value   = skary[59];
		document.st_form.eq_body_prot.value  = skary[60];
		document.st_form.eq_arm_def.value    = skary[61];
		document.st_form.eq_arm_prot.value   = skary[62];
		document.st_form.eq_leg_def.value    = skary[63];
		document.st_form.eq_leg_prot.value   = skary[64];
		document.st_form.eq_robe_def.value   = skary[65];
		document.st_form.eq_robe_prot.value  = skary[66];
		document.st_form.eq_lh_def.value     = skary[67];
		document.st_form.eq_lh_prot.value    = skary[68];
		document.st_form.eq_rh_minatk.value  = skary[69];
		document.st_form.eq_rh_maxatk.value  = skary[70];
		document.st_form.eq_rh_mininju.value = skary[71];
		document.st_form.eq_rh_maxinju.value = skary[72];
		document.st_form.eq_rh_cri.value     = skary[73];
		document.st_form.eq_rh_bala.value    = skary[74];
		document.st_form.eq_lh_minatk.value  = skary[75];
		document.st_form.eq_lh_maxatk.value  = skary[76];
		document.st_form.eq_lh_mininju.value = skary[77];
		document.st_form.eq_lh_maxinju.value = skary[78];
		document.st_form.eq_lh_cri.value     = skary[79];
		document.st_form.eq_lh_bala.value    = skary[80];
		document.st_form.eq_arrow.value      = skary[81];		// 矢
		document.st_form.e_acs1p.value       = skary[82];		// エンチャ
		document.st_form.e_acs1s.value       = skary[83];
		document.st_form.e_headp.value       = skary[84];
		document.st_form.e_heads.value       = skary[85];
		document.st_form.e_acs2p.value       = skary[86];
		document.st_form.e_acs2s.value       = skary[87];
		document.st_form.e_rhandp.value      = skary[88];
		document.st_form.e_rhands.value      = skary[89];
		document.st_form.e_bodyp.value       = skary[90];
		document.st_form.e_bodys.value       = skary[91];
		document.st_form.e_lhandp.value      = skary[92];
		document.st_form.e_lhands.value      = skary[93];
		document.st_form.e_armp.value        = skary[94];
		document.st_form.e_arms.value        = skary[95];
		document.st_form.e_legp.value        = skary[96];
		document.st_form.e_legs.value        = skary[97];
		document.st_form.bf_music_t.value    = skary[98];		// 魔法音楽
		document.st_form.bf_music_v.value    = skary[99];
		document.st_form.pet.value           = skary[100];		// ペット
		document.st_form.food.value          = skary[101];		// 料理
		document.cp_form.fixcpw.value        = skary[102]; 		// 戦闘力修正値
		
		document.sk_form.spoo.value = skary[103];	// スピリットオブオーダー
		document.sk_form.poo.value  = skary[104];	// パワーオブオーダー
		document.sk_form.swoo.value = skary[105];	// ソードオブオーダー
		document.sk_form.eoo.value  = skary[106];	// アイオブオーダー
		document.sk_form.phs.value  = skary[107];	// パラディンヘビースタンダー
		document.sk_form.pns.value  = skary[108];	// パラディンナチュラルシールド
		document.sk_form.pmr.value  = skary[109];	// パラディンマナリフレクター
		document.sk_form.soc.value  = skary[110];	// ソウルオブカオス
		document.sk_form.booc.value = skary[111];	// ボディーオブカオス
		document.sk_form.hoc.value  = skary[112];	// ハンズオブカオス
		document.sk_form.broc.value = skary[113];	// ブレインオブカオス
		document.sk_form.dhs.value  = skary[114];	// ダークヘビースタンダー
		document.sk_form.dns.value  = skary[115];	// ダークナチュラルシールド
		document.sk_form.dmr.value  = skary[116];	// ダークマナリフレクター
		document.sk_form.cod.value  = skary[117];	// コントロールオブダークネス
		
	}

}


function CharaTypeS(){
	
	var ov = new Array("GET","F","E","D","C","B","A","9","8","7","6","5","4","3","2","1");
	
	// 種族
	var CharaType = eval(document.sys_form.chartype.value);
	
	// 種族によるスキル習得の可能不可能を切り替える
	if (CharaType == 0) {	// 人間の時
		document.sk_form.mrgmsl.length = 1;		// ミラージュミサイル
		document.sk_form.mrgmsl.options[0] = new Option("---",0);
		document.sk_form.mrgmsl.selectedIndex = 0;
		/*
		document.sk_form.sma.length = 16;		// スマッシュ
		for(i = 0; i <= 15; i++) document.sk_form.sma.options[i] = new Option(ov[i],i);
		document.sk_form.sma.selectedIndex = 0;
		*/
		document.sk_form.finhit.length = 16;	// ファイナルヒット
		for(i = 0; i <= 15; i++) document.sk_form.finhit.options[i] = new Option(ov[i],i);
		document.sk_form.finhit.selectedIndex = 0;
		document.sk_form.arrow.length = 16;		// アローリボルバー
		for(i = 0; i <= 15; i++) document.sk_form.arrow.options[i] = new Option(ov[i],i);
		document.sk_form.arrow.selectedIndex = 0;
	} else {				// エルフの時
		document.sk_form.mrgmsl.length = 16;	// ミラージュミサイル
		for(i = 0; i <= 15; i++) document.sk_form.mrgmsl.options[i] = new Option(ov[i],i);
		document.sk_form.mrgmsl.selectedIndex = 0;
		/*
		document.sk_form.sma.length = 1;		// スマッシュ
		document.sk_form.sma.options[0] = new Option("不可",0);
		document.sk_form.sma.selectedIndex = 0;
		*/
		document.sk_form.finhit.length = 1;		// ファイナルヒット
		document.sk_form.finhit.options[0] = new Option("---",0);
		document.sk_form.finhit.selectedIndex = 0;
		document.sk_form.arrow.length = 1;		// アローリボルバー
		document.sk_form.arrow.options[0] = new Option("---",0);
		document.sk_form.arrow.selectedIndex = 0;
	}
	
	// 再計算
	calc();
}

function FormReset(flag){
	
	var ResetMsg = ["All Contents","Skills","Status"];
	
	if(window.confirm(ResetMsg[flag]+" will be reset.\nIs this OK？")){
		switch(flag){
			case 0: document.sys_form.reset(); document.sk_form.reset(); document.st_form.reset(); CharaTypeS(); break;
			case 1: document.sk_form.reset(); break;
			case 2: document.st_form.reset(); break;
		}
	}
	
	calc();

}

function ValueUD(FrmName,UDPoint){
	var CValue;
	//alert(FrmName);
	CValue = eval(document.st_form[FrmName].value);
	
	if(UDPoint !=0){
		CValue += UDPoint;
		if(CValue < 0) CValue = 0;
	} else {
		CValue = 0;
	}
	
	document.st_form[FrmName].value = CValue;
	
	calc();
}


