Skip to content

Instantly share code, notes, and snippets.

@altair21
Created November 9, 2016 04:39
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save altair21/26782d29d30a9bf943d470191444464b to your computer and use it in GitHub Desktop.
Save altair21/26782d29d30a9bf943d470191444464b to your computer and use it in GitHub Desktop.
多说 UA
//HelloDog - http://wsgzao.github.io/post/duoshuo/
//More info: http://moxfive.xyz/2015/09/29/duosuo-style
//移动客户端判断开始
function checkMobile() {
var isiPad = navigator.userAgent.match(/iPad/i) != null;
if (isiPad) {
return false;
}
var isMobile = navigator.userAgent.match(/iphone|android|phone|mobile|wap|netfront|java|opera mobi|opera mini|ucweb|windows ce|symbian|symbianos|series|webos|sony|blackberry|dopod|nokia|samsung|palmsource|xda|pieplus|meizu|midp|cldc|motorola|foma|docomo|up.browser|up.link|blazer|helio|hosin|huawei|novarra|coolpad|webos|techfaith|palmsource|alcatel|amoi|ktouch|nexian|ericsson|philips|sagem|wellcom|bunjalloo|maui|smartphone|iemobile|spice|bird|zte-|longcos|pantech|gionee|portalmmm|jig browser|hiptop|benq|haier|^lct|320x320|240x320|176x220/i) != null;
if (isMobile) {
return true;
}
return false;
}
//移动客户端判断结束
//管理员判断开始
function sskadmin(e) {
var ssk = '';
if (e.user_id == 9483167) {
if (checkMobile()) {
ssk = '<span class="ua"><span class="sskadmin">博主</span></span><br><br>';
} else {
ssk = '<span class="ua"><span class="sskadmin">博主</span></span>';
}
} else {
if (checkMobile()) {
ssk = '<br><br>';
}
}
return ssk;
}
//管理员判断结束
//显UA开始
function ua(e) {
var r = new Array;
var outputer = '';
if (r = e.match(/FireFox\/([^\s]+)/ig)) {
var r1 = r[0].split("/");
outputer = '<span class="ua_firefox"><i class="fa fa-firefox"></i>Mozilla FireFox' + ' ' + r1[1];
} else if (r = e.match(/Maxthon([\d]*)\/([^\s]+)/ig)) {
var r1 = r[0].split("/");
outputer = '<span class="ua_maxthon"><i class="fa fa-globe"></i> Maxthon'
} else if (r = e.match(/BIDUBrowser([\d]*)\/([^\s]+)/ig)) {
var r1 = r[0].split("/");
outputer = '<span class="ua_ucweb"><i class="fa fa-globe"></i> 百度浏览器'
} else if (r = e.match(/UBrowser([\d]*)\/([^\s]+)/ig)) {
var r1 = r[0].split("/");
outputer = '<span class="ua_ucweb"><i class="fa fa-globe"></i> UCBrowser' + ' ' + r1[1];
} else if (r = e.match(/UCBrowser([\d]*)\/([^\s]+)/ig)) {
var r1 = r[0].split("/");
outputer = '<span class="ua_ucweb"><i class="fa fa-globe"></i> UCBrowser' + ' ' + r1[1];
} else if (r = e.match(/MetaSr/ig)) {
outputer = '<span class="ua_sogou"><i class="fa fa-globe"></i> 搜狗浏览器'
} else if (r = e.match(/2345Explorer/ig)) {
outputer = '<span class="ua_2345explorer"><i class="fa fa-globe"></i> 2345王牌浏览器'
} else if (r = e.match(/2345chrome/ig)) {
outputer = '<span class="ua_2345chrome"><i class="fa fa-globe"></i> 2345加速浏览器'
} else if (r = e.match(/LBBROWSER/ig)) {
outputer = '<span class="ua_lbbrowser"><i class="fa fa-globe"></i> 猎豹安全浏览器'
} else if (r = e.match(/MicroMessenger\/([^\s]+)/ig)) {
var r1 = r[0].split("/");
outputer = '<span class="ua_qq"><i class="fa fa-weixin"></i> 微信' + ' ' + r1[1];
/*.split('/')[0]*/
} else if (r = e.match(/QQBrowser\/([^\s]+)/ig)) {
var r1 = r[0].split("/");
outputer = '<span class="ua_qq"><i class="fa fa-qq"></i> QQ浏览器' + ' ' + r1[1];
/*.split('/')[0]*/
} else if (r = e.match(/QQ\/([^\s]+)/ig)) {
var r1 = r[0].split("/");
outputer = '<span class="ua_qq"><i class="fa fa-qq"></i> QQ浏览器' + ' ' + r1[1];
/*.split('/')[0]*/
} else if (r = e.match(/MiuiBrowser\/([^\s]+)/ig)) {
var r1 = r[0].split("/");
outputer = '<span class="ua_mi"><i class="fa fa-globe"></i> Miui浏览器' + ' ' + r1[1];
/*.split('/')[0]*/
} else if (r = e.match(/Chrome([\d]*)\/([^\s]+)/ig)) {
var r1 = r[0].split("/");
outputer = '<span class="ua_chrome"><i class="fa fa-chrome"></i> Chrome' + ' ' + r1[1];
/*.split('.')[0]*/
} else if (r = e.match(/version\/([\w.]+)/ig)) {
var r1 = r[0].split("/");
outputer = '<span class="ua_apple"><i class="fa fa-safari"></i> Safari' + ' ' + r1[1];
} else if (r = e.match(/Opera[\s|\/]([^\s]+)/ig)) {
var r1 = r[0].split("/");
outputer = '<span class="ua_opera"><i class="fa fa-opera"></i> Opera' + ' ' + r1[1];
} else if (r = e.match(/Trident\/7.0/gi)) {
outputer = '<span class="ua_ie"><i class="fa fa-internet-explorer"></i> IE 11'
} else if (r = e.match(/MSIE\s([^\s|;]+)/gi)) {
outputer = '<span class="ua_ie"><i class="fa fa-internet-explorer"></i> IE' + ' ' + r[0]
/*.replace('MSIE', '').split('.')[0]*/
} else {
outputer = '<span class="ua_other"><i class="fa fa-globe"></i> 其它浏览器'
}
if (checkMobile()) {
Mobile = '<br><br>';
} else {
Mobile = '';
}
return outputer + "</span>" + Mobile;
}
function os(e) {
var os = '';
if (e.match(/win/ig)) {
if (e.match(/nt 5.1/ig)) {
os = '<span class="os_xp"><i class="fa fa-windows"></i> Windows XP'
} else if (e.match(/nt 6.1/ig)) {
os = '<span class="os_7"><i class="fa fa-windows"></i> Windows 7'
} else if (e.match(/nt 6.2/ig)) {
os = '<span class="os_8"><i class="fa fa-windows"></i> Windows 8'
} else if (e.match(/nt 6.3/ig)) {
os = '<span class="os_8_1"><i class="fa fa-windows"></i> Windows 8.1'
} else if (e.match(/nt 10.0/ig)) {
os = '<span class="os_8_1"><i class="fa fa-windows"></i> Windows 10'
} else if (e.match(/nt 6.0/ig)) {
os = '<span class="os_vista"><i class="fa fa-windows"></i> Windows Vista'
} else if (e.match(/nt 5/ig)) {
os = '<span class="os_2000"><i class="fa fa-windows"></i> Windows 2000'
} else {
os = '<span class="os_windows"><i class="fa fa-windows"></i> Windows'
}
} else if (e.match(/android/ig)) {
os = '<span class="os_android"><i class="fa fa-android"></i> Android'
} else if (e.match(/ubuntu/ig)) {
os = '<span class="os_ubuntu"><i class="fa fa-desktop"></i> Ubuntu'
} else if (e.match(/linux/ig)) {
os = '<span class="os_linux"><i class="fa fa-linux"></i> Linux'
} else if (e.match(/mac/ig)) {
os = '<span class="os_mac"><i class="fa fa-apple"></i> Mac OS X'
} else if (e.match(/unix/ig)) {
os = '<span class="os_unix"><i class="fa fa-desktop"></i> Unix'
} else if (e.match(/symbian/ig)) {
os = '<span class="os_nokia"><i class="fa fa-mobile"></i> Nokia SymbianOS'
} else {
os = '<span class="os_other"><i class="fa fa-desktop"></i> 其它操作系统'
}
return os + "</span>";
}
//显UA结束
(function(e, t, n) {
function at(e, t) {
for (var n in t) t[n] && (e[n] ? e[n].set(t[n]) : e[n] = new et(t[n]))
}
function ft(e, t) {
for (var n in t) e[n] = t[n]
}
function lt() {
if (u.checkPermission()) return;
var t;
while (t = O.shift()) {
var n = u.createNotification(t.iconUrl, t.title, t.body),
i = t.url;
try {
n.onclick = function() {
e.focus(),
r.href = i,
n.cancel()
}
} catch(s) {}
n.show(),
setTimeout(function() {
n.cancel && n.cancel()
},
8e3)
}
}
function ct() {
return rt.data.user_id == 0
}
function ht(e, t, n) {
if (o) try {
o.removeItem(e),
o.removeItem(e + ":timestamp"),
o[e] = i.stringify(t),
o[e + ":timestamp"] = Math.floor(n)
} catch(r) {}
}
function pt(e) {
w.theme = e,
e != "none" && w.injectStylesheet(b + "/styles/embed" + (e ? "." + e + ".css?" + y[e] : "." + short_name) + ".css")
}
if (e.DUOSHUO) return;
var r = e.location,
i = e.JSON,
s = e.XMLHttpRequest,
o = i && i.stringify && e.localStorage,
u = e.webkitNotifications,
a = t.getElementsByTagName("head")[0] || t.getElementsByTagName("body")[0],
f = e.navigator.userAgent,
l = t.location.protocol == "https:" ? "https:": "http:",
c = 0,
h,
p = function() {
var e = {
"<": "&lt;",
">": "&gt;",
'"': "&quot;",
"'": "&#x27;",
"`": "&#x60;"
},
t = /&(?!\w+;)|[<>"'`]/g,
n = /[&<>"'`]/,
r = function(t) {
return e[t] || "&amp;"
};
return function(e) {
return e == null || e === !1 ? "": n.test(e) ? e.replace(t, r) : e
}
} (),
d = function(e) {
if (e.match(/^(http|https):/)) return e;
var n = t.createElement("a");
return n.href = e,
x.hrefNormalized ? n.href: n.getAttribute("href", 4)
},
v = {
start: 0,
end: 0
},
m = function(e) {
var n = this,
r = 0,
i = 0,
s, o, u, a, f;
t.selection && (o = t.selection.createRange(), o && o.parentElement() == n && (a = n.value.length, s = n.value.replace(/\r\n/g, "\n"), u = n.createTextRange(), u.moveToBookmark(o.getBookmark()), f = n.createTextRange(), f.collapse(!1), u.compareEndPoints("StartToEnd", f) > -1 ? r = i = a: (r = -u.moveStart("character", -a), r += s.slice(0, r).split("\n").length - 1, u.compareEndPoints("EndToEnd", f) > -1 ? i = a: (i = -u.moveEnd("character", -a), i += s.slice(0, i).split("\n").length - 1)))),
v.start = r,
v.end = i
},
g = function(e) {
return function() {
return e
}
},
y = {
"default": "d6149e1c",
dark: "c11b5925",
bluebox: "dbc0a9af"
},
b = l + "//static.duoshuo.com",
w = e.DUOSHUO = {
DOMAIN: "duoshuo.com",
REMOTE: "http://duoshuo.com",
version: 140327,
loaded: {
jQuery: typeof jQuery != "undefined" && jQuery.fn.jquery >= "1.5",
smilies: !1,
mzadxN: typeof mzadxN != "undefined"
},
libs: {
jQuery: b + "/libs/embed.compat.js?24f8ca3f.js",
smilies: b + "/libs/smilies.js?921e8eda.js",
mzadxN: "http://js.miaozhen.com/mz_ad_serving.js"
},
sourceName: {
weibo: "\u65b0\u6d6a\u5fae\u535a",
qq: "QQ",
qzone: "QQ\u7a7a\u95f4",
qqt: "\u817e\u8baf\u5fae\u535a",
renren: "\u4eba\u4eba\u7f51",
douban: "\u8c46\u74e3\u7f51",
netease: "\u7f51\u6613\u5fae\u535a",
kaixin: "\u5f00\u5fc3\u7f51",
sohu: "\u641c\u72d0\u5fae\u535a",
baidu: "\u767e\u5ea6",
taobao: "\u6dd8\u5b9d",
msn: "MSN",
google: "\u8c37\u6b4c"
},
serviceNames: {
weibo: "\u5fae\u535a",
qq: "QQ",
douban: "\u8c46\u74e3",
renren: "\u4eba\u4eba",
netease: "\u7f51\u6613",
kaixin: "\u5f00\u5fc3",
sohu: "\u641c\u72d0",
baidu: "\u767e\u5ea6",
taobao: "\u6dd8\u5b9d",
msn: "MSN",
google: "\u8c37\u6b4c"
},
parseDate: function(e) {
return e.parse("2011-10-28T00:00:00+08:00") &&
function(t) {
return new e(t)
} || e.parse("2011/10/28T00:00:00+0800") &&
function(t) {
return new e(t.replace(/-/g, "/").replace(/:(\d\d)$/, "$1"))
} || e.parse("2011/10/28 00:00:00+0800") &&
function(t) {
return new e(t.replace(/-/g, "/").replace(/:(\d\d)$/, "$1").replace("T", " "))
} ||
function(t) {
return new e(t)
}
} (Date),
fullTime: function(e) {
var t = w.parseDate(e);
return t.getFullYear() + "\u5e74" + (t.getMonth() + 1) + "\u6708" + t.getDate() + "\u65e5 " + t.toLocaleTimeString()
},
elapsedTime: function(e) {
var t = w.parseDate(e),
n = new Date,
r = (n - c - t) / 1e3;
return r < 10 ? "\u521a\u521a": r < 60 ? Math.round(r) + "\u79d2\u524d": r < 3600 ? Math.round(r / 60) + "\u5206\u949f\u524d": r < 86400 ? Math.round(r / 3600) + "\u5c0f\u65f6\u524d": (n.getFullYear() == t.getFullYear() ? "": t.getFullYear() + "\u5e74") + (t.getMonth() + 1) + "\u6708" + t.getDate() + "\u65e5"
},
require: function(e, t) {
if (typeof e == "string") w.loaded[e] ? t() : F(w.libs[e],
function() {
w.loaded[e] = !0,
t()
});
else if (typeof e == "object") {
var n, r = !0;
for (n = 0; n < e.length; n++)(function(i) {
if (w.loaded[e[n]]) return;
r = !1,
F(w.libs[i],
function() {
w.loaded[i] = !0;
for (var n = 0; n < e.length; n++) if (!w.loaded[e[n]]) return;
t()
})
})(e[n]);
r && t()
}
},
getCookie: function(e) {
var r = " " + e + "=",
i = t.cookie.split(";"),
s = 0,
o,
u,
a;
for (; s < i.length; s++) {
o = " " + i[s],
u = o.indexOf(r);
if (u >= 0 && u + r.length == (a = o.indexOf("=") + 1)) return decodeURIComponent(o.substring(a, o.length).replace(/\+/g, ""))
}
return n
},
param: function(e) {
var t = [];
for (var r in e) e[r] != n && t.push(r + "=" + encodeURIComponent(e[r]));
return t.join("&")
},
ajax: function(e, t, r, o, u) {
var a = w.getCookie("duoshuo_token");
r.v = w.version,
a ? r.jwt = a: z.remote_auth && (r.remote_auth = z.remote_auth);
if (s && i && i.parse) {
var f = new s;
if ( !! f && "withCredentials" in f) {
var l;
function c(e, t, n, r) {
var s, a, f, l = t;
if (e >= 200 && e < 300 || e === 304) if (e === 304) l = "notmodified",
s = !0;
else try {
a = i.parse(n),
l = "success",
s = !0
} catch(c) {
l = "parsererror",
f = c
} else {
f = l;
if (!l || e) l = "error",
e < 0 && (e = 0);
try {
a = i.parse(n)
} catch(c) {
l = "parsererror",
f = c
}
}
s ? o(a) : l === "parseerror" ? I("\u89e3\u6790\u9519\u8bef: " + n) : (u && u(a), I("\u51fa\u9519\u5566(" + a.code + "): " + a.errorMessage), a.errorTrace && I(a.errorTrace))
}
f.open(e, w.hostUrl + t + ".json" + (e == "GET" ? "?" + w.param(r) : ""), !0),
f.withCredentials = !0,
f.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"),
f.send(e == "GET" ? null: w.param(r)),
l = function(e, t) {
var r, i, s, o;
try {
if (l && (t || f.readyState === 4)) {
l = n;
if (t) f.readyState !== 4 && f.abort();
else {
r = f.status,
s = f.getAllResponseHeaders();
try {
o = f.responseText
} catch(e) {}
try {
i = f.statusText
} catch(u) {
i = ""
}
}
}
} catch(a) {
t || c( - 1, a)
}
o && c(r, i, o, s)
},
f.readyState === 4 ? l() : f.onreadystatechange = l;
return
}
}
e != "GET" && (r._method = "POST");
var h = "cb_" + Math.round(Math.random() * 1e6);
w[h] = function(e) {
switch (e.code) {
case 0:
o(e);
break;
default:
u && u(e),
I("\u51fa\u9519\u5566(" + e.code + "): " + e.errorMessage),
e.errorTrace && I(e.errorTrace)
}
},
r.callback = "DUOSHUO['" + h + "']",
F(w.hostUrl + t + ".jsonp?" + w.param(r))
},
injectStylesheet: function(e) {
var n = t.createElement("link");
n.type = "text/css",
n.rel = "stylesheet",
n.href = e,
a.appendChild(n)
},
setCustomStyle: function(e) {
h || (h = t.createElement("style"), h.type = "text/css", a.appendChild(h)),
e = e.replace(/\}/g, "}\n");
if (h.styleSheet) h.styleSheet.cssText = e;
else {
while (h.firstChild) h.removeChild(h.firstChild);
h.appendChild(t.createTextNode(e))
}
},
compileStyle: function(e) {
var t = "",
n = {
textbox: "#ds-thread #ds-reset .ds-replybox .ds-textarea-wrapper"
};
if (e) for (var r in e) t += n[r] + "{" + e[r] + "}\n";
return t
},
init: function(e, t) {
e && !N[e] && (N[e] = t || {
type: "EmbedThread"
}),
w.initView && w.initView()
}
},
E = t.all,
S,
x = w.support = function() {
var n = t.createElement("div");
n.innerHTML = '<a href="/a">a</a><input type="checkbox"/>';
var i = n.getElementsByTagName("a")[0],
o = n.getElementsByTagName("input")[0],
u = {
placeholder: "placeholder" in o,
touch: "ontouchstart" in e || "onmsgesturechange" in e,
hrefNormalized: i.getAttribute("href") === "/a",
iOS: f.match(/ \((iPad|iPhone|iPod);( U;)? CPU( iPhone)? OS /),
android: f.match(/ \(Linux; U; Android /)
};
return S = !s && typeof n.style.maxHeight == "undefined",
u.authInWin = e.postMessage && e.screen.width > 800 && !u.iOS && !u.android && r.origin,
u
} (),
T = function(e, n) {
var r = (t.body || t.documentElement).style;
if (typeof r == "undefined") return ! 1;
if (typeof r[e] == "string") return n ? e: !0;
var i = ["Moz", "Webkit", "ms"],
e = e.charAt(0).toUpperCase() + e.substr(1),
s = 0;
for (; s < i.length; s++) if (typeof r[i[s] + e] == "string") return n ? i[s] + e: !0
},
N = w.selectors = {
".ds-thread": {
type: "EmbedThread"
},
".ds-recent-comments": {
type: "RecentComments"
},
".ds-recent-visitors": {
type: "RecentVisitors"
},
".ds-top-users": {
type: "TopUsers"
},
".ds-top-threads": {
type: "TopThreads"
},
".ds-login": {
type: "LoginWidget"
},
".ds-thread-count": {
type: "ThreadCount"
}
},
C = w.pagelets = [],
k = {
post: "\u53d1\u5e03",
posting: "\u6b63\u5728\u53d1\u5e03",
settings: "\u8bbe\u7f6e",
reply: "\u56de\u590d",
like: "\u9876",
repost: "\u8f6c\u53d1",
report: "\u4e3e\u62a5",
"delete": "\u5220\u9664",
reply_to: "\u56de\u590d ",
reposts: "\u8f6c\u53d1",
comments: "\u8bc4\u8bba",
floor: "\u697c",
latest: "\u6700\u65b0",
earliest: "\u6700\u65e9",
hottest: "\u6700\u70ed",
share_to: "\u5206\u4eab\u5230:",
leave_a_message: "\u8bf4\u70b9\u4ec0\u4e48\u5427\u2026",
no_comments_yet: "\u8fd8\u6ca1\u6709\u8bc4\u8bba\uff0c\u6c99\u53d1\u7b49\u4f60\u6765\u62a2",
repost_reason: "\u8bf7\u8f93\u5165\u8f6c\u53d1\u7406\u7531",
hot_posts_title: "\u88ab\u9876\u8d77\u6765\u7684\u8bc4\u8bba",
comments_zero: "\u6682\u65e0\u8bc4\u8bba",
comments_one: "1\u6761\u8bc4\u8bba",
comments_multiple: "{num}\u6761\u8bc4\u8bba",
reposts_zero: "\u6682\u65e0\u8f6c\u53d1",
reposts_one: "1\u6761\u8f6c\u53d1",
reposts_multiple: "{num}\u6761\u8f6c\u53d1",
weibo_reposts_zero: "\u6682\u65e0\u65b0\u6d6a\u5fae\u535a",
weibo_reposts_one: "1\u6761\u65b0\u6d6a\u5fae\u535a",
weibo_reposts_multiple: "{num}\u6761\u65b0\u6d6a\u5fae\u535a",
qqt_reposts_zero: "\u6682\u65e0\u817e\u8baf\u5fae\u535a",
qqt_reposts_one: "1\u6761\u817e\u8baf\u5fae\u535a",
qqt_reposts_multiple: "{num}\u6761\u817e\u8baf\u5fae\u535a"
},
L = function(e, t, n, r) {
w.ajax("GET", e, t, n ||
function() {},
r)
},
A = function(e, t, n, r) {
w.ajax("POST", e, t, n ||
function() {},
r)
},
O = [],
M,
_ = [],
D = function(t) {
if (! ("WebSocket" in e && i)) return ! 1;
_.push(i.stringify(t)),
M || (M = w.webSocket = new WebSocket("ws://ws.duoshuo.com:8201/"), M.onopen = function() {
var e;
if (M.readyState === 1) while (e = _.shift()) M.send(e)
},
M.onmessage = function(e) {
try {
var t = 0,
n, r = i.parse(e.data)
} catch(s) {
return
}
switch (r.type) {
case "post":
for (; t < w.pagelets.length; t++) n = w.pagelets[t],
n.threadId == r.thread_id && n.onMessage(r);
break;
case "notification":
O.push(r),
lt();
break;
default:
}
},
e.addEventListener("beforeunload",
function() {
M.close()
})),
M.onopen()
},
P = w.Collections = {},
H = w.Views = {},
B = w.Callbacks = {},
j = w.openDialog = function(e) {
return w.dialog !== n && w.dialog.el.remove(),
w.dialog = (new H.Dialog('<div class="ds-dialog"><div class="ds-dialog-inner ds-rounded"><div class="ds-dialog-body">' + e + '</div><div class="ds-dialog-footer"><a href="http://duoshuo.com/" target="_blank" class="ds-logo"></a><span>\u793e\u4f1a\u5316\u8bc4\u8bba\u6846</span></div><a class="ds-dialog-close" href="javascript:void(0)" title="\u5173\u95ed"></a></div></div>')).open()
},
F = w.injectScript = function(r, i) {
var s = t.createElement("script"),
o = t.head || t.getElementsByTagName("head")[0] || t.documentElement;
s.type = "text/javascript",
s.src = r,
s.async = "async",
s.charset = "utf-8",
i && (s.onload = s.onreadystatechange = function(t, r) {
if (r || !s.readyState || /loaded|complete/.test(s.readyState)) s.onload = s.onreadystatechange = null,
o && s.parentNode && o.removeChild(s),
s = n,
r || i.call(e)
}),
o.insertBefore(s, o.firstChild)
},
I = w.log = function(e) {
typeof console == "object" && console.log(e)
},
q = w.smilies = {},
R = ["EmbedThread", "RecentComments", "RecentVisitors", "TopUsers", "TopThreads", "LoginWidget", "ThreadCount"],
U = 0,
z,
W = function() {
var e = {},
t = 0;
for (; t < arguments.length; t++) arguments[t] && ft(e, arguments[t]);
var n = w.param(e);
return n ? "?" + n: ""
},
X = function() {
var e = w.getCookie("duoshuo_token");
return e ? {
jwt: e
}: z.remote_auth ? {
short_name: z.short_name,
remote_auth: z.remote_auth
}: n
},
V = function() {
return ! z && (z = e.duoshuoQuery) && tt.trigger("queryDefined"),
z
};
for (var $ in Object.prototype) return alert("Object.prototype\u4e0d\u4e3a\u7a7a\uff0c\u8bf7\u4e0d\u8981\u7ed9Object.prototype\u8bbe\u7f6e\u65b9\u6cd5");
var J = w.templates = {
userUrl: function(e) {
return e.url
},
avatarUrl: function(e, t) {
return e.avatar_url || nt.data.default_avatar_url
},
userAnchor: function(e) {
var t = J.userUrl(e);
return t ? '<a rel="nofollow author" target="_blank" href="' + p(t) + '">' + p(e.name) + "</a>": p(e.name)
},
avatarImg: function(e, t) {
return '<img src="' + p(J.avatarUrl(e, t)) + '" alt="' + p(e.name) + '"' + (t ? ' style="width:' + t + "px;height:" + t + 'px"': "") + "/>"
},
avatar: function(e, t) {
var n = J.avatarImg(e, t),
r = J.userUrl(e);
return r ? '<a rel="nofollow author" target="_blank" href="' + p(r) + '" ' + (e.user_id ? " onclick=\"this.href='" + w.hostUrl + "/user-url/?user_id=" + e.user_id + "';\"": "") + ' title="' + p(e.name) + '">' + n + "</a>": n
},
timeHtml: function(e, t) {
return e ? t ? '<a href="' + t + '" target="_blank" rel="nofollow" class="ds-time" datetime="' + e + '" title="' + w.fullTime(e) + '">' + w.elapsedTime(e) + "</a>": '<span class="ds-time" datetime="' + e + '" title="' + w.fullTime(e) + '">' + w.elapsedTime(e) + "</span>": ""
},
serviceIcon: function(e, t) {
return '<a href="javascript:void(0)" class="ds-service-icon' + (t ? "-grey": "") + " ds-" + e + '" data-service="' + e + '" title="' + w.sourceName[e] + '"></a>'
},
loginButtons: function(e) {
return '<div class="ds-login-buttons"><p>\u793e\u4ea4\u5e10\u53f7\u767b\u5f55:</p><div class="ds-social-links">' + J.serviceList() + J.additionalServices() + "</div></div>"
},
poweredBy: function(e) {
return '<p class="ds-powered-by"><a href="http://duoshuo.com" target="_blank" rel="nofollow">' + p(e) + "</a></p>"
},
indicator: g('<div id="ds-indicator"></div>'),
waitingImg: g('<div id="ds-waiting"></div>'),
serviceList: function(e) {
var t = '<ul class="ds-service-list">',
n = ["weibo", "qq", "renren", "douban"],
r = 0;
for (; r < n.length; r++) t += J.loginItem(n[r], e);
return t + '<li><a class="ds-more-services" href="javascript:void(0)">\u66f4\u591a\u00bb</a></li>' + "</ul>"
},
additionalServices: function(e) {
var t = '<ul class="ds-service-list ds-additional-services">',
n = ["kaixin", "netease", "sohu", "baidu", "google"],
r = 0;
for (; r < n.length; r++) t += J.loginItem(n[r], e);
return t + "</ul>"
},
loginItem: function(e, t) {
var n = J[t ? "bindUrl": "loginUrl"](e);
return '<li><a href="' + n + '" rel="nofollow" class="ds-service-link ds-' + e + '">' + w.serviceNames[e] + (rt.data.social_uid[e] ? ' <span class="ds-icon ds-icon-ok"></span>': "") + "</a>" + "</li>"
},
loginUrl: function(e, t) {
return t || (t = {}),
z.sso && z.sso.login && (t.sso = 1, t.redirect_uri = z.sso.login),
w.hostUrl + "/login/" + e + "/" + W(t)
},
bindUrl: function(e) {
return w.hostUrl + "/bind/" + e + "/" + W(z.sso && z.sso.login ? {
sso: 1,
redirect_uri: z.sso.login
}: null, X())
},
logoutUrl: function() {
return w.hostUrl + "/logout/" + W(z.sso && z.sso.logout ? {
sso: 1,
redirect_uri: z.sso.logout
}: null)
},
likePost: function(e) {
return '<a class="ds-post-likes" href="javascript:void(0);"><span class="ds-icon ds-icon-like"></span>' + k.like + (e.likes > 0 ? "(" + e.likes + ")": "") + "</a>"
},
ctxPost: function(e, t, n) {
var r = K(e);
return '<li class="ds-ctx-entry"' + (n ? ' style="display:none"': "") + ' data-post-id="' + e.post_id + '"><div class="ds-avatar">' + J.avatar(r) + '</div><div class="ds-ctx-body"><div class="ds-ctx-head">' + J.userAnchor(r) + J.timeHtml(e.created_at, e.url) + (t >= 0 ? '<div class="ds-ctx-nth" title="' + w.fullTime(e.created_at) + '">' + (t + 1) + k.floor + "</div>": "") + '</div><div class="ds-ctx-content">' + e.message + (t >= 0 ? '\u3000\u3000\u3000\u3000\u3000\u3000\u3000<div class="ds-comment-actions' + (e.vote > 0 ? " ds-post-liked": "") + '">' + J.likePost(e) + ' <a class="ds-post-repost" href="javascript:void(0);"><span class="ds-icon ds-icon-share"></span>' + k.repost + "</a>" + ' <a class="ds-post-reply" href="javascript:void(0);"><span class="ds-icon ds-icon-reply"></span>' + k.reply + "</a>" + "</div>": "") + "</div></div></li>"
}
},
K = function(e) {
return ut[e.author_id] && ut[e.author_id].data || e.author
},
Q = function(e) {
var t = [];
for (var n in e) t.push('<input type="hidden" name="' + n + '" value="' + p(e[n]) + '" />');
return t.join("\n")
};
for (; U < R.length; U++) w[R[U]] = function(e) {
return function(t, n) {
n = n || {},
n.type = e,
t && !N[t] && (N[t] = n),
w.initSelector && w.initSelector(t, n)
}
} (R[U]),
w["create" + R[U]] = function(e) {
return function(n, r) {
var i = t.createElement(n);
for (var s in r) i.setAttribute("data-" + s, r[s]);
return w[e](i),
i
}
} (R[U]);
w.RecentCommentsWidget = w.RecentComments;
var G = 0,
Y = w.Class = function() {};
Y.extend = function(e) {
function r() { ! G && this.init && this.init.apply(this, arguments)
}
G = 1;
var t = new this;
G = 0;
for (var n in e) t[n] = e[n];
return r.prototype = t,
r.prototype.constructor = r,
r.extend = arguments.callee,
r
};
var Z = w.Event = Y.extend({
on: function(e, t) {
var r = this.handlers || (this.handlers = {});
return r[e] === n && (r[e] = []),
r[e].push(t),
this
},
trigger: function(e, t) {
var n = (this.handlers || (this.handlers = {}))[e];
if (n) for (var r = 0; r < n.length; r++) if (n[r].call(this, t) === !1) break;
return this
}
}),
et = w.Model = Z.extend({
init: function(e) {
this.data = e
},
reset: function(e) {
this.data = e,
this.trigger("reset")
},
remove: function(e) {
this.data.splice(e, 1),
this.trigger("reset")
},
set: function(e, t) {
if (t === n) for (var r in e) this.data[r] = e[r];
else this.data[e] = t;
this.trigger("reset")
}
}),
tt = w.events = new Z,
nt = w.site = new et,
rt = w.visitor = new et,
it = w.unread = new et,
st = w.threads = {},
ot = w.postPool = {},
ut = w.users = {};
tt.on("queryDefined",
function() {
var e = z.short_name;
w.hostUrl = e ? l + "//" + e + "." + w.DOMAIN: w.REMOTE,
z.theme && pt(z.theme);
if (o) {
var t = o["ds_site_" + e],
n = o["ds_lang_" + e];
t && nt.reset(i.parse(t)),
n && ft(k, i.parse(n))
}
}),
V(),
w.loaded.jQuery && (w.jQuery = e.jQuery),
w.require("jQuery",
function() {
function dt(e, t, n) {
if (e.find(".ds-post[data-post-id=" + t.post_id + "]")[0]) return;
return e.find(".ds-post-placeholder").remove(),
i(J.post(t, n)).hide()[n.order == "asc" ? "appendTo": "prependTo"](e).slideDown(function() {})
}
function vt(e, t) {
var n;
this.delegate("a.ds-post-likes", "click",
function(e) {
if (ct()) return gt(),
!1;
var t = i(this).parent();
return liked = t.hasClass("ds-post-liked"),
matches = i(this).html().match(/\((\d+)\)/),
likes = (matches ? parseInt(matches[1]) : 0) + (liked ? -1 : 1),
A("/api/posts/vote", {
post_id: t.closest(".ds-ctx-entry, .ds-post-self").attr("data-post-id"),
vote: liked ? 0 : 1
}),
i(this).html(i(this).html().replace(/\(\d+\)/, "") + (likes ? "(" + likes + ")": "")),
t[liked ? "removeClass": "addClass"]("ds-post-liked"),
!1
}).delegate("a.ds-post-repost", "click",
function(e) {
var t = i(this).closest(".ds-post-self"),
n = ot[t.attr("data-post-id")];
return w.repostDialog(n, ""),
!1
}).delegate("a.ds-post-delete", "click",
function(t) {
if (confirm("\u786e\u5b9a\u8981\u5220\u9664\u8fd9\u6761\u8bc4\u8bba\u5417\uff1f")) {
var n = i(this).closest(".ds-post-self");
A("/api/posts/remove", {
post_id: n.attr("data-post-id")
}),
n.parent().fadeOut(200,
function() {
e.data.comments--,
e.updateCounter("duoshuo"),
i(this).remove()
})
}
return ! 1
}).delegate("a.ds-post-report", "click",
function(e) {
if (confirm("\u786e\u5b9a\u8981\u4e3e\u62a5\u8fd9\u6761\u8bc4\u8bba\u5417\uff1f")) {
var t = i(this).closest(".ds-post-self");
A("/api/posts/report", {
post_id: t.attr("data-post-id")
}),
alert("\u611f\u8c22\u60a8\u7684\u53cd\u9988\uff01")
}
return ! 1
}).delegate("a.ds-post-reply", "click",
function(r) {
var s = i(this),
o = s.closest(".ds-comment-actions");
if (o.hasClass("ds-reply-active")) n.el.fadeOut(200,
function() {
i(this).detach()
}),
o.removeClass("ds-reply-active");
else {
var u = s.closest(".ds-ctx-entry, .ds-post-self");
n ? n.actionsBar.removeClass("ds-reply-active") : (n = new H.Replybox(e), n.render(!0).el.addClass("ds-inline-replybox").detach()),
n.el.find("[name=parent_id]").val(u.attr("data-post-id")),
n.el.show().appendTo(s.closest(".ds-ctx-body, .ds-comment-body")).find("textarea").focus(),
n.actionsBar = o.addClass("ds-reply-active"),
t.max_depth <= 1 ? n.postList = e.postList.el: (n.postList = u.siblings(".ds-children"), n.postList[0] || (n.postList = i('<ul class="ds-children"></ul>').insertAfter(u)))
}
return ! 1
}).delegate("a.ds-weibo-comments", "click",
function(e) {
var n = i(this).closest(".ds-post-self"),
r = n.attr("data-post-id"),
s = n.data("source");
if (n.attr("data-root-id") == 0) {
var o = n.siblings(".ds-children");
o[0] ? o.remove() : (o = i('<ul class="ds-children"></ul>').insertAfter(n), L("/api/posts/listComments", bt({
post_id: r
}),
function(e) {
l(e),
o.append(i.map(e.response,
function(e) {
return J.post(e, t)
}).join(""))
}))
}
return ! 1
}).delegate("a.ds-weibo-reposts", "click",
function(t) {
var n = i(this).closest(".ds-post-self"),
r = ot[n.attr("data-post-id")],
s = r.data.source;
if (!rt.data.social_uid[s == "qqt" ? "qq": s]) {
mt(s);
return
}
var o = r.data.root_id,
u = o != "0" ? ot[o] : r,
a = "";
if (o != "0") {
var f = K(r.data);
a = (s == "weibo" ? "//@" + f.name: "|| @" + f.qqt_account) + ":" + r.data.message
}
return w.repostDialog(u, a, e, s),
!1
}).delegate("a.ds-expand", "click",
function(e) {
var t = i(this).parent();
return t.siblings().show(),
t.remove(),
!1
}),
x.touch || this.delegate("a.ds-comment-context, .ds-avatar, .ds-user-name", "mouseenter",
function(t) {
var n = this;
if (bubbleOutTimer && $.owner == n) clearTimeout(bubbleOutTimer),
bubbleOutTimer = 0;
else {
var r = i(n);
Y = setTimeout(function() {
Y = 0,
$.owner = n,
tt();
var t = r.offset(),
i = e.el.offset(),
s = r.innerWidth() / 2,
o = e.el.innerHeight() - (t.top - i.top) + 6,
u = t.left - i.left - 35 + (s > 35 ? 35 : s);
try {
if (r.hasClass("ds-comment-context")) G.attr("id", "ds-ctx-bubble").attr("data-post-id", r.attr("data-post-id")).html('<ul id="ds-ctx">' + J.ctxPost(ot[r.attr("data-parent-id")].data) + "</ul>" + '<div class="ds-bubble-footer"><a class="ds-ctx-open" href="javascript:void(0);">\u67e5\u770b\u5bf9\u8bdd</a></div>');
else if (r.hasClass("ds-avatar") || r.hasClass("ds-user-name")) {
var a = {},
f = a.user_id = r.attr("data-user-id");
if (!f) throw "no info";
G.attr("id", "ds-user-card").attr("data-user-id", f).empty(),
ut[f] ? G.html(J.userInfo(ut[f].data)) : L("/api/users/profile", bt(a),
function(e) {
var t = e.response;
ut[f] ? ut[f].set(t) : ut[f] = new et(t),
$.owner == n && G.html(J.userInfo(t))
})
}
$.css({
bottom: o,
left: u
}).appendTo(e.innerEl)
} catch(l) {
$.detach()
}
},
200)
}
}).delegate("a.ds-comment-context, .ds-avatar, .ds-user-name", "mouseleave",
function() {
Y ? (clearTimeout(Y), Y = 0) : bubbleOutTimer || bubbleOut()
})
}
function mt(e) {
var t = J[ct() ? "loginUrl": "bindUrl"](e);
x.authInWin && O(e, t) || (r.href = t)
}
function gt() {
var e = j("<h2>\u793e\u4ea4\u5e10\u53f7\u767b\u5f55</h2>" + J.serviceList() + J.additionalServices()).el.find(".ds-dialog").css("width", "300px");
M(e)
}
function bt(e) {
var n = {
require: "site,visitor,nonce,serverTime,lang" + (yt++?"": ",unread,log,extraCss"),
site_ims: o && o["ds_site_" + z.short_name + ":timestamp"],
lang_ims: o && o["ds_lang_" + z.short_name + ":timestamp"],
referer: t.referrer
};
z.stylePatch && (n.style_patch = z.stylePatch);
for (var r in n) n[r] && (!S || encodeURIComponent(n[r]).length < 200) && (e[r] = n[r]);
return e
}
var i = w.jQuery,
s = i(e),
a = i(t),
l = w.loadRequire = function(e) {
e.serverTime && (c = (new Date).getTime() - e.serverTime * 1e3),
e.visitor && (!rt.data && e.visitor.user_id && u && !u.checkPermission() && D({
logged_user_id: e.visitor.user_id
}), rt.reset(e.visitor)),
e.site && (nt.reset(e.site), ht("ds_site_" + z.short_name, e.site, e.serverTime)),
!w.theme && nt.data.theme && pt(nt.data.theme),
e.lang && (ft(k, e.lang), ht("ds_lang_" + z.short_name, e.lang, e.serverTime));
if (e.stylesheets) for (var t = 0; t < e.stylesheets.length; t++) w.injectStylesheet(e.stylesheets[t]);
e.nonce && (w.nonce = e.nonce),
e.style && w.setCustomStyle((e.style || "") + w.compileStyle(z.component_style)),
e.unread && it.reset(e.unread)
},
h = function(e) {
e.stopPropagation()
},
g = function(e) { (e.ctrlKey && e.which == 13 || e.which == 10) && i(this.form).trigger("submit")
},
y = function(e) {
var t = i(this);
t.height(Math.max(54, t.next(".ds-hidden-text").text(this.value).height() + 27))
},
O = function(t, n) {
var i = {
weibo: [760, 600],
renren: [420, 322],
qq: [504, 445],
netease: [810, 645],
sohu: [972, 600],
google: [600, 440],
taobao: [480, 585]
} [t] || [550, 400];
return e.open(n + (n.indexOf("?") == -1 ? "?": "&") + w.param({
origin: r.origin || "http://" + r.host
}), "_blank", "width=" + i[0] + ",height=" + i[1] + ",toolbar=no,menubar=no,location=yes")
},
M = function(e, t) {
x.authInWin && e.find(t || "a.ds-service-link").click(function(e) {
var t = this.href.match(/\/(login|bind)\/(\w+)\//i);
if (!t || !w.serviceNames[t[2]]) return;
return ! O(t[2], this.href)
})
},
_ = function(e) {
return x.touch && e.addClass("ds-touch"),
T("transition") || e.addClass("ds-no-transition"),
S && e.addClass("ds-ie6"),
i.support.opacity || e.addClass("ds-no-opacity"),
e
},
B = function(e) {
if (!x.placeholder) {
var t = e.attr("placeholder");
e.val(t).focus(function() {
this.value === t && (this.value = "")
}).blur(function() {
this.value === "" && (this.value = t)
})
}
return e
};
if (e.postMessage) {
var F = function(e) {
if (e.origin === "http://duoshuo.com") switch (e.data.type) {
case "login":
r.href = e.data.redirectUrl;
break;
default:
}
};
e.addEventListener ? e.addEventListener("message", F, !1) : e.attachEvent && e.attachEvent("onmessage", F)
}
w.scrollTo = function(e) {
var t = e.offset().top; (t < s.scrollTop() || t > s.scrollTop() + s.height()) && i("html, body").animate({
scrollTop: t - 40
},
200, "swing")
},
w.toJSON = function(e) {
var t = /\r?\n/g,
n = /^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,
r = /^(?:select|textarea)/i,
s = e.map(function() {
return this.elements ? i.makeArray(this.elements) : this
}).filter(function() {
return this.name && !this.disabled && (this.checked || r.test(this.nodeName) || n.test(this.type))
}).map(function(e, n) {
var r = i(this).val();
return r == null ? null: i.isArray(r) ? i.map(r,
function(e, r) {
return {
name: n.name,
value: e.replace(t, "\r\n")
}
}) : {
name: n.name,
value: r.replace(t, "\r\n")
}
}).toArray(),
o = {};
return i.each(s,
function() {
o[this.name] = this.value
}),
o
};
var R = w.Widget = Z.extend({
init: function(e, t) {
this.el = e,
this.options = t || {},
this.render()
},
render: function() {},
reset: function() {},
load: function(e) {
switch (e.code) {
case 0:
l(e),
this.onload(e);
break;
default:
this.onError(e)
}
},
onload: function(e) {
this.el.html(J[this.tmpl].call(J, e.response, i.extend(this.options, e.options)))
},
onMessage: function() {},
onError: function(e) {
I("\u51fa\u9519\u5566(" + e.code + "): " + e.errorMessage),
e.errorTrace && I(e.errorTrace)
}
}),
U = function(e) {
var t = {
"unread-comments": {
title: "\u65b0\u7559\u8a00\u53ca\u56de\u590d",
apiUrl: "/api/users/unreadComments",
tmpl: function(e) {
return '<li data-thread-id="' + e.thread.thread_id + '">' + i.map(e.authors, J.userAnchor).join("\u3001") + ' \u5728 <a class="ds-read" href="' + e.thread.url + '#comments" target="_blank">' + p(e.thread.title || "\u65e0\u6807\u9898") + '</a> \u4e2d\u56de\u590d\u4e86\u4f60 <a class="ds-delete ds-read" title="\u77e5\u9053\u4e86" href="javascript:void(0)">\u77e5\u9053\u4e86</a></li>'
},
read: function(e) {
var t = e.attr("data-thread-id");
A("/api/threads/read", {
thread_id: t
}),
it.data.comments--
}
},
"unread-notifications": {
title: "\u7cfb\u7edf\u6d88\u606f",
apiUrl: "/api/users/unreadNotifications",
tmpl: function(e) {
return '<li data-notification-id="' + e.notification_id + '" data-notification-type="' + e.type + '">' + e.content + ' <a class="ds-delete ds-read" title="\u77e5\u9053\u4e86" href="javascript:void(0)">\u77e5\u9053\u4e86</a></li>'
},
read: function(e) {
var t = e.attr("data-notification-id");
A("/api/notifications/read", {
notification_id: t
}),
it.data.notifications--
}
}
} [e],
n = j("<h2>" + t.title + "</h2>" + '<ul class="ds-unread-list"></ul>');
n.on("close", w.resetNotify);
var r = n.el.find(".ds-unread-list").delegate(".ds-delete", "click",
function(e) {
return i(this).parent().remove(),
r.children().length === 0 && n.close(),
!1
}).delegate(".ds-read", "click",
function(e) {
t.read(i(this).parent())
});
i("#ds-notify").hide(),
L(t.apiUrl, {},
function(e) {
n.el.find(".ds-unread-list").html(i.map(e.response, t.tmpl).join("\n"))
}),
u && u.checkPermission() && u.requestPermission(lt)
};
w.resetNotify = function() {
var e = i("#ds-notify"),
n = it.data;
e[0] || (e = i('<div id="ds-notify"></div>').css({
hidden: {
display: "none"
},
"top-right": {
top: "24px",
right: "24px"
},
"bottom-right": {
bottom: "24px",
right: "24px"
}
} [nt.data.notify_position]).delegate(".ds-notify-unread a", "click",
function(e) {
return U(i(this).data("type")),
!1
}).appendTo(t.body)),
e.html('<div id="ds-reset"><a class="ds-logo" href="http://duoshuo.com/" target="_blank" title="\u591a\u8bf4"></a><ul class="ds-notify-unread"><li' + (n.comments ? "": ' style="display:none;"') + '><a data-type="unread-comments" href="javascript:void(0);">\u4f60\u6709' + n.comments + "\u6761\u65b0\u56de\u590d</a></li><li" + (n.notifications ? "": ' style="display:none;"') + '><a data-type="unread-notifications" href="javascript:void(0);">\u4f60\u6709' + n.notifications + "\u6761\u7cfb\u7edf\u6d88\u606f</a></li></ul></div>")[(n.comments || n.notifications) && nt.data.notify_position !== "hidden" && !i(".ds-dialog")[0] ? "show": "hide"]()
},
it.on("reset", w.resetNotify),
J.replybox = function(e, t) {
var n = e.options,
r = rt.data,
i = [],
s = "",
o,
u = {
thread_id: e.threadId,
parent_id: "",
nonce: w.nonce
};
for (var a in r.repostOptions) r.repostOptions[a] && (i.push(a), o = 1),
s += J.serviceIcon(a, !r.repostOptions[a]);
return '<div class="ds-replybox"><a class="ds-avatar"' + (ct() ? ' href="javascript:void(0);" onclick="return false"': ' href="' + w.REMOTE + "/settings/avatar/" + W(X()) + '" target="_blank" title="\u8bbe\u7f6e\u5934\u50cf"') + ">" + J.avatarImg(r) + "</a>" + '<form method="post">' + Q(u) + '<div class="ds-textarea-wrapper ds-rounded-top">' + '<textarea name="message" title="Ctrl+Enter\u5feb\u6377\u63d0\u4ea4" placeholder="' + p(k.leave_a_message) + '"></textarea>' + '<pre class="ds-hidden-text"></pre>' + "</div>" + '<div class="ds-post-toolbar">' + '<div class="ds-post-options ds-gradient-bg">' + '<span class="ds-sync">' + (!ct() && s ? '<input id="ds-sync-checkbox' + (t ? "-inline": "") + '" type="checkbox" name="repost" ' + (o ? 'checked="checked" ': "") + 'value="' + i.join(",") + '"> <label for="ds-sync-checkbox' + (t ? "-inline": "") + '">' + k.share_to + "</label>" + s: "") + "</span>" + "</div>" + '<button class="ds-post-button" type="submit">' + p(k.post) + "</button>" + '<div class="ds-toolbar-buttons">' + (n.use_smilies ? '<a class="ds-toolbar-button ds-add-emote" title="\u63d2\u5165\u8868\u60c5"></a>': "") + (n.use_images && n.parse_html_enabled ? '<a class="ds-toolbar-button ds-add-image" title="\u63d2\u5165\u56fe\u7247"></a>': "") + "</div>" + "</div>" + "</form>" + "</div>"
},
H.Replybox = function(e) {
this.embedThread = e
},
H.Replybox.prototype = {
render: function(e) {
function T(e) {
e.data("submitting", !0),
e.find(".ds-post-button").addClass("ds-waiting").html(k.posting)[0].disabled = !0
}
function N(e) {
e.data("submitting", !1),
e.find(".ds-post-button").removeClass("ds-waiting").html(k.post)[0].disabled = !1
}
var n = this,
r = n.embedThread,
s = r.options,
u = function(e) {
w.require("smilies",
function() {})
},
a = n.el = i(J.replybox(r, e)).click(u),
f = a.find("form"),
l = f.find("input[type=checkbox]")[0],
c = f.find("a.ds-service-icon, a.ds-service-icon-grey"),
h = B(f.find("textarea")).focus(u).keyup(g).keyup(y).bind("focus mousedown mouseup keyup", m),
d = a.find(".ds-add-emote").click(function(e) {
var r = w.smiliesTooltip;
return d.toggleClass("ds-expanded").hasClass("ds-expanded") ? (r || (r = w.smiliesTooltip = new H.SmiliesTooltip, r.render(), w.require("smilies",
function() {
r.reset("\u5fae\u535a-\u9ed8\u8ba4")
})), r.replybox = n, r.el.appendTo(t.body).css({
top: n.el.offset().top + n.el.outerHeight() + 4 + "px",
left: n.el.find(".ds-textarea-wrapper").offset().left + "px"
}), i(t.body).click(E)) : E(e),
!1
}),
b = a.find(".ds-add-image").click(function(e) {
var n = h[0],
r = n.value,
i = "\u8bf7\u8f93\u5165\u56fe\u7247\u5730\u5740",
s = '<img src="' + i + '" />';
if (t.selection) {
n.value = r.substring(0, v.start) + s + r.substring(v.end, r.length),
n.value = n.value.replace("\u8bf4\u70b9\u4ec0\u4e48\u5427 ...", ""),
n.focus();
var o = t.selection.createRange();
o.collapse(),
o.findText(i),
o.select()
} else {
n.value = r.substring(0, n.selectionStart) + s + r.substring(n.selectionEnd);
var u = n.value.search(i);
n.setSelectionRange(u, u + i.length),
n.focus()
}
e.preventDefault()
}),
E = n.hideSmilies = function(e) {
d.removeClass("ds-expanded"),
w.smiliesTooltip.el.detach(),
i(t.body).unbind("click", E)
},
S = function(e, t) {
var n = j('<h2>\u793e\u4ea4\u5e10\u53f7\u767b\u5f55</h2><div class="ds-icons-32">' + i.map(["weibo", "qq", "renren", "kaixin", "douban", "netease", "sohu"],
function(e) {
return '<a class="ds-' + e + '" href="' + J.loginUrl(e) + '">' + w.sourceName[e] + "</a>"
}).join("") + "</div>" + (s.deny_anonymous ? "": '<h2>\u4f5c\u4e3a\u6e38\u5ba2\u7559\u8a00</h2><form><div class="ds-control-group"><input type="text" name="author_name" id="ds-dialog-name" value="' + p(rt.data.name) + '" required />' + '<label for="ds-dialog-name">\u540d\u5b57(\u5fc5\u586b)</label>' + "</div>" + (s.require_guest_email ? '<div class="ds-control-group"><input type="email" name="author_email" id="ds-dialog-email" value="' + p(rt.data.email) + '" required />' + '<label for="ds-dialog-email">\u90ae\u7bb1(\u5fc5\u586b)</label>' + "</div>": "") + (s.require_guest_url ? '<div class="ds-control-group"><input type="url" name="author_url" id="ds-dialog-url" placeholder="http://" value="' + p(rt.data.url || "") + '" />' + '<label for="ds-dialog-url">\u7f51\u5740(\u53ef\u9009)</label>' + "</div>": "") + '<button type="submit">\u53d1\u5e03</button>' + "</form>")),
r = n.el.find(".ds-dialog").css("width", "320px");
M(r, ".ds-icons-32 a");
if (!s.deny_anonymous) {
var o = n.el.find("form");
o.submit(function(e) {
var r = o.find("input[name=author_email]").val();
return (r || s.require_guest_email) && !r.match(/^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/) ? (alert("\u8bf7\u8f93\u5165\u4e00\u4e2a\u6709\u6548\u7684email\u5730\u5740."), !1) : (t(w.toJSON(o)), n.close(), !1)
}),
o.find("input[name=author_name]")[0].focus()
}
};
s.deny_anonymous && h.focus(function(e) {
if (ct()) {
S(f, C);
var t = function(e) {
e.stopPropagation(),
h.unbind("click", t)
};
h.click(t)
}
return ! 1
});
var C = function(e) {
T(f),
A("/api/posts/create", i.extend(w.toJSON(f), e),
function(e) {
var t = e.response,
i = dt(n.postList, t, s);
s.order == "asc" == (s.formPosition == "top") && w.scrollTo(i),
ot[t.post_id] = new et(t),
r.data.comments++,
r.updateCounter("duoshuo"),
h.val("").trigger("keyup"),
N(f),
a.hasClass("ds-inline-replybox") && (a.detach(), n.actionsBar.removeClass("ds-reply-active"));
if (o) try {
o.removeItem("ds_draft_" + r.threadId)
} catch(u) {}
},
function(e) {
N(f),
alert(e.errorMessage)
})
};
f.submit(function(e) {
if (f.data("submitting")) return ! 1;
var t = i.trim(f[0].message.value);
return t == "" || !x.placeholder && t == h.attr("placeholder") ? (alert("\u60a8\u8fd8\u6ca1\u5199\u5185\u5bb9\u5462"), !1) : (ct() ? S(f, C) : C(), !1)
});
var L = function(e) {
return i(e).hasClass("ds-service-icon-grey") ? null: i(e).attr("data-service")
};
return c.click(function() {
return i(this).toggleClass("ds-service-icon-grey").toggleClass("ds-service-icon"),
l.value = i.map(c, L).join(","),
l.checked = l.value != "",
!1
}),
i(l).change(function() {
var e = this.checked;
c[e ? "removeClass": "addClass"]("ds-service-icon-grey")[e ? "addClass": "removeClass"]("ds-service-icon"),
this.value = i.map(c, L).join(",")
}),
this
}
},
H.Dialog = Z.extend({
init: function(e, t) { (this.el = i("#ds-wrapper"))[0] || (this.el = _(i('<div id="ds-wrapper"></div>'))),
this.options = i.extend({
width: 600
},
t),
e !== n && i(e).attr("id", "ds-reset").appendTo(this.el)
},
open: function() {
var e = this;
e.el.hide().appendTo(t.body).fadeIn(200),
S && e.el.css("top", s.scrollTop() + 100),
e.el.show().find(".ds-dialog").delegate("a.ds-dialog-close", "click",
function(t) {
return e.close(),
!1
}).click(h);
var n = function(t) {
if (t.which == 27) return e.close(),
!1
},
r = function(t) {
return e.close(),
!1
};
return a.keydown(n),
i(t.body).click(r),
e.close = function(s) {
a.unbind("keydown", n),
i(t.body).unbind("click", r),
e.el.fadeOut(200,
function() {
i(this).remove()
}),
e.trigger("close")
},
e
}
}),
J.likePanel = function(e) {
return e.likes ? '<span class="ds-highlight">' + e.likes + "</span> \u4eba\u559c\u6b22": ""
},
J.likeTooltip = function(e) {
var t = {
qzone: "QQ\u7a7a\u95f4",
weibo: "\u65b0\u6d6a\u5fae\u535a",
qqt: "\u817e\u8baf\u5fae\u535a",
renren: "\u4eba\u4eba\u7f51",
kaixin: "\u5f00\u5fc3\u7f51",
douban: "\u8c46\u74e3\u7f51",
baidu: "\u767e\u5ea6\u641c\u85cf",
netease: "\u7f51\u6613\u5fae\u535a",
sohu: "\u641c\u72d0\u5fae\u535a"
},
n = [];
for (var r in t) n.push('<li><a class="ds-share-to-' + r + " ds-service-link ds-" + r + '" href="' + w.hostUrl + "/share-proxy/?" + w.param({
service: r,
thread_id: e.thread_id
}) + '">' + t[r] + "</a></li>");
var i = Math.ceil(n.length / 2);
return '<div class="ds-like-tooltip ds-rounded"><p>\u5f88\u9ad8\u5174\u4f60\u80fd\u559c\u6b22\uff0c\u5206\u4eab\u4e00\u4e0b\u5427\uff1a</p><ul>' + n.slice(0, i).join("") + "</ul><ul>" + n.slice(i).join("") + '</ul><p class="ds-like-tooltip-footer"><a class="ds-like-tooltip-close">\u7b97\u4e86</a></p></div>'
},
H.Meta = function(e) {
this.embedThread = e
},
H.Meta.prototype = {
render: function() {
var r = this,
s = r.embedThread,
o = s.data,
u = r.el = i('<div class="ds-meta"><a href="javascript:void(0)" class="ds-like-thread-button ds-rounded' + (o.user_vote > 0 ? " ds-thread-liked": "") + '"><span class="ds-icon ds-icon-heart"></span>' + ' <span class="ds-thread-like-text">' + (o.user_vote > 0 ? "\u5df2\u559c\u6b22": "\u559c\u6b22") + '</span><span class="ds-thread-cancel-like">\u53d6\u6d88\u559c\u6b22</span></a><span class="ds-like-panel"></span></div>'),
a = u.find(".ds-like-thread-button").click(function(f) {
var l = a.hasClass("ds-thread-liked");
A("/api/threads/vote", {
thread_id: s.threadId,
vote: l ? 0 : 1
},
function(e) {
i.each(e.response.thread,
function(e, t) {
o[e] = t
}),
r.resetLikePanel()
}),
a.toggleClass("ds-thread-liked"),
a.find(".ds-thread-like-text").text(l ? "\u559c\u6b22": "\u5df2\u559c\u6b22");
var c = function(e) {
r.tooltip.detach(),
i(t.body).unbind("click", c)
};
return l ? r.tooltip && c(f) : (r.tooltip === n && (r.tooltip = i(J.likeTooltip(o)).click(h).delegate("a", "click",
function(t) {
switch (this.className) {
case "ds-like-tooltip-close":
c(t);
break;
default:
if (!e.open(this.href, "_blank", "height=500,width=600,top=0,left=0,toolbar=no,menubar=no,resizable=yes,location=yes,status=no")) return
}
return ! 1
})), r.tooltip.appendTo(s.innerEl).css({
top: u.position().top + u.outerHeight() - 4 + "px",
left: 0
}), i(t.body).click(c)),
!1
});
return r.resetLikePanel(),
ct() && u.hide(),
r
},
resetLikePanel: function() {
this.el.find(".ds-like-panel").html(J.likePanel(this.embedThread.data))
}
},
J.postListHead = function(e) {
var t = e.data,
n = e.options;
return '<div class="ds-comments-info"><div class="ds-sort"><a class="ds-order-desc">' + k.latest + '</a><a class="ds-order-asc">' + k.earliest + '</a><a class="ds-order-hot">' + k.hottest + '</a></div><ul class="ds-comments-tabs"><li class="ds-tab"><a class="ds-comments-tab-duoshuo ds-current" href="javascript:void(0);"></a></li>' + (n.show_reposts && t.reposts ? '<li class="ds-tab"><a class="ds-comments-tab-repost" href="javascript:void(0);"></a></li>': "") + (n.show_weibo && t.weibo_reposts ? '<li class="ds-tab"><a class="ds-comments-tab-weibo" href="javascript:void(0);"></a></li>': "") + (n.show_qqt && t.qqt_reposts ? '<li class="ds-tab"><a class="ds-comments-tab-qqt" href="javascript:void(0);"></a></li>': "") + "</ul>" + "</div>"
},
H.PostListHead = function(e) {
this.embedThread = e
},
H.PostListHead.prototype = {
render: function() {
var e = this.embedThread,
t = e.options,
n = e.postList,
r = this.el = i(J.postListHead(e)),
s = r.find("ul.ds-comments-tabs").delegate(".ds-tab a", "click",
function(t) {
s.find("a.ds-current").removeClass("ds-current"),
n.params.page = 1;
var r = t.currentTarget;
switch (r.className) {
case "ds-comments-tab-duoshuo":
n.params.source = "duoshuo",
e.replybox.el.show();
break;
case "ds-comments-tab-repost":
n.params.source = "repost",
e.replybox.el.hide();
break;
case "ds-comments-tab-weibo":
n.params.source = "weibo",
e.replybox.el.hide();
break;
case "ds-comments-tab-qqt":
n.params.source = "qqt",
e.replybox.el.hide();
break;
default:
}
return i(r).addClass("ds-current"),
n.refetch(),
!1
}),
o = r.find(".ds-sort").delegate("a", "click",
function(e) {
return o.find("a.ds-current").removeClass("ds-current"),
n.params.order = t.order = this.className.replace("ds-order-", ""),
n.params.page = 1,
n.refetch(),
i(this).addClass("ds-current"),
!1
});
return o.find(".ds-order-" + n.params.order).addClass("ds-current"),
this
}
},
H.Paginator = function(e) {
e = e || {};
var t = this,
n = t.el = e.el || i('<div class="ds-paginator"></div>'),
r = t.collection = e.collection;
n.delegate("a", "click",
function(e) {
return r.params.page = parseInt(this.innerHTML),
r.refetch(),
n.find(".ds-current").removeClass("ds-current"),
i(this).addClass("ds-current"),
!1
})
},
H.Paginator.prototype = {
reset: function(e) {
function i(e) {
r.push('<a data-page="' + e + '" href="javascript:void(0);">' + e + "</a>")
}
var t = this.collection.params.page || 1,
n, r = [];
if (t > 1) {
i(1),
n = t > 4 ? t - 2 : 2,
n > 2 && r.push('<span class="page-break">...</span>');
for (; n < t; n++) i(n)
}
r.push('<a data-page="' + t + '" href="javascript:void(0);" class="ds-current">' + t + "</a>");
if (t < e.pages) {
for (n = t + 1; n <= t + 4 && n < e.pages; n++) i(n);
n < e.pages && r.push('<span class="page-break">...</span>'),
i(e.pages)
}
this.el.html('<div class="ds-border"></div>' + r.join(" "))[e.pages > 1 ? "show": "hide"]()
}
},
J.smiliesTooltip = function(e) {
var t = '<div id="ds-smilies-tooltip"><ul class="ds-smilies-tabs">';
for (var n in e) t += "<li><a>" + n + "</a></li>";
return t + '</ul><div class="ds-smilies-container"></div></div>'
},
w.addSmilies = function(e, t) {
var n = w.smiliesTooltip;
n && n.el.find("ul.ds-smilies-tabs").append("<li><a>" + e + "</a></li>"),
w.smilies[e] = t
},
H.SmiliesTooltip = function() {},
H.SmiliesTooltip.prototype = {
render: function() {
var e = this,
n = e.el = i(J.smiliesTooltip(q));
return n.click(h).find("ul.ds-smilies-tabs").delegate("a", "click",
function(t) {
e.reset(this.innerHTML)
}),
n.find(".ds-smilies-container").delegate("img", "click",
function(n) {
var r = e.replybox,
i = r.el.find("textarea")[0],
s = i.value;
if (t.selection) {
i.value = s.substring(0, v.start) + this.title + s.substring(v.end, s.length),
i.value = i.value.replace(k.leave_a_message, ""),
i.focus();
var o = t.selection.createRange();
o.moveStart("character", v.start + this.title.length),
o.collapse(),
o.select()
} else {
var u = i.selectionStart + this.title.length;
i.value = s.substring(0, i.selectionStart) + this.title + s.substring(i.selectionEnd),
i.setSelectionRange(u, u)
}
r.hideSmilies(),
i.focus()
}),
this
},
reset: function(e) {
var t = this.el.find("ul.ds-smilies-tabs");
t.find("a.ds-current").removeClass("ds-current"),
t.find("a").filter(function() {
return this.innerHTML == e
}).addClass("ds-current");
var n = "<ul>";
return i.each(q[e],
function(t, r) {
var i = e.indexOf("\u5fae\u535a") === 0 ? "http://img.t.sinajs.cn/t35/style/images/common/face/ext/normal/" + r.replace("_org", "_thumb") : b + "/images/smilies/" + r;
e === "WordPress" && (t = " " + t + " "),
n += '<li><img src="' + i + '" title="' + p(t) + '" /></li>'
}),
n += "</ul>",
this.el.find(".ds-smilies-container").html(n),
this
}
},
J.postPlaceholder = function() {
return '<li class="ds-post ds-post-placeholder">' + k.no_comments_yet + "</li>"
},
J.post = function(e, t) {
var n = K(e),
r = n.user_id ? ' data-user-id="' + n.user_id + '"': "",
s = n.qqt_account || "",
o = J.timeHtml(e.created_at, e.url),
u = e.parents || [];
switch (e.source) {
case "duoshuo":
o += '<a class="ds-post-reply" href="javascript:void(0);"><span class="ds-icon ds-icon-reply"></span>' + k.reply + "</a>" + J.likePost(e) + '<a class="ds-post-repost" href="javascript:void(0);"><span class="ds-icon ds-icon-share"></span>' + k.repost + "</a>" + '<a class="ds-post-report" href="javascript:void(0);"><span class="ds-icon ds-icon-report"></span>' + k.report + "</a>" + (e.privileges["delete"] ? '<a class="ds-post-delete" href="javascript:void(0);"><span class="ds-icon ds-icon-delete"></span>' + k["delete"] + "</a>": "");
break;
case "qqt":
case "weibo":
o += '<a class="ds-weibo-comments" href="javascript:void(0);">' + k.comments + (e.type.match(/\-comment$/) ? "": '(<span class="ds-count">' + e.comments + "</span>)") + "</a>" + '<a class="ds-weibo-reposts" href="javascript:void(0);">' + k.reposts + (e.type.match(/\-comment$/) ? "": '(<span class="ds-count">' + e.reposts + "</span>)") + "</a>";
break;
default:
}
return '<li class="ds-post" data-post-id="' + e.post_id + '"><div class="ds-post-self" data-post-id="' + e.post_id + '" data-thread-id="' + e.thread_id + '" data-root-id="' + e.root_id + '" data-source="' + e.source + '"><div class="ds-avatar"' + r + ">" + J.avatar(n) + (w.sourceName[e.source] ? J.serviceIcon(e.source) : "") + '</div><div class="ds-comment-body"><div class="ds-comment-header">' + (n.url ? '<a class="ds-user-name ds-highlight" data-qqt-account="' + s + '" href="' + p(n.url) + '" ' + (n.user_id ? " onclick=\"this.href='" + w.hostUrl + "/user-url/?user_id=" + n.user_id + "';\"": "") + ' rel="nofollow" target="_blank"' + r + ">" + p(n.name) + "</a>": '<span class="ds-user-name"' + r + ' data-qqt-account="'+s+'">'+p(n.name)+"</span>") +"<span class=\"ua\">" + sskadmin(e.author) + "</span><span class=\"ua\">" + ua(e.agent) +"</span><span class=\"ua\">"+ os(e.agent) + "</span>" +"</div>" + (t.max_depth == 1 && t.show_context && u.length ? '<ol id="ds-ctx">' + i.map(u,
function(e, t) {
return (t == 1 && u.length > 2 ? '<li class="ds-ctx-entry"><a href="javascript:void(0);" class="ds-expand">\u8fd8\u6709' + (u.length - 2) + "\u6761\u8bc4\u8bba</a></li>": "") + (ot[e] ? J.ctxPost(ot[e].data, t, t && t < u.length - 1) : "")
}).join("") + "</ol>": "") + "<p>" + (u.length >= t.max_depth && (!t.show_context || t.max_depth > 1) && e.parent_id && ot[e.parent_id] ? '<a class="ds-comment-context" data-post-id="' + e.post_id + '" data-parent-id="' + e.parent_id + '">' + k.reply_to + p(K(ot[e.parent_id].data).name) + ": </a>": "") + e.message + '</p><div class="ds-comment-footer ds-comment-actions' + (e.vote > 0 ? " ds-post-liked": "") + '">' + o + "</div></div></div>" + (t.max_depth > 1 && (e.childrenArray || e.children) && e.source != "weibo" && e.source != "qqt" ? '<ul class="ds-children">' + i.map(e.childrenArray || e.children,
function(e) {
return ot[e] ? J.post(ot[e].data, t) : ""
}).join("") + "</ul>": "") + "</li>"
};
var $ = i('<div id="ds-bubble"><div class="ds-bubble-content"></div><div class="ds-arrow ds-arrow-down ds-arrow-border"></div><div class="ds-arrow ds-arrow-down"></div></div>'),
G = $.find(".ds-bubble-content").delegate("a.ds-ctx-open", "click",
function(e) {
L("/api/posts/conversation", {
post_id: G.attr("data-post-id")
},
function(e) {
t.el.find("ol").html(i.map(e.response, J.ctxPost).join("\n"))
});
var t = j('<h2>\u67e5\u770b\u5bf9\u8bdd</h2><ol id="ds-ctx"></ol>');
return t.el.find(".ds-dialog").css("width", "600px"),
t.el.find(".ds-dialog-body").css({
"max-height": "350px",
_height: "350px",
"overflow-y": "auto",
"padding-top": "10px"
}),
!1
}),
Y = bubbleOutTimer = 0,
tt = function() {
bubbleOutTimer && (clearTimeout(bubbleOutTimer), bubbleOutTimer = 0)
};
bubbleOut = function() {
bubbleOutTimer = setTimeout(function() {
bubbleOutTimer = 0,
$.detach()
},
400)
},
$.mouseenter(tt).mouseleave(bubbleOut),
J.userInfo = function(e) {
var t = [];
return i.each(e.social_uid,
function(e, n) {
t.push('<a href="' + w.REMOTE + "/user-proxy/" + e + "/" + n + '/" target="_blank" class="ds-service-icon ds-' + e + '" title="' + w.sourceName[e] + '"></a>')
}),
'<a href="' + p(e.url) + '" class="ds-avatar" target="_blank">' + J.avatarImg(e) + '</a><a href="' + p(e.url) + '" class="ds-user-name ds-highlight" target="_blank">' + p(e.name) + "</a>" + t.join("") + '<p class="ds-user-card-meta"><a href="' + w.REMOTE + "/profile/" + e.user_id + '/" target="_blank"><span class="ds-highlight">' + e.comments + "</span>\u6761\u8bc4\u8bba</a></p>" + (e.description ? '<p class="ds-user-description">' + p(e.description) + "</p>": "")
},
P.PostList = function(e) {
e && (e.params && (this.params = e.params), e.embedThread && (this.embedThread = e.embedThread)),
this.el = i('<ul class="ds-comments"></ul>')
},
P.PostList.prototype = {
url: "/api/threads/listPosts",
render: function() {
return vt.call(this.el, this.embedThread, this.embedThread.options),
this
},
reset: function(e) {
var t = this.embedThread.options;
this.el.html(e[0] ? i.map(e,
function(e) {
return ot[e] ? J.post(ot[e].data, t) : ""
}).join("") : J.postPlaceholder())
},
refetch: function() {
var e = this,
n = i(J.indicator()).appendTo(t.body).fadeIn(200);
e.el.fadeTo(200, .5),
L(e.url, e.params,
function(t) {
at(ot, t.parentPosts || t.relatedPosts),
at(ut, t.users),
e.reset(t.response),
e.embedThread.paginator.reset(t.cursor),
e.el.fadeTo(200, 1),
w.scrollTo(e.el),
n.remove()
})
}
},
w.repostDialog = function(e, t, n, r) {
var i = j('<h2>\u8f6c\u53d1\u5230\u5fae\u535a</h2><div class="ds-quote"><strong>@' + p(K(e.data).name) + "</strong>: " + e.data.message + "</div>" + "<form>" + Q({
post_id: e.data.post_id
}) + '<div class="ds-textarea-wrapper">' + '<textarea name="message" title="Ctrl+Enter\u5feb\u6377\u63d0\u4ea4" placeholder="' + p(k.repost_reason) + '">' + p(t) + "</textarea>" + '<pre class="ds-hidden-text"></pre>' + "</div>" + '<div class="ds-actions">' + (r ? Q({
"service[]": r
}) : '<label><input type="checkbox" name="service[]" value="weibo"' + (rt.data.social_uid.weibo ? ' checked="checked"': "") + ' /><span class="ds-service-icon ds-weibo"></span>\u65b0\u6d6a\u5fae\u535a</label> ' + '<label><input type="checkbox" name="service[]" value="qqt"' + (rt.data.social_uid.qq ? ' checked="checked"': "") + ' /><span class="ds-service-icon ds-qqt"></span>\u817e\u8baf\u5fae\u535a</label>') + '<button type="submit">' + k.repost + "</button>" + "</div>" + "</form>"),
s = i.el.find("form").submit(function(e) {
return ! r && !s.find("[type=checkbox]:checked")[0] ? (alert("\u8fd8\u6ca1\u6709\u9009\u53d1\u5e03\u5230\u54ea\u513f\u5462"), !1) : (A("/api/posts/repost", w.toJSON(s),
function(e) {
if (n && r) {
var t = n.options,
i = dt(n.postList.el, e.response[r], t);
t.order == "asc" == (t.formPosition == "top") && w.scrollTo(i);
var s = n.el.find(".ds-comments-tab-" + r + " span.ds-highlight");
s.html(parseInt(s.html()) + 1)
}
}), i.close(), !1)
});
return s.find(".ds-actions [type=checkbox]").change(function(e) {
var t = this.value;
if (this.checked && !rt.data.social_uid[t == "qqt" ? "qq": t]) {
mt(t);
return
}
}),
B(s.find("textarea")).keyup(g).keyup(y).focus(),
!1
},
J.toolbar = function(e) {
var t = J.logoutUrl();
return '<div class="ds-toolbar"><div class="ds-account-control"><span class="ds-icon ds-icon-settings"></span> <span>\u5e10\u53f7\u7ba1\u7406</span><ul><li><a class="ds-bind-more" href="javascript:void(0);" style="border-top: none">\u7ed1\u5b9a\u66f4\u591a</a></li><li><a target="_blank" href="' + w.REMOTE + "/settings/" + W(X()) + '">' + p(k.settings) + "</a></li>" + '<li><a rel="nofollow" href="' + t + '" style="border-bottom: none">\u767b\u51fa</a></li>' + "</ul>" + "</div>" + '<div class="ds-visitor">' + (rt.data.url ? '<a class="ds-visitor-name" href="' + p(rt.data.url) + '" target="_blank">' + p(rt.data.name) + "</a>": '<span class="ds-visitor-name">' + p(rt.data.name) + "</span>") + '<a class="ds-unread-comments-count" href="javascript:void(0);" title="\u65b0\u56de\u590d"></a>' + "</div>" + "</div>"
},
H.EmbedThread = R.extend({
uri: "/api/threads/listPosts",
params: "thread-id local-thread-id source-thread-id thread-key category channel-key author-key author-id url limit order max-depth form-position container-url" + (f.match(/MSIE 6\.0/) ? "": " title image thumbnail"),
render: function() {
var e = this.el.attr("id", "ds-thread").append(J.waitingImg()),
t = e.width(),
n = e.data("url") || !e.attr("data-thread-id") && i("link[rel=canonical]").attr("href");
n ? e.data("url", d(n)) : e.data("container-url", r.href),
t && t <= 400 && e.addClass("ds-narrow").data("max-depth", 1)
},
updateCounter: function(e) {
var t = {
duoshuo: ["comments", "\u8bc4\u8bba"],
repost: ["reposts", "\u8f6c\u8f7d"],
weibo: ["weibo_reposts", "\u65b0\u6d6a\u5fae\u535a"],
qqt: ["qqt_reposts", "\u817e\u8baf\u5fae\u535a"]
};
for (var n in t) if (!e || e == n) {
var r = this.data[t[n][0]];
this.el.find(".ds-comments-tab-" + n).html(this.el.hasClass("ds-narrow") ? '<span class="ds-service-icon ds-' + n + '"></span>' + r: (r ? '<span class="ds-highlight">' + r + "</span>\u6761": "") + t[n][1])
}
},
onError: function(e) {
this.el.html("\u8bc4\u8bba\u6846\u51fa\u9519\u5566(" + e.code + "): " + e.errorMessage)
},
onload: function(t) {
var r = this,
s = r.threadId = t.thread.thread_id,
u = t.cursor,
a = r.options = t.options,
f = r.innerEl = _(i('<div id="ds-reset"></div>').appendTo(r.el));
r.data = t.thread,
at(ot, t.parentPosts || t.relatedPosts),
at(ut, t.users),
r.el.find("#ds-waiting").remove(),
a.like_thread_enabled && (r.meta = new H.Meta(r), r.meta.render().el.appendTo(f)),
a.hot_posts && t.hotPosts && t.hotPosts.length && (r.hotPosts = new H.HotPosts(i('<div class="ds-rounded"></div>'), {
max_depth: 1,
show_context: a.show_context
}), r.hotPosts.thread = r, r.hotPosts.el.appendTo(f), r.hotPosts.onload({
response: t.hotPosts,
options: {}
})),
r.postListHead = new H.PostListHead(r),
r.postList = new P.PostList({
embedThread: r,
params: {
source: "duoshuo",
thread_id: s,
max_depth: a.max_depth,
order: a.order,
limit: a.limit
}
}),
r.postList.render().reset(t.response),
r.paginator = new H.Paginator({
collection: r.postList
}),
r.paginator.reset(u);
var l = r.replybox = new H.Replybox(r),
c = l.render().el.find("textarea");
l.postList = r.postList.el;
if (o) {
var h = "ds_draft_" + s;
c.bind("focus blur keyup",
function(e) {
var t = i(e.currentTarget).val();
try {
o[h] = t
} catch(e) {}
}),
o[h] && c.val(o[h])
}
if (ct()) {
var p = i(J.loginButtons()).delegate("a.ds-more-services", "click",
function() {
return p.find(".ds-additional-services").toggle(),
!1
});
M(p)
} else r.toolbar = i(J.toolbar()).delegate(".ds-account-control", "mouseenter",
function() {
i(this).addClass("ds-active")
}).delegate(".ds-account-control", "mouseleave",
function() {
i(this).removeClass("ds-active")
}).delegate("a.ds-bind-more", "click",
function() {
var e = j("<h2>\u7ed1\u5b9a\u66f4\u591a\u5e10\u53f7</h2>" + J.serviceList(1) + J.additionalServices(1) + '<div style="clear:both"></div>').el.find(".ds-dialog").addClass("ds-dialog-bind-more").css("width", "300px");
return M(e),
!1
}).delegate("a.ds-unread-comments-count", "click",
function(e) {
return U("unread-comments"),
!1
});
r.postListHead.render().el.appendTo(f)[a.formPosition == "top" ? "before": "after"]('<a name="respond"></a>', r.toolbar || p, l.el).after(r.postList.el, r.paginator.el),
r.updateCounter(),
t.alerts && i.each(t.alerts,
function(e, t) {
i('<div class="ds-alert">' + t + "</div>").insertBefore(r.toolbar || p)
}),
a.message && c.val(a.message).focus(),
i(J.poweredBy(a.poweredby_text)).appendTo(f),
it.on("reset",
function() {
var e = it.data.comments || 0;
f.find("a.ds-unread-comments-count").html(e).attr("title", e ? "\u4f60\u6709" + e + "\u6761\u65b0\u56de\u590d": "\u4f60\u6ca1\u6709\u65b0\u56de\u590d").css("display", e ? "inline": "none")
}),
a.mzadx_id && (w.require("mzadxN",
function() {}), i('<div id="MZADX_' + a.mzadx_id + '" style="margin:0 auto;"></div>').appendTo(f), __mz_rpq = e.__mz_rpq || [], __mz_rpq.push({
l: [a.mzadx_id],
r: "1",
_srv: "MZADX",
_callback: function(e, t) {}
})),
w.thread = r,
it.data !== n && it.trigger("reset"),
ct() || D({
visit_thread_id: r.threadId
})
},
onMessage: function(e) {
dt(this.postList.el, e, this.options)
}
}),
J.hotPosts = function(e, t) {
return '<div class="ds-header ds-gradient-bg">' + k.hot_posts_title + "</div><ul>" + i.map(e,
function(e) {
return ot[e] ? J.post(ot[e].data, t) : ""
}).join("") + "</ul>"
},
H.HotPosts = R.extend({
params: "show-quote",
tmpl: "hotPosts",
render: function() {
return this.el.attr("id", "ds-hot-posts"),
this
},
onload: function(e) {
R.prototype.onload.call(this, e),
vt.call(this.el.find("ul"), this.thread, this.options)
}
}),
J.commentList = function(e, t) {
return i.map(e,
function(e) {
var n = K(e);
return '<li class="ds-comment' + (t.show_avatars ? " ds-show-avatars": "") + '" data-post-id="' + e.post_id + '">' + (t.show_avatars ? '<div class="ds-avatar">' + J.avatar(n, t.avatar_size) + "</div>": "") + '<div class="ds-meta">' + J.userAnchor(n) + (t.show_time ? J.timeHtml(e.created_at) : "") + "</div>" + (t.show_title ? '<div class="ds-thread-title">\u5728 <a href="' + p(e.thread.url + "#comments") + '">' + p(e.thread.title) + '</a> \u4e2d\u8bc4\u8bba</div><div class="ds-excerpt">' + e.message + "</div>": '<a class="ds-excerpt" title="' + p(e.thread.title) + ' \u4e2d\u7684\u8bc4\u8bba" href="' + p(e.thread.url + "#comments") + '">' + e.message + "</a>") + "</li>"
}).join("")
},
H.RecentComments = R.extend({
uri: "/api/sites/listRecentPosts",
params: "show-avatars show-time show-title avatar-size show-admin excerpt-length num-items channel-key",
tmpl: "commentList",
render: function() {
this.el.attr("id", "ds-recent-comments")
}
}),
J.recentVisitors = function(e, t) {
return i.map(e,
function(e) {
return '<div class="ds-avatar">' + J.avatar(e, t.avatar_size) + "</div>"
}).join("")
},
H.RecentVisitors = R.extend({
uri: "/api/sites/listVisitors",
params: "show-time avatar-size num-items channel-key",
tmpl: "recentVisitors",
render: function() {
this.el.children().detach(),
this.el.attr("id", "ds-recent-visitors").append(this.waitingEl = i(J.waitingImg()))
}
}),
J.topUsers = function(e, t) {
return i.map(e,
function(e) {
return '<div class="ds-avatar">' + J.avatar(e, t.avatar_size) + "<h4>" + e.name + "</h4>" + "</div>"
}).join("")
},
H.TopUsers = R.extend({
uri: "/api/sites/listTopUsers",
params: "show-time avatar-size num-items channel-key",
tmpl: "topUsers",
render: function() {
this.el.children().detach(),
this.el.attr("id", "ds-top-users").append(this.waitingEl = i(J.waitingImg()))
}
}),
J.topThreads = function(e, t) {
return i.map(e,
function(e) {
return '<li><a target="_blank" href="' + p(e.url) + '" title="' + e.title + '">' + e.title + "</a>" + "</li>"
}).join("")
},
H.TopThreads = R.extend({
uri: "/api/sites/listTopThreads",
params: "range num-items channel-key",
tmpl: "topThreads",
render: function() {
this.el.children().detach(),
this.el.attr("id", "ds-top-threads").append(this.waitingEl = i(J.waitingImg()))
}
}),
J.loginWidget = function() {
var e = '<div class="ds-icons-32">';
return i.each(["weibo", "qq", "renren", "kaixin", "douban", "netease", "sohu"],
function(t, n) {
e += '<a class="ds-' + n + '" href="' + J.loginUrl(n) + '">' + w.sourceName[n] + "</a>"
}),
e + "</div>"
},
H.LoginWidget = R.extend({
tmpl: "loginWidget",
render: function() {
var e = this.el;
e.attr("id", "ds-login").html(J.loginWidget()),
M(e, "a"),
e.find("a.ds-logout").attr("href", J.logoutUrl())
}
}),
H.ThreadCount = R.extend({
onload: function(e) {
var t = this.el,
n = t.data("count-type") || "comments",
r = e.data[n];
t[t.data("replace") ? "replaceWith": "html"](k[n + "_" + (r ? r > 1 ? "multiple": "one": "zero")].replace("{num}", r))
}
});
var yt = 0;
w.initSelector = function(e, t) {
var n = [];
V() && (i.isReady || !E) && i(e).each(function(e, r) {
var s = i(r);
if (s.data("initialized")) return;
s.data("initialized", !0);
var o = new H[t.type](s, t);
C.push(o);
if (t.type === "ThreadCount") {
var u = s.attr("data-thread-key");
s.attr("data-channel-key") && (u = s.attr("data-channel-key") + ":" + u),
n.push(u),
st[u] || (st[u] = new et({})),
st[u].on("reset",
function() {
o.onload(this)
})
} else if (o.uri) {
var a = {};
i.each(o.params.split(" "),
function(e, t) {
a[t.replace(/-/g, "_")] = s.attr("data-" + t) || s.data(t)
}),
L(o.uri, bt(a),
function(e) {
o.load(e)
})
}
}),
n.length && L("/api/threads/counts", bt({
threads: n.join(",")
}),
function(e) {
l(e),
ft(k, e.options),
at(st, e.response)
})
},
(w.initView = function() {
i.each(N, w.initSelector)
})(),
i(function() {
if (!V()) return I("\u7f3a\u5c11duoshuoQuery\u7684\u5b9a\u4e49");
setInterval(function() {
i(".ds-time").each(function() {
var e = i(this).attr("datetime");
e && (this.innerHTML = w.elapsedTime(e))
})
},
2e4),
z.ondomready && z.ondomready(),
w.initView(),
!yt && z.short_name && L("/api/analytics/ping", bt({}), l)
})
})
})(window, document);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment