/*
* (c) 2005-2009 Richard Cowin (http://openrico.org)
* (c) 2005-2009 Matt Brown (http://dowdybrown.com)
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this
* file except in compliance with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the
* License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
* either express or implied. See the License for the specific language governing permissions
* and limitations under the License.
*/
Rico.KeywordSearch = function(id,options) {
this.initialize(id,options);
};
Rico.KeywordSearch.prototype = {
/**
* @class Implements a pop-up keyword search control.
* @extends Rico.Popup
* @constructs
* @param id unique identifier
* @param options object may contain any of the following:
* - showColorCode
- show hex color code as user hovers over color grid? default=false
* - cellsPerRow
- number of colors per row in the grid? default=18
* - palette
- array of 6 digit hex values, default=216 "web safe" colors
*
*/
initialize: function(id,options) {
this.id=id;
Rico.extend(this, new Rico.Window(Rico.getPhraseById("keywordTitle"),options));
Rico.addClass(this.content,'ricoKeywordSearch');
Rico.extend(this.options, {
listLength : 10,
maxSuggest : 20,
width: '12em'
});
},
atLoad : function() {
this.searchField=Rico.createFormField(this.contentDiv,'input','text',this.id+'_search');
this.searchField.style.display="block";
this.searchField.style.width=this.options.width;
Rico.eventBind(this.searchField,'keyup',Rico.eventHandle(this,'filterKeypress'),false);
this.selectList=Rico.createFormField(this.contentDiv,'select',null,this.id+'_list');
this.selectList.size=this.options.listLength;
this.selectList.style.display="block";
this.selectList.style.width=this.options.width;
Rico.eventBind(this.selectList,'change',Rico.eventHandle(this,'listClick'),false);
/**
* alias for closePopup
* @function
*/
this.close=this.closePopup;
this.close();
},
open: function(currentVal,column) {
this.column=column;
this.grid=this.column.liveGrid;
this.searchField.value='';
this.selectList.options.length=0;
this.openPopup();
this.searchField.focus();
this.selectValuesRequest('');
},
selectValuesRequest: function(filter) {
var colnum=this.column.index;
var options={};
Rico.extend(options, this.grid.buffer.ajaxOptions);
options.parameters = {id: this.grid.tableId, offset: '0', page_size: this.options.maxSuggest, edit: colnum};
options.parameters[this.grid.actionId]="query";
if (filter!='' && filter!='*') {
if (filter.indexOf('*')==-1) filter='*'+filter+'*';
options.parameters['f[1][op]']="LIKE";
options.parameters['f[1][len]']=1;
options.parameters['f[1][0]']=filter;
}
var self=this;
options.onComplete = function(request) { self.selectValuesUpdate(request); };
new Rico.ajaxRequest(this.grid.buffer.dataSource, options);
},
selectValuesUpdate: function(request) {
var response = request.responseXML.getElementsByTagName("ajax-response");
Rico.log("selectValuesUpdate: "+request.status);
if (response == null || response.length != 1) return;
response=response[0];
var error = response.getElementsByTagName('error');
if (error.length > 0) {
var errmsg=Rico.getContentAsString(error[0],this.grid.buffer.isEncoded);
Rico.log("Data provider returned an error:\n"+errmsg);
alert(Rico.getPhraseById("requestError",errmsg));
return null;
}
this.selectList.options.length=0;
response=response.getElementsByTagName('response')[0];
var rowsElement = response.getElementsByTagName('rows')[0];
var rows = this.grid.buffer.dom2jstable(rowsElement);
Rico.log("selectValuesUpdate: id="+this.selectList.id+' rows='+rows.length);
for (var i=0; i0) {
var c0=rows[i][0];
var c1=(rows[i].length>1) ? rows[i][1] : c0;
Rico.addSelectOption(this.selectList,c0,c1);
}
}
},
filterKeypress: function(e) {
var txtbox=Rico.eventElement(e);
if (typeof this.lastKeyFilter != 'string') this.lastKeyFilter='';
if (this.lastKeyFilter==txtbox.value) return;
var v=txtbox.value;
Rico.log("filterKeypress: "+this.index+' '+v);
this.lastKeyFilter=v;
this.selectValuesRequest(v);
},
listClick: function(e) {
var elem=Rico.eventElement(e);
if (elem.tagName.toLowerCase() != 'select') return;
if (this.returnValue) {
var opt=elem.options[elem.selectedIndex];
this.returnValue(opt.value,opt.innerHTML);
}
this.close();
}
};