YAHOO.ext.BasicDialog = function(el, config){
this.el = getEl(el, true);
this.id = this.el.id;
this.el.addClass('ydlg');
this.shadowOffset = 3;
this.minHeight = 80;
this.minWidth = 200;
this.minButtonWidth = 75;
YAHOO.ext.util.Config.apply(this, config);
this.proxy = this.el.createProxy('ydlg-proxy');
this.proxy.enableDisplayMode('block');
this.proxy.setOpacity(.5);
if(config.width){
this.el.setWidth(config.width);
}
if(config.height){
this.el.setHeight(config.height);
}
this.size = this.el.getSize();
if(typeof config.x != 'undefined' && typeof config.y != 'undefined'){
this.xy = [config.x,config.y];
}else{
this.xy = this.el.getCenterXY(true);
}
var cn = this.el.dom.childNodes;
for(var i = 0, len = cn.length; i < len; i++) {
var node = cn[i];
if(node && node.nodeType == 1){
if(YAHOO.util.Dom.hasClass(node, 'ydlg-hd')){
this.header = getEl(node, true);
}else if(YAHOO.util.Dom.hasClass(node, 'ydlg-bd')){
this.body = getEl(node, true);
}else if(YAHOO.util.Dom.hasClass(node, 'ydlg-ft')){
this.footer = getEl(node, true);
}
}
}
var dh = YAHOO.ext.DomHelper;
if(!this.header){
this.header = dh.append(this.el.dom, {tag: 'div', cls:'ydlg-hd'}, true);
}
if(!this.body){
this.body = dh.append(this.el.dom, {tag: 'div', cls:'ydlg-bd'}, true);
}
var hl = dh.insertBefore(this.header.dom, {tag: 'div', cls:'ydlg-hd-left'});
var hr = dh.append(hl, {tag: 'div', cls:'ydlg-hd-right'});
hr.appendChild(this.header.dom);
this.bwrap = dh.insertBefore(this.body.dom, {tag: 'div', cls:'ydlg-dlg-body'}, true);
this.bwrap.dom.appendChild(this.body.dom);
if(this.footer) this.bwrap.dom.appendChild(this.footer.dom);
if(this.autoScroll !== false && !this.autoTabs){
this.body.setStyle('overflow', 'auto');
}
if(this.closable !== false){
this.el.addClass('ydlg-closable');
this.close = dh.append(this.el.dom, {tag: 'div', cls:'ydlg-close'}, true);
this.close.mon('click', function(){
this.hide();
}, this, true);
}
if(this.resizable !== false){
this.el.addClass('yresizable-pinned');
this.el.addClass('ydlg-resizable');
this.resizer = new YAHOO.ext.Resizable(this.el, {
minWidth: this.minWidth || 80,
minHeight:this.minHeight || 80,
disableTrackOver:true,
multiDirectional: true
});
this.resizer.proxy.setStyle('z-index', parseInt(this.el.getStyle('z-index'),10)+1);
this.resizer.on('beforeresize', this.beforeResize, this, true);
this.resizer.delayedListener('resize', this.onResize, this, true);
}
if(this.draggable !== false){
this.el.addClass('ydlg-draggable');
if (!this.proxyDrag) {
var dd = new YAHOO.util.DD(this.el.dom, 'WindowDrag');
}
else {
var dd = new YAHOO.util.DDProxy(this.el.dom, 'WindowDrag', {dragElId: this.proxy.id});
}
dd.setHandleElId(this.header.id);
dd.endDrag = this.endMove.createDelegate(this);
dd.startDrag = this.startMove.createDelegate(this);
dd.onDrag = this.adjustShadow.createDelegate(this);
this.dd = dd;
}
if(this.modal){
this.mask = dh.append(document.body, {tag: 'div', cls:'ydlg-mask'}, true);
this.mask.originalDisplay = 'block';
this.mask.enableDisplayMode();
}
if(this.shadow){
this.shadow = dh.append(document.body, {tag: 'div', cls:'ydlg-shadow'}, true);
this.shadow.setOpacity(.3);
this.shadow.setAbsolutePositioned(10000);
this.shadow.enableDisplayMode('block');
this.shadow.hide();
}
if(this.autoTabs){
var tabEls = YAHOO.util.Dom.getElementsByClassName('ydlg-tab', 'div', this.el.dom);
if(tabEls.length > 0){
this.body.addClass(this.tabPosition == 'bottom' ? 'ytabs-bottom' : 'ytabs-top');
this.tabs = new YAHOO.ext.TabPanel(this.body.dom, this.tabPosition == 'bottom');
for(var i = 0, len = tabEls.length; i < len; i++) {
var tabEl = tabEls[i];
this.tabs.addTab(YAHOO.util.Dom.generateId(tabEl), tabEl.title);
tabEl.title = '';
}
this.tabs.activate(tabEls[0].id);
}
}
this.syncBodyHeight();
this.events = {
'keydown' : new YAHOO.util.CustomEvent('keydown'),
'move' : new YAHOO.util.CustomEvent('move'),
'resize' : new YAHOO.util.CustomEvent('resize'),
'beforehide' : new YAHOO.util.CustomEvent('beforehide'),
'hide' : new YAHOO.util.CustomEvent('hide'),
'beforeshow' : new YAHOO.util.CustomEvent('beforeshow'),
'show' : new YAHOO.util.CustomEvent('show')
};
this.keyDownDelegate = YAHOO.ext.EventManager.wrap(this.onKeyDown, this, true);
YAHOO.ext.EventManager.onWindowResize(this.adjustViewport, this, true);
this.preloaded = false;
this.el.setDisplayed(false);
this.defaultButton = null;
};
YAHOO.extendX(YAHOO.ext.BasicDialog, YAHOO.ext.util.Observable, {
beforeResize : function(){
this.resizer.minHeight = Math.max(this.minHeight, this.getHeaderFooterHeight(true)+40);
},
onResize : function(){
this.refreshSize();
this.syncBodyHeight();
this.adjustShadow();
this.fireEvent('resize', this, this.size.width, this.size.height);
},
onKeyDown : function(e){
this.fireEvent('keydown', this, e);
},
addKeyListener : function(key, fn, scope){
var keyCode, shift, ctrl, alt;
if(typeof key == 'object'){
keyCode = key['key'];
shift = key['shift'];
ctrl = key['ctrl'];
alt = key['alt'];
}else{
keyCode = key;
}
var handler = function(dlg, e){
if((!shift || e.shiftKey) && (!ctrl || e.ctrlKey) && (!alt || e.altKey)){
var k = e.getKey();
if(keyCode instanceof Array){
for(var i = 0, len = keyCode.length; i < len; i++){
if(keyCode[i] == k){
fn.call(scope || window, dlg, k, e);
return;
}
}
}else{
if(k == keyCode){
fn.call(scope || window, dlg, k, e);
}
}
}
};
this.on('keydown', handler);
},
getTabs : function(){
if(!this.tabs){
this.body.addClass(this.tabPosition == 'bottom' ? 'ytabs-bottom' : 'ytabs-top');
this.tabs = new YAHOO.ext.TabPanel(this.body.dom, this.tabPosition == 'bottom');
}
return this.tabs;
},
addButton : function(config, handler, scope){
var dh = YAHOO.ext.DomHelper;
if(!this.footer){
this.footer = dh.append(this.bwrap.dom, {tag: 'div', cls:'ydlg-ft'}, true);
}
var btn;
if(typeof config == 'string'){
if(!this.buttonTemplate){
this.buttonTemplate = new YAHOO.ext.DomHelper.Template('<a href="#" class="ydlg-button-focus"><table border="0" cellpadding="0" cellspacing="0" class="ydlg-button-wrap"><tbody><tr><td class="ydlg-button-left"> </td><td class="ydlg-button-center" unselectable="on">{0}</td><td class="ydlg-button-right"> </td></tr></tbody></table></a>');
}
var btn = this.buttonTemplate.append(this.footer.dom, [config], true);
var tbl = getEl(btn.dom.firstChild, true);
if(this.minButtonWidth){
tbl.beginMeasure();
if(tbl.getWidth() < this.minButtonWidth){
tbl.setWidth(this.minButtonWidth);
}
tbl.endMeasure();
}
}else{
btn = dh.append(this.footer.dom, config, true);
}
var bo = new YAHOO.ext.BasicDialog.Button(btn, handler, scope);
this.syncBodyHeight();
if(!this.preloaded){ btn.addClass('ydlg-button-over');
btn.removeClass('ydlg-button-over');
btn.addClass('ydlg-button-click');
btn.removeClass('ydlg-button-click');
this.preloaded = true;
}
if(!this.buttons){
this.buttons = [];
}
this.buttons.push(bo);
return bo;
},
setDefaultButton : function(btn){
this.defaultButton = btn;
},
getHeaderFooterHeight : function(safe){
if(safe)this.el.beginMeasure();
var height = 0;
if(this.header){
height += this.header.getHeight();
}
if(this.footer){
var fm = this.footer.getMargins();
height += (this.footer.getHeight()+fm.top+fm.bottom);
}
if(safe)this.el.endMeasure();
height += this.bwrap.getPadding('tb')+this.bwrap.getBorderWidth('tb');
return height;
},
syncBodyHeight : function(){
this.el.beginMeasure();
var height = this.size.height - this.getHeaderFooterHeight(false);
var bm = this.body.getMargins();
this.body.setHeight(height-(bm.top+bm.bottom));
if(this.tabs){
this.tabs.syncHeight();
}
this.bwrap.setHeight(this.size.height-this.header.getHeight());
this.body.setWidth(this.el.getWidth(true)-this.bwrap.getBorderWidth('lr')-this.bwrap.getPadding('lr'));
this.el.endMeasure();
},
restoreState : function(){
var box = YAHOO.ext.state.Manager.get(this.el.id + '-state');
if(box && box.width){
this.xy = [box.x, box.y];
this.size = box;
this.el.setLocation(box.x, box.y);
this.resizer.resizeTo(box.width, box.height);
this.adjustViewport();
}else{
this.resizer.resizeTo(this.size.width, this.size.height);
this.adjustViewport();
}
},
beforeShow : function(){
YAHOO.util.Event.on(document, 'keydown', this.keyDownDelegate);
if(this.fixedcenter) {
this.el.beginMeasure();
this.xy = this.el.getCenterXY(true);
this.el.endMeasure();
}
if(this.modal){
YAHOO.util.Dom.addClass(document.body, 'masked');
this.mask.setSize(YAHOO.util.Dom.getDocumentWidth(), YAHOO.util.Dom.getDocumentHeight());
this.mask.show();
}
},
show : function(animateTarget){
if (this.fireEvent('beforeshow', this) === false)
return;
this.animateTarget = animateTarget || this.animateTarget;
if(!this.el.isVisible()){
this.beforeShow();
if(this.animateTarget){
var b = getEl(this.animateTarget, true).getBox();
this.proxy.show();
this.proxy.setSize(b.width, b.height);
this.proxy.setLocation(b.x, b.y);
this.proxy.setBounds(this.xy[0], this.xy[1], this.size.width, this.size.height, true, .35, this.showEl.createDelegate(this));
}else{
this.el.setDisplayed(true);
this.el.setXY(this.xy);
this.el.show();
var box = this.el.getBox();
if(this.shadow){
this.shadow.show();
this.shadow.setSize(box.width, box.height);
this.shadow.setLocation(box.x + this.shadowOffset, box.y + this.shadowOffset);
}
if(this.defaultButton) this.defaultButton.focus();
this.fireEvent('show', this);
}
}
},
showEl : function(){
var box = this.proxy.getBox();
this.el.setDisplayed(true);
this.el.setBox(box);
this.el.show();
this.proxy.hide();
if(this.shadow){
this.shadow.show();
this.shadow.setSize(box.width, box.height);
this.shadow.setLocation(box.x + this.shadowOffset, box.y + this.shadowOffset);
}
if(this.defaultButton) this.defaultButton.focus();
this.fireEvent('show', this);
},
adjustViewport : function(width, height){
this.viewSize = [width, height];
if(this.modal && this.mask.isVisible()){
this.mask.setSize(width, height); this.mask.setSize(YAHOO.util.Dom.getDocumentWidth(), YAHOO.util.Dom.getDocumentHeight());
}
if(this.contraintoviewport !== false){
var moved = false;
if(this.xy[0] + this.size.width > this.viewSize[0]){
this.xy[0] = Math.max(0, this.viewSize[0] - this.size.width);
moved = true;
}
if(this.xy[1] + this.size.height > this.viewSize[1]){
this.xy[1] = Math.max(0, this.viewSize[1] - this.size.height);
moved = true;
}
if(moved){
this.el.setXY(this.xy);
this.adjustShadow();
}
}
},
destroy : function(removeEl){
YAHOO.ext.EventManager.removeResizeListener(this.adjustViewport, this);
if(this.tabs){
this.tabs.destroy(removeEl);
}
if(removeEl === true){
this.el.update('');
this.el.remove();
}
},
adjustShadow : function(){
if(this.shadow && this.shadow.isVisible()){
var box = this.el.getBox();
box.x += this.shadowOffset;
box.y += this.shadowOffset;
this.shadow.setBox(box);
}
},
startMove : function(){
if(this.proxyDrag){
this.proxy.show();
}
if(this.constraintoviewport !== false){
this.dd.resetConstraints();
this.viewSize = [YAHOO.util.Dom.getViewportWidth(),YAHOO.util.Dom.getViewportHeight()];
this.dd.setXConstraint(this.xy[0], this.viewSize[0]-this.xy[0]-this.el.getWidth()-this.shadowOffset);
this.dd.setYConstraint(this.xy[1], this.viewSize[1]-this.xy[1]-this.el.getHeight()-this.shadowOffset);
}
},
endMove : function(){
if(!this.proxyDrag){
YAHOO.util.DD.prototype.endDrag.apply(this.dd, arguments);
}else{
YAHOO.util.DDProxy.prototype.endDrag.apply(this.dd, arguments);
this.proxy.setStyle('visibility', 'visible');
this.proxy.hide();
}
this.refreshSize();
this.adjustShadow();
this.fireEvent('move', this, this.xy[0], this.xy[1])
},
isVisible : function(){
return this.el.isVisible();
},
beforeHide : function(){
YAHOO.util.Event.removeListener(document, 'keydown', this.keyDownDelegate);
if(this.modal){
this.mask.hide();
YAHOO.util.Dom.removeClass(document.body, 'masked');
}
},
hide : function(callback){
if (this.fireEvent('beforehide', this) === false)
return;
this.beforeHide();
if(this.shadow){
this.shadow.hide();
}
if(this.animateTarget){
var b = getEl(this.animateTarget, true).getBox();
this.proxy.show();
this.proxy.setBounds(this.xy[0], this.xy[1], this.size.width, this.size.height);
this.el.setDisplayed(false);
this.el.hide();
this.proxy.setBounds(b.x, b.y, b.width, b.height, true, .35, this.hideEl.createDelegate(this, [callback]));
}else{
this.proxy.hide();
this.el.setDisplayed(false);
this.el.hide();
this.fireEvent('hide', this);
}
},
hideEl : function(callback){
this.proxy.hide();
this.fireEvent('hide', this);
if(typeof callback == 'function'){
callback();
}
},
refreshSize : function(){
this.size = this.el.getSize();
this.xy = this.el.getXY();
YAHOO.ext.state.Manager.set(this.el.id + '-state', this.el.getBox());
},
getEl : function(){
return this.el;
}
});
YAHOO.ext.LayoutDialog = function(el, config){
config.autoTabs = false;
YAHOO.ext.LayoutDialog.superclass.constructor.call(this, el, config);
this.body.setStyle({overflow:'hidden', position:'relative'});
this.el.setDisplayed(true);
this.layout = new YAHOO.ext.BorderLayout(this.body.dom, config);
this.layout.monitorWindowResize = false;
};
YAHOO.extendX(YAHOO.ext.LayoutDialog, YAHOO.ext.BasicDialog, {
endUpdate : function(){
this.layout.endUpdate();
this.el.setDisplayed(false);
},
beginUpdate : function(){
this.layout.beginUpdate();
this.el.setDisplayed(true);
},
getLayout : function(){
return this.layout;
},
syncBodyHeight : function(){
YAHOO.ext.LayoutDialog.superclass.syncBodyHeight.call(this);
if(this.layout)this.layout.layout();
}
});
YAHOO.ext.BasicDialog.Button = function(el, handler, scope){
this.el = el;
this.el.addClass('ydlg-button');
this.el.mon('click', this.onClick, this, true);
this.el.on('mouseover', this.onMouseOver, this, true);
this.el.on('mouseout', this.onMouseOut, this, true);
this.el.on('mousedown', this.onMouseDown, this, true);
this.el.on('mouseup', this.onMouseUp, this, true);
this.handler = handler;
this.scope = scope;
this.disabled = false;
};
YAHOO.ext.BasicDialog.Button.prototype = {
getEl : function(){
return this.el;
},
setHandler : function(handler, scope){
this.handler = handler;
this.scope = scope;
},
setText : function(text){
this.el.dom.firstChild.firstChild.firstChild.childNodes[1].innerHTML = text;
},
show: function(){
this.el.setStyle('display', '');
},
hide: function(){
this.el.setStyle('display', 'none');
},
focus : function(){
this.el.focus();
},
disable : function(){
this.el.addClass('ydlg-button-disabled');
this.disabled = true;
},
enable : function(){
this.el.removeClass('ydlg-button-disabled');
this.disabled = false;
},
onClick : function(e){
e.preventDefault();
if(!this.disabled){
this.handler.call(this.scope || window);
}
},
onMouseOver : function(){
if(!this.disabled){
this.el.addClass('ydlg-button-over');
}
},
onMouseOut : function(){
this.el.removeClass('ydlg-button-over');
},
onMouseDown : function(){
if(!this.disabled){
this.el.addClass('ydlg-button-click');
}
},
onMouseUp : function(){
this.el.removeClass('ydlg-button-click');
}
};