/* aqPaging v1.2 - Paging function with next and previous ranges.
   Copyright (C) 2009 paul pham <http://aquaron.com/~jquery/aqPaging>
   
	http://aquaron.com/~jquery/aqPaging:pod
	
   This program is free software: you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation, either version 3 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/
(function($){
$.fn.aqPaging = function (options) {
	var opts = $.extend({ },$.fn.aqPaging.defaults,options);

	return this.each(function(){
		if (opts.pages <= 1) return false;
	
		if (!$('.aqPaging',this).length) {
			$.fn.aqPaging.defaults.uniqID++;
			$('<div class="aqPaging" id="aqPaging_'
			  +$.fn.aqPaging.defaults.uniqID+'"><\/div>')
			  .appendTo(this);
			
			$.fn.aqPaging.defaults.cbs[$.fn.aqPaging.defaults.uniqID]
			  = opts.cb;
			
			
		}
	
		var $pager = $('.aqPaging',this);
		
		$pager.empty();
		
		var pid = $pager.attr('id');
		
		var s = 1, e = opts.pages;
		var html = '';
	
		var offset = (opts.current > opts.pagerMax) ? 1 : 0;
	
		if(opts.pages > opts.pagerMax){
		   if (opts.current > opts.pagerMax)
			  s = opts.pagerMax*parseInt((opts.current-offset)/opts.pagerMax);
		
		   if (opts.current-offset+opts.pagerMax < opts.pages) 
			  e = s + opts.pagerMax + offset;
		}
		
		//CREATE DATA PAGINATION
		
		if(opts.objToPaginate != null){
			pageCallback(opts.current,opts.itemsPerPage);
		}
		
		//SET NUMBER OF PAGES TO PAGINATE FROM ITEMS 
		
		function numPages() {
			var maxentries = Number(opts.objToPaginate.children().length);
			return Math.ceil(maxentries/opts.itemsPerPage);
		}
		
		//SET VISIBLE ELEMENTS OF DATA PAGINATION
		
		function pageCallback(current, itemsPerPage){
			var rangePage = rangePagerLink(current, itemsPerPage);
			var start_splice = rangePage[0];
			var end_splice = rangePage[1];
			
			opts.objToPaginate.children().hide();
			opts.objToPaginate.children().slice(start_splice,end_splice).show();
			
			opts.pages = numPages();
			return false;
		}
		
		//SET PAGE RANGE START AND END DEPENDENT OF CURRENT PAGE
		
		function rangePagerLink(current, itemsPerPage){
			var rangeArray = []
			current-=1;
			
			var num_entries = Number(opts.objToPaginate.children().length);
			var max_elem = Math.min((current+1) * itemsPerPage, num_entries);
			
			var start_splice = current*itemsPerPage;
			var end_splice = max_elem;
			
			rangeArray.push(start_splice);
			rangeArray.push(end_splice);
			return rangeArray;
		}
		
		//END CREATE DATA PAGINATION
		//CREATE PAGE COUNTER OBJECT OPTIONAL FROM PAGINATION
		
		if(opts.pagerCounter == true){
			var pagerHtml = new Array();
			
			pagerHtml.push('<span id="aqCounter">');
			pagerHtml.push('<span id="aqCurrent">' + opts.current + '</span>');
			pagerHtml.push('<span id="aqSeparator">/</span>');
			pagerHtml.push('<span id="aqTotal">' + opts.pages + '</span>');
			pagerHtml.push('</span>');
			
			$pager.append(pagerHtml.join(""));
		}
		
		//END PAGE COUNTER OBJECT OPTIONAL FROM PAGINATION
		//CREATE PAGINATION STYLE 1 ex: 1...456789...60
		
		if(opts.style == 1){
		
			//INIT PAGER HTML
			
			var pagerHtml = new Array();
			var rangePager;
			
			if(!opts.pagerRange){ 
				pagerHtml.push('<ul>');
			}else{
				pagerHtml.push('<ul class="rangePaging">');
			}
			
			/****************
			################# DEFAULT PAGINATION 1...456789...60 ################# 
			****************/
			
			if(!opts.pagerRange){ 
				
				//CREATE PAGER LINK 1
				
				if(opts.current >= s && opts.current-opts.pagerMax > 0) {
					pagerHtml.push('<li><a href="#" rel="1">1<\/a>');
					if(opts.pagerSeparator != ''){
						pagerHtml.push('<span class="separator">'+opts.pagerSeparator+'</span>');
					}
					pagerHtml.push('<\/li>');	
				}
			
				//CREATE PAGER LINKS EXCEPT FIRST AND LAST
				
				for (var p=s; p<=e; p++){
					pagerHtml.push('<li><a href="#" rel="'+p+'">'+p+'<\/a><\/li>');
				}
				
				//CREATE PAGER LINK LAST
				
				if((opts.current-offset+opts.pagerMax) <= opts.pages && e != opts.pages) {
					pagerHtml.push('<li>');
					if(opts.pagerSeparator != ''){
						pagerHtml.push('<span class="separator">'+opts.pagerSeparator+'</span>');
					}
					pagerHtml.push('<a href="#" rel="'+opts.pages+'">'+opts.pages+'<\/a><\/li>');
				
				}
			}
			
			/****************
			################# RANGE PAGINATION 1-10...21-30 31-40 ...51-60 ################# 
			****************/

			if(opts.pagerRange && opts.objToPaginate != null){
				
				//CREATE PAGER LINK 1
				
				if(opts.current >= s && opts.current-opts.pagerMax > 0) {
					
					rangePager = rangePagerLink(1,opts.itemsPerPage);
					rangePager[0] = rangePager[0] + 1;
					
					pagerHtml.push('<li><a href="#" rel="1">'+ rangePager[0] +' - '+  rangePager[1] +'<\/a>');
					if(opts.pagerSeparator != ''){
						pagerHtml.push('<span class="separator">'+opts.pagerSeparator+'</span>');
					}
					pagerHtml.push('<\/li>');	
				}
				
				//CREATE PAGER LINKS EXCEPT FIRST AND LAST
				
				for (var p=s; p<=e; p++){
					rangePager = rangePagerLink(p,opts.itemsPerPage);
					rangePager[0] = rangePager[0] + 1;
					
					pagerHtml.push('<li><a href="#" rel="'+p+'">'+ rangePager[0] +' - '+  rangePager[1] +'<\/a><\/li>');
				}
				
				//CREATE PAGER LINK LAST
				
				if((opts.current-offset+opts.pagerMax) <= opts.pages && e != opts.pages) {
					
					rangePager = rangePagerLink(opts.pages,opts.itemsPerPage);
					rangePager[0] = rangePager[0] + 1;
					
					pagerHtml.push('<li>');
					if(opts.pagerSeparator != ''){
						pagerHtml.push('<span class="separator">'+opts.pagerSeparator+'</span>');
					}
					pagerHtml.push('<a href="#" rel="'+opts.pages+'">'+ rangePager[0] +' - '+  rangePager[1] +'<\/a><\/li>');
				
				}	
			}
			
			pagerHtml.push('</ul>');
			pagerHtml.push('<div class="clear"></div>');
			
			$pager.append(pagerHtml.join(""));
			
			//END PAGER HTML
			//EVENT HANDLERS FOR PAGER LINKS
			
			var $firstPagerLink = $pager.find('ul li:first a');
			var $pagerLink = $pager.find('ul li:not(:first-child):not(:last-child) a');
			var $lastPagerLink = $pager.find('ul li:last a');
			
			$firstPagerLink.click(function(){
				$.fn.aqPaging.flip(pid, '1', opts.pages, opts.pagerMax, opts.pagerRange, opts.pagerCounter, opts.pagerSeparator, opts.style, opts.itemsPerPage, opts.objToPaginate, opts.textPagination);
				return false;
			});
			
			$pagerLink.click(function(){
				var pageIndex = $(this).attr('rel');
				$.fn.aqPaging.flip(pid, pageIndex, opts.pages, opts.pagerMax, opts.pagerRange, opts.pagerCounter, opts.pagerSeparator, opts.style, opts.itemsPerPage, opts.objToPaginate, opts.textPagination);
				return false;
			});
			
			$lastPagerLink.click(function(){
				$.fn.aqPaging.flip(pid, opts.pages, opts.pages, opts.pagerMax, opts.pagerRange, opts.pagerCounter, opts.pagerSeparator, opts.style, opts.itemsPerPage, opts.objToPaginate, opts.textPagination);
				return false;
			});
		
			//END EVENT HANDLERS FOR PAGER LINKS
		
		}
		
		//END PAGINATION STYLE 1
		//PAGINATION STYLE 2 ex: «<123456>»
		
		if(opts.style == 2){
			
			//INIT PAGER HTML
			
			var pagerHtml = new Array();
			
			//CREATE PAGER LINK FIRST LINK PREVIOUS
			
			pagerHtml.push('<a href="#" id="linkFirst">&laquo;</a>');
			pagerHtml.push('<a href="#" id="linkPrev">&lt;</a>');
			
			if(!opts.pagerRange){ 
				pagerHtml.push('<ul>');
			}else{
				pagerHtml.push('<ul class="rangePaging">');
			}
			
			/****************
			################# DEFAULT PAGINATION «<123456>» ################# 
			****************/
			
			if(!opts.pagerRange){ 
				
				//CREATE PAGER LINKS
			
				for (var p=s; p<=e; p++){
					pagerHtml.push('<li><a href="#" rel="'+p+'">' + p + '<\/a><\/li>');
				}
				
			}
			
			/****************
			################# RANGE PAGINATION «<1-10 11-20 21-30>» ################# 
			****************/

			if(opts.pagerRange && opts.objToPaginate != null){
				
				//CREATE PAGER LINKS
			
				for (var p=s; p<=e; p++){
					rangePager = rangePagerLink(p,opts.itemsPerPage);
					rangePager[0] = rangePager[0] + 1;
					
					pagerHtml.push('<li><a href="#" rel="'+p+'">'+ rangePager[0] +' - '+  rangePager[1] +'<\/a><\/li>');
				}
				
			}
			
			pagerHtml.push('</ul>');
			
			//CREATE PAGER LINK NEXT LINK LAST
			
			pagerHtml.push('<a href="#" id="linkNext">&gt;</a>');
			pagerHtml.push('<a href="#" id="linkLast">&raquo;</a>');
			
			pagerHtml.push('<div class="clear"></div>');
			
			$pager.append(pagerHtml.join(""));
			
			//INIT PAGER EVENT HANDLER
			
			initPagerLinksStyle2();
			
		}
		
		//END PAGINATION STYLE 2
		//PAGINATION STYLE 3 ex: < 1 / 2 >
		
		if(opts.style == 3){
			
			//INIT PAGER HTML
			
			var pagerHtml = new Array();
			
			//CREATE PAGER LINK FIRST LINK PREVIOUS
			
			pagerHtml.push('<a href="#" id="linkFirst">&laquo;</a>');
			pagerHtml.push('<a href="#" id="linkPrev">&lt;</a>');
			
			//CREATE PAGER CURRENT AND TOTAL 
			
			pagerHtml.push('<span id="current">'+ opts.current +'</span>');
			pagerHtml.push('<span id="separator">/</span>');
			pagerHtml.push('<span id="total">'+ opts.pages +'</span>')
			
			//CREATE PAGER LINK NEXT LINK LAST
			
			pagerHtml.push('<a href="#" id="linkNext">&gt;</a>');
			pagerHtml.push('<a href="#" id="linkLast">&raquo;</a>')
			
			pagerHtml.push('<div class="clear"></div>');
			
			$pager.append(pagerHtml.join(""));
			
			//INIT PAGER EVENT HANDLER
			
			initPagerLinksStyle2();
				
		}
		
		//END PAGINATION STYLE 3
		//PAGINATION STYLE 4 ex:  1 / 2 < >
		
		if(opts.style == 4){
			
			//INIT PAGER HTML
			
			var pagerHtml = new Array();
			
			if(opts.textPagination){
				pagerHtml.push('<span id="text">'+ opts.textPagination +'</span>');
			}
			
			//CREATE PAGER CURRENT AND TOTAL 
			
			pagerHtml.push('<span id="current">'+ opts.current +'</span>');
			pagerHtml.push('<span id="separator">/</span>');
			pagerHtml.push('<span id="total">'+ opts.pages +'</span>')
			
			//CREATE PAGER LINK FIRST LINK PREVIOUS
			
			pagerHtml.push('<a href="#" id="linkFirst">&laquo;</a>');
			pagerHtml.push('<a href="#" id="linkPrev">&lt;</a>');
			
			//CREATE PAGER LINK NEXT LINK LAST
			
			pagerHtml.push('<a href="#" id="linkNext">&gt;</a>');
			pagerHtml.push('<a href="#" id="linkLast">&raquo;</a>')
			
			pagerHtml.push('<div class="clear"></div>');
			
			$pager.append(pagerHtml.join(""));
			
			//INIT PAGER EVENT HANDLER
			
			initPagerLinksStyle2();
				
		}
		
		
		//EVENT HANDLERS FOR PAGER LINKS STYLE 2 AND STYLE 3
		
		function initPagerLinksStyle2(){
			
			//EVENT HANDLERS FOR PAGER LINKS
			
			var $pagerFirst = $pager.find('#linkFirst');
			var $pagerPrev = $pager.find('#linkPrev');
			var $pagerLink = $pager.find('ul li a');
			var $pagerNext = $pager.find('#linkNext');
			var $pagerLast = $pager.find('#linkLast');
			
			$pagerFirst.click(function(){
				$.fn.aqPaging.flip(pid, '1', opts.pages, opts.pagerMax, opts.pagerRange, opts.pagerCounter, opts.pagerSeparator, opts.style, opts.itemsPerPage, opts.objToPaginate, opts.textPagination);
				return false;					   
			});
			
			$pagerPrev.click(function(){
				var indexPrevPager = Number(opts.current) - 1;
				if(indexPrevPager < 1){
					indexPrevPager = 1;
				}
				$.fn.aqPaging.flip(pid, indexPrevPager, opts.pages, opts.pagerMax, opts.pagerRange, opts.pagerCounter, opts.pagerSeparator, opts.style, opts.itemsPerPage, opts.objToPaginate, opts.textPagination);
				return false;				   
			});
			
			$pagerLink.click(function(){
				var pageIndex = $(this).attr('rel');
				$.fn.aqPaging.flip(pid, pageIndex, opts.pages, opts.pagerMax, opts.pagerRange, opts.pagerCounter, opts.pagerSeparator, opts.style, opts.itemsPerPage, opts.objToPaginate, opts.textPagination);
				return false;
			});
			
			$pagerNext.click(function(){
				var indexNextPager = Number(opts.current) + 1;
				if(indexNextPager > opts.pages){
					indexNextPager = opts.pages;
				}
				$.fn.aqPaging.flip(pid, indexNextPager, opts.pages, opts.pagerMax, opts.pagerRange, opts.pagerCounter, opts.pagerSeparator, opts.style, opts.itemsPerPage, opts.objToPaginate, opts.textPagination);
				return false;				   
			});
			
			$pagerLast.click(function(){
				$.fn.aqPaging.flip(pid, opts.pages, opts.pages, opts.pagerMax, opts.pagerRange, opts.pagerCounter, opts.pagerSeparator, opts.style, opts.itemsPerPage, opts.objToPaginate, opts.textPagination);
				return false;
			});
			
			//IF CURRENT PAGE = FIRST OR LAST
			
			if(opts.current == 1){
				$pagerFirst.hide();
				$pagerPrev.hide();
			}else if(opts.current == opts.pages){
				$pagerNext.hide();
				$pagerLast.hide();
			}
				
		}
		
		//SELECTED PAGER LINK
		
		if(opts.style == 1){
			var hi = ((opts.current-1)%opts.pagerMax) + ((offset+1)*offset);
		}else if(opts.style == 2){
			var hi = ((opts.current-1)%opts.pagerMax) + ((offset)*offset);
		}
		
		//ADD SELECTED CLASS TO CURRENT PAGER
		
		$pager.find('li').removeClass('selected').eq(hi).addClass('selected');
		
		if(opts.flip){
			$.fn.aqPaging.flip(pid, opts.current, opts.pages, opts.pagerMax, opts.pagerRange, opts.pagerCounter, opts.pagerSeparator, opts.style, opts.itemsPerPage, opts.objToPaginate, opts.textPagination );
		}
	});
};

$.fn.aqPaging.flip = function(id, p, total, pagerMax, pagerRange, pagerCounter, pagerSeparator, style, itemsPerPage, objToPaginate, textPagination) {
	var idx = id.replace(/aqPaging_/,'');
	var func = $.fn.aqPaging.defaults.cbs[idx];
	if(func){ func(p); };
	$('#'+id).parent().aqPaging({current: p, pages: total, pagerMax: pagerMax, pagerRange : pagerRange, pagerCounter: pagerCounter, pagerSeparator: pagerSeparator, style: style, itemsPerPage: itemsPerPage, objToPaginate: objToPaginate, textPagination : textPagination});
	return false;
};

$.fn.aqPaging.defaults = {
   cbs: [], pages: 0, current: 0, pagerMax: 10, uniqID: 0, flip: false, pagerRange: false, pagerCounter: false, pagerSeparator:'...', style:1, itemsPerPage:10, objToPaginate:null, textPagination:false
   
};
	
})(jQuery);
