/*!
* artdialog 4.1.6
* date: 2012-07-16 22:57
* 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) {
//if (window.jquery) return jquery;
var $ = window.art = function (selector, context) {
return new $.fn.init(selector, context);
},
readybound = false,
readylist = [],
domcontentloaded,
isopacity = 'opacity' in document.documentelement.style,
quickexpr = /^(?:[^<]*(<[\w\w]+>)[^>]*$|#([\w\-]+)$)/,
rclass = /[\n\t]/g,
ralpha = /alpha\([^)]*\)/i,
ropacity = /opacity=([^)]*)/,
rfxnum = /^([+-]=)?([\d+-.]+)(.*)$/;
if (window.$ === undefined) window.$ = $;
$.fn = $.prototype = {
constructor: $,
/**
* dom 就绪
* @param {function} 回调函数
*/
ready: function (callback) {
$.bindready();
if ($.isready) {
callback.call(document, $);
} else if (readylist) {
readylist.push(callback);
};
return this;
},
/**
* 判断样式类是否存在
* @param {string} 名称
* @return {boolean}
*/
hasclass: function (name) {
var classname = ' ' + name + ' ';
if ((' ' + this[0].classname + ' ').replace(rclass, ' ')
.indexof(classname) > -1) return true;
return false;
},
/**
* 添加样式类
* @param {string} 名称
*/
addclass: function (name) {
if (!this.hasclass(name)) this[0].classname += ' ' + name;
return this;
},
/**
* 移除样式类
* @param {string} 名称
*/
removeclass: function (name) {
var elem = this[0];
if (!name) {
elem.classname = '';
} else
if (this.hasclass(name)) {
elem.classname = elem.classname.replace(name, ' ');
};
return this;
},
/**
* 读写样式
* css(name) 访问第一个匹配元素的样式属性
* css(properties) 把一个"名/值对"对象设置为所有匹配元素的样式属性
* css(name, value) 在所有匹配的元素中,设置一个样式属性的值
*/
css: function (name, value) {
var i, elem = this[0], obj = arguments[0];
if (typeof name === 'string') {
if (value === undefined) {
return $.css(elem, name);
} else {
name === 'opacity' ?
$.opacity.set(elem, value) :
elem.style[name] = value;
};
} else {
for (i in obj) {
i === 'opacity' ?
$.opacity.set(elem, obj[i]) :
elem.style[i] = obj[i];
};
};
return this;
},
/** 显示元素 */
show: function () {
return this.css('display', 'block');
},
/** 隐藏元素 */
hide: function () {
return this.css('display', 'none');
},
/**
* 获取相对文档的坐标
* @return {object} 返回left、top的数值
*/
offset: function () {
var elem = this[0],
box = elem.getboundingclientrect(),
doc = elem.ownerdocument,
body = doc.body,
docelem = doc.documentelement,
clienttop = docelem.clienttop || body.clienttop || 0,
clientleft = docelem.clientleft || body.clientleft || 0,
top = box.top + (self.pageyoffset || docelem.scrolltop) - clienttop,
left = box.left + (self.pagexoffset || docelem.scrollleft) - clientleft;
return {
left: left,
top: top
};
},
/**
* 读写html - (不支持文本框)
* @param {string} 内容
*/
html: function (content) {
var elem = this[0];
if (content === undefined) return elem.innerhtml;
$.cleandata(elem.getelementsbytagname('*'));
elem.innerhtml = content;
return this;
},
/**
* 移除节点
*/
remove: function () {
var elem = this[0];
$.cleandata(elem.getelementsbytagname('*'));
$.cleandata([elem]);
elem.parentnode.removechild(elem);
return this;
},
/**
* 事件绑定
* @param {string} 类型
* @param {function} 要绑定的函数
*/
bind: function (type, callback) {
$.event.add(this[0], type, callback);
return this;
},
/**
* 移除事件
* @param {string} 类型
* @param {function} 要卸载的函数
*/
unbind: function(type, callback) {
$.event.remove(this[0], type, callback);
return this;
}
};
$.fn.init = function (selector, context) {
var match, elem;
context = context || document;
if (!selector) return this;
if (selector.nodetype) {
this[0] = selector;
return this;
};
if (selector === 'body' && context.body) {
this[0] = context.body;
return this;
};
if (selector === 'head' || selector === 'html') {
this[0] = context.getelementsbytagname(selector)[0];
return this;
};
if (typeof selector === 'string') {
match = quickexpr.exec(selector);
if (match && match[2]) {
elem = context.getelementbyid(match[2]);
if (elem && elem.parentnode) this[0] = elem;
return this;
};
};
if (typeof selector === 'function') return $(document).ready(selector);
this[0] = selector;
return this;
};
$.fn.init.prototype = $.fn;
/** 空函数 */
$.noop = function () {};
/** 检测window */
$.iswindow = function (obj) {
return obj && typeof obj === 'object' && 'setinterval' in obj;
};
/** 数组判定 */
$.isarray = function (obj) {
return object.prototype.tostring.call(obj) === '[object array]';
};
/**
* 搜索子元素
* 注意:只支持nodename或.classname的形式,并且只返回第一个元素
* @param {string}
*/
$.fn.find = function (expr) {
var value, elem = this[0],
classname = expr.split('.')[1];
if (classname) {
if (document.getelementsbyclassname) {
value = elem.getelementsbyclassname(classname);
} else {
value = getelementsbyclassname(classname, elem);
};
} else {
value = elem.getelementsbytagname(expr);
};
return $(value[0]);
};
function getelementsbyclassname (classname, node, tag) {
node = node || document;
tag = tag || '*';
var i = 0,
j = 0,
classelements = [],
els = node.getelementsbytagname(tag),
elslen = els.length,
pattern = new regexp("(^|\\s)" + classname + "(\\s|$)");
for (; i < elslen; i ++) {
if (pattern.test(els[i].classname)) {
classelements[j] = els[i];
j ++;
};
};
return classelements;
};
/**
* 遍历
* @param {object}
* @param {function}
*/
$.each = function (obj, callback) {
var name, i = 0,
length = obj.length,
isobj = length === undefined;
if (isobj) {
for (name in obj) {
if (callback.call(obj[name], name, obj[name]) === false) break;
};
} else {
for (var value = obj[0];
i < length && callback.call(value, i, value) !== false;
value = obj[++i]) {};
};
return obj;
};
/**
* 读写缓存
* @param {htmlelement} 元素
* @param {string} 缓存名称
* @param {any} 数据
* @return {any} 如果无参数data则返回缓存数据
*/
$.data = function (elem, name, data) {
var cache = $.cache,
id = uuid(elem);
if (name === undefined) return cache[id];
if (!cache[id]) cache[id] = {};
if (data !== undefined) cache[id][name] = data;
return cache[id][name];
};
/**
* 删除缓存
* @param {htmlelement} 元素
* @param {string} 缓存名称
*/
$.removedata = function (elem, name) {
var empty = true,
expando = $.expando,
cache = $.cache,
id = uuid(elem),
thiscache = id && cache[id];
if (!thiscache) return;
if (name) {
delete thiscache[name];
for (var n in thiscache) empty = false;
if (empty) delete $.cache[id];
} else {
delete cache[id];
if (elem.removeattribute) {
elem.removeattribute(expando);
} else {
elem[expando] = null;
};
};
};
$.uuid = 0;
$.cache = {};
$.expando = '@cache' + + new date
// 标记元素唯一身份
function uuid (elem) {
var expando = $.expando,
id = elem === window ? 0 : elem[expando];
if (id === undefined) elem[expando] = id = ++ $.uuid;
return id;
};
/**
* 事件机制
* @namespace
* @requires [$.data, $.removedata]
*/
$.event = {
/**
* 添加事件
* @param {htmlelement} 元素
* @param {string} 事件类型
* @param {function} 要添加的函数
*/
add: function (elem, type, callback) {
var cache, listeners,
that = $.event,
data = $.data(elem, '@events') || $.data(elem, '@events', {});
cache = data[type] = data[type] || {};
listeners = cache.listeners = cache.listeners || [];
listeners.push(callback);
if (!cache.handler) {
cache.elem = elem;
cache.handler = that.handler(cache);
elem.addeventlistener
? elem.addeventlistener(type, cache.handler, false)
: elem.attachevent('on' + type, cache.handler);
};
},
/**
* 卸载事件
* @param {htmlelement} 元素
* @param {string} 事件类型
* @param {function} 要卸载的函数
*/
remove: function (elem, type, callback) {
var i, cache, listeners,
that = $.event,
empty = true,
data = $.data(elem, '@events');
if (!data) return;
if (!type) {
for (i in data) that.remove(elem, i);
return;
};
cache = data[type];
if (!cache) return;
listeners = cache.listeners;
if (callback) {
for (i = 0; i < listeners.length; i ++) {
listeners[i] === callback && listeners.splice(i--, 1);
};
} else {
cache.listeners = [];
};
if (cache.listeners.length === 0) {
elem.removeeventlistener
? elem.removeeventlistener(type, cache.handler, false)
: elem.detachevent('on' + type, cache.handler);
delete data[type];
cache = $.data(elem, '@events');
for (var n in cache) empty = false;
if (empty) $.removedata(elem, '@events');
};
},
/** @inner 事件句柄 */
handler: function (cache) {
return function (event) {
event = $.event.fix(event || window.event);
for (var i = 0, list = cache.listeners, fn; fn = list[i++];) {
if (fn.call(cache.elem, event) === false) {
event.preventdefault();
event.stoppropagation();
};
};
};
},
/** @inner event对象兼容处理 */
fix: function (event) {
if (event.target) return event;
var event2 = {
target: event.srcelement || document,
preventdefault: function () {event.returnvalue = false},
stoppropagation: function () {event.cancelbubble = true}
};
// ie6/7/8 在原生window.event对象写入数据会导致内存无法回收,应当采用拷贝
for (var i in event) event2[i] = event[i];
return event2;
}
};
/**
* 清理元素集的事件与缓存
* @requires [$.removedata, $.event]
* @param {htmlcollection} 元素集
*/
$.cleandata = function (elems) {
var i = 0, elem,
len = elems.length,
removeevent = $.event.remove,
removedata = $.removedata;
for (; i < len; i ++) {
elem = elems[i];
removeevent(elem);
removedata(elem);
};
};
// dom就绪事件
$.isready = false;
$.ready = function () {
if (!$.isready) {
if (!document.body) return settimeout($.ready, 13);
$.isready = true;
if (readylist) {
var fn, i = 0;
while ((fn = readylist[i++])) {
fn.call(document, $);
};
readylist = null;
};
};
};
$.bindready = function () {
if (readybound) return;
readybound = true;
if (document.readystate === 'complete') {
return $.ready();
};
if (document.addeventlistener) {
document.addeventlistener('domcontentloaded', domcontentloaded, false);
window.addeventlistener('load', $.ready, false);
} else if (document.attachevent) {
document.attachevent('onreadystatechange', domcontentloaded);
window.attachevent('onload', $.ready);
var toplevel = false;
try {
toplevel = window.frameelement == null;
} catch (e) {};
if (document.documentelement.doscroll && toplevel) {
doscrollcheck();
};
};
};
if (document.addeventlistener) {
domcontentloaded = function () {
document.removeeventlistener('domcontentloaded', domcontentloaded, false);
$.ready();
};
} else if (document.attachevent) {
domcontentloaded = function () {
if (document.readystate === 'complete') {
document.detachevent('onreadystatechange', domcontentloaded);
$.ready();
};
};
};
function doscrollcheck () {
if ($.isready) return;
try {
document.documentelement.doscroll('left');
} catch (e) {
settimeout(doscrollcheck, 1);
return;
};
$.ready();
};
// 获取css
$.css = 'defaultview' in document && 'getcomputedstyle' in document.defaultview ?
function (elem, name) {
return document.defaultview.getcomputedstyle(elem, false)[name];
} :
function (elem, name) {
var ret = name === 'opacity' ? $.opacity.get(elem) : elem.currentstyle[name];
return ret || '';
};
// 跨浏览器处理opacity
$.opacity = {
get: function (elem) {
return isopacity ?
document.defaultview.getcomputedstyle(elem, false).opacity :
ropacity.test((elem.currentstyle
? elem.currentstyle.filter
: elem.style.filter) || '')
? (parsefloat(regexp.$1) / 100) + ''
: 1;
},
set: function (elem, value) {
if (isopacity) return elem.style.opacity = value;
var style = elem.style;
style.zoom = 1;
var opacity = 'alpha(opacity=' + value * 100 + ')',
filter = style.filter || '';
style.filter = ralpha.test(filter) ?
filter.replace(ralpha, opacity) :
style.filter + ' ' + opacity;
}
};
/**
* 获取滚动条位置 - [不支持写入]
* $.fn.scrollleft, $.fn.scrolltop
* @example 获取文档垂直滚动条:$(document).scrolltop()
* @return {number} 返回滚动条位置
*/
$.each(['left', 'top'], function (i, name) {
var method = 'scroll' + name;
$.fn[method] = function () {
var elem = this[0], win;
win = getwindow(elem);
return win ?
('pagexoffset' in win) ?
win[i ? 'pageyoffset' : 'pagexoffset'] :
win.document.documentelement[method] || win.document.body[method] :
elem[method];
};
});
function getwindow (elem) {
return $.iswindow(elem) ?
elem :
elem.nodetype === 9 ?
elem.defaultview || elem.parentwindow :
false;
};
/**
* 获取窗口或文档尺寸 - [只支持window与document读取]
* @example
获取文档宽度:$(document).width()
获取可视范围:$(window).width()
* @return {number}
*/
$.each(['height', 'width'], function (i, name) {
var type = name.tolowercase();
$.fn[type] = function (size) {
var elem = this[0];
if (!elem) {
return size == null ? null : this;
};
return $.iswindow(elem) ?
elem.document.documentelement['client' + name] || elem.document.body['client' + name] :
(elem.nodetype === 9) ?
math.max(
elem.documentelement['client' + name],
elem.body['scroll' + name], elem.documentelement['scroll' + name],
elem.body['offset' + name], elem.documentelement['offset' + name]
) : null;
};
});
/**
* 简单ajax支持
* @example
* $.ajax({
* url: url,
* success: callback,
* cache: cache
* });
*/
$.ajax = function (config) {
var ajax = window.xmlhttprequest ?
new xmlhttprequest() :
new activexobject('microsoft.xmlhttp'),
url = config.url;
if (config.cache === false) {
var ts = + new date,
ret = url.replace(/([?&])_=[^&]*/, "$1_=" + ts );
url = ret + ((ret === url) ? (/\?/.test(url) ? "&" : "?") + "_=" + ts : "");
};
ajax.onreadystatechange = function() {
if (ajax.readystate === 4 && ajax.status === 200) {
config.success && config.success(ajax.responsetext);
ajax.onreadystatechange = $.noop;
};
};
ajax.open('get', url, 1);
ajax.send(null);
};
/** 动画引擎 - [不支持链式列队操作] */
$.fn.animate = function (prop, speed, easing, callback) {
speed = speed || 400;
if (typeof easing === 'function') callback = easing;
easing = easing && $.easing[easing] ? easing : 'swing';
var elem = this[0], overflow,
fx, parts, start, end, unit,
opt = {
speed: speed,
easing: easing,
callback: function () {
if (overflow != null) elem.style.overflow = '';
callback && callback();
}
};
opt.curanim = {};
$.each(prop, function (name, val) {
opt.curanim[name] = val;
});
$.each(prop, function (name, val) {
fx = new $.fx(elem, opt, name);
parts = rfxnum.exec(val);
start = parsefloat(name === 'opacity'
|| (elem.style && elem.style[name] != null) ?
$.css(elem, name) :
elem[name]);
end = parsefloat(parts[2]);
unit = parts[3];
if (name === 'height' || name === 'width') {
end = math.max(0, end);
overflow = [elem.style.overflow,
elem.style.overflowx, elem.style.overflowy];
};
fx.custom(start, end, unit);
});
if (overflow != null) elem.style.overflow = 'hidden';
return this;
};
$.timers = [];
$.fx = function (elem, options, prop) {
this.elem = elem;
this.options = options;
this.prop = prop;
};
$.fx.prototype = {
custom: function (from, to, unit) {
var that = this;
that.starttime = $.fx.now();
that.start = from;
that.end = to;
that.unit = unit;
that.now = that.start;
that.state = that.pos = 0;
function t() {
return that.step();
};
t.elem = that.elem;
t();
$.timers.push(t);
if (!$.timerid) $.timerid = setinterval($.fx.tick, 13);
},
step: function () {
var that = this, t = $.fx.now(), done = true;
if (t >= that.options.speed + that.starttime) {
that.now = that.end;
that.state = that.pos = 1;
that.update();
that.options.curanim[that.prop] = true;
for (var i in that.options.curanim) {
if (that.options.curanim[i] !== true) {
done = false;
};
};
if (done) that.options.callback.call(that.elem);
return false;
} else {
var n = t - that.starttime;
that.state = n / that.options.speed;
that.pos = $.easing[that.options.easing](that.state, n, 0, 1, that.options.speed);
that.now = that.start + ((that.end - that.start) * that.pos);
that.update();
return true;
};
},
update: function () {
var that = this;
if (that.prop === 'opacity') {
$.opacity.set(that.elem, that.now);
} else
if (that.elem.style && that.elem.style[that.prop] != null) {
that.elem.style[that.prop] = that.now + that.unit;
} else {
that.elem[that.prop] = that.now;
};
}
};
$.fx.now = function () {
return + new date;
};
$.easing = {
linear: function (p, n, firstnum, diff) {
return firstnum + diff * p;
},
swing: function (p, n, firstnum, diff) {
return ((-math.cos(p * math.pi) / 2) + 0.5) * diff + firstnum;
}
};
$.fx.tick = function () {
var timers = $.timers;
for (var i = 0; i < timers.length; i++) {
!timers[i]() && timers.splice(i--, 1);
};
!timers.length && $.fx.stop();
};
$.fx.stop = function () {
clearinterval($.timerid);
$.timerid = null;
};
$.fn.stop = function () {
var timers = $.timers;
for (var i = timers.length - 1; i >= 0; i--) {
if (timers[i].elem === this[0]) timers.splice(i, 1);
};
return this;
};
//-------------end
return $}(window));
//------------------------------------------------
// 对话框模块
//------------------------------------------------
;(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();
art.phpcms_api = art.phpcms_api || [];
var that_api = art.phpcms_api[config.id];
if (typeof that_api == 'object' && api) {
api.data = {};
api.data.iframe = that_api
};
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.6',
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, config.iframe)
.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,url) {
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._reset(1);
iframe = null,
isiframe = typeof url == 'string' && url != '',
iframrid = 'atrdialogiframe_' + that.config.id;
if (isiframe) {
if (typeof pc_hash == 'string') url += (url.indexof('?') > -1 ? '&': '?') + 'pc_hash=' + pc_hash;
iframe = document.createelement('iframe');
iframe.setattribute("frameborder", 0, 0);
iframe.setattribute("width", that.config.width);
iframe.setattribute("height", that.config.height);
iframe.setattribute("padding", '0');
iframe.setattribute("id", iframrid);
iframe.src = url;
that.dom.content.css('padding', "5px 0px");
var _width = parseint(that.config.width)+5;
that.dom.content.css('width', _width);
that.dom.content.css('height', that.config.height);
msg = iframe;
};
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';
//content.focus();
//alert('1');
if (isiframe) art.phpcms_api[that.config.id] = msg.contentwindow
};
// 新增内容后调整位置
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;
//alert(height);
if (typeof height === 'number') {
style.height = math.max(that.config.minheight, height) + 'px';
} else if (typeof height === 'string') {
style.height = height;
//height === 'auto' && wrap.css('height', 'auto');
};
};
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)) 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 {
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(
'');
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内部
//
_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 =
'
' + ' | ' + ' | ' + ' | ||||||
' + ' | '
+ ' '
+ ' '
+ '
| '
+ '' + ' | ||||||
' + ' | ' + ' | ' + ' |