// Functions for the State Selector Tool. 

function changeState(id, newClass) {
		identity = document.getElementById(id);
		identity.className = newClass;
		}

// Functions for the Penalty Calculator tool.

function calculatePenalty() {

	var estimatedMonthlyPremium;
	var monthsWithoutCreditableCoverage;
	var increasedPremium;
	var increasedPremiumPerMonth;
	var penaltyRate=1;
	var today = new Date();
	
	estimatedMonthlyPremium = formatCleanRead(penaltycalc.estimatedmonthlypremium.value, 1);
	monthsWithoutCreditableCoverage = penaltycalc.monthswithoutcreditablecoverage.value;
	increasedPremium = estimatedMonthlyPremium*Math.pow((1+penaltyRate/100),monthsWithoutCreditableCoverage);
	increasedPremiumPerMonth = increasedPremium - estimatedMonthlyPremium;


	penaltycalc.increasedpremium.value = "$" + formatCurrency(roundAndString(increasedPremium),1);
	 
	//Display summary
	penaltycalc.monthswithoutcreditablecoverageagain.value = monthsWithoutCreditableCoverage;
	penaltycalc.increasedpremiumpermonth.value = "$" + formatCurrency(roundAndString(increasedPremiumPerMonth),1);
	penaltycalc.tenyearsavings.value = "$" + formatCurrency(roundAndString(10*12*increasedPremiumPerMonth),1);

	//Display current date and time	 
	penaltycalc.date.value = today.getMonth() + 1 + '/' + today.getDate() + '/' + today.getFullYear() + ' ' + today.getHours() + ':' + today.getMinutes();
	
}

// Functions for the Savings Calculator tool.

function calculateSavings() {

	var monthlyDrugSpend=550;
	var usingDiscountCard=true;
	var averageMonthlyPremium=32.20;
	var annualDrugCostWithoutInsuranceOrDiscounts=0;
	var annualDrugCostWithDiscounts=0;
	var totalOutofPocketExpense=0;
	var annualPremium=0;
	var deductible=250;
	var firstStageCoPay=0;
	var coverageGap=0;
	var catastrophicCoverageCoPay=0;
	var savingsPeryear=0;
	var percentSavingsPerYear=0;
	var today = new Date();
	var yes='Yes';

	monthlyDrugSpend = formatCleanRead(savingscalc.monthlydrugspend.value, 1);
	averageMonthlyPremium = savingscalc.averagemonthlypremium.value;

	//Calculate annual drug cost without insurance or discounts
	if(savingscalc.usecard.value == yes)
		annualDrugCostWithoutInsuranceOrDiscounts = monthlyDrugSpend*1.25*12;
	else
		annualDrugCostWithoutInsuranceOrDiscounts = monthlyDrugSpend*12;

	savingscalc.annualdrugcostwithoutinsuranceordiscounts.value = "$" + formatCurrency(roundAndString(annualDrugCostWithoutInsuranceOrDiscounts), 1);

	//Calculate annual drug cost with discounts
	annualDrugCostWithDiscounts = annualDrugCostWithoutInsuranceOrDiscounts*0.8;

	savingscalc.annualdrugcostwithdiscounts.value = "$" + formatCurrency(roundAndString(annualDrugCostWithDiscounts), 1);
	
	//Calcualte Annual Premium
	annualPremium=averageMonthlyPremium*12;

	savingscalc.annualpremium.value = "$" + formatCurrency(roundAndString(annualPremium), 1);

	//Calculate Deductible
	if(annualDrugCostWithDiscounts > 250) 
		deductible = 250;
	else 
		deductible = annualDrugCostWithDiscounts;

	savingscalc.deductible.value = "$" + formatCurrency(roundAndString(deductible), 1);

	//Calcualte first stage copay
	if(annualDrugCostWithDiscounts <= 250)
		firstStageCoPay = 0;
	else if (annualDrugCostWithDiscounts <= 2250)
		firstStageCoPay = (annualDrugCostWithDiscounts - 250)*0.25;
	else
		firstStageCoPay = 500;

	savingscalc.firststagecopay.value = "$" + formatCurrency(roundAndString(firstStageCoPay), 1);

	//Calcualte coverage gap 
	if(annualDrugCostWithDiscounts <= 2250)
		coverageGap = 0;
	else if (annualDrugCostWithDiscounts <= 5100)
		coverageGap = annualDrugCostWithDiscounts - 2250;
	else
		coverageGap = 2850;

	savingscalc.coveragegap.value = "$" + formatCurrency(roundAndString(coverageGap), 1);

	//Calcualte  catastrophic coverage copay
	if(annualDrugCostWithDiscounts <= 5100)
		catastrophicCoverageCoPay = 0;
	else
		catastrophicCoverageCoPay = (annualDrugCostWithDiscounts - 5100)*0.05;

	savingscalc.catastrophiccoveragecopay.value = "$" + formatCurrency(roundAndString(catastrophicCoverageCoPay), 1);

	//Calculate total out of pocket expense with standard Part D plan
	if (monthlyDrugSpend > 0) 
		totalOutofPocketExpense = annualPremium+deductible+firstStageCoPay+coverageGap+catastrophicCoverageCoPay;
	else
		totalOutofPocketExpense = 0;
	
	savingscalc.totaloutofpocketexpense.value = "$" + formatCurrency(roundAndString(totalOutofPocketExpense), 1);

	//Calculate savings per year
	savingsPeryear = annualDrugCostWithoutInsuranceOrDiscounts-totalOutofPocketExpense;
	
	savingscalc.savingsperyear.value = "$" + formatCurrency(roundAndString(savingsPeryear), 1);

	//Calculate percentage savings per year
	percentSavingsPerYear = roundAndString((savingsPeryear/annualDrugCostWithoutInsuranceOrDiscounts)*100);
	
	savingscalc.percentsavingsperyear.value = percentSavingsPerYear + "%";


	//Display current date and time
	savingscalc.date.value = today.getMonth() + 1 + '/' + today.getDate() + '/' + today.getFullYear() + ' ' + today.getHours() + ':' + today.getMinutes();

}


// Support Functions for the Penalty and Savings Calculator tools.

function validateNumber(fld, milSep, decSep, e) {
	var sep = 0;
	var key = '';
	var i = j = 0;
	var len = len2 = 0;
	var strCheck = '0123456789';
	var aux = aux2 = '';
	var whichCode = (window.Event) ? e.which : e.keyCode;
	if (whichCode == 13) return true;  // Enter
	key = String.fromCharCode(whichCode);  // Get key value from key code
	if (strCheck.indexOf(key) == -1) return false;  // Not a valid key
	else return key;
}

function currencyFormat(fld, milSep, decSep, e) {
	var sep = 0;
	var key = '';
	var i = j = 0;
	var len = len2 = 0;
	var strCheck = '0123456789';
	var aux = aux2 = '';
	var whichCode = (window.Event) ? e.which : e.keyCode;
	if (whichCode == 13) return true;  // Enter
	key = String.fromCharCode(whichCode);  // Get key value from key code
	if (strCheck.indexOf(key) == -1) return false;  // Not a valid key
	len = fld.value.length;
	for(i = 0; i < len; i++)
	if ((fld.value.charAt(i) != '0') && (fld.value.charAt(i) != decSep)) break;
	aux = '';
	for(; i < len; i++)
		if (strCheck.indexOf(fld.value.charAt(i))!=-1) aux += fld.value.charAt(i);
	aux += key;
	len = aux.length;
	if (len == 0) fld.value = '';
	if (len == 1) fld.value = '0'+ decSep + '0' + aux;
	if (len == 2) fld.value = '0'+ decSep + aux;
	if (len > 2)
	{
		aux2 = '';
		for (j = 0, i = len - 3; i >= 0; i--)
		{
			if (j == 3)
			 {
 				aux2 += milSep;
				j = 0;
			}
			aux2 += aux.charAt(i);
			j++;
		}
		fld.value = '';
		len2 = aux2.length;
		for (i = len2 - 1; i >= 0; i--)
			fld.value += aux2.charAt(i);
		fld.value += decSep + aux.substr(len - 2, len);
	}
	return false;
}

function roundAndString(num)
{
	var rlength = 2; // The number of decimal places to round to
	var newNumber = Math.round(num*Math.pow(10,rlength))/Math.pow(10,rlength);
	var newNumberStr = newNumber.toString();
	if((newNumberStr.lastIndexOf('.') >= 0) && (newNumberStr.lastIndexOf('.') == newNumberStr.length-2)) newNumberStr = newNumberStr+'0';
	return newNumberStr;
}


function getDecimalDelimiter(nCountryCode)
{

       var sRet='';

       switch (nCountryCode)
       {

            case 3:   
                           
                           sRet = '#';
                           break;
            
            case 2:   
                           
                           sRet = ',';
                           break;
            default:
                           sRet = '.';
                           break;
 
        }

      return sRet;

}

function getCommaDelimiter(nCountryCode) {

       var sRet='';

       switch (nCountryCode)
       {
            
            case 3:   
                           
                           sRet = '*';
                           break;
            case 2:   
                           
                           sRet = ',';
                           break;
            default:
                           sRet = ',';
                           break;
 
        }

      return sRet;

}

function formatClean(num, Decimal) {
     var sVal='';
     var nVal = num.length;
     var sChar='';
     
   try
   {
       for(i=0;i<nVal;i++)
      {
         sChar = num.charAt(i);
         nChar = sChar.charCodeAt(0);
         if ((nChar >=48) && (nChar <=57))  { sVal += num.charAt(i);   }
	 else if (nChar != Decimal.charCodeAt(0)) return '0';
      }
   }
    catch (exception) { alertError("Format Clean",e); }
    return sVal;
}
 

function formatCleanRead(num, nCountryCode) {
     var sVal='';
     var nVal = num.length;
     var sChar='';
     var Decimal = getDecimalDelimiter(nCountryCode); 
    
   try
   {
       for(i=0;i<nVal;i++)
      {
         sChar = num.charAt(i);
         nChar = sChar.charCodeAt(0);
         if (((nChar >=48) && (nChar <=57)) || nChar == Decimal.charCodeAt(0))  { sVal += num.charAt(i);   }
      }
   }
    catch (exception) { alertError("Format Clean",e); }
    return sVal;
}

 
function formatCurrency(num,nCountryCode) {       
        var sVal='';
        var minus='';
        var Decimal='';
        Decimal = getDecimalDelimiter(nCountryCode);
        if (num.lastIndexOf(Decimal) < 0) { num = num + '00'; }
	else if (num.lastIndexOf(Decimal) == num.length-2) { num = num + '0'; }
        num = formatClean(num, Decimal);
        sVal = minus + formatDollar(num,getCommaDelimiter(nCountryCode)) + getDecimalDelimiter(nCountryCode) + formatCents(num); 
        return sVal;
}


function formatCents(amount) {
     var cents = '';

      try
      {
           amount = parseInt(amount);
           var samount = new String(amount);

           if (samount.length == 0) { return '00'; }
           if (samount.length == 1) { return '0' + samount; }
           if (samount.length == 2) { return samount; }
         
           cents =  samount.substring(samount.length -2,samount.length);
          
      }
      catch (exception) { alertError("Format Cents",e); }
      return cents;
}

function formatDollar(amount,CommaDelimiter) {
   try 
   {
  
        amount = parseInt(amount);

        var samount = new String(amount);

        if (samount.length < 3) { return 0; }  

        samount =  samount.substring(0,samount.length -2);
             
        for (var i = 0; i < Math.floor((samount.length-(1+i))/3); i++)
        {
           samount = samount.substring(0,samount.length-(4*i+3)) + CommaDelimiter + samount.substring(samount.length-(4*i+3));
        }

   }
    catch (exception) { alertError("Format Comma",e); }
    return samount;
}

function alertError(MethodName,e) {
            if (e.description == null) { alert(MethodName + " Exception: " + e.message); }
            else {  alert(MethodName + " Exception: " + e.description); }
}

function clearField(field, defText) {
	if(field.value == defText)
		field.value = '';
}

function showDefault(field, defText) {
	if(field.value == '')
		field.value = defText;
}