+namespace('kivi', function(k){
+ 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,
+ };
+ var o = $.extend({
+ limit: 20,
+ delay: 50,
+ }, options);
+ var STATES = {
+ UNIQUE: 1,
+ UNDEFINED: 0,
+ }
+ var real_id = $real.attr('id');
+ var $dummy = $('#' + real_id + '_name');
+ var $type = $('#' + real_id + '_type');
+ var $unit = $('#' + real_id + '_unit');
+ var $convertible_unit = $('#' + real_id + '_convertible_unit');
+ var $column = $('#' + real_id + '_column');
+ var state = STATES.PICKED;
+ var last_real = $real.val();
+ var last_dummy = $dummy.val();
+ var timer;
+
+ function open_dialog () {
+ open_jqm_window({
+ url: 'controller.pl?action=Part/part_picker_search',
+ data: $.extend({
+ real_id: real_id,
+ }, ajax_data($dummy.val())),
+ id: 'part_selection',
+ });
+ window.clearTimeout(timer);
+ return true;
+ }
+
+ function ajax_data(term) {
+ var data = {
+ 'filter.all:substr::ilike': term,
+ 'filter.obsolete': 0,
+ 'filter.unit_obj.convertible_to': $convertible_unit && $convertible_unit.val() ? $convertible_unit.val() : '',
+ column: $column && $column.val() ? $column.val() : '',
+ current: $real.val(),
+ };
+
+ if ($type && $type.val())
+ data['filter.type'] = $type.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, ajax items have description
+ $dummy.val(item.name ? item.name : item.description);
+ } else {
+ $real.val('');
+ $dummy.val('');
+ }
+ state = STATES.PICKED;
+ last_real = $real.val();
+ last_dummy = $dummy.val();
+ $real.trigger('change');
+ }
+
+ function make_defined_state () {
+ if (state == STATES.PICKED)
+ return true
+ else if (state == STATES.UNDEFINED && $dummy.val() == '')
+ set_item({})
+ else
+ set_item({ id: last_real, name: last_dummy })
+ }
+
+ function update_results () {
+ $.ajax({
+ url: 'controller.pl?action=Part/part_picker_result',
+ data: $.extend({
+ 'real_id': $real.val(),
+ }, ajax_data(function(){ var val = $('#part_picker_filter').val(); return val === undefined ? '' : val })),
+ success: function(data){ $('#part_picker_result').html(data) }
+ });
+ };
+
+ function result_timer (event) {
+ window.clearTimeout(timer);
+ timer = window.setTimeout(update_results, 100);
+ }
+
+ function close_popup() {
+ $('#part_selection').jqmClose()
+ };
+