2 // We need a few arrays to populate project dropdown.
3 // When client selection changes, the project dropdown must be re-populated with only relevant projects.
5 // project_ids[143] = "325,370,390,400"; // Comma-separated list of project ids for client.
6 // project_names[325] = "Time Tracker"; // Project name.
8 // Prepare an array of project ids for clients.
9 var project_ids = new Array();
10 {foreach $client_list as $client}
11 project_ids[{$client.id}] = "{$client.projects}";
13 // Prepare an array of project names.
14 var project_names = new Array();
15 {foreach $project_list as $project}
16 project_names[{$project.id}] = "{$project.name|escape:'javascript'}";
18 // We'll use this array to populate project dropdown when client is not selected.
20 var projects = new Array();
21 {foreach $project_list as $project}
22 projects[idx] = new Array("{$project.id}", "{$project.name|escape:'javascript'}");
26 // Mandatory top option for project dropdown.
27 var empty_label_project = "{$i18n.dropdown.select|escape:'javascript'}";
29 // Prepare an array of predefined expenses.
31 var defined_expenses = new Array();
32 {foreach $predefined_expenses as $predefined_expense}
33 defined_expenses[idx] = new Array("{$predefined_expense.id}", "{$predefined_expense.name|escape:'javascript'}", "{$predefined_expense.cost}");
37 // The fillProjectDropdown function populates the project combo box with
38 // projects associated with a selected client (client id is passed here as id).
39 function fillProjectDropdown(id) {
40 var str_ids = project_ids[id];
41 var dropdown = document.getElementById("project");
42 // Determine previously selected item.
43 var selected_item = dropdown.options[dropdown.selectedIndex].value;
45 // Remove existing content.
47 // Add mandatory top option.
48 dropdown.options[0] = new Option(empty_label_project, '', true);
50 // Populate project dropdown.
52 // If we are here, client is not selected.
53 var len = projects.length;
54 for (var i = 0; i < len; i++) {
55 dropdown.options[i+1] = new Option(projects[i][1], projects[i][0]);
56 if (dropdown.options[i+1].value == selected_item)
57 dropdown.options[i+1].selected = true;
60 var ids = new Array();
61 ids = str_ids.split(",");
64 for (var i = 0; i < len; i++) {
66 dropdown.options[i+1] = new Option(project_names[p_id], p_id);
67 if (dropdown.options[i+1].value == selected_item)
68 dropdown.options[i+1].selected = true;
74 var date = new Date();
75 return date.strftime("%Y-%m-%d");
78 // The recalculateCost function recalculates cost based on the current selection
79 // of predefined expense and quantity and also changes the comment accordingly.
80 function recalculateCost() {
81 var quantity_control = document.getElementById("quantity");
82 // Set quantity to 1 if it is not set already.
83 if (!quantity_control.value) {
84 quantity_control.value = "1";
87 var comment_control = document.getElementById("item_name");
88 var cost_control = document.getElementById("cost");
89 var replaceDecimalMark = ("." != "{$user->getDecimalMark()}");
92 var dropdown = document.getElementById("predefined_expense");
93 if (dropdown.selectedIndex == 0) {
94 quantity_control.value = "";
95 comment_control.value = "";
96 cost_control.value = "";
98 comment_control.value = defined_expenses[dropdown.selectedIndex - 1][1] + " - " + quantity_control.value;
99 var quantity = quantity_control.value;
101 cost_control.value = "";
103 var expenseCost = defined_expenses[dropdown.selectedIndex - 1][2];
104 if (replaceDecimalMark)
105 expenseCost = expenseCost.replace("{$user->getDecimalMark()}", ".");
106 var newCost = (quantity_control.value * expenseCost).toFixed(2);
107 if (replaceDecimalMark)
108 newCost = newCost.replace(".", "{$user->getDecimalMark()}");
109 cost_control.value = newCost;
115 {$forms.expensesForm.open}
116 <table cellspacing="4" cellpadding="0" border="0">
122 <td align="right">{$i18n.label.user}:</td>
123 <td>{$forms.expensesForm.user.control}</td>
126 {if $user->isPluginEnabled('cl')}
128 <td align="right">{$i18n.label.client}{if $user->isPluginEnabled('cm')} (*){/if}:</td>
129 <td>{$forms.expensesForm.client.control}</td>
134 <td align="right">{$i18n.label.project} (*):</td>
135 <td>{$forms.expensesForm.project.control}</td>
138 {if $predefined_expenses}
140 <td align="right">{$i18n.label.expense}:</td>
141 <td>{$forms.expensesForm.predefined_expense.control}</td>
144 <td align="right">{$i18n.label.quantity}:</td>
145 <td>{$forms.expensesForm.quantity.control}</td>
149 <td align="right">{$i18n.label.comment} (*):</td>
150 <td>{$forms.expensesForm.item_name.control}</td>
153 <td align="right">{$i18n.label.cost} (*):</td>
154 <td>{$forms.expensesForm.cost.control} {$user->getCurrency()|escape}</td>
160 <tr><td>{$forms.expensesForm.date.control}</td></tr>
168 <td align="center" colspan="2">{$forms.expensesForm.btn_submit.control}</td>
176 <table border="0" cellpadding="3" cellspacing="1" width="100%">
178 {if $user->isPluginEnabled('cl')}
179 <td width="20%" class="tableHeader">{$i18n.label.client}</td>
182 <td class="tableHeader">{$i18n.label.project}</td>
184 <td class="tableHeader">{$i18n.label.item}</td>
185 <td width="5%" class="tableHeaderCentered">{$i18n.label.cost}</td>
186 <td width="5%" class="tableHeader">{$i18n.label.edit}</td>
188 {foreach $expense_items as $item}
189 <tr bgcolor="{cycle values="#f5f5f5,#ffffff"}">
190 {if $user->isPluginEnabled('cl')}
191 <td valign="top">{$item.client|escape}</td>
194 <td valign="top">{$item.project|escape}</td>
196 <td valign="top">{$item.item|escape}</td>
197 <td valign="top" align="right">{$item.cost}</td>
198 <td valign="top" align="center">{if $item.invoice_id} {else}<a href='expense_edit.php?id={$item.id}'>{$i18n.label.edit}</a>{/if}</td>
202 <table border="0" cellpadding="3" cellspacing="1" width="100%">
204 <td nowrap align="right">{$i18n.label.day_total}: {$user->getCurrency()|escape} {$day_total}</td>
211 {$forms.expensesForm.close}