$(document).ready(function() {

  // Tab dropdowns
  $('.tabs li:has(ul)').each(function() {
    var thisA = $(this).find('> a');

    $(this).mouseenter(function() { $(this).toggleClass('hover'); thisA.toggleClass('drop-hover'); });
    $(this).mouseleave(function() { $(this).toggleClass('hover'); thisA.toggleClass('drop-hover'); });

    $(this).addClass('drop');
    thisA.addClass('drop');
  });

  /* Saved Searches
  ----------------------------------------*/

  /* Create saved search */
  save = $('#save-this-search');
  if (save) {
    var svLink = save.find('> a:not(.change)');
    var svForm = save.find('form');

    // Form setup
    svForm.submit(function(e) {
      e.preventDefault();

      // Submit: check name & POST
      var name = $(this).find('#searchName');
      if (validateName(name.val())) {
        $.post(svForm.attr('action'),
          $(this).serialize(),
          function(data) {
            if (data.status == 'OK') {
              $('#save-this-search .btn').remove();
              svForm.replaceWith($('<p class="success">' + data.msg + '</p>'));

              // Created a new search
              if (svLink.hasClass('create')) {
                savedLink = $('.tabs .drop ul li:first').clone();
                savedLink.find('a').
                  attr('href',
                    'searchRentals.php?sec=results' +
                    svForm.find('input[name="search[query]"]').val() +
                    '&searchID=' + data.results.id
                  ).text('» ' + name.val());

                if ($('.tabs .drop .end'))
                  savedLink.insertBefore('.tabs .drop .end').show();
                else
                  savedLink.appendTo('.tabs .drop ul');
              }
              else { // Edited a search
                // Turn off editing in search link
                var searchLink = $('.tabs a:first');
                searchLink.attr('href', searchLink.attr('href').replace('&edit=1', ''));

                // Update saved search menu w/ new link
                editedQuery = svForm.find('input[name="search[query]"]').val();
                editedID = svForm.find('input[name="search[id]"]').val();
                editedHref =  'searchRentals.php?sec=results' + editedQuery + '&searchID=' + editedID;
                $('.tabs .drop ul a[href$="searchID=' + editedID + '"]').attr('href', editedHref);
              }
            } else {
              if (data.msg != '')
                alert(data.msg);
              else if (data.errs.name != '')
                alert(data.errs.name);
              else
                alert('Sorry, there was an error. Please try again.');
            }
        });
      }
    });

    // Show form when create link clicked...
    if (svLink.hasClass('create')) {
      svLink.click(function(e) { e.preventDefault();
        $(this).fadeOut(250, function() { svForm.removeClass('hide').fadeIn(250); svForm.find('#searchName').focus(); });
      });
    }
    else { // ...Submit form when save changes (edit) link clicked
      svLink.click(function(e) { e.preventDefault();
        svLink.fadeOut(250, function() { svForm.submit(); });
      });
    }

    // Cancel
    svForm.find('a').click(function(e) { e.preventDefault();
      svForm.fadeOut(250, function() { svLink.fadeIn(250); });
    });
  }

  /* Search Management */
  searches = $('#saved-searches');
  if (searches) {

    // Rename: convert name to text field, add submit button & cancel link, hide
    var rnForm = $(' \
      <form class="inline" action="" method="post"> \
        <input name="search[id]" type="hidden" value="" /> \
        <input name="search[name]" type="text" class="lrg" value="" /> \
        <input type="submit" value="rename" /> \
        | <a href="#" class="cancel">cancel</a> \
      </form>');
    rnName = rnForm.find(':text');
    rnRenames = $('a.renames');

    searches.find('a.rename').click(function(e) {
      e.preventDefault();

      var link = $(this);
      var span = link.parent();
      var strong = span.siblings('strong');

      // Unbind all previous behaviors
      rnForm.unbind();

      // Hide name & action links, renames
      strong.fadeOut(250);
      rnRenames.fadeOut(250);
      span.fadeOut(250, function() {

        // Prepare, attach, and show form
        rnForm.find('input[type=hidden]').val(link.attr('href').match(/\d+$/));
        rnName.val(strong.text());

        rnForm.find('a').click(function(e) { // cancel link
          e.preventDefault();

          // Hide form
          rnForm.fadeOut(250, function() {
            // Restore name & actions
            strong.fadeIn(250);
            span.fadeIn(250);
            rnRenames.fadeIn(250);
          });

        });

        rnForm.bind('submit', function(e) { // form submission
          e.preventDefault();

          // Check name
          if (validateName(rnName.val())) {
            // Post
            $.post(link.attr('href'),
              $(this).serialize(),
              function(data) {
                if (data.status == 'OK') {
                  // Hide form
                  rnForm.fadeOut(250, function() {
                    // Store name change in page
                    $('.tabs .drop ul a:contains("' + strong.text() + '")').text('» ' + rnName.val());
                    strong.find('a').text(rnName.val());

                    // Update management list
                    updateSSMgmt();

                    // Restore name & actions
                    strong.fadeIn(250);
                    span.fadeIn(250);
                    rnRenames.fadeIn(250);
                  });
                } else {
                  alert(data.errs.name);
                }
            });
          }
        });

        rnForm.prependTo(strong.parent('li')).fadeIn(250);
        rnName.focus();
      });

    });

    // Delete
    searches.find('a.delete').click(function(e) {
      e.preventDefault();

      // Confirm, delete by AJAX, and remove from page
      var link = $(this);
      if (confirm('Are you sure you want to delete this search?')) {
        $.get(link.attr('href'), {}, function(data) {
          // remove w/ animation, update management list
          link.closest('li').effect(
            'highlight',
            {'color': '#ff0000'}, 250,
            function() {
              $('.tabs .drop ul li:contains("' + link.parent().siblings('strong').text() + '")').remove(); // remove tab link
              $(this).fadeOut(750).remove();

              updateSSMgmt();
            }
          );

        });
      }
    });
  }

});

// Update saved search management after changes: sort, re-zebra, go to intro
function updateSSMgmt() {
  // Create notice if all searches are deleted
  if (searches.find('li').length == 0) {
    searches.siblings('p').andSelf().remove();
    $('<p>You do not have any more saved searches.</p> \
    <p>You can try a new <a href="searchRentals.php">search for housing</a> or read about \
    <a href="searchRentals.php?sec=saved">using saved searches</a>.</p>').appendTo('.contentItem');
    return;
  }

  // Sort by name
  searches.find('li').tsort('strong');
  $('.tabs .drop ul li').tsort('a');

  // Re-apply zebra striping
  var oddEven = 0;
  searches.find('li').each(function() {
    if (oddEven++ % 2 == 0)
      $(this).removeClass('odd');
    else
      $(this).addClass('odd');
  });
}

// Validate name (not empty, <= 50)
function validateName(name) {
  if (name.length == 0) {
    alert('The name for a saved search cannot be blank. Please give the search a name.');
    return false;
  }
  if (name.length > 50) {
    alert('The name of a saved search can be no longer than 50 characters. (You typed ' + name.length + '.)');
    return false;
  }

  return true;
}
