js类 from qq

复制代码 代码如下:

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:                '\n',
    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':    '[精] ',
        '2':    '[荐] ',
        '3':    '[专] '
    },
    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 '' + (nick ? nick : uin) + '';
    },
    getCommentListLink: function(site_en, site_cn, sort_en, sort_cn, className)
    {
        if (className)
        {
            className = 'class="' + className + '"';
        }
        else
        {
            className = '';
        }
        return '评论首页 >> '
            + '' + site_cn + ' >> '
            + '' + sort_cn + '';
    }
}

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));
                    if (self.currPage == 0)
                    {
                        self.currPage = 1;
                    }
                }
                self.bindPageNav();
                self.bindReplyList();
                return false;
            }
        });
    },
    bindPageNav: function(flag)
    {
        var self = this;
        var currPage = self.currPage;
        if (flag != 1)
        {
            this.pageControl.movePageControl(currPage);
        }
        var pagesPerRange = 6;
        this.totalPage = parseInt(this.totalReply / this.replyPerPage)
            + (this.totalReply % this.replyPerPage != 0 ? 1 : 0);
        var startPage = parseInt((self.currPage - 1) / pagesPerRange) * pagesPerRange + 1;
        createPageNav($('page_nav'), false);
        createPageNav($('page_nav_2'), true);
        function createPageNav(obj, top)
        {
            obj.innerHTML = '';
            var i = startPage;
            if (self.currPage != 1)
            {
                obj.appendChild(createPage2(1, '第一页', top));
                obj.appendChild(createPage({
                    page:    '上一页',
                    onclick:function()
                    {
                        self.currPage = self.currPage - 1;
                        self.bindPageNav();
                        self.bindReplyList();
                        if (top)
                        {
                            window.location.replace('#reload');
                        }
                        return false;
                    }
                }));
            }
            for (; i < startPage + pagesPerRange; ++i)
            {
                if (i > self.totalPage)
                {
                    break;
                }
                obj.appendChild(createPage2(i, '', top));
            }
            if (self.currPage < self.totalPage)
            {
                obj.appendChild(createPage({
                    page:    '下一页',
                    onclick:function()
                    {
                        self.currPage = self.currPage + 1;
                        self.bindPageNav();
                        self.bindReplyList();
                        if (top)
                        {
                            window.location.replace('#reload');
                        }
                        return false;
                    }
                }));
                obj.appendChild(createPage2(self.totalPage, '最末页', top));
            }
        }

        function createPage(option)
        {
            var p = $C('a');
            if (option.page == self.currPage)
            {
                p.style.fontWeight = 'bold';
            }
            p.innerHTML = (option.text && option.text != '') ? option.text : option.page;
            p.href = '';
            p.onclick = option.onclick;
            if (option.title)
            {
                p.title = option.title;
            }
            return p;
        }
        function createPage2(page, text, top)
        {
            return createPage({
                page:    page,
                onclick:function()
                {
                    self.currPage = page;
                    self.bindPageNav();
                    self.bindReplyList();
                    if (top)
                    {
                        window.location.replace('#reload');
                    }
                    return false;
                },
                text:    text != '' ? text : ''
            });
        }
    },
    bindPageControl: function()
    {
        this.totalPage = parseInt(this.totalReply / this.replyPerPage)
            + (this.totalReply % this.replyPerPage != 0 ? 1 : 0);
        this.pageControl = new Comment.Control.Pagination({
                                                          totalPage: this.totalPage
                                                          });
        /* overwrite event virtual function */
        var self = this;
        this.pageControl.onPageChange = function()
        {
            self.currPage = this.getCurrPage();
            self.bindPageNav(1);
            self.bindReplyList();
        }
    },
    resetPageControl: function()
    {
        this.totalPage = parseInt(this.totalReply / this.replyPerPage)
            + (this.totalReply % this.replyPerPage != 0 ? 1 : 0);
        this.pageControl.reset({
                              totalPage: this.totalPage
                              });
    },
    bindTopReply: function()
    {
        var self = this;
        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);
        }

        var top_show_sum = 5;
        var index_line_len = self.index_line_len;
        var reply_start = self.data_sum['top_count'] - 1;
        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, index_line_len)
                });
                break;
            }
            if (currReply == top_show_sum)
            {
                rangeList.push({
                    url:    Comment.UrlFactory.getIndexUrl(start_index_id),
                    range:    Comment.UrlFactory.getRangeHeader(start_reply_id - currReply + replySum + 1, currReply - replySum, 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, index_line_len)
                });
                start_index_id--;
                start_reply_id = Comment.Configure.index_line_sum - 1;
                replySum = currReply;
            }
        }

        var replyList = new Array();
        var replyAllList = new Array();
        var rangeSum = rangeList.length;

        for (var i = 0; i < rangeList.length; ++i)
        {
            new getReplyList(i);
        }

        function getReplyList(i)
        {
            var comment_type = 'normal';
            var comment_id = self.commentId;
            if (self.name == 'Group')
            {
                comment_type = 'group';
                comment_id = self.groupId;
            }
            var sCommentIndexUrl = '/' + self.site + '/' + comment_type + '/'
                + Comment.UrlFactory.getCommentUrl(comment_id)
                + Comment.UrlFactory.getIndexDir('top_count')
                + '/'
                + rangeList[i].url
                + '.htm' + noCacheUrl();
            new Ajax.Request(
                 sCommentIndexUrl,
                 {
                     method:         'get',
                     asynchronous:    true,
                     onSuccess:     onSucc,
                     onFailure:        onError,
                     requestHeaders:rangeList[i].range
                 }
            );
            function onSucc(response)
            {
                replyList[i] = Comment.ContentFormat.decode(response.responseText);
                if (i == rangeSum - 1)
                {
                    replySort();
                    self.bindReplyList();
                }
            }
            function onError()
            {
            }
        }

        function replySort()
        {
            if (self.order == 0)
            {
                if (replyList.length == 1)
                {
                    replyAllList = replyAllList.concat(replyList[0]);
                }
                else
                {
                    for (var i = 0; i < replyList.length; ++i)
                    {
                        replyAllList = replyAllList.concat(replyList[i]);
                    }
                }
            }
            else
            {
                if (replyList.length == 1)
                {
                    for (var i = replyList[0].length - 1; i >= 0; --i)
                    {
                        replyAllList.push(replyList[0][i])
                    }
                }
                else
                {
                    for (var i = 0; i < replyList.length; ++i)
                    {
                        for (var j = replyList[i].length - 1; j >= 0; --j)
                        {
                            replyAllList.push(replyList[i][j])
                        }
                    }
                }
            }

            var str = '';
            for (var j = 0; j < replyAllList.length; ++j)
            {
                str += replyAllList[j] + '\r\n';
            }

            self.topReplyList = replyAllList;
        }
    }
}

Comment.User = {
    logined:    null,
    uin:        null
}

Comment.Post = {
    init: function(option)
    {
        this.base = option.base;
        this.option = option;
        this.initAsyncForm();
        this.bindPostTypeSelector();
        this.bindOtherEvent();
        this.bindPostBtn();
        this.bindBottomPostBtn();
        this.bindBottomTitleEvent();
        this.bindBottomPostTypeEvent();
        this.setDefault();
    },
    bindOpenPostBtn: function(btn, c_id)
    {
        $(btn).onclick = function()
        {
            Comment.Post.beforeOpenPost(0, '', c_id);
            return false;
        }
    },
    formElem: [
        'b_anonymous',
        'c_id',
        'c_site',
        'c_sort',
        'c_title',
        'c_content',
        'r_key',
        'r_type',
        'r_tips',
        'g_id'
    ],
    initAsyncForm: function()
    {
        var formElem = this.formElem;
        var form = $C('form');
        form.id = 'post_form';
        $A(formElem).each(function(elem_name)
        {
            var elem = $C('input');
            elem.type = 'hidden';
            elem.name = elem_name;
            elem.value = '';
            form.appendChild(elem);
        });
        document.getElementsByTagName('body')[0].appendChild(form);
    },
    clearAsyncForm: function()
    {
        $A($('post_form').getElementsByTagName('input')).each(function(elem)
        {
            elem.value = '';
        });
    },
    setDefault: function()
    {
        $('stat_post_type').innerHTML = '非匿名发表';
    },
    bindOtherEvent: function()
    {
        if (!$('r_quote_del'))
        {
            return;
        }
        /* 引用事件 */
        $('r_quote_del').onclick = function()
        {
            $('r_quote').style.display = 'none';
            return false;
        }

        /* 选择回复立场 */
        $A($('reply_type').getElementsByTagName('input')).each(
        function(radio)
        {
            if (radio.value == 'middle')
            {
                radio.checked = true;
            }
            radio.onclick = function()
            {
                if (this.value == 'agree')
                {
                    $('stat_reply_type').innerHTML = '支持原帖';
                    makeFormValue({r_type:'0'});
                }
                else if (this.value == 'disagree')
                {
                    $('stat_reply_type').innerHTML = '反对原帖';
                    makeFormValue({r_type:'1'});
                }
                else
                {
                    $('stat_reply_type').innerHTML = '中立态度';
                    makeFormValue({r_type:'2'});
                }
            }
        });

        /* 选择辩论立场 */
        $A($('debate_id').getElementsByTagName('input')).each(
        function(radio)
        {
            radio.onclick = function()
            {
                if (this.value == 'agree')
                {
                    $('stat_debate_type').innerHTML = '我是正方';
                    makeFormValue({c_id:Comment.Post.base.data_info.agree_id});
                }
                else if (this.value == 'disagree')
                {
                    $('stat_debate_type').innerHTML = '我是反方';
                    makeFormValue({c_id:Comment.Post.base.data_info.disagree_id});
                }
                else if (this.value == 'middle')
                {
                    $('stat_debate_type').innerHTML = '我是中立方';
                    makeFormValue({c_id:Comment.Post.base.data_info.middle_id});
                }
            }
        });
    },
    setReplyType: function(type)
    {
        $A($('reply_type').getElementsByTagName('input')).each(
        function(radio)
        {
            if (radio.value == type)
            {
                radio.click();
                return;
                /*
                radio.checked = true;
                var type_num = {
                    'agree':    '0',
                    'disagree':    '1',
                    'middle':    '2'
                };
                makeFormValue({r_type:type_num[type]});
                */
            }
            else
            {
                radio.checked = false;
            }
        });
    },
    setDebate: function(type, c_id)
    {
        $A($('debate_id').getElementsByTagName('input')).each(
        function(radio)
        {
            if (radio.value == type)
            {
                radio.checked = true;
                makeFormValue({c_id:c_id});
            }
            else
            {
                radio.checked = false;
            }
        });
    },
    clearValue: function()
    {
        $A($(
             'l_c_title',
             'l_c_content'
             )).each(
        function(input)
        {
            input.value = '';
        });
    },
    bindTitleEvent: function()
    {
        var d_title = Comment.Configure.reply_default_title;
        $('l_c_title').value = d_title;
        $('l_c_title').onfocus = function()
        {
            if ($('l_c_title').value == d_title)
            {
                $('l_c_title').value = '';
            }
        }
        $('l_c_title').onblur = function()
        {
            if ($('l_c_title').value == '')
            {
                $('l_c_title').value = d_title;
            }
        }
    },
    bindBottomTitleEvent: function()
    {
        if (!$('b_c_title'))
        {
            return;
        }
        var d_title = Comment.Configure.reply_default_title;
        $('b_c_title').value = d_title;
        $('b_c_title').onfocus = function()
        {
            if ($('b_c_title').value == d_title)
            {
                $('b_c_title').value = '';
            }
        }
        $('b_c_title').onblur = function()
        {
            if ($('b_c_title').value == '')
            {
                $('b_c_title').value = d_title;
            }
        }
    },
    setPostTypeSelector: function(type)
    {
        if (type == 'login_select')
        {
            $('l_login_frame').src = 'i_login.htm?l_login_frame';
            showElement('l_login_post');
            $('stat_post_type').innerHTML = '登录发表';
            $('l_b_tips').disabled = false;
            $('l_b_tips').checked = false;
            $('l_b_anonymous').checked = false;
        }
        else if (type == 'anonymous_select')
        {
            hideElement('l_login_post');
            $('stat_post_type').innerHTML = '匿名发表';
            $('l_b_tips').disabled = true;
            $('l_b_tips').checked = false;
            $('l_b_anonymous').checked = true;
        }
    },
    bindPostTypeSelector: function()
    {
        if (!$('l_b_anonymous'))
        {
            return;
        }

        $('l_b_anonymous').onclick = function()
        {
            if ($('l_b_anonymous').checked)
            {
                Comment.Post.setPostTypeSelector('anonymous_select');
            }
            else
            {
                Comment.Post.setPostTypeSelector('login_select');
            }
        }
    },
    bindPostBtn: function()
    {
        if (!$('l_post_btn'))
        {
            return;
        }
        var self = this;
        $('l_post_btn').onclick = function()
        {
            if (!getCookie('skey') && !$('l_b_anonymous').checked)
            {
                alert('很抱歉,您尚未登录,请先登录');
                return;
            }
            if ($('l_c_title').value.length > 32)
            {
                alert('很抱歉,标题不得超过32个字符');
                return;
            }
            var c_content = $('l_c_content').value.trim();
            if (c_content == '')
            {
                alert('很抱歉,请填写评论内容');
                $('l_c_content').focus();
                return;
            }
            else if (c_content.realLength() > 10000)
            {
                alert('很抱歉,评论内容不能超过10,000个字符(5,000个汉字)');
                $('l_c_content').focus();
                return;
            }
            if (self.base.min_len)
            {
                if (c_content.realLength() < self.base.min_len)
                {
                    alert('很抱歉,评论内容不能少于' + self.base.min_len + '个字符(' + self.base.min_len / 2 + '个汉字)');
                    $('l_c_content').focus();
                    return;
                }
            }
            makeFormValue(
            {
                b_anonymous:    $('l_b_anonymous').checked ? '1' : '',
                c_site:            self.base.site,
                c_sort:            self.base.sort_en,
                c_title:        ($('l_c_title').value == Comment.Configure.reply_default_title ? '' : $('l_c_title').value),
                c_content:        $('l_c_content').value,
                g_id:            self.base.comment_g_id,
                r_tips:            $('l_b_tips').checked ? '1' : ''
            });
            self.postData();
            return false;    
        };
    },
    bindBottomPostBtn: function()
    {
        if (!$('b_post_btn'))
        {
            return;
        }
        var self = this;
        $('b_post_btn').onclick = function()
        {
            if (!getCookie('skey') && !$('b_b_anonymous').checked)
            {
                alert('很抱歉,您尚未登录,请先登录');
                return;
            }
            if ($('b_c_title'))
            {
                if ($('b_c_title').value.length > 32)
                {
                    alert('很抱歉,标题不得超过32个字符');
                    $('b_c_title').focus();
                    return;
                }
            }

            var c_content = $('b_c_content').value.trim();
            if (c_content == '')
            {
                alert('很抱歉,请填写评论内容');
                $('b_c_content').focus();
                return;
            }
            else if (c_content.realLength() > 10000)
            {
                alert('很抱歉,评论内容不能超过10,000个字符');
                $('b_c_content').focus();
                return;
            }
            if (self.base.min_len)
            {
                if (c_content.realLength() < self.base.min_len)
                {
                    alert('书评内容不能少于' + self.base.min_len + '字符');
                    $('b_c_content').focus();
                    return;
                }
            }
            makeFormValue(
            {
                b_anonymous:    $('b_b_anonymous').checked  ? '1' : '',
                c_site:            self.base.site,
                c_sort:            self.base.sort_en,
                c_title:        ($('b_c_title').value == Comment.Configure.reply_default_title ? '' : $('b_c_title').value),
                c_content:        $('b_c_content').value,
                g_id:            self.base.comment_g_id,
                c_id:            self.base.commentId,
                r_tips:            $('b_b_tips').checked ? '1' : ''
            });

            self.postData();
            return false;
        };
    },
    bindBottomPostTypeEvent: function()
    {
        var self = this;
        if (!$('b_b_anonymous'))
        {
            return;
        }
        if (self.base.name != 'MiniNormal')
        {
            setTimeout(setBottomLocation, Comment.Configure.login_frame_delay);
        }
        function setBottomLocation()
        {
            $('b_login_frame').src = 'i_login.htm?b_login_frame';
        }
        $('b_b_anonymous').onclick = function()
        {
            if ($('b_b_anonymous').checked)
            {
                hideElement('b_login_post');
                with ($('b_b_tips'))
                {
                    disabled = true;
                    checked = false;
                }
            }
            else
            {
                $('b_login_frame').src = 'i_login.htm?b_login_frame';
                showElement('b_login_post');
                $('b_b_tips').disabled = false;
            }
            if (self.base.name == 'MiniNormal')
            {
                self.base.updateHeight();
            }
        }
    },
    postData: function()
    {
        showLoading('正在发送...');
        var post_form = $('post_form');
        post_form.action = Comment.Configure.postUrl;
        post_form.target = 'post_async';
        post_form.method = 'post';
        post_form.submit();
    },

    fastReplyWords:
    [
        [
            '精彩,一针见血',
            '观点独到',
            '说得很对',
            '你说得有道理'
        ],
        [
             '乱七八糟说什么',
            '你说得没道理',
            '简直是胡说八道'
        ]
    ],
    fastReply: function(btn, type, r_key, c_id)
    {
        var self = this;
        $('fastLayer').innerHTML = '';
        $('fastLayer').style.display = 'block';
        $('fastLayer').style.left = findPosX(btn) + 1 + 'px';
        $('fastLayer').style.top = findPosY(btn) + 20 + 'px';

        var replyWords = this.fastReplyWords[type];
        for (var i = 0; i < replyWords.length; ++i)
        {
            var word = $C('a');
            word.innerHTML = replyWords[i];
            word.href = '#';
            $('fastLayer').appendChild(word);
            word.onclick = function()
            {
                replyPost(this.innerHTML);
                return false;
            }
        }
        function replyPost(content)
        {
            makeFormValue(
            {
                b_anonymous:    (getCookie('skey') ? '' : '1'),
                c_id:            c_id,
                c_site:            self.base.site,
                c_sort:            self.base.data_commentinfo.sort_en,
                r_key:            r_key,
                r_type:            (type == 0 ? '3' : '4'),
                r_tips:            '',
                c_title:        '',
                c_content:        content,
                g_id:            self.base.comment_g_id
            });

            self.postData();
        }
    },
    onError: function(msg)
    {
        alert(msg);
    },
    onSucc: function()
    {
        var self = this;
        setTimeout(reload, 300);
        function reload()
        {
            self.base.reload();
            window.location.replace('#reload');
        }
    },
    clearBottomInput: function()
    {
        $A($(
            'b_c_title',
            'b_c_content'
        )).each(function(elem)
        {
            if (elem)
            {
                elem.value = '';
            }
        });
    },
    logout: function()
    {
        var url = Comment.Configure.loginIframeUrl + '?l_login_frame';
        if ($('l_login_frame'))
        {
            $('l_login_frame').src = Comment.Configure.logoutUrl + '?url=' + url;
        }
        if ($('b_login_frame'))
        {
            $('b_login_frame').src = Comment.Configure.logoutUrl + '?url=' + url;
        }
    },
    callback: function(url)
    {
        hideLoading();
        $('post_async').src = 'about:blank';

        var code = url.substr(url.indexOf('code=') + 5);
        if (code == '-')
        {
            code = -1;
        }
        code = code / 1;
        getFormValue('r_type');
        if (code == -1 && Comment.Post.r_type >= 3)
        {
            code = 0;
        }
        var errMsg = '';
        switch (code)
        {
        case -1:
            errMsg = '您的评论已提交审核,感谢您的参与!';
            this.closePostLayer();
            this.clearBottomInput();
            break;
        case 0:
            errMsg = '发表成功,感谢您的参与!';
            this.onSucc();
            this.closePostLayer();
            this.clearBottomInput();
            break;
        case 1:
            errMsg = '很抱歉,您填写的内容不完整,请重新输入您的内容。';
            break;
        case 2:
            errMsg = '很抱歉,您尚未登录或登录已经过期,请先登录。';
            this.logout();
            break;
        case 3:
            errMsg = '您的评论已提交审核,感谢您的参与!';
            this.closePostLayer();
            this.clearBottomInput();
            break;
        case 4:
            errMsg = '您的IP地址已暂时被屏蔽。';
            break;
        case 5:
            errMsg = '您的QQ号已暂时禁止在本评论系统发言。';
            break;
        case 6:
            errMsg = '很抱歉,您的QQ号码和密码不匹配。';
            break;
        case 7:
            errMsg = '很抱歉,系统繁忙,请稍候再试。';
            break;
        case 8:
            errMsg = '很抱歉,您发表的频率太快,请稍后再试。';
            break;
        }
        if (errMsg != '')
        {
            this.onError(errMsg);
        }
    },
    openPostLayer: function()
    {
        $('sPost').style.top = document.documentElement.scrollTop + 50;
        $('sPost').style.left = 300;        
        $('sLayer').style.height = document.documentElement.scrollHeight;
        $('sLayer').oncontextmenu = function(){return false};
        $('sLayer').className = 'dis';
        $('sPost').className= 'dis';
        this.auto = setInterval(setAuto, 200);
        function setAuto()
        {
            $('sPost').style.top = document.documentElement.scrollTop + 50;
        }
    },
    closePostLayer: function()
    {
        if (!$('sLayer'))
        {
            return;
        }
        $('sLayer').oncontextmenu = function(){return true};
        $('sLayer').className = 'undis';
        $('sPost').className = 'undis';
        clearInterval(this.auto);
        this.clearAsyncForm();
        this.clearValue();
        Debug.log('clearAsyncForm');
    },
    beforeOpenPost: function(type, r_key, c_id, content)
    {
        /* type -> 发表评论的方式
        0:普通评论的回复
        1:普通评论的引用回复
        2:辩论评论的回复
        */
        this.bindTitleEvent();
        $('post_article').innerHTML = this.base.comment_title.left(20);
        if (getCookie('skey'))
        {
            this.setPostTypeSelector('login_select');
        }
        else
        {
            this.setPostTypeSelector('anonymous_select');
        }
        $('l_b_tips').checked = false;
        switch (type)
        {
        case 0:
            hideElement('debate_id', 'reply_type', 'r_quote');
            makeFormValue(
            {
                c_id:            c_id
            });
            break;
        case 1:
            hideElement('debate_id');
            $('post_quote').innerHTML = (content).stripTags();
            showElement('r_quote', 'reply_type');
            this.setReplyType('middle');
            $('stat_reply_type').innerHTML = '中立态度';
            makeFormValue(
            {
                r_key:            r_key,
                r_type:            '2',
                c_id:            c_id
            });
            break;
        case 2:
            hideElement('reply_type', 'r_quote');
            showElement('debate_id');
            break;
        }
        this.openPostLayer();
    }
}

var NDEBUG = true;
var Debug = {
    init: function()
    {
        if (NDEBUG == true)
        {
            return;
        }
        var divDebug = $C('div');
        this.divDebug = divDebug;
        with (divDebug.style)
        {
            top = '10px';
            left = '10px';
            width = '300px';
            height = '200px';
            overflow = 'scroll';
            verticalAlign = 'top';
            position = 'absolute';
            backgroundColor = '#fff';
            padding = '5px';
            lineHeight = '110%';
        }
        document.getElementsByTagName('body')[0].appendChild(divDebug);
        this.auto = setInterval(setAuto, 200);
        function setAuto()
        {
            divDebug.style.top = document.documentElement.scrollTop + 10;
        }
        Debug.log('Debug');
        divDebug.ondblclick = function()
        {
            NDEBUG = true;
            Element.remove(divDebug);
        }
        this.height = 0;
    },
    log: function(str)
    {
        if (NDEBUG == true)
        {
            return;
        }
        var now = new Date();
        this.divDebug.innerHTML += '[' + now.getHours() + ':' 
            + now.getMinutes() + ':'
            + now.getSeconds() + '] ' + str + '
';
        this.divDebug.scrollTop = 10000000;
    }
}

var divLoading = null;
function showLoading(action)
{
    if (!divLoading)
    {
        divLoading = $C('div');
        divLoading.className = 'loading';
        document.getElementsByTagName('body')[0].appendChild(divLoading);
    }
    if (!action)
    {
        divLoading.innerHTML = '正在读取...';
    }
    else
    {
        divLoading.innerHTML = action;
    }
    divLoading.style.top = document.documentElement.scrollTop;
    divLoading.style.left = '0px';
    divLoading.style.display = 'block';
}
function hideLoading()
{
    if (!divLoading)
    {
        return;
    }
    divLoading.style.display = 'none';
}
function showElement()
{
    for (var i = 0; i < arguments.length; i++)
    {
        var element = arguments[i];
        if ($(element))
        {
            $(element).style.display = 'block';
        }
    }
}
function hideElement()
{
    for (var i = 0; i < arguments.length; i++)
    {
        var element = arguments[i];
        if ($(element))
        {
            $(element).style.display = 'none';
        }
    }
}
function getFormValue(name)
{
    $A($('post_form').getElementsByTagName('input')).each(function(elem)
    {
        if (elem.name == name)
        {
            Comment.Post.r_type = elem.value;
            return elem.value;
        }
        else
        {
            return null;
        }
    });
}
function makeFormValue(name2Value)
{
    Debug.log('makeFormValue start');
    $A($('post_form').getElementsByTagName('input')).each(function(elem)
    {
        if (name2Value[elem.name] != null)
        {
            elem.value = name2Value[elem.name];
        }
        Debug.log(elem.name + ': ' + elem.value);
    });
    Debug.log('makeFormValue end');
}
function noCacheUrl()
{
    return '?cache=' + rndNum(9);
}
function rndNum(n)
{
    var rnd= '1.';
    for(var i = 0; i < n; i++)
        rnd += Math.floor(Math.random() * 10);
    return rnd;
}
var sUrl = window.location.href.toString();
var sDomain = sUrl.substring(7, sUrl.indexOf('/', 7));
var sPath = sUrl.substring(sUrl.indexOf('/', 7));
var sParam = sUrl.substring(sUrl.indexOf('?') + 1);
if (sParam.indexOf('#') != -1)
{
    sParam = sParam.substr(0, sParam.indexOf('#'));
}
document.domain = 'qq.com';

var initWith = {
    'comment':            'Normal',
    'i_comment':        'MiniNormal',
    'comment_group':    'Group',
    'comment_debate':    'Debate',
    'comment_reply_pk':    'ReplyPK',
    'comment_user':        'UserReply',
    'list':                'List'
};

window.onload = function()
{
    Comment.Start();
}

Comment.Start = function()
{
    Debug.init();
    for (var url in initWith)
    {
        if (sUrl.indexOf('/' + url + '.htm') != -1)
        {
            if (url == 'list')
            {
                Comment.Page[initWith[url]].load(sUrl);
            }
            else
            {
                Comment.Page[initWith[url]].load(sParam.toQueryParams());
            }
        }
    }

    document.body.onclick = function()
    {
        if ($('fastLayer'))
        {
            $('fastLayer').style.display = 'none';
        }
    }
}

Comment.HotList = 
{
    siteObject:    {
        'news':    '新闻',
        'ent':    '娱乐',
        'finance':    '财经',
        'tech':    '科技',
        'auto':    '汽车',
        'gamezone':    '游戏',
        'edu':    '教育',
        'book':    '读书',
        'lady':    '女性',
        'astro':    '星座',
        'sports':    '体育',
        'comic':    '动漫',
        'luxury':    '时尚',
        'joke':    '笑话',
        'cq':    '重庆',
        'xian':    '西安',
        'view':    '说吧'
    },
    getRandomSite: function()
    {
        if (!this.siteArray)
        {
            this.siteArray = new Array();
            for (var site_en in this.siteObject)
            {
                this.siteArray.push(site_en);
            }
        }
        var site_sum = this.siteArray.length;
        var rnd_site = Math.floor(Math.random() * site_sum);
        return this.siteArray[rnd_site];
    },
    bindTopHotList: function(container, site)
    {
        var topSiteSum = 6;
        var topSite = new Object();
        if (site != '')
        {
            if (this.siteObject[site])
            {
                topSite[site] = this.siteObject[site];
                topSiteSum--;
            }
        }

        while (topSiteSum > 0)
        {
            var rnd_site = this.getRandomSite();
            if (topSite[rnd_site])
            {
                continue;
            }
            topSite[rnd_site] = this.siteObject[rnd_site];
            topSiteSum--;
        }

        var hot_index = 0;
        var hot_header = '';
        var hot_body = '';
        for (var site_en in topSite)
        {
            hot_header += '' + topSite[site_en] + '

';
            hot_body += '';
            hot_index++;
        }
        var hot_html = '
' + hot_header + '
' + hot_body + '
';
        $(container).innerHTML = hot_html;

        for (var site_en in topSite)
        {
            this.bindTopSite('Hot_Top_' + site_en, '/c/async_html/' + site_en + '_top.htm');
        }
    },
    bindRightHotList: function(container, site)
    {
        var topSiteSum = 3;
        var topSite = new Object();
        if (site != '')
        {
            if (this.siteObject[site])
            {
                topSite[site] = this.siteObject[site];
                topSiteSum--;
            }
        }

        while (topSiteSum > 0)
        {
            var rnd_site = this.getRandomSite();
            if (topSite[rnd_site])
            {
                continue;
            }
            topSite[rnd_site] = this.siteObject[rnd_site];
            topSiteSum--;
        }

        var hot_body = '';
        for (var site_en in topSite)
        {
            hot_body += '
' + topSite[site_en] + '热评
';
        }
        $(container).innerHTML = hot_body;

        for (var site_en in topSite)
        {
            this.bindTopSite('Hot_Right_' + site_en, '/c/async_html/' + site_en + '_right.htm');
        }
    },
    bindTopSite: function(container, url)
    {
        new Ajax.Request(
             url,
             {
                 method:         'get',
                 onSuccess:     onSucc,
                 onFailure:        onError
             }
        );
        function onSucc(response)
        {
            $(container).innerHTML = response.responseText;
        }
        function onError()
        {
            $(container).innerHTML = '';
        }
    }
}

你可能感兴趣的:(js类 from qq)