try { console.assert(1); } catch(e) { console = { log: function() {}, assert: function() {} } }

Date.prototype.equalOrOlderThan = function(other) {
  return (this <= other);
}
Date.prototype.olderThan = function(other) {
  return (this < other);
}
Date.prototype.equalOrNewerThan = function(other) {
  return (this >= other);
}
Date.prototype.newerThan = function(other) {
  return (this > other);
}


if (typeof String.prototype.supplant == 'undefined') {
   String.prototype.supplant = function(o) {
     return this.replace(/{{([^{}]*)}}/g,
       function(a, b) {
         var r = o[b];
         return typeof r === 'string' ?
           r : a;
       }
     );  
   };
}




/*
function calculateBasePremium(covgAmt) {
  $.ajax({
    type: 'POST',
    data: { action: 'basePremium', 'coverage': covgAmt},
    url: "/wp-content/themes/thesis/custom/calculator/ajax.php",
    cache: false,
    beforeSend: function () {
     $('#recalcIcon').html('<img src="/wp-content/themes/thesis/custom/calculator/ajax-loader.gif"'); 
    },
    success: function(html) {
      $('#recalcIcon').html('');
      $('#basePremium').html(html);
    }
  });       
}
*/

function discountMult(oldDate) {
  ///console.log('oldDate',oldDate);
  
  if (oldDate.length == 0) {
    return 0;
  }
  //var test = oldDate.replace(/\//,'');
  
  var parts = oldDate.split('/');
  var month = parts[0];
  var day = parts[1];
  var year = parts[2];
  
  ///console.log('month',month,'day',day,'year',year);
  
  var then = new Date(year,month-1,day); //month is 0-11 in JS
  //console.log('then',then);
  
  var today = new Date();
  ///console.log('today',today);
  ///console.log('today.getDay',today.getDay());
  
  var y7ago = new Date(today.getFullYear()-7,today.getMonth(),today.getDate());
  var y6ago = new Date(today.getFullYear()-6,today.getMonth(),today.getDate());
  var y5ago = new Date(today.getFullYear()-5,today.getMonth(),today.getDate());
  var y4ago = new Date(today.getFullYear()-4,today.getMonth(),today.getDate());
  var y3ago = new Date(today.getFullYear()-3,today.getMonth(),today.getDate());
  var y2ago = new Date(today.getFullYear()-2,today.getMonth(),today.getDate());
  
  //console.log('7 ago',y7ago);
  //console.log('6 ago',y6ago);
  
  switch(true) {
    case (then.equalOrOlderThan(y7ago)):
		return 0;
   		break;
    case (then.equalOrOlderThan(y6ago) && then.newerThan(y7ago) ):
		return 0.15;
   		break;
    case (then.equalOrOlderThan(y5ago) && then.newerThan(y6ago) ):
		return 0.20;
   		break;
    case (then.equalOrOlderThan(y4ago) && then.newerThan(y5ago) ):
		return 0.25;
   		break;
    case (then.equalOrOlderThan(y3ago) && then.newerThan(y4ago) ):
		return 0.30;
   		break;
    case (then.equalOrOlderThan(y2ago) && then.newerThan(y3ago) ):
		return 0.35;
   		break;
    case (then.newerThan(y2ago) ):
		return 0.40;
   		break;
   	default: 
   		return 0;
   	}
   		    
}



function greater(a,b) {
  var result = a;
  if (b > a) {
    result = b;
  }
  return result;
}




var endorsement = function(spec) {
  var that = {};
  that.code = spec.code;
  that.desc = spec.desc;
  that.use = spec.use;
  that.checked = false;
  that.sp = spec.sp || false;
  that.cell = false; //the td table cell to update
  return that;
};

var calculator = function(spec) {
    

  var that = {};
  
  that.basePremiumForE = function(e) { return false;}; //stub
  
  
  that.endorsements = [
    endorsement({ code: 'SAOTP', desc: "Survey Amendment (Owner Title Policy)", sp: true, use: function() { return that.basePremiumForE(this).multiply(0.05); }   }),
    endorsement({ code: 'SALPE', desc: "Survey Amendment (Lender's Policy, No Charge)", use: function() { return 0; }   }),
    endorsement({ code: 'P-20', desc: "Tax Deletion", use: function() { return 20; }   }),
    endorsement({ code: 'P-29', desc: "Taxes Not Yet Due", use: function() { return 5; }   }),
    endorsement({ code: 'T-17', desc: "Planned Unit Development", use: function() { return 25; }   }),
    endorsement({ code: 'T-19', desc: "Restrictions, Encroachments, Minerals", use: function() {  var result = that.basePremiumForE(this).multiply(0.05); return greater(result,50);  }   }),
    endorsement({ code: 'T-19.1', desc: "Restrictions, Encroachments, Minerals (Owner's Title Policy)", sp: true, use: function() { var result = that.basePremiumForE(this).multiply(0.10); return greater(result,50); }   }),
    endorsement({ code: 'T-19.2', desc: "Minerals", use: function() { return 50; }   }),
    endorsement({ code: 'T-19.3', desc: "Minerals", use: function() { return 50; }   }),
    endorsement({ code: 'T-28', desc: "Condo (No Charge)", use: function() { return 0; }   }),
    endorsement({ code: 'T-31', desc: "Manufactured Housing Unit", use: function() { return 20; }   }),
    endorsement({ code: 'T-31.1', desc: "Manufactured Housing Unit", use: function() { return 50; }   }),
    endorsement({ code: 'T-33', desc: "Variable Rate Mortgage", use: function() { return 20; }   }),
    endorsement({ code: 'T-33.1', desc: "Negative Amortization", use: function() { return 20; }   }),
    endorsement({ code: 'T-36', desc: "Environmental Protection Lien", use: function() { return 25; }   }),
    endorsement({ code: 'T-38', desc: "Modification", use: function() { return 100; }   }),
    endorsement({ code: 'T-39', desc: "Balloon", use: function() { return 25; }   }),
    endorsement({ code: 'T-42', desc: "Equity Loan Mortgage", use: function() { return that.basePremiumForE(this).multiply(0.10); }   }),
    endorsement({ code: 'T-42.1', desc: "Supplemental Coverage Equity Loan Mortgage", use: function() { return that.basePremiumForE(this).multiply(0.15); } }),
    endorsement({ code: 'T-43', desc: "Reverse Mortgage (No Charge)", use: function() { return 0; } })
  ];


  that.renderBasePremium = function() {
    $('#basePremium').html(prettyNumber(that.basePremium()));
  };






  that.useR8Credit = spec['useR8Credit'];

  that.getBasePremium = function(coverage,callback) {
    $.ajax({
      type: 'POST',
      data: { action: 'basePremium', 'coverage': coverage},
      url: "/wp-content/themes/thesis/custom/calculator/ajax.php",
      cache: false,
      beforeSend: function () {
       $('#recalcIcon').html('<img src="/wp-content/themes/thesis/custom/calculator/ajax-loader.gif"'); 
      },
      success: function(json) {
        $('#recalcIcon').html('');
        //console.log(json);
        //console.log(json);
        json = eval('(' + json  + ')');
        //console.log(json.error);
        //console.log(json.debug);
        
        callback(rawNumber(json.premium));
      }
    });       
  };
  

  
    that.checkEndorsement = function(e) {
    e.checked = !e.checked;
    
    ///console.log('checked',e.checked);
    
    //console.log(e.code);
    /////var basePremium = $('#basePremium').html() || 0;
    that.renderBasePremium();
    that.updateTotalEndorsements(); //fixme: don't have sp yet!!
    that.updateTotalPremium();
    that.showCheckedEndorsementPrices();        
    that.hideUncheckedEndorsementPrices();
  };



  
  that.showCheckedEndorsementPrices = function () {
    //show checked endorsement prices
    $('.endorsement').each(function(i,e) {
      var code = e.id.replace(/endorsement-/,'');
      var td = document.getElementById('endorsement-price-' + code);
      //console.log(e);
    	$(td).css('color','white');
    });
  
  
  };
  

  that.hideUncheckedEndorsementPrices = function () {
      //hide unchecked endorsement prices
      
    $(that.endorsements).each(function(i,e) {
      if (e.checked) {
        e.cell.css('color','black');
      }
    });
          
  };


  that.updateTotalEndorsements = function() {
    $('#totalEndorsements').html(prettyNumber(that.getTotalEndorsements()));
  };  
  
  that.getTotalEndorsements = function() {
    	//$('#totalEndorsements').html('');
    var total = 0;
    //console.log(typeof basePremium,'basePremium**',basePremium);
    
    $(that.endorsements).each(function(i,e) {
      if (e.checked) {
      	total = total.plus(e.use().multiply(1.00));
      }
    });
    
    ////console.log('total',total);
    return total;  
  };


  that.buildEndorsementsTable = function() {
    
  	var table = $('table#endorsements');

    //fixme, remove template if it works
  	var template = '<tr><td><input type="checkbox" name="endorsement-{{code}}" class="endorsement" id="endorsement-{{code}}" onclick="theCalculator.checkEndorsement(\'{{code}}\')" /></td>' + 
  	  '<td class="code">{{displayCode}}</td><td class="tdFudge description">{{desc}}</td><td class="endorsementPrice" id="endorsement-price-{{code}}"></td></tr>';

    $(that.endorsements).each(function (i,e) {

      ///console.log('build',i,e);
      var disp = e.code;
      if (disp.substr(1,1) != '-') {
        disp = '&nbsp;';
      }
      var tr = $('<tr>');        
      var td = $('<td>');
      var input = $('<input type="checkbox" name="endorsement-' + e.code + '" class="endorsement" id="endorsement-' + e.code + '" />');
      input.click(function() {
        that.checkEndorsement(e);
      });
      ///console.log(input);
      td.append(input);
      tr.append(td);
      //console.log(td);
      //console.log(tr);

      td = $('<td>');
      td.addClass ('code');
      td.html(disp);
      tr.append(td);

      td = $('<td>');
      td.addClass('tdFudge');
      td.addClass('description');
      td.html(e.desc);
      tr.append(td);

      td = $('<td>');
      td.addClass('endorsementPrice');
      td.attr('id','endorsement-price-' + e.code);
      e.cell = td;
      tr.append(td);
      //console.log(td);
      
      table.append(tr);   
    });
    
    //console.log('table',table);
    
    var tr = $('<tr><td></td><td><td id="lblTotalEndorsements" class="tdFudge">Total Endorsements</td></td><td id="totalEndorsements">0</td></tr>');
    table.append(tr);
    
    
  };


  that.updateEndorsementsTable = function() {
    $(that.endorsements).each(function(i,e) {
      e.cell.html(prettyNumber(e.use()));
    });  
  };

    
  return that;
};


var refiHECalculator = function(spec) {
  var that = calculator(spec);

  that.myBasePremium = 0;
  

  that.shouldUseSalsePrice = function() {
    return false;
  };
  

  that.basePremiumForE = function(e) {
    return that.myBasePremium;
  };

  that.basePremium = function(e) {
    return that.myBasePremium;
  };




  that.calculatePremium = function() {
      
      var oldDate = $('#oldDate').val();
      var mult = discountMult(oldDate);
      var covgAmt = $('#covgAmt').val();
      var payoffBal = $('#payoffBal').val() || 0;  
      var r8Credit = 0;
      var payoffBase = 0;
      var totalEndorsements = 0;
      var totalPremium = 0;
      
      //console.log(typeof payoffBal,'payoff',payoffBal);
    
      payoffBal = rawNumber(payoffBal);
      //console.log('before',covgAmt);
      covgAmt = rawNumber(covgAmt);
      //console.log('after',covgAmt);
    
    
    
      that.getBasePremium(covgAmt,function(basePremium) {
        ///console.log(typeof basePremium,'*b basePremium',basePremium);
      
        that.myBasePremium = basePremium;
      
      	$('#basePremium').html(prettyNumber(basePremium));
      	$('#discountPercentage').html(String(100 * mult) + '%');
      
        //console.log('payoffBal',payoffBal);
    	  that.getBasePremium(payoffBal,function(payoffBase) {
        if (that.useR8Credit) {
      		r8Credit = payoffBase.multiply(mult);
    	   	$('#r8Credit').html(prettyNumber(r8Credit));
        }
    	  that.updateEndorsementsTable();
    	  totalEndorsements = that.getTotalEndorsements(); //refi, so it's ok to pass it twice
        $('#totalEndorsements').html(prettyNumber(totalEndorsements));
        
        that.updateTotalPremium();
    
    	  }); //getBasePrem payoffBase
      
      });//getBasePrem covgAmt
      
    };
  
  that.updateTotalPremium = function() {
    
  	var basePremium = rawNumber($('#basePremium').html());
  	var totalEndorsements = rawNumber($('#totalEndorsements').html());
  
    var totalPremium = basePremium.plus(totalEndorsements);
  
    if (that.useR8Credit) {
      var r8Credit = rawNumber($('#r8Credit').html());      
      totalPremium = totalPremium.minus(r8Credit);
    }
  
    $('#totalPremium').html(prettyNumber(totalPremium));
  
  };

  return that;
};





var purchaseCalculator = function(spec) {

  var that = calculator(spec);

  var mortgageesPolicy = 100;

  that.laBasePremium = 0;
  that.spBasePremium = 0;
  that.lastShould = false;


  that.shouldUseSalesPrice = function() {
    var result = false;

    $(that.endorsements).each(function(i,e) {
      if (e.checked && e.sp) {
        result = true;
      }
    
    });
  
  
    console.log('should use salesPrice:',result);
  
    return result;
  
  };


  that.basePremiumV2 = function() {
    if (that.shouldUseSalesPrice()) {
      return that.spBasePremium;
    }
    else {
      return that.laBasePremium;
    }
  };


  that.basePremium = function() {
    return greater(that.spBasePremium,that.laBasePremium);
  };


  that.basePremiumForE = function(e) {
    if (e.sp) {
      return that.spBasePremium;
    }
    else {
      return that.laBasePremium;  
    }
  };




  that.calculatePremium = function() {    
    //console.log('cp');
    var salesPrice = $('#salesPrice').val();
    var loanAmt = $('#loanAmt').val();
  
    salesPrice = rawNumber(salesPrice);
    loanAmt = rawNumber(loanAmt);

    
    var totalEndorsements = 0;
    var totalPremium = 0;
    
  
    that.getBasePremium(loanAmt,function(laBP) {

      that.laBasePremium = laBP;
    
      that.getBasePremium(salesPrice,function(spBP) {
      
        that.spBasePremium = spBP;
    
        ///console.log(typeof basePremium,'*b basePremium',basePremium); 
      	that.renderBasePremium();
    	  that.updateEndorsementsTable();
    	  totalEndorsements = that.getTotalEndorsements();
        $('#totalEndorsements').html(prettyNumber(totalEndorsements));      
        that.updateTotalPremium();
    
      });    
    
    });
    
  };



  that.updateTotalPremium = function() {
    
  	var basePremium = rawNumber($('#basePremium').html());

  	///console.log(r8Credit);
  	var totalEndorsements = rawNumber($('#totalEndorsements').html());
  
    var totalPremium = basePremium.plus(totalEndorsements);  
    totalPremium = totalPremium.plus(mortgageesPolicy);
  
    $('#totalPremium').html(prettyNumber(totalPremium));
  
  };


  return that;
}






function prettyNumber(mustBeANumber) {
  var str = mustBeANumber.toFixed(2);
  return commafyValue(str);
}

function rawNumber(aStringOrNumber) {
  var result = String(aStringOrNumber);
  result = result.replace(/[$,]/g,'');
  result = Math.abs(result);
  return result;
}


function OLDupdateEndorsementsTotal(basePremium) {
  	//$('#endorsementsTotal').html('');
  var total = 0;
  //console.log(typeof basePremium,'basePremium**',basePremium);
  $('.endorsement:checked').each(function(i,e) {
    var code = e.id.replace(/endorsement-/,'');
	total = total.plus(endorsements[code].use(basePremium).multiply(1.00));
  });
  ////console.log('total',total);
  
  $('#endorsementsTotal').html(prettyNumber(total));
  
}



function datifyValue(s) {
  

  function helper(s,level) {  
    //////console.log('s:',s,'level:',level);  
    var car,cdr,parts;
    
    if (s.length == 0) {
      return '';
    }
    if (s.length == 1) {
      return s;
    }    
    if (s.indexOf('/') != -1 ) {      //slashes found
      parts = s.split(/\//);
      car = parts.shift();
      cdr = parts.join('/');
    }  
    else {      //no slashes found
      if (level == 2) {
        return s;
      }
      car = s.substr(0,2);
      cdr = s.substr(2);
    }      

    if (cdr == '') {
      return s;
    }
    else {
      return car + '/' + helper(cdr,level + 1);  
    }

  }

  return helper(s,0);

}




 function commafyValue(s)
 {
   //console.log(s);
   var n = s.replace(/,/g,'');
   //console.log('n:',n);
   
	var dotIndex = n.indexOf('.');
	if (dotIndex > 0) {
		var left = n.substr(0,dotIndex);
		var right = n.substr(dotIndex,n.length-dotIndex);	
		return commafyValue(n.substr(0,dotIndex)) + right;
	}
   
   var len = n.length;
   if (len < 4)
    return n;
   else {
     var right = n.substr(len-3,3);
     var left = n.substr(0,len-3);
     ///console.log('left:',left,'right:',right);
     return commafyValue(left) + ',' + right;
   }
 }

$(document).ready(function() {
      $('.moneyInput').keypress(function(event) {
        var c = event.which;  
        //alert(c);
        if (c <= 13) return true;
        if (c == 44) return true;
        if (c == 46) return true;
        if (c < 48 || c > 57) {
            return false; 
        }    

        //disallow a 3rd number after the decimal point.
        if (/\.\d{2}$/.exec(this.value) && c >= 48 && c <= 57) {
          return false;
        }


      });  
      
      
       
      $('.moneyInput').keyup(function() { 
        ///console.log($(this).val());
        $(this).val(commafyValue($(this).val()));
      });
      $('.date-pick').keyup(function() {
        $(this).val(datifyValue($(this).val()));
      });
      
      
});
