﻿/*
 * Author:
 *      Stalker-ness / Biochemist-ness / Priest-ness @ iRO Loki
 *      Biochemist-ness @ irowiki forums
 *      Alchemist-ness @ iRO official forums
 * Description:
 *      A quick calc to help better visualize iROs new repeatable 
 *      EXP quests (http://irowiki.org/wiki/Repeatable_EXP_Quests)
 * Copyright:
 *
    Copyright (C) 2008
    
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.
    
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
    
    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 * Included Files:
 *	style.css
 *	index.html
 *	exp.js	(source: http://www.mammonite.com/medal2.html)
 *	quests.js
 ***/

/*
 * Notes: (1) tax is not implimented for overkill exp, because i haven't
 * 	      tested how it works.
 *	  (2) element.innerHTML() is quite picky and doesn't always work
 *	      with some elements on all browsers.
 *	      (dont use it on a <tbody>)
 ***/

var h;

function max_level() {
    var max = 0;
    for (i = 0; i < Quests.length; i++)
	if (Quests[i][1] > max)
	    max = Quests[i][1];
    return max;
}

function min_level() {
    var min = 99;
    for (i = 0; i < Quests.length; i++)
	if (Quests[i][0] < min)
	    min = Quests[i][0];
    return min;
}

function job(what) {
    (document.getElementById('joblevel')).length = 0;
    for (i = 1; i <= job_exp[what].length + 1; i++)
	(document.getElementById('joblevel')).options[i-1] = new Option(i,i);
}

function update_handins(num) {

    var valk = 0;
    var body = '<table id="handin_table"><thead><tr><td></td><th rowspan="2"># handins</th><th># Items</th><th>Item Name</th><th rowspan="2">Modifiers</th></tr><tr><td></td><th>Levels</th><th>NPC Location</th></tr></thead><tbody id="handin_tbody">';
    for( i = 0; i < num; i++) {
	body += '<tr><td rowspan="2">' + (i+1) + '.</td>';
	body += '<td rowspan="2" align="center"><select id="num_' + i + '" onChange="update_count(' + i + ',this.value)"></select></td>';
	body += '<td id="count_' + i + '">(' + (h[i][0]*Quests[h[i][1]][2]) + ')</td>';
	body += '<td><select id="handin_' + i + '" onChange="update_item(' + i + ',this.value)"></select></td>';
//	body += '<td id="bexp_' + i + '" align="right">' + (h[i][0]*Quests[h[i][1]][4][valk]) + ' bexp</td></tr>';
	body += '<td>Tax %:<select id="tax_' + i + '" onChange="saveTax('+i+',this.value)"></select></td></tr>';
	body += '<tr>';
	body += '<td id="lvl_' + i + '">(' + Quests[h[i][1]][0] + '~'  + Quests[h[i][1]][1] + ')</td>';
	body += '<td id="npc_' + i + '">(' + Quests[h[i][1]][6] + ')</td>';
//	body += '<td id="jexp_' + i + '" align="right">' + (h[i][0]*Quests[h[i][1]][5][valk]) + ' jexp</td></tr>';

//	body += '<td id="BMs_' + i + '" align="right"><input id="bm_' + i + '" name="bm_' + i + '" type="checkbox"/><label for="bm_' + i + '">BM</label><input id="hebm_' + i + '" name="hebm' + i + '" type="checkbox"/><label for="hebm_' + i + '">HEBM</label></td></tr>';
	body += '<td id="BMs_' + i + '" >BM: <select id="bm_' + i + '" onChange="saveBM('+i+',this.value)"></select></td></tr>';
    }
    body += '</tbody></table>';

    document.getElementById('handin_div').innerHTML = body;

    for( i = 0; i < num; i++) {
	for( j = 0; j <= 2000; j++)
	    (document.getElementById('num_' + i)).options[j] = new Option(j,j);
	document.getElementById('num_' + i).selectedIndex = h[i][0];

	for( j = 0; j < Quests.length; j++)
	    (document.getElementById('handin_' + i)).options[j] = new Option(Quests[j][3],j);
	document.getElementById('handin_' + i).selectedIndex = h[i][1];

	for (j = 0; j <= 50; j++)
	    (document.getElementById('tax_' + i)).options[j] = new Option(j,j);
	document.getElementById('tax_' + i).selectedIndex = h[i][2];

	(document.getElementById('bm_' + i)).options[0] = new Option("None",1);
	(document.getElementById('bm_' + i)).options[1] = new Option("1.5x",1.5);
	(document.getElementById('bm_' + i)).options[2] = new Option("2x",2);
//	(document.getElementById('bm_' + i)).options[3] = new Option("3x",3);
	(document.getElementById('bm_' + i)).selectedIndex = h[i][3];

    }
}

function saveTax(r,v) { h[r][2] = v; }
function saveBM(r,v) { h[r][3] = v; }

function update_count(r,v) {
    h[r][0] = v;
    var valk = 0;
//    if (document.getElementById('valk').checked)
//	valk = 1;
    document.getElementById('count_' + r).innerHTML = '(' + (v * (Quests[h[r][1]][2])) + ')';
//    document.getElementById('bexp_' + r).innerHTML = '' + (v * (Quests[h[r][1]][4][valk])) + ' bexp';
//    document.getElementById('jexp_' + r).innerHTML = '' + (v * (Quests[h[r][1]][5][valk])) + ' jexp';
}

function update_item(r,v) {
    h[r][1] = v;
    var valk = 0;
//    if (document.getElementById('valk').checked)
//	valk = 1;

    document.getElementById('npc_' + r).innerHTML = '(' + Quests[v][6] + ')';
    document.getElementById('count_' + r).innerHTML = '(' + h[r][0]*Quests[v][2] + ')';
//    document.getElementById('bexp_' + r).innerHTML = '' + (h[r][0] * Quests[v][4][valk]) + ' bexp';
//    document.getElementById('jexp_' + r).innerHTML = '' + (h[r][0] * Quests[v][5][valk]) + ' jexp';
    document.getElementById('lvl_' + r).innerHTML = '(' + Quests[v][0] + '~'  + Quests[v][1] + ')';
}

function calc_exp() {
    var blevel = document.getElementById('baselevel').value;
    var jlevel = document.getElementById('joblevel').value;
    var jobtype = document.getElementById('jobtype').value; 
    var b_perc = document.getElementById('base_per').value;
    var j_perc = document.getElementById('job_per').value;
    var handins = document.getElementById('rows').value;
    var changelvl = document.getElementById('change').value;
    var verbose = document.getElementById('full_list').checked;

    if (changelvl == 0) {
	jobchange = false;
    } else {
	jobchange = true;
    }

    var valk = 0;
//    if (document.getElementById('valk').checked)
//	valk = 1;

    var bexp = parseInt((b_perc/100.0)*base_exp[jobtype][blevel-1])
    var jexp = parseInt((j_perc/100.0)*job_exp[jobtype][jlevel-1])

    output = '<tr><td>&nbsp;</td><td>' + blevel + ' & ' + b_perc + '%</td>';
    output += '<td>' + jlevel + ' & ' + j_perc + '%</td>';
    output += '<td>&nbsp;</td>';
    output += '<td>&nbsp;</td></tr>';

    var c = 0;
    var max_base, max_job, b_waste, j_waste;

    for (i = 0; i < handins; i++) {
	b_waste = 0;
	j_waste = 0;

//	var bm = 1;
//	if (document.getElementById('hebm_' + i).checked) {
//	    bm = 2;
//	} else if (document.getElementById('bm_' + i).checked) {
//	    bm = 1.5;
//	}

	var bm = document.getElementById('bm_' + i).value

	var tax = document.getElementById('tax_' + i).value;
	tax_m = 1 - parseInt(tax)/100.0;

	for (j = 0; j < h[i][0]; j++) {
	    c++;

	    if (blevel > Quests[h[i][1]][1]) {
		update_count(i,j)
		document.getElementById('num_' + i).selectedIndex = j;
		break;
	    } else if (blevel < Quests[h[i][1]][0]) {
		update_count(i,0)
		document.getElementById('num_' + i).selectedIndex = 0;
		break;
	    }

	    max_base = 2 * base_exp[jobtype][blevel-1] - bexp - 1;
	    if (tax_m*bm*Quests[h[i][1]][4][valk] > max_base) {
		bexp = base_exp[jobtype][blevel-1] - 1
		blevel++;
		b_waste += bm*Quests[h[i][1]][4][valk] - max_base;
	    } else {
		bexp += tax_m * bm * Quests[h[i][1]][4][valk];
		if (bexp > base_exp[jobtype][blevel-1]) {
		    bexp -= base_exp[jobtype][blevel-1];
		    blevel++;
		}
		if (verbose) b_waste = 0;
	    }

	    max_job = 2 * job_exp[jobtype][jlevel-1] - jexp - 1;
	    if (bm*Quests[h[i][1]][5][valk] > max_job) {
		jexp = job_exp[jobtype][jlevel-1] - 1
		jlevel++;
		j_waste += bm*Quests[h[i][1]][5][valk] - max_job;
	    } else {
		jexp += bm * Quests[h[i][1]][5][valk];
		if (jexp > job_exp[jobtype][jlevel-1]) {
		    jexp -= job_exp[jobtype][jlevel-1];
		    jlevel++;
		}
		if (verbose) j_waste = 0;
	    }

	    if (verbose) {
		output += result_row(c,blevel,bexp,b_waste,jlevel,jexp,j_waste,''+Quests[h[i][1]][2]+' '+Quests[h[i][1]][3],jobtype);
		b_waste = 0;
		j_waste = 0;
	    }

	    if (jobchange) {
		if (jlevel == 10) {
		    if (jobtype == 'novi') {
			jlevel = 1;
			jexp = 0;
			jobtype = '1st';
			output += '<tr><td></td><td colspan="4">You are now 1st class</td></tr>';
		    } else if (jobtype == 'rebirth_novi') {
			jlevel = 1;
			jexp = 0;
			jobtype = 'rebirth_1st';
			output += '<tr><td></td><td colspan="4">You are now 1st class trans</td></tr>';
		    }
		} else if (jlevel == changelvl) {
		    if (jobtype == '1st') {
			jlevel = 1;
			jexp = 0;
			jobtype = '2nd';
			output += '<tr><td></td><td colspan="4">You are now 2nd class</td></tr>';
		    } else if (jobtype == 'rebirth_1st') {
			jlevel = 1;
			jexp = 0;
			jobtype = 'rebirth_2nd';
			output += '<tr><td></td><td colspan="4">You are now 2nd class trans</td></tr>';
		    }
		}
	    }
	}
	if (!(verbose))
	    output += result_row(c,blevel,bexp,b_waste,jlevel,jexp,j_waste, '' + (h[i][0] * Quests[h[i][1]][2]) + ' ' + Quests[h[i][1]][3],jobtype);

    }

    var o = '<table id="results_table"><thead><tr><th>#</th><th>Base</th><th>Job</th><th>Items</th><th>Exp Waste</th></tr></thead><tbody id="results_body">';
    o += output + '</tbody></table>';

    document.getElementById('results').innerHTML = o;
}

function result_row(n,bl,be,bw,jl,je,jw,i,t) {
    if (bw > 0)
	bw = '<font color="red">' + Math.round(bw) + '</font>';
    if (jw > 0)
	jw = '<font color="red">' + Math.round(jw) + '</font>';

    output = '<tr><td>' + n + '.</td>';
    output += '<td>' + bl + ' & ' + Math.round(1000*be/base_exp[t][bl-1])/10  + '%</td>';
    output += '<td>' + jl + ' & ' + Math.round(1000*je/job_exp[t][jl-1])/10 + '%</td>';
    output += '<td>' + i + '</td>';
    output += '<td>' + bw + ' / ' + jw + '</td></tr>';

    return output;
}

function init() {
    h = new Array(Quests.length)
    for(i = 0; i < Quests.length; i++)
	h[i] = [ 0, 0];

    var max = max_level();
    var min = min_level();
    for (i = min; i <= max; i++)
	(document.getElementById('baselevel')).options[i-min] = new Option(i,i);
    for (i = 1; i <= 10; i++)
	(document.getElementById('joblevel')).options[i-1] = new Option(i,i);
//    for (i = 0; i <= 50; i++)
//	(document.getElementById('tax')).options[i] = new Option(i,i);
    for (i = 1; i <= Quests.length; i++)
	(document.getElementById('rows')).options[i-1] = new Option(i,i);
    document.getElementById('change').options[0] = new Option('None',0);
    for (i = 40; i <= 50; i++)
	document.getElementById('change').options[i-39] = new Option(i,i);
    document.getElementById('change').selectedIndex = 11;
    
    update_handins(1);
}


