/**
 * This class represent the logic of DHTML page navigation interface.
 * Compatibilities : IE, Firefox
 * @package DHL::COMPONENT::NAVIGATION
 */
function DHL_PAGENAVIGATION(oTemplate, oCellTarget) {
	
	var oHTMLTemplate = oTemplate;
	var oHTMLCellTarget = oCellTarget;

	var iTotalPage = 1;
	var iVisiblePage = 11;
	var iStartPage = 1;

	var fOnPageCallback = null;
	var fOnState = null
	
	var blnDisplayOutOfBounfLink = true;
	var blnLoop = false;
	var blnReplace = false;
	
	this.setStartPage = function setStartPage(iPage) {
		iStartPage = iPage;	
	}
	
	/* Set if we must display the 'next' / 'previous' item if we are out of the index */
	this.setOutOfBoundDisplay = function setOutOfBoundDisplay(blnValue){
		blnDisplayOutOfBounfLink = blnValue;
	}
	/* Set the looping pages function, as in , on Next press at the last page goes to the first, and back goes to the last page */
	this.setLoop = function setLoop(blnLoopValue){
		blnLoop = blnLoopValue;
	}
	/* If set to true, and setOutOfBoundDisplay is false, will try to replace a removed cell with an empty one to preserve look */
	this.setReplace = function setReplace(blnValue){
		blnReplace = blnValue;
	}
	
	this.setTotalPage = function setTotalPage(iPage) {
		iTotalPage = iPage;
	}

	this.setVisiblePage = function setVisiblePage(iCount) {
		iVisiblePage = iCount;
	}
	
	this.setOnPageEvent = function setOnPageEvent(fCallBack) {
		fOnPageCallback = fCallBack;
	}
	
	this.setOnState = function setOnActive(fCallBack) {
		fOnState = fCallBack;
	}

	this.addPage = function addPage(oCellTemplate, sCaption, fnc, bLink) {
		var oCell = oCellTemplate;
		oCell.id = null;
		oNumber = DOM_getElementById(oCell, 'tNumber');
		if (oNumber) {
			oNumber.innerHTML = sCaption;
		}

		var oLink = DOM_getElementById(oCell, 'tLink');
		oLink.onclick = (bLink ? fnc : function() { return false; });
		oLink.ondblclick = (bLink ? fnc : function() { return false; });
		
		if (fOnState) {
			fOnState(oCell, oLink, bLink);
		} else {
			oLink.style.textDecoration = (bLink ? 'underline' : 'none');
		}

		oHTMLCellTarget.appendChild(oCell);
	}

	/**
	 * Update Page Rendering
	 * @param iPage INT current Page
	 * @param blnChanginPage Boolean If set to true will not execute callback (reverse validation, added after implementation..)
	 * @return void
	 */
	this.setCurrentPage = function setCurrentPage(iPage, blnChangingPage) {
		
		if (fOnPageCallback && !blnChangingPage) {
			fOnPageCallback(iPage);
		}

		var iPerPage = iVisiblePage;

		if (iPerPage > iTotalPage) {
			iPerPage = iTotalPage;
		}

		var iStart = iStartPage;
		if (iPage > iPerPage / 2) {
			iStart = iPage - (iPerPage / 2);
		}

		if (iPage > iTotalPage - (iPerPage / 2)) {
			iStart = iTotalPage - iPerPage + iStartPage;
		}

		iStart = Math.round(iStart);

		var iEnd = (iStart + iPerPage);

		if (iEnd > iTotalPage) {
			iEnd = iTotalPage;
		}

		var oPage = oHTMLCellTarget;

		while(oPage.firstChild) {
			oPage.removeChild(oPage.firstChild);
		}

		var me = this;
		
		var oFill = false;
		if (blnReplace) {
			var oFill = DOM_getElementById(oHTMLTemplate, 'tFill');
		}

		var oFirst = DOM_getElementById(oHTMLTemplate, 'tFirst');
		if (oFirst) {
			this.addPage(
				oFirst.cloneNode(true), 
				'<< First', function() { me.setCurrentPage(iStartPage); return false; }, iPage > iStartPage
			);
		}

		var OPrev = DOM_getElementById(oHTMLTemplate, 'tPrev');
		if (OPrev) {
			if(blnDisplayOutOfBounfLink || (!blnDisplayOutOfBounfLink && iPage - 1 > 0))
			{
				if (blnLoop && iPage -1 <= 0) {
					this.addPage(
						OPrev.cloneNode(true), 
						'< Back', function() { me.setCurrentPage(iTotalPage); return false; }, iPage < iTotalPage
					);
				} else {
					this.addPage(
						OPrev.cloneNode(true), 
						'< Back', function() { me.setCurrentPage(iPage - 1); return false; }, iPage > iStartPage
					);
				}
			} else if (blnReplace && oFill) {
				this.addPage (
					oFill.cloneNode(true),'',null,false
				);
			}
		}
		for(var i=iStart; i<=iEnd; i++) {
			e = function () {
				var p = i;

				var oCell = DOM_getElementById(oHTMLTemplate, 'tPage' + i);

				if (!oCell) {
					oCell = DOM_getElementById(oHTMLTemplate, 'tPageNumber')
				}

				if (i == iPage && (oSelectedPage = DOM_getElementById(oHTMLTemplate, 'tSelectedPageNumber'))) {
					oCell = oSelectedPage;
				}

				oBetweenPage = DOM_getElementById(oHTMLTemplate, 'tBetweenPage')
				if (oBetweenPage && i > iStart) {
					oBetween = oBetweenPage.cloneNode(true);
					oBetween.id = null;
					oPage.appendChild(oBetween);
				}

				me.addPage(
					oCell.cloneNode(true), 
					i, function() { me.setCurrentPage(p); return false; }, iPage != i
				);
			}
			e();
		}

		var oCounter = DOM_getElementById(oHTMLTemplate, 'tPageCounter');
		if (oCounter) {
			var oCell = oCounter.cloneNode(true);
			oCell.innerHTML = iPage+'/'+iTotalPage;
			oHTMLCellTarget.appendChild(oCell);
		}
		
		var oNext = DOM_getElementById(oHTMLTemplate, 'tNext');
		if (oNext) {
			if(blnDisplayOutOfBounfLink || (!blnDisplayOutOfBounfLink && iPage + 1 <= iTotalPage)) {
				if (blnLoop && iPage + 1 > iTotalPage) {
					this.addPage(
						oNext.cloneNode(true), 
						'Next >', function() { me.setCurrentPage(iStartPage); return false; }, iPage <= iTotalPage
					);
				} else {
					this.addPage(
						oNext.cloneNode(true), 
						'Next >', function() { me.setCurrentPage(iPage + 1); return false; }, iPage < iTotalPage
					);
				}
			} else if (blnReplace && oFill) {
				this.addPage (
					oFill.cloneNode(true),'',null,false
				);
			}
		}

		var oLast = DOM_getElementById(oHTMLTemplate, 'tLast');
		if (oLast) {
			this.addPage(
				oLast.cloneNode(true), 
				'Last >>', function() { me.setCurrentPage(iTotalPage); return false; }, iPage < iTotalPage
			);
		}

	}
	
}
