/*
	Copyright James Matteson 2011. All rights reserved.
*/
var storyFetcher = new function(){
   var oThis = this;
   var myCallbacks = new callbackManager();
   var myStoryCreator;
   var lastRowID = -1;
   var currentDiggParams = null;
   var isReadSection = false;
   var isDismissedSection = false;
   
   // fetching
   var STORY_RENDER_DELAY = 20;
   var storiesToRender = [];
   var hasMore = false;
   var fetchingMore = false;
   
   /* init */
   document.observe('site:init', function(){
      myStoryCreator = new storyCreator($('stories'));
      
      // reload queue
      dataLayer.getQueue().each(function(storyIDs){
         myDigg.fetchStories('cbQueue', storyIDs);
      });
   });
   
   /* private */
   function beginSearch(){
      myUI.loading(true);
      return myCallbacks.createCallback(currentDiggParams.section);
   }
   function renderStory(){
      if (storiesToRender.length > 0){
         story = storiesToRender[0];
         story.domain = utils.parseDomain(story.link);

         // read and dismissed sections don't need to be checked if they can display
         if (isReadSection || isDismissedSection || dataLayer.canDisplay(story.id, story.domain)) {
            // if we're in the read or dismissed section - you can only add the story, not dismiss it
            myStoryCreator.createStory(story, (isReadSection || isDismissedSection));
            dataLayer.addCloud(story);
         }
         
         storiesToRender.splice(0, 1);
         $('main').scrollTop = $('main').scrollTop; // make sure the scrollbar resizes as we add stories
         setTimeout(renderStory, STORY_RENDER_DELAY);
      }else{
         myUI.loading(false);
         fetchingMore = false;
         document.fire('stories:checkForMore');
      }
   }
   function fetchRead(){
      var results = dataLayer.getRead(lastRowID);
      lastRowID = results.lastRowID; 
      if (results.storyIDs.length > 0) myDigg.fetchStories(beginSearch(), results.storyIDs);
   }
   function fetchDismissed(){
      var results = dataLayer.getDismissed(lastRowID);
      lastRowID = results.lastRowID;
      if (results.storyIDs.length > 0) myDigg.fetchStories(beginSearch(), results.storyIDs);
   }
   
   /* public */
   this.search = function(diggParams){
      currentDiggParams = diggParams;
      storiesToRender = []; // don't render any stories from our render queue
      dataLayer.clearCloud();
      lastRowID = -1;
      fetchingMore = true;
      myUI.clearStories();
      isReadSection = false;
      isDismissedSection = false;
      
      if (diggParams.section == 'read'){
         isReadSection = true;
         fetchRead();
      }else if (diggParams.section == 'dismissed'){
         isDismissedSection = true;
         fetchDismissed();
      }else{         
         if (diggParams.section.length > 0 || diggParams.domain.length > 0){
            myDigg.fetch(beginSearch(), diggParams);
         }
      }
   }
   this.searchMore = function(diggParams){
      currentDiggParams = diggParams;
      
      if (!fetchingMore && hasMore){
         fetchingMore = true;
         
         if (diggParams.section == 'read'){
            fetchRead();
         }else if (diggParams.section == 'dismissed'){
            fetchDismissed();
         }else{
            if (diggParams.section.length > 0 || diggParams.domain.length > 0){
               myDigg.fetchMore(beginSearch(), diggParams);
            }
         }
      }
   }
   
   /* callbacks */
   this.cbQueue = function(root){
      if (root.count > 0){
         root.stories.each(function(story){
            myStories.addStory(story);
         });
      }
   }
   this.cbDigg = function(root, i, section) {
      // make sure we're on the most recent callback and the section hasn't changed
      if (myCallbacks.getCallbackIndex() != i || currentDiggParams.section != section){
         myUI.loading(false);
         return;
      }
      
      // load stories
      if (root.count == 0 || root.stories === undefined){
         hasMore = false;
         storiesToRender = [];
      }else{
         hasMore = true; 
         storiesToRender = root.stories;
      }
      
      renderStory();
   }
}

/* callbacks */
function callbackManager(callbackName){
   var callbackIndex = 0;
   
   this.createCallback = function(section){
      var fnName = 'cbDigg' + ++callbackIndex;
      var callbackName = 'storyFetcher.cbDigg';
            
      utils.attachScriptCallback(fnName, callbackName, callbackIndex, section);
      
      return fnName;
   }
   this.getCallbackIndex = function(){ return callbackIndex; }
}
function cbQueue(root){
   storyFetcher.cbQueue(root);
}
