﻿;
(function($) {
    $.extend({
        "cuiPaging":function(options){
            return new CuiPaging(options);
        }
    });
    $.fn.extend({
       "cuiPaging":function(options){
           var g = new CuiPaging(options);
           return g.show(this);
       }
    });
})(jQuery);

/***
 * -CLASS-
 * @name CuiPaging
 * @package cui
 * @description 分页类
 * @pageTag
 * @depend CuiRes
 * @paramType JSON
 * @param id string <paging显示到的id>
 * @param pageNo number <当前页数>
 * @param pageAll number <总页数>
 * @param pageSize number <一页数据数>
 * @param handler function <分页时的回调函数>
 * @param setting json <分页设置>
 * @param i18_page_first string <首页资源文件，可选，默认‘首页’>
 * @param i18_page_prev string <前页资源文件，可选，默认‘前页’>
 * @param i18_page_next string <后页资源文件，可选，默认‘后页’>
 * @param i18_page_last string <末页资源文件，可选，默认‘末页’>
 * @param k_page_size string <page_size的key，可选，默认‘pageSize’>
 * @param k_page_no string <page_no的key，可选，默认‘pageNo’>
 * @param k_page_all string <page_all的key，可选，默认‘pageAll’>
 * @author ypu
 * @version 2011-08-03
 * @since 0.1
 */
var CuiPaging = function(options) {
    //分页信息
    var _info_ = {};
    //设置
    var _setting_ = [];
    //分页回调函数
    var _callback_;
    //上下文
    var _context_ = [];
    //是否触发，放置重复提交
    var _hasClick_ = false;
    //当前对象
    var self = this;

    _info_.page_size = 0;
    _info_.page_no = 0;
    _info_.page_all = 0;
	_setting_['i18_totalPage'] = CuiRes.TOTALPAGE;		//显示页数资源文件
    _setting_['i18_page_first'] = CuiRes.PAGE_FIRST;   //首页资源文件
	_setting_['i18_turnPage'] = CuiRes.TURNPAGE; 
	_setting_['i18_gotoPage'] = CuiRes.GOTO_PAGE;
	_setting_['i18_page'] = CuiRes.PAGE;
    _setting_['i18_page_prev'] = CuiRes.PAGE_PREV;     //上一页资源文件
    _setting_['i18_page_next'] = CuiRes.PAGE_NEXT;     //下一页资源文件
    _setting_['i18_page_last'] = CuiRes.PAGE_LAST;     //末页资源文件
    _setting_['k_page_size'] = 'pageSize';              //一页数据多少属性名
    _setting_['k_page_no'] = 'pageNo';                   //当前页数属性名
    _setting_['k_page_all'] = 'pageAll';                 //总页数属性名

    //分页结构
    this.frameHtml = '<div class="cui_toolBarPaging">' +
            '<span class="totalPage"></span>' +
            '<span class="toolBar_link cui_hand  paging_first" ></span>' +
            '<span class="toolBar_link cui_hand  paging_prev"></span>' +
            '<span class="cui_btnsplit"></span><span class="cui_turnPage">' + _setting_['i18_turnPage'] + '</span><span class="cui_btnsplit"></span>' +
            '<span class="toolBar_link cui_hand  paging_next"></span>' +
            '<span class="toolBar_link cui_hand  paging_last"></span>' +
            '<div class="cui_turnDiv">' +
            '<span>' + _setting_['i18_gotoPage'] + '</span><input type="text" class="cui_inputBg turnInput"/><span>' + _setting_['i18_page'] + '</span><input type="button" value="'+_setting_['i18_turnPage']+'" class="cui_turnBtn"/>' +
            '</div>' +
//            '<select class="paging_sel">' +
//            '</select>' +
            '</div>';
    //禁用css
    this.disableCss = 'txt-disabled';

    this.privateSetProxy = function(proxy) {
        if (proxy)self = proxy;
    }

    /**
     * -METHOD-
     * @summary 设置分页信息
     * @description  设置分页信息，对象包括pageNo,pageSize,pageAll
     * @method setPagingInfo
     * @param info json <page信息对象>
     * @param pageNo int <当前页> info
     * @param pageAll int <总页数> info
     * @param pageSize int <一页数据数> info
     * @return CuiPaging
     * @since 0.1
     */
    this.setPagingInfo = function(info) {
        if (typeof info[_setting_['k_page_size']] == 'undefined')info[_setting_['k_page_size']] = 0;
        if (typeof info[_setting_['k_page_no']] == 'undefined')info[_setting_['k_page_no']] = 0;
        if (typeof info[_setting_['k_page_all']] == 'undefined')info[_setting_['k_page_all']] = 0;
        _info_.page_size = parseInt(info[_setting_['k_page_size']]);
        _info_.page_no = parseInt(info[_setting_['k_page_no']]);
        _info_.page_all = parseInt(info[_setting_['k_page_all']]);
        return this;
    }
    /**
     * -METHOD-
     * @summary 获取分页信息
     * @description  获取分页信息，对象包括pageNo,pageSize,pageAll
     * @method getPagingInfo
     * @return json
     * @since 0.1
     */
    this.getPagingInfo = function() {
        var info = [];
        info[_setting_['k_page_size']] = _info_.page_size;
        info[_setting_['k_page_no']] = _info_.page_no;
        info[_setting_['k_page_all']] = _info_.page_all;
        return info;
    }
    /**
     * -METHOD-
     * @summary 设置分页配置
     * @description  设置分页配置，包括资源文件及分页对象key。
     * @method setSetting
     * @param setting json <page配置对象>
     * @param i18_page_first string <首页资源文件，可选，默认‘首页’> setting
     * @param i18_page_prev string <前页资源文件，可选，默认‘前页’> setting
     * @param i18_page_next string <后页资源文件，可选，默认‘后页’> setting
     * @param i18_page_last string <末页资源文件，可选，默认‘末页’> setting
     * @param k_page_size string <page_size的key，可选，默认‘pageSize’> setting
     * @param k_page_no string <page_no的key，可选，默认‘pageNo’> setting
     * @param k_page_all string <page_all的key，可选，默认‘pageAll’> setting
     * @return CuiPaging
     * @since 0.1
     */
    this.setSetting = function(setting) {
        if (setting['i18_page_first'])_setting_['i18_page_first'] = setting['i18_page_first'];
        if (setting['i18_page_prev'])_setting_['i18_page_prev'] = setting['i18_page_prev'];
        if (setting['i18_page_next'])_setting_['i18_page_next'] = setting['i18_page_next'];
        if (setting['i18_page_last'])_setting_['i18_page_last'] = setting['i18_page_last'];
        if (setting['k_page_size'])_setting_['k_page_size'] = setting['k_page_size'];
        if (setting['k_page_no'])_setting_['k_page_no'] = setting['k_page_no'];
        if (setting['k_page_all'])_setting_['k_page_all'] = setting['k_page_all'];
        return this;
    }
    /**
     * -METHOD-
     * @summary 更新分页信息
     * @description  更新分页信息，包括page_no,page_size,page_all
     * @method updatePaging
     * @param info json <page信息对象>
     * @param page_no int <当前页> info
     * @param page_all int <总页数> info
     * @param page_size int <一页数据大小> info
     * @return CuiPaging
     * @since 0.1
     */
    this.updatePaging = function(info) {
        if (typeof info[_setting_['k_page_size']] == 'undefined')info[_setting_['k_page_size']] = _info_.page_size;
        if (typeof info[_setting_['k_page_no']] == 'undefined')info[_setting_['k_page_no']] = _info_.page_no;
        if (typeof info[_setting_['k_page_all']] == 'undefined')info[_setting_['k_page_all']] = _info_.page_all;
        var oldPageAll = _info_.page_all;
        _info_.page_size = parseInt(info[_setting_['k_page_size']]);
        _info_.page_no = parseInt(info[_setting_['k_page_no']]);
        _info_.page_all = parseInt(info[_setting_['k_page_all']]);
        for (var i = 0; i < _context_.length; i++) {
            this.privateUpdatePaging(_context_[i], oldPageAll);
        }
        return this;
    }

    this.privateUpdatePaging = function(tag, oldPageAll) {
        tag.find('.' + this.disableCss).removeClass(this.disableCss);
//        tag.find('option[selected]').removeAttr('selected');

        tag.find('.totalPage').text(_setting_['i18_totalPage'].replace('{}',_info_.page_no+'/'+_info_.page_all));
		tag.find('.cui_turnPage').text(_setting_['i18_turnPage']);

        if (_info_.page_no == 0 || _info_.page_no == 1) {
            tag.find('.paging_first').addClass(this.disableCss);
            tag.find('.paging_prev').addClass(this.disableCss);
        }
        if (_info_.page_no == _info_.page_all || _info_.page_all == 1 || _info_.page_all == 0) {
            tag.find('.paging_last').addClass(this.disableCss);
            tag.find('.paging_next').addClass(this.disableCss);
        }

//        if (oldPageAll != _info_.page_all) {
//            this.privateRefreshSelect(tag);
//        } else {
//            var option = tag.find('.paging_sel').children('option');
//            $(option[_info_.page_no - 1]).attr("selected", "selected");
//        }
    }

    this.privateRefreshSelect = function(tag) {
        var selects = tag.find('.paging_sel');
        selects.empty();
        for (var i = 1; i <= _info_.page_all; i++) {
            var option = $('<option>').val(i).text(i + '/' + _info_.page_all);
            if (i == _info_.page_no)option.attr("selected", "selected");
            selects.append(option);
        }
    }
    /**
     * -METHOD-
     * @summary 设置分页回调方法
     * @description  设置分页回调方法
     * @method setHandler
     * @param func function <回调方法，该方法的参数为pageNo:int，跳转的页数>
     * @param pageNo int <跳转的页数>  func
     * @return CuiPaging
     * @since 0.1
     */
    this.setHandler  = function(func) {
        if (typeof func == 'function')_callback_ = func;
        return this;
    }

    this.privateClickPage = function(src) {
        if (!_callback_ || _hasClick_)return;
        if(_info_.page_all <= 1)return;
        _hasClick_ = true;
        var pageNo = 1;
        if(typeof src == 'string'){
            pageNo = parseInt(src);
        } else if (src.hasClass('paging_first')) {
            pageNo = 1;
        } else if (src.hasClass('paging_prev')) {
            pageNo = _info_.page_no - 1;
        } else if (src.hasClass('paging_next')) {
            pageNo = _info_.page_no + 1;
        } else if (src.hasClass('paging_last')) {
            pageNo = _info_.page_all;
        } /*else if (src.hasClass('paging_sel')) {
            pageNo = parseInt(src.val());
        } */else {
            return;
        }

        if(pageNo < 1){
            pageNo = 1;
        }
        if(pageNo >_info_.page_all){
            pageNo = _info_.page_all;
        }

//        if (pageNo >= 1 && pageNo <= _info_.page_all){
            _callback_.apply(self, [pageNo]);
//        }
        _hasClick_ = false;
    }

    if (options) {
//        if (options.id) {
//            if (typeof options.id == 'string') {
//                _context_.push($('#' + options.id));
//            } else if (id.length && id.length > 0) {
//                for (var i = 0; i < id.length; i++) {
//                    if (typeof id[i] == 'string') {
//                        _context_.push($('#' + id[i]));
//                    } else if (id[i].jquery) {
//                        _context_.push(id[i]);
//                    } else {
//                        _context_.push($(id[i]));
//                    }
//                }
//            } else if (id.jquery) {
//                _context_.push(id);
//            } else {
//                _context_.push($(id));
//            }
//        }
        this.setPagingInfo(options);;
        this.setSetting(options);
        if (options.handler && typeof options.handler == 'function') {
            this.setHandler(options.handler);
        }
    }

    /**
     * -METHOD-
     * @summary 分页组件显示
     * @description  分页组件显示到指定id
     * @method show
     * @param id string/object/array <生成分页的id，id数组或jqeruy对象，对象数组>
     * @return none
     * @since 0.1
     */
    this.show = function(id) {
        if (id) {
            if (typeof id == 'string') {
                _context_.push($('#' + id));
            } else if (id.length && id.length > 0) {
                for (var i = 0; i < id.length; i++) {
                    if (typeof id[i] == 'string') {
                        _context_.push($('#' + id[i]));
                    } else if (id[i].jquery) {
                        _context_.push(id[i]);
                    } else {
                        _context_.push($(id[i]));
                    }
                }
            } else if (id.jquery) {
                _context_.push(id);
            } else {
                _context_.push($(id));
            }
        }

        for (var i = 0; i < _context_.length; i++) {
            this.privateShow(_context_[i]);
        }
    }

    this.privateShow = function(tag) {
        tag.append(this.frameHtml);
        if (_info_.page_no == 0 || _info_.page_no == 1) {
            tag.find('.paging_first').addClass(this.disableCss);
            tag.find('.paging_prev').addClass(this.disableCss);
        }
        if (_info_.page_no == _info_.page_all || _info_.page_all == 1 || _info_.page_all == 0) {
            tag.find('.paging_last').addClass(this.disableCss);
            tag.find('.paging_next').addClass(this.disableCss);
        }
        var tmpSelf = this;
        var prev = 1;
        var next = _info_.page_all;
        if (_info_.page_no > 1)prev = _info_.page_no - 1;
        if (_info_.page_no < _info_.page_all)next = _info_.page_no + 1;
		tag.find('.totalPage').text(_setting_['i18_totalPage'].replace('{}',_info_.page_no+'/'+_info_.page_all));
//		tag.find('.cui_turnPage').text(_setting_['i18_turnPage']);
        tag.find('.paging_first').attr('title',_setting_['i18_page_first']).click(function() {
            if ($(this).hasClass('txt-disabled'))return;
            tmpSelf.privateClickPage($(this));
        });
        tag.find('.paging_prev').attr('title',_setting_['i18_page_prev']).click(function() {
            if ($(this).hasClass('txt-disabled'))return;
            tmpSelf.privateClickPage($(this));
        });
        tag.find('.paging_next').attr('title',_setting_['i18_page_next']).click(function() {
            if ($(this).hasClass('txt-disabled'))return;
            tmpSelf.privateClickPage($(this));
        });
        tag.find('.paging_last').attr('title',_setting_['i18_page_last']).click(function() {
            if ($(this).hasClass('txt-disabled'))return;
            tmpSelf.privateClickPage($(this));
        });
        tag.find('.cui_turnPage').click(function() {
            var t = tag.find('.cui_turnDiv');
            if(t.is(":hidden")){
                t.slideDown();
                tag.find('.turnInput').focus();
            }else{
                tag.find('.turnInput').blur();
                t.slideUp();
            }
        })
        tag.find('.turnInput').bind('keyup', function(event) {
            if (event.keyCode == 13) {
                if(this.value)tmpSelf.privateClickPage(this.value);
            }else{
                var value=this.value.replace(/[^0-9]/g,'');
                if(value > _info_.page_all)value = _info_.page_all;
                if(value < 1)value = '';
                this.value = value;
            }
        }).blur(function(){
            tag.find('.cui_turnDiv').slideUp();
        });
        tag.find('.cui_turnBtn').click(function(){
                var v = tag.find('.turnInput').val();
                if(v)tmpSelf.privateClickPage(v);
        }) ;
//        var selects = tag.find('.paging_sel').change(function() {
//            if ($(this).hasClass('txt-disabled'))return;
//            tmpSelf.privateClickPage($(this));
//        });
//        if (_info_.page_all != 0) {
//            for (var i = 1; i <= _info_.page_all; i++) {
//                var option = $('<option>').val(i).text(i + '/' + _info_.page_all);
//                if (i == _info_.page_no)option.attr("selected", "selected");
//                selects.append(option);
//            }
//        }
    }

}
///EndClass
