



function MM_reloadPage(init) {  //reloads the window if Nav4 resized
  if (init==true) with (navigator) {if ((appName=="Netscape")&&(parseInt(appVersion)==4)) {
    document.MM_pgW=innerWidth; document.MM_pgH=innerHeight; onresize=MM_reloadPage; }}
  else if (innerWidth!=document.MM_pgW || innerHeight!=document.MM_pgH) location.reload();
}
MM_reloadPage(true);
// -->

function MM_preloadImages() { //v3.0
  var d=document; if(d.images){ if(!d.MM_p) d.MM_p=new Array();
    var i,j=d.MM_p.length,a=MM_preloadImages.arguments; for(i=0; i<a.length; i++)
    if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}}
}

function MM_swapImgRestore() { //v3.0
  var i,x,a=document.MM_sr; for(i=0;a&&i<a.length&&(x=a[i])&&x.oSrc;i++) x.src=x.oSrc;
}

function MM_findObj(n, d) { //v4.0
  var p,i,x;  if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
    d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
  if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
  for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
  if(!x && document.getElementById) x=document.getElementById(n); return x;
}

function MM_swapImage() { //v3.0
  var i,j=0,x,a=MM_swapImage.arguments; document.MM_sr=new Array; for(i=0;i<(a.length-2);i+=3)
   if ((x=MM_findObj(a[i]))!=null){document.MM_sr[j++]=x; if(!x.oSrc) x.oSrc=x.src; x.src=a[i+2];}
}

function calrrsp(form1,text,inc)
{
    if((isNaN(text)==true) || (isNaN(inc)==true))
    {
        alert("Enter a valid number")
        form1.input.value=""
        form1.input2.value=""
        form1.result.value=""
        form1.input.focus()
    } else {
        rrsp=eval(text)
        income=eval(inc)
        if((rrsp<0) || (income<0)) {
            alert("Amount should be more than $0")
            form1.input.value=""
            form1.input2.value=""
            form1.result.value=""
            form1.input.focus()
        } else {
            if(rrsp>income) {
                alert("RRSP Contribution Amount should be less than Income")
                form1.input.value=""
                form1.input2.value=""
                form1.result.value=""
                form1.input.focus()
            } else {
				// Provincial Rate
				if(income <=36020) {
					 ProvRate = 6.05;
				} else if (income >36020 && income <=72041) {
	                 ProvRate = 9.15;
				} else if (income > 72041) {
					 ProvRate = 11.16;
            	}
				// Federal Rate
				if(income <=37885) {
					 FedRate = 15;
				} else if (income >37885 && income <=75769) {
	                 FedRate = 22;
				} else if (income >75769 && income <=123184) {
					 FedRate = 26;
				} else if (income > 123184) {
					 FedRate = 29;
	            }
			}
			Rate = ProvRate + FedRate;
			TaxSavings = rrsp * Rate/100 ;
            tempsav=Math.round(eval(TaxSavings*100))
            TaxSavings=eval(tempsav/100)
            form1.result.value=TaxSavings
            form1.input.focus()
    	}//rrsp>income
    }//rrsp or income -ve
}//end




function entsub(myform)
{
    if(window.event && window.event.keyCode ==13)
    {
        //alert("rrsp is  and rate is " )
        calrrsp(myform,myform.input.value,myform.input2.value)
        //return true
    }
    else
        return true;

}

// Calculator ---Ash
// Class to represent one tax slab
   function LimitAndRate()
    {
      this.higherLimit;//Max limit of the slab
      this.rate;
      this.preTax;//
    }

// Class to represent provincial tax rate slabs
    function ProvTaxRates()
    {
      this.count;
      this.province;
      var lRateArray;
	  this.basicAmount;
    }

   //NewFoundLand  Tax Rates
    var lmtRate1=new LimitAndRate();
    lmtRate1.higherLimit=30215;// Higher limit of slab one
    lmtRate1.rate=8.2;//  Tax rate of slab one
    lmtRate1.preTax=0;// Precalculted tax of previous slab

    var lmtRate2=new LimitAndRate();// Slab two
    lmtRate2.higherLimit=60429;
    lmtRate2.rate=13.3;
    lmtRate2.preTax=2477.63;

    var lmtRate3=new LimitAndRate();
    lmtRate3.higherLimit=99999999;
    lmtRate3.rate=16;
    lmtRate3.preTax=6496.46;




    var nl=new ProvTaxRates();// Object containing info of Tax rules for a particular province such as tax slabs, province code
    nl.count=3;// Number of tax slabs
    nl.province="#NL";// Province code
	nl.basicAmount=7566;
    nl.lRateArray=new Array(lmtRate1,lmtRate2,lmtRate3);// Array of tax slabs

    //PrinceEdward Island  Tax Rates
    var lmtRate1=new LimitAndRate();
    lmtRate1.higherLimit=31984;
    lmtRate1.rate=9.8;
    lmtRate1.preTax=0;

    var lmtRate2=new LimitAndRate();
    lmtRate2.higherLimit=63969;
    lmtRate2.rate=13.8;
    lmtRate2.preTax=3134;

    var lmtRate3=new LimitAndRate();
    lmtRate3.higherLimit=99999999;
    lmtRate3.rate=16.7;
    lmtRate3.preTax=7548;

    var pe=new ProvTaxRates();
    pe.count=3;
    pe.province="#PE";
	pe.basicAmount=7708;
    pe.lRateArray=new Array(lmtRate1,lmtRate2,lmtRate3);


    //Nova Scotia  Tax Rates

    var lmtRate1=new LimitAndRate();
    lmtRate1.higherLimit=29590;
    lmtRate1.rate=8.79;
    lmtRate1.preTax=0;

    var lmtRate2=new LimitAndRate();
    lmtRate2.higherLimit=59180;
    lmtRate2.rate=14.95;
    lmtRate2.preTax=2601;

    var lmtRate3=new LimitAndRate();
    lmtRate3.higherLimit=93000;
    lmtRate3.rate=16.67;
    lmtRate3.preTax=7025;

    var lmtRate4=new LimitAndRate();
    lmtRate4.higherLimit=99999999;
    lmtRate4.rate=17.5;
    lmtRate4.preTax=12662;

    var ns=new ProvTaxRates();
    ns.count=4;
    ns.province="#NS";
	ns.basicAmount=7731;
    ns.lRateArray=new Array(lmtRate1,lmtRate2,lmtRate3,lmtRate4);

    //New Brunswick  Tax Rates
    var lmtRate1=new LimitAndRate();
    lmtRate1.higherLimit=34836;
    lmtRate1.rate=10.12;
    lmtRate1.preTax=0;

    var lmtRate2=new LimitAndRate();
    lmtRate2.higherLimit=69673;
    lmtRate2.rate=15.48;
    lmtRate2.preTax=3525;

    var lmtRate3=new LimitAndRate();
    lmtRate3.higherLimit=113273;
    lmtRate3.rate=16.8;
    lmtRate3.preTax=8918;

    var lmtRate4=new LimitAndRate();
    lmtRate4.higherLimit=99999999;
    lmtRate4.rate=17.95;
    lmtRate4.preTax=16243;


    var nb=new ProvTaxRates();
    nb.count=4;
    nb.province="#NB";
	nb.basicAmount=8395;
    nb.lRateArray=new Array(lmtRate1,lmtRate2,lmtRate3,lmtRate4);

    //Ontario  Tax Rates
    var lmtRate1=new LimitAndRate();
    lmtRate1.higherLimit=36020;
    lmtRate1.rate=6.05;
    lmtRate1.preTax=0;

    var lmtRate2=new LimitAndRate();
    lmtRate2.higherLimit=72041;
    lmtRate2.rate=9.15;
    lmtRate2.preTax=2179;

    var lmtRate3=new LimitAndRate();
    lmtRate3.higherLimit=99999999;
    lmtRate3.rate=11.16;
    lmtRate3.preTax=5475;


    var on=new ProvTaxRates();
    on.count=3;
    on.province="#ON";
	on.basicAmount=8681;
    on.lRateArray=new Array(lmtRate1,lmtRate2,lmtRate3);

     //Manitoba  Tax Rates
    var lmtRate1=new LimitAndRate();
    lmtRate1.higherLimit=30544;
    lmtRate1.rate=10.9;
    lmtRate1.preTax=0;

    var lmtRate2=new LimitAndRate();
    lmtRate2.higherLimit=66000;
    lmtRate2.rate=12.75;
    lmtRate2.preTax=3329;

    var lmtRate3=new LimitAndRate();
    lmtRate3.higherLimit=99999999;
    lmtRate3.rate=17.4;
    lmtRate3.preTax=7850;


    var mb=new ProvTaxRates();
    mb.count=3;
    mb.province="#MB";
	mb.basicAmount=8034;
    mb.lRateArray=new Array(lmtRate1,lmtRate2,lmtRate3);

  //Saskatchewan   Tax Rates
    var lmtRate1=new LimitAndRate();
    lmtRate1.higherLimit=39135;
    lmtRate1.rate=11;
    lmtRate1.preTax=0;

    var lmtRate2=new LimitAndRate();
    lmtRate2.higherLimit=111814;
    lmtRate2.rate=13;
    lmtRate2.preTax=4305;

    var lmtRate3=new LimitAndRate();
    lmtRate3.higherLimit=99999999;
    lmtRate3.rate=15;
    lmtRate3.preTax=13753;


    var sk=new ProvTaxRates();
    sk.count=3;
    sk.province="#SK";
	sk.basicAmount=12945;
    sk.lRateArray=new Array(lmtRate1,lmtRate2,lmtRate3);

//Alberta   Tax Rates
    var lmtRate1=new LimitAndRate();
    lmtRate1.higherLimit=99999999;
    lmtRate1.rate=10;
    lmtRate1.preTax=0;



    var ab=new ProvTaxRates();
    ab.count=1;
    ab.province="#AB";
	ab.basicAmount=16161;
    ab.lRateArray=new Array(lmtRate1);

//British Columbia  Tax Rates
    var lmtRate1=new LimitAndRate();
    lmtRate1.higherLimit=35016;
    lmtRate1.rate=5.06;
    lmtRate1.preTax=0;

    var lmtRate2=new LimitAndRate();
    lmtRate2.higherLimit=70033;
    lmtRate2.rate=7.7;
    lmtRate2.preTax=1772;

    var lmtRate3=new LimitAndRate();
    lmtRate3.higherLimit=80406;
    lmtRate3.rate=10.5;
    lmtRate3.preTax=4468;

    var lmtRate4=new LimitAndRate();
    lmtRate4.higherLimit=97636;
    lmtRate4.rate=12.29;
    lmtRate4.preTax=5557;

    var lmtRate5=new LimitAndRate();
    lmtRate5.higherLimit=99999999;
    lmtRate5.rate=14.7;
    lmtRate5.preTax=7675;


    var bc=new ProvTaxRates();
    bc.count=5;
    bc.province="#BC";
	bc.basicAmount=9189;
    bc.lRateArray=new Array(lmtRate1,lmtRate2,lmtRate3,lmtRate4,lmtRate5);

//Northwest Territories  Tax Rates

    var lmtRate1=new LimitAndRate();
    lmtRate1.higherLimit=35986;
    lmtRate1.rate=5.9;
    lmtRate1.preTax=0;

    var lmtRate2=new LimitAndRate();
    lmtRate2.higherLimit=71973;
    lmtRate2.rate=8.6;
    lmtRate2.preTax=2123;

    var lmtRate3=new LimitAndRate();
    lmtRate3.higherLimit=117011;
    lmtRate3.rate=12.2;
    lmtRate3.preTax=5218;

    var lmtRate4=new LimitAndRate();
    lmtRate4.higherLimit=99999999;
    lmtRate4.rate=14.05;
    lmtRate4.preTax=10713;

    var nt=new ProvTaxRates();
    nt.count=4;
    nt.province="#NT";
	nt.basicAmount=12355;
    nt.lRateArray=new Array(lmtRate1,lmtRate2,lmtRate3,lmtRate4);

//Yukon Tax Rates

    var lmtRate1=new LimitAndRate();
    lmtRate1.higherLimit=37885;
    lmtRate1.rate=7.04;
    lmtRate1.preTax=0;

    var lmtRate2=new LimitAndRate();
    lmtRate2.higherLimit=75769;
    lmtRate2.rate=9.68;
    lmtRate2.preTax=2667;

    var lmtRate3=new LimitAndRate();
    lmtRate3.higherLimit=123184;
    lmtRate3.rate=11.44;
    lmtRate3.preTax=6334;

    var lmtRate4=new LimitAndRate();
    lmtRate4.higherLimit=99999999;
    lmtRate4.rate=12.76;
    lmtRate4.preTax=11759;

    var yt=new ProvTaxRates();
    yt.count=4;
    yt.province="#YT";
	yt.basicAmount=9600;
    yt.lRateArray=new Array(lmtRate1,lmtRate2,lmtRate3,lmtRate4);

//Nunavut Tax Rates

    var lmtRate1=new LimitAndRate();
    lmtRate1.higherLimit=37885;
    lmtRate1.rate=4;
    lmtRate1.preTax=0;

    var lmtRate2=new LimitAndRate();
    lmtRate2.higherLimit=75769;
    lmtRate2.rate=7;
    lmtRate2.preTax=1515;

    var lmtRate3=new LimitAndRate();
    lmtRate3.higherLimit=123184;
    lmtRate3.rate=9;
    lmtRate3.preTax=4167;

    var lmtRate4=new LimitAndRate();
    lmtRate4.higherLimit=99999999;
    lmtRate4.rate=11.5;
    lmtRate4.preTax=8435;

    var nu=new ProvTaxRates();
    nu.count=4;
    nu.province="#NU";
	nu.basicAmount=11360;
    nu.lRateArray=new Array(lmtRate1,lmtRate2,lmtRate3,lmtRate4);

    //Federal Tax Rates

    var lmtRate1=new LimitAndRate();
    lmtRate1.higherLimit=37885;
    lmtRate1.rate=15;
    lmtRate1.preTax=0;

    var lmtRate2=new LimitAndRate();
    lmtRate2.higherLimit=75769;
    lmtRate2.rate=22;
    lmtRate2.preTax=5683;

    var lmtRate3=new LimitAndRate();
    lmtRate3.higherLimit=123184;
    lmtRate3.rate=26;
    lmtRate3.preTax=14017;

    var lmtRate4=new LimitAndRate();
    lmtRate4.higherLimit=99999999;
    lmtRate4.rate=29;
    lmtRate4.preTax=26345;

    var fe=new ProvTaxRates();
    fe.count=4;
    fe.province="#FE";
	fe.basicAmount=9600;
    fe.lRateArray=new Array(lmtRate1,lmtRate2,lmtRate3,lmtRate4);


    var provArr=new Array(nl,pe,ns,nb,on,mb,sk,ab,bc,nt,yt,nu,fe);// Array containg taxRule objects
    function GetTaxRules(prov)
    {
    for(i=0;i<provArr.length;i++)
        {
        if(provArr[i].province==prov)

            return provArr[i];

        }
    }


        function intializeVal(form)
        {
            form.input.value=""
            form.input2.value=""
            form.result.value="0"
            form.input.focus()
        }

     function isEmpty(txtField)
     {
         var re=/\s/g;
         var str=txtField.replace(re,"");
         if(str.length==0)
          {
            return true;
          }
         else
          {
            return false;
           }
     }

  function calrrspNew(form1,text,inc,prov)
   {

       if(prov=="#XX")
        {
            alert("Choose Province of your residence First..")
            form1.province.focus()
            return;
        }
        if(isEmpty(inc))
         {
            alert("Enter a valid income...");
            form1.input2.focus();
            return;
          }

        if(isEmpty(text))
        {
          alert("Enter a valid RRSP contribution..")
           form1.input.focus();
          return;
        }
       if((isNaN(text)==true) || (isNaN(inc)==true))
        {
            alert("Enter a valid number..")
            intializeVal(form1)
            return;
        }
        rrsp=eval(text)
        income=eval(inc)

       if((rrsp<0) || (income<0))
        {
            alert("Amount should be more than $0")
            intializeVal(form1)
            return;
        }
       if(rrsp>income)
        {
            alert("RRSP Contribution Amount should be less than Income")
            form1.input.focus();
            return;
        }
		var taxRulesProv ;
		if(prov=="#QC")
		{
			taxRulesProv=GetTaxRules("#FE");
		}
		else
		{
			taxRulesProv = GetTaxRules(prov);
		}
		var taxRulesFed=GetTaxRules("#FE");
		var proSaving=0;
		var incomeABProv=income-taxRulesProv.basicAmount;
		var incomeABFed=income-taxRulesFed.basicAmount;
		var incomeAfterRSSPProv=incomeABProv-rrsp;
		var incomeAfterRRSPFed=incomeABFed-rrsp;
		if(incomeABProv>0)
		{
			proSaving=CalculateTaxNew(incomeABProv,prov)-CalculateTaxNew(incomeAfterRSSPProv,prov);
		}
		var fedSaving=0;
		if(incomeABFed>0)
		{
			fedSaving=CalculateTaxNew(incomeABFed,"#FE")-CalculateTaxNew(incomeAfterRRSPFed,"#FE");
		}
        if(proSaving<0) proSaving=0;
		if(fedSaving<0)fedSaving=0;
        var totalSaving=proSaving+fedSaving;
        if(prov=="#QC") totalSaving=totalSaving+" (Federal only)";
        form1.result.value=totalSaving;
    }
function CalculateTaxNew(income,prov)
    {
		if(income<=0) return 0;
        var taxRules = GetTaxRules(prov);
        if(taxRules==null) return 0;
			
        var tax=0;
        var cnt=taxRules.count;
        var i=0;
        while((income>taxRules.lRateArray[i].higherLimit) && (cnt>0) )
        {
            i++;
            cnt--;
        }
        if(i==0)
        {
           tax=tax+income*taxRules.lRateArray[0].rate/100;
         }
        else
        {
        tax=tax+taxRules.lRateArray[i].preTax;
        income=income-taxRules.lRateArray[i-1].higherLimit;
        tax=tax+income*taxRules.lRateArray[i].rate/100;
         }
       return(Math.round(tax));
    }

function maskKeyPress(objEvent)
     {
       var iKeyCode;
       //alert( objEvent.keyCode);
       iKeyCode = objEvent.keyCode;
       if((iKeyCode>=48 && iKeyCode<=57)||iKeyCode==46) return true;
       objEvent.keyCode=0;
       return false;
     }

