function formatCurrency(value, blankIfZero) { if (blankIfZero==null) blankIfZero=false; var num = toNumber(value); if (num==0 && blankIfZero) { return ''; } return formatNumber(toNumber(value), '2', ',', '.', '$', '', '-', ''); } function formatCurrencyNoDecimals(value) { if (value.length==0) { return ''; } return formatNumber(toNumber(value), '0', ',', '.', '', '', '-', ''); } function formatNumberNoDecimals(value) { if (value.length==0) { return ''; } return formatNumber(toNumber(value), '0', ',', '', '', '', '-', ''); } function formatNumberTwoDecimals(value, blankIfZero) { if (blankIfZero==null) blankIfZero=false; var num = toNumber(value); if (num==0 && blankIfZero) { return ''; } return formatNumber(toNumber(value), '2', ',', '.', '', '', '-', ''); } function formatIfNeg(el, val, red) { if (red==null) red=false; var nval = toNumber(val); if (nval < 0) { if (val.indexOf("-")>=0) { val = val.replace('-', ''); } if (red) { el.style.color='#ff0000'; } el.innerHTML = '(' + val + ')'; } else { el.style.color='#000'; el.innerHTML = val; } } function formatNumberThreeDecimals(value, blankIfZero) { if (blankIfZero==null) blankIfZero=false; var num = toNumber(value); if (num==0 && blankIfZero) { return ''; } return formatNumber(toNumber(value), '3', ',', '.', '', '', '-', ''); } function toNumber(input) { input = new String(input); var n = new Number(input.replace('$', '').replace(/,/g, '')); if (isNaN(n)) n=0; return n; } function toggleBlind(shade, userID, borrowerID) { var duration = 200; var shadeID = '#' + shade; var el = $(shadeID)[0]; var isClosed = el.style.display=='none'; $(shadeID).animate({ height: 'toggle' }, {duration:duration}); img = $(shadeID + 'Arrow')[0]; if (img) { if (isClosed) { img.src = '../images/icon_shadearrow_up.gif'; } else { img.src = '../images/icon_shadearrow_down.gif'; } } saveAction(shade, userID, borrowerID, isClosed); } function saveAction(shade, userID, borrowerID, open) { $.post('ShadeUpdate.do', { SubmitToken: '${SubmitToken}', shade: shade, userID: userID, borrowerID: borrowerID, open: open }, function(data) { }, 'json' ); } // J = monthlyInterest, N = lengthInMonths, P = principal function calculatePAndI(principal, annualInterest, lengthInMonths) { annualInterest /= 1200.0; return principal * (annualInterest / (1-(Math.pow(1+annualInterest, -lengthInMonths)))); } function calculateLoanBalance(principal, annualInterest, lengthInMonths, paymentsMade) { annualInterest /= 1200.0; return principal * (1 - (Math.pow((1 + annualInterest), paymentsMade) - 1) / (Math.pow((1 + annualInterest), lengthInMonths)-1)); } // current balance plus two months' interest function calculatePayoff(balance, loanAmount, annualInterest, skippedPayments, rollEscrowAmount) { return balance + (loanAmount * ((annualInterest/36500) * skippedPayments * 30)) - rollEscrowAmount; } function changeTextbox(box, oldText, oldClass, newClass) { if (box.val().trim()==oldText) { box.val(""); } box.removeClass(oldClass); box.addClass(newClass); } String.prototype.trim = function () { return this.replace(/^\s*/, "").replace(/\s*$/, ""); } function resetTextbox(box, oldText, oldClass) { if (box.val().trim().length==0 || box.val().trim()==oldText) { box.addClass(oldClass); box.val(oldText); } } function formatPhoneNumber(str) { str = str.replace(/\(/g, '').replace(/\)/g, '').replace(/\-/g, '').replace(/ /g, ''); var postfix=''; if (str.length>10) { postfix = ' ' + str.substring(10); str = str.substring(0, 10); } if (str.length < 7) { } else if (str.length < 10) { str = str.substring(0, 3) + '-' + str.substring(3, 7) + ' ' + str.substring(7); } else { str = str.substring(0, 3) + '-' + str.substring(3,6) + '-' + str.substring(6); } str += postfix; return str; } function canonizePhoneNumber(str) { str = str.replace(/\(/g, '').replace(/\)/g, '').replace(/\-/g, '').replace(/ /g, ''); var postfix=''; if (str.length>10) { postfix = ' ' + str.substring(10); str = str.substring(0, 10); } return str + postfix; } // number formatting function // copyright Stephen Chapman 24th March 2006, 10th February 2007 // permission to use this function is granted provided // that this copyright notice is retained intact // num = the number // dec = num decimal places // thou = thousands separator // pnt = decimal point character ('.') // curr1 = currency symbol on left side // curr2 = currency symbol on right side // n1 = negative symbol on left side // n1 = negative symbol on right side function formatNumber(num,dec,thou,pnt,curr1,curr2,n1,n2) {var x = Math.round(num * Math.pow(10,dec));if (x==Infinity||-x==Infinity) return x; if (x >= 0) n1=n2='';var y = (''+Math.abs(x)).split('');var z = y.length - dec; if (z<0) z--; for(var i = z; i < 0; i++) y.unshift('0');y.splice(z, 0, pnt); if(y[0] == pnt) y.unshift('0'); while (z > 3) {z-=3; y.splice(z,0,thou);}var r = curr1+n1+y.join('')+n2+curr2;return r;} // another Stephen Chapman: http://javascript.about.com/library/bladdjs.htm function addJavascript(jsname) { var th = document.getElementsByTagName('head')[0]; var s = document.createElement('script'); s.setAttribute('type','text/javascript'); s.setAttribute('src',jsname); th.appendChild(s); } // generally d1 is farther in the past function monthsDifference(d1, d2) { var d1Num = d1.getFullYear() * 12 + d1.getMonth(); var nowNum = d2.getFullYear() * 12 + d2.getMonth(); var diff = nowNum - d1Num; return diff - (d2.getDate() > d1.getDate() ? 0 : 1); } // used in LeadList.jsp String.prototype.endsWith = function(pattern) { var d = this.length - pattern.length; return d >= 0 && this.lastIndexOf(pattern) === d; } function getMonthsInLoan(mc, yc) { var monthsInLoan = 0; if (mc>0 && yc>0) { var formats = new Array('M/yyyy', 'M/d/yyyy'); var dateClosedStr = "" + mc + "/" + yc; var dateClosed = new Date(getDateFromFormatArr(dateClosedStr,formats)); if (dateClosed!=null && dateClosed!=0 && dateClosed.getFullYear()>1970) { monthsInLoan = monthsDifference(dateClosed, new Date()) - 2; } } return monthsInLoan; } function getMonthObj(m) { return new Date(getDateFromFormat(m, 'M')); } // this algorithm looks wrong, but is correct for the bizarre behavior of the library function getNextMonth(m) { var mNum = m.getMonth()+2; if (mNum>12) { mNum=1; } return getMonthObj(mNum); } function createCookie(name,value,days) { if (days) { var date = new Date(); date.setTime(date.getTime()+(days*24*60*60*1000)); var expires = "; expires="+date.toGMTString(); } else var expires = ""; document.cookie = name+"="+value+expires+"; path=/"; } function readCookie(name) { var nameEQ = name + "="; var ca = document.cookie.split(';'); for(var i=0;i < ca.length;i++) { var c = ca[i]; while (c.charAt(0)==' ') c = c.substring(1,c.length); if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length); } return null; } function eraseCookie(name) { createCookie(name,"",-1); } function isValidEmailAddress(address) { var reg = /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/; return reg.test(address); } function noenter(e) { if(!e) e = window.event; return !(e.keyCode == 13); } function popUp(URL, width, height) { if (width==undefined) { width = 400; } if (height==undefined) { height = 500; } day = new Date(); id = day.getTime(); eval("page" + id + " = window.open(URL, '" + id + "', 'toolbar=0,scrollbars=1,location=no,statusbar=no,menubar=no,resizable=0,width=" + width + ",height=" + height + "');"); } function scenarioHelp(e, URL) { popUp(URL,600,500); if (window.event) { window.event.cancelBubble=true; } else { e.stopPropagation(); } return false; } function openSignupBox() { window.location='Signup.html'; } function flagLead(fileID, submitToken) { if (fileID==0) return; var img = $('#star' + fileID)[0]; var flagged = !(img.src.endsWith('icon_star_on.gif')); img.src = "../images/" + (flagged ? 'icon_star_on.gif' : 'icon_star.gif'); $.post('FlagFile.do', { SubmitToken: submitToken, fileID: fileID, flagged: flagged }, function(json) { if (json.emsg!='ok') { // some error occurred; reset state img.src = "../images/" + (flagged ? 'icon_star.gif' : 'icon_star_on.gif'); displayErrorMessage(json.emsg); } }, 'json'); } function displayErrorMessage(msg) { if (msg==null || msg.length==0) { $('#errorBox').css('display','none'); } else { $('#errorBox').css('display',''); $('#errorText').html(msg); } } function initDatePickers(submitToken, fileID, dateText, noteText) { try { $(".dpoff").datepicker({ buttonImage: '../images/icon_calendar.gif', buttonImageOnly: true, changeMonth: true, changeYear: true, showButtonPanel: true, closeText: 'Save', duration:'', showOn: 'both', onClose: function(dateText, inst, notetext) { calClosed($(this), dateText, notetext, submitToken) } }); $(".dpon").datepicker({ buttonImage: '../images/icon_calendar_on.gif', buttonImageOnly: true, changeMonth: true, changeYear: true, showButtonPanel: true, closeText: 'Save', duration:'', showOn: 'both', onClose: function(dateText, inst, notetext) { calClosed($(this), dateText, notetext, submitToken) } }); $(".dpondayof").datepicker({ buttonImage: '../images/icon_calendar_on_dayof.gif', buttonImageOnly: true, changeMonth: true, changeYear: true, showButtonPanel: true, closeText: 'Save', duration:'', showOn: 'both', onClose: function(dateText, inst, notetext) { calClosed($(this), dateText, notetext, submitToken) } }); $(".dpondayafter").datepicker({ buttonImage: '../images/icon_calendar_on_dayafter.gif', buttonImageOnly: true, changeMonth: true, changeYear: true, showButtonPanel: true, closeText: 'Save', duration:'', showOn: 'both', onClose: function(dateText, inst, notetext) { calClosed($(this), dateText, notetext, submitToken) } }); } catch (e2) { alert(e2); } updateDPControls(fileID, dateText, noteText); } function calClosed(dp, dateText, notetext, submitToken) { dp.hide(); var fieldID = dp.attr('id'); var fileID = fieldID.substring(fieldID.indexOf('_') + 1); if (dateText=='delete') { deleteAlert(fileID, submitToken); } else { dp.datepicker('option', 'noteText', notetext); saveAlert(fileID, dateText, notetext, submitToken); } } function updateDPControls(fileID, dateText, noteText) { $('#datepickeroff_' + fileID).val(''); $('#datepickeron_' + fileID).val(dateText); $('#datepickerondayof_' + fileID).val(dateText); $('#datepickerondayafter_' + fileID).val(dateText); $('#datepickeroff_' + fileID).datepicker('saveNoteText', noteText); $('#datepickeron_' + fileID).datepicker('saveNoteText', noteText); $('#datepickerondayof_' + fileID).datepicker('saveNoteText', noteText); $('#datepickerondayafter_' + fileID).datepicker('saveNoteText', noteText); $('#dpondiv' + fileID).attr('title', dateText + '\n' + noteText); $('#dpondayofdiv' + fileID).attr('title', dateText + '\n' + noteText); $('#dpondayafterdiv' + fileID).attr('title', dateText + '\n' + noteText); } function getDPTooltip(dateText, noteText) { return dateText + '\n' + noteText; } /// todo: handle error states function saveAlert(fileID, dateText, noteText, submitToken) { try { if (dateText=='') { var today = new Date(); dateText = formatDate(today, 'MM/dd/yyyy'); } turnOnCal(fileID, dateText); $.post('FlagFile.do', { SubmitToken: submitToken, calendarID: fileID, dateText: dateText, noteText: noteText }, function(json) { if (json.emsg!='ok') { // some error occurred; reset state $('#dpoffdiv' + fileID).show(); $('#dpondiv' + fileID).hide(); displayErrorMessage(json.emsg); } else { updateDPControls(fileID, dateText, noteText); } }, 'json'); } catch (e) { alert(e); } } function deleteAlert(fileID, submitToken) { try { turnOffCal(fileID); $.post('FlagFile.do', { SubmitToken: submitToken, calendarID: (fileID)}, function(json) { if (json.emsg!='ok') { // some error occurred; reset state $('#dpoffdiv' + fileID).hide(); $('#dpondiv' + fileID).show(); displayErrorMessage(json.emsg); } else { updateDPControls(fileID, '', ''); } }, 'json'); } catch (e) { alert(e); } } function turnOnCal(fileID, dateText, forParent) { var $$ = (forParent ? window.parent.$ : window.$) || false; if($$) { $$('#dpoffdiv' + fileID).hide(); $$('#dpondiv' + fileID).hide(); $$('#dpondayafterdiv' + fileID).hide(); $$('#dpondayofdiv' + fileID).hide(); var today = new Date(); today.setHours(0); today.setMinutes(0); today.setSeconds(0); var theDate = new Date(getDateFromFormat(dateText, 'M/d/yyyy')); if (theDate < today) { $$('#dpondayafterdiv' + fileID).show(); } else { today.setDate(today.getDate()+1); if (theDate > today) { $$('#dpondiv' + fileID).show(); } else { $$('#dpondayofdiv' + fileID).show(); } } } } function turnOffCal(fileID, forParent) { var $$ = (forParent ? window.parent.$ : window.$) || false; if($$) { $$('#dpoffdiv' + fileID).show(); $$('#dpondiv' + fileID).hide(); $$('#dpondayafterdiv' + fileID).hide(); $$('#dpondayofdiv' + fileID).hide(); } }