var Paginator = function(paginatorHolderId, pagesTotal, pagesSpan, pageCurrent, baseUrl){ if(!document.getElementById(paginatorHolderId) || !pagesTotal || !pagesSpan) return false; this.inputData = { paginatorHolderId: paginatorHolderId, pagesTotal: pagesTotal, pagesSpan: pagesSpan < pagesTotal ? pagesSpan : pagesTotal, pageCurrent: pageCurrent, baseUrl: baseUrl ? baseUrl : '/pages/' }; this.html = { holder: null, table: null, trPages: null, trScrollBar: null, tdsPages: null, scrollBar: null, scrollThumb: null, pageCurrentMark: null }; this.prepareHtml(); this.initScrollThumb(); this.initPageCurrentMark(); this.initEvents(); this.scrollToPageCurrent(); } Paginator.prototype.prepareHtml = function(){ this.html.holder = document.getElementById(this.inputData.paginatorHolderId); this.html.holder.innerHTML = this.makePagesTableHtml(); this.html.table = this.html.holder.getElementsByTagName('table')[0]; var trPages = this.html.table.getElementsByTagName('tr')[0]; this.html.tdsPages = trPages.getElementsByTagName('td'); this.html.scrollBar = getElementsByClassName(this.html.table, 'div', 'scroll_bar')[0]; this.html.scrollThumb = getElementsByClassName(this.html.table, 'div', 'scroll_thumb')[0]; this.html.pageCurrentMark = getElementsByClassName(this.html.table, 'div', 'current_page_mark')[0]; if(this.inputData.pagesSpan == this.inputData.pagesTotal){ addClass(this.html.holder, 'fullsize'); } } Paginator.prototype.makePagesTableHtml = function(){ var tdWidth = (100 / this.inputData.pagesSpan) + '%'; var html = '' + '' + '' for (var i=1; i<=this.inputData.pagesSpan; i++){ html += ''; } html += '' + '' + '' + '' + '' + '
' + '
' + '
' + '
' + '
' + '
' + '
' + '
' + '
'; return html; } Paginator.prototype.initScrollThumb = function(){ this.html.scrollThumb.widthMin = '8'; this.html.scrollThumb.widthPercent = this.inputData.pagesSpan/this.inputData.pagesTotal * 100; this.html.scrollThumb.xPosPageCurrent = (this.inputData.pageCurrent - Math.round(this.inputData.pagesSpan/2))/this.inputData.pagesTotal * this.html.table.offsetWidth; this.html.scrollThumb.xPos = this.html.scrollThumb.xPosPageCurrent; this.html.scrollThumb.xPosMin = 0; this.html.scrollThumb.xPosMax; this.html.scrollThumb.widthActual; this.setScrollThumbWidth(); } Paginator.prototype.setScrollThumbWidth = function(){ this.html.scrollThumb.style.width = this.html.scrollThumb.widthPercent + "%"; this.html.scrollThumb.widthActual = this.html.scrollThumb.offsetWidth; if(this.html.scrollThumb.widthActual < this.html.scrollThumb.widthMin){ this.html.scrollThumb.style.width = this.html.scrollThumb.widthMin + 'px'; } this.html.scrollThumb.xPosMax = this.html.table.offsetWidth - this.html.scrollThumb.widthActual; } Paginator.prototype.moveScrollThumb = function(){ this.html.scrollThumb.style.left = this.html.scrollThumb.xPos + "px"; } Paginator.prototype.initPageCurrentMark = function(){ this.html.pageCurrentMark.widthMin = '3'; this.html.pageCurrentMark.widthPercent = 100 / this.inputData.pagesTotal; this.html.pageCurrentMark.widthActual; this.setPageCurrentPointWidth(); this.movePageCurrentPoint(); } Paginator.prototype.setPageCurrentPointWidth = function(){ this.html.pageCurrentMark.style.width = this.html.pageCurrentMark.widthPercent + '%'; this.html.pageCurrentMark.widthActual = this.html.pageCurrentMark.offsetWidth; if(this.html.pageCurrentMark.widthActual < this.html.pageCurrentMark.widthMin){ this.html.pageCurrentMark.style.width = this.html.pageCurrentMark.widthMin + 'px'; } } Paginator.prototype.movePageCurrentPoint = function(){ if(this.html.pageCurrentMark.widthActual < this.html.pageCurrentMark.offsetWidth){ this.html.pageCurrentMark.style.left = (this.inputData.pageCurrent - 1)/this.inputData.pagesTotal * this.html.table.offsetWidth - this.html.pageCurrentMark.offsetWidth/2 + "px"; } else { this.html.pageCurrentMark.style.left = (this.inputData.pageCurrent - 1)/this.inputData.pagesTotal * this.html.table.offsetWidth + "px"; } } Paginator.prototype.initEvents = function(){ var _this = this; this.html.scrollThumb.onmousedown = function(e){ if (!e) var e = window.event; e.cancelBubble = true; if (e.stopPropagation) e.stopPropagation(); var dx = getMousePosition(e).x - this.xPos; document.onmousemove = function(e){ if (!e) var e = window.event; _this.html.scrollThumb.xPos = getMousePosition(e).x - dx; _this.moveScrollThumb(); _this.drawPages(); } document.onmouseup = function(){ document.onmousemove = null; _this.enableSelection(); } _this.disableSelection(); } this.html.scrollBar.onmousedown = function(e){ if (!e) var e = window.event; if(matchClass(_this.paginatorBox, 'fullsize')) return; _this.html.scrollThumb.xPos = getMousePosition(e).x - getPageX(_this.html.scrollBar) - _this.html.scrollThumb.offsetWidth/2; _this.moveScrollThumb(); _this.drawPages(); } addEvent(window, 'resize', function(){Paginator.resizePaginator(_this)}); } Paginator.prototype.drawPages = function(){ var percentFromLeft = this.html.scrollThumb.xPos/(this.html.table.offsetWidth); var cellFirstValue = Math.round(percentFromLeft * this.inputData.pagesTotal); var html = ""; if(cellFirstValue < 1){ cellFirstValue = 1; this.html.scrollThumb.xPos = 0; this.moveScrollThumb(); } else if(cellFirstValue >= this.inputData.pagesTotal - this.inputData.pagesSpan) { cellFirstValue = this.inputData.pagesTotal - this.inputData.pagesSpan + 1; this.html.scrollThumb.xPos = this.html.table.offsetWidth - this.html.scrollThumb.offsetWidth; this.moveScrollThumb(); } for(var i=0; i" + cellCurrentValue + "" + ""; } else { html = "" + "" + cellCurrentValue + "" + ""; } this.html.tdsPages[i].innerHTML = html; } } Paginator.prototype.scrollToPageCurrent = function(){ this.html.scrollThumb.xPosPageCurrent = (this.inputData.pageCurrent - Math.round(this.inputData.pagesSpan/2))/this.inputData.pagesTotal * this.html.table.offsetWidth; this.html.scrollThumb.xPos = this.html.scrollThumb.xPosPageCurrent; this.moveScrollThumb(); this.drawPages(); } Paginator.prototype.disableSelection = function(){ document.onselectstart = function(){ return false; } this.html.scrollThumb.focus(); } Paginator.prototype.enableSelection = function(){ document.onselectstart = function(){ return true; } } Paginator.resizePaginator = function (paginatorObj){ paginatorObj.setPageCurrentPointWidth(); paginatorObj.movePageCurrentPoint(); paginatorObj.setScrollThumbWidth(); paginatorObj.scrollToPageCurrent(); } function getElementsByClassName(objParentNode, strNodeName, strClassName){ var nodes = objParentNode.getElementsByTagName(strNodeName); if(!strClassName){ return nodes; } var nodesWithClassName = []; for(var i=0; i