227 lines
5.3 KiB
JavaScript
227 lines
5.3 KiB
JavaScript
var fkl_hasnext=false;
|
|
var fkl_hasprev=false;
|
|
|
|
/* hide the value list */
|
|
function hideAc() {
|
|
jQuery.ppa.o=0;
|
|
with (jQuery.ppa) {
|
|
fklist.hide();
|
|
fkbg.hide();
|
|
}
|
|
}
|
|
|
|
/* enable/disable auto-complete feature */
|
|
function triggerAc(ac) {
|
|
if (ac) {
|
|
jQuery.ppa.attrs
|
|
.bind('keyup.ac_action', autocomplete)
|
|
.bind('focus.ac_action', autocomplete)
|
|
.bind('keypress.ac_action', move)
|
|
.addClass('ac_field');
|
|
}
|
|
else {
|
|
jQuery.ppa.attrs
|
|
.removeClass('ac_field')
|
|
.unbind('.ac_action');
|
|
}
|
|
}
|
|
|
|
/* select the given index value and highlight it */
|
|
function selectVal(index) {
|
|
if (index == jQuery.ppa.i)
|
|
return;
|
|
|
|
// we catch the header as well so it takes th index 0
|
|
var trs = jQuery.ppa.fklist.find('tr');
|
|
|
|
// change colors for unselected
|
|
if (jQuery.ppa.i > 0)
|
|
trs.eq(jQuery.ppa.i).find('*').css({
|
|
'background-color': '#fff',
|
|
'color': ''
|
|
});
|
|
|
|
// change colors for newly selected
|
|
trs.eq(index).find('*').css({
|
|
'background-color': '#3d80df',
|
|
'color': '#fff'
|
|
});
|
|
|
|
jQuery.ppa.i = index;
|
|
}
|
|
|
|
function openlist(e) {
|
|
var elt = jQuery(e);
|
|
var attnum = elt.attr('id').match(/\d+/)[0];
|
|
/* FIXME we only support the first FK constraint of the field */
|
|
var conid = attrs['attr_'+attnum][0];
|
|
|
|
var constr = constrs["constr_" + conid];
|
|
|
|
// get the changed attribute position in the arrays
|
|
for (i=0; (constr.pattnums[i] != attnum);i++);
|
|
|
|
var datas = {
|
|
fattpos: i,
|
|
fvalue: e.value,
|
|
database: database,
|
|
'keys[]': constr.pattnums,
|
|
'keynames[]': constr.pattnames,
|
|
'fkeynames[]': constr.fattnames,
|
|
f_table: constr.f_table,
|
|
f_schema: constr.f_schema,
|
|
offset: jQuery.ppa.o
|
|
};
|
|
|
|
jQuery.ajax({
|
|
url: 'ajax-ac-insert.php?server=' + server,
|
|
type: 'post',
|
|
data: datas,
|
|
success: function (ret) {
|
|
jQuery.ppa.i = 0;
|
|
jQuery.ppa.fkbg.show();
|
|
with(jQuery.ppa.fklist) {
|
|
html(ret);
|
|
appendTo('#row_att_'+ attnum);
|
|
css('width',elt.css('width'));
|
|
show();
|
|
jQuery.ppa.numrow = find('tr').length;
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
|
|
/* move the cursor down or up,
|
|
* load available next/prev values if going out of bound */
|
|
function move(event) {
|
|
/* selecting next value down.
|
|
* if the list is closed, it will open next */
|
|
if(event.keyCode == 40) {
|
|
if (jQuery.ppa.fklist[0].style.display == 'block') {
|
|
if ((jQuery.ppa.i + 1) < jQuery.ppa.numrow) {
|
|
selectVal(jQuery.ppa.i + 1);
|
|
}
|
|
else if (fkl_hasnext == true) {
|
|
jQuery.ppa.o+=11;
|
|
openlist(this);
|
|
}
|
|
}
|
|
else {
|
|
openlist(this);
|
|
}
|
|
}
|
|
/* selecting prev value up */
|
|
else if(event.keyCode == 38) {
|
|
if ((jQuery.ppa.i - 1) > 0) {
|
|
selectVal(jQuery.ppa.i - 1);
|
|
}
|
|
else if ((fkl_hasprev == true) && (jQuery.ppa.i == 1)) {
|
|
jQuery.ppa.o-=11;
|
|
openlist(this);
|
|
}
|
|
else {
|
|
selectVal(jQuery.ppa.numrow -1);
|
|
}
|
|
}
|
|
}
|
|
|
|
/* open/update the value list */
|
|
function autocomplete(event) {
|
|
|
|
/* if pressing enter, fire a click on the selected line */
|
|
if (event.keyCode == 13) {
|
|
if (jQuery.ppa.i > 0) {
|
|
jQuery.ppa.fklist.find('tr').eq(jQuery.ppa.i).click();
|
|
}
|
|
return false;
|
|
}
|
|
/* ignoring 38:up and 40:down */
|
|
else if ( event.keyCode == 38 || event.keyCode == 40 ) {
|
|
return false;
|
|
}
|
|
/* ignoring 9:tab, 37:left, 39:right, 16:shift, ctrl: 17, alt:18, 20:lockmaj */
|
|
else if ( event.keyCode == 9 || event.keyCode == 37 || event.keyCode == 39
|
|
|| event.keyCode == 16 || event.keyCode == 17
|
|
|| event.keyCode == 18 || event.keyCode == 20) {
|
|
return true;
|
|
}
|
|
/* esc */
|
|
else if (event.keyCode == 27) {
|
|
hideAc();
|
|
}
|
|
/* request the list of possible values asynchronously */
|
|
else {
|
|
/* if we refresh because of a value update,
|
|
* we reset back to offset 0 so we catch values
|
|
* if list is smaller than 11 values */
|
|
if (event.type == 'keyup')
|
|
jQuery.ppa.o = 0;
|
|
openlist(this);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
/* bind actions on values lines: hover for style change, click for select */
|
|
with(jQuery('tr.acline')) {
|
|
live('mouseover', function () {
|
|
selectVal(jQuery('table.ac_values tr').index(this));
|
|
});
|
|
|
|
live('click', function () {
|
|
var a = jQuery(this).find('td > a.fkval');
|
|
|
|
for (i=0; i < a.length; i++) {
|
|
jQuery('input[name="values['+ a[i].name +']"]').val(a[i].innerHTML);
|
|
}
|
|
hideAc();
|
|
});
|
|
}
|
|
|
|
jQuery('#fkprev').live('click', function () {
|
|
jQuery.ppa.o -= 11;
|
|
/* get the field that is the previous html elt from the #fklist
|
|
* and trigger its focus to refresh the list AND actualy
|
|
* focus back on the field */
|
|
jQuery('#fklist').prev().focus();
|
|
});
|
|
|
|
jQuery('#fknext').live('click', function () {
|
|
jQuery.ppa.o += 11;
|
|
/* get the field that is the previous html elt from the #fklist
|
|
* and trigger its focus to refresh the list AND actualy
|
|
* focus back on the field*/
|
|
jQuery('#fklist').prev().focus();
|
|
});
|
|
|
|
jQuery(document).ready(function () {
|
|
/* register some global value in the ppa namespace */
|
|
jQuery.ppa = {
|
|
fklist: jQuery('#fklist'),
|
|
attrs: jQuery('input[id^=attr_]'), // select fields with FK
|
|
fkbg: jQuery('#fkbg'),
|
|
i:0, // selected value indice
|
|
o:0 // offset when navigating prev/next
|
|
};
|
|
|
|
/* close the list when clicking outside of it */
|
|
jQuery.ppa.fkbg.click(function (e) {
|
|
hideAc();
|
|
});
|
|
|
|
/* do not submit the form when selecting a value by pressing enter */
|
|
jQuery.ppa.attrs
|
|
.keydown(function (e) {
|
|
if (e.keyCode == 13 && jQuery.ppa.fklist[0].style.display == 'block')
|
|
return false;
|
|
});
|
|
|
|
/* enable/disable auto-complete according to the checkbox */
|
|
triggerAc(
|
|
jQuery('#no_ac').click(function () {
|
|
triggerAc(this.checked);
|
|
})[0].checked
|
|
);
|
|
});
|