libros =

widget: $ '#widget-libros'
input_title: $ '#libros-title'
input_author: $ '#libros-author'
input_search_fields: $ '#libros-title, #libros-author'
fieldset: $ '#widget-libros fieldset'
submit_button: $ '#widget-libros [type="submit"]'
reset_button: $ '#widget-libros [type="reset"]'
buttons: $ '#widget-libros [type="submit"], #widget-libros [type="reset"]'
results: $ '#libros-results'
template: $('#template-book').html()
no_results: $ "<a href='#' class='no-results'>No results</li>"
init: () ->
  # Init datepicker
  $('[data-toggle="datepicker"]').datepicker {
    autoHide: true
    zIndex: 2048
    format: 'yyyy-mm-dd'
  }
  # Reset event
  libros.reset_button.on 'click', () -> libros.results.html ''
  # Submit event
  libros.submit_button.on 'click', libros.submit_event
  libros.input_search_fields.keypress (e) -> if e.which == 13 then libros.submit_event e
  # Change event
  $('#widget-libros :input').change () -> libros.update_yml()
  # Book click event
  libros.results.on "click", "a", libros.book_event
  true
submit_event: (e) ->
  e.preventDefault()
  search_string = $.grep([
      libros.input_title.val().trim().replace /[\s,]/g, "+"
      libros.input_author.val().trim().replace /[\s,]/g, "+"
    ], Boolean).join '+'
  if search_string then libros.search search_string
  true
loading: (state) ->
  if state
    libros.results.html ''
    libros.fieldset.prop {disabled: true}
    libros.submit_button.data 'cache', libros.submit_button.text()
    libros.submit_button.text 'Loading'
  else
    libros.fieldset.prop {disabled: false}
    libros.submit_button.text libros.submit_button.data 'cache'
  true
book_event: (e) ->
  e.preventDefault()
  libros.results.html ''
  data = JSON.parse LZString.decompressFromBase64 $(e.currentTarget).data 'book'
  ['title', 'year', 'author', 'publisher', 'image_url'].map (field) ->
    $("#libros-#{field}").val data[field]
    true
    libros.update_yml()
  true
search: (string) ->
  libros.loading(1)
  $.getJSON "http://openlibrary.org/search.json?q=#{string}"
    .done (data) ->
      libros.loading(0)
      if data.docs.length == 0
        libros.results.append libros.no_results
      else
        $.each data.docs, libros.append_book
        if libros.results.is(':empty') then libros.results.append libros.no_results
      true
    .fail (xhr, status, err) ->
      libros.results.append $ "<a href='#' class='no-results'>#{status} #{err}</li>"
      true
  true
append_book: (i, item) ->
  # Parse book properties
  book = {
    title: item.title
    author: if item.author_name? then item.author_name.join ', ' else null
    image_url: if item.cover_edition_key?
        "http://covers.openlibrary.org/b/olid/#{item.cover_edition_key}-M.jpg"
      else null
    year: item.first_publish_year ?
      if item.publish_year? then item.publish_year[0] else item.publish_date ? null
    publisher: if item.publisher? then item.publisher[0] else ''
    olid: item.cover_edition_key ? item.edition_key ? null
  }
  # Append data to template
  if book.olid?
    result = $ '<a>', {
        'href': book.olid
        'data-book': LZString.compressToBase64 JSON.stringify book
        'html': $ libros.template
      }
    ['title', 'year', 'author', 'publisher'].map (field) ->
      result.find(".libros-#{field}").text book[field]
    if book.image_url
      result.find('.libros-image-container')
        .addClass 'col-2'
        .append $ '<img>', {
          src: book.image_url
          alt: book.title
        }
    # Append book to results
    libros.results.append result
  true
update_yml: () ->
  obj = {}
  for input in libros.widget.find '.form-control'
    key = $(input).attr('id').replace "libros-", ''
    if $(input).val() then obj[key] = $(input).val()
  # Update view
  libros.widget.find "#libros-yml"
    .html YAML.stringify [ obj ]

libros.init()