1793 lines
46 KiB
JavaScript
1793 lines
46 KiB
JavaScript
/*!
|
||
* artDialog 4.1.7
|
||
* Date: 2013-03-03 08:04
|
||
* http://code.google.com/p/artdialog/
|
||
* (c) 2009-2012 TangBin, http://www.planeArt.cn
|
||
*
|
||
* This is licensed under the GNU LGPL, version 2.1 or later.
|
||
* For details, see: http://creativecommons.org/licenses/LGPL/2.1/
|
||
*/
|
||
|
||
|
||
|
||
// change by warlee
|
||
//------------------------------------------------
|
||
// 对话框模块
|
||
//------------------------------------------------
|
||
var dialogList = {//加入人物列表
|
||
add:function(id,title){
|
||
try{
|
||
TaskTap.add(id,title);
|
||
} catch(e) {};
|
||
},
|
||
focus:function(id){
|
||
try{
|
||
TaskTap.focus(id);
|
||
} catch(e) {};
|
||
},
|
||
close:function(id){
|
||
try{
|
||
TaskTap.close(id);
|
||
} catch(e) {};
|
||
}
|
||
};
|
||
//rightMenu.hidden();
|
||
|
||
|
||
;(function ($, window, undefined) {
|
||
$.noop = $.noop || function () {}; // jQuery 1.3.2
|
||
var _box, _thisScript,_path,
|
||
_count = 0,
|
||
_$window = $(window),
|
||
_$document = $(document),
|
||
_$html = $('html'),
|
||
_elem = document.documentElement,
|
||
_isMobile = 'createTouch' in document && !('onmousemove' in _elem)
|
||
|| /(iPhone|iPad|iPod)/i.test(navigator.userAgent),
|
||
_expando = 'artDialog' + + new Date,
|
||
_titleBarHeight = 0;
|
||
|
||
var artDialog = function (config, ok, cancel) {
|
||
config = config || {};
|
||
if (typeof config === 'string' || config.nodeType === 1) {
|
||
config = {content: config, fixed: !_isMobile};
|
||
};
|
||
|
||
var api,
|
||
defaults = artDialog.defaults,
|
||
elem = config.follow = this.nodeType === 1 && this || config.follow;
|
||
|
||
// 合并默认配置
|
||
for (var i in defaults) {
|
||
if (config[i] === undefined) config[i] = defaults[i];
|
||
};
|
||
|
||
// 兼容v4.1.0之前的参数,未来版本将删除此
|
||
$.each({ok:"yesFn",cancel:"noFn",close:"closeFn",init:"initFn",okVal:"yesText",cancelVal:"noText"},
|
||
function(i,o){config[i]=config[i]!==undefined?config[i]:config[o]});
|
||
|
||
// 返回跟随模式或重复定义的ID
|
||
if (typeof elem === 'string') elem = $(elem)[0];
|
||
config.id = elem && elem[_expando + 'follow'] || config.id || _expando + _count;
|
||
api = artDialog.list[config.id];
|
||
|
||
|
||
if (elem && api) return api.follow(elem).zIndex().focus();
|
||
if (api) return api.zIndex().focus().display(true);
|
||
|
||
// 目前主流移动设备对fixed支持不好
|
||
if (_isMobile) config.fixed = false;
|
||
|
||
// 按钮队列
|
||
if (!$.isArray(config.button)) {
|
||
config.button = config.button ? [config.button] : [];
|
||
};
|
||
if (ok !== undefined) config.ok = ok;
|
||
if (cancel !== undefined) config.cancel = cancel;
|
||
config.ok && config.button.push({
|
||
name: config.okVal,
|
||
callback: config.ok,
|
||
focus: true
|
||
});
|
||
config.cancel && config.button.push({
|
||
name: config.cancelVal,
|
||
callback: config.cancel
|
||
});
|
||
|
||
// zIndex全局配置
|
||
artDialog.defaults.zIndex = config.zIndex;
|
||
_count ++;
|
||
|
||
//添加到任务栏
|
||
if (config.title !== false){
|
||
config.title = '<img src="'+config.ico+'" />'+config.title;
|
||
if (_count>=1) dialogList.add(config.id,config.title);
|
||
}
|
||
|
||
return artDialog.list[config.id] = _box ?
|
||
_box._init(config) : new artDialog.fn._init(config);
|
||
};
|
||
|
||
artDialog.fn = artDialog.prototype = {
|
||
version: '4.1.7',
|
||
closed: true,
|
||
_init: function (config) {
|
||
var that = this, DOM,
|
||
icon = config.icon,
|
||
iconBg = icon && {'background-image': 'url(\'' + config.path + '/icons/' + icon + '.png\')','background-repeat':'no-repeat','background-position':'center'};
|
||
that.closed = false;
|
||
that.config = config;
|
||
that.DOM = DOM = that.DOM || that._getDOM();
|
||
|
||
//是否可以调节大小 对应样式处理
|
||
//可以调节窗口大小——那么对应可以最大最小化
|
||
if (config.resize && config.title != false) {
|
||
DOM.wrap.addClass('dialog-can-resize');
|
||
}
|
||
//是否可以调节大小 对应样式处理
|
||
if (config.simple && config.title != false) {
|
||
DOM.wrap.addClass('dialog-simple');
|
||
DOM.wrap.die('mouseenter').live('mouseenter',function(){
|
||
$(this).find('.aui_outer').addClass('dialog_mouse_in');
|
||
}).live('mouseleave',function(){
|
||
$(this).find('.aui_outer').removeClass('dialog_mouse_in');
|
||
});
|
||
}
|
||
DOM.wrap.find('.dialog_menu').attr('id',config.id);
|
||
DOM.wrap.addClass(config.id);
|
||
DOM.close[config.cancel === false ? 'hide' : 'show']();
|
||
DOM.icon[0].style.display = icon ? '' : 'none';
|
||
DOM.iconBg.css(iconBg || {background: 'none'});
|
||
DOM.title.css('cursor', config.drag ? 'move' : 'auto');
|
||
DOM.content.css('padding', config.padding);
|
||
|
||
that[config.show ? 'show' : 'hide'](true)
|
||
that.button(config.button)
|
||
.title(config.title)
|
||
.content(config.content, true)
|
||
.size(config.width, config.height)
|
||
.time(config.time);
|
||
|
||
config.follow
|
||
? that.follow(config.follow)
|
||
: that.position(config.left, config.top);
|
||
|
||
that.zIndex().focus();
|
||
config.lock && that.lock();
|
||
|
||
that._addEvent();
|
||
_box = null;
|
||
|
||
config.init && config.init.call(that, window);
|
||
_titleBarHeight = DOM.title.css('height');
|
||
_titleBarHeight = _titleBarHeight.replace('px','');
|
||
|
||
// DOM.wrap
|
||
// .css({opacity:0.6,top:'-='+DOM.wrap.height()*0.02})
|
||
// .animate(
|
||
// {opacity:1,top:'+='+DOM.wrap.height()*0.02},
|
||
// {easing: 'swing',duration:200});
|
||
return that;
|
||
},
|
||
|
||
/**
|
||
* 设置内容
|
||
* @param {String, HTMLElement} 内容 (可选)
|
||
* @return {this, HTMLElement} 如果无参数则返回内容容器DOM对象
|
||
*/
|
||
content: function (msg) {
|
||
var prev, next, parent, display,
|
||
that = this,
|
||
DOM = that.DOM,
|
||
wrap = DOM.wrap[0],
|
||
width = wrap.offsetWidth,
|
||
height = wrap.offsetHeight,
|
||
left = parseInt(wrap.style.left),
|
||
top = parseInt(wrap.style.top),
|
||
cssWidth = wrap.style.width,
|
||
$content = DOM.content,
|
||
content = $content[0];
|
||
|
||
that._elemBack && that._elemBack();
|
||
wrap.style.width = 'auto';
|
||
|
||
if (msg === undefined) return content;
|
||
if (typeof msg === 'string') {
|
||
$content.html(msg)
|
||
$frame = $content.find('iframe');
|
||
if($frame.length>0){
|
||
$content.append('<div class="aui_loading"><span>loading..</span></div>');
|
||
$frame.css('display','none');
|
||
$frame.load(function(){
|
||
$content.find('.aui_loading').fadeOut(600);
|
||
});
|
||
$frame.fadeIn(300);
|
||
}
|
||
} else if (msg && msg.nodeType === 1) {
|
||
// 让传入的元素在对话框关闭后可以返回到原来的地方
|
||
display = msg.style.display;
|
||
prev = msg.previousSibling;
|
||
next = msg.nextSibling;
|
||
parent = msg.parentNode;
|
||
that._elemBack = function () {
|
||
if (prev && prev.parentNode) {
|
||
prev.parentNode.insertBefore(msg, prev.nextSibling);
|
||
} else if (next && next.parentNode) {
|
||
next.parentNode.insertBefore(msg, next);
|
||
} else if (parent) {
|
||
parent.appendChild(msg);
|
||
};
|
||
msg.style.display = display;
|
||
that._elemBack = null;
|
||
};
|
||
|
||
$content.html('');
|
||
content.appendChild(msg);
|
||
msg.style.display = 'block';
|
||
};
|
||
|
||
// 新增内容后调整位置
|
||
if (!arguments[1]) {
|
||
if (that.config.follow) {
|
||
that.follow(that.config.follow);
|
||
} else {
|
||
width = wrap.offsetWidth - width;
|
||
height = wrap.offsetHeight - height;
|
||
left = left - width / 2;
|
||
top = top - height / 2;
|
||
wrap.style.left = Math.max(left, 0) + 'px';
|
||
wrap.style.top = Math.max(top, 0) + 'px';
|
||
};
|
||
if (cssWidth && cssWidth !== 'auto') {
|
||
wrap.style.width = wrap.offsetWidth + 'px';
|
||
};
|
||
that._autoPositionType();
|
||
};
|
||
|
||
that._runScript(content);
|
||
return that;
|
||
},
|
||
|
||
/**
|
||
* 设置标题
|
||
* @param {String, Boolean} 标题内容. 为false则隐藏标题栏
|
||
* @return {this, HTMLElement} 如果无参数则返回内容器DOM对象
|
||
*/
|
||
title: function (text) {
|
||
var DOM = this.DOM,
|
||
wrap = DOM.wrap,
|
||
title = DOM.title,
|
||
className = 'aui_state_noTitle';
|
||
|
||
if (text === undefined) return title[0];
|
||
if (text === false) {
|
||
title.hide().html('');
|
||
wrap.addClass(className);
|
||
} else {
|
||
title.show().html(text || '');
|
||
wrap.removeClass(className);
|
||
};
|
||
|
||
return this;
|
||
},
|
||
|
||
/**
|
||
* 位置(相对于可视区域)
|
||
* @param {Number, String}
|
||
* @param {Number, String}
|
||
*/
|
||
position: function (left, top) {
|
||
var that = this,
|
||
config = that.config,
|
||
wrap = that.DOM.wrap[0],
|
||
isFixed = config.fixed,
|
||
docLeft = _$document.scrollLeft(),
|
||
docTop = _$document.scrollTop(),
|
||
dl = isFixed ? 0 : docLeft,
|
||
dt = isFixed ? 0 : docTop,
|
||
ww = _$window.width(),
|
||
wh = _$window.height(),
|
||
ow = wrap.offsetWidth,
|
||
oh = wrap.offsetHeight,
|
||
style = wrap.style;
|
||
|
||
if (left || left === 0) {
|
||
that._left = left.toString().indexOf('%') !== -1 ? left : null;
|
||
left = that._toNumber(left, ww - ow);
|
||
|
||
if (typeof left === 'number') {
|
||
left += docLeft;
|
||
style.left = Math.max(left, dl) + 'px';
|
||
} else if (typeof left === 'string') {
|
||
style.left = left;
|
||
};
|
||
};
|
||
|
||
if (top || top === 0) {
|
||
that._top = top.toString().indexOf('%') !== -1 ? top : null;
|
||
top = that._toNumber(top, wh - oh);
|
||
|
||
if (typeof top === 'number') {
|
||
top += docTop;
|
||
style.top = Math.max(top, dt) + 'px';
|
||
} else if (typeof top === 'string') {
|
||
style.top = top;
|
||
};
|
||
};
|
||
|
||
if (left !== undefined && top !== undefined) {
|
||
that._follow = null;
|
||
that._autoPositionType();
|
||
};
|
||
|
||
return that;
|
||
},
|
||
|
||
/**
|
||
* 尺寸
|
||
* @param {Number, String} 宽度
|
||
* @param {Number, String} 高度
|
||
*/
|
||
size: function (width, height) {
|
||
var maxWidth, maxHeight, scaleWidth, scaleHeight,
|
||
that = this,
|
||
config = that.config,
|
||
DOM = that.DOM,
|
||
wrap = DOM.wrap,
|
||
main = DOM.main,
|
||
wrapStyle = wrap[0].style,
|
||
style = main[0].style;
|
||
|
||
if (width) {
|
||
that._width = width.toString().indexOf('%') !== -1 ? width : null;
|
||
maxWidth = _$window.width() - wrap[0].offsetWidth + main[0].offsetWidth;
|
||
scaleWidth = that._toNumber(width, maxWidth);
|
||
width = scaleWidth;
|
||
|
||
if (typeof width === 'number') {
|
||
wrapStyle.width = 'auto';
|
||
style.width = Math.max(that.config.minWidth, width) + 'px';
|
||
wrapStyle.width = wrap[0].offsetWidth + 'px'; // 防止未定义宽度的表格遇到浏览器右边边界伸缩
|
||
} else if (typeof width === 'string') {
|
||
style.width = width;
|
||
width === 'auto' && wrap.css('width', 'auto');
|
||
};
|
||
};
|
||
|
||
if (height) {
|
||
that._height = height.toString().indexOf('%') !== -1 ? height : null;
|
||
maxHeight = _$window.height() - wrap[0].offsetHeight + main[0].offsetHeight;
|
||
scaleHeight = that._toNumber(height, maxHeight);
|
||
height = scaleHeight;
|
||
|
||
if (typeof height === 'number') {
|
||
style.height = Math.max(that.config.minHeight, height) + 'px';
|
||
} else if (typeof height === 'string') {
|
||
style.height = height;
|
||
};
|
||
};
|
||
return that;
|
||
},
|
||
|
||
/**
|
||
* 跟随元素
|
||
* @param {HTMLElement, String}
|
||
*/
|
||
follow: function (elem) {
|
||
var $elem, that = this, config = that.config;
|
||
|
||
if (typeof elem === 'string' || elem && elem.nodeType === 1) {
|
||
$elem = $(elem);
|
||
elem = $elem[0];
|
||
};
|
||
|
||
// 隐藏元素不可用
|
||
if (!elem || !elem.offsetWidth && !elem.offsetHeight) {
|
||
return that.position(that._left, that._top);
|
||
};
|
||
|
||
var expando = _expando + 'follow',
|
||
winWidth = _$window.width(),
|
||
winHeight = _$window.height(),
|
||
docLeft = _$document.scrollLeft(),
|
||
docTop = _$document.scrollTop(),
|
||
offset = $elem.offset(),
|
||
width = elem.offsetWidth,
|
||
height = elem.offsetHeight,
|
||
isFixed = config.fixed,
|
||
left = isFixed ? offset.left - docLeft : offset.left,
|
||
top = isFixed ? offset.top - docTop : offset.top,
|
||
wrap = that.DOM.wrap[0],
|
||
style = wrap.style,
|
||
wrapWidth = wrap.offsetWidth,
|
||
wrapHeight = wrap.offsetHeight,
|
||
setLeft = left - (wrapWidth - width) / 2,
|
||
setTop = top + height,
|
||
dl = isFixed ? 0 : docLeft,
|
||
dt = isFixed ? 0 : docTop;
|
||
|
||
setLeft = setLeft < dl ? left :
|
||
(setLeft + wrapWidth > winWidth) && (left - wrapWidth > dl)
|
||
? left - wrapWidth + width
|
||
: setLeft;
|
||
|
||
setTop = (setTop + wrapHeight > winHeight + dt)
|
||
&& (top - wrapHeight > dt)
|
||
? top - wrapHeight
|
||
: setTop;
|
||
|
||
style.left = setLeft + 'px';
|
||
style.top = setTop + 'px';
|
||
|
||
that._follow && that._follow.removeAttribute(expando);
|
||
that._follow = elem;
|
||
elem[expando] = config.id;
|
||
that._autoPositionType();
|
||
return that;
|
||
},
|
||
|
||
/**
|
||
* 自定义按钮
|
||
* @example
|
||
button({
|
||
name: 'login',
|
||
callback: function () {},
|
||
disabled: false,
|
||
focus: true
|
||
}, .., ..)
|
||
*/
|
||
button: function () {
|
||
var that = this,
|
||
ags = arguments,
|
||
DOM = that.DOM,
|
||
buttons = DOM.buttons,
|
||
elem = buttons[0],
|
||
strongButton = 'aui_state_highlight',
|
||
listeners = that._listeners = that._listeners || {},
|
||
list = $.isArray(ags[0]) ? ags[0] : [].slice.call(ags);
|
||
|
||
if (ags[0] === undefined) return elem;
|
||
$.each(list, function (i, val) {
|
||
var name = val.name,
|
||
isNewButton = !listeners[name],
|
||
button = !isNewButton ?
|
||
listeners[name].elem :
|
||
document.createElement('button');
|
||
|
||
if (!listeners[name]) listeners[name] = {};
|
||
if (val.callback) listeners[name].callback = val.callback;
|
||
if (val.className) button.className = val.className;
|
||
if (val.focus) {
|
||
that._focus && that._focus.removeClass(strongButton);
|
||
that._focus = $(button).addClass(strongButton);
|
||
that.focus();
|
||
};
|
||
|
||
// Internet Explorer 的默认类型是 "button",
|
||
// 而其他浏览器中(包括 W3C 规范)的默认值是 "submit"
|
||
// @see http://www.w3school.com.cn/tags/att_button_type.asp
|
||
button.setAttribute('type', 'button');
|
||
|
||
button[_expando + 'callback'] = name;
|
||
button.disabled = !!val.disabled;
|
||
|
||
if (isNewButton) {
|
||
button.innerHTML = name;
|
||
listeners[name].elem = button;
|
||
elem.appendChild(button);
|
||
};
|
||
});
|
||
|
||
buttons[0].style.display = list.length ? '' : 'none';
|
||
return that;
|
||
},
|
||
|
||
//控制隐藏和显示
|
||
display:function(type){
|
||
if(type == undefined) type = true;//默认显示
|
||
if (type){//显示
|
||
if (this.DOM.wrap.css('visibility') != 'hidden') return;
|
||
this.DOM.wrap.css({visibility:'visible',left:'-=10000'});
|
||
this.zIndex();
|
||
}else{//隐藏 left+10000;
|
||
if (this.DOM.wrap.css('visibility') == 'hidden') return;
|
||
this.DOM.wrap.css({visibility:'hidden',left:'+=10000'});
|
||
this.resetIndex();
|
||
}
|
||
return this;
|
||
},
|
||
//重置焦点对话框
|
||
resetIndex:function(){
|
||
// 定位当前焦点frame
|
||
var dialog_index = 0;
|
||
var dialog_this = '';
|
||
for (var i in artDialog.list) {
|
||
if (artDialog.list[i]['config'] == undefined) continue;
|
||
if (artDialog.list[i].DOM.wrap.css('visibility') == 'hidden') continue;
|
||
|
||
var this_index =artDialog.list[i]['config']['zIndex'];
|
||
if (dialog_index < this_index){
|
||
dialog_index = this_index;
|
||
dialog_this = artDialog.list[i];
|
||
}
|
||
}
|
||
if (dialog_this !='') {
|
||
dialog_this.zIndex();
|
||
}
|
||
},
|
||
|
||
refresh:function(){
|
||
var frame = this.DOM.wrap.find('iframe');
|
||
frame.attr('src',frame.attr('src'));
|
||
return this;
|
||
},
|
||
|
||
/** 显示对话框 */
|
||
show: function () {
|
||
this.DOM.wrap.show();
|
||
!arguments[0] && this._lockMaskWrap && this._lockMaskWrap.show();
|
||
return this;
|
||
},
|
||
|
||
/** 隐藏对话框 */
|
||
hide: function () {
|
||
this.DOM.wrap.hide();
|
||
!arguments[0] && this._lockMaskWrap && this._lockMaskWrap.hide();
|
||
return this;
|
||
},
|
||
|
||
/** 关闭对话框 */
|
||
close: function () {
|
||
if (this.closed) return this;
|
||
var that = this,
|
||
DOM = that.DOM,
|
||
wrap = DOM.wrap,
|
||
list = artDialog.list,
|
||
fn = that.config.close,
|
||
follow = that.config.follow;
|
||
|
||
that.time();
|
||
if (typeof fn === 'function' && fn.call(that, window) === false) {
|
||
return that;
|
||
};
|
||
that.unlock();
|
||
|
||
wrap.animate({opacity:0,top:'-='+wrap.height() * 0.03},
|
||
{easing:'swing',duration:250,complete:function(){
|
||
// 置空内容
|
||
that._elemBack && that._elemBack();
|
||
wrap[0].className = wrap[0].style.cssText = '';
|
||
DOM.title.html('');
|
||
DOM.content.html('');
|
||
DOM.buttons.html('');
|
||
|
||
if (artDialog.focus === that) artDialog.focus = null;
|
||
if (follow) follow.removeAttribute(_expando + 'follow');
|
||
|
||
//if (that.config.resize)
|
||
if (that.config.title !== false){
|
||
dialogList.close(that.config.id);
|
||
}
|
||
|
||
delete list[that.config.id];
|
||
that._removeEvent();
|
||
that.hide(true)._setAbsolute();
|
||
|
||
// 清空除this.DOM之外临时对象,恢复到初始状态,以便使用单例模式
|
||
for (var i in that) {
|
||
if (that.hasOwnProperty(i) && i !== 'DOM') delete that[i];
|
||
};
|
||
// 移除HTMLElement或重用
|
||
_box ? wrap.remove() : _box = that;
|
||
that.resetIndex();
|
||
return that;
|
||
}});
|
||
},
|
||
|
||
/**
|
||
* 定时关闭
|
||
* @param {Number} 单位为秒, 无参数则停止计时器
|
||
*/
|
||
time: function (second) {
|
||
var that = this,
|
||
cancel = that.config.cancelVal,
|
||
timer = that._timer;
|
||
|
||
timer && clearTimeout(timer);
|
||
|
||
if (second) {
|
||
that._timer = setTimeout(function(){
|
||
that._click(cancel);
|
||
}, 1000 * second);
|
||
};
|
||
|
||
return that;
|
||
},
|
||
|
||
/** 设置焦点 */
|
||
focus: function () {
|
||
try {
|
||
if (this.config.focus) {
|
||
var elem = this._focus && this._focus[0] || this.DOM.close[0];
|
||
elem && elem.focus();
|
||
}
|
||
} catch (e) {}; // IE对不可见元素设置焦点会报错
|
||
return this;
|
||
},
|
||
|
||
/** 置顶对话框 */
|
||
zIndex: function () {
|
||
var that = this,
|
||
DOM = that.DOM,
|
||
wrap = DOM.wrap,
|
||
top = artDialog.focus,
|
||
index = artDialog.defaults.zIndex ++;
|
||
|
||
//if (that.config.resize)
|
||
if (that.config.title !== false){
|
||
dialogList.focus(that.config.id);
|
||
}
|
||
|
||
// 设置叠加高度
|
||
wrap.css('zIndex', index);
|
||
that._lockMask && that._lockMask.css('zIndex', index - 1);
|
||
|
||
// 设置最高层的样式
|
||
top && top.DOM.wrap.removeClass('aui_state_focus');
|
||
artDialog.focus = that;
|
||
wrap.addClass('aui_state_focus');
|
||
return that;
|
||
},
|
||
|
||
/** 设置屏锁 */
|
||
lock: function () {
|
||
if (this._lock) return this;
|
||
|
||
var that = this,
|
||
index = artDialog.defaults.zIndex - 1,
|
||
wrap = that.DOM.wrap,
|
||
config = that.config,
|
||
docWidth = _$document.width(),
|
||
docHeight = _$document.height(),
|
||
lockMaskWrap = that._lockMaskWrap || $(document.body.appendChild(document.createElement('div'))),
|
||
lockMask = that._lockMask || $(lockMaskWrap[0].appendChild(document.createElement('div'))),
|
||
domTxt = '(document).documentElement',
|
||
sizeCss = _isMobile ? 'width:' + docWidth + 'px;height:' + docHeight
|
||
+ 'px' : 'width:100%;height:100%';
|
||
|
||
that.zIndex();
|
||
wrap.addClass('aui_state_lock');
|
||
lockMaskWrap[0].style.cssText = sizeCss + ';position:fixed;z-index:'
|
||
+ index + ';top:0;left:0;overflow:hidden;';
|
||
lockMask[0].style.cssText = 'height:100%;background:' + config.background
|
||
+ ';filter:alpha(opacity=0);opacity:0';
|
||
|
||
lockMask.stop();
|
||
lockMask.bind('click', function () {
|
||
that._reset();
|
||
}).bind('dblclick', function () {
|
||
that._click(that.config.cancelVal);
|
||
});
|
||
|
||
if (config.duration === 0) {
|
||
lockMask.css({opacity: config.opacity});
|
||
} else {
|
||
lockMask.animate({opacity: config.opacity}, config.duration);
|
||
};
|
||
|
||
that._lockMaskWrap = lockMaskWrap;
|
||
that._lockMask = lockMask;
|
||
|
||
that._lock = true;
|
||
return that;
|
||
},
|
||
|
||
/** 解开屏锁 */
|
||
unlock: function () {
|
||
var that = this,
|
||
lockMaskWrap = that._lockMaskWrap,
|
||
lockMask = that._lockMask;
|
||
|
||
if (!that._lock) return that;
|
||
var style = lockMaskWrap[0].style;
|
||
var un = function () {
|
||
style.cssText = 'display:none';
|
||
_box && lockMaskWrap.remove();
|
||
};
|
||
|
||
lockMask.stop().unbind();
|
||
that.DOM.wrap.removeClass('aui_state_lock');
|
||
if (!that.config.duration) {// 取消动画,快速关闭
|
||
un();
|
||
} else {
|
||
lockMask.animate({opacity: 0}, that.config.duration, un);
|
||
};
|
||
|
||
that._lock = false;
|
||
return that;
|
||
},
|
||
|
||
// 获取元素
|
||
_getDOM: function () {
|
||
var wrap = document.createElement('div'),
|
||
body = document.body;
|
||
wrap.style.cssText = 'position:absolute;left:0;top:0';
|
||
wrap.innerHTML = artDialog._templates;
|
||
body.insertBefore(wrap, body.firstChild);
|
||
|
||
var name, i = 0,
|
||
DOM = {wrap: $(wrap)},
|
||
els = wrap.getElementsByTagName('*'),
|
||
elsLen = els.length;
|
||
|
||
for (; i < elsLen; i ++) {
|
||
name = els[i].className.split('aui_')[1];
|
||
if (name) DOM[name] = $(els[i]);
|
||
};
|
||
|
||
return DOM;
|
||
},
|
||
|
||
// px与%单位转换成数值 (百分比单位按照最大值换算)
|
||
// 其他的单位返回原值
|
||
_toNumber: function (thisValue, maxValue) {
|
||
if (!thisValue && thisValue !== 0 || typeof thisValue === 'number') {
|
||
return thisValue;
|
||
};
|
||
|
||
var last = thisValue.length - 1;
|
||
if (thisValue.lastIndexOf('px') === last) {
|
||
thisValue = parseInt(thisValue);
|
||
} else if (thisValue.lastIndexOf('%') === last) {
|
||
thisValue = parseInt(maxValue * thisValue.split('%')[0] / 100);
|
||
};
|
||
|
||
return thisValue;
|
||
},
|
||
|
||
// 解析HTML片段中自定义类型脚本,其this指向artDialog内部
|
||
// <script type="text/dialog">/* [code] */</script>
|
||
_runScript: function (elem) {
|
||
var fun, i = 0, n = 0,
|
||
tags = elem.getElementsByTagName('script'),
|
||
length = tags.length,
|
||
script = [];
|
||
|
||
for (; i < length; i ++) {
|
||
if (tags[i].type === 'text/dialog') {
|
||
script[n] = tags[i].innerHTML;
|
||
n ++;
|
||
};
|
||
};
|
||
|
||
if (script.length) {
|
||
script = script.join('');
|
||
fun = new Function(script);
|
||
fun.call(this);
|
||
};
|
||
},
|
||
|
||
// 自动切换定位类型
|
||
_autoPositionType: function () {
|
||
this[this.config.fixed ? '_setFixed' : '_setAbsolute']();/////////////
|
||
},
|
||
|
||
|
||
// 设置静止定位
|
||
// IE6 Fixed @see: http://www.planeart.cn/?p=877
|
||
_setFixed: (function () {
|
||
$(function () {
|
||
var bg = 'backgroundAttachment';
|
||
if (_$html.css(bg) !== 'fixed' && $('body').css(bg) !== 'fixed') {
|
||
_$html.css({
|
||
zoom: 1,// 避免偶尔出现body背景图片异常的情况
|
||
backgroundAttachment: 'fixed'
|
||
});
|
||
};
|
||
});
|
||
return function () {
|
||
var $elem = this.DOM.wrap,style = $elem[0].style;
|
||
style.position = 'fixed';
|
||
};
|
||
}()),
|
||
|
||
// 设置绝对定位
|
||
_setAbsolute: function () {
|
||
var style = this.DOM.wrap[0].style;
|
||
style.position = 'absolute';
|
||
},
|
||
|
||
// 按钮回调函数触发
|
||
_click: function (name) {
|
||
var that = this,
|
||
fn = that._listeners[name] && that._listeners[name].callback;
|
||
return typeof fn !== 'function' || fn.call(that, window) !== false ?
|
||
that.close() : that;
|
||
},
|
||
_clickMax:function(){
|
||
var _dialogMaxFlag = this.config['dialogMaxFlag'];
|
||
if (this.DOM.wrap.hasClass(_dialogMaxFlag)) {//还原
|
||
this.DOM.wrap.removeClass(_dialogMaxFlag);
|
||
this.DOM.wrap.css({
|
||
'left':this.DOM.wrap.data('initSize').left + 'px',
|
||
'top':this.DOM.wrap.data('initSize').top + 'px',
|
||
'width':this.DOM.wrap.data('initSize').width + 'px'
|
||
});
|
||
this.DOM.main[0].style.height = this.DOM.wrap.data('initSize').height;
|
||
}else{//最大化
|
||
this.DOM.wrap.addClass(_dialogMaxFlag);
|
||
var dialogDom = this.DOM.wrap.context;
|
||
var size = {
|
||
left: dialogDom.offsetLeft,
|
||
top: dialogDom.offsetTop,
|
||
width: dialogDom.offsetWidth,
|
||
height:this.DOM.main[0].style.height
|
||
};
|
||
this.DOM.wrap.data('initSize',size);
|
||
this.DOM.wrap.css({
|
||
'left':0,
|
||
'top':0,
|
||
'width':_$window.width()
|
||
});
|
||
this.DOM.main[0].style.height = (_$window.height()-_titleBarHeight) + 'px';
|
||
}
|
||
},
|
||
_clickMin:function(){
|
||
if (TaskTap!=undefined){
|
||
this.display(false);
|
||
}
|
||
},
|
||
// 重置位置与尺寸
|
||
_reset: function (test) {
|
||
//最大化时,窗口调整保持
|
||
if (this.DOM.wrap.hasClass('dialogMax')) {
|
||
this.DOM.wrap.css('width',_$window.width());
|
||
this.DOM.main[0].style.height = (_$window.height()-_titleBarHeight) + 'px';
|
||
return;
|
||
}
|
||
|
||
var newSize,
|
||
that = this,
|
||
oldSize = that._winSize || _$window.width() * _$window.height(),
|
||
elem = that._follow,
|
||
width = that._width,
|
||
height = that._height,
|
||
left = that._left,
|
||
top = that._top;
|
||
|
||
if (test) {
|
||
// IE6~7 window.onresize bug
|
||
newSize = that._winSize = _$window.width() * _$window.height();
|
||
if (oldSize === newSize) return;
|
||
};
|
||
|
||
if (width || height) that.size(width, height);
|
||
|
||
if (elem) {
|
||
that.follow(elem);
|
||
} else if (left || top) {
|
||
//change by warlee [resize don't change position]
|
||
//that.position(left, top);
|
||
};
|
||
},
|
||
|
||
// 事件代理
|
||
_addEvent: function () {
|
||
var resizeTimer,
|
||
that = this,
|
||
config = that.config,
|
||
isIE = 'CollectGarbage' in window,
|
||
DOM = that.DOM;
|
||
// 窗口调节事件
|
||
that._winResize = function () {
|
||
resizeTimer && clearTimeout(resizeTimer);
|
||
resizeTimer = setTimeout(function () {
|
||
that._reset(isIE);
|
||
}, 50);
|
||
};
|
||
_$window.bind('resize', that._winResize);
|
||
// 监听点击
|
||
DOM.wrap.bind('click', function (event) {
|
||
var target = event.target, callbackID;
|
||
if (target.disabled) return false; // IE BUG
|
||
|
||
var clickClass = $(target).attr('class');
|
||
//最大化 最小化 关闭
|
||
switch(clickClass){
|
||
case 'aui_min':that._clickMin();break;
|
||
case 'aui_max':that._clickMax();break;
|
||
case 'aui_close':
|
||
that._click(config.cancelVal);
|
||
return false;
|
||
default:
|
||
callbackID = target[_expando + 'callback'];
|
||
callbackID && that._click(callbackID);
|
||
}
|
||
})
|
||
.bind('mousedown', function () {
|
||
try{rightMenu.hidden();}catch(e){};
|
||
that.zIndex();
|
||
});
|
||
},
|
||
|
||
// 卸载事件代理
|
||
_removeEvent: function () {
|
||
var that = this,
|
||
DOM = that.DOM;
|
||
|
||
DOM.wrap.unbind();
|
||
_$window.unbind('resize', that._winResize);
|
||
}
|
||
|
||
};
|
||
|
||
artDialog.fn._init.prototype = artDialog.fn;
|
||
$.fn.dialog = $.fn.artDialog = function () {
|
||
var config = arguments;
|
||
this[this.live ? 'live' : 'bind']('click', function () {
|
||
artDialog.apply(this, config);
|
||
return false;
|
||
});
|
||
return this;
|
||
};
|
||
|
||
|
||
|
||
/** 最顶层的对话框API */
|
||
artDialog.focus = null;
|
||
|
||
|
||
/** 获取某对话框API */
|
||
artDialog.get = function (id) {
|
||
return id === undefined
|
||
? artDialog.list
|
||
: artDialog.list[id];
|
||
};
|
||
|
||
artDialog.list = {};
|
||
|
||
|
||
|
||
// 全局快捷键
|
||
_$document.bind('keydown', function (event) {
|
||
var target = event.target,
|
||
nodeName = target.nodeName,
|
||
rinput = /^INPUT|TEXTAREA$/,
|
||
api = artDialog.focus,
|
||
keyCode = event.keyCode;
|
||
|
||
if (!api || !api.config.esc || rinput.test(nodeName) || api.config.resize || api.config.simple) return;
|
||
|
||
keyCode === 27 && api._click(api.config.cancelVal);
|
||
});
|
||
|
||
|
||
|
||
// 获取artDialog路径
|
||
_path = window['_artDialog_path'] || (function (script, i, me) {
|
||
for (i in script) {
|
||
// 如果通过第三方脚本加载器加载本文件,请保证文件名含有"artDialog"字符
|
||
if (script[i].src && script[i].src.indexOf('artDialog') !== -1) me = script[i];
|
||
};
|
||
|
||
_thisScript = me || script[script.length - 1];
|
||
me = _thisScript.src.replace(/\\/g, '/');
|
||
return me.lastIndexOf('/') < 0 ? '.' : me.substring(0, me.lastIndexOf('/'));
|
||
}(document.getElementsByTagName('script')));
|
||
|
||
|
||
// 触发浏览器预先缓存背景图片
|
||
// _$window.bind('load', function () {
|
||
// setTimeout(function () {
|
||
// if (_count) return;
|
||
// artDialog({left: '-9999em',time: 9,fixed: false,lock: false,focus: false});
|
||
// }, 150);
|
||
// });
|
||
|
||
|
||
// 使用uglifyjs压缩能够预先处理"+"号合并字符串
|
||
// uglifyjs: http://marijnhaverbeke.nl/uglifyjs
|
||
artDialog._templates =
|
||
'<div class="aui_outer pop_fadein"><div class="aui_mask"></div>'
|
||
+ '<table class="aui_border">'
|
||
+ '<tbody>'
|
||
+ '<tr>'
|
||
+ '<td class="aui_nw"></td>'
|
||
+ '<td class="aui_n"></td>'
|
||
+ '<td class="aui_ne"></td>'
|
||
+ '</tr>'
|
||
+ '<tr>'
|
||
+ '<td class="aui_w"></td>'
|
||
+ '<td class="aui_c">'
|
||
+ '<div class="aui_inner">'
|
||
+ '<table class="aui_dialog">'
|
||
+ '<tbody>'
|
||
+ '<tr>'
|
||
+ '<td colspan="2" class="aui_header">'
|
||
+ '<div class="aui_titleBar dialog_menu">'
|
||
+ '<div class="aui_title"></div>'
|
||
+ '<a class="aui_min">─</a>'
|
||
+ '<a class="aui_max">□</a>'
|
||
+ '<a class="aui_close">'
|
||
+ '\xd7'
|
||
+ '</a>'
|
||
+ '</div>'
|
||
+ '</td>'
|
||
+ '</tr>'
|
||
+ '<tr>'
|
||
+ '<td class="aui_icon">'
|
||
+ '<div class="aui_iconBg"></div>'
|
||
+ '</td>'
|
||
+ '<td class="aui_main">'
|
||
+ '<div class="aui_content"></div>'
|
||
+ '</td>'
|
||
+ '</tr>'
|
||
+ '<tr>'
|
||
+ '<td colspan="2" class="aui_footer">'
|
||
+ '<div class="aui_buttons"></div>'
|
||
+ '</td>'
|
||
+ '</tr>'
|
||
+ '</tbody>'
|
||
+ '</table>'
|
||
+ '</div>'
|
||
+ '</td>'
|
||
+ '<td class="aui_e"></td>'
|
||
+ '</tr>'
|
||
+ '<tr>'
|
||
+ '<td class="aui_sw"></td>'
|
||
+ '<td class="aui_s"></td>'
|
||
+ '<td class="aui_se"></td>'
|
||
+ '</tr>'
|
||
+ '</tbody>'
|
||
+ '</table>'
|
||
|
||
+ '<div class="resize-handle resize-top" resize="top"></div>'
|
||
+ '<div class="resize-handle resize-right" resize="right"></div>'
|
||
+ '<div class="resize-handle resize-bottom" resize="bottom"></div>'
|
||
+ '<div class="resize-handle resize-left" resize="left"></div>'
|
||
+ '<div class="resize-handle resize-top-right" resize="top-right"></div>'
|
||
+ '<div class="resize-handle resize-bottom-right" resize="bottom-right"></div>'
|
||
+ '<div class="resize-handle resize-bottom-left" resize="bottom-left"></div>'
|
||
+ '<div class="resize-handle resize-top-left" resize="top-left"></div>'
|
||
+'</div>';
|
||
|
||
|
||
|
||
/**
|
||
* 默认配置
|
||
*/
|
||
artDialog.defaults = {
|
||
content: '', // 消息内容
|
||
title: '\u6d88\u606f', // 标题. 默认'消息'
|
||
button: null, // 自定义按钮
|
||
ok: null, // 确定按钮回调函数
|
||
cancel: null, // 取消按钮回调函数
|
||
init: null, // 对话框初始化后执行的函数
|
||
close: null, // 对话框关闭前执行的函数
|
||
okVal: '\u786E\u5B9A', // 确定按钮文本. 默认'确定'
|
||
cancelVal: '\u53D6\u6D88', // 取消按钮文本. 默认'取消'
|
||
width: 'auto', // 内容宽度
|
||
height: 'auto', // 内容高度
|
||
minWidth: 96, // 最小宽度限制
|
||
minHeight: 32, // 最小高度限制
|
||
padding: '20px 25px', // 内容与边界填充距离
|
||
icon: null, // 消息图标名称
|
||
time: null, // 自动关闭时间
|
||
esc: true, // 是否支持Esc键关闭
|
||
focus: true, // 是否支持对话框按钮自动聚焦
|
||
show: true, // 初始化后是否显示对话框
|
||
follow: null, // 跟随某元素(即让对话框在元素附近弹出)
|
||
path: _path, // artDialog路径
|
||
lock: false, // 是否锁屏
|
||
background: '#000', // 遮罩颜色
|
||
opacity: .7, // 遮罩透明度
|
||
duration: 300, // 遮罩透明度渐变动画速度
|
||
fixed: false, // 是否静止定位
|
||
left: '50%', // X轴坐标
|
||
top: '38.2%', // Y轴坐标
|
||
zIndex: 300, // 对话框叠加高度值(重要:此值不能超过浏览器最大限制)
|
||
|
||
ico:'./static/images/file_16/file.png',//默认标题小图标
|
||
resize: false, // 是否允许用户调节尺寸
|
||
dialogMaxFlag:'dialogMax', // 最大化状态标记class
|
||
dialogMinFlag:'dialogMin', // 最小化状态标记class
|
||
drag: true // 是否允许用户拖动位置
|
||
};
|
||
|
||
window.artDialog = $.dialog = $.artDialog = artDialog;
|
||
}(this.art || this.jQuery && (this.art = jQuery), this));
|
||
|
||
|
||
|
||
|
||
|
||
|
||
//------------------------------------------------
|
||
// 对话框模块-拖拽支持(可选外置模块)
|
||
//------------------------------------------------
|
||
;(function ($) {
|
||
|
||
var _dragEvent, _use,
|
||
_$window = $(window),
|
||
_$document = $(document),
|
||
_elem = document.documentElement,
|
||
_isLosecapture = 'onlosecapture' in _elem,
|
||
_isSetCapture = 'setCapture' in _elem;
|
||
|
||
// 拖拽事件
|
||
artDialog.dragEvent = function () {
|
||
var that = this,
|
||
proxy = function (name) {
|
||
var fn = that[name];
|
||
that[name] = function () {
|
||
return fn.apply(that, arguments);
|
||
};
|
||
};
|
||
|
||
proxy('start');
|
||
proxy('move');
|
||
proxy('end');
|
||
};
|
||
|
||
artDialog.dragEvent.prototype = {
|
||
// 开始拖拽
|
||
onstart: $.noop,
|
||
start: function (event) {
|
||
_$document
|
||
.bind('mousemove', this.move)
|
||
.bind('mouseup', this.end);
|
||
this.onstart(event.clientX, event.clientY);
|
||
return false;
|
||
},
|
||
|
||
// 正在拖拽
|
||
onmove: $.noop,
|
||
move: function (event) {
|
||
this.onmove(event.clientX,event.clientY);
|
||
return false;
|
||
},
|
||
|
||
// 结束拖拽
|
||
onend: $.noop,
|
||
end: function (event) {
|
||
_$document
|
||
.unbind('mousemove', this.move)
|
||
.unbind('mouseup', this.end);
|
||
this.onend(event.clientX, event.clientY);
|
||
return false;
|
||
}
|
||
|
||
};
|
||
|
||
_use = function (event) {
|
||
var startWidth, startHeight, startLeft, startTop, isResize,
|
||
api = artDialog.focus,
|
||
startX,startY,
|
||
screenWidth,screenHeight,
|
||
DOM = api.DOM,
|
||
wrap = DOM.wrap,
|
||
title = DOM.title,
|
||
main = DOM.main;
|
||
|
||
// 清除文本选择
|
||
var clsSelect = 'getSelection' in window ? function () {
|
||
window.getSelection().removeAllRanges();
|
||
} : function () {
|
||
try {
|
||
document.selection.empty();
|
||
} catch (e) {};
|
||
};
|
||
|
||
// 对话框准备拖动
|
||
_dragEvent.onstart = function (x, y) {
|
||
startX = x;startY = y;
|
||
screenHeight = $(window).height();
|
||
screenWidth = $(window).width();
|
||
if (isResize) {
|
||
startWidth = main[0].offsetWidth;
|
||
startHeight = main[0].offsetHeight;
|
||
|
||
startLeft = wrap[0].offsetLeft;
|
||
startTop = wrap[0].offsetTop;
|
||
} else {
|
||
startLeft = wrap[0].offsetLeft;
|
||
startTop = wrap[0].offsetTop;
|
||
};
|
||
|
||
_$document.bind('dblclick', _dragEvent.end);
|
||
if (_isLosecapture) {
|
||
title.bind('losecapture', _dragEvent.end)
|
||
}else{
|
||
_$window.bind('blur', _dragEvent.end);
|
||
}
|
||
_isSetCapture && title[0].setCapture();
|
||
|
||
wrap.addClass('aui_state_drag');
|
||
api.focus();
|
||
};
|
||
|
||
// 对话框拖动,8个方向调整大小
|
||
_dragEvent.onmove = function (x, y) {
|
||
if (wrap.hasClass(api.config['dialogMaxFlag'])) return;//最大化则不可拖动
|
||
|
||
x = (x >= screenWidth ? screenWidth : x);
|
||
y = (y >= screenHeight ? screenHeight : y);
|
||
x = (x <= 0 ? 0 : x);
|
||
y = (y <= 0 ? 0 : y);
|
||
|
||
x = x - startX;
|
||
y = y - startY;
|
||
|
||
if (isResize) {
|
||
if (resizeDirection == undefined) return;
|
||
var wrapStyle = wrap[0].style,style = main[0].style,
|
||
left = startLeft,
|
||
top = startTop,
|
||
width = startWidth,
|
||
height= startHeight;
|
||
|
||
switch(resizeDirection){
|
||
case 'top':
|
||
top = y + top;
|
||
height = -y + height;
|
||
break;
|
||
case 'right':
|
||
width = x + width;
|
||
break;
|
||
case 'bottom':
|
||
height = y + height;
|
||
break;
|
||
case 'left':
|
||
left = x + left;
|
||
width = -x + width;
|
||
break;
|
||
case 'top-left':
|
||
left = x + left;
|
||
top = y + top;
|
||
width = -x + width;
|
||
height = -y + height;
|
||
break;
|
||
case 'top-right':
|
||
top = y + top;
|
||
width = x + width;
|
||
height = -y + height;
|
||
break;
|
||
case 'bottom-right':
|
||
width = x + startWidth;
|
||
height = y + startHeight;
|
||
break;
|
||
case 'bottom-left':
|
||
left = x + left;
|
||
width = -x + startWidth;
|
||
height = y + startHeight;
|
||
break;
|
||
default:break;
|
||
}
|
||
|
||
left = (left<=0 ? 0:left);
|
||
top = (top<=0 ? 0:top);
|
||
|
||
wrapStyle.width = 'auto';
|
||
wrapStyle.width = wrap[0].offsetWidth + 'px';
|
||
wrapStyle.left = left + 'px';
|
||
wrapStyle.top = top + 'px';
|
||
|
||
style.width = Math.max(0, width) + 'px';
|
||
style.height = Math.max(0, height) + 'px';
|
||
} else {
|
||
var style = wrap[0].style;
|
||
style.left = x + startLeft + 'px';
|
||
style.top = y + startTop + 'px';
|
||
}
|
||
clsSelect();
|
||
};
|
||
|
||
// 对话框拖动结束
|
||
_dragEvent.onend = function (x, y) {
|
||
_$document.unbind('dblclick', _dragEvent.end);
|
||
_isLosecapture ? title.unbind('losecapture', _dragEvent.end) :
|
||
_$window.unbind('blur', _dragEvent.end);
|
||
_isSetCapture && title[0].releaseCapture();
|
||
|
||
!api.closed && api._autoPositionType();
|
||
wrap.removeClass('aui_state_drag');
|
||
};
|
||
|
||
isResize = $(event.target).hasClass('resize-handle');
|
||
resizeDirection= $(event.target).attr('resize');
|
||
_dragEvent.start(event);
|
||
};
|
||
|
||
// 代理 mousedown 事件触发对话框拖动
|
||
_$document.bind('mousedown', function (event) {
|
||
var api = artDialog.focus;
|
||
if (!api) return;
|
||
var target = event.target,
|
||
config = api.config,
|
||
DOM = api.DOM;
|
||
|
||
if (config.drag !== false && target === DOM.title[0]
|
||
|| config.resize !== false && $(target).hasClass('resize-handle')) {
|
||
_dragEvent = _dragEvent || new artDialog.dragEvent();
|
||
_use(event);
|
||
return false;// 防止firefox与chrome滚屏
|
||
};
|
||
});
|
||
})(this.art || this.jQuery && (this.art = jQuery));
|
||
|
||
|
||
|
||
|
||
|
||
//==========================================================================
|
||
//==========================================================================
|
||
/*!
|
||
* artDialog iframeTools
|
||
* Date: 2011-11-25 13:54
|
||
* http://code.google.com/p/artdialog/
|
||
* (c) 2009-2011 TangBin, http://www.planeArt.cn
|
||
*
|
||
* This is licensed under the GNU LGPL, version 2.1 or later.
|
||
* For details, see: http://creativecommons.org/licenses/LGPL/2.1/
|
||
*/
|
||
|
||
;(function ($, window, artDialog, undefined) {
|
||
|
||
var _topDialog, _proxyDialog, _zIndex,
|
||
_data = '@ARTDIALOG.DATA',
|
||
_open = '@ARTDIALOG.OPEN',
|
||
_opener = '@ARTDIALOG.OPENER',
|
||
_winName = window.name = window.name
|
||
|| '@ARTDIALOG.WINNAME' + + new Date;
|
||
|
||
$(function () {
|
||
!window.jQuery && document.compatMode === 'BackCompat'
|
||
// 不支持怪异模式,请用主流的XHTML1.0或者HTML5的DOCTYPE申明
|
||
&& alert('artDialog Error: document.compatMode === "BackCompat"');
|
||
});
|
||
|
||
|
||
/** 获取 artDialog 可跨级调用的最高层的 window 对象 */
|
||
var _top = artDialog.top = function () {
|
||
var top = window,
|
||
test = function (name) {
|
||
try {
|
||
var doc = window[name].document; // 跨域|无权限
|
||
doc.getElementsByTagName; // chrome 本地安全限制
|
||
} catch (e) {
|
||
return false;
|
||
};
|
||
|
||
return window[name].artDialog
|
||
// 框架集无法显示第三方元素
|
||
&& doc.getElementsByTagName('frameset').length === 0;
|
||
};
|
||
|
||
if (test('top')) {
|
||
top = window.top;
|
||
} else if (test('parent')) {
|
||
top = window.parent;
|
||
};
|
||
|
||
return top;
|
||
}();
|
||
artDialog.parent = _top; // 兼容v4.1之前版本,未来版本将删除此
|
||
|
||
|
||
_topDialog = _top.artDialog;
|
||
|
||
|
||
// 获取顶层页面对话框叠加值
|
||
_zIndex = function () {
|
||
return _topDialog.defaults.zIndex;
|
||
};
|
||
|
||
|
||
|
||
/**
|
||
* 跨框架数据共享接口
|
||
* @see http://www.planeart.cn/?p=1554
|
||
* @param {String} 存储的数据名
|
||
* @param {Any} 将要存储的任意数据(无此项则返回被查询的数据)
|
||
*/
|
||
artDialog.data = function (name, value) {
|
||
var top = artDialog.top,
|
||
cache = top[_data] || {};
|
||
top[_data] = cache;
|
||
|
||
if (value !== undefined) {
|
||
cache[name] = value;
|
||
} else {
|
||
return cache[name];
|
||
};
|
||
return cache;
|
||
};
|
||
|
||
|
||
/**
|
||
* 数据共享删除接口
|
||
* @param {String} 删除的数据名
|
||
*/
|
||
artDialog.removeData = function (name) {
|
||
var cache = artDialog.top[_data];
|
||
if (cache && cache[name]) delete cache[name];
|
||
};
|
||
|
||
|
||
/** 跨框架普通对话框 */
|
||
artDialog.through = _proxyDialog = function () {
|
||
var api = _topDialog.apply(this, arguments);
|
||
|
||
// 缓存从当前 window(可能为iframe)调出所有跨框架对话框,
|
||
// 以便让当前 window 卸载前去关闭这些对话框。
|
||
// 因为iframe注销后也会从内存中删除其创建的对象,这样可以防止回调函数报错
|
||
if (_top !== window) artDialog.list[api.config.id] = api;
|
||
return api;
|
||
};
|
||
|
||
// 框架页面卸载前关闭所有穿越的对话框
|
||
_top !== window && $(window).bind('unload', function () {
|
||
var list = artDialog.list, config;
|
||
for (var i in list) {
|
||
if (list[i]) {
|
||
config = list[i].config;
|
||
if (config) config.duration = 0; // 取消动画
|
||
list[i].close();
|
||
//delete list[i];
|
||
};
|
||
};
|
||
});
|
||
|
||
|
||
/**
|
||
* 弹窗 (iframe)
|
||
* @param {String} 地址
|
||
* @param {Object} 配置参数. 这里传入的回调函数接收的第1个参数为iframe内部window对象
|
||
* @param {Boolean} 是否允许缓存. 默认true
|
||
*/
|
||
artDialog.open = function (url, options, cache) {
|
||
options = options || {};
|
||
|
||
var api, DOM,
|
||
$content, $main, iframe, $iframe, $idoc, iwin, ibody,$frame,
|
||
top = artDialog.top,
|
||
initCss = 'position:absolute;left:-9999em;top:-9999em;border:none 0;background:transparent',
|
||
loadCss = 'width:100%;height:100%;border:none 0';
|
||
|
||
if (cache === false) {
|
||
var ts = + new Date,
|
||
ret = url.replace(/([?&])_=[^&]*/, "$1_=" + ts );
|
||
url = ret + ((ret === url) ? (/\?/.test(url) ? "&" : "?") + "_=" + ts : "");
|
||
};
|
||
|
||
|
||
var load = function () {
|
||
var iWidth, iHeight,aConfig = api.config;
|
||
DOM.content.find('.aui_loading').remove();
|
||
$content.addClass('aui_state_full');
|
||
try {
|
||
iwin = iframe.contentWindow;
|
||
$idoc = $(iwin.document);
|
||
ibody = iwin.document.body;
|
||
} catch (e) {// 跨域
|
||
iframe.style.cssText = loadCss;
|
||
|
||
aConfig.follow
|
||
? api.follow(aConfig.follow)
|
||
: api.position(aConfig.left, aConfig.top);
|
||
|
||
options.init && options.init.call(api, iwin, top);
|
||
options.init = null;
|
||
return;
|
||
};
|
||
|
||
// 获取iframe内部尺寸
|
||
iWidth = aConfig.width === 'auto'
|
||
? $idoc.width() + parseInt($(ibody).css('marginLeft'))
|
||
: aConfig.width;
|
||
|
||
iHeight = aConfig.height === 'auto'
|
||
? $idoc.height()
|
||
: aConfig.height;
|
||
|
||
// 适应iframe尺寸
|
||
iframe.style.cssText = loadCss;
|
||
api.size(iWidth, iHeight);
|
||
|
||
// 调整对话框位置
|
||
aConfig.follow
|
||
? api.follow(aConfig.follow)
|
||
: api.position(aConfig.left, aConfig.top);
|
||
|
||
options.init && options.init.call(api, iwin, top);
|
||
options.init = null;
|
||
};
|
||
|
||
var config = {
|
||
zIndex: _zIndex(),
|
||
init: function () {
|
||
api = this;
|
||
DOM = api.DOM;
|
||
$main = DOM.main;
|
||
$content = DOM.content;
|
||
DOM.content.append('<div class="aui_loading"><span>loading..</span></div>');
|
||
|
||
iframe = api.iframe = top.document.createElement('iframe');
|
||
iframe.src = url;
|
||
iframe.name = 'Open' + api.config.id;
|
||
iframe.style.cssText = initCss;
|
||
iframe.setAttribute('frameborder', 0, 0);
|
||
iframe.setAttribute('allowTransparency', true);
|
||
|
||
$iframe = $(iframe);
|
||
api.content().appendChild(iframe);
|
||
iwin = iframe.contentWindow;
|
||
|
||
try {
|
||
iwin.name = iframe.name;
|
||
artDialog.data(iframe.name + _open, api);
|
||
artDialog.data(iframe.name + _opener, window);
|
||
} catch (e) {};
|
||
|
||
$iframe.one('load', load);
|
||
//$frame.css('display','none');
|
||
},
|
||
close: function () {
|
||
$iframe.css('display', 'none').unbind('load', load);
|
||
|
||
if (options.close && options.close.call(this, iframe.contentWindow, top) === false) {
|
||
return false;
|
||
};
|
||
$content.removeClass('aui_state_full');
|
||
|
||
// 重要!需要重置iframe地址,否则下次出现的对话框在IE6、7无法聚焦input
|
||
// IE删除iframe后,iframe仍然会留在内存中出现上述问题,置换src是最容易解决的方法
|
||
$iframe[0].src = 'about:blank';
|
||
$iframe.remove();
|
||
|
||
try {
|
||
artDialog.removeData(iframe.name + _open);
|
||
artDialog.removeData(iframe.name + _opener);
|
||
} catch (e) {};
|
||
}
|
||
};
|
||
|
||
// 回调函数第一个参数指向iframe内部window对象
|
||
if (typeof options.ok === 'function') config.ok = function () {
|
||
return options.ok.call(api, iframe.contentWindow, top);
|
||
};
|
||
if (typeof options.cancel === 'function') config.cancel = function () {
|
||
return options.cancel.call(api, iframe.contentWindow, top);
|
||
};
|
||
|
||
delete options.content;
|
||
|
||
for (var i in options) {
|
||
if (config[i] === undefined) config[i] = options[i];
|
||
};
|
||
|
||
return _proxyDialog(config);
|
||
};
|
||
|
||
|
||
/** 引用open方法扩展方法(在open打开的iframe内部私有方法) */
|
||
artDialog.open.api = artDialog.data(_winName + _open);
|
||
|
||
|
||
/** 引用open方法触发来源页面window(在open打开的iframe内部私有方法) */
|
||
artDialog.opener = artDialog.data(_winName + _opener) || window;
|
||
artDialog.open.origin = artDialog.opener; // 兼容v4.1之前版本,未来版本将删除此
|
||
|
||
/** artDialog.open 打开的iframe页面里关闭对话框快捷方法 */
|
||
artDialog.close = function () {
|
||
var api = artDialog.data(_winName + _open);
|
||
api && api.close();
|
||
return false;
|
||
};
|
||
|
||
// 点击iframe内容切换叠加高度
|
||
_top != window && $(document).bind('mousedown', function () {
|
||
var api = artDialog.open.api;
|
||
api && api.zIndex();
|
||
});
|
||
|
||
|
||
/**
|
||
* Ajax填充内容
|
||
* @param {String} 地址
|
||
* @param {Object} 配置参数
|
||
* @param {Boolean} 是否允许缓存. 默认true
|
||
*/
|
||
artDialog.load = function(url, options, cache){
|
||
cache = cache || false;
|
||
var opt = options || {};
|
||
|
||
var config = {
|
||
zIndex: _zIndex(),
|
||
init: function(here){
|
||
var api = this,
|
||
aConfig = api.config;
|
||
|
||
$.ajax({
|
||
url: url,
|
||
success: function (content) {
|
||
api.content(content);
|
||
opt.init && opt.init.call(api, here);
|
||
},
|
||
cache: cache
|
||
});
|
||
|
||
}
|
||
};
|
||
|
||
delete options.content;
|
||
|
||
for (var i in opt) {
|
||
if (config[i] === undefined) config[i] = opt[i];
|
||
};
|
||
|
||
return _proxyDialog(config);
|
||
};
|
||
|
||
|
||
/**
|
||
* 警告
|
||
* @param {String} 消息内容
|
||
*/
|
||
artDialog.alert = function (content, callback) {
|
||
return _proxyDialog({
|
||
id: 'Alert',
|
||
zIndex: _zIndex(),
|
||
icon: 'warning',
|
||
fixed: true,
|
||
lock: true,
|
||
content: content,
|
||
ok: true,
|
||
close: callback
|
||
});
|
||
};
|
||
|
||
|
||
/**
|
||
* 确认
|
||
* @param {String} 消息内容
|
||
* @param {Function} 确定按钮回调函数
|
||
* @param {Function} 取消按钮回调函数
|
||
*/
|
||
artDialog.confirm = function (content, yes, no) {
|
||
return _proxyDialog({
|
||
id: 'Confirm',
|
||
zIndex: _zIndex(),
|
||
icon: 'question',
|
||
fixed: true,
|
||
lock: true,
|
||
opacity: .1,
|
||
content: content,
|
||
ok: function (here) {
|
||
return yes.call(this, here);
|
||
},
|
||
cancel: function (here) {
|
||
return no && no.call(this, here);
|
||
}
|
||
});
|
||
};
|
||
|
||
|
||
/**
|
||
* 提问
|
||
* @param {String} 提问内容
|
||
* @param {Function} 回调函数. 接收参数:输入值
|
||
* @param {String} 默认值
|
||
*/
|
||
artDialog.prompt = function (content, yes, value) {
|
||
value = value || '';
|
||
var input;
|
||
|
||
return _proxyDialog({
|
||
id: 'Prompt',
|
||
zIndex: _zIndex(),
|
||
icon: 'question',
|
||
fixed: true,
|
||
lock: true,
|
||
opacity: .1,
|
||
content: [
|
||
'<div style="margin-bottom:5px;font-size:12px">',
|
||
content,
|
||
'</div>',
|
||
'<div>',
|
||
'<input value="',
|
||
value,
|
||
'" style="width:18em;padding:6px 4px" />',
|
||
'</div>'
|
||
].join(''),
|
||
init: function () {
|
||
input = this.DOM.content.find('input')[0];
|
||
input.select();
|
||
input.focus();
|
||
},
|
||
ok: function (here) {
|
||
return yes && yes.call(this, input.value, here);
|
||
},
|
||
cancel: true
|
||
});
|
||
};
|
||
|
||
|
||
/**
|
||
* 短暂提示
|
||
* @param {String} 提示内容
|
||
* @param {Number} 显示时间 (默认1.5秒)
|
||
*/
|
||
artDialog.tips = function (content, time) {
|
||
return _proxyDialog({
|
||
id: 'Tips',
|
||
zIndex: _zIndex(),
|
||
title: false,
|
||
cancel: false,
|
||
fixed: true,
|
||
lock: false
|
||
})
|
||
.content('<div style="padding: 0 1em;">' + content + '</div>')
|
||
.time(time || 1.5);
|
||
};
|
||
|
||
|
||
// 增强artDialog拖拽体验
|
||
// - 防止鼠标落入iframe导致不流畅
|
||
// - 对超大对话框拖动优化
|
||
$(function () {
|
||
var event = artDialog.dragEvent;
|
||
if (!event) return;
|
||
|
||
var $window = $(window),
|
||
$document = $(document),
|
||
positionType = 'fixed',
|
||
dragEvent = event.prototype,
|
||
mask = document.createElement('div'),
|
||
style = mask.style;
|
||
|
||
style.cssText = 'display:none;position:' + positionType + ';left:0;top:0;width:100%;height:100%;'
|
||
+ 'cursor:move;filter:alpha(opacity=0);opacity:0;background:#FFF';
|
||
|
||
document.body.appendChild(mask);
|
||
dragEvent._start = dragEvent.start;
|
||
dragEvent._end = dragEvent.end;
|
||
|
||
dragEvent.start = function () {
|
||
var DOM = artDialog.focus.DOM,
|
||
main = DOM.main[0],
|
||
iframe = DOM.content[0].getElementsByTagName('iframe')[0];
|
||
|
||
dragEvent._start.apply(this, arguments);
|
||
style.display = 'block';
|
||
style.zIndex = artDialog.defaults.zIndex + 3;
|
||
|
||
if (positionType === 'absolute') {
|
||
style.width = $window.width() + 'px';
|
||
style.height = $window.height() + 'px';
|
||
style.left = $document.scrollLeft() + 'px';
|
||
style.top = $document.scrollTop() + 'px';
|
||
};
|
||
|
||
// if (iframe && main.offsetWidth * main.offsetHeight > 307200) {
|
||
// main.style.visibility = 'hidden';
|
||
// };
|
||
};
|
||
|
||
dragEvent.end = function () {
|
||
var dialog = artDialog.focus;
|
||
dragEvent._end.apply(this, arguments);
|
||
style.display = 'none';
|
||
//if (dialog) dialog.DOM.main[0].style.visibility = 'visible';
|
||
};
|
||
});
|
||
|
||
})(this.art || this.jQuery, this, this.artDialog);
|
||
|
||
|
||
if (typeof(LNG) != 'undefined') {
|
||
artDialog.defaults.okVal = LNG.button_ok;
|
||
artDialog.defaults.cancelVal = LNG.button_cancle;
|
||
};
|
||
|