/**
 * @author 老阴
 */
(function($){

    if (typeof cy == 'undefined') {
        cy = {};
        cy.csts = {};
    }
    
    /* extend */
    (function(){
        cy.extend = function(target, source){
            if (source == null) 
                return;
            if (target == null) {
                target = {};
            }
            
            var tos = typeof source;
            if (tos == 'undefinded') {
                return null;
            }
            else 
                if (tos == 'number' || tos == 'string' || tos == 'boolean' || tos == 'function') {
                    target = source;
                }
                else { // object
                    if (source.constructor == Array) { // Array
                        target = source;
                    }
                    else {
                        for (var item in source) {
                            target[item] = cy.extend(target[item], source[item]);
                        }
                    }
                }
            
            return target;
        }
    })();
    
    /****************************************************/
    
    (function(){
        cy.csts.paging = function(options){
            var settings = {
                id: '',
                lang: {
                    firstPageText: '首页',
                    lastPageText: '末页',
                    prePageText: '上一页',
                    nextPageText: '下一页'
                },
                totalRecords: 98,
                pageSize: 10,
                curPage: -1,
                num: {
                    enabled: true, // 是否显示数字
                    preNumber: 3,
                    nextCount: 3
                },
                pageChanging: null, /* function(curPageNum, newPageNum){ return true; } */
                pageChanged: null /* function(pageNum){} */
            };
            cy.extend(settings, options ||
            {});
            var initialized = false;
            
            if (settings.id == '') {
                return null;
            }
            else 
                if ($("#" + settings.id).length == 0) {
                    return null;
                }
            
            function buildPageCount(){
                var pageCount = 1; // 总页数
                settings.curPage = settings.curPage < 1 ? 1 : settings.curPage;
                settings.pageSize = settings.pageSize < 1 ? 10 : settings.pageSize;
                settings.totalRecords = settings.totalRecords < 0 ? 0 : settings.totalRecords;
                
                var mod = settings.totalRecords % settings.pageSize;
                if (mod == 0) {
                    pageCount = settings.totalRecords / settings.pageSize;
                    if (pageCount == 0) { // 总纪录数为0
                        pageCount = 1;
                    }
                }
                else {
                    pageCount = (settings.totalRecords - mod) / settings.pageSize + 1;
                }
                
                settings.pageCount = pageCount;
                initialized = false;
            }
            buildPageCount();
            
            function redirectTo(pageNum, isSilent){
                var pn = 1;
                if (!pageNum) {
                    pn = 1;
                }
                else {
                    pn = parseInt(pageNum);
                    if (isNaN(pn)) {
                        pn = 1;
                    }
                    else 
                        if (pn < 1) {
                            pn = 1;
                        }
                        else 
                            if (pn > settings.pageCount) {
                                pn = settings.pageCount;
                            }
                            else {
                                pn = pageNum;
                            }
                }
                
                if (isSilent == null) {
                    isSilent = false;
                }
                
                if (pn == settings.curPage) {
                    if (!initialized) {
                        initialized = true;
                    }
                    else {
                        return;
                    }
                }
                else {
                    if (!isSilent && settings.pageChanging && (typeof settings.pageChanging == 'function')) {
                        if (!settings.pageChanging(settings.curPage, pn)) {
                            return;
                        }
                    }
                }
                
                $("#" + settings.id).empty();
                
                if (pn > 1) {
                    $('<li><a>' + settings.lang.firstPageText + '</a></li>').find("a").click(function(){
                        redirectTo(1);
                    }).end().appendTo("#" + settings.id);
                    $('<li><a>' + settings.lang.prePageText + '</a></li>').find("a").click(function(){
                        redirectTo(pn - 1);
                    }).end().appendTo("#" + settings.id);
                }
                
                if (settings.num && settings.num.enabled) {
                    for (var i = pn - settings.num.preNumber; i < pn; i++) {
                        if (i > 0) {
                            (function(pn){
                                $('<li><a>' + pn + '</a></li>').find("a").click(function(){
                                    redirectTo(pn);
                                }).end().appendTo("#" + settings.id);
                            })(i);
                        }
                        
                    }
                    $('<li class="active_page"><a >' + pn + '</a></li>').appendTo("#" + settings.id);
                    for (var i = pn + 1; i < pn + settings.num.nextCount + 1; i++) {
                        if (i < settings.pageCount + 1) {
                            (function(pn){
                                $('<li><a>' + pn + '</a></li>').find("a").click(function(){
                                    redirectTo(pn);
                                }).end().appendTo("#" + settings.id);
                            })(i);
                        }
                    }
                }
                
                if (pn < settings.pageCount) {
                    $('<li><a>' + settings.lang.nextPageText + '</a></li>').find("a").click(function(){
                        redirectTo(pn + 1);
                    }).end().appendTo("#" + settings.id);
                    $('<li><a>' + settings.lang.lastPageText + '</a></li>').find("a").click(function(){
                        redirectTo(settings.pageCount);
                    }).end().appendTo("#" + settings.id);
                }
                
                
                
                settings.curPage = pn;
                if (!isSilent && settings.pageChanged && (typeof settings.pageChanged == 'function')) {
                    settings.pageChanged(settings.curPage);
                }
            }
            
            function setTotalRecords(count, slient){
                if ((count === null) || isNaN(count) || (count < 0)) {
                    return;
                }
                settings.totalRecords = count;
                buildPageCount();
                redirectTo(settings.curPage, slient);
            }
            
            function setPageSize(size){
                if (!size || isNaN(size) || (size < 1)) {
                    return;
                }
                
                settings.pageSize = size;
                buildPageCount();
            }
            
            redirectTo(settings.curPage, true);
            
            return {
                redirectTo: redirectTo,
                setTotalRecords: setTotalRecords,
                setPageSize: setPageSize
            }
        }
    })();
    
})(jQuery);
