110 lines
2.6 KiB
JavaScript
110 lines
2.6 KiB
JavaScript
/**
|
|
* Autocompleter.Request
|
|
*
|
|
* http://digitarald.de/project/autocompleter/
|
|
*
|
|
* @version 1.1.2
|
|
*
|
|
* @license MIT-style license
|
|
* @author Harald Kirschner <mail [at] digitarald.de>
|
|
* @copyright Author
|
|
*/
|
|
|
|
Autocompleter.Request = new Class({
|
|
|
|
Extends: Autocompleter,
|
|
|
|
options: {/*
|
|
indicator: null,
|
|
indicatorClass: null,
|
|
onRequest: $empty,
|
|
onComplete: $empty,*/
|
|
postData: {},
|
|
ajaxOptions: {},
|
|
postVar: 'value'
|
|
|
|
},
|
|
|
|
query: function(){
|
|
var data = $unlink(this.options.postData) || {};
|
|
data[this.options.postVar] = this.queryValue;
|
|
var indicator = $(this.options.indicator);
|
|
if (indicator) indicator.setStyle('display', '');
|
|
var cls = this.options.indicatorClass;
|
|
if (cls) this.element.addClass(cls);
|
|
this.fireEvent('onRequest', [this.element, this.request, data, this.queryValue]);
|
|
this.request.send({'data': data});
|
|
},
|
|
|
|
/**
|
|
* queryResponse - abstract
|
|
*
|
|
* Inherated classes have to extend this function and use this.parent()
|
|
*/
|
|
queryResponse: function() {
|
|
var indicator = $(this.options.indicator);
|
|
if (indicator) indicator.setStyle('display', 'none');
|
|
var cls = this.options.indicatorClass;
|
|
if (cls) this.element.removeClass(cls);
|
|
return this.fireEvent('onComplete', [this.element, this.request]);
|
|
}
|
|
|
|
});
|
|
|
|
Autocompleter.Request.JSON = new Class({
|
|
|
|
Extends: Autocompleter.Request,
|
|
|
|
initialize: function(el, url, options) {
|
|
this.parent(el, options);
|
|
this.request = new Request.JSON($merge({
|
|
'url': url,
|
|
'link': 'cancel'
|
|
}, this.options.ajaxOptions)).addEvent('onComplete', this.queryResponse.bind(this));
|
|
},
|
|
|
|
queryResponse: function(response) {
|
|
this.parent();
|
|
this.update(response);
|
|
}
|
|
|
|
});
|
|
|
|
Autocompleter.Request.HTML = new Class({
|
|
|
|
Extends: Autocompleter.Request,
|
|
|
|
initialize: function(el, url, options) {
|
|
this.parent(el, options);
|
|
this.request = new Request.HTML($merge({
|
|
'url': url,
|
|
'link': 'cancel',
|
|
'update': this.choices
|
|
}, this.options.ajaxOptions)).addEvent('onComplete', this.queryResponse.bind(this));
|
|
},
|
|
|
|
queryResponse: function(tree, elements) {
|
|
this.parent();
|
|
if (!elements || !elements.length) {
|
|
this.hideChoices();
|
|
} else {
|
|
this.choices.getChildren(this.options.choicesMatch).each(this.options.injectChoice || function(choice) {
|
|
var value = choice.innerHTML;
|
|
choice.inputValue = value;
|
|
this.addChoiceEvents(choice.set('html', this.markQueryValue(value)));
|
|
}, this);
|
|
this.showChoices();
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
/* compatibility */
|
|
|
|
Autocompleter.Ajax = {
|
|
Base: Autocompleter.Request,
|
|
Json: Autocompleter.Request.JSON,
|
|
Xhtml: Autocompleter.Request.HTML
|
|
};
|