';
}
dashBoard.participantAmtHtmlFormat = result;
}
this.setPaidBy = function setPaidBy(selectedParticipantId){
dashBoard.paidByHtml = "";
for (var index in dashBoard.participants) {
if(dashBoard.participants[index].id == selectedParticipantId){
dashBoard.paidByHtml += '';
} else {
dashBoard.paidByHtml += '';
}
}
}
this.setParticipantAmountInfoByAmtStr = function setParticipantAmountInfoByAmtStr(amtStr){
var amtStrArray = amtStr.split(",");
var totalInvolves = 0;
for(var i=0;i parseFloat(0)){
totalInvolves++;
$("#chkParticipant"+values[0]).prop('checked', true);
}
}
//check or uncheck checkBox
if(totalInvolves != dashBoard.participants.length ){
$("#selectAll").prop('checked', false);
}
}
this.showEditUI =function showEditUI(expenseObj){
dashBoard.currentEditGroupExpense = expenseObj;
//set paid by
dashBoard.setPaidBy(expenseObj.paidBy);
//assign parts and freeze amounts to all participants
if(expenseObj.isDetails == 1){
dashBoard.refreshParticipantsExpenseProperties(1);
} else {
dashBoard.refreshParticipantsExpenseProperties(0);
}
dashBoard.setParticipantAmountInfoByAmtStr(expenseObj.participantAmountStr);
dashBoard.currentInputAmount = expenseObj.amount;
//hide show details section
// alert(expenseObj.isDetails);
if(expenseObj.isDetails == 1){
dashBoard.hideShowParticipantDetails(true);
$("#Details").prop('checked', true);
dashBoard.setDetailsCheckImpact();
} else {
dashBoard.hideShowParticipantDetails(false)
dashBoard.setDetailsCheckImpact();
}
/* this.isFreeze;
this.currentInputExpensePart;
this.currentInputExpenseFreezeAmt; */
//alert(expenseObj.paidBy);
//alert(expenseObj.paidBy);
//dashBoard.calculateFinalFreezeExpenseAmount();
//dashBoard.showFreezeAmount();
//dashBoard.setShadowOnPartTextBox();
//alert(dashBoard.paidByHtml);
/*for (var index in dashBoard.participants) {
$("#chkParticipant"+dashBoard.participants[index].id).check(true);
}*/
}
this.setDetailsCheckImpact = function setDetailsCheckImpact(){
if($("#Details").is(':checked')){
dashBoard.hideShowParticipantDetails(true);
} else {
dashBoard.hideShowParticipantDetails(false);
}
dashBoard.setShadowOnPartTextBox();
}
this.showPartAndFreezeAmtInDetails = function showPartAndFreezeAmtInDetails(){
for (var index in dashBoard.participants) {
//set part and freezeAmt from participants
$("#participantTextPart"+dashBoard.participants[index].id).val(dashBoard.participants[index].currentInputExpensePart);
$("#participantTextFreeze"+dashBoard.participants[index].id).val(dashBoard.showFormatedAmount(dashBoard.participants[index].currentInputExpenseFreezeAmt));
}
}
this.hideShowParticipantDetails = function hideShowParticipantDetails(isDetails){
if(isDetails == true){
//hide simple
$("#tr_selectAll").hide();
for (var index in dashBoard.participants) {
$("#tr_Participant"+dashBoard.participants[index].id).hide();
$("#tr_ParticipantDetails"+dashBoard.participants[index].id).show();
}
dashBoard.showPartAndFreezeAmtInDetails();
} else {
$("#tr_selectAll").show();
for (var index in dashBoard.participants) {
$("#tr_Participant"+dashBoard.participants[index].id).show();
$("#tr_ParticipantDetails"+dashBoard.participants[index].id).hide();
}
dashBoard.showFreezeAmount();
}
}
// Utilities functions
this.getCurrency = function getCurrency(){
return dashBoard.expense.currency;
}
this.getFormatedAmount = function getFormatedAmount(amount){
return parseFloat(amount).toFixed(15);
}
this.getFormatedAmountDB = function getFormatedAmountDB(amount){
return parseFloat(amount).toFixed(4);
}
this.showFormatedAmount = function showFormatedAmount(amount){
return parseFloat(amount).toFixed(2);
}
this.getFormatedDate = function getFormatedDate(date){
var dateObj = new Date(date*1000);
//return date.getdays()+"/"+date.getMonths()+"/"+date.getYears(); var a = new Date(UNIX_timestamp*1000);
var months = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'];
var year = dateObj.getFullYear();
var month = months[dateObj.getMonth()];
var date = String(dateObj.getDate());
var time ;
if(date.length == 1){
time = '0'+ date + '-' + month + '-' + year ;
} else {
time = date + '-' + month + '-' + year ;
}
return time;
}
this.setCurrentDate = function setCurrentDate(){
var dateObj = new Date();
//return date.getdays()+"/"+date.getMonths()+"/"+date.getYears(); var a = new Date(UNIX_timestamp*1000);
var months = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'];
var year = dateObj.getFullYear();
var month = months[dateObj.getMonth()];
var date = String(dateObj.getDate());
if(date.length == 1){
date = "0"+date;
}
dashBoard.currentDate = date + '-' + month + '-' + year ;
}
this.getInvolveString = function getInvolveString(participantAmountStr){
var involveStrAll = "";
var involveStrExcept = "";
var involveParticipantList = [];
//calculate involveStr
var participantInvolveList = participantAmountStr.split(",");
for(var i=0;iinvolveStrExcept.length){
return involveStrExcept;
} else{
return involveStrAll;
}
}
this.inArrayElement = function inArrayElement(array, value){
var result = false;
for(var i=0;i25){
errorMessage = "Expense name must be less than to 26 characters"
}
//validate amount field
if(errorMessage == ""){
if(!$('#Amount').val().trim()){
errorMessage = "Please enter valid amount"
} else if (parseFloat($('#Amount').val()) <= parseFloat(0)) {
errorMessage = "Please enter valid amount"
}
}
//validate freeze amount
if(errorMessage == ""){
var totalFreezeAmt = dashBoard.getFormatedAmount(0);
for (var index in dashBoard.participants) {
totalFreezeAmt = parseFloat(totalFreezeAmt) + parseFloat(dashBoard.getFormatedAmount(dashBoard.participants[index].currentInputExpenseFreezeAmt));
}
if(dashBoard.showFormatedAmount(totalFreezeAmt) != dashBoard.showFormatedAmount($('#Amount').val().trim())){
errorMessage = "The distributed amount is not the same as the expense amount"
}
}
//validate date
if(errorMessage == ""){
if($('#Date').val().trim() != ""){
var dateArray = $('#Date').val().trim().split("-");
if(dateArray.length != 3){
errorMessage = "Date is not valid";
} else {
errorMessage = isValidDate(dateArray);
}
}
}
//set or clear error message
if(errorMessage != ""){
dashBoard.showErrorMessage(errorMessage);
} else {
dashBoard.clearErrorMessage();
addExpense();
if(source == 1){
$(".ui-icon-closethick").trigger('click');
} else {
dashBoard.clearAddForm();
}
}
}
this.showErrorMessage = function showErrorMessage(msg){
$("#FormError").show();
$(".ui-state-error").html(msg);
}
this.clearErrorMessage = function clearErrorMessage(){
$("#FormError").hide();
$(".ui-state-error").html("");
}
this.clearAddForm = function clearAddForm(){
$('#Reason').val("");
$('#Amount').val("");
$("#Details").prop('checked', false);
$("#selectAll").prop('checked', true);
dashBoard.refreshParticipantsExpenseProperties(1);
dashBoard.setAllCheckImpact();
dashBoard.hideShowParticipantDetails(false);
$('#Reason').focus();
}
this.addRowsToGrid = function addRowsToGrid(data){
var names = ['SI', 'PaidBy', 'Amount', 'Reason', 'Date','Involve','For you?'];
var mydata = [];
for (var i = 0; i < data.length; i++) {
mydata[i] = {};
for (var j = 0; j < data[i].length; j++) {
mydata[i][names[j]] = data[i][j];
}
}
if(dashBoard.isAddMode == true){
for (var i = 0; i < mydata.length; i++) {
//alert(i + 1);
//alert(mydata[i]);
$("#grid").jqGrid('addRowData',data[i][0]+1, mydata[i]);
}
//Set the page to the last page
} else {
$("#grid").jqGrid('setRowData', data[0][0]+1, mydata[0]);
dashBoard.isAddMode = true;
}
}
this.getExpenseUniqueId = function getExpenseUniqueId(){
var maxExpId = 0;
var extractedIndex = 0;
var expenseIdArray;
for(var i=0;i (rowNum*lastPage)){
lastPage++;
}
$(grid_id).setGridParam({page:lastPage});
$(grid_id).trigger("reloadGrid");
}
}
this.setPageAfterDelete = function setPageAfterDelete(grid_id){
var currentPage = $(grid_id).getGridParam('page');
var rowCount = $(grid_id).getGridParam('reccount');
var rowNum = $(grid_id).getGridParam('rowNum');
if(rowCount==0 && currentPage>1){
currentPage = currentPage-1;
$(grid_id).setGridParam({page:currentPage});
}
$(grid_id).trigger("reloadGrid");
}
this.getGeneratedLog = function getGeneratedLog(expenseObj){
var logStr = "";
logStr += "[Expense:"+expenseObj.expenseName+"],";
logStr += "[PaidBy:"+dashBoard.getParticipantNameById(expenseObj.paidBy)+"],";
logStr += "[Date:"+dashBoard.getFormatedDate(expenseObj.expenseDate)+"],";
logStr += "[Amount:"+expenseObj.amount+' '+dashBoard.expense.currency+"],";
logStr += "[Involves:";
var participantAmtStrArray = expenseObj.participantAmountStr.split(",");
for (var index in participantAmtStrArray) {
var dataArray = participantAmtStrArray[index].split("|");
if(index == 0){
logStr += dashBoard.getParticipantNameById(dataArray[0])+"="+dataArray[2];
} else {
logStr += ","+dashBoard.getParticipantNameById(dataArray[0])+"="+dataArray[2];
}
}
logStr += "]";
return logStr;
}
this.getInputFormData = function getInputFormData(groupExpenseObj){
var amountStr = "";
var isDetails = false;
groupExpenseObj.paidBy = $('#PaidBy').val();
groupExpenseObj.expenseName = $('#Reason').val();
groupExpenseObj.amount = $('#Amount').val();
groupExpenseObj.expenseDate = getTimeStampByInputDate($('#Date').val());
//return groupExpenseObj;
for (var index in dashBoard.participants) {
if($("#chkParticipant"+dashBoard.participants[index].id).is(':checked')){
if(amountStr == ""){
if(dashBoard.participants[index].isFreeze == 1){
dashBoard.participants[index].currentInputExpensePart = "";
}
amountStr += dashBoard.participants[index].id+"|"+dashBoard.participants[index].currentInputExpensePart+"|"+dashBoard.getFormatedAmountDB(dashBoard.participants[index].currentInputExpenseFreezeAmt);
} else {
if(dashBoard.participants[index].isFreeze == 1){
dashBoard.participants[index].currentInputExpensePart = "";
}
amountStr += ","+ dashBoard.participants[index].id+"|"+dashBoard.participants[index].currentInputExpensePart+"|"+dashBoard.getFormatedAmountDB(dashBoard.participants[index].currentInputExpenseFreezeAmt);
}
}
if((dashBoard.participants[index].isFreeze == 1) || dashBoard.participants[index].currentInputExpensePart > 1){
isDetails = true;
}
}
if(isDetails){
groupExpenseObj.isDetails = 1;
} else {
groupExpenseObj.isDetails = 0;
}
groupExpenseObj.participantAmountStr = amountStr;
return groupExpenseObj;
}
this.deleteExpense = function deleteExpense(){
var rowId =$("#grid").jqGrid('getGridParam','selrow');
var i;
// alert(rowId);
$('#grid').jqGrid('delRowData', rowId);
var deletedExpObj = dashBoard.groupExpenses[rowId-1];
//alert(deletedExpObj.id);
deletedExpObj.isAdd = "3";
//set log info
deletedExpObj.previousDesc = dashBoard.getGeneratedLog(deletedExpObj);
deletedExpObj.newDesc = "Deleted";
deletedExpObj.previousPaidBy = dashBoard.getParticipantNameById(deletedExpObj.paidBy);
for(i=rowId-1;i 0){
positiveParticipantBalance[index] = dashBoard.participants[index].balance;
} else if(parseFloat(dashBoard.participants[index].balance) < 0) {
negativeParticipantBalance[index] = dashBoard.participants[index].balance;
}
}
//sort postivie and negative
/*positiveParticipantBalance.sort(function(a, b) {
return b - a;
});
negativeParticipantBalance.sort(function(a, b) {
return a - b;
});*/
//add balance amount in positive and negative
/*for (var index in balanceEntryParticipantBalance) {
if(parseFloat(balanceEntryParticipantBalance[index]) > 0 ){
positiveParticipantBalance[index] = dashBoard.getFormatedAmountDB(parseFloat(positiveParticipantBalance[index]) - parseFloat(balanceEntryParticipantBalance[index]));
} else if(parseFloat(balanceEntryParticipantBalance[index]) < 0 ){
negativeParticipantBalance[index] = dashBoard.getFormatedAmountDB(parseFloat(negativeParticipantBalance[index]) + parseFloat(balanceEntryParticipantBalance[index]));
}
}*/
//scan and shift positive and negative
//sort positive and negative again
//calculate who needs to pay whom
// alert("3");
//if pos and neg values are same, then direct exchange payment
for (var posIndex in positiveParticipantBalance) {
if(dashBoard.showFormatedAmount(parseFloat(positiveParticipantBalance[posIndex])) > dashBoard.showFormatedAmount(parseFloat(0))){
for (var negIndex in negativeParticipantBalance) {
// alert(dashBoard.showFormatedAmount(parseFloat(positiveParticipantBalance[posIndex])));
// alert(dashBoard.showFormatedAmount(parseFloat(negativeParticipantBalance[negIndex])*(-1)));
if(dashBoard.showFormatedAmount(parseFloat(positiveParticipantBalance[posIndex])) == dashBoard.showFormatedAmount(parseFloat(negativeParticipantBalance[negIndex])*(-1))
&& dashBoard.showFormatedAmount(parseFloat(positiveParticipantBalance[posIndex])) > dashBoard.showFormatedAmount(parseFloat(0))){
if(balanceString == ""){
balanceString = balanceString + negIndex +"|" + posIndex +"|" + dashBoard.showFormatedAmount(parseFloat(negativeParticipantBalance[negIndex])*(-1));
} else{
balanceString = balanceString+"," + negIndex +"|" + posIndex +"|" + dashBoard.showFormatedAmount(parseFloat(negativeParticipantBalance[negIndex])*(-1));
}
//update array amount
positiveParticipantBalance[posIndex] = 0;
negativeParticipantBalance[negIndex] = 0;
}
}
}
}
//alert("4");
//distribute amount among pos values
var maxPartIndex = dashBoard.getMaxMinParticipantId(positiveParticipantBalance,1);
var minPartIndex = dashBoard.getMaxMinParticipantId(negativeParticipantBalance,2);
while(maxPartIndex != "" && minPartIndex != ""){
var maxVal = parseFloat(positiveParticipantBalance[maxPartIndex]);
//alert(maxVal)
//alert(negativeParticipantBalance[minPartIndex]);
if(minPartIndex != ""){
var decrementalVal = parseFloat(negativeParticipantBalance[minPartIndex]) *(-1);
if(parseFloat(decrementalVal) >parseFloat(maxVal)){
decrementalVal = dashBoard.getFormatedAmountDB(maxVal);
}
//update array
positiveParticipantBalance[maxPartIndex] = dashBoard.getFormatedAmountDB(parseFloat(positiveParticipantBalance[maxPartIndex]) - parseFloat(decrementalVal));
negativeParticipantBalance[minPartIndex] = dashBoard.getFormatedAmountDB(parseFloat(negativeParticipantBalance[minPartIndex]) + parseFloat(decrementalVal));
if(balanceString == ""){
balanceString = balanceString + minPartIndex +"|" + maxPartIndex +"|" + decrementalVal;
} else{
balanceString = balanceString+"," + minPartIndex +"|" + maxPartIndex +"|" + decrementalVal;
}
}
//alert("5");
//check equal
for (var posIndex in positiveParticipantBalance) {
if(dashBoard.showFormatedAmount(parseFloat(positiveParticipantBalance[posIndex])) > dashBoard.showFormatedAmount(parseFloat(0))){
for (var negIndex in negativeParticipantBalance) {
if(dashBoard.showFormatedAmount(parseFloat(positiveParticipantBalance[posIndex])) == dashBoard.showFormatedAmount(parseFloat(negativeParticipantBalance[negIndex])*(-1))
&& dashBoard.showFormatedAmount(parseFloat(positiveParticipantBalance[posIndex])) > dashBoard.showFormatedAmount(parseFloat(0))){
if(balanceString == ""){
balanceString = balanceString + negIndex +"|" + posIndex +"|" + dashBoard.showFormatedAmount(parseFloat(negativeParticipantBalance[negIndex])*(-1));
} else{
balanceString = balanceString+"," + negIndex +"|" + posIndex +"|" + dashBoard.showFormatedAmount(parseFloat(negativeParticipantBalance[negIndex])*(-1));
}
//update array amount
positiveParticipantBalance[posIndex] = 0;
negativeParticipantBalance[negIndex] = 0;
}
}
}
}
maxPartIndex = dashBoard.getMaxMinParticipantId(positiveParticipantBalance,1);
minPartIndex = dashBoard.getMaxMinParticipantId(negativeParticipantBalance,2);
}
//alert(balanceString);
return balanceString;
}
this.getMaxMinParticipantId = function getMaxMinParticipantId(balanceList,ind){
var result = 0;
var participantIndex='';
for (var index in balanceList) {
//alert(dashBoard.showFormatedAmount(parseFloat(balanceList[index])));
if(ind == 1){
if(dashBoard.showFormatedAmount(parseFloat(balanceList[index])) > parseFloat(result)){
participantIndex = index;
result = parseFloat(balanceList[index]);
}
} else {
if(dashBoard.showFormatedAmount(parseFloat(balanceList[index])) < parseFloat(result)){
participantIndex = index;
result = parseFloat(balanceList[index]);
}
}
}
return participantIndex;
}
this.createGraphImage = function createGraphImage(){
$("#balance_chart_image").html("");
var imgData = $('#balance_chart').jqplotToImageStr({});
var imgElem = $('').attr('src',imgData).attr('id',"graph_image_id").attr('alt',"balance.png");
$("#balance_chart_image").html(imgElem);
dashBoard.downloadImage("graph_image_id");
// $('#balance_chart_image').append(imgElem);
}
this.downloadImage = function downloadImage(imageURL) {
/* var oImage = document.getElementById(imageURL);
var canvas = document.createElement("canvas");
document.body.appendChild(canvas);
if (typeof canvas.getContext == "undefined" || !canvas.getContext) {
alert("browser does not support this action, sorry");
return false;
}*/
try {
var img = document.getElementById(imageURL);
// window.location.href = img.src.replace('image/png', 'image/octet-stream');
window.open(img.src.replace('image/png', 'image/png'), "_blank");
/* var context = canvas.getContext("2d");
var width = oImage.width;
var height = oImage.height;
canvas.width = width;
canvas.height = height;
canvas.style.width = width + "px";
canvas.style.height = height + "px";
context.drawImage(oImage, 0, 0, width, height);
var rawImageData = canvas.toDataURL("image/png;base64");
rawImageData = rawImageData.replace("image/png", "image/octet-stream");
document.location.href = rawImageData;
// document.location.setAttribute("download", "YourFileName.jpeg");
document.body.removeChild(canvas);*/
}
catch (err) {
// document.body.removeChild(canvas);
alert("Sorry, can't download");
}
return true;
}
this.drawGraph = function drawGraph(){
if(plot1){
plot1.destroy();
}
var balanceString = dashBoard.updateParticipantBalance();
var data = [];
var barLabel = [];
var ticks = [];
for (var index in dashBoard.participants) {
// alert(parseFloat(dashBoard.participants[index].balance));
data.push(parseFloat(dashBoard.showFormatedAmount(dashBoard.participants[index].balance)));
barLabel.push(dashBoard.showFormatedAmount(parseFloat(dashBoard.participants[index].balance)));
ticks.push(dashBoard.getParticipantNameById(dashBoard.participants[index].id) );
}
// Can specify a custom tick Array.
// Ticks should match up one for each y value (category) in the series.
//var ticks = ['Rajib', 'Athar', 'Usama', 'Ajmal'];
var options = {
// The "seriesDefaults" option is an options object that will
// be applied to all series in the chart.
seriesDefaults:{
renderer:$.jqplot.BarRenderer,
rendererOptions: {fillToZero: true}
},
// Custom labels for the series are specified with the "label"
// option on the series option. Here a series option object
// is specified for each series.
series:[
{
color: '#008000',
showMarker: true,
pointLabels:{
show: true,
labels:barLabel
}
}
],
// Show the legend and put it outside the grid, but inside the
// plot container, shrinking the grid to accomodate the legend.
// A value of "outside" would not shrink the grid and allow
// the legend to overflow the container.
negativeSeriesColors: ["#FF0000"],
axes: {
// Use a category axis on the x axis and use our custom ticks.
xaxis: {
renderer: $.jqplot.CategoryAxisRenderer,
ticks: ticks
},
// Pad the y axis just a little so bars can get close to, but
// not touch, the grid boundaries. 1.2 is the default padding.
yaxis: {
pad: 1.18,
tickOptions: {formatString: '%d '+dashBoard.expense.currency}
}
},
title: {
text: 'Balance of "'+dashBoard.expense.title+'"'
},
};
plot1 = $.jqplot('balance_chart', [data],options);
dashBoard.showBalanceDetails(balanceString);
// dashBoard.createGraphImage();
// alert(plot1);
}
this.showBalanceDetails = function showBalanceDetails(balanceString){
var balancePaymentHtml = "
";
if(balanceString != ""){
var balanceStringArr = balanceString.split(",");
//alert(balanceStringArr.length);
for (var index in balanceStringArr) {
//alert(balanceStringArr[index]);
var balanceStringval = balanceStringArr[index].split("|");
balancePaymentHtml = balancePaymentHtml + '
'+dashBoard.getParticipantNameById(balanceStringval[0])+' should pay to '+dashBoard.getParticipantNameById(balanceStringval[1])+' '+dashBoard.showFormatedAmount(parseFloat(balanceStringval[2]))+' '+dashBoard.expense.currency+'(Mark as Paid)