
var nr = new NR();
$(document).ready(nr.init);

function NR() {
  var templateDom;
  var templateLoaded = false;
  var templateFunctions = [];
  
  this.init = init;
  function init() {
    cssSetupChildren('#page-nav > ul', 'li');
    setupFancyBox();
    setupPortfolioGrid();
  }
  
  function cssPseudoHover(el, cl) {
    el = $(el);
    if (typeof cl == 'undefined') cl = 'hover';
    el.hover(function() {
      $(this).addClass(cl);
    }, function() {
      $(this).removeClass(cl);
    });
  }
  
  function cssSetupChildren(selector, childFilter) {
    el = $(selector);
    el.find(childFilter + ':first-child').addClass('first');
    el.find(childFilter + ':last-child').addClass('last');
  }
  
  this.getTemplate = getTemplate;
  function getTemplate() {
    return templateDom;
  }
  
  this.loadTemplate = loadTemplate;
  function loadTemplate(url) {
    templateDom = $('<div>');
    templateDom.load(url, null, runTemplateFunctions);
  }
  
  this.onTemplateLoad = onTemplateLoad;
  function onTemplateLoad(func) {
    if (typeof func == 'function') {
      if (templateLoaded) {
        func();
      } else {
        templateFunctions.push(func);
      }
    }
  }
  
  this.parseDate = parseDate;
  function parseDate(str, pattern) {
    if (typeof pattern == 'undefined') pattern = /^(\d+)-(\d+)-(\d+)/g;
    var dateArr = String(str).match(pattern)[0].split('-');
    return dateFormat(dateArr[1] + '/' + dateArr[2] + '/' + dateArr[0], 'dd mmm yyyy');
  }
  
  this.parseTemplate = parseTemplate;
  function parseTemplate(template, vars) {
    return String(template).replace(/\$\b\w+\b/g, function(word) {
      var result = vars[word.substring(1)];
      if (typeof result != 'undefined') {
        if (result == null) return '';  // because NULL isn't type undefined but will product "null" on string conversion
        else return result;
      } else {
        return word;
      }
    });
  }
  
  this.runTemplateFunctions = runTemplateFunctions;
  function runTemplateFunctions() {
    templateLoaded = true;
    while (templateFunctions.length) {
      var func = templateFunctions.shift();
      func();
    }
  }
  
  function setupFancyBox() {
    var links = $('#post-thumbs a');
    if (links) {
      links.fancybox({
        zoomOpacity: true,
        overlayShow: false,
        zoomSpeedIn: 300,
        zoomSpeedOut: 300
      });
    }
  }
  
  function setupPortfolioGrid() {
    var grid = $('#portfolio-grid');
    if (grid.length) {
      var items = grid.find('div.grid-item');
      cssPseudoHover(items);
    }
  }
  
}
