#coding: utf-8
# +-------------------------------------------------------------------
# | 宝塔Linux面板
# +-------------------------------------------------------------------
# | Copyright (c) 2015-2016 宝塔软件(http://bt.cn) All rights reserved.
# +-------------------------------------------------------------------
# | Author: hwliang <hwl@bt.cn>
# +-------------------------------------------------------------------
import math,string,public

class Page():
    #--------------------------
    # 分页类 - JS回调版
    #--------------------------
    __PREV          =   public.GetMsg("PAGE")["PREV"]
    __NEXT          =   public.GetMsg("PAGE")["NEXT"]
    __START         =   public.GetMsg("PAGE")["START"]
    __END           =   public.GetMsg("PAGE")["END"]
    __COUNT_START   =   public.GetMsg("PAGE")["COUNT_START"]
    __COUNT_END     =   public.GetMsg("PAGE")["COUNT_END"]
    __FO            =   public.GetMsg("PAGE")["FO"]
    __LINE          =   public.GetMsg("PAGE")["LINE"]
    __LIST_NUM      =  4
    SHIFT         =  None           #偏移量
    ROW           =  None           #每页行数
    __C_PAGE        =  None           #当前页
    __COUNT_PAGE    =  None           #总页数
    __COUNT_ROW     =  None           #总行数
    __URI           =  None           #URI
    __RTURN_JS      =  False          #是否返回JS回调
    __START_NUM     =  None           #起始行
    __END_NUM       =  None           #结束行
    
    def __init__(self):
        tmp = public.GetMsg('PAGE');
        if tmp:
            self.__PREV         = tmp['PREV'];
            self.__NEXT         = tmp['NEXT'];
            self.__START        = tmp['START'];
            self.__END          = tmp['END'];
            self.__COUNT_START  = tmp['COUNT_START'];
            self.__COUNT_END    = tmp['COUNT_END'];
            self.__FO           = tmp['FO'];
            self.__LINE         = tmp['LINE'];
    
    def GetPage(self,pageInfo,limit = '1,2,3,4,5,6,7,8'):
        # 取分页信息
        # @param pageInfo 传入分页参数字典
        # @param limit 返回系列
        self.__RTURN_JS    = pageInfo['return_js']
        self.__COUNT_ROW   = pageInfo['count']
        self.ROW         = pageInfo['row']
        self.__C_PAGE      = self.__GetCpage(pageInfo['p'])
        self.__START_NUM   = self.__StartRow()
        self.__END_NUM     = self.__EndRow()
        self.__COUNT_PAGE  = self.__GetCountPage()
        self.__URI         = self.__SetUri(pageInfo['uri'])
        self.SHIFT       = self.__START_NUM - 1
        
        keys = limit.split(',')
        
        pages = {}
        #起始页
        pages['1'] = self.__GetStart()
        #上一页
        pages['2'] = self.__GetPrev()
        #分页
        pages['3'] = self.__GetPages()
        #下一页
        pages['4'] = self.__GetNext()
        #尾页
        pages['5'] = self.__GetEnd()
        
        #当前显示页与总页数
        pages['6'] = "<span class='Pnumber'>" + str(self.__C_PAGE) + "/" + str(self.__COUNT_PAGE) + "</span>"
        #本页显示开始与结束行
        pages['7'] = "<span class='Pline'>" + self.__FO + str(self.__START_NUM) + "-" + str(self.__END_NUM) + self.__LINE + "</span>"
        #行数
        pages['8'] = "<span class='Pcount'>" + self.__COUNT_START + str(self.__COUNT_ROW) + self.__COUNT_END + "</span>"
        
        #构造返回数据
        retuls = '<div>';
        for value in keys:
            retuls += pages[value]
        retuls +='</div>';
        
        #返回分页数据
        return retuls;
            
    def __GetEnd(self):
        #构造尾页
        endStr = ""
        if self.__C_PAGE >= self.__COUNT_PAGE:
            endStr = '';
        else:
            if self.__RTURN_JS == "":
                endStr = "<a class='Pend' href='" + self.__URI + "p=" + str(self.__COUNT_PAGE) + "'>" + self.__END + "</a>"
            else:
                endStr = "<a class='Pend' onclick='" + self.__RTURN_JS + "(" + str(self.__COUNT_PAGE) + ")'>" + self.__END + "</a>"
        return endStr
    
    def __GetNext(self):
        #构造下一页
        nextStr = ""
        if self.__C_PAGE >= self.__COUNT_PAGE:
            nextStr = '';
        else:
            if self.__RTURN_JS == "":
                nextStr = "<a class='Pnext' href='" + self.__URI + "p=" + str(self.__C_PAGE + 1) + "'>" + self.__NEXT + "</a>"
            else:    
                nextStr = "<a class='Pnext' onclick='" + self.__RTURN_JS + "(" + str(self.__C_PAGE + 1) + ")'>" + self.__NEXT + "</a>"
        
        return nextStr
    
    def __GetPages(self):
        #构造分页
        pages = ''
        num   = 0
        #当前页之前
        if (self.__COUNT_PAGE - self.__C_PAGE) < self.__LIST_NUM:
            num = self.__LIST_NUM + (self.__LIST_NUM - (self.__COUNT_PAGE - self.__C_PAGE));
        else:
            num = self.__LIST_NUM
        n = 0
        for i in range(num):
            n = num - i
            page = self.__C_PAGE - n;
            if page > 0:
                if self.__RTURN_JS == "":
                    pages += "<a class='Pnum' href='" + self.__URI + "p=" + str(page) + "'>" + str(page) + "</a>"
                else:
                    pages += "<a class='Pnum' onclick='" + self.__RTURN_JS + "(" + str(page) + ")'>" + str(page) + "</a>"
            
        #当前页
        if self.__C_PAGE > 0:
                pages += "<span class='Pcurrent'>" + str(self.__C_PAGE) + "</span>"
        
        #当前页之后
        if self.__C_PAGE <= self.__LIST_NUM:
            num = self.__LIST_NUM + (self.__LIST_NUM - self.__C_PAGE) + 1
        else:
            num = self.__LIST_NUM;
        for i in range(num):
            if i == 0:
                continue
            page = self.__C_PAGE + i;
            if page > self.__COUNT_PAGE:
                break;
            if self.__RTURN_JS == "":
                pages += "<a class='Pnum' href='" + self.__URI + "p=" + str(page) + "'>" + str(page) + "</a>"
            else:    
                pages += "<a class='Pnum' onclick='" + self.__RTURN_JS + "(" + str(page) + ")'>" + str(page) + "</a>"
                
        return pages;
    
    def __GetPrev(self):
        #构造上一页
        startStr = ''
        if self.__C_PAGE == 1:
            startStr = '';
        else:
            if self.__RTURN_JS == "":
                startStr = "<a class='Ppren' href='" + self.__URI + "p=" + str(self.__C_PAGE - 1) + "'>" + self.__PREV + "</a>"
            else:    
                startStr = "<a class='Ppren' onclick='" + self.__RTURN_JS + "(" + str(self.__C_PAGE - 1) + ")'>" + self.__PREV + "</a>"
        return startStr
    
    def __GetStart(self):
        #构造起始分页
        startStr = ''
        if self.__C_PAGE == 1:
            startStr = '';
        else:
            if self.__RTURN_JS == "":
                startStr = "<a class='Pstart' href='" + self.__URI + "p=1'>" + self.__START + "</a>"
            else:
                startStr = "<a class='Pstart' onclick='" + self.__RTURN_JS + "(1)'>" + self.__START + "</a>"
        return startStr;
    
    def __GetCpage(self,p):
        #取当前页
        if p:
            return p
        return 1
        
    def __StartRow(self):
        #从多少行开始
        return (self.__C_PAGE - 1) * self.ROW + 1
    
    def __EndRow(self):
        #从多少行结束
        if self.ROW > self.__COUNT_ROW:
            return self.__COUNT_ROW
        return self.__C_PAGE * self.ROW
    
    def __GetCountPage(self):
        #取总页数
        return int(math.ceil(self.__COUNT_ROW / float(self.ROW)))
    
    def __SetUri(self,request_uri):
        #构造URI
        try:
            request_uri = re.sub("&p=\d+",'&',request_uri)
            request_uri = re.sub("\?p=\d+",'?',request_uri)
            if request_uri.find('&') == -1:
                if request_uri[-1] != '?': request_uri += '?'
            else:
                if request_uri[-1] != '&': request_uri += '&'
            return request_uri
        except: return '';