/** @name Edo.managers.PopupManager @class @single @description 弹出定位管理器 @example */ Edo.managers.PopupManager = { zindex: 9100, popups: {}, /** @name Edo.managers.PopupManager#createPopup @function @description 弹出显示组件 @param {Object} config 弹出显示的配置对象
        
{
    target: 需要弹出的组件对象
    x:  坐标
    y:
    modal:  是否遮罩背景
}                    
*/ createPopup: function(cfg){ var cmp = cfg.target; if(!cmp) return false; var bd = Edo.getBody(); Edo.applyIf(cfg, { x: 'center', y: 'middle', //shadow: true, modal: false, modalCt: bd, onout: Edo.emptyFn, onin: Edo.emptyFn, onmousedown: Edo.emptyFn }); var x = cfg.x, y = cfg.y, modalCt = cfg.modalCt; if(Edo.isValue(cfg.width)) cmp._setWidth(cfg.width); if(Edo.isValue(cfg.height)) cmp._setHeight(cfg.height); var zIndex = this.zindex++; cmp._setStyle('z-index:'+zIndex+';position:absolute;'); cfg.zIndex = zIndex; var boxCt = Edo.util.Dom.getBox(modalCt); var sizeCt = Edo.util.Dom.getViewSize(document); boxCt.width = sizeCt.width; boxCt.height = sizeCt.height; if(!cmp.layouted){ cmp.doLayout(); } var boxCmp = cmp._getBox(); if((!x && x !== 0) || x == 'center'){ x = (boxCt.x + boxCt.width/2) - boxCmp.width/2 } if((!y && y !== 0) || y == 'middle'){ y = (boxCt.y + boxCt.height/2) - boxCmp.height/2 } //调节下坐标定位(如果是边缘等) cmp.set('visible', true); cmp._setXY([x, y]); cmp.left = parseInt(cmp.el.style.left); cmp.top = parseInt(cmp.el.style.top); if(isOpera) cmp._setXY(x, y); if(cfg.modal){ Edo.util.Dom.mask(modalCt); if(modalCt._mask) modalCt._mask.style.zIndex = zIndex-1; }else{ this.unmask(cmp, modalCt); } //cmp._setStyle('z-index:'+(parseInt(modalCt._mask.style.zIndex)+1)+';'); this.popups[cmp.id] = cfg; if(cfg.focus){ cmp.focus.defer(30, cmp); } setTimeout(function(){ Edo.util.Dom.repaint(cmp.el); }, 10); //对tab键的特殊控制处理 }, /** @name Edo.managers.PopupManager#removePopup @function @description 隐藏弹出显示组件 @param {UIComponent} 组件对象 */ removePopup: function(cmp){ var o = this.popups[cmp.id]; if(!o) return; cmp._setX(-3000); cmp.blur(); //cmp.set('visible', false); //cmp.set.defer(1, cmp, ['visible', false]); if(o.modal) { //遍历popups,判断是否有一样的modalCt,如果有,则不unmask //unmask.defer(100, null, [cmp, cmp.modalCt]); this.unmask(cmp, o.modalCt); } delete cmp.modalCt; delete this.popups[cmp.id]; }, unmask: function(cmp, mct){ var repeat = false; var zindex = -1; for(var id in this.popups){ if(id == cmp.id) continue; var pop = this.popups[id]; if(pop.modalCt === mct && pop.modal){ repeat = true; zindex = pop.zIndex; break; } } if(repeat){ if(mct._mask) mct._mask.style.zIndex = zindex-1; } else Edo.util.Dom.unmask(mct); } }; Edo.util.Dom.on(document, 'mousedown', function(e){ var popups = Edo.managers.PopupManager.popups; for(var id in popups){ var popup = popups[id]; popup.onmousedown(e); if(!popup.target.within(e)){ popup.onout(e); }else{ popup.onin(e); } } });