// Battrick Stadium Calculator
// Date created: 20061104
// Author: Gary Jones

    // Values to change if BT changes
    var SP = 0.45;  // Standing Percentage  45%
    var UP = 0.40;  // Uncovered Percentage 40%
    var CP = 0.11;  // Covered Percentage   11%
    var MP = 0.04;  // Members Percentage    4%

    var SBC = 15;   // Standing Building Cost  £15
    var UBC = 25;   // Uncovered Building Cost £25
    var CBC = 30;   // Covered Building Cost   £30
    var MBC = 100;  // Members Building Cost  £100
    var FixedCost = 20000 // Fixed Building Cost £20,000

    var SMC = 1.00; // Standing Maintenance Cost  £1.00
    var UMC = 1.60; // Uncovered Maintenance Cost £1.60
    var CMC = 2.20; // Covered Maintenance Cost   £2.20
    var MMC = 5.00; // Members Maintenance Cost   £5.00

    var SR = 5.00;  // Standing Revenue   £5.00
    var UR = 7.50;  // Uncovered Revenue  £7.50
    var CR = 10.00; // Covered Revenue   £10.00
    var MR = 25.00; // Members Revenue   £25.00

// ---------- Don't touch anything below here! ----------

function Calculate()
{ // This function does the hard work

    var f=document.getElementById('form');
    Maxsize();
    var maxsize = f.maxsize.value;

    var buildonly = f.buildonly.checked;
    // Checks if Maximum Size is below 0
    if (maxsize < 1) {
        alert("Maximum Size of your stadium must be greater than 0");
        loadfocus();
        return false;
    }
    
    document.getElementById('getresults').style.display = 'block';
    
    // CAPACITY

    var club_members  = Validate(f.club_members);

    // Set variables for current_seats_xxx fields, checking user values are valid
    var cur_standing  = f.current_seats_standing.value  = Validate(f.current_seats_standing_input);
    var cur_uncovered = f.current_seats_uncovered.value = Validate(f.current_seats_uncovered_input);
    var cur_covered   = f.current_seats_covered.value   = Validate(f.current_seats_covered_input);
    var cur_members   = f.current_seats_members.value   = Validate(f.current_seats_members_input);
    // Add up current capacity
    var cur_all       = f.current_seats_all.value = cur_standing + cur_uncovered + cur_covered + cur_members;

    // Work out the capacity that should be added based on Max Size of Stadium
    var add_standing  = f.additional_seats_standing.value  = Buildonly(maxsize*SP - cur_standing, buildonly);
    var add_uncovered = f.additional_seats_uncovered.value = Buildonly(maxsize*UP - cur_uncovered, buildonly);
    var add_covered   = f.additional_seats_covered.value   = Buildonly(maxsize*CP - cur_covered, buildonly);
    var add_members   = f.additional_seats_members.value   = Buildonly(maxsize*MP - cur_members, buildonly);
    var add_all       = f.additional_seats_all.value       = add_standing + add_uncovered + add_covered + add_members;

    // Work out the total capacities. total_seats_all should = Max Size of Stadium
    var tot_standing  = f.total_seats_standing.value   = cur_standing  + add_standing;
    var tot_uncovered = f.total_seats_uncovered.value  = cur_uncovered + add_uncovered;
    var tot_covered   = f.total_seats_covered.value    = cur_covered   + add_covered;
    var tot_members   = f.total_seats_members.value    = cur_members   + add_members;
    var tot_all       = f.total_seats_all.value        = cur_all + add_all

    // Work out percentages - may not be 45/40/11/4 if Don't demolish seats is selected
    f.percentage_seats_standing.value  = Percentage(tot_standing/tot_all);
    f.percentage_seats_uncovered.value = Percentage(tot_uncovered/tot_all);
    f.percentage_seats_covered.value   = Percentage(tot_covered/tot_all);
    f.percentage_seats_members.value   = Percentage(tot_members/tot_all);
    f.percentage_seats_all.value       = Percentage(tot_all/tot_all);

    // REVENUE

    // Work out revenue for current capcities
    f.current_revenue_standing.value  = Currency(cur_standing*SR);
    f.current_revenue_uncovered.value = Currency(cur_uncovered*UR);
    f.current_revenue_covered.value   = Currency(cur_covered*CR);
    f.current_revenue_members.value   = Currency(cur_members*MR);
    var current_revenue_all = cur_standing*SR + cur_uncovered*UR + cur_covered*CR + cur_members*MR
    f.current_revenue_all.value       = Currency(current_revenue_all);

    // Work out the extra revenue from additional capacities
    f.additional_revenue_standing.value  = Currency(add_standing*SR);
    f.additional_revenue_uncovered.value = Currency(add_uncovered*UR);
    f.additional_revenue_covered.value   = Currency(add_covered*CR);
    f.additional_revenue_members.value   = Currency(add_members*MR);
    var additional_revenue_all = add_standing*SR + add_uncovered*UR + add_covered*CR + add_members*MR
    f.additional_revenue_all.value       = Currency(additional_revenue_all);

    // Work out the total revenue from current + additional capacities
    f.total_revenue_standing.value  = Currency(cur_standing*SR + add_standing*SR);
    f.total_revenue_uncovered.value = Currency(cur_uncovered*UR + add_uncovered*UR);
    f.total_revenue_covered.value   = Currency(cur_covered*CR + add_covered*CR);
    f.total_revenue_members.value   = Currency(cur_members*CR + add_members*MR);
    var total_revenue_all = cur_standing*SR + cur_uncovered*UR + cur_covered*CR + cur_members*MR + add_standing*SR + add_uncovered*UR + add_covered*CR + add_members*MR
    f.total_revenue_all.value       = Currency(total_revenue_all);

    // MAINTENANCE COSTS

    // Finds current maintenance costs
    f.current_maintenance_standing.value  = Currency(cur_standing*SMC);
    f.current_maintenance_uncovered.value = Currency(cur_uncovered*UMC);
    f.current_maintenance_covered.value   = Currency(cur_covered*CMC);
    f.current_maintenance_members.value   = Currency(cur_members*MMC);
    var current_maintenance_all = cur_standing*SMC + cur_uncovered*UMC + cur_covered*CMC + cur_members*MMC
    f.current_maintenance_all.value       = Currency(current_maintenance_all);

    // Finds additional maintenance costs of extra seats
    f.additional_maintenance_standing.value  = Currency(add_standing*SMC);
    f.additional_maintenance_uncovered.value = Currency(add_uncovered*UMC);
    f.additional_maintenance_covered.value   = Currency(add_covered*CMC);
    f.additional_maintenance_members.value   = Currency(add_members*MMC);
    var additional_maintenance_all = add_standing*SMC + add_uncovered*UMC + add_covered*CMC + add_members*MMC
    f.additional_maintenance_all.value       = Currency(additional_maintenance_all);

    // Finds total maintenance costs if additional seats are added
    f.total_maintenance_standing.value  = Currency(tot_standing*SMC);
    f.total_maintenance_uncovered.value = Currency(tot_uncovered*UMC);
    f.total_maintenance_covered.value   = Currency(tot_covered*CMC);
    f.total_maintenance_members.value   = Currency(tot_members*MMC);
    var total_maintenance_all = tot_standing*SMC + tot_uncovered*UMC + tot_covered*CMC + tot_members*MMC
    f.total_maintenance_all.value       = Currency(total_maintenance_all);

    // CONSTRUCTION COSTS
    // Constructions costs are positive, even if demolishing seats
    if (add_standing < 0)  add_standing *=-1;
    if (add_uncovered < 0) add_uncovered*=-1;
    if (add_covered < 0)   add_covered*=-1;
    if (add_members < 0)   add_members*=-1;

    f.construction_standing.value  = Currency(add_standing*SBC);
    f.construction_uncovered.value = Currency(add_uncovered*UBC);
    f.construction_covered.value   = Currency(add_covered*CBC);
    f.construction_members.value   = Currency(add_members*MBC);
    var construction_all = add_standing*SBC + add_uncovered*UBC + add_covered*CBC + add_members*MBC + FixedCost
    f.construction_all.value       = Currency(construction_all);

    // REPAYMENT TIME
    // Time taken for additional revenue to cover construction and additional maintenance costs
    // Assumes 1 home game every 2 weeks (hence the 0.5* bit)
    // Assumes 100% attendance, hence the MINIMUM repayment time label
    // Once ground has correct ratios, income from FC games doesn't matter
    // Could use:
    // var gamesPerWeek = 1
    // if(cur_all<11110) {gamesPerWeek=2}
    // var repayment_time = construction_all / (0.5*additional_revenue_all*gamesPerWeek - additional_maintenance_all);
    var repayment_time = construction_all / (0.5*additional_revenue_all - additional_maintenance_all);
    if (repayment_time == "Infinity" || repayment_time == "-Infinity") { f.repayment_all.value = repayment_time = 'No Revenue!'; }
    else {f.repayment_all.value = Weeks(repayment_time);}

    // COMPLETION
    // Additional Seats / 2500...
    // ...Round this up to integer, then add 6.
    f.completion_all.value = ((add_standing + add_uncovered + add_covered + add_members) /2500).toFixed(0)*1+6;

    return true;
}

function Maxsize()
{ // Controls whether maxsize box is readonly or not, and if so, what it shows.
    var f = document.getElementById('form');
    var s = document.getElementById('maxsize_select');
    var cm = document.getElementById('club_members');
    if(s.value=="custom_size") {
        f.maxsize.readOnly = false;
        f.maxsize.style.background = '#FFF';
        f.maxsize.select();
    } else {
        f.maxsize.readOnly = true;
        if(f.club_members.value > 0) {
                f.maxsize.value = cm.value*s.value;
        } else {
            alert('Please enter your current Club Members')
            f.maxsize.value=0;
            f.club_members.select();
            return false;
        }
        f.maxsize.style.background = '#DDD';
    }
return true;
}

function Validate(formInput)
{ // Checks user input string is non-negative integers only. Resets input value to 0 if not, and informs user.
  // If valid data, costs it to be an integer.
    if ( ! /^(\d+)$/.test(formInput.value) ) {
        alert('Your capacities need to be a whole number, greater than or equal to 0.\n\r Highlighted value has been reset to 0.');
        formInput.value = 0;
        formInput.focus();
        formInput.select();
        return false;
    } else {
        return parseInt(formInput.value);
    }

}

// number formatting function
// copyright Stephen Chapman 24th March 2006
// permission to use this function is granted provided
// that this copyright notice is retained intact
// Adapted by Gary Jones 2006-04-15

function formatNumber(num,dec,thou,pnt,curr1,curr2,n1,n2)
{ // Used to allow formatting of numbers
    var x = Math.round(num * Math.pow(10,dec));
    if (x >= 0) n1=n2='';
    var y = (''+Math.abs(x)).split('');
    if (x != 0) {
        var z = y.length - dec;y.splice(z, 0, pnt);
        while (z > 3) {
            z-=3;
            y.splice(z,0,thou);
        }
    }
    var r = n1+curr1+y.join('')+n2+curr2;
    return r;
}

function Currency(number)
{ // Formats the Currency boxes
    var code = document.getElementById('currency').value;
    if(code=='AUD') return formatNumber(number, 2, ' ', '.', '$', '', '-', '');     // Australian Dollar
    if(code=='GBP') return formatNumber(number, 2, ',', '.', '\u00A3', '', '-', '');     // Great British Pound
    if(code=='INR') return formatNumber(number, 2, ',', '.', '\u20A8', '', '-', '');    // Indian Rupee
    if(code=='NZD') return formatNumber(number, 2, ',', '.', '$', '', '-', '');     // New Zealand Dollar
    if(code=='PKR') return formatNumber(number, 2, ',', '.', '\u20A8', '', '-', '');    // Pakistani Rupee
    if(code=='ZAR') return formatNumber(number, 2, ' ', '.', 'R ', '', '-', '');     // South African Rand
    if(code=='LKR') return formatNumber(number, 2, ',', '.', '\u20A8', '', '-', '');    // Sri Lankan Rupee
    if(code=='ECD') return formatNumber(number, 2, ',', '.', '$', '', '-', '');     // East Caribbean Dollar
    else            return formatNumber(number, 2, ',', '.', '\u00A3', '', '-', '');     // default (GBP)
}

function Percentage(number)
{ // Formats the Percentages boxes
   if(isNaN(number)) {
       return "0%";
   } else {
     return formatNumber(number*100, 2, ',', '.', '', '%', '-', '');
    }
}

function Weeks(number)
{ // Formats the Weeks box
    return formatNumber(number, 1, ',', '.', '', '', '-', '');
}

function Buildonly(seats, buildonly)
{ // Adds in the Don't Demolish Seats feature
    if(buildonly && seats<0) {
        return parseInt("0");
    } else {
        return parseInt(seats);
    }
}


function loadfocus()
{   // Simply applies focus to club members onload
	if(document.getElementById) {
		if(document.getElementById('club_members').focus) document.getElementById('club_members').focus();
		if(document.getElementById('club_members').select) document.getElementById('club_members').select();
		document.getElementById('getresults').style.display = 'none';
	}
}
window.onload=loadfocus;
