//////////////////////////////////////////////////////////////////////////////////
// Pagination V1.0.1
// (c) 2011 by Tower.ie <http://tower.ie>
// Developer: Adriano Spadoni ( Drix ) 
//
// Please retain this copyright header in all versions of the software
//////////////////////////////////////////////////////////////////////////////////
(function ($) {

    $(document).ready(function () {
        $('.pagination').Pagination();
    });

    function format(str) {
        for (var i = 1; i < arguments.length; i++) str = str.replace('%' + (i - 1), arguments[i]);
        return str;
    }

    function Pagination(jWin, opts) {
        //var sImg = $('img', jWin);
        var ptx  = this;
   			
   			var page  = Number(opts.page);
				var pages = Number(opts.pages);
				var size  = Number(opts.size);
				
				var loop = opts.loop;
				var gif = opts.gif;
				var objs = [null];
				
				var show_page;
				var dots_first;
				var dots_last;
				var nav_first;
				var nav_last;
				var nav_prev;
				var nav_next;
				
   			this.url  = opts.url;
   			this.method = opts.method;
   			this.target = opts.target;
				this.data = {};
				
				// normalize displayers
				this.normalize = function(){		
					// select page
					jWin.find('.selected').removeClass('selected');
					objs[page].addClass('selected');
					if(!loop){
						 nav_next.css('display', page < pages ? 'inline' : 'none');
						 nav_prev.css('display', page > 1 ? 'inline' : 'none');
					}
					// hide extra pages
					var i = pages + 1;
					var to   = Math.max( size, page + Math.floor(size / 2));
					var from = Math.min( pages - size, page - Math.floor(size / 2));
					while(--i) objs[i].css('display', ( i >= from && i <= to  ) ? 'inline' : 'none');
					
					show_page.text(page);
					
					if(!nav_first) return false;
					var first = objs[1].css('display') == 'none' ? 'inline' : 'none';
					nav_first.css('display', first);
					dots_first.css('display', first);
					
					var last = objs[pages].css('display') == 'none' ? 'inline' : 'none';
					nav_last.css('display', last);
					dots_last.css('display', last);
				}
				
					
				this.changepage = function(event){
					var p = this.rel;
					// check page
					switch(p){
						case page 	: return false; 	break;
						case 'first': page = 1; 			break;
						case 'last' : page = pages; 	break;
						case 'next' : ++page; 				break;
						case 'prev' : --page + pages; break;
						default : page = Number(p);
					}
					page = page % pages;
					if(page == 0) page = pages; // workaround for use pages start on 1 instead of 0
					ptx.data.page = page;
					
					// Load page
					if(ptx.target!=null){ // AJAX
						$('#'+ptx.target).html('<img class="loadding" src="'+gif+'" />');
						$.ajax({
							  type: ptx.method,
							  url: 	ptx.url,
							  data: ptx.data,
							  success: function(result){ 
							  	$('#'+ptx.target).html(result);	
							  }
						});
					}else{
						var form = $(document.body).append('<form></form>').find(':last');
						form.attr('method', ptx.method);
						form.attr('action', ptx.url);
					  for (var k in ptx.data) form.append(format('<input name="%0" value="%1"/>',k,ptx.data[k]));
					  form.submit();
					}
					ptx.normalize();
				}
				
				// get gif for loadding
				var imgload = jWin.find('img');
				if(imgload){
					gif = imgload.attr('src');
					$(imgload).remove();
				}
				
				// get URL
				var ahref = jWin.find('a');
				if(ahref){
					this.url = ahref.attr('href').split('?')[0];
					// get data
					var gdata = ahref.attr('href').split('?')[1].split(['&']);
					for(var j in gdata) this.data[gdata[j].split('=')[0]] = gdata[j].split('=')[1];
					$(ahref).remove();
				}
				
				// ADD BUTTONS
				if(pages > size){
					 	nav_first  = jWin.append('<a rel="first" href="#">first</a>').find(':last');
						nav_first.bind('click', this, this.changepage);
				}
				nav_prev  = jWin.append('<a rel="prev" href="#">previous</a>').find(':last');
				if(pages > size) dots_first = jWin.append('<span>...</span>').find(':last');
				
				for(var i = 1; i <= pages; i++){
					var obj = jWin.append(format('<a rel="%0" href="#">%1</a>', i, i)).find(':last');
					obj.bind('click', this, this.changepage);
					objs.push(obj);
				}
				if(pages > size) dots_last = jWin.append('<span>...</span>').find(':last');
				nav_next  = jWin.append('<a rel="next" href="#">next</a>').find(':last');
				if(pages > size) {
					nav_last  = jWin.append('<a rel="last" href="#">last</a>').find(':last');
					nav_last.bind('click', this, this.changepage);
				}
				nav_prev.bind('click', this, this.changepage);
				nav_next.bind('click', this, this.changepage);
				
				show_page = jWin.append(format('<p>page <span class="page"></span> of %0</p>', pages)).find('.page');
				this.normalize();
				
    }

    $.fn.Pagination = function (options) {
        this.each(function () {
						var	relOpts = {};
						var opts;
						
						// workarround I'll change to a regexp later
						var a = $.trim($(this).attr('rel')).split(';');
						for( var i in a){
							var b = $.trim(a[i]).split(':');
							if(b!='') relOpts[$.trim(b[0])] = $.trim(b[1]);
						}//------------------
						
            opts = $.extend({}, $.fn.Pagination.defaults, options);
            opts = $.extend({}, opts, relOpts);
            $(this).data('Pagination', new Pagination($(this).parent(), opts));
        });
        return this;
    };

    $.fn.Pagination.defaults = {
        ptx  : this,
   			page : 1,
				pages: 8,
				size: 5,
				loop : false,
				url  : "/",
				gif  : "/images/loading.gif",
				method : 'get',
   			target : null
    };

})(jQuery);
