You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1262 lines
32 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/*!
* 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/
*/
//------------------------------------------------
// 对话框模块
//------------------------------------------------
;(function ($, window, undefined) {
$.noop = $.noop || function () {}; // jQuery 1.3.2
var _box, _thisScript, _skin, _path,
_count = 0,
_$window = $(window),
_$document = $(document),
_$html = $('html'),
_elem = document.documentElement,
_isIE6 = window.VBArray && !window.XMLHttpRequest,
_isMobile = 'createTouch' in document && !('onmousemove' in _elem)
|| /(iPhone|iPad|iPod)/i.test(navigator.userAgent),
_expando = 'artDialog' + + new Date;
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();
// 目前主流移动设备对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 ++;
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 && (_isIE6 ? {png: 'icons/' + icon + '.png'}
: {backgroundImage: 'url(\'' + config.path + '/skins/icons/' + icon + '.png\')'});
that.closed = false;
that.config = config;
that.DOM = DOM = that.DOM || that._getDOM();
DOM.wrap.addClass(config.skin);
DOM.close[config.cancel === false ? 'hide' : 'show']();
DOM.icon[0].style.display = icon ? '' : 'none';
DOM.iconBg.css(iconBg || {background: 'none'});
DOM.se.css('cursor', config.resize ? 'se-resize' : 'auto');
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();
that._ie6PngFix();
_box = null;
config.init && config.init.call(that, window);
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);
} 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._ie6SelectFix();
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 = _isIE6 ? false : config.fixed,
ie6Fixed = _isIE6 && that.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 = ie6Fixed ? (left += docLeft) : left + dl;
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 = ie6Fixed ? (top += docTop) : top + dt;
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;
};
};
that._ie6SelectFix();
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 = _isIE6 ? false : 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';
that._ie6SelectFix();
return that;
},
/** 显示对话框 */
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();
// 置空内容
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');
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;
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 ++;
// 设置叠加高度
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%',
ie6Css = _isIE6 ?
'position:absolute;left:expression(' + domTxt + '.scrollLeft);top:expression('
+ domTxt + '.scrollTop);width:expression(' + domTxt
+ '.clientWidth);height:expression(' + domTxt + '.clientHeight)'
: '';
that.zIndex();
wrap.addClass('aui_state_lock');
lockMaskWrap[0].style.cssText = sizeCss + ';position:fixed;z-index:'
+ index + ';top:0;left:0;overflow:hidden;' + ie6Css;
lockMask[0].style.cssText = 'height:100%;background:' + config.background
+ ';filter:alpha(opacity=0);opacity:0';
// 让IE6锁屏遮罩能够盖住下拉控件
if (_isIE6) lockMask.html(
'<iframe src="about:blank" style="width:100%;height:100%;position:absolute;' +
'top:0;left:0;z-index:-1;filter:alpha(opacity=0)"></iframe>');
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 () {
if (_isIE6) {
style.removeExpression('width');
style.removeExpression('height');
style.removeExpression('left');
style.removeExpression('top');
};
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;
},
// 让IE6 CSS支持PNG背景
_ie6PngFix: _isIE6 ? function () {
var i = 0, elem, png, pngPath, runtimeStyle,
path = artDialog.defaults.path + '/skins/',
list = this.DOM.wrap[0].getElementsByTagName('*');
for (; i < list.length; i ++) {
elem = list[i];
png = elem.currentStyle['png'];
if (png) {
pngPath = path + png;
runtimeStyle = elem.runtimeStyle;
runtimeStyle.backgroundImage = 'none';
runtimeStyle.filter = "progid:DXImageTransform.Microsoft." +
"AlphaImageLoader(src='" + pngPath + "',sizingMethod='crop')";
};
};
} : $.noop,
// 强制覆盖IE6下拉控件
_ie6SelectFix: _isIE6 ? function () {
var $wrap = this.DOM.wrap,
wrap = $wrap[0],
expando = _expando + 'iframeMask',
iframe = $wrap[expando],
width = wrap.offsetWidth,
height = wrap.offsetHeight;
width = width + 'px';
height = height + 'px';
if (iframe) {
iframe.style.width = width;
iframe.style.height = height;
} else {
iframe = wrap.appendChild(document.createElement('iframe'));
$wrap[expando] = iframe;
iframe.src = 'about:blank';
iframe.style.cssText = 'position:absolute;z-index:-1;left:0;top:0;'
+ 'filter:alpha(opacity=0);width:' + width + ';height:' + height;
};
} : $.noop,
// 解析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 () {
_isIE6 && $(function () {
var bg = 'backgroundAttachment';
if (_$html.css(bg) !== 'fixed' && $('body').css(bg) !== 'fixed') {
_$html.css({
zoom: 1,// 避免偶尔出现body背景图片异常的情况
backgroundImage: 'url(about:blank)',
backgroundAttachment: 'fixed'
});
};
});
return function () {
var $elem = this.DOM.wrap,
style = $elem[0].style;
if (_isIE6) {
var left = parseInt($elem.css('left')),
top = parseInt($elem.css('top')),
sLeft = _$document.scrollLeft(),
sTop = _$document.scrollTop(),
txt = '(document.documentElement)';
this._setAbsolute();
style.setExpression('left', 'eval(' + txt + '.scrollLeft + '
+ (left - sLeft) + ') + "px"');
style.setExpression('top', 'eval(' + txt + '.scrollTop + '
+ (top - sTop) + ') + "px"');
} else {
style.position = 'fixed';
};
};
}()),
// 设置绝对定位
_setAbsolute: function () {
var style = this.DOM.wrap[0].style;
if (_isIE6) {
style.removeExpression('left');
style.removeExpression('top');
};
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;
},
// 重置位置与尺寸
_reset: function (test) {
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) {
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);
}, 40);
};
_$window.bind('resize', that._winResize);
// 监听点击
DOM.wrap
.bind('click', function (event) {
var target = event.target, callbackID;
if (target.disabled) return false; // IE BUG
if (target === DOM.close[0]) {
that._click(config.cancelVal);
return false;
} else {
callbackID = target[_expando + 'callback'];
callbackID && that._click(callbackID);
};
that._ie6SelectFix();
})
.bind('mousedown', function () {
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)) 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')));
// 无阻塞载入CSS (如"artDialog.js?skin=aero")
_skin = _thisScript.src.split('skin=')[1];
if (_skin) {
var link = document.createElement('link');
link.rel = 'stylesheet';
link.href = _path + '/skins/' + _skin + '.css?' + artDialog.fn.version;
_thisScript.parentNode.insertBefore(link, _thisScript);
};
// 触发浏览器预先缓存背景图片
_$window.bind('load', function () {
setTimeout(function () {
if (_count) return;
artDialog({left: '-9999em',time: 9,fixed: false,lock: false,focus: false});
}, 150);
});
// 开启IE6 CSS背景图片缓存
try {
document.execCommand('BackgroundImageCache', false, true);
} catch (e) {};
// 使用uglifyjs压缩能够预先处理"+"号合并字符串
// uglifyjs: http://marijnhaverbeke.nl/uglifyjs
artDialog._templates =
'<div class="aui_outer">'
+ '<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">'
+ '<div class="aui_title"></div>'
+ '<a class="aui_close" href="javascript:/*artDialog*/;">'
+ '\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>';
/**
* 默认配置
*/
artDialog.defaults = {
// 消息内容
content: '<div class="aui_loading"><span>loading..</span></div>',
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', // 内容与边界填充距离
skin: '', // 皮肤名(预留接口,尚未实现)
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: 1987, // 对话框叠加高度值(重要:此值不能超过浏览器最大限制)
resize: true, // 是否允许用户调节尺寸
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,
_isIE6 = !('minWidth' in _elem.style),
_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._sClientX = event.clientX;
this._sClientY = event.clientY;
this.onstart(event.clientX, event.clientY);
return false;
},
// 正在拖拽
onmove: $.noop,
move: function (event) {
this._mClientX = event.clientX;
this._mClientY = event.clientY;
this.onmove(
event.clientX - this._sClientX,
event.clientY - this._sClientY
);
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 limit, startWidth, startHeight, startLeft, startTop, isResize,
api = artDialog.focus,
//config = api.config,
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) {
if (isResize) {
startWidth = main[0].offsetWidth;
startHeight = main[0].offsetHeight;
} else {
startLeft = wrap[0].offsetLeft;
startTop = wrap[0].offsetTop;
};
_$document.bind('dblclick', _dragEvent.end);
!_isIE6 && _isLosecapture ?
title.bind('losecapture', _dragEvent.end) :
_$window.bind('blur', _dragEvent.end);
_isSetCapture && title[0].setCapture();
wrap.addClass('aui_state_drag');
api.focus();
};
// 对话框拖动进行中
_dragEvent.onmove = function (x, y) {
if (isResize) {
var wrapStyle = wrap[0].style,
style = main[0].style,
width = x + startWidth,
height = y + startHeight;
wrapStyle.width = 'auto';
style.width = Math.max(0, width) + 'px';
wrapStyle.width = wrap[0].offsetWidth + 'px';
style.height = Math.max(0, height) + 'px';
} else {
var style = wrap[0].style,
left = Math.max(limit.minX, Math.min(limit.maxX, x + startLeft)),
top = Math.max(limit.minY, Math.min(limit.maxY, y + startTop));
style.left = left + 'px';
style.top = top + 'px';
};
clsSelect();
api._ie6SelectFix();
};
// 对话框拖动结束
_dragEvent.onend = function (x, y) {
_$document.unbind('dblclick', _dragEvent.end);
!_isIE6 && _isLosecapture ?
title.unbind('losecapture', _dragEvent.end) :
_$window.unbind('blur', _dragEvent.end);
_isSetCapture && title[0].releaseCapture();
_isIE6 && !api.closed && api._autoPositionType();
wrap.removeClass('aui_state_drag');
};
isResize = event.target === DOM.se[0] ? true : false;
limit = (function () {
var maxX, maxY,
wrap = api.DOM.wrap[0],
fixed = wrap.style.position === 'fixed',
ow = wrap.offsetWidth,
oh = wrap.offsetHeight,
ww = _$window.width(),
wh = _$window.height(),
dl = fixed ? 0 : _$document.scrollLeft(),
dt = fixed ? 0 : _$document.scrollTop(),
// 坐标最大值限制
maxX = ww - ow + dl;
maxY = wh - oh + dt;
return {
minX: dl,
minY: dt,
maxX: maxX,
maxY: maxY
};
})();
_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 === DOM.se[0]) {
_dragEvent = _dragEvent || new artDialog.dragEvent();
_use(event);
return false;// 防止firefox与chrome滚屏
};
});
})(this.art || this.jQuery && (this.art = jQuery));