/*
* Author: Cameron Hunter
* Date: 27/07/2007
* 
* Larne Council - Building Control Fees Calculator
*
*/

// REGULARISATION FEE PERCENTAGE
var percentageOfNoticeFee = 120;

// DWELLING FEE
var dwellingInspection = 175
var dwellingTypeFees = new Array(0,75,140,205,270,335,400,465,530,595,660,725,790,855,920,985,1050,1115,1180,1245,1310);
var dwellingTypeExtra = 65
var additionalFees = new Array(0,0,40,80,120,160,190,220,250,280,310,330,350,370,390,410,430,450,470,490,510);
var additionalExtra = 10
var inspectionFees = new Array(0,175,340,505,670,835,985,1135,1285,1435,1585,1710,1835,1960,2085,2210,2335,2460,2585,2710,2835);
var inspectionExtra = 100

// INSTALLATION OF AN UNVENTED HOT WATER SYSTEM
// Array(Plan Fee, Inspection Fee);
var hotWaterSystem = new Array(50, 0);

// DETACHED CARPORTS AND GARAGES (NOT EXCEEDING 40sq m)
// Array(Plan Fee, Inspection Fee);
var carportAndGarage = new Array(70, 0);

// EXTENSIONS TO DOMESTIC BUILDINGS WITH FLOOR AREA NOT EXCEEDING 20sq m
// Array(Plan Fee, Inspection Fee);
var extensionNotExceeding20sqm = new Array(100, 0);

// EXTENSIONS TO DOMESTIC BUILDINGS WITH FLOOR AREA BETWEEN 20sq m AND 40sq m
// Array(Plan Fee, Inspection Fee);
var extensionBetween20sqmAnd40sqm = new Array(50, 100);

// EXTENSIONS TO DOMESTIC BUILDINGS WITH FLOOR AREA BETWEEN 40sq m AND 60sq m
// Array(Plan Fee, Inspection Fee);
var extensionBetween40sqmAnd60sqm = new Array(60, 120);

// ROOFSPACE CONVERSION IN DOMESTIC BUILDINGS
// Array(Plan Fee, Inspection Fee);
var roofSpaceConverstion = new Array(60, 120);

// ALL OTHER WORKS REQUIRING AN ESTIMATED COST
// Array(Upper Limit, Plan Flat Fee, Plan Fee Increment, Inspection Flat Fee, Inspection Increment);
var upto2000          = new Array(2000,           60,      0,      0,        0);
var upto5000          = new Array(5000,           150,     0,      0,        0);
var upto20000         = new Array(20000,          37.50,   2.50,   112.50,   7.50);
var upto100000        = new Array(100000,         75,      2,      225,      6);
var upto1000000       = new Array(1000000,        235,     1.25,   705,      3.75);
var upto10000000      = new Array(10000000,       1360,    0.88,   4080,     2.62);
var upto1000000000000 = new Array(1000000000000,  9235,    0.75,   27705,    2.25);

// Holds all of the Arrays above to calculate the Additional Works cost
var otherWorks = new Array( upto2000, 
                            upto5000, 
                            upto20000, 
                            upto100000, 
                            upto1000000, 
                            upto10000000, 
                            upto1000000000000 );

// ########### ONCHANGE EVENTS #################################################################

function setDwellingFees() {
  var numberOfDwellings = parseInt(document.getElementById("numberofdwellings").value);
  var numberOfPlanTypes = parseInt(document.getElementById("plantypes").value);
  var resultP = document.getElementById("dwellingP");
  var resultN = document.getElementById("dwellingN");
  var resultR = document.getElementById("dwellingR");
  
  var dwellingFee = calculateDwellingFees(numberOfPlanTypes, numberOfDwellings);
  
  resultP.innerHTML = formatCurrency(dwellingFee[0]);
  resultN.innerHTML = formatCurrency(dwellingFee[1]);
  resultR.innerHTML = formatCurrency(dwellingFee[2]);
  
  setTotal();
}

function setAlterationFees(elementID, costArray) {
  
  var quantity = parseInt(document.getElementById(elementID).value);
  var resultP = document.getElementById(elementID + "P");
  var resultN = document.getElementById(elementID + "N");
  var resultR = document.getElementById(elementID + "R");
  
  var alterationFee = calculateAlterationFees(quantity, costArray);
  
  resultP.innerHTML = formatCurrency(alterationFee[0]);
  resultN.innerHTML = formatCurrency(alterationFee[1]);
  resultR.innerHTML = formatCurrency(alterationFee[2]);
  
  setTotal();
}

function setAdditionalWorkFees(elementID) {
  
  var estimatedCost = parseInt(document.getElementById(elementID).value);
  var resultP = document.getElementById(elementID + "P");
  var resultN = document.getElementById(elementID + "N");
  var resultR = document.getElementById(elementID + "R");
  
  var additionalFee = calculateAdditionalWorksFees(estimatedCost);
  
  resultP.innerHTML = formatCurrency(additionalFee[0]);
  resultN.innerHTML = formatCurrency(additionalFee[1]);
  resultR.innerHTML = formatCurrency(additionalFee[2]);
  
  setTotal();
}

function setTotal() {
  
  var feeCalculation = calculateTotal(  parseInt(document.getElementById("plantypes").value), 
                                        parseInt(document.getElementById("numberofdwellings").value), 
                                        parseInt(document.getElementById("hotwatersystems").value), 
                                        parseInt(document.getElementById("carports").value), 
                                        parseInt(document.getElementById("notexceeding20").value), 
                                        parseInt(document.getElementById("exceeding20").value), 
                                        parseInt(document.getElementById("exceeding40").value), 
                                        parseInt(document.getElementById("roofspaceconversion").value), 
                                        document.getElementById("otherworksestimate").value,
                                        document.getElementById("exceeding250workestimate").value );
  
  var totalFeeP = document.getElementById("feeP");
  var totalFeeN = document.getElementById("feeN");
  var totalFeeR = document.getElementById("feeR");
  
  var totalFeePInput = document.getElementById("totalFeeP");
  var totalFeeNInput = document.getElementById("totalFeeN");
  var totalFeeRInput = document.getElementById("totalFeeR");
  
  totalFeeP.innerHTML = formatCurrency(feeCalculation[0]);
  totalFeeN.innerHTML = formatCurrency(feeCalculation[1]);
  totalFeeR.innerHTML = formatCurrency(feeCalculation[2]);
  
  totalFeePInput.value = formatCurrency(feeCalculation[0]);
  totalFeeNInput.value = formatCurrency(feeCalculation[1]);
  totalFeeRInput.value = formatCurrency(feeCalculation[2]);
}

// #########################################################################################


// ########### FUNCTIONS ######################################################################
  
  // Calculates the total fee cost
  // @returns = Array(Total Plan Fee, Total Building Notice Fee, Total Regularisation Fee, Total Fee);
  function calculateTotal ( numberOfPlanTypes, 
                            totalNumberOfDwellings, 
                            quantityOfHotWaterSystems, 
                            quantityOfCarports, 
                            quantityOfExtensionsLessThan20, 
                            quantityOfExtensionsExceeding20, 
                            quantityOfExtensionsExceeding40, 
                            quantityOfRoofspaceRooms,
                            allOtherEstimatedCosts,
                            exceeding250OtherCosts  ) 
    {
      
      numberOfPlanTypes = parseInt(numberOfPlanTypes);
      totalNumberOfDwellings = parseInt(totalNumberOfDwellings);
      quantityOfHotWaterSystems = parseInt(quantityOfHotWaterSystems);
      quantityOfCarports = parseInt(quantityOfCarports);
      quantityOfExtensionsLessThan20 = parseInt(quantityOfExtensionsLessThan20);
      quantityOfExtensionsExceeding20 = parseInt(quantityOfExtensionsExceeding20);
      quantityOfExtensionsExceeding40 = parseInt(quantityOfExtensionsExceeding40);
      quantityOfRoofspaceRooms = parseInt(quantityOfRoofspaceRooms);
      allOtherEstimatedCosts = parseInt(allOtherEstimatedCosts);
      exceeding250OtherCosts = parseInt(exceeding250OtherCosts);
      
      var dwellingFee = calculateDwellingFees(numberOfPlanTypes, totalNumberOfDwellings);
      var hotWaterFee = calculateAlterationFees(quantityOfHotWaterSystems, hotWaterSystem);
      var carportFee = calculateAlterationFees(quantityOfCarports, carportAndGarage);
      var extensionNotExceeding20sqmFee = calculateAlterationFees(quantityOfExtensionsLessThan20, extensionNotExceeding20sqm);
      var extensionBetween20sqmAnd40sqmFee = calculateAlterationFees(quantityOfExtensionsExceeding20, extensionBetween20sqmAnd40sqm);
      var extensionBetween40sqmAnd60sqmFee = calculateAlterationFees(quantityOfExtensionsExceeding40, extensionBetween40sqmAnd60sqm);
      var roofspaceFee = calculateAlterationFees(quantityOfRoofspaceRooms, roofSpaceConverstion);
      var otherWorksFee = calculateAdditionalWorksFees(allOtherEstimatedCosts);
      var exceeding250OtherWorksFee = calculateAdditionalWorksFees(exceeding250OtherCosts);
      
      var totalP = dwellingFee[0] 
                      + hotWaterFee[0] 
                      + carportFee[0] 
                      + extensionNotExceeding20sqmFee[0] 
                      + extensionBetween20sqmAnd40sqmFee[0] 
                      + extensionBetween40sqmAnd60sqmFee[0] 
                      + roofspaceFee[0] 
                      + otherWorksFee[0]
                      + exceeding250OtherWorksFee[0];
                      
      var totalN = dwellingFee[1] 
                      + hotWaterFee[1] 
                      + carportFee[1] 
                      + extensionNotExceeding20sqmFee[1] 
                      + extensionBetween20sqmAnd40sqmFee[1] 
                      + extensionBetween40sqmAnd60sqmFee[1] 
                      + roofspaceFee[1] 
                      + otherWorksFee[1]
                      + exceeding250OtherWorksFee[1];
                      
      var totalR = dwellingFee[2] 
                      + hotWaterFee[2] 
                      + carportFee[2] 
                      + extensionNotExceeding20sqmFee[2] 
                      + extensionBetween20sqmAnd40sqmFee[2] 
                      + extensionBetween40sqmAnd60sqmFee[2] 
                      + roofspaceFee[2] 
                      + otherWorksFee[2]
                      + exceeding250OtherWorksFee[2];
      
      var total = totalP + totalN + totalR;
      
      return new Array(totalP, totalN, totalR, total);
  }
  
  
  
  // Calculates the Regularisation Fee
  // @returns = double;
  function calculateRegularisationFee(buildingNotice) { return ((buildingNotice)/100) * percentageOfNoticeFee; }
  
  
  
  // Calculates the fees for dwellings
  // @returns = Array(Planning Fee, Building Notice Fee, Registration Fee);
  function calculateDwellingFees(numberOfDwellingPlanTypes, totalNumberOfDwellings) {
    
    var feeP = 0;
    var feeI = 0;
    var feeN = 0;
    var feeR = 0;
    
    if (numberOfDwellingPlanTypes>=0 && numberOfDwellingPlanTypes<dwellingTypeFees.length) {
      feeP = dwellingTypeFees[numberOfDwellingPlanTypes];
    } else if (numberOfDwellingPlanTypes>=dwellingTypeFees.length) {
      feeP = dwellingTypeFees[dwellingTypeFees.length-1] + (dwellingTypeExtra * ((numberOfDwellingPlanTypes-dwellingTypeFees.length)+1));
    }
    
    if (totalNumberOfDwellings>=0 && totalNumberOfDwellings<additionalFees.length) {
      feeP += additionalFees[totalNumberOfDwellings];
    } else if (totalNumberOfDwellings>=additionalFees.length) {
      feeP += additionalFees[additionalFees.length-1] + (additionalExtra * ((totalNumberOfDwellings-additionalFees.length)+1));
    }
    
    if (totalNumberOfDwellings>=0 && totalNumberOfDwellings<inspectionFees.length) {
      feeI = inspectionFees[totalNumberOfDwellings];
    } else if (totalNumberOfDwellings>=inspectionFees.length) {
      feeI = inspectionFees[inspectionFees.length-1] + (inspectionExtra * ((totalNumberOfDwellings-inspectionFees.length)+1));
    }
    
    feeN = feeP + feeI;
    
    var feeR = calculateRegularisationFee(feeN);
    
    return new Array(feeP, feeN, feeR);
    
  }
  
  
  
  // Calculates the fees for Alterations and Extensions
  // @returns = Array(Planning Fee, Building Notice Fee, Registration Fee);
  function calculateAlterationFees(quantity, costArray) {
    var planFee = costArray[0];
    var inspFee = costArray[1];
    
    var feeP = quantity * planFee;
    var feeN = quantity * (planFee + inspFee);
    var feeR = calculateRegularisationFee(feeN);
    
    return new Array(feeP, feeN, feeR);
  }
  
  
  
  // Calculates the fees for Additional Works
  // @returns = Array(Planning Fee, Building Notice Fee, Registration Fee);
  function calculateAdditionalWorksFees(estimatedCost) {
    var lowerLimit = 0;
    
    for (i=0; i<otherWorks.length; i++) {
      
      var costArray = otherWorks[i];
      var upperLimit = costArray[0];
      
      if (estimatedCost>lowerLimit && estimatedCost<=upperLimit) {
        
        var planFlatFee = costArray[1];
        var planIncrement = costArray[2];
        var inspectionFee = costArray[3];
        var inspectionIncrement = costArray[4];
        
        var feeP = planFlatFee + (planIncrement * (Math.ceil((estimatedCost-lowerLimit)/1000)));
        var feeN = feeP + (inspectionFee + (inspectionIncrement * (Math.ceil((estimatedCost-lowerLimit)/1000))));
        var feeR = calculateRegularisationFee(feeN);
        
        return new Array(feeP, feeN, feeR);
      } 
      lowerLimit = upperLimit;
    }
    return new Array(0, 0, 0);
  }
  
  function formatCurrency(num) {
    num = num.toString().replace(/\$|\,/g,'');
    if(isNaN(num))
    num = "0";
    sign = (num == (num = Math.abs(num)));
    num = Math.floor(num*100+0.50000000001);
    pence = num%100;
    num = Math.floor(num/100).toString();
    if(pence<10)
    pence = "0" + pence;
    for (var i = 0; i < Math.floor((num.length-(1+i))/3); i++)
    num = num.substring(0,num.length-(4*i+3))+','+
    num.substring(num.length-(4*i+3));
    return (((sign)?'':'-') + '£' + num + '.' + pence);
  }
// #########################################################################################