// Skill Simulator Functions By yC at http://ratemyserver.net

function add_skpt(object){

	// first job skill pt into first job skill
	if(object.sk_type == 1 && object.max_lvl > object.cur_lvl && skill_pt_left > 0){
		skill_pt_used++;
		used_1st.innerHTML = skill_pt_used;
		
		skill_pt_left--;
		unuse_1st.innerHTML = skill_pt_left;
		
		return 1;	// success
	
	// 2nd job skill pt into 1st or 2nd job skill
	}else if(object.max_lvl > object.cur_lvl && sec_skill_pt_left > 0){
		sec_skill_pt_used++;
		used_2nd.innerHTML = sec_skill_pt_used;
		
		sec_skill_pt_left--;
		unuse_2nd.innerHTML = sec_skill_pt_left;
		
		// counter for 2nd job skill pt into 1st job skill
		if(object.sk_type == 1){
			backward_skpt++;
			if(backward_skpt == 1){
			alert('Putting secondary job skill point into first job skill.');
			}
		}
		
		
		
		return 1;	// success
		
	// add over skill pts to first job skill over counter
	}else if (object.sk_type == 1 && object.max_lvl > object.cur_lvl && skill_pt_left <= 0){
		 skpt_over++;
		 document.getElementById("skpt_over").innerHTML = "<font color = red> Over: " + skpt_over + "</font>";
		 
		 return 1;	
	
	// add over skill pts to 2nd over skill counter
	}else if (object.max_lvl > object.cur_lvl && sec_skill_pt_left <= 0){
		sec_skpt_over++;
		document.getElementById("sec_skpt_over").innerHTML = "<font color = red> Over: " + sec_skpt_over + "</font>";
	
		return 1;
	}
	return 0;	// failed

}


function take_skpt(object, skpt){

	if(object.special)	// no need to take skill point from quest/wedding/soul linked skills
		return 0;	

	// remove first job skill
	if(object.cur_lvl > 0 && object.sk_type == 1 && object.cur_lvl - skpt >= 0){		
	
		// change skill lvl
		object.cur_lvl-=skpt;
		
		td = document.getElementById(pref_curlvl + object.s_id);
		if(td && object.cur_lvl > 0){
			td.innerHTML = object.cur_lvl + ' / ' + object.max_lvl ;
		}else if (td){
			td.innerHTML = 'Na / ' + object.max_lvl ;
		}
		
		
		var skpt_minus = skpt;
		
		// take care of over the limit skill pts
		while(skpt_over > 0 && skpt_minus > 0){
			skpt_over--;
			skpt_minus--;
		}
		if(skpt_over <= 0){
			 document.getElementById("skpt_over").innerHTML = "";
		}else{
			 document.getElementById("skpt_over").innerHTML = "<font color = red> Over: " + skpt_over + "</font>";
		}
		
		if(backward_skpt > 0){	// there are sec job skill pt into first job skill
			
			// has to do it 1 by 1 to know when backward_skpt is used up		
			while(backward_skpt > 0 && skpt_minus > 0){
				
				sec_skill_pt_used--;
				used_2nd.innerHTML = sec_skill_pt_used;
			
				sec_skill_pt_left++;
				unuse_2nd.innerHTML = sec_skill_pt_left;
			
				backward_skpt--;
				skpt_minus --;
			}
		}
		
		if(skpt_minus > 0){	// taken out 2nd job skill pt if first job skill still have left over, add to first job skil pt
		
			// skill pt from first job skill pt			
			skill_pt_used-=skpt_minus;
			used_1st.innerHTML = skill_pt_used;
			
			skill_pt_left+=skpt_minus;
			unuse_1st.innerHTML = skill_pt_left;	
		}
	
		return 1;	// success
	
	// remove second job skill
	}else if(object.cur_lvl > 0 && object.sk_type == 2){
		
		// change skill lvl
		object.cur_lvl-=skpt;
		
		td = document.getElementById(pref_curlvl + object.s_id);
		if(td && object.cur_lvl > 0){
			td.innerHTML = object.cur_lvl + ' / ' + object.max_lvl ;
		}else if (td){
			td.innerHTML = 'Na / ' + object.max_lvl ;
		}
		
		var skpt_minus = skpt;
		
		// take care of 2nd job skill pt over the limit skill pts
		while(sec_skpt_over > 0 && skpt_minus > 0){
			sec_skpt_over--;
			skpt_minus--;
		}
		// update msg
		if(sec_skpt_over <= 0){
			 document.getElementById("sec_skpt_over").innerHTML = "";
		}else{
			 document.getElementById("sec_skpt_over").innerHTML = "<font color = red> Over: " + sec_skpt_over + "</font>";
		}
		
		
		if(skpt_minus > 0){	// left over skpt or nothing happen 
			sec_skill_pt_used-=skpt_minus;
			used_2nd.innerHTML = sec_skill_pt_used;
			
			sec_skill_pt_left+=skpt_minus;
			unuse_2nd.innerHTML = sec_skill_pt_left;
		}
		
		return 1;	// success
	}
	
	return 0;	// fails

}

// detect broswer 
function check_broswer(string)
{
	place = navigator.userAgent.toLowerCase().indexOf(string) + 1;
	thestring = string;
	return place;
}

// handles first job level change event
function change_job_lvl(job_lvl_form){
	
	job_lvl_changed = job_lvl_form.job_lvl_select.options[job_lvl_form.job_lvl_select.selectedIndex].value;	
	
	skill_pt_left = job_lvl_changed - 1 - skill_pt_used;
	
	unuse = document.getElementById('sk_used');
	unuse.innerHTML = skill_pt_left;
}


// handles sec/high job lvl change event
function sec_change_job_lvl(sec_job_lvl_form){

	if(!sec_job_lvl_form)	// if it's undefined due to only first job
		return;
	
	sec_job_lvl = sec_job_lvl_form.sec_job_lvl_select.options[sec_job_lvl_form.sec_job_lvl_select.selectedIndex].value;	
	
	sec_skill_pt_left = sec_job_lvl - 1 - sec_skill_pt_used;
	
	unuse = document.getElementById('sec_sk_used');
	unuse.innerHTML = sec_skill_pt_left;
}


// handles DOM mouse event switch image 
function switch_img(img_id, new_pic){

	img_ele = document.getElementById(img_id);
	if(img_ele)
		img_ele.src = new_pic;

}


// throw in skills in addable/usable skill table
function show_skill(object, lvlup_bu_td_inner, cur_lvl_col_inner, max_lvl_col_inner){
	
	// remove skill from locked list
	if(document.getElementById(pref_sklock + object.s_id)){
		if(check_broswer('msie')){
			// the IE method
			document.getElementById(pref_sklock + object.s_id).deleteCell();	// get
			document.getElementById(pref_sklock + object.s_id).deleteCell(); 	// icon
			document.getElementById(pref_sklock + object.s_id).deleteCell(); 	// desc
			document.getElementById(pref_sklock + object.s_id).deleteCell(); 	// max lvl
			document.getElementById(pref_sklock + object.s_id).deleteCell();	// req
		}else{ // other method
			document.getElementById(pref_sklock + object.s_id).innerHTML = '';
		} 
	}
		
	icon = document.createElement('td');
	icon.innerHTML = pref_icon + object.icon + suf_icon;
	
	link = document.createElement('td');
	
	link_a = document.createElement('a');
	link_a.href = 'index.php?page=skill_db&skid=' + object.s_id;
	link_a.className = 'gen_small';
	
	var linkText = document.createTextNode(object.name);	// display link text
	link_a.appendChild(linkText);	
	
	var skill_db_link = pref_link + object.s_id + suf_link;
	link_a.onclick = function () { return popSkill(object.s_id,1,1); };
	
	link.appendChild(link_a);	// add <a> to <td>
	
	lvlup_button_td = document.createElement('td');
	lvlup_button_td.id = pref_lvlup_bu + object.s_id;
	lvlup_button_td.align = 'center';
	
	lvldown_button_td = document.createElement('td');
	lvldown_button_td.id = pref_lvldown_bu + object.s_id;
	lvldown_button_td.align = 'center';
	
	delsk_button_td = document.createElement('td');
	delsk_button_td.id = pref_delsk_bu + object.s_id;
	delsk_button_td.align = 'center';
	
	
	if(lvlup_bu_td_inner != '' || object.special){	// quest or?
	
		cur_lvl_col = document.createElement('td');
		cur_lvl_col.innerHTML = cur_lvl_col_inner;
		cur_lvl_col.align = 'center';
		cur_lvl_col.id = pref_curlvl + object.s_id;
		
		if(lvlup_bu_td_inner != '') // no button img needed 
			lvlup_button_td.innerHTML = lvlup_bu_td_inner;	 
		else
			lvlup_button_td.innerHTML = object.spec_status;	// soul linked or quest etc
				
		lvldown_button_td.innerHTML = 'Na';	// no button img needed 
		delsk_button_td.innerHTML = 'Na';

	}else{
	
		cur_lvl_col = document.createElement('td');
		cur_lvl_col.innerHTML = cur_lvl_col_inner + " / " + max_lvl_col_inner;
		cur_lvl_col.align = 'center';
		cur_lvl_col.id = pref_curlvl + object.s_id;
	
		// add skill button
		lvlup_button_td.appendChild(add_button(object));
	
	}
	
	sk_table = document.getElementById(pref_sk_block + object.s_id);
	sk_table.appendChild(icon);
	sk_table.appendChild(link);
	sk_table.appendChild(cur_lvl_col);
	sk_table.appendChild(lvlup_button_td);
	sk_table.appendChild(lvldown_button_td);
	sk_table.appendChild(delsk_button_td);
	
	object.visible = 1;
}


// throw in skills in locked skill table
function lock_skill(object, max_lvl_col_inner, req_inner){ 
	
	// remove skill from locked list
	if(document.getElementById(pref_sk_block + object.s_id)){
		if(check_broswer('msie') && document.getElementById(pref_sk_block + object.s_id).cells(0)){
			// the IE method
			document.getElementById(pref_sk_block + object.s_id).deleteCell();	// icon
			document.getElementById(pref_sk_block + object.s_id).deleteCell(); 	// desc
			document.getElementById(pref_sk_block + object.s_id).deleteCell(); 	// lvl
			document.getElementById(pref_sk_block + object.s_id).deleteCell(); 	// add
			document.getElementById(pref_sk_block + object.s_id).deleteCell();	// minus
			document.getElementById(pref_sk_block + object.s_id).deleteCell();	// remove
		}else if (!check_broswer('msie')) { // other method
			document.getElementById(pref_sk_block + object.s_id).innerHTML = '';
		}
	}	 
	
	
	getsk_button_td = document.createElement('td');
	
	
	// add in a get skill button	
	getsk_button_td.appendChild(get_button(object));
	
	icon = document.createElement('td');
	icon.innerHTML = pref_icon + object.icon + suf_icon;
	
	link = document.createElement('td');
	
	link_a = document.createElement('a');
	link_a.href = 'index.php?page=skill_db&skid=' + object.s_id;
	link_a.className = 'gen_small';
	
	var linkText = document.createTextNode(object.name);	// display link text
	link_a.appendChild(linkText);	
	
	var skill_db_link = pref_link + object.s_id + suf_link;
	link_a.onclick = function () { return popSkill(object.s_id,1,1) };
	
	link.appendChild(link_a);	// add <a> to <td>
	
	max_lvl_col = document.createElement('td');
	max_lvl_col.innerHTML = max_lvl_col_inner;
	max_lvl_col.align = 'center';
	
	req = document.createElement('td');
	req.innerHTML = req_inner;
	
	sk_locked = document.getElementById(pref_sklock + object.s_id);
	sk_locked.appendChild(getsk_button_td);
	sk_locked.appendChild(icon);
	sk_locked.appendChild(link);
	sk_locked.appendChild(max_lvl_col);
	sk_locked.appendChild(req);
	
	object.visible = 0;
	//object.cur_lvl = 0;
}


// add this skill and all it's parent skills & levels required
function get_skill(object, level){

	// make skill available
	show_skill(object, '', level, object.max_lvl);

	if(object.parent_arr){
		
		var arr = object.parent_arr;
		
		for(var i = 0; i < arr.length; i+=2){
			
			if(arr[i].visible == 0){
				// make skill available
				get_skill(arr[i], arr[i].cur_lvl);				
			}
			
			var flag = 0;
			// add the required level to the parent skill 
			for(var j = arr[i].cur_lvl; j < arr[i+1]; j++){
				
				add_level(arr[i]);
				
				if(flag == 0){
					alert_msg+= "Adding Skill: [" + arr[i].name + "] to level [" + arr[i+1] + "], required for [" + object.name + "].\n";			
					flag = 1;
				}			
			}
			
		}
	} 
}


// remove a skill and it's children skills
function del_skill(object){
	minus_skill(object, object.cur_lvl);
	return;
}

// build and return an add button for the object skill in the skill's column
function add_button(object){
	
	var up_img_id = pref_lvlup_bu_img + object.s_id;
	lvlup_button_img = document.createElement('img');	// add skill button
	lvlup_button_img.id = up_img_id;
	lvlup_button_img.src = icon_file_path + 'skill_out.gif';
	lvlup_button_img.border = 0;
	lvlup_button_img.onclick = function () { add_level(object); switch_img(up_img_id, icon_file_path + 'skill_click.gif');};
	lvlup_button_img.onmouseout = function ()  { switch_img(up_img_id, icon_file_path + 'skill_out.gif'); }
	lvlup_button_img.onmouseover = function () { switch_img(up_img_id, icon_file_path + 'skill_over.gif'); };
	lvlup_button_img.onmousedown = function () { switch_img(up_img_id, icon_file_path + 'skill_down.gif');}
	//lvlup_button_td.appendChild(lvlup_button_img);
	return lvlup_button_img;
}


// build and return a minus button for the object skill 
function minus_button(object){
	
	var down_img_id = pref_lvldown_bu_img + object.s_id;
	lvldown_button_img = document.createElement('img');	// add skill button
	lvldown_button_img.id = down_img_id;
	lvldown_button_img.src = icon_file_path + 'skilld_out.gif';
	lvldown_button_img.border = 0;
	lvldown_button_img.onclick = function () { minus_skill(object, 1); switch_img(down_img_id, icon_file_path + 'skilld_click.gif'); show_alert(); };
	lvldown_button_img.onmouseout = function ()  { switch_img(down_img_id, icon_file_path + 'skilld_out.gif'); }
	lvldown_button_img.onmouseover = function () { switch_img(down_img_id, icon_file_path + 'skilld_over.gif'); };
	lvldown_button_img.onmousedown = function () { switch_img(down_img_id, icon_file_path + 'skilld_down.gif');}
	return lvldown_button_img;
}


// build and return a get skill button for the object skill
function get_button(object){

	var getsk_bu_img = pref_getsk_bu_img + object.s_id;
	getsk_button_img = document.createElement('img');	// add skill button
	getsk_button_img.id = getsk_bu_img;
	getsk_button_img.src = icon_file_path + 'getsk_out.gif';
	getsk_button_img.border = 0;
	getsk_button_img.onclick = function () { if(object.special) get_skill(object, 1); else get_skill(object, 'Na'); show_alert(); };
	getsk_button_img.onmouseout = function ()  { switch_img(getsk_bu_img, icon_file_path + 'getsk_out.gif'); }
	getsk_button_img.onmouseover = function () { switch_img(getsk_bu_img, icon_file_path + 'getsk_over.gif'); };
	return getsk_button_img;

}


// build and return an del button for the object skill
function del_button(object){

	var del_img_id = pref_delsk_bu_img + object.s_id;
	delsk_button_img = document.createElement('img');	// add skill button
	delsk_button_img.id = del_img_id;
	delsk_button_img.src = icon_file_path + 'delsk_out.gif';
	delsk_button_img.border = 0;
	delsk_button_img.onclick = function () { del_skill(object); show_alert(); };
	delsk_button_img.onmouseout = function ()  { switch_img(del_img_id, icon_file_path + 'delsk_out.gif'); }
	delsk_button_img.onmouseover = function () { switch_img(del_img_id, icon_file_path + 'delsk_over.gif'); };
	delsk_button_td.appendChild(delsk_button_img);	
	return delsk_button_img;	

}


function show_alert(){
	if(alert_msg != "" && !document.getElementById('alert_mode').checked){
		alert(alert_msg);
	} 
	alert_msg = ""; // reset
}


function reset(){	// reset the whole skill sim to as loaded
	for(i = 0; i < obj_arr.length; i++){
		var skill = obj_arr[i];
		if(skill.visible == 1 && skill.req_list){	// visible and has requirements
			lock_skill(skill, skill.max_lvl, skill.req_list);
		}
		minus_skill(skill, skill.cur_lvl);
	}
	
	document.getElementById('report').innerHTML = '';
	document.getElementById('report_sum1').innerHTML = '';
	document.getElementById('report_sum2').innerHTML = '';	
}


function gen_report(){
	
	var report = "<br><table class = 'btext' align = 'center'>";
	
	for(i = 0; i < obj_arr.length; i++){
		
		var skill = obj_arr[i];
		if(skill.cur_lvl > 0 && skill.visible == 1 && skill.special){
			report += "<tr><td width = '210' align = 'left'>" + skill.name + "</td><td> Level </td><td align = 'right'>" + skill.cur_lvl + "</td><td>" + skill.spec_status + "</td></tr>";
		}else if(skill.cur_lvl > 0 && skill.visible == 1){
			report += "<tr><td width = '210' align = 'left'>" + skill.name + "</td><td> Level </td><td align = 'right'>" + skill.cur_lvl + "</td><td></td></tr>";
		}
	}	
	
	report += "</table>";
	var report_sum1 = "<table class = 'btext' align = 'center'><tr><td width = '240px' align = 'right'>Total first job skill point used:</td><th align = 'left'>" + skill_pt_used + "/" + (job_lvl_changed - 1) + "</th><td width = '50px' align = 'right'>Left: </td><th align = 'left'>" + skill_pt_left + "</th><td width = '50px' align = 'right'>Over: </td><th align = 'left'>" + skpt_over + "</th></tr></table>";
	var report_sum2 = "<table class = 'btext' align = 'center'><tr><td width = '240px' align = 'right'>Total secondary job skill point used:</td><th align = 'left'>" + sec_skill_pt_used + "/" + (sec_job_lvl- 1) + "</th><td width = '50px' align = 'right'>Left: </td><th align = 'left'>" + sec_skill_pt_left + "</th><td width = '50px' align = 'right'>Over: </td><th align = 'left'>" + sec_skpt_over + "</th></tr></table>";
	
	document.getElementById('report').innerHTML = report;
	document.getElementById('report_sum1').innerHTML = report_sum1;
	document.getElementById('report_sum2').innerHTML = report_sum2;
	
}