/** * Funktionen zum Suchen nach Orten und Branchen auf den Marktplätzen. */ var SearchSuggest = Class.create(); Object.extend(SearchSuggest.prototype, BranchSuggest.prototype); /** * Das Element für die Branchenauswahl. * * @var HTML InputElement */ SearchSuggest.prototype._branch = undefined; /** * Url an die die Abfragen für die Branchen gesendet werden. * * @type {String} */ SearchSuggest.prototype._branchUrl = undefined; /** * Das Element für die Ortsauswahl. * * @var HTML InputElement */ SearchSuggest.prototype._city = undefined; /** * Url an die die Abfragen für die Orte gesendet werden. * * @type {String} */ SearchSuggest.prototype._cityUrl = undefined; /** * Das Feld in dem gerade gesucht wird. * * @type {String} */ SearchSuggest.prototype._field = undefined; /** * Hash mit den Texten. * * @type {Hash} */ SearchSuggest.prototype._texts = {}; /** * Die Id der aktuellen Region. Wird direkt gesetzt. * * @type {Number} */ SearchSuggest.prototype.regionId = undefined; /** * Überträgt eine ausgewählte Branche in das Eingabefeld. * * @param {Number} branchId Die Id der Branche. * @param {Number} subBranchId Die Id der Unterbranche. */ SearchSuggest.prototype._assignBranch = function(branchId, subBranchId) { if (this._suggestions[branchId].alias !== undefined) { this._element.value = this._suggestions[branchId].alias.name; $(this._element.id + '_id').value = this._suggestions[branchId].alias.id; $('alias_branch_info').firstChild.nodeValue = this._texts.aliasBranchInfo.replace(/%1\$s/, this._suggestions[branchId].name).replace(/%2\$s/, this._suggestions[branchId].alias.name); $('search_city_branch_alias_branch_info').show(); } else { this._element.value = this._suggestions[branchId].name; if (this._field !== 'city' || branchId.substr(0, 6) !== 'region') { $(this._element.id + '_id').value = branchId; } else { $('region_id').value = branchId.substr(6); } } if (this._field === 'branch') { if (subBranchId !== undefined) { $('sub_' + this._element.id + '_id').value = subBranchId; $('sub_' + this._element.id + '_name').innerHTML = '-> ' + this._suggestions[branchId].sub[subBranchId]; $('search_city_branch_sub_branch').show(); } else { $('search_city_branch_sub_branch').hide(); } } if ($('city_id').value !== '' && $('branch_id').value !== '') { $('search_city_branch_insert_info').hide(); } }; /** * Ermittelt ob eine Branche eingegeben wurde und wählt diese aus. */ SearchSuggest.prototype._change = function() { if (!this._selected) { if (this._element.value.length <= 1) { this._remove(); } else { var instance = this; var complete = function(request, response) { if (request !== undefined && response === null) { response = eval(request.responseText); } if (response.length !== undefined && response.length === 0) { instance._remove(); return; } instance.changeSelect(request, response); }; this._makeRequest(complete); } } }; /** * Überprüft ob die Branche ausgewählt werden kann. * * @param {Number} branchId Die Id der Branche. * * @return {Boolean} Ob die Branche ausgewählt werden kann. */ SearchSuggest.prototype._check = function(branchId) { return branchId != 0; }; /** * Erstellt die Liste, wenn sie nicht vorhanden ist und entfernt die Vorschläge * aus ihr. */ SearchSuggest.prototype._clear = function() { var list = $('Suggestions'); if (list === null) { var pos = Position.positionedOffset(this._element); var style = { left: pos[0] + 'px', top: pos[1] + Element.getHeight(this._element) + 'px' }; new Insertion.After(this._element.id, '
'); list = $('Suggestions'); list.setStyle(style); var instance = this; Event.observe( list, 'mouseover', function() { instance.observeEvents(false); } ); Event.observe( list, 'mouseout', function() { instance.observeEvents(true); } ); } while (list.firstChild) { list.removeChild(list.firstChild); } }; /** * Holt die Vorschläge sobald genügend Zeichen eingegeben wurden. */ SearchSuggest.prototype._get = function() { if (this._element.value.replace(/^\s+|\s+$/g, '').length > 2) { var instance = this; var complete = function(request, response) { instance.show(request, response); }; this._makeRequest(complete); } else { this.show(undefined, {}); } }; /** * Ermittelt welche Taste gedrückt wurde und ruft die entsprechende Methode auf. * * @param Event action Event Objekt, des Ereignisses, das ausgelöst wurde. */ SearchSuggest.prototype._key = function(action) { switch (action.keyCode) { case Event.KEY_LEFT: case Event.KEY_RIGHT: case Event.KEY_DOWN: case Event.KEY_UP: case Event.KEY_RETURN: case Event.KEY_TAB: case 16/*shift*/: case Event.KEY_HOME: case Event.KEY_END: case 17/*strg*/: break; default: if ($(this._element.id + '_id').value !== '') { this._remove(true, false); } break; } BranchSuggest.prototype._key.call(this, action); }; /** * Macht den Request um die Daten für die Auswahlliste zu holen. * * @param {Function} complete Die Funktion die nach dem Request aufgerufen * wird. */ SearchSuggest.prototype._makeRequest = function(complete) { var instance = this; var field = this._field; var params = { search: this._element.value }; if (field === 'branch') { params.action = 'getSuggestion'; params.regionId = $('region_id').value; params.cityId = $('city_id').value; } var fieldCheck = function() { if (instance._field === field) { complete.apply(instance, arguments); } }; if (this._request !== undefined) { this._request.transport.abort(); } this._request = new Ajax.Request( this._url, { method: 'post', parameters: params, onComplete: fieldCheck } ); }; /** * Löscht die aktuelle Branche. * * @param {Boolean} subs Ob die Unterbranchen Liste auch entfernt wird. * @param {Boolean} value Ob der Wert des Textfeldes entfernt wird. */ SearchSuggest.prototype._remove = function(subs, value) { if (value !== false) { this._element.value = ''; } $(this._element.id + '_id').value = ''; if (this._field === 'branch') { $('sub_' + this._element.id + '_id').value = ''; $('sub_' + this._element.id + '_name').innerHTML = ''; $('search_city_branch_sub_branch').hide(); $('search_city_branch_alias_branch_info').hide(); } if ($('city_id').value === '' && $('branch_id').value === '') { $('search_city_branch_insert_info').show(); } }; /** * Setzt für welches Feld die Auswahlliste geholt wird. * * @param {String} name Der Name des Feldes. */ SearchSuggest.prototype._setField = function(name) { this._field = name; this._element = this['_' + name]; this._url = this['_' + name + 'Url']; }; /** * Fügt einen Eintrag der Auswahlliste hinzu. * * @param Object branch Assoziatives Array des aktuellen Eintrags mit der Id * unter key und dem Wert unter value. */ SearchSuggest.prototype.add = function(branch) { branch.value = Object.clone(branch.value); branch.value.alias = undefined; BranchSuggest.prototype.add.call(this, branch); }; /** * Ermittelt ob eine Branche eingegeben wurde und wählt diese aus. * * @param {Object} request Die Ausgabe der Abfrage. * @param {Object} response Die Daten die der Server gesendet hat. */ SearchSuggest.prototype.changeSelect = function(request, response) { var suggestionsArray = $H(response).toArray(); if ( suggestionsArray.length === 1 && suggestionsArray[0].key !== ' ' && ( suggestionsArray.first().value.sub === undefined || $H(suggestionsArray.first().value.sub).toArray().length <= 1 ) ) { this.show(request); if ( suggestionsArray.first().value.sub !== undefined && $H(suggestionsArray.first().value.sub).toArray().length === 1 ) { this._highlight('nextSibling'); } this.select(); } }; /** * Setzt die Texte und ruft den übergeordneten Konstruktor auf. * * @param {mixed} element Die Id des Elements für das die Vorschläge geholt * werden. */ SearchSuggest.prototype.initialize = function(element) { if ($('sub_' + element + '_id').value === '') { $('search_city_branch_sub_branch').hide(); } this._texts.aliasBranchInfo = $('alias_branch_info').innerHTML; $('search_city_branch_alias_branch_info').hide(); if ($('city_id').value !== '' && $('branch_id').value !== '') { $('search_city_branch_insert_info').hide(); } BranchSuggest.prototype.initialize.call(this, element); this._branch = this._element; this._city = $('city'); this._element = this._city; this._city.setAttribute('autocomplete','off'); this.observeEvents(true); var instance = this; Event.observe(this._branch, 'focus', function() { instance._setField('branch'); }); Event.observe(this._city, 'focus', function() { instance._setField('city'); }); }; /** * Übernimt einen Vorschlag in das Auswahlfeld. */ SearchSuggest.prototype.select = function() { var index = -1; var indexSub = undefined; var element = $('Suggestions'); if (element !== null) { var suggestions = element.getElementsByClassName('SuggestionActive'); if (suggestions.length === 0) { return; } this.observeEvents(false); if (suggestions.length > 0) { index = suggestions[0].id.substr(10); if (/Sub/.test(index)) { indexSub = index.split('Sub')[1]; index = index.split('Sub')[0]; } } this._remove(); this._hide(); if (this._check(index) === true) { this._assignBranch(index, indexSub); this._selected = true; } this.observeEvents(true); } }; /** * Gibt die Vorschläge aus. * * @param {String} request Die Ausgabe der Abfrage. */ SearchSuggest.prototype.show = function(request, response) { if (request !== undefined && response === null) { response = eval(request.responseText); } BranchSuggest.prototype.show.call(this, request, response); };