var Templates = {
  cache: {},

  _render: function(name, data) {
    if (!Templates.cache[name]) {
      Templates.cache[name] = _.template($('#' + name).html());
    }

    return Templates.cache[name](data);
  },

  render: function(name, data, target) {
    $(target).html(this._render(name, data));
  },

  append: function(name, data, target) {
    $(this._render(name, data)).appendTo(target);
  }

};

function renderItems(items, replace) {
  if (replace) {
    Templates.render('template-main-items', {items: items}, '#main_items_list');
  } else {
    Templates.append('template-main-items', {items: items}, '#main_items_list');
  }
}

var newsQueue = [], 
    newsSkip = 10,
    newsRequestPending = false,
    autoLoadSkipThreshold = 40;
    
function now() {
  return Math.round(new Date() / 1000);
}
    
function calc_bumped_stamp(stamp, bump) {
  if (bump == 0) {
    return stamp;
  }
  
  // ignore bump value if item is older than 5 days
  var d = (now() - stamp)/86400;
  if (d >= 5) {
    return stamp;
  }
  
  var f =  Math.log((5.0-d)*10/5) / Math.log(10); 
  if (f < 0) {
    return stamp;
  }
  return stamp + f * bump * 86400;
}

function snip(text, limit) {
  var snipped = text.split(" ").slice(0,limit).join(" ") + '...';
  return snipped;
}

function transformItem(item, idx) {
  var snippet = item.article_snippet;
  
  item.article_snippet = snip(snippet, 50);
  item.article_snip_snip = snip(snippet, 17);

  item.bump_stamp = calc_bumped_stamp(item.stamp, item.bump || 0);
  item.dir = item.ltr ? "ltr" : "rtl";
  item.clicked = localStorage && localStorage["click" + item._id] == "true";

  if (item.site_name && item.site_url) {
    item.source_markup = "<span class=\"author\">" + item.author + 
      "</span>, <a href=\"" + encodeURIComponent(item.site_url) + 
      "\" target=\"_blank\">" + item.site_name + "</a>";
    
  } else if (item.site_url) {
    item.source_markup = "<a href=\"" + encodeURIComponent(item.site_url) + 
      "\" target=\"_blank\" class=\"author\">" + item.author + "</a>";
  } else {
    item.source_markup = "<span class=\"author\">" + item.author + "</span>";
  }
  item.target = (item.site_url && item.site_url.match(/tav-et\.com/)) ? "" : "target=\"_blank\"";
  
  item.level = (idx == 0) ? 4 : ((idx < 5) ? 3 : ((idx < 10) ? 2 : 1));
  
  var d = new Date(item.stamp * 1000);
  item.short_date = "" + d.getDate() + "/" + (d.getMonth() + 1);
  item.weekday = ["ראשון", "שני", "שלישי", "רביעי", "חמישי", "שישי", "שבת"][d.getDay()];

  return item;
}

var categoryRefs = {
  '/': 'music',
  '/music': 'music',
  '/dance': 'dance'
};

var pageCategory = categoryRefs[location.pathname] || 'music'; // by default

function addItemsToQueue(items, skip) {
  for (var i = 0; i < items.length; i++) {
    var item = items[i];
    if (item && !$('#' + item._id)[0] && (!item.category || (item.category == pageCategory))) {
      transformItem(item, skip + i);
      newsQueue.push(item);
    }
  }
}

function loadNextNewsBatch(skip) {
  newsRequestPending = true;
  newsSkip = skip;
  $('#spinner').show();
  $.db.news(function(items) {
    $('#spinner').hide();
    newsRequestPending = false;
    if (skip == 0) {
      for (var i = 0; i < items.length; i++) {
        transformItem(items[i], i);
      }
      if (localStorage) {
        localStorage.topItems = JSON.stringify(items);
      }
      renderItems(items, true);
    } else {
      addItemsToQueue(items, skip);
    }
    if (skip < autoLoadSkipThreshold) {
      setTimeout(function() { loadNextNewsBatch(skip + 10); }, 0);
    }
  }, {limit: 10, skip: skip});
}

function checkScrollPosition() {
  if($(window).scrollTop() + $(window).height() > $(document).height() - 300) {
    if (newsQueue.length > 0) {
      for (var i = 0; (i < 5) && (newsQueue.length > 0); i++) {
        var item = newsQueue.shift();
        renderItems([item]);
      }
    } else if ((newsSkip >= autoLoadSkipThreshold) && !newsRequestPending) {
      loadNextNewsBatch(newsSkip + 10);
    }
  }
}

function markClickedItems(items) {
  _.each(items, function(i) {
    i.clicked = localStorage["click" + i._id] == "true";
  });
}

function markClickedTopItems() {
  if (!localStorage) {
    return;
  }
  $('.item').each(function() {
    id = this.id;
    if (localStorage["click" + id] == "true") {
      $(this).removeClass('unclicked').addClass('clicked');
    }
  });
}

$(function() {
  markClickedTopItems();
  // if (localStorage && localStorage.topItems) {
  //   setTimeout(function() {
  //     var items = JSON.parse(localStorage.topItems);
  //     markClickedItems(items);
  //     renderItems(items, true);
  //   }, 0);
  // }
  // 
  setTimeout(function() { loadNextNewsBatch(10); }, 0);
  
  setInterval(checkScrollPosition, 250);
  
  $('a.item_link').live('click', function() {
    var item = $(this).parents('.item')[0];
    var id = item.id;
    if (localStorage) {
      localStorage["click" + id] = "true";
    }
    $(item).removeClass('unclicked').addClass('clicked');
    // return false;
  });
});

