复制代码 代码如下:
var Comment = new Object();
var $C = function(tagName)
{
return document.createElement(tagName);
};
String.prototype.trim = function()
{
return this.replace(/^s*|s*$/g,"");
};
String.prototype.realLength = function()
{
return this.replace(/[^x00-xff]/g,"**").length;
};
String.prototype.left = function(n)
{
if (this.length > n)
{
return this.substr(0, n) + "...";
}
else
{
return this;
}
};
Array.prototype.remove = function(n)
{
if (n < 0)
{
return this;
}
else
{
return this.slice(0, n).concat(this.slice(n + 1, this.length));
}
};
function findPosX(obj)
{
var curleft = 0;
if (obj && obj.offsetParent)
{
while (obj.offsetParent)
{
curleft += obj.offsetLeft;
obj = obj.offsetParent;
}
}
else if (obj && obj.x) curleft += obj.x;
return curleft;
}
function findPosY(obj)
{
var curtop = 0;
if (obj && obj.offsetParent)
{
while (obj.offsetParent)
{
curtop += obj.offsetTop;
obj = obj.offsetParent;
}
}
else if (obj && obj.y) curtop += obj.y;
return curtop;
}
var input_domain = "http://input.comment.qq.com";
var index_domain = "http://comment1.qq.com";
var pinglun_domain = "http://pinglun.qq.com";
var js_domain = "http://pinglun.qq.com";
var img_domain = "http://mat1.qq.com/pinglun";
Comment.Configure = {
version: "1.0",
newline: "
",
site_length: 20,
key_length: 20,
id_length: 10,
index_line_sum: 10000,
index_width: 5,
default_mode: "origin_count",
default_order: 1,
default_reply_per_page: 10,
quote_str_len: 60,
intro_len: 150,
debate_intro_len: 200,
content_len: 200,
reply_default_title: "请填写标题",
intro_min_length: 20,
request_delay: 100,
login_frame_delay: 2000,
reply_type_def: {
"1": "<span class="reply_top">[精]</span> ",
"2": "<span class="reply_commend">[荐]</span> ",
"3": "<span class="reply_expert">[专]</span> "
},
postUrl: input_domain + "/post.cmt",
logoutUrl: input_domain + "/cgi-bin/qqlogout",
commentIndex: "http://pinglun.qq.com/",
loginIframeUrl: index_domain + "/i_login.htm",
defaultLogoUrl: img_domain + "/images/defpic.jpg"
}
Comment.Define = {
getReplyType: function(type)
{
if (Comment.Configure.reply_type_def[type])
{
return Comment.Configure.reply_type_def[type];
}
else
{
return "";
}
}
}
Comment.PGV_Count = function(option)
{
if (typeof(pgvMain) == "function")
{
pvRepeatCount = 1;
pvCurDomain = sDomain;
if (option)
{
if (option.domain)
{
pvCurDomain = option.domain;
}
if (option.path)
{
pvCurUrl = option.path;
}
}
pgvMain();
//Debug.log("call pgv function");
}
}
Comment.UrlFactory = {
get3LevelDir: function(id)
{
var path = parseInt(id / 1000000) + "/";
path += parseInt(id / 1000) + "/";
path += id / 1;
return path;
},
getCommentUrl: function(id)
{
return (this.get3LevelDir(id) + "/");
},
getDebateUrl: function(id)
{
return this.get3LevelDir(id);
},
getUserUrl: function(id)
{
return this.get3LevelDir(id);
},
getReplyUrl: function(key)
{
var path = key.substr(0, 8);
path += "/" + (key.substr(8, 4));
path += "/" + (key.substr(12, 2));
path += "/" + key;
return path;
},
getIndexUrl: function(id)
{
var length = id.toString().length;
if (length < Comment.Configure.index_width)
{
for (var i = 0; i < Comment.Configure.index_width - length; ++i)
{
id = "0" + id;
}
}
return id;
},
getIndexDir: function(mode)
{
var modes = {
"origin_count": "originindex",
"total_count": "allindex",
"top_count": "topindex"
};
return modes[mode];
},
getRangeHeader: function(start, length, line_len)
{
var range_start = start * line_len;
var range_length = length * line_len;
return ["Range","bytes=" + range_start + "-" + (parseInt(range_start) + parseInt(range_length) - 1 - Comment.Configure.newline.length)];
},
getCommentNormalUrl: function(site, id)
{
return "comment.htm?site=" + site + "&id=" + id;
},
getCommentGroupUrl: function(site, id)
{
return "comment_group.htm?site=" + site + "&id=" + id;
},
getCommentDebateUrl: function(site, id)
{
return "comment_debate.htm?site=" + site + "&id=" + id;
},
getCommentUserUrl: function(uin)
{
return "comment_user.htm?uin=" + uin;
},
getCommentUserLink: function(uin, nick)
{
return "<a href="" + this.getCommentUserUrl(uin) + "" target="_blank">" + (nick ? nick : uin) + "</a>";
},
getCommentListLink: function(site_en, site_cn, sort_en, sort_cn, className)
{
if (className)
{
className = "class="" + className + """;
}
else
{
className = "";
}
return "<a href="" + Comment.Configure.commentIndex + "" " + className + " target="_blank">评论首页</a> >> "
+ "<a href="list.htm?" + site_en + "." " + className + " target="_blank">" + site_cn + "</a> >> "
+ "<a href="list.htm?" + site_en + "." + sort_en + "" " + className + " target="_blank">" + sort_cn + "</a>";
}
}
Comment.ContentFormat = {
decode: function(content)
{
return content.split(Comment.Configure.newline);
}
}
Comment.DataObjectFactory = function(content, model)
{
content = Comment.ContentFormat.decode(content);
var dataModel = Comment.DataObject[model];
if (content.length - 1 != dataModel.length)
{
if (model != "commentinfo" && model != "listsum")
{
//alert("[DEBUG 信息] O/R 映射失败,远程数据和本地模型数量不匹配!请检查!");
}
}
var dataObject = new Object();
for (var i = 0; i < dataModel.length; ++i)
{
dataObject[dataModel[i]] = content[i];
}
return dataObject;
}
Comment.DataObject = {
"commentinfo":
[
"site_cn",
"sort_en",
"sort_cn",
"source",
"source_url",
"title",
"url",
"intro",
"intro_img",
"group_id",
"intro_show",
"create_time",
"debate_id"
],
"groupinfo":
[
"site_cn",
"title",
"url",
"intro",
"intro_img",
"comment_id",
"intro_show",
"create_time"
],
"debateinfo":
[
"site_cn",
"title",
"url",
"intro",
"intro_img",
"agree_id",
"disagree_id",
"middle_id",
"intro_show",
"create_time"
],
"sum":
[
"origin_count",
"total_count",
"top_count"
],
"reply":
[
"comment_id",
"uin",
"nickname",
"pub_time",
"pass_time",
"ip",
"title",
"content",
"reply_key",
"is_del",
"reply_type",
"reply_kind",
"tips"
],
"pksum":
[
"agree",
"disagree",
"middle"
],
"listsum":
[
"all"
],
"usersum":
[
"total_count",
"top_count",
"is_expert"
],
"userinfo":
[
"user_img",
"user_intro"
]
}
/* 控制器类 */
Comment.Control = new Object();
/* 分页控制器 */
Comment.Control.Pagination = Class.create();
Comment.Control.Pagination.prototype = {
initialize: function(option)
{
this.totalPage = option.totalPage;
this.currPage = 1;
this.zoom_start = 3;
this.zoom_end = 613;
this.bindControl();
},
reset: function(option)
{
this.totalPage = option.totalPage;
this.currPage = 1;
this.movePageControl(this.currPage);
},
updateOrder: function()
{
},
countCurrPage: function(offset)
{
var page = parseInt(offset * this.totalPage / this.zoom_end) + 1;
if (page > this.totalPage)
{
page = this.totalPage;
}
return page;
},
movePageControl: function(toPage)
{
if (toPage < 1 || toPage > this.totalPage)
{
return;
}
var offset = 0;
if (toPage == 1)
{
offset = this.zoom_start;
}
else if (toPage == this.totalPage)
{
offset = this.zoom_end;
}
else
{
offset = this.zoom_start + (toPage - 1) * (this.zoom_end / (this.totalPage - 1));
}
$("scrfloat").style.left = offset + "px";
//$("scrfloat_2").style.left = offset + "px";
},
bindControl: function()
{
var self = this;
var tooltip = $("Page_tip");
var offsetX = 10;
var offsetY = -10;
function getSite(o)
{
var obj = o;
var objS = obj.offsetLeft;
while (obj != obj.offsetParent && obj.offsetParent)
{
obj = obj.offsetParent;
if (obj.tagName == "span")
{
objS += obj.offsetLeft;
}
}
return objS;
}
Event.observe($("scr"), "mousedown", mDown, false);
//Event.observe($("scr_2"), "mousedown", mDown, false);
var flag = false;
function mDown()
{
flag = true;
if(window.event.srcElement.id != "scr"
&& window.event.srcElement.id != "scr_2")
{
$("scrfloat").style.left = $("scrfloat").offsetLeft;
//$("scrfloat_2").style.left = $("scrfloat").style.left;
}
else
{
$("scrfloat").style.left = (window.event.x - 5);
//$("scrfloat_2").style.left = $("scrfloat").style.left;
}
tooltip.style.display = "block";
t = $("scrfloat").offsetLeft;
tooltip.innerHTML = self.countCurrPage(t);
tooltip.style.left = window.event.clientX + offsetX + "px";
tooltip.style.top = window.event.clientY + offsetY + document.documentElement.scrollTop + "px";
}
function mMove()
{
if(flag)
{
$("scrfloat").style.left = window.event.clientX - getSite($("scr")) - 5 + "px";
//$("scrfloat_2").style.left = window.event.clientX - getSite($("scr")) - 5 + "px";
}
if (parseInt($("scrfloat").style.left.replace("px", "")) > self.zoom_end)
{
$("scrfloat").style.left = self.zoom_end + "px";
//$("scrfloat_2").style.left = $("scrfloat").style.left;
}
if (parseInt($("scrfloat").style.left.replace("px", "")) < self.zoom_start)
{
$("scrfloat").style.left = self.zoom_start + "px";
//$("scrfloat_2").style.left = $("scrfloat").style.left;
}
if (flag)
{
t = $("scrfloat").offsetLeft;
tooltip.innerHTML = self.countCurrPage(t);
tooltip.style.left = window.event.clientX + offsetX + "px";
tooltip.style.top = window.event.clientY + offsetY + document.documentElement.scrollTop + "px";
}
}
function mUp()
{
if (flag)
{
t = $("scrfloat").offsetLeft;
self.setCurrPage(self.countCurrPage(t));
}
flag = false;
tooltip.style.display = "none";
}
function mEnd()
{
window.event.returnValue = false;
}
window.document.onmousemove = mMove;
window.document.ondragstart = mEnd;
window.document.onmouseup = mUp;
Event.observe($("up"), "click", mUpBtn, false);
Event.observe($("down"), "click", mDownBtn, false);
function mUpBtn()
{
self.setCurrPage(self.currPage - 1, 1);
}
function mDownBtn()
{
self.setCurrPage(self.currPage + 1, 1);
}
},
nextPage: function()
{
if (this.currPage < this.totalPage)
{
++this.currPage;
this.onPageChange();
}
},
previousPage: function()
{
if (this.currPage > 0)
{
--this.currPage;
this.onPageChange();
}
},
setCurrPage: function(page, move)
{
if (page > 0 && page <= this.totalPage && page != this.currPage)
{
this.currPage = page;
this.onPageChange();
if (move != null)
{
this.movePageControl(page);
}
}
},
onPageChange: function()
{
},
getCurrPage: function()
{
return this.currPage;
}
}
Comment.Iterator = {
getIndex: function(objComment)
{
var rangeList = new Array();
function getIndexId(reply_id)
{
return parseInt(reply_id / Comment.Configure.index_line_sum);
}
function getReplyPos(reply_id)
{
return (reply_id % Comment.Configure.index_line_sum);
}
if (objComment.order == 0)
{
var reply_start = (objComment.currPage - 1) * objComment.replyPerPage;
var start_index_id = getIndexId(reply_start);
var start_reply_id = getReplyPos(reply_start);
var currReply = 1;
var replySum = 0;
while (currReply++)
{
if (reply_start + currReply > objComment.totalReply)
{
rangeList.push({
url: Comment.UrlFactory.getIndexUrl(start_index_id),
range: Comment.UrlFactory.getRangeHeader(start_reply_id, currReply - replySum - 1, objComment.index_line_len)
});
break;
}
if (currReply == objComment.replyPerPage)
{
rangeList.push({
url: Comment.UrlFactory.getIndexUrl(start_index_id),
range: Comment.UrlFactory.getRangeHeader(start_reply_id, currReply - replySum, objComment.index_line_len)
});
break;
}
if (start_reply_id + currReply > Comment.Configure.index_line_sum)
{
rangeList.push({
url: Comment.UrlFactory.getIndexUrl(start_index_id),
range: Comment.UrlFactory.getRangeHeader(start_reply_id, currReply, objComment.index_line_len)
});
start_index_id++;
start_reply_id = 0;
replySum = currReply - 1;
}
}
}
else
{
var reply_start = objComment.totalReply - 1 - (objComment.currPage - 1) * objComment.replyPerPage;
var start_index_id = getIndexId(reply_start);
var start_reply_id = getReplyPos(reply_start);
var currReply = 1;
var replySum = 0;
while (currReply++)
{
if (reply_start - currReply < 0)
{
rangeList.push({
url: Comment.UrlFactory.getIndexUrl(start_index_id),
range: Comment.UrlFactory.getRangeHeader(0, start_reply_id + 1, objComment.index_line_len)
});
break;
}
if (currReply == objComment.replyPerPage)
{
rangeList.push({
url: Comment.UrlFactory.getIndexUrl(start_index_id),
range: Comment.UrlFactory.getRangeHeader(start_reply_id - currReply + replySum + 1, currReply - replySum, objComment.index_line_len)
});
break;
}
if (start_reply_id - currReply < 0)
{
rangeList.push({
url: Comment.UrlFactory.getIndexUrl(start_index_id),
range: Comment.UrlFactory.getRangeHeader(0, start_reply_id + 1, objComment.index_line_len)
});
start_index_id--;
start_reply_id = Comment.Configure.index_line_sum - 1;
replySum = currReply;
}
}
}
return rangeList;
}
}
/* 显示样式控制器 */
Comment.Control.Display = Class.create();
Comment.Control.Display.prototype = {
initialize: function()
{
}
}
/* 页面显示类 */
Comment.Page = new Object();
/* 评论页控制接口 */
Comment.Page.Base = {
changeMode: function(mode)
{
this.mode = mode;
this.totalReply = this.data_sum[mode];
this.totalPage = parseInt(this.totalReply / this.replyPerPage)
+ (this.totalReply % this.replyPerPage != 0 ? 1 : 0);
},
changeOrder: function(order)
{
if (this.order == order)
return;
this.order = order;
this.currPage = 1;
this.resetPageControl();
this.bindPageNav();
this.bindReplyList();
this.bindOrderControl();
},
bindOrderControl: function()
{
var self = this;
if (self.order == 0)
{
$("order_front").style.cursor = "none";
$("order_front").style.color = "#000";
$("order_front").onclick = function(e)
{
return false;
}
$("order_desc").style.cursor = "pointer";
$("order_desc").style.color = "#3B78AF";
$("order_desc").onclick = function()
{
self.changeOrder(1);
return false;
}
}
else if (self.order == 1)
{
$("order_front").style.cursor = "pointer";
$("order_front").style.color = "#3B78AF";
$("order_front").onclick = function(e)
{
self.changeOrder(0);
return false;
}
$("order_desc").style.cursor = "none";
$("order_desc").style.color = "#000";
$("order_desc").onclick = function()
{
return false;
}
}
},
bindRowsPerPage: function()
{
var self = this;
$A($("rows_page").getElementsByTagName("a")).each(function(button)
{
button.onclick = function()
{
self.replyPerPage = button.value;
self.currPage = 1;
self.resetPageControl();
self.bindPageNav();
self.bindReplyList();
return false;
}
});
},
selectTab: function(mode)
{
var self = this;
$A($("mode_tab").getElementsByTagName("p")).each(function(tab)
{
if (tab.value == mode)
{
$A($("mode_tab").getElementsByTagName("p")).each(function(t)
{
if (t.value != "")
{
t.className = "none";
}
});
tab.className = "c";
}
});
},
appendTab: function(option)
{
var pTab = $C("p");
pTab.innerHTML = option.title;
pTab.value = "";
$("mode_tab").appendChild(pTab);
pTab.onclick = function()
{
window.open(option.url);
}
return false;
},
bindTabControl: function()
{
var self = this;
$A($("mode_tab").getElementsByTagName("p")).each(function(tab)
{
var mode = tab.value;
if (mode != "")
{
tab.onclick = function()
{
$A($("mode_tab").getElementsByTagName("p")).each(function(t)
{
t.className = "none";
});
this.className = "c";
self.currPage = 1;
self.changeMode(mode)
self.resetPageControl();
self.bindPageNav();
self.bindReplyList();
return false;
}
}
});
},
bindPageRandom: function()
{
var self = this;
$A($("page_random", "page_random_2")).each(function(button)
{
button.onclick = function()
{
if (self.totalPage == 1)
{
self.currPage = 1;
}
else
{
self.currPage = Math.floor(Math.random() * (self.totalPage + 1));
&nb