Auftrags-Controller: kivi.Order.js: Kosmetik
[kivitendo-erp.git] / js / kivi.Order.js
1 namespace('kivi.Order', function(ns) {
2   ns.check_cv = function() {
3     if ($('#type').val() == 'sales_order' || $('#type').val() == 'sales_quotation') {
4       if ($('#order_customer_id').val() === '') {
5         alert(kivi.t8('Please select a customer.'));
6         return false;
7       }
8     } else  {
9       if ($('#order_vendor_id').val() === '') {
10         alert(kivi.t8('Please select a vendor.'));
11         return false;
12       }
13     }
14     return true;
15   };
16
17   ns.check_save_duplicate_parts = function() {
18     var id_arr = $('[name="order.orderitems[].parts_id"]').map(function() { return this.value; }).get();
19
20     var i, obj = {}, pos = [];
21
22     for (i = 0; i < id_arr.length; i++) {
23       var id = id_arr[i];
24       if (obj.hasOwnProperty(id)) {
25         pos.push(i + 1);
26       }
27       obj[id] = 0;
28     }
29
30     if (pos.length > 0) {
31       return confirm(kivi.t8("There are duplicate parts at positions") + "\n"
32                      + pos.join(', ') + "\n"
33                      + kivi.t8("Do you really want to save?"));
34     }
35     return true;
36   };
37
38   ns.check_valid_reqdate = function() {
39     if ($('#order_reqdate').val() === '') {
40       alert(kivi.t8('Please select a delivery date.'));
41       return false;
42     } else {
43       return true;
44     }
45   };
46
47   ns.save = function(action, warn_on_duplicates, warn_on_reqdate) {
48     if (!ns.check_cv()) return;
49     if (warn_on_duplicates && !ns.check_save_duplicate_parts()) return;
50     if (warn_on_reqdate    && !ns.check_valid_reqdate())        return;
51
52     var data = $('#order_form').serializeArray();
53     data.push({ name: 'action', value: 'Order/' + action });
54
55     $.post("controller.pl", data, kivi.eval_json_result);
56   };
57
58   ns.delete_order = function() {
59     var data = $('#order_form').serializeArray();
60     data.push({ name: 'action', value: 'Order/delete' });
61
62     $.post("controller.pl", data, kivi.eval_json_result);
63   };
64
65   ns.show_print_options = function() {
66     if (!ns.check_cv()) return;
67
68     kivi.popup_dialog({
69       id: 'print_options',
70       dialog: {
71         title: kivi.t8('Print options'),
72         width:  800,
73         height: 300
74       }
75     });
76   };
77
78   ns.print = function() {
79     $('#print_options').dialog('close');
80
81     var data = $('#order_form').serializeArray();
82     data = data.concat($('#print_options_form').serializeArray());
83     data.push({ name: 'action', value: 'Order/print' });
84
85     $.post("controller.pl", data, kivi.eval_json_result);
86   };
87
88   ns.download_pdf = function(pdf_filename, key) {
89     var data = [{ name: 'action',       value: 'Order/download_pdf' },
90                 { name: 'type',         value: $('#type').val()     },
91                 { name: 'pdf_filename', value: pdf_filename         },
92                 { name: 'key',          value: key                  }];
93     $.download("controller.pl", data);
94   };
95
96   ns.email = function() {
97     if (!ns.check_cv()) return;
98     var data = $('#order_form').serializeArray();
99     data.push({ name: 'action', value: 'Order/show_email_dialog' });
100
101     $.post("controller.pl", data, kivi.eval_json_result);
102   };
103
104   var email_dialog;
105
106   ns.setup_send_email_dialog = function() {
107     kivi.SalesPurchase.show_all_print_options_elements();
108     kivi.SalesPurchase.show_print_options_elements([ 'sendmode', 'media', 'copies', 'remove_draft' ], false);
109
110     $('#print_options_form table').first().remove().appendTo('#email_form_print_options');
111
112     var to_focus = $('#email_form_to').val() === '' ? 'to' : 'subject';
113     $('#email_form_' + to_focus).focus();
114   };
115
116   ns.finish_send_email_dialog = function() {
117     kivi.SalesPurchase.show_all_print_options_elements();
118
119     $('#email_form_print_options table').first().remove().prependTo('#print_options_form');
120     return true;
121   };
122
123   ns.show_email_dialog = function(html) {
124     var id            = 'send_email_dialog';
125     var dialog_params = {
126       id:     id,
127       width:  800,
128       height: 600,
129       title:  kivi.t8('Send email'),
130       modal:  true,
131       beforeClose: kivi.Order.finish_send_email_dialog,
132       close: function(event, ui) {
133         email_dialog.remove();
134       }
135     };
136
137     $('#' + id).remove();
138
139     email_dialog = $('<div style="display:none" id="' + id + '"></div>').appendTo('body');
140     email_dialog.html(html);
141     email_dialog.dialog(dialog_params);
142
143     kivi.Order.setup_send_email_dialog();
144
145     $('.cancel').click(ns.close_email_dialog);
146
147     return true;
148   };
149
150   ns.send_email = function() {
151     var data = $('#order_form').serializeArray();
152     data = data.concat($('[name^="email_form."]').serializeArray());
153     data = data.concat($('[name^="print_options."]').serializeArray());
154     data.push({ name: 'action', value: 'Order/send_email' });
155     $.post("controller.pl", data, kivi.eval_json_result);
156   };
157
158   ns.close_email_dialog = function() {
159     email_dialog.dialog("close");
160   };
161
162   ns.set_number_in_title = function(elt) {
163     $('#nr_in_title').html($(elt).val());
164   };
165
166   ns.reload_cv_dependant_selections = function() {
167     var data = $('#order_form').serializeArray();
168     data.push({ name: 'action', value: 'Order/customer_vendor_changed' });
169
170     $.post("controller.pl", data, kivi.eval_json_result);
171   };
172
173   ns.reformat_number = function(event) {
174     $(event.target).val(kivi.format_amount(kivi.parse_amount($(event.target).val()), -2));
175   };
176
177   ns.recalc_amounts_and_taxes = function() {
178     var data = $('#order_form').serializeArray();
179     data.push({ name: 'action', value: 'Order/recalc_amounts_and_taxes' });
180
181     $.post("controller.pl", data, kivi.eval_json_result);
182   };
183
184   ns.unit_change = function(event) {
185     var row           = $(event.target).parents("tbody").first();
186     var item_id_dom   = $(row).find('[name="orderitem_ids[+]"]');
187     var sellprice_dom = $(row).find('[name="order.orderitems[].sellprice_as_number"]');
188     var select_elt    = $(row).find('[name="order.orderitems[].unit"]');
189
190     var oldval = $(select_elt).data('oldval');
191     $(select_elt).data('oldval', $(select_elt).val());
192
193     var data = $('#order_form').serializeArray();
194     data.push({ name: 'action',           value: 'Order/unit_changed'     },
195               { name: 'item_id',          value: item_id_dom.val()        },
196               { name: 'old_unit',         value: oldval                   },
197               { name: 'sellprice_dom_id', value: sellprice_dom.attr('id') });
198
199     $.post("controller.pl", data, kivi.eval_json_result);
200   };
201
202   ns.update_sellprice = function(item_id, price_str) {
203     var row       = $('#item_' + item_id).parents("tbody").first();
204     var price_elt = $(row).find('[name="order.orderitems[].sellprice_as_number"]');
205     var html_elt  = $(row).find('[name="sellprice_text"]');
206     price_elt.val(price_str);
207     html_elt.html(price_str);
208   };
209
210   ns.load_second_row = function(row) {
211     var item_id_dom = $(row).find('[name="orderitem_ids[+]"]');
212     var div_elt     = $(row).find('[name="second_row"]');
213
214     if ($(div_elt).data('loaded') == 1) {
215       return;
216     }
217     var data = $('#order_form').serializeArray();
218     data.push({ name: 'action',     value: 'Order/load_second_rows' },
219               { name: 'item_ids[]', value: item_id_dom.val()        });
220
221     $.post("controller.pl", data, kivi.eval_json_result);
222   };
223
224   ns.load_all_second_rows = function() {
225     var rows = $('.row_entry').filter(function(idx, elt) {
226       return $(elt).find('[name="second_row"]').data('loaded') != 1;
227     });
228
229     var item_ids = $.map(rows, function(elt) {
230       var item_id = $(elt).find('[name="orderitem_ids[+]"]').val();
231       return { name: 'item_ids[]', value: item_id };
232     });
233
234     if (item_ids.length == 0) {
235       return;
236     }
237
238     var data = $('#order_form').serializeArray();
239     data.push({ name: 'action', value: 'Order/load_second_rows' });
240     data = data.concat(item_ids);
241
242     $.post("controller.pl", data, kivi.eval_json_result);
243   };
244
245   ns.hide_second_row = function(row) {
246     $(row).children().not(':first').hide();
247     $(row).data('expanded', 0);
248     var elt = $(row).find('.expand');
249     elt.attr('src', "image/expand.svg");
250     elt.attr('alt', kivi.t8('Show details'));
251     elt.attr('title', kivi.t8('Show details'));
252   };
253
254   ns.show_second_row = function(row) {
255     $(row).children().not(':first').show();
256     $(row).data('expanded', 1);
257     var elt = $(row).find('.expand');
258     elt.attr('src', "image/collapse.svg");
259     elt.attr('alt', kivi.t8('Hide details'));
260     elt.attr('title', kivi.t8('Hide details'));
261   };
262
263   ns.toggle_second_row = function(row) {
264     if ($(row).data('expanded') == 1) {
265       ns.hide_second_row(row);
266     } else {
267       ns.show_second_row(row);
268     }
269   };
270
271   ns.init_row_handlers = function() {
272     kivi.run_once_for('.recalc', 'on_change_recalc', function(elt) {
273       $(elt).change(ns.recalc_amounts_and_taxes);
274     });
275
276     kivi.run_once_for('.reformat_number', 'on_change_reformat', function(elt) {
277       $(elt).change(ns.reformat_number);
278     });
279
280     kivi.run_once_for('.unitselect', 'on_change_unit_with_oldval', function(elt) {
281       $(elt).data('oldval', $(elt).val());
282       $(elt).change(ns.unit_change);
283     });
284
285     kivi.run_once_for('.row_entry', 'on_kbd_click_show_hide', function(elt) {
286       $(elt).keydown(function(event) {
287         if (event.keyCode == 40 && event.shiftKey === true) {
288           // shift arrow down
289           event.preventDefault();
290           var row = $(event.target).parents(".row_entry").first();
291           ns.load_second_row(row);
292           ns.show_second_row(row);
293           return false;
294         }
295         if (event.keyCode == 38 && event.shiftKey === true) {
296           // shift arrow up
297           event.preventDefault();
298           var row = $(event.target).parents(".row_entry").first();
299           ns.hide_second_row(row);
300           return false;
301         }
302       });
303     });
304
305     kivi.run_once_for('.expand', 'expand_second_row', function(elt) {
306       $(elt).click(function(event) {
307         event.preventDefault();
308         var row = $(event.target).parents(".row_entry").first();
309         ns.load_second_row(row);
310         ns.toggle_second_row(row);
311         return false;
312       })
313     });
314
315   };
316
317   ns.redisplay_line_values = function(is_sales, data) {
318     $('.row_entry').each(function(idx, elt) {
319       $(elt).find('[name="linetotal"]').html(data[idx][0]);
320       if (is_sales && $(elt).find('[name="second_row"]').data('loaded') == 1) {
321         var mt = data[idx][1];
322         var mp = data[idx][2];
323         var h  = '<span';
324         if (mt[0] === '-') h += ' class="plus0"';
325         h += '>' + mt + '&nbsp;&nbsp;' + mp + '%';
326         h += '</span>';
327         $(elt).find('[name="linemargin"]').html(h);
328       }
329     });
330   };
331
332   ns.renumber_positions = function() {
333     $('.row_entry [name="position"]').each(function(idx, elt) {
334       $(elt).html(idx+1);
335     });
336   };
337
338   ns.reorder_items = function(order_by) {
339     var dir = $('#' + order_by + '_header_id a img').attr("data-sort-dir");
340     $('#row_table_id thead a img').remove();
341
342     var src;
343     if (dir == "1") {
344       dir = "0";
345       src = "image/up.png";
346     } else {
347       dir = "1";
348       src = "image/down.png";
349     }
350
351     $('#' + order_by + '_header_id a').append('<img border=0 data-sort-dir=' + dir + ' src=' + src + ' alt="' + kivi.t8('sort items') + '">');
352
353     var data = $('#order_form').serializeArray();
354     data.push({ name: 'action',   value: 'Order/reorder_items' },
355               { name: 'order_by', value: order_by              },
356               { name: 'sort_dir', value: dir                   });
357
358     $.post("controller.pl", data, kivi.eval_json_result);
359   };
360
361   ns.redisplay_items = function(data) {
362     var old_rows = $('.row_entry').detach();
363     var new_rows = [];
364     $(data).each(function(idx, elt) {
365       new_rows.push(old_rows[elt.old_pos - 1]);
366     });
367     $(new_rows).appendTo($('#row_table_id'));
368     ns.renumber_positions();
369   };
370
371   ns.add_item = function() {
372     if ($('#add_item_parts_id').val() === '') return;
373     if (!ns.check_cv()) return;
374
375     $('#row_table_id thead a img').remove();
376
377     var data = $('#order_form').serializeArray();
378     data.push({ name: 'action', value: 'Order/add_item' });
379
380     $.post("controller.pl", data, kivi.eval_json_result);
381   };
382
383   ns.show_multi_items_dialog = function() {
384     if (!ns.check_cv()) return;
385
386     $('#row_table_id thead a img').remove();
387
388     kivi.popup_dialog({
389       url: 'controller.pl?action=Order/show_multi_items_dialog',
390       data: { type:             $('#type').val(),
391               callback:         'Order/add_multi_items',
392               callback_data_id: 'order_form' },
393       id: 'jq_multi_items_dialog',
394       dialog: {
395         title:  kivi.t8('Add multiple items'),
396         width:  800,
397         height: 500
398       }
399     });
400     return true;
401   };
402
403   ns.close_multi_items_dialog = function() {
404     $('#jq_multi_items_dialog').dialog('close');
405   };
406
407   ns.delete_order_item_row = function(clicked) {
408     var row = $(clicked).parents("tbody").first();
409     $(row).remove();
410
411     ns.renumber_positions();
412     ns.recalc_amounts_and_taxes();
413   };
414
415   ns.row_table_scroll_down = function() {
416     $('#row_table_scroll_id').scrollTop($('#row_table_scroll_id')[0].scrollHeight);
417   };
418
419   ns.show_longdescription_dialog = function(clicked) {
420     var row                 = $(clicked).parents("tbody").first();
421     var position            = $(row).find('[name="position"]').html();
422     var partnumber          = $(row).find('[name="partnumber"]').html();
423     var description_elt     = $(row).find('[name="order.orderitems[].description"]');
424     var description         = description_elt.val();
425     var longdescription_elt = $(row).find('[name="order.orderitems[].longdescription"]');
426     var longdescription;
427
428     if (!longdescription_elt.length) {
429       var data = [
430         { name: 'action',   value: 'Order/get_item_longdescription'                          },
431         { name: 'type',     value: $('#type').val()                                          },
432         { name: 'item_id',  value: $(row).find('[name="order.orderitems[+].id"]').val()      },
433         { name: 'parts_id', value: $(row).find('[name="order.orderitems[].parts_id"]').val() }
434       ];
435
436       $.ajax({
437         url:      'controller.pl',
438         data:     data,
439         method:   "GET",
440         async:    false,
441         dataType: 'text',
442         success:  function(val) {
443           longdescription = val;
444         }
445       });
446     } else {
447       longdescription = longdescription_elt.val();
448     }
449
450     var params = {
451       runningnumber:           position,
452       partnumber:              partnumber,
453       description:             description,
454       default_longdescription: longdescription,
455       set_function:            function(val) {
456         longdescription_elt.remove();
457         $('<input type="hidden" name="order.orderitems[].longdescription">').insertAfter(description_elt).val(val);
458       }
459     };
460
461     kivi.SalesPurchase.edit_longdescription_with_params(params);
462   };
463
464   ns.price_chooser_item_row = function(clicked) {
465     if (!ns.check_cv()) return;
466     var row         = $(clicked).parents("tbody").first();
467     var item_id_dom = $(row).find('[name="orderitem_ids[+]"]');
468
469     var data = $('#order_form').serializeArray();
470     data.push({ name: 'action',  value: 'Order/price_popup' },
471               { name: 'item_id', value: item_id_dom.val()   });
472
473     $.post("controller.pl", data, kivi.eval_json_result);
474   };
475
476   ns.update_price_source = function(item_id, source, descr, price_str, price_editable) {
477     var row        = $('#item_' + item_id).parents("tbody").first();
478     var source_elt = $(row).find('[name="order.orderitems[].active_price_source"]');
479     var button_elt = $(row).find('[name="price_chooser_button"]');
480
481     button_elt.val(button_elt.val().replace(/.*\|/, descr + " |"));
482     source_elt.val(source);
483
484     var editable_div_elt     = $(row).find('[name="editable_price"]');
485     var not_editable_div_elt = $(row).find('[name="not_editable_price"]');
486     if (price_editable == 1 && source === '') {
487       // editable
488       $(editable_div_elt).show();
489       $(not_editable_div_elt).hide();
490       $(editable_div_elt).find(':input').prop("disabled", false);
491       $(not_editable_div_elt).find(':input').prop("disabled", true);
492     } else {
493       // not editable
494       $(editable_div_elt).hide();
495       $(not_editable_div_elt).show();
496       $(editable_div_elt).find(':input').prop("disabled", true);
497       $(not_editable_div_elt).find(':input').prop("disabled", false);
498     }
499
500     if (price_str) {
501       var price_elt = $(row).find('[name="order.orderitems[].sellprice_as_number"]');
502       var html_elt  = $(row).find('[name="sellprice_text"]');
503       price_elt.val(price_str);
504       html_elt.html(price_str);
505       ns.recalc_amounts_and_taxes();
506     }
507
508     kivi.io.close_dialog();
509   };
510
511   ns.update_discount_source = function(item_id, source, descr, discount_str, price_editable) {
512     var row        = $('#item_' + item_id).parents("tbody").first();
513     var source_elt = $(row).find('[name="order.orderitems[].active_discount_source"]');
514     var button_elt = $(row).find('[name="price_chooser_button"]');
515
516     button_elt.val(button_elt.val().replace(/\|.*/, "| " + descr));
517     source_elt.val(source);
518
519     var editable_div_elt     = $(row).find('[name="editable_discount"]');
520     var not_editable_div_elt = $(row).find('[name="not_editable_discount"]');
521     if (price_editable == 1 && source === '') {
522       // editable
523       $(editable_div_elt).show();
524       $(not_editable_div_elt).hide();
525       $(editable_div_elt).find(':input').prop("disabled", false);
526       $(not_editable_div_elt).find(':input').prop("disabled", true);
527     } else {
528       // not editable
529       $(editable_div_elt).hide();
530       $(not_editable_div_elt).show();
531       $(editable_div_elt).find(':input').prop("disabled", true);
532       $(not_editable_div_elt).find(':input').prop("disabled", false);
533     }
534
535     if (discount_str) {
536       var discount_elt = $(row).find('[name="order.orderitems[].discount_as_percent"]');
537       var html_elt     = $(row).find('[name="discount_text"]');
538       discount_elt.val(discount_str);
539       html_elt.html(discount_str);
540       ns.recalc_amounts_and_taxes();
541     }
542
543     kivi.io.close_dialog();
544   };
545
546   ns.show_periodic_invoices_config_dialog = function() {
547     if ($('#type').val() !== 'sales_order') return;
548
549     kivi.popup_dialog({
550       url:    'controller.pl?action=Order/show_periodic_invoices_config_dialog',
551       data:   { type:        $('#type').val(),
552                 id:          $('#id').val(),
553                 config:      $('#order_periodic_invoices_config').val(),
554                 customer_id: $('#order_customer_id').val(),
555                 transdate:   $('#order_transdate').val(),
556                 language_id: $('#language_id').val()
557               },
558       id:     'jq_periodic_invoices_config_dialog',
559       load:   kivi.reinit_widgets,
560       dialog: {
561         title:  kivi.t8('Edit the configuration for periodic invoices'),
562         width:  800,
563         height: 650
564       }
565     });
566     return true;
567   };
568
569   ns.close_periodic_invoices_config_dialog = function() {
570     $('#jq_periodic_invoices_config_dialog').dialog('close');
571   };
572
573   ns.assign_periodic_invoices_config = function() {
574     var data = $('[name="Form"]').serializeArray();
575     data.push({ name: 'type',   value: $('#type').val() },
576               { name: 'action', value: 'Order/assign_periodic_invoices_config' });
577     $.post("controller.pl", data, kivi.eval_json_result);
578   };
579
580   ns.check_save_active_periodic_invoices = function() {
581     var type = $('#type').val();
582     if (type !== 'sales_order') return true;
583
584     var active = false;
585     $.ajax({
586       url:      'controller.pl',
587       data:     { action: 'Order/get_has_active_periodic_invoices',
588                   type  : type,
589                   id    : $('#id').val(),
590                   config: $('#order_periodic_invoices_config').val(),
591                 },
592       method:   "GET",
593       async:    false,
594       dataType: 'text',
595       success:  function(val) {
596         active = val;
597       }
598     });
599
600     if (active == 1) {
601       return confirm(kivi.t8('This sales order has an active configuration for periodic invoices. If you save then all subsequently created invoices will contain those changes as well, but not those that have already been created. Do you want to continue?'));
602     }
603
604     return true;
605   };
606
607   ns.show_vc_details_dialog = function() {
608     if (!ns.check_cv()) return;
609     var vc;
610     var vc_id;
611     var title;
612     if ($('#type').val() == 'sales_order' || $('#type').val() == 'sales_quotation' ) {
613       vc    = 'customer';
614       vc_id = $('#order_customer_id').val();
615       title = kivi.t8('Customer details');
616     } else {
617       vc    = 'vendor';
618       vc_id = $('#order_vendor_id').val();
619       title = kivi.t8('Vendor details');
620     }
621
622     kivi.popup_dialog({
623       url:    'controller.pl',
624       data:   { action: 'Order/show_customer_vendor_details_dialog',
625                 type  : $('#type').val(),
626                 vc    : vc,
627                 vc_id : vc_id
628               },
629       id:     'jq_customer_vendor_details_dialog',
630       dialog: {
631         title:  title,
632         width:  800,
633         height: 650
634       }
635     });
636     return true;
637   };
638
639   ns.show_calculate_qty_dialog = function(clicked) {
640     var row        = $(clicked).parents("tbody").first();
641     var input_id   = $(row).find('[name="order.orderitems[].qty_as_number"]').attr('id');
642     var formula_id = $(row).find('[name="formula[+]"]').attr('id');
643
644     calculate_qty_selection_dialog("", input_id, "", formula_id);
645     return true;
646   };
647
648 });
649
650 $(function() {
651   if ($('#type').val() == 'sales_order' || $('#type').val() == 'sales_quotation' ) {
652     $('#order_customer_id').change(kivi.Order.reload_cv_dependant_selections);
653   } else {
654     $('#order_vendor_id').change(kivi.Order.reload_cv_dependant_selections);
655   }
656
657   if ($('#type').val() == 'sales_order' || $('#type').val() == 'sales_quotation' ) {
658     $('#add_item_parts_id').on('set_item:PartPicker', function(e,o) { $('#add_item_sellprice_as_number').val(kivi.format_amount(o.sellprice, -2)) });
659   } else {
660     $('#add_item_parts_id').on('set_item:PartPicker', function(e,o) { $('#add_item_sellprice_as_number').val(kivi.format_amount(o.lastcost, -2)) });
661   }
662   $('#add_item_parts_id').on('set_item:PartPicker', function(e,o) { $('#add_item_description').val(o.description) });
663   $('#add_item_parts_id').on('set_item:PartPicker', function(e,o) { $('#add_item_unit').val(o.unit) });
664
665   $('.add_item_input').keydown(function(event) {
666     if (event.keyCode == 13) {
667       event.preventDefault();
668       kivi.Order.add_item();
669       return false;
670     }
671   });
672
673   kivi.Order.init_row_handlers();
674
675   $('#row_table_id').on('sortstop', function(event, ui) {
676     $('#row_table_id thead a img').remove();
677     kivi.Order.renumber_positions();
678   });
679
680   $('#expand_all').on('click', function(event) {
681     event.preventDefault();
682     if ($('#expand_all').data('expanded') == 1) {
683       $('#expand_all').data('expanded', 0);
684       $('#expand_all').attr('src', 'image/expand.svg');
685       $('#expand_all').attr('alt', kivi.t8('Show all details'));
686       $('#expand_all').attr('title', kivi.t8('Show all details'));
687       $('.row_entry').each(function(idx, elt) {
688         kivi.Order.hide_second_row(elt);
689       });
690     } else {
691       $('#expand_all').data('expanded', 1);
692       $('#expand_all').attr('src', "image/collapse.svg");
693       $('#expand_all').attr('alt', kivi.t8('Hide all details'));
694       $('#expand_all').attr('title', kivi.t8('Hide all details'));
695       kivi.Order.load_all_second_rows();
696       $('.row_entry').each(function(idx, elt) {
697         kivi.Order.show_second_row(elt);
698       });
699     }
700     return false;
701   });
702
703 });