var Popup = new baidu.editor.ui.Popup();
var uiUtils = baidu.editor.ui.uiUtils();
var popEl = this.getDom();
uiUtils.setViewportOffset(popEl, {
left: 20,
top: top
});
(function () {
var utils = baidu.editor.utils,
uiUtils = baidu.editor.ui.uiUtils,
domUtils = baidu.editor.dom.domUtils,
UIBase = baidu.editor.ui.UIBase,
Popup = baidu.editor.ui.Popup = function (options){
this.initOptions(options);
this.initPopup();
};
var allPopups = [];
function closeAllPopup( evt,el ){
for ( var i = 0; i < allPopups.length; i++ ) {
var pop = allPopups[i];
if (!pop.isHidden()) {
if (pop.queryAutoHide(el) !== false) {
if(evt&&/scroll/ig.test(evt.type)&&pop.className=="edui-wordpastepop") return;
pop.hide();
}
}
}
if(allPopups.length)
pop.editor.fireEvent("afterhidepop");
}
Popup.postHide = closeAllPopup;
var ANCHOR_CLASSES = ['edui-anchor-topleft','edui-anchor-topright',
'edui-anchor-bottomleft','edui-anchor-bottomright'];
Popup.prototype = {
SHADOW_RADIUS: 5,
content: null,
_hidden: false,
autoRender: true,
canSideLeft: true,
canSideUp: true,
initPopup: function (){
this.initUIBase();
allPopups.push( this );
},
getHtmlTpl: function (){
return '
';
},
getContentHtmlTpl: function (){
if(this.content){
if (typeof this.content == 'string') {
return this.content;
}
return this.content.renderHtml();
}else{
return ''
}
},
_UIBase_postRender: UIBase.prototype.postRender,
postRender: function (){
if (this.content instanceof UIBase) {
this.content.postRender();
}
//捕获鼠标滚轮
if( this.captureWheel && !this.captured ) {
this.captured = true;
var winHeight = ( document.documentElement.clientHeight || document.body.clientHeight ) - 80,
_height = this.getDom().offsetHeight,
_top = uiUtils.getClientRect( this.combox.getDom() ).top,
content = this.getDom('content'),
ifr = this.getDom('body').getElementsByTagName('iframe'),
me = this;
ifr.length && ( ifr = ifr[0] );
while( _top + _height > winHeight ) {
_height -= 30;
}
content.style.height = _height + 'px';
//同步更改iframe高度
ifr && ( ifr.style.height = _height + 'px' );
//阻止在combox上的鼠标滚轮事件, 防止用户的正常操作被误解
if( window.XMLHttpRequest ) {
domUtils.on( content, ( 'onmousewheel' in document.body ) ? 'mousewheel' :'DOMMouseScroll' , function(e){
if(e.preventDefault) {
e.preventDefault();
} else {
e.returnValue = false;
}
if( e.wheelDelta ) {
content.scrollTop -= ( e.wheelDelta / 120 )*60;
} else {
content.scrollTop -= ( e.detail / -3 )*60;
}
});
} else {
//ie6
domUtils.on( this.getDom(), 'mousewheel' , function(e){
e.returnValue = false;
me.getDom('content').scrollTop -= ( e.wheelDelta / 120 )*60;
});
}
}
this.fireEvent('postRenderAfter');
this.hide(true);
this._UIBase_postRender();
},
_doAutoRender: function (){
if (!this.getDom() && this.autoRender) {
this.render();
}
},
mesureSize: function (){
var box = this.getDom('content');
return uiUtils.getClientRect(box);
},
fitSize: function (){
if( this.captureWheel && this.sized ) {
return this.__size;
}
this.sized = true;
var popBodyEl = this.getDom('body');
popBodyEl.style.width = '';
popBodyEl.style.height = '';
var size = this.mesureSize();
if( this.captureWheel ) {
popBodyEl.style.width = -(-20 -size.width) + 'px';
var height = parseInt( this.getDom('content').style.height, 10 );
!window.isNaN( height ) && ( size.height = height );
} else {
popBodyEl.style.width = size.width + 'px';
}
popBodyEl.style.height = size.height + 'px';
this.__size = size;
this.captureWheel && (this.getDom('content').style.overflow = 'auto');
return size;
},
showAnchor: function ( element, hoz ){
this.showAnchorRect( uiUtils.getClientRect( element ), hoz );
},
showAnchorRect: function ( rect, hoz, adj ){
this._doAutoRender();
var vpRect = uiUtils.getViewportRect();
this.getDom().style.visibility = 'hidden';
this._show();
var popSize = this.fitSize();
var sideLeft, sideUp, left, top;
if (hoz) {
sideLeft = this.canSideLeft && (rect.right + popSize.width > vpRect.right && rect.left > popSize.width);
sideUp = this.canSideUp && (rect.top + popSize.height > vpRect.bottom && rect.bottom > popSize.height);
left = (sideLeft ? rect.left - popSize.width : rect.right);
top = (sideUp ? rect.bottom - popSize.height : rect.top);
} else {
sideLeft = this.canSideLeft && (rect.right + popSize.width > vpRect.right && rect.left > popSize.width);
sideUp = this.canSideUp && (rect.top + popSize.height > vpRect.bottom && rect.bottom > popSize.height);
left = (sideLeft ? rect.right - popSize.width : rect.left);
top = (sideUp ? rect.top - popSize.height : rect.bottom);
}
var popEl = this.getDom();
uiUtils.setViewportOffset(popEl, {
left: 20,
top: top
});
domUtils.removeClasses(popEl, ANCHOR_CLASSES);
popEl.className += ' ' + ANCHOR_CLASSES[(sideUp ? 1 : 0) * 2 + (sideLeft ? 1 : 0)];
if(this.editor){
popEl.style.zIndex = this.editor.container.style.zIndex * 1 + 10;
baidu.editor.ui.uiUtils.getFixedLayer().style.zIndex = popEl.style.zIndex - 1;
}
this.getDom().style.visibility = 'uset';
},
showAt: function (offset) {
var left = offset.left;
var top = offset.top;
var rect = {
left: left,
top: top,
right: left,
bottom: top,
height: 0,
width: 0
};
this.showAnchorRect(rect, false, true);
},
_show: function (){
if (this._hidden) {
var box = this.getDom();
box.style.display = '';
this._hidden = false;
// if (box.setActive) {
// box.setActive();
// }
this.fireEvent('show');
}
},
isHidden: function (){
return this._hidden;
},
show: function (){
this._doAutoRender();
this._show();
},
hide: function (notNofity){
if (!this._hidden && this.getDom()) {
this.getDom().style.display = 'none';
this._hidden = true;
if (!notNofity) {
this.fireEvent('hide');
}
}
},
queryAutoHide: function (el){
return !el || !uiUtils.contains(this.getDom(), el);
}
};
utils.inherits(Popup, UIBase);
domUtils.on( document, 'mousedown', function ( evt ) {
var el = evt.target || evt.srcElement;
closeAllPopup( evt,el );
} );
domUtils.on( window, 'scroll', function (evt,el) {
closeAllPopup( evt,el );
} );
})();