/**
  JS for cause stream items manipulation.
  2009-10-14 / <brad@causes.com>
**/
if (typeof (Causes) === 'undefined') Causes = {};
if (typeof (Causes.CauseStream) === 'undefined') Causes.CauseStream = {};

Causes.CauseStream.Moderation = (function () {

  var bHoveringOverMenu = false;

  // *-* public methods *-*

  function setup() {
    var jqOptionsEls = $("#cause_stream_content div.stream_event_controls");

    jqOptionsEls.find('li').click(eventOptionItemClicked);
    jqOptionsEls.click(eventOptionsClicked);
    jqOptionsEls.find('ul').mouseenter(eventOptionsMenuMouseEnter);
    jqOptionsEls.mouseleave(eventOptionsMouseLeft);
  }

  // *-* utility methods *-*

  function actionBanUser(el) {
    var id = idForItem(el);
    var urlBan = '/stream/'+ id +'/ban';
    $.post(urlBan, {}, eventBanRequestComplete, 'json');
  }

  function actionRemoveItem(el) {
    var id = idForItem(el);
    var urlDelete = '/stream/'+ id;
    $.post(urlDelete, {'_method': 'delete'});
    $(el).slideUp();
  }

  function actionReportItem(el) {
    var id = idForItem(el);
    var urlReport = '/stream/'+ id +'/report';
    top.location.href = urlReport;
  }

  // elParent: the div.stream_event in question
  function displayOptionsMenu(elParent, bDisplay) {
    var meth = bDisplay === undefined ? 'toggle' : (bDisplay ? 'show' : 'hide');
    $(elParent).find('ul')[meth]();

    var methClass = ($(elParent).find('ul:visible').length === 0) ?
                      'removeClass' : 'addClass';
    $(elParent).find('ul').parents('.stream_event_controls')[methClass]('on');
  }

  function idForItem(el) {
    return (/stream_event_(\d+)/.exec(el.id)[1]);
  }

  function streamItemActionFor(el, sClass, elChild) {
    if (!el) return;
    switch (sClass) {
      case 'ban':
        if (confirm("Permanently ban this user from your cause?")) {
          actionBanUser(el);
        }
        break;

      case 'remove':
        if (confirm("Permanently remove this item?")) {
          actionRemoveItem(el);
        }
        break;

      case 'report':
        actionReportItem(el);
        break;
    }
    displayOptionsMenu(elChild, false);
  }

  // *-* event methods *-*

  function eventBanRequestComplete(data) {
    if (data && data.stream_event_ids && data.stream_event_ids.length) {
      $.each(data.stream_event_ids, function (ix, id) {
        $("#stream_event_" + id).slideUp();
      });
    }
  }

  function eventOptionItemClicked(evt) {
    var sClass = /(ban|remove|report)/.exec(this.className)[1];
    streamItemActionFor($(this).parents('.stream_event').get(0), sClass, this);
  }

  function eventOptionsClicked(evt) {
    displayOptionsMenu(this);
  }

  function eventOptionsMenuMouseEnter(evt) {
    bHoveringOverMenu = true;
  }

  function eventOptionsMouseLeft(evt) {
    var elMenu = this;
    bHoveringOverMenu = false;
    setTimeout(function () {
      if (!bHoveringOverMenu) {
        displayOptionsMenu(elMenu, false);
      }
    }, 150);
  }

  // expose public methods
  return {
    setup: setup
  };
})();

$(document).ready(Causes.CauseStream.Moderation.setup);
