function TabPage(parentElem) {
	this.m_tabPage = null;
	this.m_tabsRow = null;
	this.m_handler = null;
	this.m_min = null;
	this.m_max = null;
	this.m_resultPerPage = null;
	this.m_numVisibleSelectors = null;
	this.m_actPage = 0;
	this.m_prev = null;
	this.m_next = null;
	this.m_selectors = new Array();
	this.m_firstVisible = null;
	this.m_lastVisible = null;
	this.m_nPages = null;
	this.m_parent = parentElem;
	
	var me = this;
	
	this.Init = function (handler, min, max, resultPerPage, numVisibleSelectors, actPage) {
		me.m_parent.update("");
		me.m_handler = handler;
		me.m_min = min;
		me.m_max = max;
		me.m_resultPerPage = resultPerPage;
		me.m_numVisibleSelectors = numVisibleSelectors;
		me.m_nPages = Math.ceil((me.m_max - me.m_min) / me.m_resultPerPage);
		me.m_firstVisible = 0;
		me.m_lastVisible = Math.min(numVisibleSelectors - 1, me.m_nPages - 1);
		me.m_actPage = actPage;

		if (Math.ceil((me.m_max - me.m_min) / me.m_resultPerPage) > 1) {
			me.m_tabPage = new Element("div");
			me.m_parent.insert(me.m_tabPage);

			var table = new Element("table");
			me.m_tabPage.insert(table);

			table.className = "leftTabPage";
			var tbody = new Element("tbody");
			table.insert(tbody);
			me.m_tabsRow = new Element("tr");
			tbody.insert(me.m_tabsRow);
			
			me.m_prev = new Element("td");
			me.m_tabsRow.insert(me.m_prev);
			if (me.m_numVisibleSelectors >= me.m_nPages) {
				me.m_prev.style.visibility = "hidden";
			}
			me.m_prev.a = new Element("a");
			me.m_prev.insert(me.m_prev.a);
			me.m_prev.a.href = "javascript: void(0);";
			me.m_prev.a.className = "inactiveTab";
			me.m_prev.a.onclick = function () {
				if (me.m_actPage > 0) {
					me.m_handler((me.m_actPage - 1) * me.m_resultPerPage, me.m_resultPerPage);
					if (me.m_actPage > Math.floor(me.m_numVisibleSelectors / 2) && me.m_actPage < me.m_nPages - Math.floor(me.m_numVisibleSelectors / 2)) {
						me.m_selectors[me.m_lastVisible].style.display = "none";
						me.m_lastVisible--;
						me.m_firstVisible--;
						me.m_selectors[me.m_firstVisible].style.display = "";
					}
					me.m_selectors[me.m_firstVisible].className = "selector";
					for (var i = me.m_firstVisible + 1; i < me.m_actPage; i++) {
						me.m_selectors[i].className = "selectorBorder";
					}
					me.m_selectors[me.m_actPage].a.className = "inactiveTab";
					me.m_actPage = me.m_actPage - 1;
					me.m_selectors[me.m_actPage].a.className = "activeTab";
				}
			}
			me.m_prev.a.update("&lt;&lt;");
			
			var SetOnClick = function(a, index) {
				a.onclick = function () {
					me.m_handler(index * me.m_resultPerPage, me.m_resultPerPage);
					me.SetActPage(index);
				}
			}
			
			for (var i = 0; i < me.m_nPages; i++) {
				me.m_selectors[i] = new Element("td");
				me.m_tabsRow.insert(me.m_selectors[i]);
				if (i > 0) {
					me.m_selectors[i].className = "selectorBorder";
				}
				else {
					me.m_selectors[i].className = "selector";
				}
				me.m_selectors[i].a = new Element("a");
				me.m_selectors[i].insert(me.m_selectors[i].a);
				me.m_selectors[i].a.href = "javascript: void(0);";
				me.m_selectors[i].a.className = "inactiveTab";
				SetOnClick(me.m_selectors[i].a, i);
				me.m_selectors[i].a.update(" " + (i + 1) + " ");
				if (i >= me.m_numVisibleSelectors) {
					me.m_selectors[i].style.display = "none";
				}
			}
			
			me.SetActPage(me.m_actPage);
			//me.m_selectors[0].a.className = "activeTab";
			
			me.m_next = new Element("td");
			me.m_tabsRow.insert(me.m_next);
			if (me.m_numVisibleSelectors >= me.m_nPages) {
				me.m_next.style.visibility = "hidden";
			}

			me.m_next.a = new Element("a");
			me.m_next.insert(me.m_next.a);
			me.m_next.a.href = "javascript: void(0);";
			me.m_next.a.className = "inactiveTab";
			me.m_next.a.onclick = function () {
				if (me.m_actPage + 1 < me.m_nPages) {
					me.m_handler((me.m_actPage + 1) * me.m_resultPerPage, me.m_resultPerPage);
					me.m_selectors[me.m_actPage].a.className = "inactiveTab";
					me.m_actPage = me.m_actPage + 1;
					me.m_selectors[me.m_actPage].a.className = "activeTab";
					if (me.m_actPage > Math.floor(me.m_numVisibleSelectors / 2) && me.m_actPage < me.m_nPages - Math.floor(me.m_numVisibleSelectors / 2)) {
						me.m_selectors[me.m_firstVisible].style.display = "none";
						me.m_firstVisible++;
						me.m_lastVisible++;
						me.m_selectors[me.m_lastVisible].style.display = "";
					}
					me.m_selectors[me.m_firstVisible].className = "selector";
				}
			}
			me.m_next.a.update("&gt;&gt;");
		}
	}

	this.SetActPage = function(index) {
		me.m_selectors[me.m_actPage].a.className = "inactiveTab";
		me.m_actPage = index;
		me.m_selectors[me.m_actPage].a.className = "activeTab";
					
		for (var i = me.m_firstVisible; i <= me.m_lastVisible; i++) {
			me.m_selectors[i].style.display = "none";
		}
					
		if (me.m_actPage <= Math.floor(me.m_numVisibleSelectors / 2)) {
			me.m_firstVisible = 0;
			me.m_lastVisible = Math.min(me.m_numVisibleSelectors - 1, me.m_nPages - 1);
		}
		else if (me.m_actPage >= me.m_nPages - Math.floor(me.m_numVisibleSelectors / 2)) {
			me.m_firstVisible = Math.max(me.m_nPages - me.m_numVisibleSelectors, 0);
			me.m_lastVisible = me.m_nPages - 1;
		}
		else {
			me.m_firstVisible = index - Math.floor(me.m_numVisibleSelectors / 2);
			me.m_lastVisible = me.m_firstVisible + me.m_numVisibleSelectors - 1;
		}
					
		for (var i = me.m_firstVisible; i <= me.m_lastVisible; i++) {
			me.m_selectors[i].style.display = "";
		}
					
		me.m_selectors[me.m_firstVisible].className = "selector";
		for (var i = me.m_firstVisible + 1; i <= me.m_lastVisible; i++) {
			me.m_selectors[i].className = "selectorBorder";
		}
	}

	this.Refresh = function () {
		me.m_handler(me.m_actPage * me.m_resultPerPage, me.m_resultPerPage);
	}
}