$.extend(Array.prototype, {
  flatten : function() {
    return Functional.reduce('a.concat(b)', [], this)
  },
  uniq: function() {
    return Functional.reduce(function(array, value) {
      return array.include(value) ? array : array.concat([value])
    }, [], this);
  },
  include : function(val) {
    return this.indexOf(val) >= 0
  }
})

jQuery.tags = {
  object : function(e) {
    return jQuery(e).find('.tags')
  },
  get : function (e) {
    return jQuery.tags.object(e).attr('class').split(' ').filter(function(t) { return t != "tags" })
  },
  has : function (e, tag) {
    return jQuery.tags.object(e).hasClass(tag) 
  }
}

jQuery.P = {
  default_query : '.project',
  load_projects : function(query) {
    query = query || jQuery.P.default_query
    jQuery.P.projects = $(query)
  },
  tagged : function(tag) {
    var tag = tag == 'all' ? 'tags' : tag
    var ps = Functional.select(function(p) {
      return $.tags.has(p, tag)
    }, jQuery.P.projects || $(jQuery.P.default_query))
    return $(ps)
  }
}

nav = {
  show_only : function(tag) {
    $.P.projects.fadeOut(10)
    $.P.tagged(tag).fadeIn(300)
  },
  show_all : function(tag) {
    $.P.projects.fadeOut(10)
    $.P.projects.fadeIn(300)
  },
  make_button : function(name, fn) {
    return $('<a href="" class="tagbutton">')
      .text(name)
      .attr('title', name)
      .addClass(name)
      .click(function (event) {
         event.preventDefault();
         nav.select_button($(this))
         fn()
      })
      .wrap("<li></li>")
  },
  select_button : function(b) {
    $.cookie('tag', b.text(), { expires: 7 });
    $('.tagbutton').removeClass('here')
    b.addClass('here')
  },
  find_button : function(name) {
    return $('#nav ul .' + name)
  },
  build : function() {
    var all_button = nav.make_button('all', function() {nav.show_all()})
    var buttons = Functional.map(function (t) {
      return nav.make_button(t, function() {nav.show_only(t)})
    }, $.tags.all)
    var buttons = $([all_button].concat(buttons))
    buttons.each(function() {
      $('#nav ul').append(this)
      $(this).wrap("<li></li>")
    })
  },
  start : function() {
    var name = $.cookie('tag') || 'all'
    nav.build(name)
    $.P.projects.hide()
    nav.select_button(nav.find_button(name))
    $.P.tagged(name).show()
  }
}

$(function () {
  console.log("Javascript loaded!")
  
  $.P.load_projects('.project')
  $.tags.all = Functional.map('$.tags.get(_)', $.P.projects).flatten().uniq()
  nav.start()
})
