var DS = {
  version: 1.0,
  author: "craigtmackenzie"
};

DS.Interface = {};
DS.Interface.WorkFilter = {
  View: {
    bindNavigationLinks: function() {
      $("#work-filter li a").each(function(i,link){
        $(link).bind("click.filter", function(e){
          e.preventDefault();
          DS.Interface.WorkFilter.Control.filterGrid(link);
        })
      })
    },
    
    bindAllLink: function() {
      $("#work-filter li a[rel=all]").unbind(".filter").bind("click", function(e){
        e.preventDefault();
        DS.Interface.WorkFilter.Control.resetGrid();
      })
      
    },
    
    reorderItemsBasedOn: function(items) {
      wraps = $(".work-item");
      $(wraps).each(function(i,wrap){
        if ($(wrap).children().length == 0){
          $(wrap).append(items[i])
        }
      })
    },
    
    hideEverythingBut: function(items) {
      ordered = DS.Interface.WorkFilter.Control.sortItems($(".work-item .content").not(items))
      ordered.each(function(i,item){
        $(item).fadeTo(600, 0, function(){
          $(item).appendTo(".dead-sea")
        });
      });      
    },
    
    revealTaggedItems: function(items) {
      $(items).each(function(i,item){
        $(item).fadeTo(600, 1);
      })
    },
    
    createDeadSea: function() {
      $(".work-grid").append("<div class='dead-sea'></div>");
    },
    
    reorderAndRevealItems: function(items) {
      setTimeout(function(){
        DS.Interface.WorkFilter.View.reorderItemsBasedOn(items);
      }, 800);
      
      
      setTimeout(function(){
        DS.Interface.WorkFilter.View.revealTaggedItems(items);
      }, 850);
    }
  },
  
  Control: {
    filterGrid: function(link) {
      items = DS.Interface.WorkFilter.Control.findItemsWithTag($(link).attr("rel"));
      DS.Interface.WorkFilter.View.hideEverythingBut(items);
      DS.Interface.WorkFilter.View.reorderAndRevealItems(items);
    },
    
    resetGrid: function() {
      items = this.sortItems($(".work-grid .content"));
      
      items.each(function(i,item){
        $(item).fadeTo(600, 0, function(){
          $(item).appendTo(".dead-sea")
        });
      });
      
      setTimeout(function(){
        DS.Interface.WorkFilter.View.reorderItemsBasedOn(items);
      }, 800);
      
      
      setTimeout(function(){
        DS.Interface.WorkFilter.View.revealTaggedItems(items);
      }, 850);
      
    },
    
    findItemsWithTag: function(tag) {
      items = [];
      $(".work-grid .content").each(function(i,item){
        if (DS.Interface.WorkFilter.Control.checkItemForTag(item, tag)) items.push(item);
      })
      return items;
    },
    
    checkItemForTag: function(item, tag) {
      tags = $(item).attr("rel").split(" ");
      for (var i = tags.length - 1; i >= 0; i--){
        if (tags[i] == tag) return true;
      };
      return false
    },
    
    setItemsOriginalPosition: function() {
      $(".work-grid .content").each(function(i,item){
        $(item).data("position", i);
      })
    },
    
    sortItems: function(items) {
      return items.sort(this.sortFunction);
    },
    
    sortFunction: function(a,b) {
      a = parseInt($(a).data("position"));
      b = parseInt($(b).data("position"));
      if (a==b) return 0;
      return ((a < b) ? -1 : 1);
    }
  },
  
  init: function (){
    this.Control.setItemsOriginalPosition();
    this.View.bindNavigationLinks();
    this.View.bindAllLink();
    this.View.createDeadSea();
  }
}

DS.Interface.RelatedToolTip = {
  View: {    
    findAndBindRelatedLinks: function() {
      $(".related a").each(function(i,link){
        $(link).hover(function(e){
          e.preventDefault();
          DS.Interface.RelatedToolTip.View.createToolTip($(link).attr("title"),e);
        },
        function(e){
          DS.Interface.RelatedToolTip.View.destroyToolTip();
        })
      })
    },
    
    createToolTip: function(label,e) {
      $("body").append("<p class='tool-tip'>"+label+"</p>")
      $().mousemove(function(e){
         $(".tool-tip").css("top", e.pageY+15).css("left", e.pageX+15);
      });
    },
    
    destroyToolTip: function() {
      $(".tool-tip").remove();
    }
  },
  
  init: function() {
    this.View.findAndBindRelatedLinks();
  }
}

DS.App = {
  init: function() {
   DS.Interface.WorkFilter.init();
   DS.Interface.RelatedToolTip.init();
  }
};

$(document).ready(function(){
  $("body").addClass("js")
  DS.App.init();
});