1360 lines
		
	
	
		
			41 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			1360 lines
		
	
	
		
			41 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| //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<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")};
 | |
|    }
 | |
|     if(x.length)
 | |
|     w.addOption(x);
 | |
|    
 | |
|    
 | |
| 	parent.parentNode.removeChild(parent);
 | |
| 	w.selectOption(sel,null,true);
 | |
| 	if (parent.onchange) 
 | |
| 		w.attachEvent("onChange",parent.onchange);
 | |
|    		
 | |
|    	if(parent.style.direction=="rtl" && w.setRTL) 
 | |
|    		w.setRTL(true);
 | |
|    	
 | |
|    return w;
 | |
| }
 | |
| 
 | |
| var dhtmlXCombo_optionTypes = [];
 | |
| /**
 | |
| *     @desc: build combobox
 | |
| *     @param: parent - (string) id of existing object which will be used as container
 | |
| *     @param: name - (string) name of combobox - will be used in FORM
 | |
| *     @param: width - (int) size of combobox
 | |
| *     @param: tabIndex - (int) tab index, optional
 | |
| *     @type: public
 | |
| *     @topic: 0
 | |
| */
 | |
| 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")
 | |
|          return dhtmlXComboFromSelect(parent);
 | |
|       else
 | |
|          this._createSelf(parent,name,width,tabIndex);
 | |
|       dhx_glbSelectAr.push(this);
 | |
| }
 | |
| 
 | |
| /**
 | |
| *     @desc: change control size
 | |
| *     @param: new_size - (int) new size value
 | |
| *     @type: public
 | |
| *     @topic: 0
 | |
| */
 | |
|    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 = Math.max(0,(new_size-19))+'px';
 | |
|    }      
 | |
| /**
 | |
| *     @desc: switch between combobox and auto-filter modes
 | |
| *     @param: mode - (boolean) enable filtering mode
 | |
| *     @param: url - (string) url for filtering from XML, optional
 | |
| *     @param: cache - (boolean) XML caching, optional
 | |
| *     @param: autosubload - (boolean) enable auto load additional suggestions on selecting last loaded option
 | |
| *     @type: public
 | |
| *     @topic: 0
 | |
| */
 | |
|    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=[];
 | |
|       //this.DOMelem_button.style.display=(this._filter?"none":"");
 | |
|    }
 | |
|    
 | |
|    dhtmlXCombo.prototype.setFilteringParam=function(name,value){
 | |
|    		if (!this._prs) this._prs=[];
 | |
|    		this._prs.push([name,value]);
 | |
|    }
 | |
| /**
 | |
| *     @desc: disable combobox
 | |
| *     @param: mode - (boolean) disable combobox
 | |
| *     @type: public
 | |
| *     @topic: 1
 | |
| */
 | |
|    dhtmlXCombo.prototype.disable = function(mode){
 | |
|       var z=convertStringToBoolean(mode);
 | |
|       if (this._disabled==z) return;
 | |
|       this.DOMelem_input.disabled=z;
 | |
|       this._disabled=z;
 | |
|    }
 | |
| /**
 | |
| *     @desc: switch to readonly mode
 | |
| *     @param: mode - (boolean) readonly mode
 | |
| *     @param: autosearch - (boolean) true by default 
 | |
| *     @type: public
 | |
| *     @topic: 1
 | |
| */
 | |
|    dhtmlXCombo.prototype.readonly = function(mode,autosearch){
 | |
|         this.DOMelem_input.readOnly=mode ? true : false;
 | |
| 		if(autosearch===false || mode===false){
 | |
| 			this.DOMelem.onkeyup=function(ev){ }
 | |
| 		} else {
 | |
| 			var that = this;
 | |
| 			this.DOMelem.onkeyup=function(ev){ 
 | |
| 				ev=ev||window.event; 
 | |
| 				if (ev.keyCode!=9) ev.cancelBubble=true;
 | |
| 				if((ev.keyCode >= 48 && ev.keyCode <= 57)||(ev.keyCode >= 65 && ev.keyCode <= 90)){
 | |
| 					for(var i=0; i<that.optionsArr.length; i++){
 | |
| 						var text = that.optionsArr[i].text;
 | |
| 						if(text.toString().toUpperCase().indexOf(String.fromCharCode(ev.keyCode)) == 0){
 | |
| 								that.selectOption(i);
 | |
| 								break;
 | |
| 						}
 | |
| 					}
 | |
| 					ev.cancelBubble=true;
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 	}	
 | |
|    
 | |
| /**
 | |
| *     @desc: get Option by value
 | |
| *     @param: value - (string) value of option in question
 | |
| *     @type: public
 | |
| *     @return: option object
 | |
| *     @topic: 2
 | |
| */
 | |
|    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;
 | |
|    }
 | |
| /**
 | |
| *     @desc: get Option by label
 | |
| *     @param: label - (string) label of option in question
 | |
| *     @type: public
 | |
| *     @return: option object
 | |
| *     @topic: 2
 | |
| */
 | |
|    dhtmlXCombo.prototype.getOptionByLabel = function(value)
 | |
|    {
 | |
| 	  //value=value.replace(/&/g,"&")
 | |
|       for(var i=0; i<this.optionsArr.length; i++)
 | |
|          if(this.optionsArr[i].text==value || this.optionsArr[i]._ctext==value)
 | |
|             return this.optionsArr[i];
 | |
|       return null;
 | |
|    }
 | |
| /**
 | |
| *     @desc: get Option by index
 | |
| *     @param: ind - (int) index of option in question
 | |
| *     @type: public
 | |
| *     @return: option object
 | |
| *     @topic: 2
 | |
| */
 | |
|    dhtmlXCombo.prototype.getOptionByIndex = function(ind){
 | |
|       return this.optionsArr[ind];
 | |
|    }
 | |
| /**
 | |
| *     @desc: clear all options from combobox
 | |
| *     @type: public
 | |
| *     @param: value - (bool) clear current value as well
 | |
| *     @topic: 2
 | |
| */
 | |
|    dhtmlXCombo.prototype.clearAll = function(all)
 | |
|    {
 | |
| 	  if (all) this.setComboText("");   	  
 | |
|       this.optionsArr=new Array();
 | |
|       this.redrawOptions();
 | |
|       if (all) this._confirmSelection();
 | |
|    }
 | |
| /**
 | |
| *     @desc: delete option by value
 | |
| *     @param: value - (string) value of option in question
 | |
| *     @type: public
 | |
| *     @topic: 2
 | |
| */
 | |
|    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();
 | |
|    }
 | |
| 
 | |
| /**
 | |
| *     @desc: enable/disable immideatly rendering after changes in combobox
 | |
| *     @param: mode - (boolean) enable/disable
 | |
| *     @type: public
 | |
| *     @topic: 1
 | |
| */
 | |
|    dhtmlXCombo.prototype.render=function(mode){
 | |
|       this._skiprender=(!convertStringToBoolean(mode));
 | |
|       this.redrawOptions();
 | |
|    }
 | |
| 
 | |
| /**
 | |
| *     @desc: update option in combobox
 | |
| *     @param: oldvalue - (string) index of option in question
 | |
| *     @param: avalue - (variable)
 | |
| *     @type: public
 | |
| *     @topic: 2
 | |
| */
 | |
|    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();
 | |
|    }
 | |
| /**
 | |
| *     @desc: add new option
 | |
| *     @param: value - (variable) - different input for different kinds of options - please refer to examples
 | |
| *     @type: public
 | |
| *     @topic: 2
 | |
| */
 | |
|    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();
 | |
|    }
 | |
| 
 | |
| 
 | |
| /**
 | |
| *     @desc: return index of item by value
 | |
| *     @param: value - (string) value of option in question
 | |
| *     @type: public
 | |
| *     @return: option index
 | |
| *     @topic: 2
 | |
| */
 | |
|    dhtmlXCombo.prototype.getIndexByValue = function(val){
 | |
|       for(var i=0; i<this.optionsArr.length; i++)
 | |
|          if(this.optionsArr[i].value == val) return i;
 | |
|       return -1;
 | |
|    }
 | |
| 
 | |
| /**
 | |
| *     @desc: get value of selected item
 | |
| *     @type: public
 | |
| *     @return: option value
 | |
| *     @topic: 2 
 | |
| */
 | |
|    dhtmlXCombo.prototype.getSelectedValue = function(){
 | |
|       return (this._selOption?this._selOption.value:null);
 | |
|    }
 | |
| /**
 | |
| *     @desc: get current text in combobox
 | |
| *     @type: public
 | |
| *     @return: combobox text
 | |
| *     @topic: 2
 | |
| */
 | |
|    dhtmlXCombo.prototype.getComboText = function(){
 | |
|       return this.DOMelem_input.value;
 | |
|    }
 | |
| /**
 | |
| *     @desc: set text in covmbobox
 | |
| *     @param: text - (string) new text label
 | |
| *     @type: public
 | |
| *     @topic: 2
 | |
| */
 | |
|    dhtmlXCombo.prototype.setComboText = function(text){
 | |
|       this.DOMelem_input.value=text;
 | |
|    }
 | |
|    
 | |
| /**
 | |
| *     @desc: set text in covmbobox
 | |
| *     @param: text - (string) new text label
 | |
| *     @type: public
 | |
| *     @topic: 2
 | |
| */
 | |
|    dhtmlXCombo.prototype.setComboValue = function(text){
 | |
|       this.setComboText(text);
 | |
| 	  for(var i=0; i<this.optionsArr.length; i++)
 | |
|          if (this.optionsArr[i].data()[0]==text)
 | |
|          return this.selectOption(i,null,true);      
 | |
|       this.DOMelem_hidden_input.value=text;
 | |
|    }
 | |
| 
 | |
| /**
 | |
| *     @desc: get value which will be sent with form
 | |
| *     @type: public
 | |
| *     @return: combobox value
 | |
| *     @topic: 2
 | |
| */
 | |
|    dhtmlXCombo.prototype.getActualValue = function(){
 | |
|       return this.DOMelem_hidden_input.value;
 | |
|    }
 | |
| /**
 | |
| *     @desc: get text of selected option
 | |
| *     @type: public
 | |
| *     @return: text of option
 | |
| *     @topic: 2
 | |
| */
 | |
|    dhtmlXCombo.prototype.getSelectedText = function(){
 | |
|       return (this._selOption?this._selOption.text:"");
 | |
|    }
 | |
| /**
 | |
| *     @desc: get index of selected option
 | |
| *     @type: public
 | |
| *     @return: option index
 | |
| *     @topic: 2
 | |
| */
 | |
|    dhtmlXCombo.prototype.getSelectedIndex = function(){
 | |
|       for(var i=0; i<this.optionsArr.length; i++)
 | |
|          if(this.optionsArr[i] == this._selOption) return i;
 | |
|       return -1;
 | |
|    }
 | |
| /**
 | |
| *     @desc: set name used while form submit
 | |
| *     @param: name - (string) new combobox name
 | |
| *     @type: public
 | |
| *     @topic: 2
 | |
| */
 | |
|    dhtmlXCombo.prototype.setName = function(name){  
 | |
|         this.DOMelem_hidden_input.name = name;
 | |
|         this.DOMelem_hidden_input2 = name.replace(/(\]?)$/, "_new_value$1");
 | |
| 
 | |
|         this.name = name;
 | |
|    }
 | |
| /**
 | |
| *     @desc: show combox ( reversion to hide command )
 | |
| *     @param: mode - (boolean) enable/disable
 | |
| *     @type: public
 | |
| *     @topic: 1
 | |
| */
 | |
|    dhtmlXCombo.prototype.show = function(mode){
 | |
|       if (convertStringToBoolean(mode))
 | |
|          this.DOMelem.style.display = "";
 | |
|       else
 | |
|          this.DOMelem.style.display = "none";
 | |
|    }
 | |
| 
 | |
| /**
 | |
| *     @desc: destroy object and any related HTML elements
 | |
| *     @type: public
 | |
| *     @topic: 0
 | |
| */
 | |
|    dhtmlXCombo.prototype.destructor = function()
 | |
|    {
 | |
|       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] == this)
 | |
|          {
 | |
|             s[i] = null;
 | |
|             s.splice(i,1);
 | |
|             return;
 | |
|          }
 | |
|       }
 | |
|    }
 | |
| 
 | |
| /**
 | |
| *     @desc: create self HTML
 | |
| *     @type: private
 | |
| *     @topic: 0
 | |
| */
 | |
|       dhtmlXCombo.prototype._createSelf = function(selParent, name, width, tab)
 | |
|       {
 | |
|          if (width.toString().indexOf("%")!=-1){ 
 | |
|             var self = this;
 | |
|             var resWidht=parseInt(width)/100;
 | |
|             window.setInterval(function(){ 
 | |
|                if (!selParent.parentNode) return;
 | |
|                var ts=selParent.parentNode.offsetWidth*resWidht-2;
 | |
|                if (ts<0) return;
 | |
|                if (ts==self._lastTs) return;
 | |
|                self.setSize(self._lastTs=ts);},500);
 | |
|             var width=parseInt(selParent.offsetWidth); //mm
 | |
|          }
 | |
| 
 | |
|          var width=parseInt(width||100); //mm
 | |
|          this.ListPosition = "Bottom"; //set optionlist positioning
 | |
|          this.DOMParent = selParent;
 | |
|          this._inID = null;
 | |
|          this.name = name;
 | |
| 
 | |
|          this._selOption = null; //selected option object pointer
 | |
|          this.optionsArr = Array();
 | |
| 
 | |
|             var opt = new this._optionObject();
 | |
|             opt.DrawHeader(this,name, width,tab);
 | |
|          //HTML select part 2 - options list DIV element
 | |
|          this.DOMlist = document.createElement("DIV");
 | |
|          this.DOMlist.className = 'dhx_combo_list '+(dhtmlx.skin?dhtmlx.skin+"_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.onclick = this._toggleSelect;
 | |
|          this.DOMlist.onclick = this._selectOption;
 | |
|          this.DOMlist.onmousedown = function(){
 | |
|          	this._skipBlur=true;
 | |
|      	 }
 | |
|          
 | |
|          this.DOMlist.onkeydown = function(e){
 | |
|          	this.combo.DOMelem_input.focus();
 | |
|          	(e||event).cancelBubble=true;
 | |
|          	this.combo.DOMelem_input.onkeydown(e)
 | |
|      	 }
 | |
| 		  this.DOMlist.onmouseover = this._listOver;
 | |
|      	 
 | |
|       }
 | |
| 
 | |
|       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 ) {
 | |
|             if(that._selOption) that._selOption.deselect(); 
 | |
| 			if(that._tempSel) that._tempSel.deselect();
 | |
|            
 | |
| 		    var i=0;
 | |
|             for (i; i<that.DOMlist.childNodes.length; i++) {
 | |
|                if (that.DOMlist.childNodes[i]==node) break;
 | |
|             }
 | |
|             var z=that.optionsArr[i];
 | |
|            that._tempSel=z;
 | |
|            that._tempSel.select();
 | |
|         	  
 | |
| 			if ((that._autoxml)&&((i+1)==that._lastLength)){
 | |
| 				that._fetchOptions(i+1,that._lasttext||""); 
 | |
|             }           
 | |
|          }
 | |
| 
 | |
|       }
 | |
| 
 | |
| /**
 | |
| *     @desc: place option list in necessary place on screen
 | |
| *     @type: private
 | |
| *     @topic: 0
 | |
| */
 | |
|       dhtmlXCombo.prototype._positList = function()
 | |
|       {
 | |
| 	  	//if(this.ListAutoPosit) this.enableOptionAutoPositioning(true); //mm auto posit
 | |
|          var pos=this.getPosition(this.DOMelem);
 | |
|          if(this.ListPosition == 'Bottom'){
 | |
|             this.DOMlist.style.top = pos[1]+this.DOMelem.offsetHeight-1+"px";
 | |
|             this.DOMlist.style.left = pos[0]+"px";
 | |
|          }
 | |
|          else if(this.ListPosition == 'Top'){ //mm
 | |
| 				this.DOMlist.style.top = pos[1] - this.DOMlist.offsetHeight+"px";
 | |
|             	
 | |
| 				this.DOMlist.style.left = pos[0]+"px"; //mm
 | |
|           }
 | |
| 		  else{
 | |
| 			this.DOMlist.style.top = pos[1]+"px";
 | |
|             this.DOMlist.style.left = pos[0]+this.DOMelem.offsetWidth+"px";
 | |
|          }
 | |
|      
 | |
|       }
 | |
| 	  
 | |
| 	dhtmlXCombo.prototype.getPosition = function(oNode,pNode){
 | |
| 		if (_isChrome){ 
 | |
| 			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 && _isIE<8){
 | |
| 			
 | |
| 			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);
 | |
| 		}
 | |
| 		var pos = getOffset(oNode);
 | |
|         return [pos.left, pos.top];
 | |
|         
 | |
| 	}
 | |
| /**
 | |
| *     @desc: correct current selection ( move it to first visible option )
 | |
| *     @type: private
 | |
| *     @topic: 2
 | |
| */
 | |
|       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();
 | |
|       }
 | |
| /**
 | |
| *     @desc: select next option in combobox
 | |
| *     @param: step - (int) step size
 | |
| *     @type: private
 | |
| *     @topic: 2
 | |
| */
 | |
|       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;
 | |
|          }
 | |
|       }
 | |
| /**
 | |
| *     @desc: on keypressed handler
 | |
| *     @type: private
 | |
| *     @topic: 0
 | |
| */
 | |
|       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();
 | |
|      	} else
 | |
|         if (ev.keyCode=="27" ){
 | |
|          	that._resetSelection();
 | |
|          	that.closeAll();
 | |
|      	} else that._activeMode=true;
 | |
|          if (ev.keyCode=="13" || ev.keyCode=="27" ){ //enter
 | |
|             that.callEvent("onKeyPressed",[ev.keyCode])
 | |
|             return false;
 | |
|          }
 | |
|          return true;
 | |
|       }
 | |
| /**
 | |
| *     @desc: on keyup handler
 | |
| *     @type: private
 | |
| *     @topic: 0
 | |
| */
 | |
|       dhtmlXCombo.prototype._onKey = function(e){
 | |
|          var that=this.parentNode.combo;
 | |
|          (e||event).cancelBubble=true;
 | |
|          var ev=(e||event).keyCode;
 | |
|          if (ev>15 && 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<this.optionsArr.length; i++)
 | |
|                if (this.optionsArr[i].data()[1]==this.DOMelem_input.value){
 | |
| //                  ev.cancelBubble=true;
 | |
|                   this.selectOption(i,false,false);
 | |
|                   return false;
 | |
|                   }
 | |
|             this.unSelectOption();
 | |
|          }
 | |
|          return true;
 | |
|       }
 | |
| 
 | |
| 
 | |
| /**
 | |
| *     @desc: on data change handler
 | |
| *     @type: private
 | |
| *     @topic: 0
 | |
| */
 | |
|       dhtmlXCombo.prototype._onBlur = function()
 | |
|       {
 | |
|           var self = this.parentNode._self;
 | |
|           window.setTimeout(function(){
 | |
|           	if (self.DOMlist._skipBlur) return !(self.DOMlist._skipBlur=false);
 | |
|           	self._confirmSelection();        
 | |
|           	self.callEvent("onBlur",[]);
 | |
|           },100)
 | |
|           
 | |
|       }
 | |
| /**
 | |
| *     @desc: redraw combobox options
 | |
| *     @type: private
 | |
| *     @topic: 2
 | |
| */
 | |
|       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());
 | |
| 			
 | |
| 		
 | |
| 		
 | |
| 						
 | |
| 
 | |
|       }
 | |
| /**
 | |
| *     @desc: load list of options from XML
 | |
| *     @param: url - (string) xml url
 | |
| *     @type: public
 | |
| *     @topic: 0
 | |
| */
 | |
|       dhtmlXCombo.prototype.loadXML = function(url,afterCall){
 | |
|          this._load=true;
 | |
|          this.callEvent("onXLS",[]);
 | |
| 		 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("");         
 | |
|          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;
 | |
|             xml._cPath=url;
 | |
|             xml.loadXML(url);
 | |
|          }
 | |
|       }
 | |
| 
 | |
| /**
 | |
| *     @desc: load list of options from XML string
 | |
| *     @param: astring - (string) xml string
 | |
| *     @type: public
 | |
| *     @topic: 0
 | |
| */
 | |
|       dhtmlXCombo.prototype.loadXMLString = function(astring){
 | |
|          var xml=(new dtmlXMLLoaderObject(this._fillFromXML,this,true,true));
 | |
|          xml.loadXMLString(astring);
 | |
|       }
 | |
| 
 | |
| /**
 | |
| *     @desc: on XML load handler
 | |
| *     @type: private
 | |
| *     @topic: 0
 | |
| */
 | |
|       dhtmlXCombo.prototype._fillFromXML = function(obj,b,c,d,xml){
 | |
|          if (obj._xmlCache) obj._xmlCache[xml._cPath]=xml;
 | |
| 
 | |
|          //check that XML is correct 
 | |
|          var toptag=xml.getXMLTopNode("complete");
 | |
|          if (toptag.tagName!="complete") return;
 | |
|          var top=xml.doXPath("//complete");
 | |
|          var options=xml.doXPath("//option");
 | |
|          
 | |
|          var add = false;
 | |
|          
 | |
|          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 {
 | |
| 	         		if (obj._activeMode){
 | |
| 	         			obj._positList();
 | |
| 	        			obj.DOMlist.style.display="block";
 | |
| 	         			if (_isIE) obj._IEFix(true);
 | |
|          			}
 | |
| 	     	 }}            
 | |
|          } else {
 | |
|             obj._lastLength+=options.length||Infinity;
 | |
| 	        add = true;
 | |
|         }
 | |
| 
 | |
|          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(add!=true || (!!options.length));
 | |
|          	
 | |
|          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);
 | |
| 
 | |
|          obj.callEvent("onXLE",[]);
 | |
| 
 | |
|       }
 | |
| /**
 | |
| *     @desc: deselect option
 | |
| *     @type: public
 | |
| *     @topic: 1
 | |
| */
 | |
|       dhtmlXCombo.prototype.unSelectOption = function(){
 | |
|          if (this._selOption) this._selOption.deselect();
 | |
|          if(this._tempSel) this._tempSel.deselect();
 | |
|          this._tempSel=this._selOption=null;
 | |
|       }
 | |
| 	  
 | |
| /**
 | |
| *     @desc: confirms combo value (recommended to be called on form submit)
 | |
| *     @type: public
 | |
| *     @topic: 1
 | |
| */
 | |
| 	 dhtmlXCombo.prototype.confirmValue = function(){
 | |
|          this._confirmSelection();
 | |
| 	 }
 | |
| 	  
 | |
| 	  
 | |
|       dhtmlXCombo.prototype._confirmSelection = function(data,status){
 | |
|       	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",[]);
 | |
|       	this._activeMode=false;
 | |
|   	  }
 | |
|       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)
 | |
|   	  }  	  
 | |
|   	  
 | |
| /**
 | |
| *     @desc: select option
 | |
| *     @param: ind - (int) index of option in question
 | |
| *     @param: filter - (boolean) enable autocomplit range, optional
 | |
| *     @param: conf - (boolean) true for real selection, false for pre-selection
 | |
| *     @type: public
 | |
| *     @topic: 1
 | |
| */
 | |
|       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.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; i<that.DOMlist.childNodes.length; i++) {
 | |
|             if (that.DOMlist.childNodes[i]==node) break;
 | |
|          }
 | |
|          that.selectOption(i,false,true);
 | |
|          that.closeAll();
 | |
|          that.callEvent("onBlur",[])
 | |
|          that._activeMode=false;
 | |
|       }
 | |
| /**
 | |
| *     @desc: open list of options 
 | |
| *     @type: public
 | |
| *     @topic: 2
 | |
| */
 | |
|    dhtmlXCombo.prototype.openSelect = function(){ 
 | |
|    	
 | |
| 	
 | |
|     
 | |
| 	  if (this._disabled) return;
 | |
|       this.closeAll();
 | |
|       this._positList();
 | |
|       this.DOMlist.style.display="block";
 | |
|       this.callEvent("onOpen",[]);
 | |
| 	  if(this._tempSel) this._tempSel.deselect();
 | |
| 	  if(this._selOption) this._selOption.select();
 | |
| 	  if(this._selOption){
 | |
| 	 	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;
 | |
| 	  }
 | |
| 	  /* if (this.autoOptionSize){
 | |
|         	var x=this.DOMlist.offsetWidth; 
 | |
| 			
 | |
|         	for ( var i=0; i<this.optionsArr.length; i++){
 | |
| 				if(i==0) alert("this.DOMlist.childNodes[i].scrollWidth ="+ this.DOMlist.childNodes[i].scrollWidth + "> 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<this.optionsArr.length; i++){
 | |
|       	 var z=filter.test(this.optionsArr[i].text);
 | |
|       	 this.filterAny|=z;
 | |
|          this.optionsArr[i].hide(!z);
 | |
|       }
 | |
|       if (!this.filterAny) {
 | |
| 		  this.closeAll();
 | |
| 		  this._activeMode=true;
 | |
| 	  }
 | |
|       else {
 | |
|       	  if (this.DOMlist.style.display!="block")
 | |
|       	   		this.openSelect();
 | |
| 	      if (_isIE) this._IEFix(true);
 | |
|   		}
 | |
|          
 | |
|         if (!mode)
 | |
|          this._correctSelection();   
 | |
|         else this.unSelectOption();
 | |
|    }
 | |
|  
 | |
|  
 | |
| 
 | |
| 
 | |
| /**
 | |
| *     @desc: set hidden iframe for IE
 | |
| *     @type: private
 | |
| *     @topic: 2
 | |
| */
 | |
|    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;
 | |
|    }
 | |
| /**
 | |
| *     @desc: close opened combobox list
 | |
| *     @type: public
 | |
| *     @topic: 1
 | |
| */
 | |
|    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);
 | |
|             }
 | |
|             dhx_glbSelectAr[i]._activeMode=false;
 | |
|         }
 | |
|    }
 | |
|  
 | |
| 		
 | |
| /**
 | |
| *     @desc: create selection range in input control
 | |
| *     @param: InputId - (string) id of input ( object can be used as well )
 | |
| *     @param: Start - (int) start selection position
 | |
| *     @param: End - (int) end selection position
 | |
| *     @type: public
 | |
| *     @topic: 0
 | |
| */
 | |
| 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 (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='<?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(':');            //get EventName and ID
 | |
|          this[ list[0] ].removeEvent( list[1] );   //remove event
 | |
|       }
 | |
|    }
 | |
| };
 | |
| 
 | |
| 
 | |
| //combo
 | |
| (function(){
 | |
| 	dhtmlx.extend_api("dhtmlXCombo",{
 | |
| 		_init:function(obj){
 | |
| 			if (obj.image_path) 
 | |
| 				dhx_globalImgPath=obj.image_path;
 | |
| 			return [obj.parent, obj.name, (obj.width||"100%"), obj.type, obj.index ];
 | |
| 		},
 | |
| 		filter:"filter_command",
 | |
| 		auto_height:"enableOptionAutoHeight",
 | |
| 		auto_position:"enableOptionAutoPositioning",
 | |
| 		auto_width:"enableOptionAutoWidth",
 | |
| 		xml:"loadXML",
 | |
| 		readonly:"readonly",
 | |
| 		items:"addOption"
 | |
| 	},{
 | |
| 		filter_command:function(data){
 | |
| 			if (typeof data == "string")
 | |
| 				this.enableFilteringMode(true,data);
 | |
| 			else
 | |
| 				this.enableFilteringMode(data);
 | |
| 		}
 | |
| 	});
 | |
| })();
 | |
| 
 | |
| 
 | |
| //(c)dhtmlx ltd. www.dhtmlx.com
 |