/* 
 * @(#)dhtmlxcombo.js
 * 
 * Copyright (C) dhtmlx ltd. www.dhtmlx.com
 * 
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 * 
 * See GPL license : http://www.gnu.org/licenses/gpl.html
 *  
 * Modification by Franck Andriano (franck.andriano@six-group.fr) :
 *	- 20/02/2008 : allow submit form with keypress 'Enter' and call onsubmit function form...
 *	- 25/02/2008 : add setNameForm (named form for submit)
 *	- 26/02/2008 : add setStartFilter (auto complet by specific position)
 *	- 27/02/2008 : function _toggleSelect disabled
 *  - 27/02/2008 : function _DrawHeaderButton disabled
 *  - 27/02/2008 : add setNamedInput (named input)
 *	- 27/02/2008 : add function Submit_recherche for check submit form
 *  - 10/03/2008 : add focus on input search form
 */

var namedInput = "";
dhtmlXCombo.prototype.setNamedInput = function(_name)
{
	self.namedInput = _name;
};

var nameForm = "";
dhtmlXCombo.prototype.setNameForm = function(_name)
{
	self.nameForm = _name;
};

function Submit_recherche(lg)
{
	var code = eval('document.getElementById("'+self.namedInput+'").value');
	//alert(code);
	if (code!='' && code!='undefined')
	{
		eval('document.'+self.nameForm+'.submit()');
	}
	else
	{
		if (lg=="es") alert("Es necesario introducir un código o un nombre");
		else if (lg=="en") alert("You have enter a code or a name");
		else alert("Vous devez saisir un code ou un libellé");
	}
}

function dhtmlXComboFromSelect(parent,size)
{
	if (typeof(parent)=="string") parent=document.getElementById(parent);
	size=size||parent.getAttribute("width")||(window.getComputedStyle?window.getComputedStyle(parent,null)["width"]:(parent.currentStyle?parent.currentStyle["width"]:0));
	if ((!size)||(size=="auto")) size=parent.offsetWidth||100;
	var z=document.createElement("SPAN");
	parent.parentNode.insertBefore(z,parent);
	parent.style.display='none';
	var s_type = parent.getAttribute('opt_type');
	var w= new dhtmlXCombo(z,parent.name,size,s_type,parent.tabIndex);
	var x=new Array();
	var sel=0;
	for (var i=0; i<parent.options.length; i++)
	{
		if (parent.options[i].selected)sel=i;
		var label=parent.options[i].innerHTML;
		var val=parent.options[i].getAttribute("value");
		if ((typeof(val)=="undefined")||(val===null)) val=label;
		x[i]=
		{
			value:val,text:label,img_src:parent.options[i].getAttribute("img_src")
		}
	};

	w.addOption(x);
	parent.parentNode.removeChild(parent);
	w.selectOption(sel,null,true);
	if (parent.onchange)this.attachEvent("onChange",parent.onchange);
	return w
};

var dhtmlXCombo_optionTypes = [];
function dhtmlXCombo(parent,name,width,optionType,tabIndex)
{
	if (typeof(parent)=="string") parent=document.getElementById(parent);
	this.dhx_Event();
	this.optionType = (optionType != window.undefined && dhtmlXCombo_optionTypes[optionType]) ? optionType : 'default';
	this._optionObject = dhtmlXCombo_optionTypes[this.optionType];
	this._disabled = false;
	if (!window.dhx_glbSelectAr)
	{
		window.dhx_glbSelectAr=new Array();
		window.dhx_openedSelect=null;
		window.dhx_SelectId=1;
		dhtmlxEvent(document.body,"click",this.closeAll);
		dhtmlxEvent(document.body,"keydown",function(e)
		{
			try { if ((e||event).keyCode==9) window.dhx_glbSelectAr[0].closeAll() }
			catch(e) {	};
			return true
		})
	};
	if (parent.tagName=="SELECT")dhtmlXComboFromSelect(parent);
	else
	{
		this._createSelf(parent,name,width,tabIndex);
		dhx_glbSelectAr.push(this)
	}
};

dhtmlXCombo.prototype.setSize = function(new_size)
{
	this.DOMlist.style.width=new_size+"px";
	if (this.DOMlistF)this.DOMlistF.style.width=new_size+"px";
	this.DOMelem.style.width=new_size+"px";
	this.DOMelem_input.style.width = (new_size)+'px'; //-19
};

dhtmlXCombo.prototype.enableFilteringMode = function(mode,url,cache,autosubload)
{
	this._filter=convertStringToBoolean(mode);
	if (url)
	{
		this._xml=url;
		this._autoxml=convertStringToBoolean(autosubload)
	};
	if (convertStringToBoolean(cache)) this._xmlCache=[]
};

dhtmlXCombo.prototype.setFilteringParam=function(name,value)
{
	if (!this._prs)this._prs=[];
	this._prs.push([name,value])
};

dhtmlXCombo.prototype.disable = function(mode)
{
	var z=convertStringToBoolean(mode);
	if (this._disabled==z)return;
	this.DOMelem_input.disabled=z;
	this._disabled=z
};

dhtmlXCombo.prototype.readonly = function(mode)
{
	this.DOMelem_input.readOnly=mode ? true : false
};

dhtmlXCombo.prototype.getOption = function(value)
{
	for(var i=0;i<this.optionsArr.length;i++) 
		if(this.optionsArr[i].value==value)
			return this.optionsArr[i];
	return null
};

dhtmlXCombo.prototype.getOptionByLabel = function(value)
{
	for(var i=0;i<this.optionsArr.length;i++)
		if(this.optionsArr[i].text==value)
			return this.optionsArr[i];
	return null
};

dhtmlXCombo.prototype.getOptionByIndex = function(ind)
{
	return this.optionsArr[ind]
};

dhtmlXCombo.prototype.clearAll = function(all)
{
	if (all)this.setComboText("");
	this.optionsArr=new Array();
	this.redrawOptions();
	if (all)this._confirmSelection()
};

dhtmlXCombo.prototype.deleteOption = function(value)
{
	var ind=this.getIndexByValue(value);
	if(ind<0)return;
	if (this.optionsArr[ind]==this._selOption)this._selOption=null;
	this.optionsArr.splice(ind, 1);
	this.redrawOptions()
};

dhtmlXCombo.prototype.render=function(mode)
{
	this._skiprender=(!convertStringToBoolean(mode));
	this.redrawOptions();
};

dhtmlXCombo.prototype.updateOption = function(oldvalue, avalue, atext, acss)
{
	var dOpt=this.getOption(oldvalue);
	if (typeof(avalue)!="object") avalue=
	{
		text:atext,value:avalue,css:acss
	};
	dOpt.setValue(avalue);
	this.redrawOptions()
};

dhtmlXCombo.prototype.addOption = function(options)
{
	if (!arguments[0].length || typeof(arguments[0])!="object")
		args = [arguments];
	else
		args = options;
	this.render(false);
	
	for (var i=0;i<args.length;i++)
	{
		var attr = args[i];
		if (attr.length)
		{
			attr.value = attr[0]||"";
			attr.text = attr[1]||"";
			attr.css = attr[2]||""
		};

		this._addOption(attr);
	};
	this.render(true)
};

dhtmlXCombo.prototype._addOption = function(attr)
{
	dOpt = new this._optionObject();
	this.optionsArr.push(dOpt);
	dOpt.setValue.apply(dOpt,[attr]);
	this.redrawOptions()
};

dhtmlXCombo.prototype.getIndexByValue = function(val)
{
	for(var i=0;i<this.optionsArr.length;i++)
	if(this.optionsArr[i].value == val)return i;
	return -1
};

dhtmlXCombo.prototype.getSelectedValue = function()
{
	return (this._selOption?this._selOption.value:null)
};

dhtmlXCombo.prototype.getComboText = function()
{
	return this.DOMelem_input.value
};

dhtmlXCombo.prototype.setComboText = function(text)
{
	this.DOMelem_input.value=text
};

dhtmlXCombo.prototype.setComboValue = function(text)
{
	this.setComboText(text);
	for(var i=0;i<this.optionsArr.length;i++)
		if (this.optionsArr[i].data()[1]==this.DOMelem_input.value)
			return this.selectOption(i,null,true);
	this.DOMelem_hidden_input.value=text
};

dhtmlXCombo.prototype.getActualValue = function()
{
	return this.DOMelem_hidden_input.value
};

dhtmlXCombo.prototype.getSelectedText = function()
{
	return (this._selOption?this._selOption.text:"")
};

dhtmlXCombo.prototype.getSelectedIndex = function()
{
	for(var i=0;i<this.optionsArr.length;i++)
	if(this.optionsArr[i] == this._selOption)return i;
	return -1
};

dhtmlXCombo.prototype.setName = function(name)
{
	this.DOMforSbm.name = name;
	this.name = name
};

dhtmlXCombo.prototype.show = function(mode)
{
	if (convertStringToBoolean(mode))
		this.DOMelem.style.display = "";
	else
		this.DOMelem.style.display = "none"
};

dhtmlXCombo.prototype.destructor = function()
{
	var _sID = this._inID;
	this.DOMParent.removeChild(this.DOMelem);
	this.DOMlist.parentNode.removeChild(this.DOMlist);
	var s=dhx_glbSelectAr;
	this.DOMParent=this.DOMlist=this.DOMelem=0;
	this.DOMlist.combo=this.DOMelem.combo=0;
	for(var i=0;i<s.length;i++)
	{
		if(s[i]._inID == _sID)
		{
			this._selectsArr[i] = null;
			this._selectsArr.splice(i,1);
			return
		}
	}
};

dhtmlXCombo.prototype._createSelf = function(selParent, name, width, tab)
{
	if (width.toString().indexOf("%")!=-1)
	{
		var self = this;
		var resWidht=parseInt(width)/100;
		window.setInterval(function()
		{
			var ts=selParent.parentNode.offsetWidth*resWidht-2;
			if (ts==self._lastTs)return;
			self.setSize(self._lastTs=ts)
		},500);
		width=parseInt(selParent.offsetWidth)
	};

	width=parseInt(width||100);
	this.ListPosition = "Bottom";
	this.DOMParent = selParent;
	this._inID = null;
	this.name = name;
	this._selOption = null;
	this.optionsArr = Array();
	var opt = new this._optionObject();
	opt.DrawHeader(this,name, width,tab);
	this.DOMlist = document.createElement("DIV");
	this.DOMlist.className = 'dhx_combo_list';
	this.DOMlist.style.width=width-(_isIE?0:0)+"px";
	if (_isOpera || _isKHTML )this.DOMlist.style.overflow="auto";
	this.DOMlist.style.display = "none";
	document.body.insertBefore(this.DOMlist,document.body.firstChild);
	if (_isIE)
	{
		this.DOMlistF = document.createElement("IFRAME");
		this.DOMlistF.style.border="0px";
		this.DOMlistF.className = 'dhx_combo_list';
		this.DOMlistF.style.width=width-(_isIE?0:0)+"px";
		this.DOMlistF.style.display = "none";
		this.DOMlistF.src="javascript:false;";
		document.body.insertBefore(this.DOMlistF,document.body.firstChild)
	};

	this.DOMlist.combo=this.DOMelem.combo=this;
	this.DOMelem_input.onkeydown = this._onKey;
	this.DOMelem_input.onkeypress = this._onKeyF;
	this.DOMelem_input.onblur = this._onBlur;
	this.DOMelem_input.focus();
	//this.DOMelem.onclick = this._toggleSelect;
	this.DOMlist.onclick = this._selectOption;
	this.DOMlist.onkeydown = function(e)
	{
		this.combo.DOMelem_input.focus();
		(e||event).cancelBubble=true;
		this.combo.DOMelem_input.onkeydown(e)
	}
};

dhtmlXCombo.prototype._listOver = function(e)
{
	e = e||event;
	e.cancelBubble = true;
	var node = (_isIE?event.srcElement:e.target);
	var that = this.combo;
	if ( node.parentNode == that.DOMlist )
	{
		that.unSelectOption();
		var i=0;
		for (i;i<that.DOMlist.childNodes.length;i++)
		{
			if (that.DOMlist.childNodes[i]==node)break
		};
		var z=that.optionsArr[i];
		that._selOption=z;
		that._selOption.select();
		if ((that._autoxml)&&((i+1)==that._lastLength))
			that._fetchOptions(i+1,that._lasttext||"")
	}
};

dhtmlXCombo.prototype._positList = function()
{
	var pos=this.getPosition(this.DOMelem);
	if(this.ListPosition == 'Bottom')
	{
		this.DOMlist.style.top = (pos[1]-1)+this.DOMelem.offsetHeight+"px"; // pos[1]-1
		this.DOMlist.style.left = pos[0]+"px"
	}
	else
	{
		this.DOMlist.style.top = (pos[1]-1)+"px";
		this.DOMlist.style.left = pos[0]+this.DOMelem.offsetWidth+"px"; // pos[1]-1
	}
};

dhtmlXCombo.prototype.getPosition = function(oNode,pNode)
{
	if(!pNode)var pNode = document.body

	var oCurrentNode=oNode;
	var iLeft=0;
	var iTop=0;
	while ((oCurrentNode)&&(oCurrentNode!=pNode))
	{
		iLeft+=oCurrentNode.offsetLeft-oCurrentNode.scrollLeft;
		iTop+=oCurrentNode.offsetTop-oCurrentNode.scrollTop;
		oCurrentNode=oCurrentNode.offsetParent
	};
	if (pNode == document.body )
	{
		if (_isIE)
		{
			if (document.documentElement.scrollTop)iTop+=document.documentElement.scrollTop;
			if (document.documentElement.scrollLeft)iLeft+=document.documentElement.scrollLeft
		}
		else if (!_isFF)
		{
			iLeft+=document.body.offsetLeft;
			iTop+=document.body.offsetTop
		}
	};
	return new Array(iLeft,iTop)
};

dhtmlXCombo.prototype._correctSelection = function()
{
	if (this.getComboText()!="")
	for (var i=0;i<this.optionsArr.length;i++)
		if (!this.optionsArr[i].isHidden())
		{
			return this.selectOption(i,true,false)
		};
	this.unSelectOption()
};

dhtmlXCombo.prototype.selectNext = function(step)
{
	var z=this.getSelectedIndex()+step;
	while (this.optionsArr[z])
	{
		if (!this.optionsArr[z].isHidden())
		return this.selectOption(z,false,false);
		z+=step
	}
};

dhtmlXCombo.prototype._onKeyF = function(e)
{
	var that=this.parentNode.combo;
	var ev=e||event;
	ev.cancelBubble=true;
	if (ev.keyCode=="13" || ev.keyCode=="9" )
	{
		that._confirmSelection();
		that.closeAll()
	};
	
	if (ev.keyCode=="27" )
	{
		that._resetSelection();
		that.closeAll()
	};

	if (ev.keyCode=="13" || ev.keyCode=="27" )
	{
		that.callEvent("onKeyPressed",[ev.keyCode])
		return false
	};
	return true
};

dhtmlXCombo.prototype._onKey = function(e)
{
	var that=this.parentNode.combo;
	(e||event).cancelBubble=true;
	var ev=(e||event).keyCode;
	if (ev==27)return;
	if ((that.DOMlist.style.display!="block")&&(ev!="13")&&(ev!="9")&&((!that._filter)||(that._filterAny)))
		that.DOMelem.onclick(e||event);
	if ((ev!="13")&&(ev!="9"))
		window.setTimeout(function() { that._onKeyB(ev)	},1);
	else if (ev==9)
	{
		that.closeAll();
	}
	else if (ev=="13") // press Enter
	{
		if (self.nameForm != null && self.nameForm != "" && self.nameForm != "undefined")
		{
			var that=this.parentNode.combo;
			
			//alert(that.getSelectedValue());
			if (that.getSelectedValue() != null) 
				eval('document.'+self.nameForm+'.'+self.namedInput+'.value = "'+that.getSelectedValue()+'"');
			else
				that._confirmSelection();
			
			that.closeAll();
			
			eval('document.'+self.nameForm+'.onsubmit()');
		}
	}
};

dhtmlXCombo.prototype._onKeyB = function(ev)
{
	if (ev=="40")
	{
		var z=this.selectNext(1)
	}
	else if (ev=="38")
	{
		this.selectNext(-1)
	}
	else
	{
		this.callEvent("onKeyPressed",[ev])
		if (this._filter)return this.filterSelf((ev==8)||(ev==46));
		
		for(var i=0;i<this.optionsArr.length;i++)
			if (this.optionsArr[i].data()[1]==this.DOMelem_input.value)
			{
				this.selectOption(i,false,false);
				return false
			};
			
		this.unSelectOption()
	};
	return true
};

dhtmlXCombo.prototype._onBlur = function()
{
	var self = this.parentNode._self;
	self._confirmSelection();
	window.setTimeout(function() { self.callEvent("onBlur",[]) },100)
};

dhtmlXCombo.prototype.redrawOptions = function()
{
	if (this._skiprender)return;
	for(var i=this.DOMlist.childNodes.length-1;	i>=0;i--)
		this.DOMlist.removeChild(this.DOMlist.childNodes[i]);
	for(var i=0;i<this.optionsArr.length;i++)
		this.DOMlist.appendChild(this.optionsArr[i].render())
};

dhtmlXCombo.prototype.loadXML = function(url,afterCall)
{
	this._load=true;
	if ((this._xmlCache)&&(this._xmlCache[url]))
	{
		this._fillFromXML(this,null,null,null,this._xmlCache[url]);
		if (afterCall)afterCall()
	}
	else
	{
		var xml=(new dtmlXMLLoaderObject(this._fillFromXML,this,true,true));
		if (afterCall)xml.waitCall=afterCall;
		if (this._prs)
			for (var i=0;i<this._prs.length;i++)
				url+=[getUrlSymbol(url),escape(this._prs[i][0]),"=",escape(this._prs[i][1])].join("");
		xml._cPath=url;
		xml.loadXML(url)
	}
};

dhtmlXCombo.prototype.loadXMLString = function(astring)
{
	var xml=(new dtmlXMLLoaderObject(this._fillFromXML,this,true,true));
	xml.loadXMLString(astring)
};

dhtmlXCombo.prototype._fillFromXML = function(obj,b,c,d,xml)
{
	if (obj._xmlCache)obj._xmlCache[xml._cPath]=xml;
	xml.getXMLTopNode("complete");
	var top=xml.doXPath("//complete");
	var options=xml.doXPath("//option");
	obj.render(false);
	if ((!top[0])||(!top[0].getAttribute("add")))
	{
		obj.clearAll();
		obj._lastLength=options.length;
		if (obj._xml)
		{
			if ((!options)|| (!options.length))
			obj.closeAll();
			else
			{
				obj._positList();
				obj.DOMlist.style.display="block";
			if (_isIE)obj._IEFix(true)
			}
		}
	}
	else
	obj._lastLength+=options.length;

	for (var i=0;i<options.length;i++)
	{
		var attr = new Object();
		attr.text = options[i].firstChild?options[i].firstChild.nodeValue:"";
		for (var j=0;j<options[i].attributes.length;j++)
		{
			var a = options[i].attributes[j];
			if (a)attr[a.nodeName] = a.nodeValue;
		};
		obj._addOption(attr)
	};

	obj.render(true);
	if ((obj._load)&&(obj._load!==true))
		obj.loadXML(obj._load);
	else
	{
		obj._load=false;
		if ((!obj._lkmode)&&(!obj._filter))
			obj._correctSelection()
	};

	var selected=xml.doXPath("//option[@selected]");
	if (selected.length)obj.selectOption(obj.getIndexByValue(selected[0].getAttribute("value")),false,true)
};


dhtmlXCombo.prototype.unSelectOption = function()
{
	if (this._selOption)this._selOption.deselect();
	this._selOption=null
};

dhtmlXCombo.prototype._confirmSelection = function(data,status)
{
	//alert('args: '+arguments.length+' \n '+data+' \n '+status+' \n '+this.getActualValue());
		
	if(arguments.length==0)
	{
		var z=this.getOptionByLabel(this.DOMelem_input.value);
		data = z?z.value:this.DOMelem_input.value;
		status = (z==null);
		if (data==this.getActualValue()) return;
	};

    this.DOMelem_hidden_input.value=data;
	this.DOMelem_hidden_input2.value = (status?"true":"false");
	this.callEvent("onChange",[])
};

dhtmlXCombo.prototype._resetSelection = function(data,status)
{
	var z=this.getOption(this.DOMelem_hidden_input.value);
	this.setComboValue(z?z.data()[0]:this.DOMelem_hidden_input.value)
	this.setComboText(z?z.data()[1]:this.DOMelem_hidden_input.value)
};

dhtmlXCombo.prototype.selectOption = function(ind,filter,conf)
{
	if (arguments.length<3)conf=true;
	this.unSelectOption();
	var z=this.optionsArr[ind];
	if (!z)return;
	this._selOption=z;
	this._selOption.select();
	var corr=this._selOption.content.offsetTop+this._selOption.content.offsetHeight-this.DOMlist.scrollTop-this.DOMlist.offsetHeight;
	if (corr>0)this.DOMlist.scrollTop+=corr;
	corr=this.DOMlist.scrollTop-this._selOption.content.offsetTop;
	if (corr>0)this.DOMlist.scrollTop-=corr;
	var data=this._selOption.data();
	if (conf)this._confirmSelection(data[0],false);
	if ((this._autoxml)&&((ind+1)==this._lastLength))
		this._fetchOptions(ind+1,this._lasttext||"");
		
	if (filter)
	{
		var text=this.getComboText();
		if (text==data[1]) // if (text!=data[1])
		{
			this.setComboText(data[1]);
			//dhtmlXRange(this.DOMelem_input,text.length+1,data[1].length)
		}
	}
	else this.setComboText(data[1]);
	this._selOption.RedrawHeader(this);
	this.callEvent("onSelectionChange",[]);
};

dhtmlXCombo.prototype._selectOption = function(e)
{
	(e||event).cancelBubble = true;
	var node=(_isIE?event.srcElement:e.target);
	var that=this.combo;
	while (!node._self)
	{
		node = node.parentNode;
		if (!node)return
	};
	var i=0;
	for (i;i<that.DOMlist.childNodes.length;i++)
	{
		if (that.DOMlist.childNodes[i]==node)break
	};
	that.selectOption(i,false,true);
	that.closeAll()
};

dhtmlXCombo.prototype.openSelect = function()
{
	if (this._disabled)return;
	this.closeAll();
	this._positList();
	this.DOMlist.style.display="block";
	if (this.autoOptionSize)
	{
		var x=this.DOMlist.offsetWidth;
		for ( var i=0;i<this.optionsArr.length;i++)
			if (this.DOMlist.childNodes[i].scrollWidth > x)
				x=this.DOMlist.childNodes[i].scrollWidth;
		this.DOMlist.style.width=x+"px"
	};

	if (_isIE)this._IEFix(true);
	this.DOMelem_input.focus();
	if (this._filter)this.filterSelf()
};

dhtmlXCombo.prototype._toggleSelect = function(e)
{
	var that=this.combo;
	if ( that.DOMlist.style.display == "block" )
	{
		that.closeAll()
	}
	else
	{
		that.openSelect()
	};
	(e||event).cancelBubble = true
};

dhtmlXCombo.prototype._fetchOptions=function(ind,text)
{
	if (text=="")
	{
		this.closeAll();
		return this.clearAll();
	};
	
	var url=this._xml+((this._xml.indexOf("?")!=-1)?"&":"?")+"pos="+ind+"&mask="+encodeURI(text);
	this._lasttext=text;
	if (this._load)this._load=url;
	else this.loadXML(url)
};

var posStartFilter = 0;
dhtmlXCombo.prototype.setStartFilter = function(_pos)
{
	self.posStartFilter = _pos;
};

dhtmlXCombo.prototype.filterSelf = function(mode)
{
	if (this.DOMelem_input.value == "") 
	{
		this.closeAll();
		return;
	}
	
	//alert("Filter "+mode);
	for(var i=0;i<this.optionsArr.length;i++)
	{
		this.optionsArr[i].text = replace(this.optionsArr[i].text , '<b>' , '');
		this.optionsArr[i].text = replace(this.optionsArr[i].text , '</b>' , '');
		this.optionsArr[i].setValue(this.optionsArr[i]);
		//alert(this.optionsArr[i].text);
	}
	
	var text=this.getComboText();
	if(text.length == 0) return; // none!
	if (this._xml)
	{
		this._lkmode=mode;
		this._fetchOptions(0,text)
	};
	try
	{
		var filter=new RegExp(text,"i") //("^"+text,"i")
	}
	catch (e)
	{
		var filter=new RegExp((text).replace(/([\[\]\{\}\(\)\+\*\\])/gi,"\\$1")) // change!!!
	};
	this.filterAny=false;
	for(var i=0;i<this.optionsArr.length;i++)
	{
		var z=filter.test(this.optionsArr[i].text);
		this.filterAny|=z;
		this.optionsArr[i].hide(!z);
		if (!z) continue;
		else if ((this.optionsArr[i].text).indexOf('<b>') == -1)
		{
			var myVal = this.DOMelem_input.value;
			myVal = myVal.toUpperCase();
			
			this.optionsArr[i].text = replace(this.optionsArr[i].text, myVal, '<b>'+myVal+'</b>');
			this.optionsArr[i].setValue(this.optionsArr[i]);
		}
	};
	
	this.redrawOptions();
	
	if (!this.filterAny)this.closeAll();
	else
	{
		if (this.DOMlist.style.display!="block")this.openSelect();
		if (_isIE)this._IEFix(true)
	};
	//if (!mode)this._correctSelection();
	//else 
	this.unSelectOption();
};

function replace(_str, _what, _by)
{
   if (_str==null || _str=="") return "";
   if (_what==null || _what=="") return _str;
   var a_by = (_by==null)? "" : _by;
   var r_str = "";
   var a_begin = 0;
   var a_selBegin = 0;
   while ((a_selBegin=_str.indexOf(_what,a_begin))!=-1)
   {
     r_str += _str.substring(a_begin,a_selBegin)+a_by;
     a_begin = a_selBegin+_what.length;
   }
   r_str+=_str.substring(a_begin);
   return r_str;
} 

dhtmlXCombo.prototype._IEFix = function(mode)
{
	this.DOMlistF.style.display=(mode?"block":"none");
	this.DOMlistF.style.top=this.DOMlist.style.top;
	this.DOMlistF.style.left=this.DOMlist.style.left
};

dhtmlXCombo.prototype.closeAll = function()
{
	if(window.dhx_glbSelectAr)
		for (var i=0;i<dhx_glbSelectAr.length;i++)
			if (dhx_glbSelectAr[i].DOMlist.style.display=="block")
			{
				dhx_glbSelectAr[i].DOMlist.style.display = "none";
				if (_isIE)dhx_glbSelectAr[i]._IEFix(false)
			}
};

function dhtmlXRange(InputId, Start, End)
{
	var Input = typeof(InputId)=='object' ? InputId : document.getElementById(InputId);
	try { Input.focus()	} catch(e) { };
	var Length = Input.value.length;
	Start--;
	if (Start < 0 || Start > End || Start > Length)Start = 0;
	if (End > Length)End = Length;
	if (Input.setSelectionRange)
	{
		Input.setSelectionRange(Start, End)
	}
	else if (Input.createTextRange)
	{
		var range = Input.createTextRange();
		range.moveStart('character', Start);
		range.moveEnd('character', End-Length);
		range.select()
	}
};

dhtmlXCombo_defaultOption = function()
{
	this.init()
};

dhtmlXCombo_defaultOption.prototype.init = function()
{
	this.value = null;
	this.text = "";
	this.selected = false;
	this.css = "";
};

dhtmlXCombo_defaultOption.prototype.select = function()
{
	if (this.content);
	this.content.className="dhx_selected_option";
};

dhtmlXCombo_defaultOption.prototype.hide = function(mode)
{
	this.render().style.display=mode?"none":"";
};

dhtmlXCombo_defaultOption.prototype.isHidden = function()
{
	return (this.render().style.display=="none")
};

dhtmlXCombo_defaultOption.prototype.deselect = function()
{
	if (this.content)this.render();
	this.content.className=""
};

dhtmlXCombo_defaultOption.prototype.setValue = function(attr)
{
	this.value = attr.value||"";
	this.text = attr.text||"";
	this.css = attr.css||"";
	this.content=null;
};

dhtmlXCombo_defaultOption.prototype.render = function()
{
	if (!this.content)
	{
		this.content=document.createElement("DIV");
		this.content._self = this;
		this.content.style.cssText='width:100%;overflow:hidden;"+this.css+"';
		if (_isOpera || _isKHTML )this.content.style.padding="2px 0px 2px 0px";
		this.content.innerHTML=this.text;
		this._ctext=_isIE?this.content.innerText:this.content.textContent
	};
	return this.content
};

dhtmlXCombo_defaultOption.prototype.data = function()
{
	if (this.content)return [this.value,this._ctext ? this._ctext : this.text]
};

dhtmlXCombo_defaultOption.prototype.DrawHeader = function(self, name, width, tab)
{
	var z=document.createElement("DIV");
	z.style.width = width+"px";
	z.className = 'dhx_combo_box';
	z._self = self;
	self.DOMelem = z;
	this._DrawHeaderInput(self, name, width,tab);
	//this._DrawHeaderButton(self, name, width);
	self.DOMParent.appendChild(self.DOMelem)
};

dhtmlXCombo_defaultOption.prototype._DrawHeaderInput = function(self, name, width,tab)
{
	var z=document.createElement('input');
	z.className = 'dhx_combo_input';
	z.type = 'text';
	if (tab)z.tabIndex=tab;
	z.style.width = (width)+'px'; //-19
	self.DOMelem.appendChild(z);
	self.DOMelem_input = z;
	
	z = document.createElement('input');
	z.type = 'hidden';
	z.name = name;
	z.id = name;
	self.DOMelem.appendChild(z);
	self.DOMelem_hidden_input = z;
	
	z = document.createElement('input');
	z.type = 'hidden';
	z.name = name+"_new_value";
	z.value="true";
	self.DOMelem.appendChild(z);
	self.DOMelem_hidden_input2 = z
};

dhtmlXCombo_defaultOption.prototype._DrawHeaderButton = function(self, name, width)
{
	var z=document.createElement('img');
	z.className = 'dhx_combo_img';
	z.src = (window.dhx_globalImgPath?dhx_globalImgPath:"")+'combo_select.gif';
	self.DOMelem.appendChild(z);
	self.DOMelem_button=z;
};

dhtmlXCombo_defaultOption.prototype.RedrawHeader = function(self)
{
};

dhtmlXCombo_optionTypes['default'] = dhtmlXCombo_defaultOption;

dhtmlXCombo.prototype.dhx_Event=function()
{
	this.dhx_SeverCatcherPath="";
	this.attachEvent = function(original, catcher, CallObj)
	{
		CallObj = CallObj||this;
		original = 'ev_'+original;
		if ( ( !this[original] )|| ( !this[original].addEvent ) )
		{
			var z = new this.eventCatcher(CallObj);
			z.addEvent( this[original] );
			this[original] = z
		};
		return ( original + ':' + this[original].addEvent(catcher) )
	};

	this.callEvent=function(name,arg0)
	{
		if (this["ev_"+name])return this["ev_"+name].apply(this,arg0);
		return true
	};
	
	this.checkEvent=function(name)
	{
		if (this["ev_"+name])return true;
		return false
	};

	this.eventCatcher = function(obj)
	{
		var dhx_catch = new Array();
		var m_obj = obj;
		var func_server = function(catcher,rpc)
		{
			catcher = catcher.split(":");
			var postVar="";
			var postVar2="";
			var target=catcher[1];
			if (catcher[1]=="rpc")
			{
				postVar='<?xml version="1.0"?><methodCall><methodName>'+catcher[2]+'</methodName><params>';
				postVar2="</params></methodCall>";
				target=rpc
			};
			var z = function() { };
			return z
		};

		var z = function()
		{
			if (dhx_catch)var res=true;
			for (var i=0;i<dhx_catch.length;i++)
			{
				if (dhx_catch[i] != null)
				{
					var zr = dhx_catch[i].apply( m_obj, arguments );
					res = res && zr
				}
			};
			return res
		};

		z.addEvent = function(ev)
		{
			if ( typeof(ev)!= "function" )
			if (ev && ev.indexOf && ev.indexOf("server:")== 0)
				ev = new func_server(ev,m_obj.rpcServer);
			else
				ev = eval(ev);
			if (ev)return dhx_catch.push( ev ) - 1;
			return false
		};
		z.removeEvent = function(id)
		{
			dhx_catch[id] = null
		};
		return z
	};
	this.detachEvent = function(id)
	{
		if (id != false)
		{
			var list = id.split(':');
			this[ list[0] ].removeEvent( list[1] )
		}
	}
};



