/**
 * @author Mykhailo Ivankiv [neformal.lviv@gmail.com]
 */

/**
 *
 * @param {Object} initObj
 */
var Pager = function (initObj){
	var _this = this;

	this.totalCount = 0;
	this.page=1;
	this.getKey = "#";
	this.container = {};
	_this.itemsPearPage = 5;
	/**
	 * events list
	 * 1. onPageChange - Triggered when user change page
	 *
	 */
	this.events = {};
	/**
	 *
	 * @param {String} e event name
	 * @param {Function} func
	 */
	this.bind = function (e,func){
		_this.events[e] = _this.events[e] || []
		_this.events[e].push(func);
		return _this;
	};
	/**
	 *
	 * @param {String} e
	 */
	this.trigger = function (e){
		for (var i=0; _this.events[e] && i< _this.events[e].length ;i++){_this.events[e][i](_this);}
		return _this
	};
	/**
	 *
	 * @param {Event} e
	 */
	this.setPage = function(e){
		if (e.target.tagName == 'A'){
			var pageNumber;

			if (e.target.className=='prev') pageNumber = _this.page -1;
			else if (e.target.className=='next') pageNumber = _this.page+1;
			else  pageNumber = e.target.innerHTML;

			if (_this.page == pageNumber){return false}
			else {_this.page = parseInt(pageNumber)}

			_this.renderPager({
				page: _this.page
			});

			e.stopPropagation();
			return false;
		}
	};

	this.renderPager = function (initObj){
		for (var initParam in initObj) _this[initParam] = initObj[initParam];
		_this.pagerCount = Math.ceil(_this.totalCount / _this.itemsPearPage);

		_this.container.html("");

		//Generate HTML of pager
		if (_this.pagerCount <= 1) return;

		var pagerHtml = [];

		// href="#" to href=""

		if (_this.page != 1) pagerHtml.push('<a href="" class="prev">&lt;</a>');
		if (_this.page -3 > 1){
			pagerHtml.push('<a href="">1</a>');
			if (_this.page -4 != 1)pagerHtml.push('<span>...</span>');
		}
		for (var i=_this.page-4; i<=_this.page+2 ;i++){
			if (i>=0 && i< _this.pagerCount){
				if ((i+1) == _this.page ) pagerHtml.push('<a href="" class="active">'+(i+1)+'</a>')
				else pagerHtml.push('<a href="">'+(i+1)+'</a>');
			}
		}
		if (_this.page +3 < _this.pagerCount){
			if (_this.page + 4 != _this.pagerCount) pagerHtml.push('<span>...</span>');
			pagerHtml.push('<a href="">'+_this.pagerCount+'</a>');
		}
		if (_this.page != _this.pagerCount) pagerHtml.push('<a href="" class="next">&gt;</a>');
		_this.container.html(pagerHtml.join(''));

		//$.address.value('page='+_this.page);

		_this.trigger('onPageChange');

	};

	this.externalChangePage = function (){
        var page = /page\=(\d+)/.exec(jQuery.address.value());
                if (!page) page = 1;
                else page = parseInt(page[1]);

		_this.renderPager({page:page|| _this.page || 1});
		//_this.renderPager({page:parseInt(/page\=(\d+)/.exec(jQuery.address.value())[1])|| _this.page || 1});
	};

	this.init = function (initObj){
		_this.renderPager(initObj);
		
		_this.container.bind ('click', _this.setPage);
		//jQuery.address.externalChange(function (){_this.externalChangePage();});
	};
	this.init (initObj);

	return this;
}
