/**
* Copyright 2008-2011 massimocorner.com
* License: http://www.massimocorner.com/license.htm
* @author      Massimo Foti (massimo@massimocorner.com)
* @version     1.1, 2011-11-24
* @require     SpryData.js and SpryPagedView.js
*/

if(typeof(tmt) == "undefined"){
	tmt = {};
}

if(typeof(tmt.spry) == "undefined"){
	tmt.spry = {};
}

tmt.spry.pagingbar = {};

/**
* Create a pagingbar object for an instance of Spry.Data.PagedView
* @param       pagedView    Required. Name of the Spry.Data.PagedView that will be associated with this widget
* @param       nodeId       Required. The id of the XHTML element that will contain the paging bar
* @param       options      Optional. An object containing name value pairs
*/
tmt.spry.pagingbar.factory = function (pagedView, nodeId, options) {
	var pagingObj = {};
	pagingObj.pagedView = pagedView;
	pagingObj.nodeId = nodeId;
	pagingObj.firstLoad = true;
	pagingObj.pageIndex = 1;
	if (!options) {
		options = {};
	}
	// By default we show links, not pages
	if (!options.style) {
		pagingObj.style = "links";
	}
	else {
		pagingObj.style = options.style;
	}
	if (!options.prev) {
		pagingObj.prevText = "<";
	}
	else {
		pagingObj.prevText = options.prev;
	}
	if (!options.next) {
		pagingObj.nextText = ">";
	}
	else {
		pagingObj.nextText = options.next;
	}
	if (!options.separator) {
		pagingObj.separator = " | ";
	}
	else {
		pagingObj.separator = options.separator;
	}
	if (!options.maxlinks) {
		pagingObj.maxlinks = 20;
	}
	else {
		pagingObj.maxlinks = options.maxlinks;
	}

	pagingObj.generateBar = function () {
		var barNode = Spry.$(pagingObj.nodeId);
		var pages = pagingObj.pagedView.getPageCount();
		var steps = pagedView.pageSize;
		var recordCount = pagedView.getData(true).length;
		var currentPageIndex = pagedView.getCurrentPage();
		// Math for mxlinks
		var startLink = parseInt(currentPageIndex - parseInt(pagingObj.maxlinks / 2));
		if (startLink < 1) {
			startLink = 1;
		}
		var tempPos = startLink + pagingObj.maxlinks - 1;
		var endlink = pages;
		if (tempPos < pages) {
			endlink = tempPos;
		}
		if (endlink == pages) {
			startLink = pages - pagingObj.maxlinks;
		}
		if (startLink < 1) {
			startLink = 1;
		}
		barNode.innerHTML = "";
		if (pages > 1) {
			// Create "previous" link
			var prevText = document.createTextNode(pagingObj.prevText);
			var prevLink = document.createElement("a");
			prevLink.setAttribute("href", "javascript:;");
			prevLink.onclick = function () {
				pagedView.previousPage();
				pagingObj.setState();
			};
			prevLink.appendChild(prevText);
			if (currentPageIndex != 1) {
				barNode.appendChild(prevLink);
			}
			else {
				barNode.appendChild(prevText);
			}
			barNode.appendChild(document.createTextNode(" "));
			// Create main links
			// Keep in mind page numbers are between 1 and n. So the loop start from 1
			for (var i = startLink; i < (endlink + 1); i++) {
				var linkText = "";
				// It's a pagebar
				if (pagingObj.style == "pages") {
					linkText = i;
				}
				// It's a linkbar
				else {
					var start = "";
					var end = "";
					if (i != 1) {
						start = (steps * (i - 1)) + 1;
					}
					else {
						// First link
						start = 1;
					}
					if (i < (pages)) {
						end = start + steps - 1;
					}
					else {
						// Last link
						end = recordCount;
					}
					linkText = start + " - " + end;
				}
				var textNode = document.createTextNode(linkText);
				if (i != currentPageIndex) {
					var linkNode = document.createElement("a");
					linkNode.appendChild(textNode);
					linkNode.setAttribute("href", "javascript:;");
					// Start weird hack
					linkNode.setAttribute("sprypage", i);
					linkNode.onclick = function() {
						pagedView.goToPage(this.getAttribute("sprypage"));
						pagingObj.setState();
					};
					// End weird hack
					barNode.appendChild(linkNode);
				}
				// No link on current page
				else {
					var strongNode = document.createElement("strong");
					strongNode.appendChild(textNode);
					barNode.appendChild(strongNode);
				}
				// Add the separator until last page
				if (i < (endlink)) {
					var separatorNode = document.createTextNode(pagingObj.separator);
					barNode.appendChild(separatorNode);
				}
			}
			// Create "next" link
			barNode.appendChild(document.createTextNode(" "));
			var nextText = document.createTextNode(pagingObj.nextText);
			var nextLink = document.createElement("a");
			nextLink.setAttribute("href", "javascript:;");
			nextLink.onclick = function () {
				pagedView.nextPage();
				pagingObj.setState();
			};
			nextLink.appendChild(nextText);
			if (currentPageIndex != (pages)) {
				barNode.appendChild(nextLink);
			}
			else {
				barNode.appendChild(nextText);
			}
		}
	};

	// Called by the Spry's dataset as soon as it finished loading data
	pagingObj.onPostLoad = function (dataSet, data) {
		pagingObj.generateBar();

		pagingObj.restoreState();

		//console.log("onPostLoad")
	};

	// Called by the Spry's dataset as soon as data is changed
	pagingObj.onDataChanged = function (dataSet, data) {
		pagingObj.generateBar();
		//pagingObj.restoreState();

		//console.log("onDataChanged")
	};
	
	pagingObj.setState = function () {
		pagingObj.pageIndex = pagedView.getCurrentPage();
	};

	pagingObj.restoreState = function (dataSet, data) {
		if (pagingObj.firstLoad != true) {
			var availablePages = pagingObj.pagedView.getPageCount();
			if (pagingObj.pageIndex <= availablePages) {
				pagedView.goToPage(pagingObj.pageIndex);
			}
		}
		// First time we are loaded, nothing to do
		else {
			pagingObj.firstLoad = false;
			pagingObj.pageState = pagedView.getCurrentPage();
		}
	};

	// Register as observer for Spry Pager
	pagedView.addObserver(pagingObj);

	return pagingObj;
}
