
function FS_WEBCOMPONENT_PAGER(objJQueryContainer, intNbRecordPerPage, strCustomId) {
	this.objContainer = objJQueryContainer;
	this.intNbRecordPerPage = intNbRecordPerPage;
	this.arrListener = [];
	this.blnDisplayPageNumber = true;
	this.intSelectedPage = 1;
	this.strCustomId = (strCustomId?strCustomId:"pageSelector");
	this.arrContainerList = [];
	this.arrContainerList[strCustomId] = objJQueryContainer;
	this.blnRendered = false;
}

FS_WEBCOMPONENT_PAGER.prototype.selectPage = function(intPage) {
	this.intSelectedPage = parseInt(intPage);
}

FS_WEBCOMPONENT_PAGER.prototype.addListener = function(fnCallback) {
	this.arrListener.push(fnCallback);
}

FS_WEBCOMPONENT_PAGER.prototype.callListener = function(intSelectedPage) {
	for(var intI=0; intI < this.arrListener.length; intI++) {
		this.arrListener[intI](intSelectedPage);
	}
}

FS_WEBCOMPONENT_PAGER.prototype.displayPageNumber = function(blnDisplay) {
	this.blnDisplayPageNumber = blnDisplay;
}

FS_WEBCOMPONENT_PAGER.prototype.addContainer = function(objContainer,strSelectorId) {
	if (this.arrContainerList[strSelectorId]) {
		delete this.arrContainerList[strSelectorId];
	}
	this.arrContainerList[strSelectorId] = objContainer;
}

FS_WEBCOMPONENT_PAGER.prototype.changeContainer = function(objJQueryContainer) {
	var that = this;
	objJQueryContainer.each(function() {
		//clone the page
		var objClone = that.objContainer.find("div#pageSelector").clone(true);
		//append it to the current object
		$(this).append(objClone);
	});
	
	//remove from the current container
	this.objContainer.find("div#pageSelector").remove();
	
	//assign new container
	this.objContainer = objJQueryContainer;
	
}

FS_WEBCOMPONENT_PAGER.prototype.setNbRecordPerPage = function(intNbRecord){
	this.intNbRecordPerPage = intNbRecord;
}

FS_WEBCOMPONENT_PAGER.prototype.refresh = function (intTotalRecord, blnPrepend) {
	if(this.blnRendered) {
		this.render(intTotalRecord, blnPrepend);
	}
}

FS_WEBCOMPONENT_PAGER.prototype.render = function (intTotalRecord, blnPrepend) {
	
	blnNew = false;
	
	if(intTotalRecord > this.intNbRecordPerPage) {
		var intMaxPage = Math.ceil(intTotalRecord / this.intNbRecordPerPage);

		var objPageSelector = $("<div />");
		objPageSelector.attr("isPageSelector", "1");
		blnNew = true;

		if(objPageSelector && blnNew) {
			for(i in this.arrContainerList) {
				var objSelector = objPageSelector.clone(true);
				objSelector.attr("id",i);
				if (blnPrepend) {
					if (this.arrContainerList[i].find("div#" + i).length == 0) {
						this.arrContainerList[i].prepend(objSelector);
					}
				} else {
					if (this.arrContainerList[i].find("div#" + i).length == 0) {
						this.arrContainerList[i].append(objSelector);
					}
				}
			}
		}

		var objAPrev = $("<a />").attr("href", "#");
		var objANext = $("<a />").attr("href", "#");
		
		objAPrev.attr("onclick","return false;");
		objAPrev.attr("page","prev");
		if(this.intSelectedPage <= 1) {
			
			objAPrev.addClass("deactivated");
		}
		else {
			objAPrev.removeClass("deactivated");
		}
		objAPrev.html("< Previous");

		
		if(this.intSelectedPage >= intMaxPage) {
			if (this.intSelectedPage > intMaxPage) {
				this.intSelectedPage = intMaxPage;
			}
			objANext.addClass("deactivated");
		}
		else {
			objANext.removeClass("deactivated");
		}
		objANext.attr("onclick","return false;");
		objANext.attr("page","next");
		objANext.html("Next >");

		for(i in this.arrContainerList) {
			var oAPrevClone = objAPrev.clone(true);
			this.arrContainerList[i].find("div[isPageSelector=1]").html("");
			this.arrContainerList[i].find("div[isPageSelector=1]").append(oAPrevClone);
			this.arrContainerList[i].find("div[isPageSelector=1]").append(" ");
		}
		
		if(this.blnDisplayPageNumber) {
			//add first page
			var objA = $("<a />").attr("href", "#");
			objA.attr("onclick","return false;");
			objA.attr("page",1);
			objA.html(1);
			
			for(i in this.arrContainerList) {
				var oAClone = objA.clone(true);
				this.arrContainerList[i].find("div[isPageSelector=1]").append(oAClone);;
				this.arrContainerList[i].find("div[isPageSelector=1]").append(" ");
			}

			var intStartPage = (this.intSelectedPage <= 2? 2: (this.intSelectedPage+1 >= intMaxPage? (intMaxPage - 3 <= 1? 2: intMaxPage - 3):this.intSelectedPage-1));
			var intEndPage = intStartPage+2;
			
			
			if(intStartPage-1 >= 2) {
				for(i in this.arrContainerList) {
					this.arrContainerList[i].find("div[isPageSelector=1]").append("... ");
				}
			}
			
			
			
			for(var intI = intStartPage; intI < intMaxPage && intI <= intEndPage; intI++) {
				var objA = $("<a />").attr("href", "#");
				objA.attr("onclick","return false;");
				
				objA.attr("page",intI);
				objA.html(intI);
				
				for(i in this.arrContainerList) {
					var oAPageClone = objA.clone(true);
					this.arrContainerList[i].find("div[isPageSelector=1]").append(" ");
					this.arrContainerList[i].find("div[isPageSelector=1]").append(oAPageClone);
					this.arrContainerList[i].find("div[isPageSelector=1]").append(" ");
				}
				
			}
			
			
			if(
				this.intSelectedPage+2 < intMaxPage && 
				intEndPage+1 < intMaxPage
			) {
				for(i in this.arrContainerList) {
					this.arrContainerList[i].find("div[isPageSelector=1]").append(" ...");
				}
			}

			//add lastPage
			var objA = $("<a />").attr("href", "#");
			objA.attr("onclick","return false;");
			objA.attr("page",intMaxPage);
			objA.html(intMaxPage);
			//objPageSelector.append(objA);
			for(i in this.arrContainerList) {
				var oAPageClone = objA.clone(true);
				this.arrContainerList[i].find("div[isPageSelector=1]").append(oAPageClone);
			}
		}

		//objPageSelector.append(objANext);
		for(i in this.arrContainerList) {
			var oANextClone = objANext.clone(true);
			this.arrContainerList[i].find("div[isPageSelector=1]").append(" ");
			this.arrContainerList[i].find("div[isPageSelector=1]").append(oANextClone);
		}
		
		var that = this;

		for(i in this.arrContainerList) {
			this.arrContainerList[i].find("a[page]").click(function(event){
				event.preventDefault();
				if(
					!$(this).hasClass("deactivated") &&
					!$(this).hasClass("selected") 
				) {
					var strPage = $(this).attr("page");
					var blnPageChanged = false;
		
					switch(strPage) {
						case 'prev':
							if(that.intSelectedPage > 1) {
								blnPageChanged = true;
								--that.intSelectedPage;
							}
						break;
						case 'next':
							if(that.intSelectedPage < intMaxPage) {
								blnPageChanged = true;
								++that.intSelectedPage;
							}
						break;
						default:
							if(parseInt(strPage)) {
								blnPageChanged = true;
								that.intSelectedPage = parseInt(strPage);
							}
					}
		
					if(blnPageChanged) {
						that.callListener(that.intSelectedPage);
					}
		
					//highlight the good page
					for(o in that.arrContainerList) {
						if (that.arrContainerList[o] && that.arrContainerList[o].find("a[page]")) {
							that.arrContainerList[o].find("a[page]").removeClass("selected");
							that.arrContainerList[o].find("a[page=" + that.intSelectedPage +"]").addClass("selected");
						}
					}
					
					//redraw the page container
					that.render(intTotalRecord, blnPrepend);
				}
			});
		}

		var strPage = $(this).attr("pageId");
		for(i in this.arrContainerList) {
			if (this.arrContainerList[i] && this.arrContainerList[i].find("a[page]").length) {
				this.arrContainerList[i].find("a[page]").removeClass("class");
				this.arrContainerList[i].find("a[page=" + this.intSelectedPage +"]").addClass("selected");
			}
		}
		
		for(i in this.arrContainerList) {
			this.arrContainerList[i].find("div[isPageSelector=1]").show();
		}
	} else {
		for(i in this.arrContainerList) {
			this.arrContainerList[i].find("div[isPageSelector=1]").hide();
		}
	}
	this.blnRendered = true;
}

FS_WEBCOMPONENT_PAGER.prototype.destroy = function() {
	this.objContainer = null;
	this.arrListener = [];
	this.arrContainerList = [];
};
