diff --git a/data/web/static/dhtmlxcombo.js b/data/web/static/dhtmlxcombo.js
new file mode 100644
index 000000000..20424e16b
--- /dev/null
+++ b/data/web/static/dhtmlxcombo.js
@@ -0,0 +1,1359 @@
+//v.2.6 build 100722
+
+/*
+Copyright DHTMLX LTD. http://www.dhtmlx.com
+You allowed to use this component or parts of it under GPL terms
+To use it on other terms or get Professional edition of the component please contact us at sales@dhtmlx.com
+*/
+
+/*_TOPICS_
+@0:Initialization
+@1:Selection control
+@2:Add/delete
+@3:Reserved
+@4:Methods of Option object
+*/
+
+/**
+*  Build combobox from existing select control.
+*
+*
+*  @param   parent      {string} id of existing select control
+*  @param   size      {int } size of control, optional
+*  @return            {object} combobox object
+*  @type   public
+*  @topic   0
+*
+*/
+
+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= 48 && ev.keyCode <= 57)||(ev.keyCode >= 65 && ev.keyCode <= 90)){
+					for(var i=0; i15 && ev<19) return true; //shift,alt,ctrl
+        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);
+         	if (ev=="40" || ev=="38")
+         		return false;
+     	}
+         else if (ev==9){
+         	that.closeAll();
+         	(e||event).cancelBubble=false;
+         }
+      }
+      dhtmlXCombo.prototype._onKeyB = function(ev)
+      {
+         if (ev=="40"){  //down
+            var z=this.selectNext(1);
+         } else if (ev=="38"){ //up
+            this.selectNext(-1);
+         } else{
+            this.callEvent("onKeyPressed",[ev])
+            if (this._filter) return this.filterSelf((ev==8)||(ev==46));
+            for(var i=0; i=0; i--)
+            this.DOMlist.removeChild(this.DOMlist.childNodes[i]);
+         for(var i=0; i0) 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.setComboText(data[1]);
+	 	 	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]){
+               this.setComboText(data[1]);
+               dhtmlXRange(this.DOMelem_input,text.length+1,data[1].length);
+            }
+         }
+         else
+            this.setComboText(data[1]);
+         this._selOption.RedrawHeader(this);
+
+         /*Event*/
+         this.callEvent("onSelectionChange",[]);
+      }
+/**
+*     @desc: option on select handler
+*     @type: private
+*     @topic: 2
+*/
+      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; i0) this.DOMlist.scrollTop+=corr;
+            corr=this.DOMlist.scrollTop-this._selOption.content.offsetTop;
+         if (corr>0) this.DOMlist.scrollTop-=corr;
+	  }
+	  /* if (this.autoOptionSize){
+        	var x=this.DOMlist.offsetWidth; 
+			
+        	for ( var i=0; i x= "+ x);
+        		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();
+   }
+/**
+*     @desc: open(close) list
+*     @type: private
+*     @topic: 2
+*/
+   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="+encodeURIComponent(text);
+         this._lasttext=text;
+         if (this._load) this._load=url;
+         else {
+			if (!this.callEvent("onDynXLS",[text,ind])) return;
+			this.loadXML(url);
+     	 }
+    }
+/**
+*     @desc: filter list of options
+*     @type: private
+*     @topic: 2
+*/
+    dhtmlXCombo.prototype.filterSelf = function(mode)
+   {
+      var text=this.getComboText();
+      if (this._xml){
+         this._lkmode=mode;
+         this._fetchOptions(0,text);
+      }
+      try{ var filter=new RegExp("^"+text,"i"); } catch (e){ var filter=new RegExp("^"+text.replace(/([\[\]\{\}\(\)\+\*\\])/g,"\\$1")); }
+      this.filterAny=false;
+      for(var i=0; i End || Start > Length)
+      Start = 0;
+   if (End > Length)
+      End = Length;
+   if (Start==End) return;
+   if (Input.setSelectionRange) {
+      Input.setSelectionRange(Start, End);
+   } else if (Input.createTextRange) {
+      var range = Input.createTextRange();
+      range.moveStart('character', Start);
+      range.moveEnd('character', End-Length);
+	  try{
+         range.select();
+	  }
+	  catch(e){
+	  }
+   }
+}
+/**
+*     @desc: combobox option object constructor
+*     @type: public
+*     @topic: 0
+*/
+      dhtmlXCombo_defaultOption = function(){
+         this.init();
+      }
+/**
+*     @desc: option initialization function
+*     @type: private
+*     @topic: 4
+*/
+      dhtmlXCombo_defaultOption.prototype.init = function(){
+         this.value = null;
+         this.text = "";
+         this.selected = false;
+         this.css = "";
+      }
+/**
+*     @desc: mark option as selected
+*     @type: public
+*     @topic: 4
+*/
+      dhtmlXCombo_defaultOption.prototype.select = function(){
+         if (this.content){
+            this.content.className="dhx_selected_option"+(dhtmlx.skin?" combo_"+dhtmlx.skin+"_sel":"");
+		}
+      }
+/**
+*     @desc: hide option
+*     @param: mode - (boolean)
+*     @type: public
+*     @topic: 4
+*/
+      dhtmlXCombo_defaultOption.prototype.hide = function(mode){
+         this.render().style.display=mode?"none":"";
+      }
+/**
+*     @desc: return hide state of option
+*     @type: public
+*     @return: hide state of option
+*     @topic: 4
+*/
+      dhtmlXCombo_defaultOption.prototype.isHidden = function(){
+         return (this.render().style.display=="none");
+      }
+/**
+*     @desc: mark option as not selected
+*     @type: public
+*     @topic: 4
+*/
+      dhtmlXCombo_defaultOption.prototype.deselect = function(){
+         if (this.content) this.render();
+            this.content.className="";
+      }
+/**
+*     @desc: set value of option
+*     @param: value - (string) value
+*     @param: text - (string) text
+*     @param: css - (string) css style string
+*     @type: public
+*     @topic: 4
+*/
+dhtmlXCombo_defaultOption.prototype.setValue = function(attr){
+    this.value = attr.value||"";
+    this.text = attr.text||"";
+    this.css = attr.css||"";
+   this.content=null;
+}
+
+				
+/**
+*     @desc: render option
+*     @type: private
+*     @topic: 4
+*/
+      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;
+      }
+/**
+*     @desc: return option data
+*     @type: public
+*     @return: array of data related to option
+*     @topic: 4
+*/
+      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 '+(dhtmlx.skin||"");
+    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.setAttribute("autocomplete","off"); 
+	z.type = 'text';
+	z.className = 'dhx_combo_input';
+
+   if (tab) z.tabIndex=tab;
+   z.style.width = width-19-(document.compatMode=="BackCompat"?0:3)+'px';
+   self.DOMelem.appendChild(z);
+   self.DOMelem_input = z;
+
+   z = document.createElement('input');
+   z.type = 'hidden';
+   z.name = name;
+   self.DOMelem.appendChild(z);
+   self.DOMelem_hidden_input = z;
+
+   z = document.createElement('input');
+   z.type = 'hidden';
+   z.name = (name||"").replace(/(\]?)$/, "_new_value$1");
+   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';
+  if(dhtmlx.image_path) dhx_globalImgPath = dhtmlx.image_path;
+   z.src = (window.dhx_globalImgPath?dhx_globalImgPath:"")+'combo_select'+(dhtmlx.skin?"_"+dhtmlx.skin:"")+'.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) );   //return ID (event name & event ID)
+   }
+   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=''+catcher[2]+'';
+                        postVar2="";
+                        target=rpc;
+                     }
+                           var z = function() {
+                                   }
+                           return z;
+                         }
+       var z = function()
+             {
+                   if (dhx_catch)
+                      var res=true;
+                   for (var i=0; i-1)
+	_isChrome=true;
+
+if ((navigator.userAgent.indexOf('Safari') != -1)||(navigator.userAgent.indexOf('Konqueror') != -1)){
+	var _KHTMLrv = parseFloat(navigator.userAgent.substr(navigator.userAgent.indexOf('Safari')+7, 5));
+
+	if (_KHTMLrv > 525){ //mimic FF behavior for Safari 3.1+
+		_isFF=true;
+		var _FFrv = 1.9;
+	} else
+		_isKHTML=true;
+} else if (navigator.userAgent.indexOf('Opera') != -1){
+	_isOpera=true;
+	_OperaRv=parseFloat(navigator.userAgent.substr(navigator.userAgent.indexOf('Opera')+6, 3));
+}
+
+
+else if (navigator.appName.indexOf("Microsoft") != -1){
+	_isIE=true;
+	if (navigator.appVersion.indexOf("MSIE 8.0")!= -1 && document.compatMode != "BackCompat") _isIE=8;
+} else {
+	_isFF=true;
+	var _FFrv = parseFloat(navigator.userAgent.split("rv:")[1])
+}
+
+
+//multibrowser Xpath processor
+dtmlXMLLoaderObject.prototype.doXPath=function(xpathExp, docObj, namespace, result_type){
+	if (_isKHTML || (!_isIE && !window.XPathResult))
+		return this.doXPathOpera(xpathExp, docObj);
+
+	if (_isIE){ //IE
+		if (!docObj)
+			if (!this.xmlDoc.nodeName)
+				docObj=this.xmlDoc.responseXML
+			else
+				docObj=this.xmlDoc;
+
+		if (!docObj)
+			dhtmlxError.throwError("LoadXML", "Incorrect XML", [
+				(docObj||this.xmlDoc),
+				this.mainObject
+			]);
+
+		if (namespace != null)
+			docObj.setProperty("SelectionNamespaces", "xmlns:xsl='"+namespace+"'"); //
+
+		if (result_type == 'single'){
+			return docObj.selectSingleNode(xpathExp);
+		}
+		else {
+			return docObj.selectNodes(xpathExp)||new Array(0);
+		}
+	} else { //Mozilla
+		var nodeObj = docObj;
+
+		if (!docObj){
+			if (!this.xmlDoc.nodeName){
+				docObj=this.xmlDoc.responseXML
+			}
+			else {
+				docObj=this.xmlDoc;
+			}
+		}
+
+		if (!docObj)
+			dhtmlxError.throwError("LoadXML", "Incorrect XML", [
+				(docObj||this.xmlDoc),
+				this.mainObject
+			]);
+
+		if (docObj.nodeName.indexOf("document") != -1){
+			nodeObj=docObj;
+		}
+		else {
+			nodeObj=docObj;
+			docObj=docObj.ownerDocument;
+		}
+		var retType = XPathResult.ANY_TYPE;
+
+		if (result_type == 'single')
+			retType=XPathResult.FIRST_ORDERED_NODE_TYPE
+		var rowsCol = new Array();
+		var col = docObj.evaluate(xpathExp, nodeObj, function(pref){
+			return namespace
+		}, retType, null);
+
+		if (retType == XPathResult.FIRST_ORDERED_NODE_TYPE){
+			return col.singleNodeValue;
+		}
+		var thisColMemb = col.iterateNext();
+
+		while (thisColMemb){
+			rowsCol[rowsCol.length]=thisColMemb;
+			thisColMemb=col.iterateNext();
+		}
+		return rowsCol;
+	}
+}
+
+function _dhtmlxError(type, name, params){
+	if (!this.catches)
+		this.catches=new Array();
+
+	return this;
+}
+
+_dhtmlxError.prototype.catchError=function(type, func_name){
+	this.catches[type]=func_name;
+}
+_dhtmlxError.prototype.throwError=function(type, name, params){
+	if (this.catches[type])
+		return this.catches[type](type, name, params);
+
+	if (this.catches["ALL"])
+		return this.catches["ALL"](type, name, params);
+
+	alert("Error type: "+arguments[0]+"\nDescription: "+arguments[1]);
+	return null;
+}
+
+window.dhtmlxError=new _dhtmlxError();
+
+
+//opera fake, while 9.0 not released
+//multibrowser Xpath processor
+dtmlXMLLoaderObject.prototype.doXPathOpera=function(xpathExp, docObj){
+	//this is fake for Opera
+	var z = xpathExp.replace(/[\/]+/gi, "/").split('/');
+	var obj = null;
+	var i = 1;
+
+	if (!z.length)
+		return [];
+
+	if (z[0] == ".")
+		obj=[docObj]; else if (z[0] == ""){
+		obj=(this.xmlDoc.responseXML||this.xmlDoc).getElementsByTagName(z[i].replace(/\[[^\]]*\]/g, ""));
+		i++;
+	} else
+		return [];
+
+	for (i; i < z.length; i++)obj=this._getAllNamedChilds(obj, z[i]);
+
+	if (z[i-1].indexOf("[") != -1)
+		obj=this._filterXPath(obj, z[i-1]);
+	return obj;
+}
+
+dtmlXMLLoaderObject.prototype._filterXPath=function(a, b){
+	var c = new Array();
+	var b = b.replace(/[^\[]*\[\@/g, "").replace(/[\[\]\@]*/g, "");
+
+	for (var i = 0; i < a.length; i++)
+		if (a[i].getAttribute(b))
+			c[c.length]=a[i];
+
+	return c;
+}
+dtmlXMLLoaderObject.prototype._getAllNamedChilds=function(a, b){
+	var c = new Array();
+
+	if (_isKHTML)
+		b=b.toUpperCase();
+
+	for (var i = 0; i < a.length; i++)for (var j = 0; j < a[i].childNodes.length; j++){
+		if (_isKHTML){
+			if (a[i].childNodes[j].tagName&&a[i].childNodes[j].tagName.toUpperCase() == b)
+				c[c.length]=a[i].childNodes[j];
+		}
+
+		else if (a[i].childNodes[j].tagName == b)
+			c[c.length]=a[i].childNodes[j];
+	}
+
+	return c;
+}
+
+function dhtmlXHeir(a, b){
+	for (var c in b)
+		if (typeof (b[c]) == "function")
+			a[c]=b[c];
+	return a;
+}
+
+function dhtmlxEvent(el, event, handler){
+	if (el.addEventListener)
+		el.addEventListener(event, handler, false);
+
+	else if (el.attachEvent)
+		el.attachEvent("on"+event, handler);
+}
+
+//============= XSL Extension ===================================
+
+dtmlXMLLoaderObject.prototype.xslDoc=null;
+dtmlXMLLoaderObject.prototype.setXSLParamValue=function(paramName, paramValue, xslDoc){
+	if (!xslDoc)
+		xslDoc=this.xslDoc
+
+	if (xslDoc.responseXML)
+		xslDoc=xslDoc.responseXML;
+	var item =
+		this.doXPath("/xsl:stylesheet/xsl:variable[@name='"+paramName+"']", xslDoc,
+			"http:/\/www.w3.org/1999/XSL/Transform", "single");
+
+	if (item != null)
+		item.firstChild.nodeValue=paramValue
+}
+dtmlXMLLoaderObject.prototype.doXSLTransToObject=function(xslDoc, xmlDoc){
+	if (!xslDoc)
+		xslDoc=this.xslDoc;
+
+	if (xslDoc.responseXML)
+		xslDoc=xslDoc.responseXML
+
+	if (!xmlDoc)
+		xmlDoc=this.xmlDoc;
+
+	if (xmlDoc.responseXML)
+		xmlDoc=xmlDoc.responseXML
+
+	//MOzilla
+	if (!_isIE){
+		if (!this.XSLProcessor){
+			this.XSLProcessor=new XSLTProcessor();
+			this.XSLProcessor.importStylesheet(xslDoc);
+		}
+		var result = this.XSLProcessor.transformToDocument(xmlDoc);
+	} else {
+		var result = new ActiveXObject("Msxml2.DOMDocument.3.0");
+		try{
+			xmlDoc.transformNodeToObject(xslDoc, result);
+		}catch(e){
+			result = xmlDoc.transformNode(xslDoc);
+		}
+	}
+	return result;
+}
+
+dtmlXMLLoaderObject.prototype.doXSLTransToString=function(xslDoc, xmlDoc){
+	var res = this.doXSLTransToObject(xslDoc, xmlDoc);
+	if(typeof(res)=="string")
+		return res;
+	return this.doSerialization(res);
+}
+
+dtmlXMLLoaderObject.prototype.doSerialization=function(xmlDoc){
+	if (!xmlDoc)
+			xmlDoc=this.xmlDoc;
+	if (xmlDoc.responseXML)
+			xmlDoc=xmlDoc.responseXML
+	if (!_isIE){
+		var xmlSerializer = new XMLSerializer();
+		return xmlSerializer.serializeToString(xmlDoc);
+	} else
+		return xmlDoc.xml;
+}
+
+/**
+*   @desc: 
+*   @type: private
+*/
+dhtmlxEventable=function(obj){
+		obj.attachEvent=function(name, catcher, callObj){
+			name='ev_'+name.toLowerCase();
+			if (!this[name])
+				this[name]=new this.eventCatcher(callObj||this);
+				
+			return(name+':'+this[name].addEvent(catcher)); //return ID (event name & event ID)
+		}
+		obj.callEvent=function(name, arg0){ 
+			name='ev_'+name.toLowerCase();
+			if (this[name])
+				return this[name].apply(this, arg0);
+			return true;
+		}
+		obj.checkEvent=function(name){
+			return (!!this['ev_'+name.toLowerCase()])
+		}
+		obj.eventCatcher=function(obj){
+			var dhx_catch = [];
+			var z = function(){
+				var res = true;
+				for (var i = 0; i < dhx_catch.length; i++){
+					if (dhx_catch[i] != null){
+						var zr = dhx_catch[i].apply(obj, arguments);
+						res=res&&zr;
+					}
+				}
+				return res;
+			}
+			z.addEvent=function(ev){
+				if (typeof (ev) != "function")
+					ev=eval(ev);
+				if (ev)
+					return dhx_catch.push(ev)-1;
+				return false;
+			}
+			z.removeEvent=function(id){
+				dhx_catch[id]=null;
+			}
+			return z;
+		}
+		obj.detachEvent=function(id){
+			if (id != false){
+				var list = id.split(':');           //get EventName and ID
+				this[list[0]].removeEvent(list[1]); //remove event
+			}
+		}
+		obj.detachAllEvents = function(){
+			for (var name in this){
+				if (name.indexOf("ev_")==0) 
+					delete this[name];
+			}
+		}
+}
diff --git a/data/web/static/images/combo_select.gif b/data/web/static/images/combo_select.gif
new file mode 100644
index 000000000..237268239
Binary files /dev/null and b/data/web/static/images/combo_select.gif differ