apzl_leasing/WebContent/js/tracywindy/tracywindyComboBox.js
2018-06-03 22:26:41 +08:00

1115 lines
35 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//if(window.tracywindyComboBox)alert("不能重复引用tracywindyComboBox.js");
function hiddenAllComboBox()
{
for(var p in tracywindyObject)
{
if( 'combobox' == tracywindyObject[p].objectType)
{
tracywindyObject[p].dropDiv.style.display = "none";
tracywindyObject[p].childCreate=false;
}
}
}
function initComboboxAllHiddenEvent(){
if(!window.isInitComboHidden){
var workflowFormContainer = document.getElementById('id_workflowFormContainer_inner');
if(workflowFormContainer)
{
var scrollHandler = (function(){
return function(){
//同时我们把下拉的关闭掉。
//document.getElementById("selectChild" + $me.id).style.display="none";
//$me.childCreate=false;
hiddenAllComboBox();
};
})();
if(!SysBrowser.mobile){
workflowFormContainer.onscroll=scrollHandler;
document.body.onscroll= scrollHandler;
}else{
workflowFormContainer.ontouchstart = scrollHandler;
document.body.ontouchmovestart = scrollHandler;
}
}
if(document.documentElement)
{
var currentClickHandler = (function(){
return function(e){
var currentTarget = getEvent(e).srcElement||getEvent(e).target||getEvent(e).currentTarget;
if(currentTarget){
if((((currentTarget.className+"")||" ").indexOf("x-panel-combo-droplist")>-1))
{
return false;
}
}
//同时我们把下拉的关闭掉。
//document.getElementById("selectChild" + $me.id).style.display="none";
//$me.childCreate=false;
hiddenAllComboBox();
};
})();
//document.documentElement.onmouseup = currentClickHandler;
//document.documentElement.onscroll = currentClickHandler;
document.documentElement.onmousedown = currentClickHandler;
/*注册事件*/
if(document.addEventListener){
document.addEventListener('DOMMouseScroll',currentClickHandler,false);
}//W3C
window.onmousewheel=document.onmousewheel=currentClickHandler;//IE/Opera/Chrome/Safari
}
window.isInitComboHidden = true;
}
}
var tracywindyComboBox = function(config){
if(config.id){
var oldCombo = getTracywindyObject(config.id);
if(oldCombo){
try{oldCombo.renderToObj.removeChild(oldCombo.dom);}catch(e){}
try{document.body.removeChild(oldCombo.dropDiv);}catch(e){}
}
}
this.lazyLoad = false;//config.lazyLoad||false;//false;//
this.objectType = "combobox";
this.loadMode = config.loadMode ||"ajax";
this.url = config.url||(getRootPath()+'/table/getTableData.action');
this.datas = config.datas||[];
this.displayField = config.displayField||'name';
this.valueField = config.valueField||'value';
this.value = config.value||'';
this.rawValue = config.rawValue||'';
this.childCreate=false;
this.grantValue = true;
this.topAdd = config.topAdd||0;
this.leftAdd = config.leftAdd||0;
this.id = config.id||GenerateGuid();
this.name = config.name||this.id;
this.dropListWidthAdd=config.dropListWidthAdd||0;
tracywindyObject[this.id]=this;
this.width = config.width||150;
this.otherConfig = config.otherConfig||{};
this.height = config.height||22;
this.renderTo = config.renderTo;
this.scrollContainer = config.scrollContainer;
this.scrollContainerObject = config.scrollContainerObject; //DOM元素对象数组
this.isContainEmpty = (config.isContainEmpty == false)?false:true;
this.start = this.start||0;
this.dropListHeight = config.dropListHeight||200;
this.constDropListHeight = this.dropListHeight;
this.start = config.start||0;
this.limit = config.limit||99999;
this.xmlFileName = config.xmlFileName;
this.readOnly = config.readOnly;
this.params = config.params||{};
this.isCheck = config.isCheck||false;//是否多选
this.onSelect = config.onSelect;
this.onClick = config.onClick;
//modify by tracywindy 2013-11-26
this.filterLoadComplete = config.filterLoadComplete;
this.loadComplete= config.loadComplete||this.filterLoadComplete;
this.positionDropIconTopAdd = config.positionDropIconTopAdd||0;
this.positionDropIconLeftAdd = config.positionDropIconLeftAdd||0;
this.readOnlyData = config.readOnlyData||false;
this.otherAttributes = config.otherAttributes||'';
this.isAjaxLenovo = config.isAjaxLenovo||false;
this.comboLoadFunc = config.comboLoadFunc||function(){};
this.isForceModify = config.isForceModify||false;
this.defaultIndex = -2;
//this.isAssignInput = config.isAssignInput||false;
this.assignInputDisplayInputId = config.assignInputDisplayInputId;
this.assignInputHiddenInputId = config.assignInputHiddenInputId;
this.relativeDisplayInputId = config.relativeDisplayInputId;
this.relativeHiddenInputId = config.relativeHiddenInputId;
if(this.relativeDisplayInputId){
this.relativeDisplayInput = document.getElementById(this.relativeDisplayInputId);
}
if(this.relativeHiddenInputId){
this.relativeHiddenInput = document.getElementById(this.relativeHiddenInputId);
}
this.isAsync = (false == config.isAsync) ? false : true;
this.defaultIndex = parseInt(config.defaultIndex);
if(isNaN(this.defaultIndex))
this.defaultIndex = -2;
if((config.isViewHistoryTask ||window.isViewHistoryTask)&&!this.isForceModify)
{
this.readOnlyData = true;
}
if((false==config.isViewHistoryTask)&&(true != config.readOnlyData)){
this.readOnlyData = false;
}
if(window.isCompletedTask){
this.readOnlyData = true;
}
if((this.readOnly!=false) || this.isCheck)
{
this.readOnly = true;
}
if(this.readOnlyData)
{
this.readOnly = true;
}
this.createObj();
};
tracywindyComboBox.prototype.reload=function(){
if(this.loadMode=='ajax'){
this.datas=[];
this.lazyLoad = false;
}
this.loadSelect();
};
tracywindyComboBox.prototype.setParam=function(name,value){
this.params[name]=value;
};
tracywindyComboBox.prototype.setParams=function(params){
for(var param in params)
{
this.params[param] = params[param];
}
};
//创建数据区
tracywindyComboBox.prototype.AddRow=function(rowData){
this.datas.push(rowData);
this.loadData();
return rowData;
};
tracywindyComboBox.prototype.AddRows=function(rowDatas){
if(rowDatas instanceof Array)
{
for(var index=0;index<rowDatas.length;index++)
{
this.datas.push(rowDatas[index]);
}
}
else
{
this.datas.push(rowDatas);
}
this.loadData();
return rowDatas;
};
//返回所有行json data 形如[{'value':'1'},{'value':'2'}]
tracywindyComboBox.prototype.getRowsData=function(){
return this.datas;
};
tracywindyComboBox.prototype.removeRowAt=function(index){
var rowData = this.datas.splice(index,1);
this.loadData();
return rowData;
};
tracywindyComboBox.prototype.addRowAt=function(index,rowData){
this.datas.splice(index,0,rowData);
this.loadData();
return rowData;
};
tracywindyComboBox.prototype.addRowsAt=function(index,rowDatas){
if(rowDatas instanceof Array)
{
for(var rindex=0;rindex<rowDatas.length;rindex++)
{
this.datas.splice(index++,0,rowDatas[rindex]);
}
}
else
{
this.datas.splice(index,0,rowDatas);
}
this.loadData();
return rowDatas;
};
tracywindyComboBox.prototype.loadAjaxData=function(isAsync){
if(typeof(isAsync)=="undefined")isAsync = true;
//this.loadMask.show();
if(this.loadMask)
{
this.loadMask.show();
}
var params = this.params;
var xmlFileName = this.xmlFileName;
var $me = this;
params['xmlFileName'] = xmlFileName;
params['start'] = this.start;
params['limit'] = this.limit;
ajaxRequest({
url:this.url,
async:isAsync,
success:function(res){
$me.jsonData = eval('('+res.responseText+')');
$me.datas = $me.jsonData['datas'];
$me.loadData();
if($me.loadComplete)
{
$me.loadComplete($me);
}
if($me.loadMask)
{
$me.loadMask.hide();
}
$me.isComplete=true;
},
failure:function(res){
},
params:params
});
};
tracywindyComboBox.prototype.createObj=function(){
var currentObj = this.renderTo;
//创建主div
if(!(typeof(this.renderTo)=='object'))
{
currentObj = document.getElementById(this.renderTo);
}
this.renderToObj = currentObj;
if(!currentObj){
alert("combo的renderTo组件未找到:["+this.renderTo+"]");
}
currentObj.style.width = (this.width+4)+"px";
if(currentObj.className){
if(currentObj.className.indexOf("leftComboContainer")>-1){
currentObj.style.borderColor="transparent";
}
}
this.comboBoxFrameDiv = document.createElement("div");
this.comboBoxFrameDiv.style.width = (this.width)+"px";
this.comboBoxFrameDiv.style.height = this.height+"px";
this.comboBoxFrameDiv.style.textIndent = "0px";
this.comboBoxFrameDiv.className = "x-panel-combo-frame-div";
this.comboBoxFrameDiv.style.padding="0 0 0 0";
this.comboBoxFrameDiv.style.margin="0 0 0 0";
try{
currentObj.appendChild(this.comboBoxFrameDiv);
}catch(e){
alert("tracywindyCombo不合法renderTO组件["+this.renderTo+"]");
}
this.dom = this.comboBoxFrameDiv;
this.loadSelect();
this.setDefaultValue();
};
tracywindyComboBox.prototype.setDefaultValue=function(index){
var defaultIndex = undefined;
if(this.defaultIndex != 'undefined')
defaultIndex = this.defaultIndex;
else if(index != 'undefined'){
defaultIndex = parseInt(index);
}
if(isNaN(defaultIndex))
return;
if(defaultIndex > -1 && defaultIndex < this.datas.length){
this.setValue(this.datas[defaultIndex][this.valueField]);
}
if(this.defaultIndex == -1){
this.setValue('');
}
};
tracywindyComboBox.prototype.GetOffset = function(object, offset) {
if (!object)
return;
offset.x += object.offsetLeft;
offset.y += object.offsetTop;
this.GetOffset (object.offsetParent, offset);
};
tracywindyComboBox.prototype.GetScrolled = function (object, scrolled) {
if (!object)
return;
scrolled.x += object.scrollLeft;
scrolled.y += object.scrollTop;
if (object.tagName.toLowerCase () != "html") {
this.GetScrolled (object.parentNode, scrolled);
}
};
tracywindyComboBox.prototype.GetTopLeft = function (div) {
// var div = document.getElementById ("myDiv");
var offset = {x : 0, y : 0};
this.GetOffset (div, offset);
var scrolled = {x : 0, y : 0};
this.GetScrolled (div.parentNode, scrolled);
var posX = offset.x - scrolled.x;
var posY = offset.y - scrolled.y;
/*alert ("The top-left corner of the div relative to the top-left corner of the browser's client area: \n"
+ " horizontal: " + posX + "px\n vertical: " + posY + "px");*/
return {posX:posX,posY:posY};
};
tracywindyComboBox.prototype.Offset=function(){
var e = this.showValueDiv;
var t = 0;
var l = 0;
var w = this.width;
var h = this.height-2;
var offset = this.GetTopLeft(e);
t = offset.posY;
l = offset.posX;
/*while(e)
{
t+=e.offsetTop;
l+=e.offsetLeft;
//t-=e.scrollTop;
//l-=e.scrollLeft;
e=e.offsetParent;
}
var el = this.showValueDiv.parentNode;
while(el)
{
if(el.className){
if( (el.className.indexOf("panel-body")>-1) && ((el.className.indexOf("window-body")>-1)||(el.className.indexOf("dialog-content")>-1))){
t-=el.scrollTop;
l-=el.scrollLeft;
break;
}
}
el = el.parentNode;
}
if(document.body)
{
// l-=document.body.scrollLeft;
// t-=document.body.scrollTop;
}
var workflowFormContainer = document.getElementById('id_workflowFormContainer_inner');
if(workflowFormContainer)
{
if(isParent(this.comboBoxFrameDiv,workflowFormContainer))
{
l-= workflowFormContainer.scrollLeft;
t-= workflowFormContainer.scrollTop;
}
}
if(this.scrollContainer){
var scrollContainerArr = this.scrollContainer.split(",");
for(var i =0;i<scrollContainerArr.length;i++){
var currentScrollContainer = scrollContainerArr[i];
if (!(typeof(this.scrollContainer) == 'object')) {
currentScrollContainer = document.getElementById(currentScrollContainer);
}
if((0 == currentScrollContainer.offsetHeight) || ("none" == currentScrollContainer.style.display)){
continue;
}
l-= currentScrollContainer.scrollLeft;
t-= currentScrollContainer.scrollTop;
}
}else if(this.scrollContainerObject){ //DOM元素数组
for(var i = 0; i < this.scrollContainerObject.length; i++){
currentScrollContainer = this.scrollContainerObject[i];
if((0== currentScrollContainer.offsetHeight) || ("none" == currentScrollContainer.style.display)){
continue;
}
l -= currentScrollContainer.scrollLeft;
t -= currentScrollContainer.scrollTop;
}
}*/
return {
top : t,
left : l-2,
width : w,
height : h
};
};
var globalCurrentSelectedCombo = null;
tracywindyComboBox.prototype.loadSelect=function(){
var domInnerHTML = "";
var hiddenInputId = 'selectOfValue_'+this.id;
var displayInputId = 'selectOfRawValue_'+this.id;
if(!this.assignInputHiddenInputId){
domInnerHTML+= "<input type='hidden' id='selectOfValue_"+this.id+"' name='"+this.name+"' value='' />";
}else{
hiddenInputId = this.assignInputHiddenInputId;
}
if(!this.assignInputDisplayInputId){
domInnerHTML+= "<input type='hidden' id='selectOfRawValue_"+this.id+"' name='rawValue_"+this.name+"' "+this.otherAttributes+" value='' />";
}else{
displayInputId = this.assignInputDisplayInputId;
}
this.dom.innerHTML = domInnerHTML;
var idDivValueHidden = document.getElementById(hiddenInputId);
this.valueHidden = idDivValueHidden;
var idDivRawValueHidden = document.getElementById(displayInputId);
this.rawValueHidden = idDivRawValueHidden;
this.isComplete = false;
//第三步虚拟一个div出来代替select
var iDiv = document.createElement("input");
this.showValueDiv = iDiv;
this.iDiv = iDiv;
iDiv.id="selectOf_" + this.id;
iDiv.readOnly = this.readOnly;
iDiv.style.width=(this.width-20)+"px";
//iDiv.className = "x-panel-combo-droplist-input";
// iDiv.style.borderRight = "1px solid #DDD";
//iDiv.style.borderColor = "#DDD";
if(this.readOnlyData)
{
iDiv.className = "td-content-input td-content-readonly";
}
if(this.readOnly)
{
iDiv.className = "td-content-input td-content-readonly";
}
addClass(iDiv,"x-panel-combo-droplist-input");
//iDiv.style.backgroundPosition=((20)+" "+(-1+this.positionDropIconTopAdd));
this.relayFinish = true;
window[this.id+'_setTimeOutFunc'] = function(comboId){
var combo = tracywindyObject[comboId];
var $me = combo;
$me.relayFinish=false;
combo.value = "";
combo.rawValue="";
combo.valueHidden.value = "";
combo.rawValueHidden.value = "";
if($me.isAjaxLenovo)
{
var params = $me.params;
$me.isComplete=false;
params['currentRawValue'] = combo.iDiv.value;
ajaxRequest({
url:$me.url,
success:function(res){
$me.jsonData = eval('('+res.responseText+')');
if($me.jsonData.norecord=='true')
{
$me.datas = [];
}
else
{
$me.datas = $me.jsonData['datas'];
}
combo.setFilterRawValue(combo.iDiv.value,'');
/*modify by tracywindy 2013-11-26*/
if($me.filterLoadComplete)
{
$me.filterLoadComplete($me);
}
if($me.loadMask)
{
$me.loadMask.hide();
}
$me.isComplete=true;
combo.relayFinish = true;
},
failure:function(res){
},
params:params
});
//combo.setFilterRawValue(combo.iDiv.value,'');
}else{
if(combo.iDiv.value=='')
{
combo.setFilterRawValue(combo.iDiv.value,'');
}
else
{
combo.setFilterRawValue(combo.iDiv.value,new RegExp("^.*"+combo.iDiv.value.replace(/\(/gi,"\\(").replace(/\)/gi,"\\)")+"+.*$"));
}
combo.relayFinish = true;
}
};
var keyUpFunc = (function($me){
return function(e){
if($me.relayFinish)
{
$me.relayFinish=false;
setTimeout("window['"+$me.id+"_setTimeOutFunc']('"+$me.id+"')",100);
}
var ev = getEvent(e);
ev.cancelBubble = true;
try
{
ev.stopDefault();
}catch(ex){};
};
})(this);
if(iDiv.readOnly==false)
{
if(!this.readOnlyData){
iDiv.onkeyup = keyUpFunc;
}
}
else
{
if(!this.readOnlyData)iDiv.onkeydown=function(ev){
var e = getEvent(ev);
var keyCode = e.keyCode||e.charCode;
var pass = true;
if(keyCode==8)
{
pass = false;
}
if(!pass){
cancelBubble(e);
e.returnValue = pass;
e.cancelBubble = true;
try
{
e.stopDefault();
}catch(e)
{
e.returnValue = pass;
}
}
};
}
var comboTable = document.createElement("table");
comboTable.className = "x-panel-combo-table";
this.comboBoxFrameDiv.appendChild(comboTable);
var comboTBody = document.createElement("tbody");
comboTable.appendChild(comboTBody);
var comboTBodyRow = document.createElement("tr");
comboTBody.appendChild(comboTBodyRow);
var comboTBodyRowTdInput = document.createElement("td");
comboTBodyRowTdInput.appendChild(iDiv);
comboTBodyRowTdInput.style.padding = "0px";
comboTBodyRowTdInput.style.margin = "0px";
comboTBodyRowTdInput.style.textIndent = "0px";
comboTBodyRow.appendChild(comboTBodyRowTdInput);
this.comboBoxFrameDiv.appendChild(comboTable);
var iconDiv = document.createElement("div");
this.comboBoxFrameDiv.dropIconDiv = iconDiv;
this.dropIconDiv = iconDiv;
with(iconDiv)
{
className = "x-panel-combo-dropIcon";
}
if(!this.readOnlyData)
{
this.comboBoxFrameDiv.onmouseover=function(){
addClass(this.dropIconDiv,"x-panel-combo-dropIcon-alt");
};
this.comboBoxFrameDiv.onmouseout=function(){
removeClass(this.dropIconDiv,"x-panel-combo-dropIcon-alt");
};
}
var comboTBodyRowTdIcon = document.createElement("td");
comboTBodyRowTdIcon.style.padding = "0px";
comboTBodyRowTdIcon.style.margin = "0px";
comboTBodyRowTdIcon.style.textIndent = "0px";
comboTBodyRowTdIcon.appendChild(iconDiv);
comboTBodyRow.appendChild(comboTBodyRowTdIcon);
if(this.readOnlyData)
{
this.dropIconDiv.style.display="none";
iDiv.style.width=(this.width)+"px";
}
else
{
iDiv.style.width=(this.width-20)+"px";
}
/* var idDivValueHidden = document.createElement("<input type='hidden' id='selectOfValue_"+this.id+"' name='"+this.name+"' value=''>");
this.comboBoxFrameDiv.appendChild(idDivValueHidden);
this.valueHidden = idDivValueHidden;
var idDivRawValueHidden = document.createElement("<input type='hidden' id='selectOfRawValue_"+this.id+"' name='rawValue_"+this.name+"' value=''>");
this.comboBoxFrameDiv.appendChild(idDivRawValueHidden);
this.rawValueHidden = idDivRawValueHidden;*/
//移除原来的下拉框
if(this.dropDiv)
{
document.body.removeChild(this.dropDiv);
}
//第一步取得Select所在的位置
//var offset=this.Offset();
var cDiv = document.createElement("div");
cDiv.id="selectChild" + this.id;
cDiv.className ="x-panel-combo-droplist-div";
cDiv.style.display="block";
//cDiv.style.width=(offset.width+2) + "px";
//cDiv.style.top=(offset.top+offset.height+2+this.topAdd) + "px";
//cDiv.style.left=(offset.left+1+this.leftAdd) + "px";
/* if(this.dropListHeight)
{
cDiv.style.height=this.dropListHeight+"px";
}*/
this.dropDiv = cDiv;
var uUl = document.createElement("ul");
uUl.className = "x-panel-combo-droplist-ul";
uUl.id="uUlchild" + this.id;
cDiv.appendChild(uUl);
//创建loadMask
//this.loadMask = new tracywindyLoadMask(cDiv,'数据加载中,请稍等...');
this.dropList = uUl;
document.body.appendChild(cDiv);
this.childCreate=false;
//模拟鼠标点击
var clickHandler = (function($me){
return function(e){
if($me.onClick){
$me.onClick($me);
}
initComboboxAllHiddenEvent();
if (document.getElementById("selectChild" + $me.id)){//判断是否创建过div
if ($me.childCreate && $me.readOnly){//非只读情况下不关闭下拉框
//判断当前的下拉是不是打开状态,如果是打开的就关闭掉。是关闭的就打开。
document.getElementById("selectChild" + $me.id).style.display="none";
$me.childCreate=false;
}else{
if(!$me.readOnly)
{
/*$me.value = '';
$me.rawValue = $me.iDiv.value;
if($me.loadMode=='ajax')
{
$me.loadAjaxData(false);
}
else if($me.loadMode=='local')
{
$me.loadData();
}
$me.setFilterRawValue($me.iDiv.value);*/
}
if($me.loadMode=='ajax')
{
if($me.lazyLoad && (0==$me.datas.length)){
$me.loadAjaxData(false);
}
}
var offset_inner=$me.Offset();
var cDiv_inner = $me.dropDiv;
cDiv_inner.style.width=(Math.max($me.dropList.offsetWidth,$me.dropList.scrollWidth)+$me.dropListWidthAdd) + "px";
//cDiv_inner.style.width=(offset_inner.width+$me.dropListWidthAdd) + "px";
cDiv_inner.style.top=(offset_inner.top+offset_inner.height+2+$me.topAdd)+ "px";
var clientHeight = (document.documentElement.clientHeight);
if((offset_inner.top+offset_inner.height+2+$me.dropListHeight)>=(clientHeight-1))
{
cDiv_inner.style.top=(offset_inner.top-$me.dropListHeight-2+$me.topAdd) + "px";
}
cDiv_inner.style.left=(offset_inner.left+2+$me.leftAdd) + "px";
if(!$me.isComplete)
{
if($me.loadMode!='local')
{
//创建loadMask
$me.loadMask=new tracywindyLoadMask($me.dropDiv,'数据加载中,请稍等...');
$me.loadMask.show();
}
}
//if(!$me.readOnly)$me.setRawValue($me.iDiv.value);
hiddenAllComboBox();
document.getElementById("selectChild" + $me.id).style.display="block";
var oldWidth = Math.max($me.dropList.offsetWidth,$me.dropList.scrollWidth);
var attrOldWidth = $me.dropList.getAttribute("oldWidth");
if(0 < parseInt(attrOldWidth)){
oldWidth = parseInt(attrOldWidth);
}
var oldHeight = Math.max($me.dropList.offsetHeight,$me.dropList.scrollHeight);
//var oldWidthAdd = 0;
var newWidth = oldWidth;
if(oldHeight > $me.dropListHeight){
newWidth+=18;
}
if((oldWidth)<$me.width){
cDiv_inner.style.width=(Math.max(newWidth,$me.width)+$me.dropListWidthAdd) + "px";
}else{
cDiv_inner.style.width=(Math.max(newWidth,$me.width)+$me.dropListWidthAdd) + "px";
}
var currentClientWidth = document.documentElement.clientWidth;
var currentLeft = (offset_inner.left+2+$me.leftAdd);
if(( currentLeft + parseInt(cDiv_inner.style.width)) > (currentClientWidth)){
cDiv_inner.style.overflowX="auto";
cDiv_inner.style.width=(currentClientWidth-currentLeft-5) + "px";
}else{
cDiv_inner.style.overflowX="hidden";
}
$me.dropList.setAttribute("oldWidth",oldWidth);
if(newWidth<$me.width)$me.dropList.style.width = $me.width+"px";
else $me.dropList.style.width = oldWidth+"px";
$me.childCreate=true;
}
}
var ev = getEvent(e);
ev.cancelBubble = true;
try
{
ev.stopDefault();
}catch(ex){};
};
})(this);
if(!this.readOnlyData)
{
this.comboBoxFrameDiv.onclick=clickHandler;
this.comboBoxFrameDiv.onmousedown=function(e){
cancelBubble(e);
};
}
else
{
this.comboBoxFrameDiv.onclick=null;
this.comboBoxFrameDiv.onmousedown=null;
}
if((this.loadMode=='ajax') && this.lazyLoad){
var valueHidden = this.valueHidden ;
valueHidden.value = this.value;
var rawValueHidden = this.rawValueHidden;
rawValueHidden.value=this.rawValue;
this.showValueDiv.value=this.rawValue;
}
else{
//将select中默认的选项显示出来
var tValue=this.rawValue;
iDiv.value=tValue;
if(this.loadMode=='ajax')
{
this.loadAjaxData(this.isAsync);
}
else if(this.loadMode=='local')
{
this.loadData();
}
}
};
tracywindyComboBox.prototype.setValue=function(value){
this.showValueDiv.value='';
this.value = value;
this.rawValue="";
this.loadData();
};
tracywindyComboBox.prototype.setFilterValue=function(value,filter){
this.grantValue = true;
this.value = value;
this.rawValue="";
this.loadData(filter);
};
tracywindyComboBox.prototype.setRawValue=function(rawValue){
this.showValueDiv.value='';
this.grantValue = true;
this.rawValue = rawValue;
this.value = "";
this.loadData();
};
tracywindyComboBox.prototype.setFilterRawValue=function(rawValue,filter){
this.rawValue=rawValue;
this.value = "";
this.loadData(filter);
};
tracywindyComboBox.prototype.getValue=function(){
return this.valueHidden.value;
};
tracywindyComboBox.prototype.getRawValue=function(){
return this.rawValueHidden.value;
};
tracywindyComboBox.prototype.loadData=function(filter){
this.lazyLoad = false;
//清空数据
// var itemHeight = 20;
var itemCount = 0;
this.dropList.innerHTML = '';
var datas = [];
var obj = {};
var isOwnerData = false;
if(this.datas){
if(this.datas.length == 1){
for(var p in this.datas[0]){
if(this.datas[0][p]){
isOwnerData = true;
break;
}
}
}
else
{
isOwnerData = true;
}
}
if(!isOwnerData){
this.datas = [];
}
if(this.datas.length>0)
{
var rowData = this.datas[0];
for(var p in rowData)
{
obj[p] = '';
}
if(!this.isCheck && this.isContainEmpty)datas.push(obj);
}
for(var ii=0;ii<this.datas.length;ii++)
{
datas.push(this.datas[ii]);
}
var isFoundData = false;
//重置返回数值
var valueHidden = this.valueHidden ;
valueHidden.value = '';
var rawValueHidden = this.rawValueHidden;
rawValueHidden.value='';
if(this.readOnly||this.grantValue)
{
this.showValueDiv.value='';
}
this.grantValue = false;
for (var i=0;i<datas.length;i++)
{
var data = datas[i];
if(filter)
{
if(!filter.test(data[this.displayField]))
{
continue;
}
}
isFoundData = true;
itemCount++;
var lLi= document.createElement("li");
//document.createElement("<li name='dropListLi_"+this.id+"'>");
lLi.className ="x-panel-combo-droplist-li";
lLi.innerHTML=data[this.displayField]||'';
lLi.realValue = data[this.valueField]||'';
lLi.rowData = data;
this.dropList.appendChild(lLi);
if(this.isCheck)
{
var checkString = "";
if(this.value)
{
var realValues = this.value.split(",");
for(var rIndex=0;rIndex<realValues.length;rIndex++)
{
var currentValue = realValues[rIndex];
if(lLi.realValue == currentValue)
{
checkString = "checked";
}
}
}
else if(this.rawValue)
{
var realRawValues = this.rawValue.split(",");
for(var rIndex=0;rIndex<realRawValues.length;rIndex++)
{
var currentRawValue = realRawValues[rIndex];
if(lLi.innerHTML == currentRawValue)
{
checkString = "checked";
}
}
}
lLi.innerHTML="<input type='checkbox' class='x-panel-combo-droplist-li-checkbox' name='dropListLiCheckbox_"+this.id+"' "+checkString+" value='"+lLi.realValue+"' rawValue='"+lLi.innerHTML+"'/>"+(data[this.displayField]||'');
}
else
{
if(this.value!='')
{
if(this.value == lLi.realValue)
{
this.showValueDiv.value=lLi.innerHTML;
valueHidden.value = lLi.realValue;
rawValueHidden.value = lLi.innerHTML;
addClass(lLi,"x-panel-combo-droplist-li-click");
}
}
else if(this.rawValue!='')
{
if(this.rawValue == lLi.innerHTML)
{
if(this.showValueDiv.value != this.rawValue)this.showValueDiv.value=lLi.innerHTML;
valueHidden.value = lLi.realValue;
rawValueHidden.value = lLi.innerHTML;
addClass(lLi,"x-panel-combo-droplist-li-click");
}
}
//为li标签添加鼠标事件
lLi.onmouseover=function(){
addClass(this,"x-panel-combo-droplist-li-alt");
};
lLi.onmouseout=function(){
removeClass(this,"x-panel-combo-droplist-li-alt");
};
var clickHandler = (function($me,data,valueHidden,rawValueHidden){
return function(e){
//同时我们把下拉的关闭掉。
document.getElementById("selectChild" + $me.id).style.display="none";
$me.childCreate=false;
$me.showValueDiv.value=this.innerHTML;
valueHidden.value = this.realValue;
rawValueHidden.value = this.innerHTML;
//modify by tracywindy begin
var relativeHiddenInput = $me.relativeHiddenInput||{} ;
relativeHiddenInput.value = valueHidden.value;
var relativeDisplayInput = $me.relativeDisplayInput||{};
relativeDisplayInput.value=rawValueHidden.value;
//modify by tracywindy end
var lis = document.getElementById('uUlchild'+$me.id).getElementsByTagName("li");
for(var i =0;i<lis.length;i++)
{
var li = lis[i];
removeClass(li,"x-panel-combo-droplist-li-click");
}
addClass(this,"x-panel-combo-droplist-li-click");
if($me.onSelect){
$me.onSelect($me,data);
}
$me.isTriggerSelected = true;
var ev = getEvent(e);
ev.cancelBubble = true;
try
{
ev.stopDefault();
}catch(ex){};
};
})(this,data,valueHidden,rawValueHidden);
lLi.onclick=clickHandler;
}
}
if(this.isCheck)
{
this.value = "";
this.rawValue="";
valueHidden.value = "";
rawValueHidden.value = "";
var realAllValue = "";
var realAllRawValue = "";
var liChecks = document.getElementsByName("dropListLiCheckbox_"+this.id);
for(var lcIndex=0;lcIndex<liChecks.length;lcIndex++)
{
var liCheck = liChecks[lcIndex];
var rowData = liCheck.getAttribute("rowData");
var checkClickFunc = (function($me,data,valueHidden,rawValueHidden){
return function(e){
valueHidden.value = "";
rawValueHidden.value = "";
$me.value ="";
$me.rawValue ="";
var realAllValue = "";
var realAllRawValue = "";
var liChecks = document.getElementsByName("dropListLiCheckbox_"+$me.id);
for(var lccIndex=0;lccIndex<liChecks.length;lccIndex++)
{
var liCheck = liChecks[lccIndex];
if(liCheck.checked)
{
realAllValue+=liCheck.value;
realAllValue+=",";
realAllRawValue+=liCheck.getAttribute("rawValue");
realAllRawValue+=",";
}
}
if(realAllValue.length>0)
{
$me.value = realAllValue.substring(0,realAllValue.length-1);
$me.rawValue = realAllRawValue.substring(0,realAllRawValue.length-1);
}
valueHidden.value = $me.value;
rawValueHidden.value = $me.rawValue;
$me.showValueDiv.value= $me.rawValue;
//modify by tracywindy begin
var relativeHiddenInput = $me.relativeHiddenInput||{} ;
relativeHiddenInput.value = valueHidden.value;
var relativeDisplayInput = $me.relativeDisplayInput||{};
relativeDisplayInput.value=rawValueHidden.value;
//modify by tracywindy end
if($me.onSelect){
$me.onSelect($me,data);
}
var ev = getEvent(e);
ev.cancelBubble = true;
try
{
ev.stopDefault();
}catch(ex){};
};
})(this,rowData,valueHidden,rawValueHidden);
if(liCheck.checked)
{
realAllValue+=liCheck.value;
realAllValue+=",";
realAllRawValue+=liCheck.getAttribute("rawValue");
realAllRawValue+=",";
}
liCheck.onclick=checkClickFunc;
}
if(realAllValue.length>0)
{
this.value = realAllValue.substring(0,realAllValue.length-1);
this.rawValue = realAllRawValue.substring(0,realAllRawValue.length-1);
}
valueHidden.value = this.value;
rawValueHidden.value = this.rawValue;
this.showValueDiv.value=this.rawValue;
}
else
{
this.value=valueHidden.value;
this.rawValue=rawValueHidden.value;
}
//modify by tracywindy begin
var relativeHiddenInput = this.relativeHiddenInput||{} ;
relativeHiddenInput.value = valueHidden.value;
var relativeDisplayInput = this.relativeDisplayInput||{};
relativeDisplayInput.value=rawValueHidden.value;
//modify by tracywindy end
if(!isFoundData){
var lLi= document.createElement("li");
//document.createElement("<li name='dropListLi_"+this.id+"'>");
lLi.className ="x-panel-combo-droplist-li";
lLi.innerHTML='无数据';
lLi.realValue = '';
lLi.rowData = {};
this.dropList.appendChild(lLi);
}
this.dropDiv.style.display="block";
this.dropListHeight = this.dropList.offsetHeight>0?this.dropList.offsetHeight:this.dropList.scrollHeight;//Math.max(this.dropList.offsetHeight,this.dropList.scrollHeight);
if(typeof(filter) =='undefined')
{
this.dropDiv.style.display="none";
}
this.dropListHeight = Math.min(this.dropListHeight,this.constDropListHeight);
this.dropDiv.style.height = this.dropListHeight+"px";
if(window.isPagePrint){
this.showValueDiv.style.width = Math.max(this.showValueDiv.offsetWidth,this.showValueDiv.scrollWidth)+"px";
}
if(typeof(filter) !='undefined'){
var $me = this;
var offset_inner=$me.Offset();
var cDiv_inner = $me.dropDiv;
var oldWidth = Math.max($me.dropList.offsetWidth,$me.dropList.scrollWidth);
var attrOldWidth = $me.dropList.getAttribute("oldWidth");
if(0 < parseInt(attrOldWidth)){
oldWidth = parseInt(attrOldWidth);
}
var oldHeight = Math.max($me.dropList.offsetHeight,$me.dropList.scrollHeight);
//var oldWidthAdd = 0;
var newWidth = oldWidth;
if(oldHeight > $me.dropListHeight){
newWidth+=18;
}
if((oldWidth)<$me.width){
cDiv_inner.style.width=(Math.max(newWidth,$me.width)+$me.dropListWidthAdd) + "px";
}else{
cDiv_inner.style.width=(Math.max(newWidth,$me.width)+$me.dropListWidthAdd) + "px";
}
$me.dropList.setAttribute("oldWidth",oldWidth);
if(newWidth<$me.width)$me.dropList.style.width = $me.width+"px";
else $me.dropList.style.width = oldWidth+"px";
cDiv_inner.style.top=(offset_inner.top+offset_inner.height+2+$me.topAdd)+ "px";
var clientHeight = (document.documentElement.clientHeight);
if((offset_inner.top+offset_inner.height+2+$me.dropListHeight)>=(clientHeight-1))
{
cDiv_inner.style.top=(offset_inner.top-$me.dropListHeight-2+$me.topAdd) + "px";
}
}
};