//Copyright © 2002 - 2010 PracticeWEB Ltd
function validateNumber(number){

	// Purpose: Check for valid number
	// Author:  Mark Skingle
	// Date:    24/03/2004
	
	var digits="0123456789.";

	if(isNaN(number)){
		return false;
	}
	
	if (number.length==0){
		return false;
	}
	
	for (var i=0;i<number.length;i++){
		if (digits.indexOf(number.substring(i,i+1))==-1 && number.substring(i,i+1)!="."){
			return false;
		}
	}
	
	if (number<0){
		return false;
	}
	return true;
}
  
  function formatCurrency(number){
  
    number = number.toFixed();
    
    var str = number.toString();
    var strArray = new Array();
    var i;
    
    for (i = str.length; i > 3; i = i - 3){
      strArray.unshift(str.substr(i-3, 3));
    }
    
    strArray.unshift(str.substr(0,i));
    
    var newStr = strArray.join(',');
  	
  	return("\xA3" + newStr );
  
  }
  
  function calculateCGT(){
    // constants that need to be easily editable
    var BASIC_RATE_BAND = 35000;
    var PERSONAL_ALLOWANCE = 6475;
    var ANNUAL_EXEMPT_AMOUNT = 10600;
    var ENTREPRENEURS_RELIEF = 5000000;
    var ENTREPRENEURS_RELIEF_RATE = 10 * 0.01;
    var CGT_STANDARD_RATE = 18 * 0.01;
    var CGT_HIGHER_RATE = 28 * 0.01;
    var HIGHER_RATE_MESSAGE = "<p>You are probably liable at 28%.</p>";
    var LOWER_RATE_MESSAGE = "<p>As you do not pay higher rate tax some, or all, of the higher rate gain may be taxed at 18%.</p>";
  
  	//load values from form into variables
  
  	var frm=document.cgtcalc;
  	var gain_relief = frm.gain_relief.value.replace(/,/g, '');
  	var gain_non_relief = frm.gain_non_relief.value.replace(/,/g, '');
  	var higher_rate_payer;
    
    
    for (var i=0; i < frm.higher_rate_payer.length; i++) {
      if (frm.higher_rate_payer[i].checked) {
        higher_rate_payer = parseInt(frm.higher_rate_payer[i].value);
      }
    }
    
    //validate inputs
  	
  	var errorMessage="";
    // check for pound sign. need to do it this way due to UTF encoding issues
    var match = String.fromCharCode(163);
  	if (gain_relief.substring(0,1) == match) {gain_relief = gain_relief.substring(1);}
  	if (gain_non_relief.substring(0,1)== match) {gain_non_relief=gain_non_relief.substring(1);}
  	
  	if (!validateNumber(gain_relief)) {errorMessage+="Qualifying gain,\n";}
  	if (gain_relief>999999999999) {errorMessage+="Qualifying gain,\n";}
    
  	if (!validateNumber(gain_non_relief)) {errorMessage+="Non qualifying gain,\n";}
  	if (gain_non_relief>999999999999) {errorMessage+="Non qualifying gain,\n";}
  	
  	if (errorMessage.length!=0) {alert("The following entries are incorrect:\n\n"+errorMessage+"\nPlease correct these entries and\ntry again.");return false;}
  	  
    // calculation
    
    var non_business_assets = parseInt(gain_non_relief);
    var business_assets = parseInt(gain_relief);
    
    
    var gross_gain = non_business_assets + business_assets;
    var annual_tax_free_amount = Math.min(gross_gain, ANNUAL_EXEMPT_AMOUNT);
    var taxable_gain = (gross_gain < ANNUAL_EXEMPT_AMOUNT)? 0 : gross_gain - annual_tax_free_amount;
    
    var remaining = ENTREPRENEURS_RELIEF + annual_tax_free_amount - Math.min(non_business_assets, ANNUAL_EXEMPT_AMOUNT);
    var for_entrepreneurs_gain;
    if (business_assets > remaining){
      for_entrepreneurs_gain = ENTREPRENEURS_RELIEF;
    }
    else if (non_business_assets > annual_tax_free_amount){
      for_entrepreneurs_gain = business_assets;
    }
    else{
      for_entrepreneurs_gain = gross_gain - annual_tax_free_amount;
    }
    var on_entrepreneurs_gain = ENTREPRENEURS_RELIEF_RATE * for_entrepreneurs_gain;
    
    var for_higher_rate;
    if (for_entrepreneurs_gain == ENTREPRENEURS_RELIEF){
      for_higher_rate = taxable_gain - for_entrepreneurs_gain;
    }
    else {
      for_higher_rate = Math.max(non_business_assets - ANNUAL_EXEMPT_AMOUNT, 0);
    }
    
    var on_higher_rate = CGT_HIGHER_RATE * for_higher_rate;
    var total_liability = on_entrepreneurs_gain + on_higher_rate;
    
    var message = '';
    if (higher_rate_payer == 0){
      if (gross_gain > BASIC_RATE_BAND + PERSONAL_ALLOWANCE){
        message = HIGHER_RATE_MESSAGE;
      }
      else {
        message = LOWER_RATE_MESSAGE;
      }
    }
    
  	//load text boxes with results
  	  	
  	frm.non_business_assets.value=formatCurrency(non_business_assets);
  	frm.business_assets.value=formatCurrency(business_assets);
  	frm.gross_gain.value=formatCurrency(gross_gain);
  	frm.annual_tax_free_amount.value=formatCurrency(annual_tax_free_amount);
  	frm.taxable_gain.value=formatCurrency(taxable_gain);
  	frm.for_entrepreneurs_gain.value=formatCurrency(for_entrepreneurs_gain);
  	frm.for_higher_rate.value=formatCurrency(for_higher_rate);
  	frm.on_entrepreneurs_gain.value=formatCurrency(on_entrepreneurs_gain);
  	frm.on_higher_rate.value=formatCurrency(on_higher_rate);
  	frm.total_liability.value=formatCurrency(total_liability);
    
    document.getElementById('cgt_message').innerHTML = message;
    
  	return false;
  }
