/**
@name Edo.controls.Lov
@class
@typeName lov
@description 页面弹出框
@extend Edo.controls.TextInput
*/
Edo.controls.Lov = function(){
Edo.controls.Lov.superclass.constructor.call(this);
this.windowConfig = {
width: 500,
height: 300,
left: 'center',
top: 'middle',
toolbar: 'no',
scrollbars: 'no',
menubar: 'no',
resizable: 'no',
location: 'no',
status: 'no'
};
this.pageConfig = {
};
/**
@name Edo.controls.Lov#beforeopen
@event
@description 打开页面前事件
*/
/**
@name Edo.controls.Lov#open
@event
@description 打开页面事件
*/
/**
@name Edo.controls.Lov#close
@event
@description 关闭页面事件
*/
/**
@name Edo.controls.Lov#submit
@event
@description 数据提交事件
@property {Object} data 提交的数据
*/
this.data = {};
};
Edo.controls.Lov.extend(Edo.controls.Trigger,{
/**
@name Edo.controls.Control#data
@property
@type Number
@description 数据对象
*/
/**
@name Edo.controls.Control#valueField
@property
@type String
@default value
@description 值字段
*/
valueField: 'value',
/**
@name Edo.controls.Control#displayField
@property
@type String
@default text
@description 文本字段
*/
displayField: 'text',
/**
@name Edo.controls.Control#popupWidth
@property
@type Number
@description 浮动下拉框宽度
*/
url: '',
/**
@name Edo.controls.Control#params
@property
@type Object
@description 页面参数对象
*/
params: null,
/**
@name Edo.controls.Control#pageName
@property
@type String
@description 页面名称
*/
pageName: '',
/**
@name Edo.controls.Control#autoMask
@property
@type Boolean
@default true
@description 页面打开时自动遮罩
*/
autoMask: true,
maskTarget: '#body',
readOnly: true,
elCls: 'e-text e-search',
initEvents: function(){
Edo.controls.Lov.superclass.initEvents.call(this);
if(!this.design){
this.on('trigger', this._onLovTrigger, this, 0);
}
},
_onLovTrigger: function(e){
this.open(this.pageConfig);
},
createPageConfigString: function(obj){
//坐标尺寸计算
var sb = [];
var sw = window.screen.width, sh = window.screen.height - 100;
var w = obj.width, h = obj.height;
for(var p in obj){
var v = obj[p];
if(p == 'left' && v == 'center'){
v = sw / 2 - w / 2;
}
if(p == 'top' && v == 'middle'){
v = sh / 2 - h / 2;
}
sb.push(p+'='+v);
}
return sb.join(',');
},
getValue: function(){
if(this.data) return this.data[this.valueField];
return null;
},
setValue: function(v){
this._setData(v);
},
_setData: function(v){
if(!Edo.isValue(v)) return;
if(v !== this.data){
this.data = v;
this.set('text', v[this.displayField]);
}
},
/**
@name Edo.controls.Lov#submit
@function
@config
@param {Object} data 数据对象
@description 提交页面数据(同时关闭弹出页面)
*/
submit: function(data){
if(typeof data != 'string'){
var o = {data: data};
data = Edo.util.Json.encode(o);
data = Edo.util.Json.decode(data).data;
}else{
data = Edo.util.Json.decode(data);
}
this.setValue(data);
var e = {
type: 'submit',
source: this,
data: data
};
this.fireEvent('submit', e);
this.data = data;
this.close();
},
/**
@name Edo.controls.Lov#open
@function
@config
@param {Object} config 页面配置对象
{
width: 500,
height: 300,
left: 'center',
top: 'middle',
toolbar: 'no',
scrollbars: 'no',
menubar: 'no',
resizable: 'no',
location: 'no',
status: 'no'
}
@description 提交页面数据(同时关闭弹出页面)
*/
open: function(config){
if(this.pager){
this.close();
}
var e = {
type: 'beforeopen',
source: this
};
if(this.fireEvent('beforeopen', e) === false) return false;
if(this.autoMask){
var obj = (this.maskTarget == '#body' || !this.maskTarget) ? document.body : this.maskTarget;
if(Edo.type(obj) == 'element'){
Edo.util.Dom.mask(obj);
}else{
obj.mask();
}
}
var config = Edo.applyIf(this.pageConfig, this.windowConfig);
var cstr = this.createPageConfigString(config);
var url = Edo.urlEncode(this.params, this.url.indexOf('?') == -1 ? this.url+'?' : this.url);
this.pager = window.open(url, this.pageName, cstr);
this.pager.focus();
var sf = this;
window.submitPagerData = function(data){
sf.submit(data);
}
setTimeout(function(){
Edo.util.Dom.on(sf.pager, 'unload',sf.onPageUnload, sf);
}, this.deferBindUnload);
this.startFocus();
e.type = 'open';
e.pager = this.pager;
this.fireEvent('open', e);
},
deferBindUnload: 800,
/**
@name Edo.controls.Lov#close
@function
@description 关闭页面
*/
close: function(){
if(this.pager){
this.pager.close();
var obj = this.maskTarget == '#body' ? document.body : this.maskTarget;
if(Edo.type(obj) == 'element'){
Edo.util.Dom.unmask(obj);
}else{
obj.unmask();
}
}
Edo.util.Dom.un(this.pager, 'unload',this.onPageUnload, this);
this.stopFocus();
this.pager = null;
this.fireEvent('close', {
type: 'close',
source: this
});
},
onWindowFocus: function(e){
try{
Edo.util.Dom.focus(this.pager);
}catch(e){
}
},
onPageUnload: function(e){
this.close();
},
startFocus: function(){
this.stopFocus();
Edo.util.Dom.on(window, 'focus', this.onWindowFocus, this);
},
stopFocus: function(){
Edo.util.Dom.un(window, 'focus', this.onWindowFocus, this);
},
destroy : function(){
this.close();
Edo.controls.Lov.superclass.destroy.call(this);
}
});
Edo.controls.Lov.regType('lov');