var quickFS_GUI_ROWPAGER = function() {

// configuration 	
	var PAGE_SIZE_SELECTION = {"10":10,"25":25,"50":50,"100":100};
	var PAGE_SELECTION_RANGE = 5;	// 1 2 3 4 5! [6] 5 8 9 10 11 
	var PAGE_SIZE = 10;
	var PAGER_AT = 0;
	var PAGE = 1;
	
	var pageFunction;
	var $pagerParents;
	var rowCount;
	
	return {
		"bind":bind,
		"reset":reset,
		"render":render,
		"clear":clear
	};
	
	function reset() {
		$pagerParents.html("");
		PAGE_SIZE = 10;
        PAGE = 1;
	}

    function clear() {
        $pagerParents.html("");
    }

    function bind(callBackFunction, $pagerParents_) {
		pageFunction = callBackFunction;
		$pagerParents = $pagerParents_;
		initEvents($pagerParents);
	}

	function render(rowCount_) {
		rowCount = rowCount_;
		if (rowCount > PAGER_AT) {
			var html = getPagerHtml(PAGE);
			$pagerParents.html(html);
		}
	}

	function page() {
		pageFunction(PAGE, PAGE_SIZE);
	}
	
	function getLastPage() {
		var lastPage = Math.ceil(rowCount/PAGE_SIZE);
		return lastPage;
		
	}

	function getPagerHtml(page) {
		var html = "";
		html += "<td class='button first enabled'></td>";
		html += "<td class='button before enabled'></td>";
		html += getPageSelection(page);
		html += "<td class='button after enabled'></td>";
		html += "<td class='button last enabled'></td>";
		html += "<td class='size selection'>" + getPageSizeSelection() + "</td>";
		html += "<td>rows per page</td>";
		//html += "<td class='size selection'>" + getPageSizeSelection() + " " + util.message.get("rows_per_page") + "</td>";
		html = "<table class='pager'><tr>" + html + "</tr></table>";

		return html;
	}

	function getPageSelection(page) {
		var lastPage = getLastPage();
		var pageAt = page - PAGE_SELECTION_RANGE;
		var pageTo = page + PAGE_SELECTION_RANGE;
		if (page < PAGE_SELECTION_RANGE + 1) {
			pageAt = 1;
			pageTo = PAGE_SELECTION_RANGE * 2 + 1;
		}
		if (lastPage - page < PAGE_SELECTION_RANGE + 1) {
			pageAt = lastPage - (PAGE_SELECTION_RANGE * 2 + 1) ;
			pageTo = lastPage;
		}
		
		var html = "";
		for (var p = pageAt; p <= pageTo; p++) {
			if (p > 0 && p <= lastPage)
			if (p === page) {
				html += "<td class='button page selected'>" + p + "</td>";
			} else {
				html += "<td class='button page select'>" + p + "</td>";
			}
		}
		return html;
	}

	function getPageSizeSelection() {
		var html = "";
		html += "<select class='PageSizeSelection'>";
		for (var key in PAGE_SIZE_SELECTION) {
			var pageSize = PAGE_SIZE_SELECTION[key];
			var description = key;
//                if (pageSize === 0) description = util.message.get("selection_select_all") ;
			if (pageSize === PAGE_SIZE) {
				html += "<option value='" + pageSize + "' selected=''>" + description + "</option>";
			} else {
				html += "<option value='" + pageSize + "'>" + description + "</option>";
			}
		}
		html += "</select>";
		return html;
	}

	function initEvents() {
		addPageEvent($pagerParents);
		addPageSelectionEvent($pagerParents);
		initPageSizeSelection(($pagerParents));
	}
	
	function initPageSizeSelection() {
		$pagerParents.off("change", ".PageSizeSelection");
		$pagerParents.on("change", ".PageSizeSelection", function() {
			var $selection = $(this);
			PAGE_SIZE = Number($selection.val());
			PAGE = 1;
			page();
		});
	}
	
	function addPageSelectionEvent() {
		$pagerParents.off("click", ".page.select");
		$pagerParents.on("click", ".page.select", function() {
			var $td= $(this);
			$td.parent().find(".selected").removeClass("selected");
			$td.addClass("selected");
			PAGE = Number($td.html());
			page();
		});
	}
	
	function addPageEvent() {
		$pagerParents.off("click", ".button.enabled");
		$pagerParents.on("click", ".button.enabled", function() {
			var $button = $(this);
            $button.parent().find(".selected").removeClass("selected");
            $button.addClass("selected");

            var before = $button.hasClass("before");
			var first = $button.hasClass("first");
			var last = $button.hasClass("last");
			
			var lastPage = getLastPage();
			if (first) {
				if (PAGE !== 1) {
					PAGE = 1;
					page();
				}
			} else if (last) {
				if (PAGE !== lastPage) {
					PAGE = lastPage;
					page();
				}
			} else if (before) {
				if (PAGE > 1) {
					PAGE = PAGE - 1;
					page();
				}
			} else {
				if (PAGE < lastPage) {
					PAGE = PAGE + 1;
					page();
				}
			}
		});
	}
}

