var g_skill=new Array("sk_parry","sk_thrust","sk_escape","sk_ambush","sk_brutal","sk_tireless","sk_wary","sk_carouse","sk_meditate");

var g_skillnum=new Array();
g_skillnum["parry"]=0;
g_skillnum["thrust"]=1;
g_skillnum["escape"]=2;
g_skillnum["ambush"]=3;
g_skillnum["brutal"]=4;
g_skillnum["tireless"]=5;
g_skillnum["wary"]=6;
g_skillnum["carouse"]=7;
g_skillnum["meditate"]=8;

var g_skfrac=new Array(.1,.1,-.5,-.5,.33,.25,.5,-.75,-.75);

var g_skillname=new Array("Parry","Thrust","Escape","Ambush","Brutality","Tirelessness","Wariness","Carouse","Meditate");

var g_skillletter=new Array("Pa","Th","Es","Am","Br","Ti","Wa","Ca","Me");

var g_skpts;

var g_popuplock=0;
var g_skillpopup=0;

var g_popup_selected=0;
var g_old_popup_selected=0;

var g_tempskill=new Array();
var g_tempavail=0;
var g_tempspent=0;
var g_tempskillspent=new Array();

var g_skilldesc=new Array("When you are hit in combat, your Defense is increased by "+(100*g_skfrac[0])+"%",
"Your Offense is increased by "+(100*g_skfrac[1])+"% if you hit",
"When you are running away, your opponent's chance of stopping you is "+(100*g_skfrac[2])+"%",
"In the first round of combat, your opponent's Defense is "+(100*g_skfrac[3])+"%",
"When you've both hit eachother in combat but your opponent does more damage, next round of combat, your Offense is increased by "+(100*g_skfrac[4])+"%",
"When they've hit you but you don't hit them, next round your Defense is increased by "+(100*g_skfrac[5])+"%",
"When you are attacked while camping or failing to run away, your (normally halved) Defense is increased by "+(100*g_skfrac[6])+"%",
"When you buy food and drinks that you could afford at full-price, you get "+(100*(1+g_skfrac[7]))+"% off the price",
"When you get Healing that you could afford at full-price, you get "+(100*(1+g_skfrac[7]))+"% off the Exp cost");

var g_boxtabcontent=new Array();

var g_boxtabname=new Array("Equipment","Skills");

var g_boxtabsel=0;

function boxtab(num,reset) {
 var cn;
 if (reset==undefined) { reset=0; }
 if (num-1 > g_boxtabname.length) { num=0; }
 else if (num < 0) { num=g_boxtabname.length-1; }
 g_boxtabsel=num;
 var tabcon;
 for (var i=0;i<g_boxtabname.length;i++) {
  if (document.getElementById('boxtabon'+i)) {
	tabcon='<a href="javascript:boxtab('+i+')">'+g_boxtabname[i]+'</a>';
	cn="off";	if (num==i) { cn="on"; tabcon=g_boxtabname[i]; }
	document.getElementById('boxtabon'+i).className="boxtab"+cn;
	document.getElementById('boxtabon'+i).innerHTML=tabcon;
  }
 }
 if (g_boxtabcontent[num]==undefined || reset) {
  g_boxtabcontent[num]=eval(g_boxtabname[num]+"tabcontent()");
 }
 document.getElementById('boxtabcontent').innerHTML=g_boxtabcontent[num];
}

function tabthrutabs() {
 g_boxtabsel++;
 if (g_boxtabsel>=g_boxtabname.length) { g_boxtabsel=0; }
 boxtab(g_boxtabsel);
}

////////////////	EQ tab

function Equipmenttabcontent() {
 var d='<div class="equipmenttab">';
 for (var i=0;i<g_eq.length;i++) {
  d+='<div class="divskillbox';
  if (i+1==g_eq.length) { d+='last'; }
  d+='">'+g_uwearing[i]+'</div>';
 }
 d+='</div>';
 return d;
}

function setEquipmenttabcontent() {
 g_boxtabcontent[0]=Equipmenttabcontent();
 if (g_boxtabsel==0) { document.getElementById('boxtabcontent').innerHTML=g_boxtabcontent[0]; }
}

////////////////	general

function showhide(id,sh) {
 var ao=new Array("none","block");
 if (document.getElementById(id)==undefined) { return; }
 if (sh==undefined) {
	if (document.getElementById(id).style==undefined || document.getElementById(id).style.display==undefined || document.getElementById(id).style.display=="none") { sh=1; }
	else { sh=0; }
 }
 document.getElementById(id).style.display=ao[sh];
}

///////////////	skills

function describeskill(i) {
 return g_skillname[i].toUpperCase()+"  ("+g_skillletter[i]+")\n\n"+g_skilldesc[i];
}

function Skillstabcontent() {
 //if (g_boxtabsel==1) {
  var d='';
  for (var i=0; i<g_skill.length; i++) {
   // show all the skills
	d+='<div class="divskillbox';
	if (i+1==g_skill.length) { d+='last'; }
	d+='"><a href="javascript:alert(describeskill(\''+i+'\'))">'+g_skillname[i]+'</a>:&nbsp;<span id="div'+g_skill[i]+'">'+getcur_u(g_skill[i])+'</span>%</div>';
  }
  return d + skp_spending_box() + betareset_box();
}


function nextpercost(p) {
 return 1+Math.floor(p/5);
}


function leveledupskilltab() {
 boxtab(1,1);
}

///////////////	skill mechanics


function skillmod(sk) {
 var num=g_skillnum[sk];
 if (num==undefined) { alert(sk+" is not a valid skill!"); return 0; }
 else {
  var mod=skilltest(sk);
  if (mod < 1) { return 0; }
  else {
	  var fb=Math.abs(g_skfrac[num]);
	  var nextfrac=.5*g_skfrac[num];
	  for (var i=1; i<mod; i++) {
		fb+=nextfrac;
		nextfrac*=.5*Math.abs(g_skfrac[num]);
	  }
	  return fb;
  }
 }
}

function skilltest(sk) {
 var skil=getcur_u("sk_"+sk);
 if (skil<1) { return 0; }
 var base=Math.floor(skil/100);
 var r=rollDie(100);
 if (r<=skil%100) { base++; }
 return base;
}

function unspent_skp() {
 var spent=skp_spent();
 var have=skp_by_lev();
 g_skpts=have-spent
 return g_skpts;
}

function betareset_box() {
 var br='<a href="javascript:;" onclick="beta_skill_reset()" style="color:#FFFFFF">RESET SKILLS TO 0?</a>';
 br = '<div style="position:absolute; right:25px; bottom:3px; background:#995522; padding:2px; font-weight:bold">'+br+'</div>';
 return br;
}

///////////////	display

function skillnotey(which,n,skmod,oldn) {
 if (g_skillsused[which+"_"+n]==undefined) { g_skillsused[which+"_"+n]=1; }
 else { g_skillsused[which+"_"+n]++; }
 g_skillsused["any"]=1;
 //alert(which+"_"+n+" = "+g_skillsused[which+"_"+n]);
 if (which=="s") { return skillrollnote(n,skmod,oldn); }
 else { return monpownote(n,skmod,oldn); }
}


function skillrollnote(n,skmod,oldn) {
 return "<span class=\"skillnote\"><a alt=\""+g_skillname[n]+"\" title=\""+g_skillname[n]+"\" href=\"javascript:alert('"+g_skillname[n]+"\\n"+g_skilldesc[n].replace(/'/g,"\\'")+"\\n\\nskill bonus: "+displayanum(oldn,1)+" x "+skmod+" = "+displayanum(oldn*skmod,1)+"')\">["+g_skillletter[n]+"]</a></span>";
}


function skp_spending_box() {
 var extra=unspent_skp(); 
 var msg=extra+" unspent <span style=\"color:#FF0000\">s</span>kill points";
 if (extra>0) {
  msg='<a href="javascript:;" onclick="skillspendingbox()" style="color:#ffffff;">'+msg+'</a>'
 }
 return '<div class="skp_spending" id="skp_spending">'+msg+'</div>';
}


function skillspendingbox() {
 if (g_skpts==undefined) { unspent_skp(); }
 if (g_skpts<1) { return; }
 else if (g_combat) { return alert("You can't spend Skill Points during combat!"); }
 else if (g_gameover) { return alert("You can't spend Skill Points while dead!"); }
 else {
  boxtab(1);
  lockdown_popup(1,"Skills");
 }
}


//////////////////	points

function beta_skill_reset() {
 if (confirm("Are you SURE you want to reset all spent skills to 0?\nYou'll be able to re-spend them on other skills.\n\n(this is only available in the Beta-Test)")) {
  for (var i=0; i<g_skill.length; i++) {
   setcur_u(g_skill[i],0);
  }
  // reset the display
  boxtab(1,1);
 }
}

function skp_by_lev(lev) {
 if (lev==undefined) { lev=getcur_u("level"); }
 lev--;
 // this would get you N = N + N-1 + N-2 ... + 1 + 0 
 //return Math.ceil(lev/2) * (lev+1-(lev%2));
 return costofskperc(lev);
}

function skp_spent() {
 var total=0;
 for (var i=0; i<g_skill.length; i++) {
  total+=costofskperc(getcur_u(g_skill[i]));
 }
 return total;
}

function costofskperc(p) {
 var bits=new Array();
 var levs=Math.floor(p/5);
 bits[0]=(p-(levs*5))*(levs+1);
 var oh=new Array();
 oh[0]=(levs+1-(levs%2));
 oh[1]=2.5*(levs-1+(levs%2))+2.5;
 bits[1]=oh[0]*oh[1];
 return parseInt(bits[0]+bits[1]);
}


//////////////////	bigpopup gui

function lockdown_popup(onoff,which,realclose) {
 if (!onoff && !realclose && !confirm("Are you sure you want to close the "+document.getElementById("bigpopuptitle").innerHTML+" box?\nAny "+document.getElementById("bigpopuptitle").innerHTML+" changes will not be stored!")) { return; }
 g_popuplock=onoff;
 g_nomove=onoff;
 if (onoff) {
	document.getElementById("bigpopuptitle").innerHTML=which;
 	document.getElementById("bigpopupin").innerHTML=bigpopup_content(which);
	g_popup_selected=0;
	highlight_selected(which);
 }
 var disy=new Array("none","block");
 document.getElementById("bigpopup").style.display=disy[onoff];
}

function bigpopup_content(which) {
 if (which=="Skills") { return buyskills_interface(); }
 else { return "????"; }
}

function highlight_selected(which,row,oldrow) {
 var unpassed=0;
 if (row==undefined) { row=g_popup_selected; unpassed=1; }
 if (oldrow==undefined) { oldrow=g_old_popup_selected; unpassed=1; }
 if (which=="Skills") {
  var ws=new Array("subskill","tempskill","addskill");
  var change=new Array("000000","0000FF");
  for (var i=0; i<ws.length; i++) {
	document.getElementById(ws[i]+oldrow).style.background="#"+change[0];
	document.getElementById(ws[i]+row).style.background="#"+change[1];
  }
 }
 if (unpassed) { g_old_popup_selected=g_popup_selected; }
}

/////////////	skills gui interface

function buyskills_interface() {
 g_tempskill=new Array();	g_tempavail=unspent_skp();	g_tempspent=0;
 g_tempskillspent=new Array();
 g_skillpopup=1;
 var t='<table border="1" cellspacing="0" cellpadding="1">';
 for (var i=0;i<g_skillname.length;i++) {
	t+='<tr><th><a href="javascript:alert(describeskill('+i+'));">'+g_skillname[i]+'</a></th>';
	g_tempskill[i]=0;
	t+='<th id="subskill'+i+'" style="text-align:left; color:#999999">'+skilldeltabutton(i,0)+'</th>';
	t+='<td id="tempskill'+i+'">'+(parseInt(g_tempskill[i])+parseInt(getcur_u(g_skill[i])))+'%</td>';
	t+='<th id="addskill'+i+'" style="text-align:left; color:#999999">'+skilldeltabutton(i,1)+'</th></tr>';
 }
 t+='</table><div style="font-weight:bold">Unspent Skill Points: <span id="unspentskp">'+g_tempavail+'</span>';
 t+='<div style="font-size:11px; font-weight:normal; margin:2px">Use the <a href="javascript:;" onclick="change_selected_skill(1)">\\/</a> & <a href="javascript:;" onclick="change_selected_skill(-1)">/\\</a> keys to change selected skill,<BR>and <a href="javascript:;" onclick="buy_selected_skill(0)">&lt;</a> & <a href="javascript:;" onclick="buy_selected_skill(1)">&gt;</a> keys to increase/decrease it</div>';
 t+='<a href="javascript:;" alt="reset skill changes" title="reset skill changes" onclick="reset_skill_changes()">R</a>eset? &mdash; <a href="javascript:;" onclick="commit_skill_changes()" alt="Commit skills" title="Commit skills">C</a>ommit Skill Changes</div>';
 return t;
}

function tempcostnext(sk,delta) {
 if (delta==undefined) { delta=0; }
 var p=parseInt(g_tempskill[sk])+parseInt(getcur_u(g_skill[sk]))+parseInt(delta);
 var c=nextpercost(p);
 if (c<1) { c=1; }
 return c;
}


function skilldeltabutton(sk,addsub) {
 var as=new Array("&lt;","&gt;");
 var asn=new Array("reduce","increase");
 var click=0;
 var cn;
 var but=as[addsub];
 if (!addsub && g_tempskill[sk]>0) { // minus
	click=1;
 }
 else if (addsub) {
	cn=tempcostnext(sk);
   if (g_tempavail >= cn) { // plus
	 click=1;
	}
 }
 if (click) {
	var costu=new Array(-1,0);
	if (cn==undefined) { cn=tempcostnext(sk,costu[addsub]); }
	but = '<a href="javascript:;" onclick="tempskillchange('+sk+','+addsub+');" alt="'+asn[addsub]+'" title="'+asn[addsub]+'">'+but+'</a> ['+cn+']';
 }
 return but;
}

function tempskillchange(sk,addsub) {
 var difu=new Array(-1,1);
 var costu=new Array(-1,0);
 var c=tempcostnext(sk,costu[addsub]);
 //var msg=g_tempavail;
 var change=(parseInt(c)*parseInt(difu[addsub]));
 if (g_tempskillspent[sk]==undefined) { g_tempskillspent[sk]=0; }
 // if they don't have enough points to cover it, return
 if ( (difu[addsub]>0 && g_tempavail<change) || (difu[addsub]<0 && g_tempskillspent[sk]<Math.abs(change)) ) { return; }
 //window.status="AVAIL: "+g_tempavail+"/TEMPSKILLSPENT: "+g_tempskillspent[sk]+"/CHANGE:"+change;
 g_tempavail=parseInt(g_tempavail)-change;
 g_tempspent=parseInt(g_tempspent)+change;
 g_tempskillspent[sk]=parseInt(g_tempskillspent[sk])+change;
 //msg+=" to "+g_tempavail+"\n"+g_tempskill[sk]+" to ";
 g_tempskill[sk]=parseInt(g_tempskill[sk])+parseInt(difu[addsub]);
 //msg+=g_tempskill[sk];
 //alert(msg);
 redoskillrows(sk);
}

function redoskillrows(thissk) {
 for (var sk=0;sk<g_skill.length;sk++) {
  document.getElementById('addskill'+sk).innerHTML=skilldeltabutton(sk,1);
  if (thissk==sk) {
	document.getElementById('tempskill'+sk).innerHTML=(parseInt(g_tempskill[sk])+parseInt(getcur_u(g_skill[sk])))+"%";
  }
  document.getElementById('subskill'+sk).innerHTML=skilldeltabutton(sk,0);
 }
 document.getElementById('unspentskp').innerHTML=g_tempavail+" (spent "+g_tempspent+")";
}

function reset_skill_changes(sure) {
 if (sure || confirm("Are you sure you want to undo the skill changes you've made?")) { lockdown_popup(1,"Skills"); }
}

function commit_skill_changes() {
 var avail=unspent_skp();
 if (parseInt(g_tempspent)+parseInt(g_tempavail)!=avail) {
	alert("ERROR! You've spent more points than you had! "+avail+"!="+g_tempspent+"+"+g_tempavail);
	reset_skill_changes(1);
 }
 else {
	for (var i=0;i<g_skill.length;i++) { //add the skill changes
	 if (g_tempskill[i]>0) { addcur_u(g_skill[i],g_tempskill[i]); }
	}
	// redo the skill tab
	boxtab(1,1);
	// mark the game as unsaved
	g_unsaved=2;
	// close this window
	lockdown_popup(0,0,1);
 }
}

function change_selected_skill(ud) {
 g_popup_selected+=ud;
 if (g_popup_selected<0) { g_popup_selected=g_skill.length-1; }
 else if (g_popup_selected>=g_skill.length) { g_popup_selected=0; }
 highlight_selected("Skills");
}

function buy_selected_skill(ud) {
 tempskillchange(g_popup_selected,ud); 
}



////////////////	monster powers

var g_monpow=new Array("str","fast","breath","shield","amb","pois","stun","thief","undead","track");

var g_monpownum=new Array();
g_monpownum["str"]=0;
g_monpownum["fast"]=1;
g_monpownum["breath"]=2;
g_monpownum["shield"]=3;
g_monpownum["amb"]=4;
g_monpownum["pois"]=5;
g_monpownum["stun"]=6;
g_monpownum["thief"]=7;
g_monpownum["undead"]=8;
g_monpownum["track"]=9;

var g_monpowfrac=new Array(.15,.15,.15,.15,.5, .03,.8,.5,.5,.5);

var g_monpowspecial=new Array("","","m","m","", "","","","","");
var g_monpowofdf=new Array("o","d","o","d","o",	"o","d","o","o","d")

var g_monpowmagicbreath=new Array("","Breathe _","Breathe Torrent of _","Breathe Cloud of Toxic _","Spit Boiling _");
var g_monpowmagicc=new Array("","FF0000","B0B077","C8FFC8","8080FF");

var g_monpowname=new Array("Strong","Fast","Magic Breath","Magic Shield","Ambush","Poison","Stun","Thief","Undead","Tracking");

var g_monpowletter=new Array("STR","FA","MB","MS","AM","PO","STN","TH","UN","TR");

var g_monpowails=new Array("pois","stun");

var g_monpowdesc=new Array("The monster's Offense is increased by "+(100*g_monpowfrac[0])+"%",
"The monster's Defense is increased by "+(100*g_monpowfrac[1])+"%",
"The monster's Offense is increased by "+(100*g_monpowfrac[2])+"%, but this may be increased or decreased based on your magic armor",
"The monster's Defense is increased by "+(100*g_monpowfrac[3])+"%, but this may be increased or decreased based on your magic weapons",
"In the first round of combat, you Defense is "+(100*g_monpowfrac[4]*-1)+"%",
"When the monster hits you, you are poisoned.  You take damage* each step you take or each time you camp until you pay gold or exp to be Cured in town.\n\n*: around "+(100*g_monpowfrac[5])+"% of the monster's hitpoints",
"When the monster hits you, you are stunned: you can't attack and only defend yourself at "+(100*g_monpowfrac[6])+"% next round (though you can't be stunned again while stunned)",
"When the monster hits you, it also takes some of your gold ("+(100*g_monpowfrac[7])+"% of the damage its attack did)",
"When the monster hits you, it also takes some of your exp ("+(100*g_monpowfrac[8])+"% of the damage its attack did)",
"The monster is "+(100*g_monpowfrac[9])+"% harder to run away from"
);


function describemonpow(i,m) {
 var pname=g_monpowname[i];
 if (g_monpowspecial[i]=="m" && m>0) {
	if (g_monpow[i]=="breath") {
	 pname=g_monpowmagicbreath[m];
	 pname=pname.replace("_",g_elementname[m]);
	}
	else { pname+=" of "+g_elementname[m]; }
 }
 return pname.toUpperCase()+"\n\n"+g_monpowdesc[i];
}


function show_stats_monpow(mp,idsuf) {
 var per='%';
 if (idsuf==undefined) { idsuf=""; }
 else { per=''; }
 var pow=mp.split("-");	s="";
 for (var i=0; i<pow.length; i++) {
  var thisp=pow[i].split("=");
  s+=' <span class="monpowspan"><a href="javascript:alert(describemonpow('+thisp[0];
  if (g_monpowspecial[thisp[0]]=="m") { s+=','+thisp[2]; }
  s+='));" style="color:#ff00ff">';
  s+='<img id="monpowpic_'+thisp[0]+idsuf+'" class="icon" style="border:0px';
  if (g_monpowspecial[thisp[0]]=="m") { s+='; background:#'+g_monpowmagicc[thisp[2]]; }
  s+='" alt="'+g_monpowname[thisp[0]]+'" title="'+g_monpowname[thisp[0]]+'">: ';
  s+=thisp[1]+per+'</a></span>';
  imgtogo('icon_mon_'+g_monpow[thisp[0]],'monpowpic_'+thisp[0]+idsuf);
 }
 return s;
}

////

function monpow_roll(pow) {
 if (g_monpownum[pow]==undefined) { alert("Undefined monpow_roll: "+pow); return 0; }
 var pnum=g_monpownum[pow];
 var per=getcur_enmonpow(pnum);
 if (per<1) { return 0; }
 var r=rollDie(100);
 if (r<=per) {
	var suc=g_monpowfrac[pnum];
	if (g_monpowspecial[pnum]=="m") {
	 suc*=monpow_vsmagic(pnum);
	}
	return suc;
 }
 else { return 0; }
}


function monpownote(n,skmod,oldn) {
 return "<span class=\"skillnote\"><a alt=\""+g_monpow[n]+"\" title=\""+g_monpow[n]+"\" href=\"javascript:alert('"+g_monpowname[n]+"\\n"+g_monpowdesc[n].replace(/'/g,"\\'")+"\\n\\nmonster power: "+displayanum(oldn,1)+" x "+skmod+" = "+displayanum(oldn*skmod,1)+"')\" style=\"color:#FF00FF\">["+g_monpowletter[n]+"]</a></span>";
}


function monpow_vsmagic(pnum) {
 var od=g_monpowofdf[pnum];
 var mag=getcur_enmonpow(pnum,1);
 if (mag<1) { return 1; }

 var mod=0;	var magic;
 var start=g_eq_armor;
 var end=g_eq.length;
 if (od=="d") { start=0; end=g_eq_armor; }
 for (var i=start; i<end; i++) {
  mod+=(1/magic_factor(g_eq[i],mag));
 }
 var mody = mod/(end-start);
 debugmsg(od+" vs "+mag+" = "+mody);
 return mody*mody;
}

