﻿
(function($) {
PagedTable = function(selector, options) {
    var defaults = {
        limit: 15,
        pagelimit: 10,
        started: 1,
        insertpager: true,
        dragpager: false,
        fixedwidth: false,
        pager: '<div class="pager" align="right" ></div>',
        page: '<a href="#"></a>',
        prev: '<a href="#" style="color: #008500;font-size: 14px;font-weight: bold;padding-left: 3px;padding-right: 22px;">«</a>',
        next: '<a href="#" style="color: #008500;font-size: 14px;font-weight: bold;padding-left: 22px;padding-right: 3px;">»</a>',
		first: '<a href="#" style="color: #008500;font-size: 14px;font-weight: bold;padding-left: 2px;padding-right: 3px;">««</a>',
        last: '<a href="#" style="color: #008500;font-size: 14px;font-weight: bold;padding-left: 3px;padding-right: 50px;">»»</a>',
        selectedclass: 'selected',
		myID: 'tab1'
    };
    this.options = $.extend(defaults, options);
    this.element = $($(selector).get(0));
    this.initialize();
}

PagedTable.version = '1.0';
PagedTable.updated = '2011-11-08 3:50';

PagedTable.prototype.initialize = function() {
    var self = this;
	
	if(document.getElementById("paginationID")!=null && document.getElementById("paginationID")!=''){
		this.options.pager='<div class="pager" style="width:830px" align="right" ></div>';
	}else{
		this.options.pager='<div class="pager" align="right" ></div>';
	}
	if(this.options.myID=='tab1'){
	    var $table = $("#pageTable"); 
		this.rows = $('tbody>tr', $table);
	}
	if(this.options.myID=='tab2'){
	    var $table2 = $("#pageTable2"); 
		this.rows = $('tbody>tr', $table2);
	}
	this.length = this.rows.length;

    this.pages = Math.ceil(this.length / this.options.limit);
	this.pagers = [];
	
	if(this.length==0){
		if(this.options.myID=='tab1'){
			document.getElementById("showcurpage").innerHTML="0 - 0";
			document.getElementById("showtotalpage").innerHTML="0";
			//document.getElementById("nextButton").style.display = 'none';
			return false;
		}
		if(this.options.myID=='tab2'){
			document.getElementById("showcurpage2").innerHTML="0 - 0";
			document.getElementById("showtotalpage2").innerHTML="0";
			//document.getElementById("nextButton2").style.display = 'none';
			return false;
		}
	}
	
    var divide = function(elements, limit) {
        var divided = [];
        elements.each(function(i) {
            if (i % limit == 0) divided.push([]);
            divided[divided.length - 1].push(this);
        });
        return divided;
    }
	
    this.rows.divided = divide(this.rows, this.options.limit);

    if (this.options.fixedwidth) $ ('th', this.element).each(function() {
        $(this).width($(this).width() + 1);
    });
    if (this.options.insertpager && this.pages>1) this.pager().insertAfter(this.element);
    if (this.options.pagelimit < 0) this.options.pagelimit = this.pages;

    return this.goto(this.options.started);
}

PagedTable.prototype.pager = function() {
     var pager;

    if (!this.pagers.length) {
		var curpage = 1;
        var options = this.options;
        pager = $(options.pager);
        var self = this;
		var temppages = this.pages;
        var mousedown = options.dragpager ? function() {
            PagedTable.dragged = pager;
        } : null;

        var click = function() {
			curpage = $(this).text();
			//alert("click:"+curpage);
            self.goto($(this).text());
            return false;
        }
		
		$(options.first).click(function() {
			curpage = 1;
			//alert(curpage);
			self.goto(curpage);
            return false;
        }).appendTo(pager);
	
        $(options.prev).click(function() {
			if(curpage > 1){
				curpage = parseInt(curpage) - 1;
			}
			//alert("prev:"+curpage);
			self.goto(curpage);
			return false;		
        }).appendTo(pager);
		
        for (var i = 0; i < Math.min(this.pages); ++ i) {
			var page = $(options.page);
            page.text(i+1).click(click).mousedown(mousedown).appendTo(pager);			
        }
		
        $(options.next).click(function() {
            if(curpage < temppages){
				curpage = parseInt(curpage) + 1;
			}
			//alert("next:"+curpage);
			self.goto(curpage);
			return false;
        }).appendTo(pager);
		
		$(options.last).click(function() {		
			curpage = temppages;
			//alert("last:"+curpage);
			self.goto(curpage);
            return false;
        }).appendTo(pager);

        if (options.dragpager) {
            var d = function(p1, p2) {
                return Math.sqrt(Math.pow(p1[0] - p2[0], 2) +
                                 Math.pow(p1[1] - p2[1], 2));
            }
            $($.browser.msie ? document.body : window).mousemove(function(e) {
                var dragged = PagedTable.dragged;
                if (dragged) {
                    var cursor = [e.pageX, e.pageY];
                    var range = self._range();
                    var ds = [];
                    var pages = [];
                    var getdistance = function() {
                        var page = $(this);
                        var pos = page.position();
                        var center = [pos.left + page.width() / 2,
                                      pos.top + page.height() / 2];
                        var distance = d(cursor, center);
                        if (ds.length && ds[ds.length - 1] < distance) {
                            return false;
                        }
                        ds.push(distance);
                        pages.push(page);
                    }
                    $(dragged).children().slice(range[0], range[1] + 1)
                              .each(getdistance);
                    var i = $.inArray(Math.min.apply(null, ds), ds);
                    pages[i].click();
                    return false;
                }
            }).mouseup(function() { PagedTable.dragged = null; });
        }
    } else {
        pager = this.pagers[0].clone(true);
    }

    this.pagers.push(pager);

    return pager;
}

PagedTable.prototype.goto = function(page) {
    var self = this;
    var options = this.options;

    var page = page < 1 ? 1 : page > this.pages ? this.pages : page;
    var range = this._range(), newrange = this._range(page);
    var from = (page - 1) * this.options.limit, to = page * this.options.limit;

	if(to>this.rows.length) to = this.rows.length;
	
	if(this.options.myID=='tab1'){
    document.getElementById("showcurpage").innerHTML=(parseInt(from) + 1)+" - "+to;
	document.getElementById("showtotalpage").innerHTML=this.rows.length;
	//alert(page+"goto fun"+range[0]+"="+range[1]+"range"+newrange[0]+"="+newrange[1]);
	//alert("curpage"+page+"totpage"+this.pages);
	//var nextButtonPage = parseInt(page) + 1;
	//if(page<this.pages){
	// document.getElementById("nextButton").onclick = function(){
    //     //alert("Hello world!"+nextButtonPage);
	//	 self.goto(nextButtonPage);
	//	 return false;
    //}
	//   document.getElementById("nextButton").style.display = 'block';
	//}else{
	//	document.getElementById("nextButton").style.display = 'none';
	//}
	}
	
	if(this.options.myID=='tab2'){
    document.getElementById("showcurpage2").innerHTML=(parseInt(from) + 1)+" - "+to;
	document.getElementById("showtotalpage2").innerHTML=this.rows.length;
	//alert(page+"goto fun"+range[0]+"="+range[1]+"range"+newrange[0]+"="+newrange[1]);
	//alert("curpage"+page+"totpage"+this.pages);
	//var nextButtonPage = parseInt(page) + 1;
	//if(page<this.pages){
	// document.getElementById("nextButton2").onclick = function(){
    //     //alert("Hello world!"+nextButtonPage);
	//	 self.goto(nextButtonPage);
	//	 return false;
    //}
	//    document.getElementById("nextButton2").style.display = 'block';
	//}else{
	//	document.getElementById("nextButton2").style.display = 'none';
	//}
	}
	
	
    (this._visiblerows || this.rows).hide();
    this._visiblerows = $(this.rows.divided[page-1]).show();
    
    $(this.pagers).each(function() {
        var selected = options.selectedclass;
        var children = $(this).children();
        var length = self.length;

        if (length) {
            children.slice(2, self.pages + 2).hide();
            children.slice(range[0], range[1] + 2).removeClass(selected);
            children.slice(parseInt(newrange[0])+1, parseInt(newrange[1]) + 2).show();
            children.eq(parseInt(page) + 1).addClass(selected);
        }

        //var prev = children.eq(0);
        //var next = children.eq(self.pages + 1);
				
        //if (!length || newrange[0] == 1) prev.hide();
        //else prev.show();
        //if (!length || self.pages <= newrange[1]) next.hide();
        //else next.show();
    });
    this.page = page;
    return this;
}

PagedTable.prototype.revert = function() {
    var self = this;
    $(this.pagers).empty();
    $(this.rows).show();
    $.each(['pagers', 'page', 'rows', '_visiblerows'], function() {
        delete self[this];
    });
    return this;
}

PagedTable.prototype._range = function(page) {
    page = page || this.page;
    var pagelimit = this.options.pagelimit;
    return [Math.ceil(page / pagelimit - 1) * pagelimit + 1,
            Math.ceil(page / pagelimit) * pagelimit];
}

$.fn.extend({
    pageable: function(options) {
        return new PagedTable(this, options);
    }
});
})(jQuery);


