27 var Paginator =
function(paginatorHolderId, pagesTotal, pagesSpan, pageCurrent, baseUrl){
28 if(!document.getElementById(paginatorHolderId) || !pagesTotal || !pagesSpan)
return false;
31 paginatorHolderId: paginatorHolderId,
32 pagesTotal: pagesTotal,
33 pagesSpan: pagesSpan < pagesTotal ? pagesSpan : pagesTotal,
34 pageCurrent: pageCurrent,
35 baseUrl: baseUrl ? baseUrl :
'/pages/'
55 this.initScrollThumb();
56 this.initPageCurrentMark();
59 this.scrollToPageCurrent();
65 Paginator.prototype.prepareHtml =
function(){
67 this.html.holder = document.getElementById(this.inputData.paginatorHolderId);
68 this.html.holder.innerHTML = this.makePagesTableHtml();
70 this.html.table = this.html.holder.getElementsByTagName(
'table')[0];
72 var trPages = this.html.table.getElementsByTagName(
'tr')[0];
73 this.html.tdsPages = trPages.getElementsByTagName(
'td');
75 this.html.scrollBar = getElementsByClassName(this.html.table,
'div',
'scroll_bar')[0];
76 this.html.scrollThumb = getElementsByClassName(this.html.table,
'div',
'scroll_thumb')[0];
77 this.html.pageCurrentMark = getElementsByClassName(this.html.table,
'div',
'current_page_mark')[0];
80 if(this.inputData.pagesSpan ==
this.inputData.pagesTotal){
81 addClass(this.html.holder,
'fullsize');
88 Paginator.prototype.makePagesTableHtml =
function(){
89 var tdWidth = (100 / this.inputData.pagesSpan) +
'%';
92 '<table width="100%">' +
94 for (var i=1; i<=this.inputData.pagesSpan; i++){
95 html +=
'<td width="' + tdWidth +
'"></td>';
100 '<td colspan="' + this.inputData.pagesSpan +
'">' +
101 '<div class="scroll_bar">' +
102 '<div class="scroll_trough"></div>' +
103 '<div class="scroll_thumb">' +
104 '<div class="scroll_knob"></div>' +
106 '<div class="current_page_mark"></div>' +
118 Paginator.prototype.initScrollThumb =
function(){
119 this.html.scrollThumb.widthMin =
'8';
120 this.html.scrollThumb.widthPercent = this.inputData.pagesSpan/this.inputData.pagesTotal * 100;
122 this.html.scrollThumb.xPosPageCurrent = (this.inputData.pageCurrent - Math.round(this.inputData.pagesSpan/2))/this.inputData.pagesTotal *
this.html.table.offsetWidth;
123 this.html.scrollThumb.xPos =
this.html.scrollThumb.xPosPageCurrent;
125 this.html.scrollThumb.xPosMin = 0;
126 this.html.scrollThumb.xPosMax;
128 this.html.scrollThumb.widthActual;
130 this.setScrollThumbWidth();
134 Paginator.prototype.setScrollThumbWidth =
function(){
136 this.html.scrollThumb.style.width = this.html.scrollThumb.widthPercent +
"%";
139 this.html.scrollThumb.widthActual = this.html.scrollThumb.offsetWidth;
142 if(this.html.scrollThumb.widthActual <
this.html.scrollThumb.widthMin){
143 this.html.scrollThumb.style.width = this.html.scrollThumb.widthMin +
'px';
146 this.html.scrollThumb.xPosMax = this.html.table.offsetWidth - this.html.scrollThumb.widthActual;
149 Paginator.prototype.moveScrollThumb =
function(){
150 this.html.scrollThumb.style.left = this.html.scrollThumb.xPos +
"px";
157 Paginator.prototype.initPageCurrentMark =
function(){
158 this.html.pageCurrentMark.widthMin =
'3';
159 this.html.pageCurrentMark.widthPercent = 100 / this.inputData.pagesTotal;
160 this.html.pageCurrentMark.widthActual;
162 this.setPageCurrentPointWidth();
163 this.movePageCurrentPoint();
166 Paginator.prototype.setPageCurrentPointWidth =
function(){
168 this.html.pageCurrentMark.style.width = this.html.pageCurrentMark.widthPercent +
'%';
171 this.html.pageCurrentMark.widthActual = this.html.pageCurrentMark.offsetWidth;
174 if(this.html.pageCurrentMark.widthActual <
this.html.pageCurrentMark.widthMin){
175 this.html.pageCurrentMark.style.width = this.html.pageCurrentMark.widthMin +
'px';
179 Paginator.prototype.movePageCurrentPoint =
function(){
180 if(this.html.pageCurrentMark.widthActual <
this.html.pageCurrentMark.offsetWidth){
181 this.html.pageCurrentMark.style.left = (this.inputData.pageCurrent - 1)/this.inputData.pagesTotal *
this.html.table.offsetWidth -
this.html.pageCurrentMark.offsetWidth/2 +
"px";
183 this.html.pageCurrentMark.style.left = (this.inputData.pageCurrent - 1)/this.inputData.pagesTotal *
this.html.table.offsetWidth +
"px";
192 Paginator.prototype.initEvents =
function(){
195 this.html.scrollThumb.onmousedown =
function(e){
196 if (!e) var e = window.event;
197 e.cancelBubble =
true;
198 if (e.stopPropagation) e.stopPropagation();
200 var dx = getMousePosition(e).x - this.xPos;
201 document.onmousemove =
function(e){
202 if (!e) var e = window.event;
203 _this.html.scrollThumb.xPos = getMousePosition(e).x - dx;
206 _this.moveScrollThumb();
211 document.onmouseup =
function(){
212 document.onmousemove = null;
213 _this.enableSelection();
215 _this.disableSelection();
218 this.html.scrollBar.onmousedown =
function(e){
219 if (!e) var e = window.event;
220 if(matchClass(_this.paginatorBox,
'fullsize'))
return;
222 _this.html.scrollThumb.xPos = getMousePosition(e).x - getPageX(_this.html.scrollBar) - _this.html.scrollThumb.offsetWidth/2;
224 _this.moveScrollThumb();
231 addEvent(window,
'resize',
function(){Paginator.resizePaginator(_this)});
237 Paginator.prototype.drawPages =
function(){
238 var percentFromLeft = this.html.scrollThumb.xPos/(this.html.table.offsetWidth);
239 var cellFirstValue = Math.round(percentFromLeft * this.inputData.pagesTotal);
243 if(cellFirstValue < 1){
245 this.html.scrollThumb.xPos = 0;
246 this.moveScrollThumb();
247 }
else if(cellFirstValue >= this.inputData.pagesTotal -
this.inputData.pagesSpan) {
248 cellFirstValue = this.inputData.pagesTotal - this.inputData.pagesSpan + 1;
249 this.html.scrollThumb.xPos = this.html.table.offsetWidth - this.html.scrollThumb.offsetWidth;
250 this.moveScrollThumb();
255 for(var i=0; i<this.html.tdsPages.length; i++){
256 var cellCurrentValue = cellFirstValue + i;
257 if(cellCurrentValue == this.inputData.pageCurrent){
258 html =
"<span>" +
"<strong>" + cellCurrentValue +
"</strong>" +
"</span>";
260 html =
"<span>" +
"<a href='" + this.inputData.baseUrl + cellCurrentValue +
"'>" + cellCurrentValue +
"</a>" +
"</span>";
262 this.html.tdsPages[i].innerHTML = html;
269 Paginator.prototype.scrollToPageCurrent =
function(){
270 this.html.scrollThumb.xPosPageCurrent = (this.inputData.pageCurrent - Math.round(this.inputData.pagesSpan/2))/this.inputData.pagesTotal *
this.html.table.offsetWidth;
271 this.html.scrollThumb.xPos =
this.html.scrollThumb.xPosPageCurrent;
273 this.moveScrollThumb();
280 Paginator.prototype.disableSelection =
function(){
281 document.onselectstart =
function(){
284 this.html.scrollThumb.focus();
287 Paginator.prototype.enableSelection =
function(){
288 document.onselectstart =
function(){
298 Paginator.resizePaginator =
function (paginatorObj){
300 paginatorObj.setPageCurrentPointWidth();
301 paginatorObj.movePageCurrentPoint();
303 paginatorObj.setScrollThumbWidth();
304 paginatorObj.scrollToPageCurrent();
313 function getElementsByClassName(objParentNode, strNodeName, strClassName){
314 var nodes = objParentNode.getElementsByTagName(strNodeName);
318 var nodesWithClassName = [];
319 for(var i=0; i<nodes.length; i++){
320 if(matchClass( nodes[i], strClassName )){
321 nodesWithClassName[nodesWithClassName.length] = nodes[i];
324 return nodesWithClassName;
328 function addClass( objNode, strNewClass ) {
329 replaceClass( objNode, strNewClass,
'' );
332 function removeClass( objNode, strCurrClass ) {
333 replaceClass( objNode,
'', strCurrClass );
336 function replaceClass( objNode, strNewClass, strCurrClass ) {
337 var strOldClass = strNewClass;
338 if ( strCurrClass && strCurrClass.length ){
339 strCurrClass = strCurrClass.replace( /\s+(\S)/g,
'|$1' );
340 if ( strOldClass.length ) strOldClass +=
'|';
341 strOldClass += strCurrClass;
343 objNode.className = objNode.className.replace(
new RegExp(
'(^|\\s+)(' + strOldClass +
')($|\\s+)',
'g'),
'$1' );
344 objNode.className += ( (objNode.className.length)?
' ' :
'' ) + strNewClass;
347 function matchClass( objNode, strCurrClass ) {
348 return ( objNode && objNode.className.length && objNode.className.match(
new RegExp(
'(^|\\s+)(' + strCurrClass +
')($|\\s+)') ) );
352 function addEvent(objElement, strEventType, ptrEventFunc) {
353 if (objElement.addEventListener)
354 objElement.addEventListener(strEventType, ptrEventFunc,
false);
355 else if (objElement.attachEvent)
356 objElement.attachEvent(
'on' + strEventType, ptrEventFunc);
358 function removeEvent(objElement, strEventType, ptrEventFunc) {
359 if (objElement.removeEventListener) objElement.removeEventListener(strEventType, ptrEventFunc,
false);
360 else if (objElement.detachEvent) objElement.detachEvent(
'on' + strEventType, ptrEventFunc);
364 function getPageY( oElement ) {
365 var iPosY = oElement.offsetTop;
366 while ( oElement.offsetParent != null ) {
367 oElement = oElement.offsetParent;
368 iPosY += oElement.offsetTop;
369 if (oElement.tagName ==
'BODY')
break;
374 function getPageX( oElement ) {
375 var iPosX = oElement.offsetLeft;
376 while ( oElement.offsetParent != null ) {
377 oElement = oElement.offsetParent;
378 iPosX += oElement.offsetLeft;
379 if (oElement.tagName ==
'BODY')
break;
384 function getMousePosition(e) {
385 if (e.pageX || e.pageY){
388 }
else if (e.clientX || e.clientY) {
389 var posX = e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;
390 var posY = e.clientY + document.body.scrollTop + document.documentElement.scrollTop;
392 return {x:posX, y:posY}