function addPageNumbers() {
 var recordsCountDiv = document.getElementById('RecordsCount');

 if (recordsCountDiv) {
  if (recordsCountDiv.innerText) {
   var recordsCount = parseInt(recordsCountDiv.innerText);
   var currentPageRowsSpan = getElementByClassName('SPAN','TapeDeckRecords')[0];
   if (currentPageRowsSpan) {
    // only if page navigation is not presented, meaning that this code hasn't been executed
    if (!document.getElementById('pageNavRow')) {
     // add the current page number
     var pageNumber = addCurrentPageNumber(currentPageRowsSpan, recordsCount);
     addPageNavigationLinks(pageNumber, recordsCount, currentPageRowsSpan);
     addPageNavigationTextBox(currentPageRowsSpan, pageNumber);
     fixAllPagesButton(recordsCount);
    }
   }
  }
 }

 setTimeout(addPageNumbers, 1000);
}

function getElementByClassName(tagName, className) {
 var tags = document.getElementsByTagName(tagName);
 var res = new Array();
 var count = 0;
 for (var i=0; i < tags.length; i++) {
  if (tags[i].className = className) {
   res[count] = tags[i];
   count++;
  }
 }
 return res;
}

function addCurrentPageNumber(currentPageRowsSpan, recordsCount) {
 var currentPageRowsText = currentPageRowsSpan.innerText; // exmaple: records 100-125
 var pageNumber;
 if (!isAllRecordsShown(currentPageRowsSpan)) {
  var lastRowNumber;
  if (isLastPageShown(currentPageRowsSpan)) { // last page is special case because (end) is written
   lastRowNumber = currentPageRowsText.substring(currentPageRowsText.indexOf(' - ') + ' - '.length, currentPageRowsText.indexOf('('));
   pageNumber = Math.ceil(lastRowNumber/25);
  }
  else {
   lastRowNumber = currentPageRowsText.substring(currentPageRowsText.indexOf(' - ') + ' - '.length);
   pageNumber = Math.floor(lastRowNumber/25);
  }
  currentPageRowsSpan.innerText += ' , Page ' + pageNumber + ' of ' + Math.ceil(recordsCount/25);
 }
 else { // all records shown
  pageNumber = -1;
 }
 return pageNumber;
}

function isAllRecordsShown(currentPageRowsSpan) {
 var img = currentPageRowsSpan.parentElement.firstChild;
 if (img.src.indexOf('tapedeckall') > 0)
  return true;
 else
  return false;
}

function isLastPageShown(currentPageRowsSpan) {
 var img = currentPageRowsSpan.parentElement.firstChild;
 if (img.src.indexOf('tapedecklast') > 0)
  return true;
 else
  return false;
}

function addPageNavigationLinks(pageNumber, recordsCount, currentPageRowsSpan) {
 var pageNavRow = document.createElement("TR");
 var tableViewId = getTableViewIdByRecordsCount(document.getElementById('RecordsCount'));
 var pageNavCell = document.createElement("TD");
 var link;
 var text;
 
 // loop and create the page numbers
 var numberOfPages = Math.ceil(recordsCount / 25);
 var head = pageNumber - 6; // page number to start with
 if (head < 0) head = 0;
 var tail = pageNumber + 5; // page number to end with
 if (tail > numberOfPages) tail = numberOfPages;
 for (i=head; i<tail; i++) {
  link = document.createElement("A");
  text = document.createTextNode('       ');
  if (i+1 != pageNumber) // if it's the current page, the link will be disabled
   link.href = 'javascript:goToReportPage(\'' + tableViewId + '\' ,' + i + ');';
  link.innerText = i+1;
  pageNavCell.appendChild(link);
  pageNavCell.appendChild(text);
 }
 
 pageNavRow.id = 'pageNavRow';
 pageNavRow.appendChild(pageNavCell);
 currentPageRowsSpan.parentElement.parentElement.parentElement.appendChild(pageNavRow);
}

// go to page inside the report, like clicking on next/prev page
function goToReportPage (sViewID, sStart) {
 var sViewIdToRefresh = saw.view.getRefreshStatePath(sViewID,"tableView");
 var tForm = GetViewForm(sViewID, sViewIdToRefresh);
 tForm.Action.value = "Scroll";
 tForm.StateAction.value = "samePageState";
 tForm.P5.value = sStart;
 submitViewForm(tForm,null);
}

function addPageNavigationTextBox(currentPageRowsSpan, currentPage) {
 var TR = document.createElement("TR");
 var txtBox = document.createElement("INPUT");
 txtBox.id = 'goToPageTextBox';
 txtBox.size = 5;
 var txtBoxLabel = document.createTextNode('Go to page: ');
 var TD = document.createElement("TD");
 TD.className = 'XUIPromptEntry';
 var SPAN = document.createElement("SPAN");
 SPAN.className = 'minibuttonOn';
 var link = document.createElement("A");
 link.href = 'javascript:goToReportPageByTextBox(' + currentPage + ');';
 link.innerText = 'Go';

 SPAN.appendChild(link);
 TD.appendChild(txtBoxLabel);
 TD.appendChild(txtBox);
 TD.appendChild(document.createTextNode('      '));
 TD.appendChild(SPAN);
 TR.appendChild(TD);
 currentPageRowsSpan.parentElement.parentElement.parentElement.appendChild(TR);
}

function goToReportPageByTextBox(currentPage) {
 var recordsCountDiv = document.getElementById('RecordsCount');
 var tableViewId = getTableViewIdByRecordsCount(recordsCountDiv);
 var txtBox = document.getElementById('goToPageTextBox');
 if (tryParseInt(txtBox)) {
  if (isValidPageNumber(txtBox.value,recordsCountDiv.innerText,currentPage)) {
   goToReportPage(tableViewId,parseInt(txtBox.value)-1);
  }
  else {
   alert('Not a valid number');
  }
 }
 else {
  alert('Not a valid number');
 }
}

function getTableViewIdByRecordsCount (recordsCountDiv) {
 return recordsCountDiv.parentElement.parentElement.parentElement.parentElement.parentElement.parentElement.parentElement.parentElement.parentElement.parentElement.id.replace('Result','') + '~v:compoundView!1~v:tableView!1';
}

function tryParseInt (txtBox) {
 if (txtBox)
  if (txtBox.value)
   if (txtBox.value.length > 0)
    if (!isNaN(txtBox.value))
     return true;
 return false;
}

function isValidPageNumber (pageNumber, recordsCount, currentPageNumber) {
 if (pageNumber > 0)
  if (pageNumber <= Math.ceil(recordsCount/25))
   if (pageNumber != currentPageNumber)
    return true;
 return false;
}

// will make that the button which brings all rows will go to the last page
function fixAllPagesButton (recordsCount) {
 var lastPageNumber = Math.ceil(recordsCount/25) - 1;
 var tableViewId = getTableViewIdByRecordsCount(document.getElementById('RecordsCount'));
 var navMap = document.getElementByTagName('MAP')[0];
 var allPagesButton = navMap.childNodes[navMap.childNodes.length - 1];
 allPagesButton.removeAttribute('title');
 allPagesButton.onclick = 'javascript:goToReportPage(\'' + tableViewId + '\' ,' + lastPageNumber + ');';
 allPagesButton.href = 'javascript:goToReportPage(\'' + tableViewId + '\' ,' + lastPageNumber + ');';
}
