// navigator
var templateCache = new Array();
var loadedModules = new Array();

function applyTemplate(templateName, parameters) {
  if (templateCache[templateName] == null) {
    templateCache[templateName] = document.getElementById(templateName).firstChild.nodeValue;
  }                                       
  var output = templateCache[templateName];
  if (parameters) {
    for (name in parameters) {
      output = output.replace(new RegExp('%' + name + '%', 'g'), parameters[name]);
    }
  }
  return output;
}

function getObject(object) {
  var instance = null;
  if (typeof object.instance == 'object') {
    instance = object.instance;
  } else if (typeof object == 'object') {
    instance = object;
  } else if (typeof object == 'string') {
    instance = document.getElementById(object);
  }
  return instance;
}

function getOffsetLeft(object) {
  
  var instance = getObject(object);
  var left = 0; 

  while (instance.offsetParent) {
    left += instance.offsetLeft;
    instance = instance.offsetParent;
  }
  return left;  
}

function getOffsetTop(object) {
  
  var instance = getObject(object);
  var top = 0; 

  while (instance.offsetParent) {
    top += instance.offsetTop;
    instance = instance.offsetParent;
  }
  return top;  
}

function bmPageNavigator(container, parameters) {

  this.container = getObject(container);
  this.boundNavigators = new Array();
  if (!document.getElementById(parameters)) {
    return;
  }
  eval(document.getElementById(parameters).firstChild.nodeValue);
  
  var sender = this;
  
  this.changePageSet = function(direction, recursive) {
    switch (direction) {
      case 1:
        sender.pagesFrom = 1;
      break;
      case 2:
        sender.pagesFrom = sender.pagesFrom - sender.pagesPerSet;
      break;
      case 3:
        sender.pagesFrom = sender.pagesFrom + sender.pagesPerSet;
      break;
      case 4:
        sender.pagesFrom = Math.floor(sender.pageCount / sender.pagesPerSet) * sender.pagesPerSet + 1;
      break;
      case 5:
      break;
    }
    if (sender.pagesFrom < 1) {
      sender.pagesFrom = 1;
    }
    sender.pagesTo = sender.pagesFrom + sender.pagesPerSet - 1;
    if (sender.pagesTo > sender.pageCount) {
      sender.pagesTo = sender.pageCount;
    }
    sender.draw();
    if (recursive) {
      for (i in sender.boundNavigators) {
        sender.boundNavigators[i].changePageSet(direction, false); 
      }
    }
    return false;
  }
  
  this.validate = function() {
  
  }
  
  this.draw = function() {
    var start = (sender.pagesFrom == 1) ? '' : applyTemplate(sender.tStart, {'name' : sender.container.id});
    var previousLink = (sender.pagesFrom == 1) ? '' : applyTemplate(sender.tPreviousSet, {'name' : sender.container.id});
    var end = (sender.pagesTo == sender.pageCount) ? '' : applyTemplate(sender.tEnd, {'name' : sender.container.id});
    var nextLink = (sender.pagesTo == sender.pageCount) ? '' : applyTemplate(sender.tNextSet, {'name' : sender.container.id});
    var i;
    var pageLinks = new Array();
    for (i = sender.pagesFrom; i <= sender.pagesTo; ++i) {
      if (i == sender.currentPage) {
        pageLinks[i] = applyTemplate(sender.tCurrentPage, {'pageNumber' : i, 'pageCount' : sender.pageCount});
      } else {
        pageLinks[i] = applyTemplate(sender.tPage, {'pageNumber' : i, 'pageCount' : sender.pageCount});
      }
    }
    sender.container.innerHTML = start + previousLink + pageLinks.join(' ') + nextLink + end;
  }

}

bmPageNavigator.prototype.pagesFrom = 0;
bmPageNavigator.prototype.pagesTo = 0;
bmPageNavigator.prototype.pagesPerSet = 0;
bmPageNavigator.prototype.pageCount = 0;
bmPageNavigator.prototype.currentPage = 0;
bmPageNavigator.prototype.container = null;
bmPageNavigator.prototype.tPreviousSet = '';
bmPageNavigator.prototype.tStart = '';
bmPageNavigator.prototype.tNextSet = '';
bmPageNavigator.prototype.tEnd = '';
bmPageNavigator.prototype.tCurrentPage = '';
bmPageNavigator.prototype.tPage = '';
bmPageNavigator.boundNavigator = null;

bmPageNavigator.prototype.bindWith = function(element) {
  this.boundNavigators[element.container.id] = element;
  element.boundNavigators[this.container.id] = this;
}

var topNavigator = null;
var bottomNavigator = null;
