+namespace('kivi', function(k){
+ "use strict";
+
+ k.PartPicker = function($real, options) {
+ // short circuit in case someone double inits us
+ if ($real.data("part_picker"))
+ return $real.data("part_picker");
+
+ var KEY = {
+ ESCAPE: 27,
+ ENTER: 13,
+ TAB: 9,
+ LEFT: 37,
+ RIGHT: 39,
+ PAGE_UP: 33,
+ PAGE_DOWN: 34,
+ SHIFT: 16,
+ CTRL: 17,
+ ALT: 18,
+ };
+ var CLASSES = {
+ PICKED: 'partpicker-picked',
+ UNDEFINED: 'partpicker-undefined',
+ FAT_SET_ITEM: 'partpicker_fat_set_item',
+ }
+ var o = $.extend({
+ limit: 20,
+ delay: 50,
+ fat_set_item: $real.hasClass(CLASSES.FAT_SET_ITEM),
+ }, options);
+ var STATES = {
+ PICKED: CLASSES.PICKED,
+ UNDEFINED: CLASSES.UNDEFINED
+ }
+ var real_id = $real.attr('id');
+ var $dummy = $('#' + real_id + '_name');
+ var $part_type = $('#' + real_id + '_part_type');
+ var $classification_id = $('#' + real_id + '_classification_id');
+ var $unit = $('#' + real_id + '_unit');
+ var $convertible_unit = $('#' + real_id + '_convertible_unit');
+ var state = STATES.PICKED;
+ var last_real = $real.val();
+ var last_dummy = $dummy.val();
+ var timer;
+
+ function open_dialog () {
+ k.popup_dialog({
+ url: 'controller.pl?action=Part/part_picker_search',
+ data: $.extend({
+ real_id: real_id,
+ }, ajax_data($dummy.val())),
+ id: 'part_selection',
+ dialog: {
+ title: k.t8('Part picker'),
+ width: 800,
+ height: 800,
+ }
+ });
+ window.clearTimeout(timer);
+ return true;
+ }
+
+ function ajax_data(term) {
+ var data = {
+ 'filter.all:substr:multi::ilike': term,
+ 'filter.obsolete': 0,
+ 'filter.unit_obj.convertible_to': $convertible_unit && $convertible_unit.val() ? $convertible_unit.val() : '',
+ no_paginate: $('#no_paginate').prop('checked') ? 1 : 0,
+ current: $real.val(),
+ };
+
+ if ($part_type && $part_type.val())
+ data['filter.part_type'] = $part_type.val().split(',');
+
+ if ($classification_id && $classification_id.val())
+ data['filter.classification_id'] = $classification_id.val().split(',');
+
+ if ($unit && $unit.val())
+ data['filter.unit'] = $unit.val().split(',');
+
+ return data;
+ }
+
+ function set_item (item) {
+ if (item.id) {
+ $real.val(item.id);
+ // autocomplete ui has name, use the value for ajax items, which contains displayable_name
+ $dummy.val(item.name ? item.name : item.value);
+ } else {
+ $real.val('');
+ $dummy.val('');
+ }
+ state = STATES.PICKED;
+ last_real = $real.val();
+ last_dummy = $dummy.val();
+ $real.trigger('change');
+
+ if (o.fat_set_item && item.id) {