var dashBoard; var userPermission; var plot1, plot2, plot3; $(document).ready(function () { if ($("#expenseData").val() == "") { $("#div_participant").html("




" + lblExpenseNOTFOUND + "

"); return; } var loadTabs = new LoadTabs(); loadTabs.startLoading($.parseJSON($("#expenseData").val())); }); function LoadTabs() { this.startLoading = function startLoading(data) { this.generateExpenseList(data); } this.calculateBalance = function calculateBalance() { } this.loadSettings = function loadSettings() { } this.generateExpenseList = function generateExpenseList(expenseInfoObj) { dashBoard = new DashBoard(); userPermission = new UserPermission(); $.each(expenseInfoObj, function (key, val) { if (key == "Expense") { var expenseObj = new Expense(); expenseObj.id = val.id; expenseObj.unique_url = val.unique_url; expenseObj.title = val.title; expenseObj.currency = val.currency; expenseObj.description = val.description; expenseObj.create_date = val.create_date; expenseObj.version = val.version; dashBoard.expense = expenseObj; $("#expenseTitleDiv").html(expenseObj.title); $("#expenseDescDiv").html(expenseObj.description); $("#ExpenseVersion").val(expenseObj.version); } else if (key === "FamilyExpense") { $.each(val, function (i, object) { var familyExpense = new FamilyExpense(); familyExpense.id = object.id; familyExpense.expenseId = object.id; familyExpense.recordType = object.record_type; familyExpense.expenseName = object.what; familyExpense.expenseCategory = object.category; familyExpense.category = object.category; familyExpense.amount = object.amount; familyExpense.expenseDate = object.expense_date_new; familyExpense.create_date = object.create_date; familyExpense.number_of_notes = object.number_of_notes; familyExpense.type = object.type; familyExpense.images = object.images; if (familyExpense.recordType == 1) { dashBoard.familyExpenses[familyExpense.id] = familyExpense; dashBoard.globalExpenseIndex++; } else { dashBoard.familyIncomes[familyExpense.id] = familyExpense; dashBoard.globalIncomeIndex++; } }); } else if (key === "Category") { $.each(val, function (i, object) { var category = new Category(); category.id = object.id; category.type = object.type; category.name = object.name; dashBoard.categories[category.id] = category; }); } else if (key === "Permissions") { // alert("hello Permission"); $.each(val, function (i, object) { var permission = new Permission({ id : object.user_id, name : object.name, email : object.email, permission : object.role, expense_id : dashBoard.expense.id, permission_name: object.role!= owner ? permission_list[object.role] : 'Owner' } ); userPermission.permissions[permission.id] = permission; }); } else if (key === "restricted_mode") { userPermission.restrict_mode = val; } }); dashBoard.displayCovePage(); dashBoard.setCurrentDate(); } } function DashBoard() { this.expense; this.familyExpenses = []; this.filteredFamilyExpenses = []; this.familyIncomes = []; this.filteredFamilyIncomes = []; this.categories = []; this.gridData = []; this.gridIncomeData = []; this.currentEditFamilyExpense; this.categoryHtml = ""; this.currentRecordType = 1; this.currentDate; this.isAddMode = true; this.globalExpenseIndex = 0; this.globalIncomeIndex = 0; setCookie('1_0'); // even family expnese has no participant but setting the default to use the common method as group and mess expense this.displayCovePage = function displayCovePage() { var justCreated = $("#justCreated").val(); $("#participantBox").hide(); $("#tabs").show(); $("#tabs").tabs({ active: 1 }); $("#expenseCreatedByDiv").html(lblCreatedOna + dashBoard.getFormatedDbDate(dashBoard.expense.create_date)); if (justCreated == "yes") { $("#tabs").tabs({ active: 1 }); // dashBoard.setParticipantGridExtension(); } else { //hide loading $("#dvLoading").hide(); } dashBoard.showIncomeList(); dashBoard.showExpenseList(); // dashBoard.setCategory(1, ""); } this.showExpenseList = function showExpenseList() { dashBoard.gridData = []; dashBoard.isAddMode = true; for (var index in dashBoard.familyExpenses) { dashBoard.gridData.push(dashBoard.getDataByExpense(dashBoard.familyExpenses[index])); } dashBoard.reloadGrid(); } this.showIncomeList = function showIncomeList() { dashBoard.gridIncomeData = []; dashBoard.isAddMode = true; for (var index in dashBoard.familyIncomes) { dashBoard.gridIncomeData.push(dashBoard.getDataByExpense(dashBoard.familyIncomes[index])); } dashBoard.loadIncomeGrid(); } this.getDataByExpense = function getDataByExpense(familyExpenseObj) { var key = familyExpenseObj.id; dashBoard.filteredFamilyExpenses[key] = dashBoard.getFilteredExpenseObj(familyExpenseObj); return [dashBoard.filteredFamilyExpenses[key].id, dashBoard.filteredFamilyExpenses[key].expenseName, dashBoard.filteredFamilyExpenses[key].expenseCategory, dashBoard.filteredFamilyExpenses[key].expenseDate, dashBoard.filteredFamilyExpenses[key].expenseDay, dashBoard.showFormatedAmount(dashBoard.filteredFamilyExpenses[key].amount)]; } this.getFilteredExpenseObj = function getFilteredExpenseObj(familyExpenseObj) { var filteredFamilyExpenseObj = new FilteredFamilyExpense(); filteredFamilyExpenseObj.id = familyExpenseObj.id; filteredFamilyExpenseObj.expenseName = familyExpenseObj.expenseName; filteredFamilyExpenseObj.expenseCategory = familyExpenseObj.expenseCategory; filteredFamilyExpenseObj.expenseDate = familyExpenseObj.expenseDate;//dashBoard.getFormatedDate(familyExpenseObj.expenseDate); filteredFamilyExpenseObj.expenseDay = dashBoard.getDayByDate(familyExpenseObj.expenseDate); filteredFamilyExpenseObj.amount = dashBoard.getFormatedAmount(familyExpenseObj.amount); filteredFamilyExpenseObj.noOfNotes = familyExpenseObj.noOfNotes; return filteredFamilyExpenseObj; } this.getFilteredExpenseObjPrint = function getFilteredExpenseObjPrint(familyExpenseObj) { var filteredFamilyExpenseObj = new FilteredFamilyExpense(); filteredFamilyExpenseObj.id = familyExpenseObj.id; filteredFamilyExpenseObj.amount = dashBoard.showFormatedAmount(familyExpenseObj.amount); filteredFamilyExpenseObj.expenseName = familyExpenseObj.expenseName; filteredFamilyExpenseObj.expenseCategory = familyExpenseObj.expenseCategory; filteredFamilyExpenseObj.expenseDate = familyExpenseObj.expenseDate;//dashBoard.getFormatedDate(familyExpenseObj.expenseDate); filteredFamilyExpenseObj.noOfNotes = familyExpenseObj.noOfNotes; return filteredFamilyExpenseObj; } this.getDayByDate = function getDayByDate(dateUnix) { var dateObj = new Date(dateUnix * 1000); var d = new Date(); var weekday = new Array(7); weekday[0] = "Sunday"; weekday[1] = "Monday"; weekday[2] = "Tuesday"; weekday[3] = "Wednesday"; weekday[4] = "Thursday"; weekday[5] = "Friday"; weekday[6] = "Saturday"; return weekday[dateObj.getDay()]; } this.reloadGrid = function reloadGrid() { var initDateEdit = function (elem) { setTimeout(function () { $(elem).datepicker({ dateFormat: 'dd-M-yy', autoSize: true, showOn: 'button', // it dosn't work in searching dialog changeYear: true, changeMonth: true, showButtonPanel: true, showWeek: true }); //$(elem).focus(); }, 100); }; var maxRowNum = dashBoard.globalExpenseIndex; if (maxRowNum < 101) { maxRowNum = 100; } $("#grid").jqGrid({ datatype: "local", height: 232, title: false, colNames: ['SI', lblForWhatReason, lblCategory, lblWhen, lblDay, lblAmount + '(' + dashBoard.expense.currency + ')?'], colModel: [ { name: 'SI', index: 'SI', width: 0, sorttype: "int", hidden: true, key: true }, { name: 'Reason', index: 'Reason', align: 'center', width: 290, formoptions: { rowpos: 1 }, editable: true, editrules: { required: true }, editoptions: { maxlength: 25 }, sorttype: "float" }, { name: 'Category', index: 'Category', width: 180, align: 'center', formoptions: { rowpos: 2 }, editable: true, edittype: 'select', editoptions: { value: '1:X', defaultValue: 'X' } }, { name: 'Date', index: 'Date', width: 85, align: 'center', sorttype: 'date', formoptions: { rowpos: 3 }, editable: true, editrules: { required: true }, editoptions: { dataInit: initDateEdit } }, { name: 'Day', index: 'Day', align: 'center', width: 75, sorttype: "float", cellattr: function (rowId, tv, rawObject, cm, rdata) { return 'style="white-space: normal !important;"' } }, { name: 'Amount', index: 'Amount', align: 'center', width: 120, sorttype: "float", formoptions: { elmsuffix: '(' + dashBoard.expense.currency + ')', rowpos: 4 }, editable: true, editrules: { required: true }, editoptions: { maxlength: 18, dataInit: function (el) { $(el).keyup(function () { el.value = el.value.replace(/[^0-9\.]/g, ''); if (el.value.replace(/[^.]/g, "").length == 2) { el.value = el.value.substring(0, el.value.length - 1); } dashBoard.changeExpenseAmount(); }); } } }, ], rowNum: maxRowNum, rowList: [10, 20, 50, maxRowNum], pager: '#expense_pager', gridview: true, rownumbers: true, autoencode: true, ignoreCase: true, viewrecords: true, sortorder: 'desc', caption: lblParticipantList } ); dashBoard.addRowsToGrid(dashBoard.gridData, '#grid'); $("#grid").jqGrid('setGridParam', { onSelectRow: function (rowid, iRow, iCol, e) { if (!iCol) { dashBoard.isAddMode = false; dashBoard.loadForEdit(); } } } ); $("#grid").jqGrid('setGridParam', { ondblClickRow: function (rowid, iRow, iCol, e) { if (!isPermitted) { return false; } dashBoard.isAddMode = false; jQuery(this).jqGrid('editGridRow', rowid); } }); $("#grid").jqGrid('navGrid', '#expense_pager', { add: isPermitted, addtitle: lblAddExpense, edit: isPermitted, edittitle: lblModifyExpense, del: isPermitted, deltitle: lblDeleteExpense, search: true, searchtitle: lblFindExpenses }, { recreateForm: true, beforeInitData: function () { dashBoard.isAddMode = false; } }, { recreateForm: true, beforeInitData: function () { dashBoard.isAddMode = true; } } ); dashBoard.setExpenseGridExtension(); jQuery("#grid").setGridParam({ rowNum: maxRowNum }).trigger("reloadGrid"); $('.ui-jqgrid-bdiv').scrollTop($('#grid')[0].scrollHeight); } this.setExpenseGridExtension = function setExpenseGridExtension() { $.extend($.jgrid.edit, { addCaption: lblAddExpense, editCaption: lblModifyExpense, bSubmit: lblSave, bCancel: lblCancel, recreateForm: true, beforeShowForm: function () { if (dashBoard.isAddMode == true) { $('' + lblSaveContinue + '') .click(function () { dashBoard.validateExpenseAddForm(0); }) .addClass("fm-button ui-state-default ui-corner-all fm-button-icon-left") .prependTo("#Act_Buttons>td.EditButton"); $('#Category').find('option').remove().end().append(dashBoard.categoryHtml); $("#Date").val(dashBoard.currentDate); } else { dashBoard.loadForEdit(); } }, beforeSubmit: function (response, postData) { dashBoard.validateExpenseAddForm(1); } }); $.extend($.jgrid.del, { caption: lblDeleteExpense, msg: lblWantDeleteExpense, beforeShowForm: function (){ $.jgrid.viewModal("#delmodgrid"); }, beforeSubmit: function (response, postData) { dashBoard.deleteExpense(); } }); } this.loadIncomeGrid = function loadIncomeGrid() { var initDateEdit = function (elem) { setTimeout(function () { $(elem).datepicker({ dateFormat: 'dd-M-yy', autoSize: true, showOn: 'button', // it dosn't work in searching dialog changeYear: true, changeMonth: true, showButtonPanel: true, showWeek: true }); }, 100); }; var maxRowNum = dashBoard.globalIncomeIndex; if (maxRowNum < 101) { maxRowNum = 100; } $("#income_grid").jqGrid({ datatype: "local", height: 232, title: false, colNames: ['SI', lblForWhatReason, lblCategory, lblWhen, lblDay, lblAmount + '(' + dashBoard.expense.currency + ')?'], colModel: [ { name: 'SI', index: 'SI', width: 0, sorttype: "int", hidden: true, key: true }, { name: 'Reason', index: 'Reason', align: 'center', width: 290, formoptions: { rowpos: 1 }, editable: true, editrules: { required: true }, editoptions: { maxlength: 25 }, sorttype: "float" }, { name: 'Category', index: 'Category', width: 180, align: 'center', formoptions: { rowpos: 2 }, editable: true, edittype: 'select', editoptions: { value: '1:X', defaultValue: 'X' } }, { name: 'Date', index: 'Date', width: 85, align: 'center', sorttype: 'date', formoptions: { rowpos: 3 }, editable: true, editrules: { required: true }, editoptions: { dataInit: initDateEdit } }, { name: 'Day', index: 'Day', align: 'center', width: 75, sorttype: "float", cellattr: function (rowId, tv, rawObject, cm, rdata) { return 'style="white-space: normal !important;"' } }, { name: 'Amount', index: 'Amount', align: 'center', width: 120, formoptions: { elmsuffix: '(' + dashBoard.expense.currency + ')', rowpos: 4 }, editable: true, editrules: { required: true }, editoptions: { maxlength: 18, dataInit: function (el) { $(el).keyup(function () { //alert(el.value); el.value = el.value.replace(/[^0-9\.]/g, ''); if (el.value.replace(/[^.]/g, "").length == 2) { el.value = el.value.substring(0, el.value.length - 1); } dashBoard.changeExpenseAmount(); }); } } }, ], rowNum: maxRowNum, rowList: [10, 20, 50, maxRowNum], pager: '#income_pager', gridview: true, rownumbers: true, autoencode: true, ignoreCase: true, viewrecords: true, sortorder: 'desc', caption: lblIncomeList } ); dashBoard.addRowsToGrid(dashBoard.gridIncomeData, '#income_grid'); $("#income_grid").jqGrid('setGridParam', { onSelectRow: function (rowid, iRow, iCol, e) { if (!iCol) { dashBoard.isAddMode = false; dashBoard.loadForEdit(); } } } ); $("#income_grid").jqGrid('setGridParam', { ondblClickRow: function (rowid, iRow, iCol, e) { if (!isPermitted) { return false; } dashBoard.isAddMode = false; jQuery(this).jqGrid('editGridRow', rowid); } }); $("#income_grid").jqGrid('navGrid', '#income_pager', { add: isPermitted, addtitle: lblAddIncome, edit: isPermitted, edittitle: lblModifyIncome, del: isPermitted, deltitle: lblDeleteIncome, search: true, searchtitle: lblFindIncome }, { recreateForm: true, beforeInitData: function () { dashBoard.isAddMode = false; } }, { recreateForm: true, beforeInitData: function () { dashBoard.isAddMode = true; } } ); jQuery("#income_grid").setGridParam({ rowNum: maxRowNum }).trigger("reloadGrid"); $('.ui-jqgrid-bdiv').scrollTop($('#income_grid')[0].scrollHeight); } this.setIncomeGridExtension = function setIncomeGridExtension() { $.extend($.jgrid.edit, { addCaption: lblAddIncome, editCaption: lblModifyIncome, bSubmit: lblSave, bCancel: lblCancel, // width:300, recreateForm: true, beforeShowForm: function () { if (dashBoard.isAddMode == true) { $('' + lblSaveContinue + '') .click(function () { dashBoard.validateExpenseAddForm(0); }) .addClass("fm-button ui-state-default ui-corner-all fm-button-icon-left") .prependTo("#Act_Buttons>td.EditButton"); $('#Category').find('option').remove().end().append(dashBoard.categoryHtml); $("#Date").val(dashBoard.currentDate); } else { dashBoard.loadForEdit(); } }, beforeSubmit: function (response, postData) { dashBoard.validateExpenseAddForm(1); } }); $.extend($.jgrid.del, { caption: lblDeleteIncome, msg: lblWantDeleteIncome, beforeShowForm: function (){ $.jgrid.viewModal("#delmodincome_grid"); }, beforeSubmit: function (response, postData) { dashBoard.deleteIncome(); } }); } this.loadForEdit = function loadForEdit() { if (dashBoard.currentRecordType == "1") { var rowId = $("#grid").jqGrid('getGridParam', 'selrow'); var rowData = jQuery("#grid").getRowData(rowId); dashBoard.showEditUI(dashBoard.familyExpenses[rowData['SI']]); } else { var rowId = $("#income_grid").jqGrid('getGridParam', 'selrow'); var rowData = jQuery("#income_grid").getRowData(rowId); dashBoard.showEditUI(dashBoard.familyIncomes[rowData['SI']]); } $('#Category').find('option').remove().end().append(dashBoard.categoryHtml); } this.updateBalance = function updateBalance() { //balance } this.setCategory = function setCategory(type, defaultValue) { dashBoard.categoryHtml = ""; dashBoard.currentRecordType = type; for (var index in dashBoard.categories) { if (dashBoard.categories[index].type == "0" || dashBoard.categories[index].type == type) { if (defaultValue == dashBoard.categories[index].name) { dashBoard.categoryHtml += ''; } else { dashBoard.categoryHtml += ''; } } } } this.showEditUI = function showEditUI(expenseObj) { dashBoard.currentEditFamilyExpense = expenseObj; //set Category dashBoard.setCategory(dashBoard.currentRecordType, expenseObj.expenseCategory); //assign parts and freeze amounts to all participants } // 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((new Date(date * 1000)).toUTCString()); 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.getFormatedDbDate = function getFormatedDbDate(date) { var time; if (date != "" && date != null) { //alert(date); var dateObj = date.split(" "); var dateInfo = dateObj[0].split("-"); var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']; var year = dateInfo[0]; var month = months[parseInt(dateInfo[1]) - 1]; var date = String(dateInfo[2]); if (date.length == 1) { time = '0' + date + '-' + month + '-' + year; } else { time = date + '-' + month + '-' + year; } } return time; } this.setCurrentDate = function setCurrentDate() { var dateObj = new Date(); 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.inArrayElement = function inArrayElement(array, value) { var result = false; for (var i = 0; i < array.length; i++) { if (array[i] === value) { result = true; break; } } return result; } this.isCategoryExistInObj = function isCategoryExistInObj(catArray, categoryName) { var result = false; var category; for (var id in catArray) { category = catArray[id]; if (category.name === categoryName) { result = true; break; } } return result; } this.validateExpenseAddForm = function validateExpenseAddForm(source) { var errorMessage = ""; //validate expense name if (!$('#Reason').val().trim()) { errorMessage = lblEnterNameOfExpense } else if ($('#Reason').val().trim().length > 25) { errorMessage = lblExpenseNameLessThanChar } //validate amount field if (errorMessage == "") { if (!$('#Amount').val().trim()) { errorMessage = lblValidAmount } else if (parseFloat($('#Amount').val()) <= parseFloat(0)) { errorMessage = lblValidAmount } } //validate date if (errorMessage == "") { if ($('#Date').val().trim() != "") { var dateArray = $('#Date').val().trim().split("-"); if (dateArray.length != 3) { errorMessage = lblDateNotValid; } 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(""); $('#Reason').focus(); } this.addRowsToGrid = function addRowsToGrid(data, grid_id) { var names = ['SI', 'Reason', 'Category', 'Date', 'Day', 'Amount']; 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++) { $(grid_id).jqGrid('addRowData', data[i][0], mydata[i]); } } else { $(grid_id).jqGrid('setRowData', data[0][0], mydata[0]); dashBoard.isAddMode = true; } } this.getExpenseUniqueId = function getExpenseUniqueId() { var maxExpId = 0; var extractedIndex = 0; var expenseIdArray; if (dashBoard.currentRecordType == "1") { for (var id in dashBoard.familyExpenses) { expenseIdArray = dashBoard.familyExpenses[id].id.split("-"); if (maxExpId < parseInt(expenseIdArray[1])) { maxExpId = parseInt(expenseIdArray[1]); } } } else { for (var id in dashBoard.familyIncomes) { expenseIdArray = dashBoard.familyIncomes[id].id.split("-"); if (maxExpId < parseInt(expenseIdArray[1])) { maxExpId = parseInt(expenseIdArray[1]); } } } return dashBoard.currentRecordType + "-" + String(pad(maxExpId + 1, 5)) + "-" + dashBoard.expense.id; } this.isValueModified = function isValueModified(oldExpObj, newExpObj) { var isChanged = false; if (oldExpObj.expenseName != newExpObj.expenseName) { isChanged = true; } else if (oldExpObj.expenseCategory != newExpObj.expenseCategory) { isChanged = true; } else if (oldExpObj.expenseDate != newExpObj.expenseDate) { isChanged = true; } else if (parseFloat(oldExpObj.amount) != parseFloat(newExpObj.amount)) { isChanged = true; } return isChanged; } this.addExpenseToGrid = function addExpenseToGrid() { var familyExpenseObj; //collect data from edit form if (dashBoard.isAddMode == true) { familyExpenseObj = new FamilyExpense(); familyExpenseObj.id = dashBoard.getExpenseUniqueId(); familyExpenseObj.expenseId = dashBoard.expense.id; familyExpenseObj.isAdd = "8"; familyExpenseObj = dashBoard.getInputFormData(familyExpenseObj); familyExpenseObj.type = 1; familyExpenseObj.recordType = dashBoard.currentRecordType; if (familyExpenseObj.recordType == "1") { dashBoard.globalExpenseIndex++; } else { dashBoard.globalIncomeIndex++; } } else { familyExpenseObj = new FamilyExpense(); familyExpenseObj = dashBoard.getInputFormData(familyExpenseObj); //check whether data is modified or not. If not change then return if (!dashBoard.isValueModified(dashBoard.currentEditFamilyExpense, familyExpenseObj)) { return; } familyExpenseObj = dashBoard.currentEditFamilyExpense; familyExpenseObj = dashBoard.getInputFormData(familyExpenseObj); familyExpenseObj.expenseId = dashBoard.expense.id; familyExpenseObj.isAdd = "9"; familyExpenseObj.id = dashBoard.currentEditFamilyExpense.id; } familyExpenseObj.isreimburse = 0; dashBoard.processExpenseData(familyExpenseObj); } this.processExpenseData = function processExpenseData(familyExpenseObj) { if (familyExpenseObj.recordType == "1") { dashBoard.familyExpenses[familyExpenseObj.id] = familyExpenseObj; sendDataToServer(familyExpenseObj, "#expenseForm"); var data = []; data.push(dashBoard.getDataByExpense(familyExpenseObj)); dashBoard.addRowsToGrid(data, '#grid'); //go to the last page after adding record dashBoard.setPageAfterAdd('#grid'); } else { dashBoard.familyIncomes[familyExpenseObj.id] = familyExpenseObj; sendDataToServer(familyExpenseObj, "#expenseForm"); var data = []; data.push(dashBoard.getDataByExpense(familyExpenseObj)); dashBoard.addRowsToGrid(data, '#income_grid'); //go to the last page after adding record dashBoard.setPageAfterAdd('#income_grid'); } } this.setPageAfterAdd = function setPageAfterAdd(grid_id) { if (dashBoard.isAddMode == true) { var lastPage = $(grid_id).getGridParam('lastpage'); var totalRecords = $(grid_id).getGridParam('records'); var rowNum = $(grid_id).getGridParam('rowNum'); if (totalRecords > (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.getInputFormData = function getInputFormData(familyExpenseObj) { var amountStr = ""; var isDetails = false; familyExpenseObj.expenseCategory = $('#Category').val(); familyExpenseObj.expenseName = $('#Reason').val(); familyExpenseObj.amount = $('#Amount').val(); familyExpenseObj.expenseDate = $('#Date').val();//getTimeStampByInputDate($('#Date').val()); return familyExpenseObj; } this.deleteExpense = function deleteExpense() { var rowId = $("#grid").jqGrid('getGridParam', 'selrow'); var i; $('#grid').jqGrid('delRowData', rowId); var deletedExpObj = dashBoard.familyExpenses[rowId]; delete dashBoard.familyExpenses[rowId]; deletedExpObj.isAdd = "10"; deletedExpObj.expenseId = dashBoard.expense.id; dashBoard.setPageAfterDelete('#grid'); sendDataToServer(deletedExpObj, "#expenseForm"); $(".ui-icon-closethick").trigger('click'); } this.deleteIncome = function deleteIncome() { var rowId = $("#income_grid").jqGrid('getGridParam', 'selrow'); var i; $('#income_grid').jqGrid('delRowData', rowId); var deletedExpObj = dashBoard.familyIncomes[rowId]; delete dashBoard.familyIncomes[rowId]; deletedExpObj.isAdd = "10"; deletedExpObj.expenseId = dashBoard.expense.id; dashBoard.setPageAfterDelete('#income_grid'); sendDataToServer(deletedExpObj, "#expenseForm"); $(".ui-icon-closethick").trigger('click'); } 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"); dashBoard.downloadImage("graph_image_id"); } this.downloadImage = function downloadImage(imageURL) { try { var img = document.getElementById(imageURL); window.open(img.src.replace('image/png', 'image/png'), "_blank"); } catch (err) { alert(lblCantDownload); } return true; } this.drawGraph = function drawGraph() { if (plot1) { plot1.destroy(); } if (plot2) { plot2.destroy(); } if (plot3) { plot3.destroy(); } var data = []; var barLabel = []; var ticks = []; var data_income = []; var barLabel_income = []; var ticks_income = []; var data_balance = []; var totalExpense = 0; var totalIncome = 0; var balance = 0; var balance_color_code = "#008000"; var actualBalance = 0; var catObj; var expenseCategories = []; var incomeCategories = []; var noOfExpenseCategories = 0; var noOfIncomeCategories = 0; for (var index in dashBoard.familyExpenses) { totalExpense = parseFloat(totalExpense) + parseFloat(dashBoard.familyExpenses[index].amount); if (dashBoard.isCategoryExistInObj(expenseCategories, dashBoard.familyExpenses[index].expenseCategory)) { //get the object catObj = expenseCategories[dashBoard.familyExpenses[index].expenseCategory]; catObj.amount = parseFloat(catObj.amount) + parseFloat(dashBoard.familyExpenses[index].amount); expenseCategories[dashBoard.familyExpenses[index].expenseCategory] = catObj; } else { noOfExpenseCategories++; //insert new entry into expenseCategories catObj = new Category(); catObj.name = dashBoard.familyExpenses[index].expenseCategory; catObj.amount = dashBoard.familyExpenses[index].amount; expenseCategories[catObj.name] = catObj; } } var sortableExpenseCategories = []; for (var index in expenseCategories) sortableExpenseCategories.push([expenseCategories[index].name, expenseCategories[index].amount]) sortableExpenseCategories.sort(function (a, b) { return b[1] - a[1] }) for (var index in sortableExpenseCategories) { data.push(parseFloat(dashBoard.showFormatedAmount(sortableExpenseCategories[index][1]))); barLabel.push(dashBoard.showFormatedAmount(parseFloat(sortableExpenseCategories[index][1]))); ticks.push(sortableExpenseCategories[index][0] + "\n" + parseFloat(dashBoard.showFormatedAmount(sortableExpenseCategories[index][1])) + " " + dashBoard.expense.currency); } // for (var index in expenseCategories) { // data.push(parseFloat(dashBoard.showFormatedAmount(expenseCategories[index].amount))); // barLabel.push(dashBoard.showFormatedAmount(parseFloat(expenseCategories[index].amount))); // ticks.push(expenseCategories[index].name + "\n"+parseFloat(dashBoard.showFormatedAmount(expenseCategories[index].amount))+" "+dashBoard.expense.currency); // } for (var index in dashBoard.familyIncomes) { totalIncome = parseFloat(totalIncome) + parseFloat(dashBoard.familyIncomes[index].amount); if (dashBoard.isCategoryExistInObj(incomeCategories, dashBoard.familyIncomes[index].expenseCategory)) { //get the object catObj = incomeCategories[dashBoard.familyIncomes[index].expenseCategory]; catObj.amount = parseFloat(catObj.amount) + parseFloat(dashBoard.familyIncomes[index].amount); incomeCategories[dashBoard.familyIncomes[index].expenseCategory] = catObj; } else { noOfIncomeCategories++; //insert new entry into incomeCategories catObj = new Category(); catObj.name = dashBoard.familyIncomes[index].expenseCategory; catObj.amount = dashBoard.familyIncomes[index].amount; incomeCategories[catObj.name] = catObj; } } //calculate balance balance = parseFloat(totalIncome) - parseFloat(totalExpense); actualBalance = balance; if (parseFloat(balance) < parseFloat(0)) { balance_color_code = "#FF0000"; balance = parseFloat(balance) * (-1); } var sortableIncomeCategories = []; for (var index in incomeCategories) sortableIncomeCategories.push([incomeCategories[index].name, incomeCategories[index].amount]) sortableIncomeCategories.sort(function (a, b) { return b[1] - a[1] }) for (var index in sortableIncomeCategories) { data_income.push(parseFloat(dashBoard.showFormatedAmount(sortableIncomeCategories[index][1]))); barLabel_income.push(dashBoard.showFormatedAmount(parseFloat(sortableIncomeCategories[index][1]))); ticks_income.push(sortableIncomeCategories[index][0] + "\n" + parseFloat(dashBoard.showFormatedAmount(sortableIncomeCategories[index][1])) + " " + dashBoard.expense.currency); } // for (var index in incomeCategories) { // data_income.push(parseFloat(dashBoard.showFormatedAmount(incomeCategories[index].amount))); // barLabel_income.push(dashBoard.showFormatedAmount(parseFloat(incomeCategories[index].amount))); // ticks_income.push(incomeCategories[index].name+"\n"+parseFloat(dashBoard.showFormatedAmount(incomeCategories[index].amount))+" "+dashBoard.expense.currency); // } if (noOfExpenseCategories < 3) { $("#expense_chart").css("width", "250px"); } else { $("#expense_chart").css("width", (noOfExpenseCategories * 100) + "px"); } if (noOfIncomeCategories < 3) { $("#income_chart").css("width", "250px"); } else { $("#income_chart").css("width", (noOfIncomeCategories * 100) + "px"); } var options_income = { seriesDefaults: { renderer: $.jqplot.BarRenderer, rendererOptions: { fillToZero: true } }, axesDefaults: { min: 0 }, series: [ { color: '#ADFF2F', showMarker: true, pointLabels: { show: true, labels: barLabel_income } } ], negativeSeriesColors: ["#FF0000"], axes: { xaxis: { renderer: $.jqplot.CategoryAxisRenderer, ticks: ticks_income }, yaxis: { pad: 0.18, tickOptions: { formatString: '%d ' + dashBoard.expense.currency } } }, title: { text: lblIncomesOf + '"' + dashBoard.expense.title + '"' }, }; var options_expense = { seriesDefaults: { renderer: $.jqplot.BarRenderer, rendererOptions: { fillToZero: true } }, axesDefaults: { min: 0 }, series: [ { color: '#A9A9A9', showMarker: true, pointLabels: { show: true, labels: barLabel } } ], negativeSeriesColors: ["#FF0000"], axes: { xaxis: { renderer: $.jqplot.CategoryAxisRenderer, ticks: ticks }, yaxis: { pad: 0.18, tickOptions: { formatString: '%d ' + dashBoard.expense.currency } } }, title: { text: lblIncomesOf + '"' + dashBoard.expense.title + '"' }, highlighter: { show: true, sizeAdjust: 10, tooltipLocation: 'n', tooltipAxes: 'yref', useAxesFormatters: false, }, }; /* var options_balance = { gridPadding: {top:0, bottom:38, left:0, right:0}, seriesDefaults:{ renderer:$.jqplot.PieRenderer, trendline:{ show:false }, rendererOptions: { padding: 8, showDataLabels: false } }, seriesColors: ["#068481","#B7C8B6", balance_color_code], legend:{ show:true, placement: 'outside', rendererOptions: { numberRows: 1 }, location:'s', marginTop: '15px' } }; */ var ticks = [lblIncome, lblExpens, lblBalance]; var data_balance = [['Income', totalIncome], ['Expense', totalExpense], ['Balance', balance]]; var options_balance = { seriesDefaults: { renderer: $.jqplot.BarRenderer, rendererOptions: { fillToZero: true, varyBarColor: true }, pointLabels: { show: true } }, seriesColors: ["#ADFF2F", "#A9A9A9", balance_color_code], axesDefaults: { min: 0 }, axes: { xaxis: { renderer: $.jqplot.CategoryAxisRenderer, ticks: ticks }, yaxis: { pad: 0.18, } }, highlighter: { show: true, sizeAdjust: 10, tooltipLocation: 'n', tooltipAxes: 'yref', useAxesFormatters: false, }, }; // var data_balance = [totalIncome,totalExpense,balance]; // var data_balance = [['Income', totalIncome],['Expense', totalExpense], ['Balance', balance]]; var data_balance = [totalIncome, totalExpense, balance]; plot1 = $.jqplot('income_chart', [data_income], options_income); plot2 = $.jqplot('expense_chart', [data], options_expense); plot3 = $.jqplot('balance_chart', [data_balance], options_balance); //set balance description var balancePaymentHtml = ""; balancePaymentHtml = balancePaymentHtml + '
' + lblTotalIncome + ' :' + dashBoard.showFormatedAmount(totalIncome) + ' ' + dashBoard.expense.currency + '
'; balancePaymentHtml = balancePaymentHtml + lblTotalExpense + ' :' + dashBoard.showFormatedAmount(totalExpense) + ' ' + dashBoard.expense.currency + '
'; balancePaymentHtml = balancePaymentHtml + '

-----------------------------

'; balancePaymentHtml = balancePaymentHtml + '

' + lblBalance + ' :' + dashBoard.showFormatedAmount(actualBalance) + ' ' + dashBoard.expense.currency + '

'; $("#balance_description_div").html(balancePaymentHtml); } ///////////////////////////////////////////////////////////////// Participant section //////////////////////////////////////////// this.processAfterValidation = function processAfterValidation(errorMessage) { if (errorMessage != "") { dashBoard.showErrorMessage(errorMessage); } else { dashBoard.clearErrorMessage(); dashBoard.addParticipant($('#Name').val().trim(), "2"); $(".ui-icon-closethick").trigger('click'); } } this.printExpense = function printExpense() { var data_expense = []; var data_income = []; var totalExpense = 0; var totalIncome = 0; var balance = 0; for (var id in dashBoard.familyExpenses) { totalExpense = parseFloat(totalExpense) + parseFloat(dashBoard.familyExpenses[id].amount); data_expense.push(dashBoard.getFilteredExpenseObjPrint(dashBoard.familyExpenses[id])); } for (var id in dashBoard.familyIncomes) { totalIncome = parseFloat(totalIncome) + parseFloat(dashBoard.familyIncomes[id].amount); data_income.push(dashBoard.getFilteredExpenseObjPrint(dashBoard.familyIncomes[id])); } //calculate balance balance = parseFloat(totalIncome) - parseFloat(totalExpense); $("#printExpense").val(JSON.stringify(dashBoard.expense)); $("#printExpenseList").val(JSON.stringify(data_expense)); $("#printIncomeList").val(JSON.stringify(data_income)); $("#printNames").val(JSON.stringify(dashBoard.getFormatedDbDate(dashBoard.expense.create_date) + "," + dashBoard.showFormatedAmount(totalIncome) + "," + dashBoard.showFormatedAmount(totalExpense) + "," + dashBoard.showFormatedAmount(balance))); $("#printForm").submit(); } } function isValidDate(dateArray) { var errorMessage = ""; var error = lblDateNotValid; var day = dateArray[0]; var month = dateArray[1]; var year = dateArray[2]; month = getNoMonthFromStrMon(month); if (month == "") { errorMessage = error; } if (errorMessage == "") { if ((parseInt(day) <= 31 && parseInt(day) >= 1) && (parseInt(month) <= 12 && parseInt(month) >= 1) && (parseInt(year) <= 2999 && parseInt(year) >= 1900)) { if (parseInt(month) == 2 && parseInt(day) > 28) { if (!isLeapYear(year)) { errorMessage = error; } } } else { errorMessage = error; } } return errorMessage; } function getNoMonthFromStrMon(month) { var months = ['jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', 'aug', 'sep', 'oct', 'nov', 'dec']; switch (month.toLowerCase()) { case months[0]: month = "01"; break; case months[1]: month = "02"; break; case months[2]: month = "03"; break; case months[3]: month = "04"; break; case months[4]: month = "05"; break; case months[5]: month = "06"; break; case months[6]: month = "07"; break; case months[7]: month = "08"; break; case months[8]: month = "09"; break; case months[9]: month = "10"; break; case months[10]: month = "11"; break; case months[11]: month = "12"; break; default: month = ""; } return month; } function getTimeStampByInputDate(dateStr) { var dateArray = dateStr.trim().split("-"); if (dateArray[0].length == 1) { dateArray[0] = "0" + dateArray[0]; } //Jan/2017/25 12:44:33 UTC var formatedDateStr = dateArray[1] + "/" + dateArray[2] + "/" + dateArray[0] + " " + "00:00:00" + " UTC"; return (new Date(formatedDateStr).getTime()) / 1000; } function isLeapYear(year) { return ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0); } function pad(n, width, z) { z = z || '0'; n = n + ''; return n.length >= width ? n : new Array(width - n.length + 1).join(z) + n; } function addExpense() { if (dashBoard.isAddMode == true) { dashBoard.addExpenseToGrid(); } else { dashBoard.addExpenseToGrid(); } } function sendDataToServer(formData, formName) { var formUrl = $(formName).attr('action'); formData.unique_url = getUniqueUrl(); console.log(formUrl); $.ajax({ type: 'POST', url: formUrl, data: formData, success: function (data, textStatus, xhr) { //alert(data); if (data.trim() == "+000") { dashBoard.expense.version = parseInt(dashBoard.expense.version) + 1; $("#ExpenseVersion").val(dashBoard.expense.version); } else { alert("Data saving failed!"); } }, error: function (xhr, textStatus, error) { } }); } function loadData(formData, formName) { var formUrl = $(formName).attr('action'); $.ajax({ type: 'POST', url: formUrl, data: formData, success: function (data, textStatus, xhr) { var loadTabs = new LoadTabs(); loadTabs.startLoading($.parseJSON(data)); if (data.trim() == "+000") { alert("Success") } else { } }, error: function (xhr, textStatus, error) { } }); } $('#sendEmailForm').submit(function () { $(".submit").css("float", "left"); document.getElementById('loadImg').style.display = 'inline-block'; $("#ExpenseEmailExpenseTitle").val(dashBoard.expense.title); $("#ExpenseEmailUniqueURL").val(dashBoard.expense.unique_url); //serialize form data var formData = $(this).serialize(); //get form action var formUrl = $(this).attr('action'); $.ajax({ type: 'POST', url: formUrl, data: formData, success: function (data, textStatus, xhr) { alert(lblEmailSent); document.getElementById('loadImg').style.display = 'none'; }, error: function (xhr, textStatus, error) { alert(lblEmailSentFail); document.getElementById('loadImg').style.display = 'none'; } }); return false; }); $('#updateGroupExpenseForm').submit(function () { //serialize form data document.getElementById('loadImg2').style.display = 'inline-block'; $(".submit").css("float", "left"); //get form action var formUrl = $(this).attr('action'); // $('#updateGroupExpenseForm').find('span').text(""); if (dashBoard.expense.title == $("#ExpenseTitle").val().trim() && dashBoard.expense.currency == $("#ExpenseCurrency").val().trim() & dashBoard.expense.description == $("#ExpenseDescription").val().trim() ) { document.getElementById('loadImg2').style.display = 'none'; return false; } dashBoard.expense.title = $("#ExpenseTitle").val(); dashBoard.expense.currency = $("#ExpenseCurrency").val(); dashBoard.expense.description = $("#ExpenseDescription").val(); dashBoard.expense.version = parseInt(dashBoard.expense.version) + 1; //show updated value $("#expenseTitleDiv").html(dashBoard.expense.title); $("#expenseDescDiv").html(dashBoard.expense.description); $("#ExpenseVersion").val(dashBoard.expense.version); var formData = $(this).serialize(); formData = formData + '&unique_url=' + getUniqueUrl(); $('#grid').jqGrid('GridUnload'); dashBoard.showExpenseList(); $('#income_grid').jqGrid('GridUnload'); dashBoard.showIncomeList(); $.ajax({ type: 'POST', url: formUrl, data: formData, success: function (data, textStatus, xhr) { if (data.trim() == "+000") { document.getElementById('loadImg2').style.display = 'none'; alert(lblDataSaved); } else { dashBoard.expense.version = parseInt(dashBoard.expense.version) - 1; $("#ExpenseVersion").val(dashBoard.expense.version); var lineArray = data.split("#"); var totalLine = lineArray.length - 1; for (var i = 0; i < totalLine; i++) { var msgArray = lineArray[i].split("|"); $('#error_' + msgArray[0]).text(msgArray[1]); } } document.getElementById('loadImg').style.display = 'none'; }, error: function (xhr, textStatus, error) { dashBoard.expense.version = parseInt(dashBoard.expense.version) - 1; $("#ExpenseVersion").val(dashBoard.expense.version); // alert(error); document.getElementById('loadImg').style.display = 'none'; } }); return false; }); function showMessage(message) { $("#error_dialog").html(message); $("#error_dialog").dialog(); } function sendEmail(formData, formName) { //get form action var formUrl = $(formName).attr('action'); $.ajax({ type: 'POST', url: formUrl, data: formData, success: function (data, textStatus, xhr) { if (data.trim() == "+000") { } else { } }, error: function (xhr, textStatus, error) { } }); } function Expense() { this.id; this.unique_url; this.title; this.currency; this.description; this.create_date; this.version } function FamilyExpense() { //this.index; this.id; this.expenseId; this.recordType; this.isAdd; this.expenseName; this.expenseCategory; this.amount; this.expenseDate; this.expenseDay; this.noOfNotes; this.isreimburse; this.type;//1=normal expense,2=balance entry } function FilteredFamilyExpense() { this.id; this.amount; this.expenseName; this.expenseCategory; this.expenseDate; this.expenseDay; this.noOfNotes; } function Category() { this.id; this.name; this.type; this.amount; } function Email() { this.email; this.uniqueURL; this.title; }