').appendTo(ul);
};
}
// Ugly Css verbindern: Betroffene Elemente erst nach document.ready
// sichtbar machen.
$(this.selectorButton).css("visibility", "visible");
};
ComboBox2.prototype.separator = ';';
// Sofern sich der Wert geändert hat wird er neu gesetzt und
// die Callback-Funktion OnKeyChange aufgerufen, damit die
// Applikation auf das Ereignis reagieren kann.
ComboBox2.prototype.setKeyAndValue = function (key, value) {
var self = this;
log(self.name + '.SETKEYANDVALUE: ' + key + ' / ' + value);
// Dialog-Fenster schliessen
if (!self.allowMultiselect) {
// Bei einem SimpleSelect kann das Dialogfenster direkt geschlossen werden.
if ($(self.selectorDialog).dialog("isOpen") == true) {
$(self.selectorDialog).dialog("close");
}
}
if ($(self.selectorValue).val() != value) {
$(self.selectorValue).val(value);
}
if ($(self.selectorKey).val() != key) {
$(self.selectorKey).val(key);
// Callback nur aufrufen, wenn sich der Wert geändert hat
if (self.callbackOnKeyChange != null) self.callbackOnKeyChange(key);
}
if ($(self.selectorKey).val() != '') {
if (!self.hasEmptyContainer) {
$(self.selectorInputBorder).parent().prepend("");
$(self.selectorEmptyButton).button({
icons: {
primary: 'ui-icon-circle-close'
},
text: false
}).click(
function () {
self.empty();
}
);
self.hasEmptyContainer = true;
}
if (!$(self.selectorEmptyButton).is(':visible')) {
$(self.selectorInputBorder).width($(self.selectorInputBorder).width() - 25);
$(self.selectorEmptyButton).show();
}
}
else {
if ($(self.selectorEmptyButton).is(':visible')) {
$(self.selectorEmptyButton).hide();
$(self.selectorInputBorder).width($(self.selectorInputBorder).width() + 25);
}
}
// log(self.name + '.setKeyAndValue done.');
};
// Aktuellen Key der ComboBox zurückgeben.
ComboBox2.prototype.getKey = function (/*key*/) {
var key = $(this.selectorKey).val();
log(">>>>> " + key + " = getKey()");
return key;
};
ComboBox2.prototype.setValue = function (value) {
log('SETVALUE: ' + value);
$(this.selectorValue).val(value);
};
ComboBox2.prototype.getValue = function () {
return $(this.selectorValue).val();
};
// Öffnet und Schließt das Dialog-Fenster
ComboBox2.prototype.toggleDialog = function () {
var self = this;
if ($(self.selectorDialog).dialog("isOpen") == false) {
// Alle anderen Dialog-Fenster schließen (Standardeinstellung)
// if (self.closeOtherDialogs) $(".ui-dialog-content").dialog("close");
$(self.selectorSelectable).empty();
self.load(function () {
if (self.callbackDialogBeforeOpen) self.callbackDialogBeforeOpen();
$(self.selectorDialog).dialog("open");
});
}
else { $(self.selectorDialog).dialog("close"); }
};
// Alle Werte der ComboBox leeren: Value, Key und Datenobjekte.
ComboBox2.prototype.empty = function () {
var self = this;
$(self.selectorValue).val('');
self.keyValues = null;
self.setKeyAndValue('', '');
};
// Verfügbare Daten setzen.
ComboBox2.prototype.setKeyValues = function (keyValues) {
this.keyValues = keyValues;
};
// Autovervollständigung: KeyValues nach request.term durchsuchen.
ComboBox2.prototype.callbackAutoComplete = function (request, response) {
log('callbackAutoComplete');
var self = this;
// Wir müssen die Funktion AutoComplete auch aufrufen, wenn kein Zeichen
// eingegeben wurde (z.B. beim Ausschneiden eines Textes), damit weiter
// unten die Funktion setKey('') ausgeführt wird.
request.term = $.trim(request.term);
var org_term = request.term;
var prefix_term = '';
// Bei Multiselect Term ab letztem Trennzeichen
if (self.allowMultiselect) {
var pos = request.term.lastIndexOf(self.separator);
if (pos != -1) {
prefix_term = request.term.substring(0, pos + self.separator.length);
request.term = request.term.substring(pos + self.separator.length);
}
}
log('CALLBACK AUTOCOMPLETE: ' + org_term + ' = ' + prefix_term + '|' + request.term);
var possibleObjs = [];
if (request.term.length > 0) {
// Die Funktion splice(x, y) begrenzt die Rückgabemenge.
possibleObjs = jQuery.map(this.keyValues, function (keyValue) {
// Eingaben müssen maskiert werden.
return (keyValue.value.match(new RegExp(escapeRegExp(request.term), "gi")) ? keyValue : null);
}).splice(0, 15);
}
// Hurra: Treffervorschläge sind vorhanden
if (possibleObjs.length > 0) {
// Möglichen Vervollständigungstext anzeigen.
// Der String muss unbedingt nach LowerCase konvertiert werden,
// da es ansonsten bei der Eingabe von 'a' zu Problemen kommt:
// Alfa Romeo (hier würde nur die 4 Position erkannt werden.
var indexOf = possibleObjs[0].value.toLowerCase().indexOf(request.term.toLowerCase());
$(this.selectorPossibleValue).html(prefix_term + '' + request.term + '' + possibleObjs[0].value.substr(indexOf + request.term.length));
// Wert automatisch übernehmen, wenn nur ein Vorschlagswert
// vorhanden ist und die Schreibweise übereinstimmt und vollständig ist.
if (possibleObjs.length == 1 && request.term.toLowerCase() == possibleObjs[0].value.toLowerCase()) {
var key = possibleObjs[0].key;
var value = possibleObjs[0].value;
//log(this.name + '.callbackAutoComplete: ' + key + ' / ' + value);
if (!self.allowMultiselect) {
this.setKeyAndValue(key, value);
} else {
// Prüfen, ob Key bereits vorhanden
var oldKey = self.getKey().trim();
var oldValue = self.getValue().trim();
log('>> oldKey = ' + oldKey);
var currentKeys = oldKey.split(self.separator);
var pos = $.inArray(key, currentKeys);
if (pos == -1) {
// Key/Value hinzufügen
if (oldKey == '') {
self.setKeyAndValue(key, value);
}
else {
self.setKeyAndValue(oldKey + self.separator + key, oldValue + self.separator + value);
}
} else {
// do nothing...
}
}
}
else {
if (!self.allowMultiselect) $(this.selectorKey).val('');
}
}
else {
// Vervollständigungstext und ausgewählten Wert entfernen
$(this.selectorPossibleValue).text('');
if (!self.allowMultiselect) $(this.selectorKey).val('');
}
// Vervollständigungstext im PossibleValue-Feld wieder
// sichtbar machen, da dieser beim Tastendruck unsichtbar
// gemacht wurde.
$(this.selectorPossibleValue).show();
response(possibleObjs);
}
// Daten per Ajax-Request laden.
ComboBox2.prototype.load = function (callbackAfterLoad) {
var self = this;
var startLoad = true;
// Mehrfach Requests abfangen
if (self.isLoading) { return; }
// Anwendungsabhängige Prüfung, ob Daten geladen werden müssen.
if (self.callbackExecuteAjaxRequest != null && self.callbackExecuteAjaxRequest() == false) startLoad = false;
// Prüfen, ob wir eine Url zum Laden der Daten besitzen.
var ajaxUrl = (self.callbackGetAjaxUrl != null ? $.trim(self.callbackGetAjaxUrl()) : null);
if (ajaxUrl == null) startLoad = false;
// AjaxRequest aufrufen und bei Erfolg die Callback-Funktion ausführen.
if (startLoad) {
self.isLoading = true;
//log(self.name + '.loading: ' + ajaxUrl);
$('body').css('cursor', 'progress');
var startTime = new Date().getTime();
$.get(ajaxUrl, function (response) {
self.isLoading = false;
//log(self.name + '.time-taken: ' + (new Date().getTime() - startTime) + ' ms');
$('body').css('cursor', 'auto');
// Die timeoutUrl wird in der MasterPage gesetzt
if (response.StatusCode == 403) window.location = timeoutUrl;
else self.setKeyValues(response.data);
if (callbackAfterLoad != null) callbackAfterLoad();
}, 'jsonp');
}
// Callback-Funktion direkt aufrufen.
else if (callbackAfterLoad != null) callbackAfterLoad();
}