function round(n,nd) {
	if (isFinite(n) && isFinite(nd)) {
		var sign_n=(n<0)?-1:1;
		var abs_n=Math.abs(n);
		var factor=Math.pow(10,nd);
		return sign_n*Math.round(abs_n*factor)/factor;
	} else {
		return NaN;
	}
}

function eedisplayFloatND(x,nd) {
	if (isNaN(x)) {
		return Number.NaN;
	} else {
		var res=round(x,nd);
		if (nd>0) {
			var parts=String(res).split('.');
			if (parts.length<2) {
				var decimals=('00000000000000').substring(0,nd);
				return(parts[0]).toString()+'.'+decimals;
			} else {
				var decimals=((parts[1]).toString()+'00000000000000').substring(0,nd);
				return(parts[0]).toString()+'.'+decimals;
			}
		} else {
			return res;
		}
	}
}

function eeparseFloatTh(strin) {
	str=String(strin).replace(/,/g,"");
	var res=parseFloat(str);
	if(isNaN(res)) {
		alarmtf = 'Warning: This field contains an invalid character!';
	} else {
		return res;
	}
}

function eedisplayFloatNDTh(x,nd) {
	if(isNaN(x)) {
		return Number.NaN;
	} else {
		var res=round(x,nd);
		if(nd>0) {
			var parts=String(res).split('.');
			var res2=eeinsertThousand(parts[0].toString());
			if(parts.length<2) {
				var decimals=('00000000000000').substring(0,nd);
				return(res2+'.'+decimals);
			} else {
				var decimals=((parts[1]).toString()+'00000000000000').substring(0,nd);
				return(res2+'.'+decimals);
			}
		} else {
			return(eeinsertThousand(res.toString()));
		}
	}
}

function eeinsertThousand(whole) {
	if(whole==""||whole.indexOf("e")>=0) {
		return whole;
	} else {
		var minus_sign="";
		if(whole.charAt(0)=="-") {
			minus_sign="-";
			whole=whole.substring(1);
		}

		var res="";
		var str_length=whole.length-1;
		for (ii=0;ii<=str_length;ii++) {
			if (ii>0&&ii%3==0) {
				res=","+res;
			}
			res=whole.charAt(str_length-ii)+res;
		}
		return minus_sign+res;
	}
}


// --------------- For Payments-------------------

function readnumber () {
	tmpamount = eeparseFloatTh(document.forms['accform'].elements['amount'].value);
	for(stock in payarr) {
		tmpvrrm = payarr[stock];
		tmpvrrm[2] = eeparseFloatTh(document.forms['accform'].elements['pay[' + stock + ']'].value);
	}
}

function checkinp () {
	if (tmpamount < 0) alarmtf = 'Warning: Payments can not be negative!';
	var tmpsumtbl = 0;
	for(stock in payarr) {
		vrrm = payarr[stock];
		tmpvrrm = payarr[stock];
		if (tmpvrrm[2] < 0) alarmtf = 'Warning: Payments can not be negative!';
		tmpdue = vrrm[0] - vrrm[4] - vrrm[1] - tmpvrrm[2];
		//if (tmpdue < 0) alarmtf = 'You may not pay more than the amount due!';
		tmpsumtbl+= tmpvrrm[2];
	}

	var tmpunusedpayment = tmpamount - tmpsumtbl;
	if (tmpunusedpayment < 0) alarmtf = 'You cannot apply an amount greater than the total payment plus any existing credits!';
}

function afterpr () {
	amount = tmpamount;
	for(stock in payarr) {
		vrrm = payarr[stock];
		tmpvrrm = payarr[stock];
		vrrm[2] = tmpvrrm[2];
	}
}

function numbformat () {
	document.forms['accform'].elements['amount'].value = eedisplayFloatNDTh(eeparseFloatTh(document.forms['accform'].elements['amount'].value),2);
	for(stock in payarr) {
		vrrm = payarr[stock];
		document.getElementById('inv' + stock).innerHTML = eedisplayFloatNDTh(eeparseFloatTh(document.getElementById('inv' + stock).innerHTML),2);
		document.getElementById('credit' + stock).innerHTML = eedisplayFloatNDTh(eeparseFloatTh(document.getElementById('credit' + stock).innerHTML),2);
		document.getElementById('due' + stock).innerHTML = eedisplayFloatNDTh(eeparseFloatTh(document.getElementById('due' + stock).innerHTML),2);
		document.forms['accform'].elements['pay[' + stock + ']'].value = eedisplayFloatNDTh(eeparseFloatTh(document.forms['accform'].elements['pay[' + stock + ']'].value),2);
	}
	document.getElementById('sumcustinv').innerHTML = eedisplayFloatNDTh(eeparseFloatTh(document.getElementById('sumcustinv').innerHTML),2);
	document.getElementById('sumcustcredit').innerHTML = eedisplayFloatNDTh(eeparseFloatTh(document.getElementById('sumcustcredit').innerHTML),2);
	document.getElementById('sumcustpay').innerHTML = eedisplayFloatNDTh(eeparseFloatTh(document.getElementById('sumcustpay').innerHTML),2);
	document.getElementById('sumcustbal').innerHTML = eedisplayFloatNDTh(eeparseFloatTh(document.getElementById('sumcustbal').innerHTML),2);
	document.getElementById('unusedpay').innerHTML = eedisplayFloatNDTh(eeparseFloatTh(document.getElementById('unusedpay').innerHTML),2);
	document.getElementById('unusedcredit').innerHTML = eedisplayFloatNDTh(eeparseFloatTh(document.getElementById('unusedcredit').innerHTML),2);
}

function calcset() {
	document.forms['accform'].elements['amount'].value = amount;
	var sumtbl = 0;
	for(stock in payarr) {
		vrrm = payarr[stock];
		document.getElementById('inv' + stock).innerHTML = vrrm[0];
		document.getElementById('credit' + stock).innerHTML = vrrm[4];
		document.getElementById('due' + stock).innerHTML = vrrm[0] - vrrm[4] - vrrm[1] - vrrm[2];
		document.forms['accform'].elements['pay[' + stock + ']'].value = vrrm[2];
		sumtbl+= vrrm[2];
	}
	document.getElementById('sumcustinv').innerHTML = constsumcustinv;
	document.getElementById('sumcustcredit').innerHTML = constsumcustcredit;

	var realsumcustpay = constsumcustpay - constamount + amount;
	document.getElementById('sumcustpay').innerHTML = realsumcustpay;

	var realsumcustbal = constsumcustinv - constsumcustcredit - realsumcustpay;
	var classpan = 'alarm';
	var txtspan = txtdue;
	if (realsumcustbal <= 0) {
		classpan = 'goood';
		txtspan = txtovr;
		realsumcustbal = 0 - realsumcustbal;
	}
	document.getElementById('txtcustbal').innerHTML = txtspan;
	document.getElementById('sumcustbal').outerHTML = '<SPAN class=' + classpan + ' id=sumcustbal>&nbsp;</SPAN>';
	document.getElementById('sumcustbal').innerHTML = realsumcustbal;

	var unusedpayment = amount - sumtbl;
	document.getElementById('unusedpay').innerHTML = unusedpayment;
	document.getElementById('unusedcredit').innerHTML = constunusedcredit + unusedpayment;
	numbformat();
}

function mykeypress(evt) {
	var evt = (evt)?evt:window.event;
	var key = (evt.charCode) ? evt.charCode : ((evt.keyCode)?evt.keyCode : ((evt.which) ? evt.which : 0));
	if ((key==13) || (key==27)) {
		alarmtf = '';
		readnumber();
		checkinp();
		if (!alarmtf) {
			afterpr();
			calcset();
		}
		if (alarmtf) {
			//document.forms['accform'].elements['correctinput'].value = 0;
			window.alert(alarmtf);
		} else {
			document.forms['accform'].elements['correctinput'].value = 1;
		}
		return false;
	} else {
		return true;
	}
}

function clearpay() {
	document.forms['accform'].elements['correctinput'].value = 1;
	amount = constamount;
	for(stock in payarr) {
		vrrm = payarr[stock];
		vrrm[2] = vrrm[3];
	}
	calcset();
}

function autoapply() {
	document.forms['accform'].elements['correctinput'].value = 1;
	amount = eeparseFloatTh(document.forms['accform'].elements['amount'].value);
	amntrest = amount;
	for(stock in payarr) {
		vrrm = payarr[stock];
		vrrm[2] = 0;
		if (amntrest > 0) {
			duecurstock = vrrm[0] - vrrm[1];
			if (amntrest >= duecurstock) {
				vrrm[2] = duecurstock;
				amntrest = amntrest - duecurstock;
			} else {
				vrrm[2] = amntrest;
				amntrest = 0;
			}
		}
	}
	calcset();
}

function savepaym(savevalue) {
	if (document.forms['accform'].elements['correctinput'].value == 1) {
		document.forms['accform'].elements['savepay'].value = savevalue;
		amount = eeparseFloatTh(document.forms['accform'].elements['amount'].value);
		if (amount > 0) document.forms['accform'].submit();
		else window.alert('Please enter Amount!');
	} else {
		window.alert('Incorrect input!');
	}
}


// --------------- For Invoices -------------------

function calcinv() {
	var sumtbl = 0;
	var sumdpz = 0;
	for(rcrds in invarr) {
		vrrm = invarr[rcrds];
		document.forms['accform'].elements['invsumpart[' + rcrds + ']'].value = vrrm[0];
		if (vrrm[2] == 'cr1') sumdpz+= Math.abs(parseFloat(vrrm[0]));
		else sumtbl+= parseFloat(vrrm[0]);
	}
	document.getElementById('amountdepoz').innerHTML = sumdpz;
	document.getElementById('amountfinal').innerHTML = sumtbl-sumdpz;
	document.getElementById('totalinv').innerHTML = sumtbl;

	if (sumdpz) {
		try {
			document.getElementById('blockdep').style.display = 'table-row';
		}  catch(e) {
			document.getElementById('blockdep').style.display = 'block';
		}
		try {
			document.getElementById('blockfin').style.display = 'table-row';
		}  catch(e) {
			document.getElementById('blockfin').style.display = 'block';
		}
	} else {
		document.getElementById('blockdep').style.display = 'none';
		document.getElementById('blockfin').style.display = 'none';
	}

	numbformatinv();
}

function readnumberinv () {
	for(rcrds in invarr) {
		vrrm = invarr[rcrds];
		vrrm[0] = eeparseFloatTh(document.forms['accform'].elements['invsumpart[' + rcrds + ']'].value);
	}
}

function numbformatinv () {
	for(rcrds in invarr) {
		vrrm = invarr[rcrds];
		document.forms['accform'].elements['invsumpart[' + rcrds + ']'].value = eedisplayFloatNDTh(eeparseFloatTh(document.forms['accform'].elements['invsumpart[' + rcrds + ']'].value),2);
	}

	document.getElementById('amountdepoz').innerHTML = eedisplayFloatNDTh(eeparseFloatTh(document.getElementById('amountdepoz').innerHTML),2);
	document.getElementById('amountfinal').innerHTML = eedisplayFloatNDTh(eeparseFloatTh(document.getElementById('amountfinal').innerHTML),2);
	document.getElementById('totalinv').innerHTML = eedisplayFloatNDTh(eeparseFloatTh(document.getElementById('totalinv').innerHTML),2);
}

function mykeypressinv(evt) {
	var evt = (evt)?evt:window.event;
	var key = (evt.charCode) ? evt.charCode : ((evt.keyCode)?evt.keyCode : ((evt.which) ? evt.which : 0));
	if ((key==13) || (key==27)) {
		alarmtf = '';
		readnumberinv();
		if (!alarmtf) {
			calcinv();
		}
		if (alarmtf) window.alert(alarmtf);
		return false;
	} else {
		return true;
	}
}

function clearinv() {
	for(rcrds in invarr) {
		vrrm = invarr[rcrds];
		vrrm[0] = vrrm[1];
	}
	calcinv();
}

function saveinvm(savevalue) {
	document.forms['accform'].elements['saveinv'].value = savevalue;
	document.forms['accform'].submit();
}

function credit(invtype) {
	var is_confirmed = confirm('You really want to apply credit assistance?');
	if (is_confirmed) {

		var alarmtf = '';
		var period = 0;
		var baseprice = 0;
		var insurprice = 0;
		var broceragefee = 0;
		var fldcr1 = 0;
		var fldcr2 = 0;
		var fldcr3 = 0;
		var datacur = new Date();
		var datacr1 = new Date();
		var srokcr1 = 1;

		for(rcrds in invarr) {
			vrrm = invarr[rcrds];
			if ((invtype == 1) || (invtype == 3) || (invtype == 4) || (invtype == 6) || (invtype == 8)) {
				if ((vrrm[2] != 'ins') && (vrrm[2] != 'cr1') && (vrrm[2] != 'cr2') && (vrrm[2] != 'cr3')) baseprice+=vrrm[0];
			} else if ( (invtype == 2) || (invtype == 5) ) {
				if (vrrm[2] == 'pur') baseprice = vrrm[0];
			}
			if (vrrm[2] == 'ebf') broceragefee = vrrm[0];
			if (vrrm[2] == 'cr1') {
				datacr1str = document.forms['accform'].elements['invdate[' + rcrds + ']'].value;
				datacr1 = prsdate(datacr1str);
			}
		}

		srokcr1 = datacur > datacr1 ? Math.ceil((datacur - datacr1) / (1000 * 60 * 60 * 24)) : srokcr1;

		if (baseprice) {
			if ((invtype == 1) || (invtype == 3) || (invtype == 4) || (invtype == 6) || (invtype == 8)) {
				period = prompt('Period for Credit Assistance (days):','30');
				if(isNaN(period)) {
					alarmtf = 'Warning: This field contains an invalid character!';
				} else {
					period = round(period,0);
					if (period <= 0) {
						alarmtf = 'Warning: Incorrect input!';
					} else {
						depppoz = prompt('Security Deposit, $:','5000');

						if(isNaN(depppoz)) {
							alarmtf = 'Warning: This field contains an invalid character!';
						} else {
							depppoz = round(depppoz,0);
							if (depppoz <= 0) {
								alarmtf = 'Warning: Incorrect input!';
							} else {
								for(rcrds in invarr) {
									vrrm = invarr[rcrds];
									if ((vrrm[2] != 'ins') && (vrrm[2] != 'cr1') && (vrrm[2] != 'cr2') && (vrrm[2] != 'cr3')) insurprice+=vrrm[0];
								}
								baseprice+=round((insurprice)*inscop/100,0);
								var totalmonth = Math.ceil(period/30);
								penaltyalert(totalmonth);
								fldcr1 = depppoz;
								fldcr2 = round((baseprice-depppoz)*period*procpermonth/30/100,0);
								fldcr3 = ahfee*totalmonth;
								if (totalmonth > 2) {
									fldcr2+= round((baseprice-depppoz)*(period-60)*procpermonth/30/100,0);
									fldcr3+= ahfee*(totalmonth-2);
								}

							}
						}
					}
				}
			} else if ( (invtype == 2) || (invtype == 5) ) {
				period = srokcr1;
				var totalmonth = Math.ceil(period/30);
				penaltyalert(totalmonth);
				fldcr1 = round((baseprice+broceragefee)/2,0);
				var tempcfno = 0;
				for(cfno in cafeearr) {
					if (fldcr1 >= cfno) {
						fldcr2 = cafeearr[cfno]*totalmonth;
						tempcfno = cfno;
					}
				}
				fldcr3 = ahfee*totalmonth;
				if (totalmonth > 2) {
					if (tempcfno) fldcr2+= cafeearr[tempcfno]*(totalmonth-2);
					fldcr3+= ahfee*(totalmonth-2);
				}
				insurprice = baseprice+broceragefee;
			}

			if (alarmtf) {
				window.alert(alarmtf);
			} else {
				var fldins = round((insurprice)*inscop/100,0);
				for(rcrds in invarr) {
					vrrm = invarr[rcrds];
					if (vrrm[2] == 'cr1') vrrm[0] = fldcr1;
					if (vrrm[2] == 'cr2') vrrm[0] = fldcr2;
					if (vrrm[2] == 'cr3') vrrm[0] = fldcr3;
					if (vrrm[2] == 'ins') vrrm[0] = fldins;
				}
				calcinv();
			}
		}
	}
}

function penaltyalert(intotmonth) {
	var txtalertpenlt = "";
	if (intotmonth > 2) txtalertpenlt = "Term of the credit more than 60 days: penalty";
	else if (intotmonth > 1) txtalertpenlt = "Term of the credit more than 30 days: fees x 2";
	if (txtalertpenlt) window.alert(txtalertpenlt);
}

function financing(invtype) {
	var is_confirmed = confirm('You really want to apply financing?');
	if (is_confirmed) {

		var alarmtf = '';
		var depositpercent = 20;
		var totvalmin = 5000;
		var baseprice = 0;
		var insurprice = 0;
		var broceragefee = 0;
		var fldcr1 = 0;
		var fldcrs = 0;

		var arservfee = new Array();
		arservfee[10000] = 150;
		arservfee[15000] = 180;
		arservfee[20000] = 240;
		arservfee[25000] = 300;
		arservfee[30000] = 360;
		arservfee[35000] = 420;
		arservfee[40000] = 480;
		arservfee[45000] = 540;
		arservfee[50000] = 600;

		do {
			for (rcrds in invarr) {
				vrrm = invarr[rcrds];
				if (vrrm[2] == 'pur') baseprice+=vrrm[0];
				else if (vrrm[2] == 'bro') broceragefee+=vrrm[0];
				else if (vrrm[2] == 'ebf') broceragefee+=vrrm[0];
			}

			if ((baseprice + broceragefee) < totvalmin) {
				alarmtf = 'Total Value of Shipment is less than ' + totvalmin + ' !';
				break;
			}

			fldcr1 = round((baseprice + broceragefee)*depositpercent/100,0);

			for (servfe in arservfee) {
				if ((baseprice + broceragefee) <= servfe) {
					fldcrs = arservfee[servfe];
					break;
				}
			}

			if (!fldcrs) {
				alarmtf = 'Please enter Service Fee manually !';
				break;
			}

			insurprice = baseprice + broceragefee;
			var fldins = round((insurprice)*inscop/100,0);
			for(rcrds in invarr) {
				vrrm = invarr[rcrds];
				if (vrrm[2] == 'cr1') vrrm[0] = fldcr1;
				if (vrrm[2] == 'crs') vrrm[0] = fldcrs;
				if (vrrm[2] == 'ins') vrrm[0] = fldins;
			}
			calcinv();

		} while (0);

		if (alarmtf) {
			window.alert(alarmtf);
		}
	}
}


// --------------- For Invoices and Payments for Bill -------------------

function mykeypressinvbill(evt) {
	var evt = (evt)?evt:window.event;
	var key = (evt.charCode) ? evt.charCode : ((evt.keyCode)?evt.keyCode : ((evt.which) ? evt.which : 0));
	if ((key==13) || (key==27)) {
		alarmtf = '';
		readnumberinv();
		if (!alarmtf) {
			calcinvbill();
		}
		if (alarmtf) window.alert(alarmtf);
		return false;
	} else {
		return true;
	}
}

function calcinvbill() {
	var sumtbl = 0;
	for(rcrds in invarr) {
		vrrm = invarr[rcrds];
		document.forms['accform'].elements['invsumpart[' + rcrds + ']'].value = vrrm[0];
		sumtbl+= parseFloat(vrrm[0]);
	}
	document.getElementById('totalinv').innerHTML = sumtbl;
	numbformatinvbill();
}

function numbformatinvbill() {
	for(rcrds in invarr) {
		vrrm = invarr[rcrds];
		document.forms['accform'].elements['invsumpart[' + rcrds + ']'].value = eedisplayFloatNDTh(eeparseFloatTh(document.forms['accform'].elements['invsumpart[' + rcrds + ']'].value),2);
	}
	document.getElementById('totalinv').innerHTML = eedisplayFloatNDTh(eeparseFloatTh(document.getElementById('totalinv').innerHTML),2);
}


// --------------- For Date -------------------

function prsdate (vhdate) {

	var RE_NUM = /^\-?\d+$/;

	var arr_date = vhdate.split('/');

	if (arr_date.length != 3) return alert ("Invalid date format: '" + vhdate + "'.\nFormat accepted is dd-mm-yyyy.");
	if (!arr_date[1]) return alert ("Invalid date format: '" + vhdate + "'.\nNo day of month value can be found.");
	if (!RE_NUM.exec(arr_date[1])) return alert ("Invalid day of month value: '" + arr_date[1] + "'.\nAllowed values are unsigned integers.");
	if (!arr_date[0]) return alert ("Invalid date format: '" + vhdate + "'.\nNo month value can be found.");
	if (!RE_NUM.exec(arr_date[0])) return alert ("Invalid month value: '" + arr_date[0] + "'.\nAllowed values are unsigned integers.");
	if (!arr_date[2]) return alert ("Invalid date format: '" + vhdate + "'.\nNo year value can be found.");
	if (!RE_NUM.exec(arr_date[2])) return alert ("Invalid year value: '" + arr_date[2] + "'.\nAllowed values are unsigned integers.");

	var dtdate = new Date();
	dtdate.setDate(1);

	if (arr_date[0] < 1 || arr_date[0] > 12) return alert ("Invalid month value: '" + arr_date[0] + "'.\nAllowed range is 01-12.");
	dtdate.setMonth(arr_date[0]-1);
	 
	if (arr_date[2] < 100) arr_date[2] = Number(arr_date[2]) + (arr_date[2] < NUM_CENTYEAR ? 2000 : 1900);
	dtdate.setFullYear(arr_date[2]);

	var dt_numdays = new Date(arr_date[2], arr_date[0], 0);
	dtdate.setDate(arr_date[1]);
	if (dtdate.getMonth() != (arr_date[0]-1)) return alert ("Invalid day of month value: '" + arr_date[1] + "'.\nAllowed range is 01-"+dt_numdays.getDate()+".");

	return (dtdate)
}

function setremarkusingaritem(elem) {
	if (elem) {
		var remelem = "invrem[" + elem.name.replace("invaritem[","").replace("]","") + "]";
		if (elem.options[elem.selectedIndex].parentNode.label) {
			if (elem.options[elem.selectedIndex].text.search("with manual remark") == -1) {
				document.forms.accform[remelem].value = elem.options[elem.selectedIndex].text;
			} else {
				document.forms.accform[remelem].value = "";
			}
		} else {
			document.forms.accform[remelem].value = "";
		}
	}
}

