Noosfero/noosfero

View on GitHub
plugins/orders/public/javascripts/toggle_edit.js

Summary

Maintainability
B
5 hrs
Test Coverage
if (typeof toggle_edit === 'undefined') {

toggle_edit = {

  _editing: jQuery(),
  _isInner: false,

  setEditing: function (value) {
    toggle_edit._editing = jQuery(value);
  },
  editing: function () {
    return toggle_edit._editing.first();
  },
  isEditing: function () {
    return toggle_edit.editing().first().hasClass('edit');
  },

  edit: function (value_row) {
    toggle_edit.setEditing(value_row);
    toggle_edit.value_row.toggle_edit();
  },

  toggle: function() {
    toggle_edit.editing().toggle();
  },
  hide: function() {
    toggle_edit.editing().hide();
  },

  target: {
    isToggle: function (target) {
      return (jQuery(target).hasClass('box-edit-link') && !toggle_edit.isEditing()) ||
        target.hasAttribute('toggle-edit') || jQuery(target).parents().attr('toggle-edit') != undefined;
    },
    isToggleIgnore: function (target) {
      return target.hasAttribute('toggle-ignore') || jQuery(target).parents().attr('toggle-ignore') != undefined;
    },
  },

  document_click: function(event) {
    if (toggle_edit.target.isToggleIgnore(event.target))
      return;

    var isToggle = toggle_edit.target.isToggle(event.target);
    var out = toggle_edit.value_row.locate(event.target).length == 0;
    if (!isToggle && out && toggle_edit.isEditing()) {
      toggle_edit.value_row.toggle_edit();
    }

    return true;
  },

  open_anchor: function () {
    try {
      el = jQuery(window.location.hash);
      toggle_edit.value_row.reload();
      if (el.hasClass('value-row')) {
        toggle_edit.setEditing(el);
        toggle_edit.value_row.toggle_edit();
      }
    } catch(e) {
      // catch invalid anchor errors to avoid break in document.ready event chain
    }
  },

  value_row: {

    locate: function (context) {
      return jQuery(context).hasClass('value-row') ? jQuery(context) : jQuery(context).parents('.value-row');
    },

    mouseenter: function () {
      if (jQuery(this).attr('without-hover') != undefined)
        return;
      jQuery(this).addClass('hover');
    },

    mouseleave: function () {
      if (jQuery(this).attr('without-hover') != undefined)
        return;
      jQuery(this).removeClass('hover');
    },

    click: function (event) {
      if (toggle_edit.target.isToggleIgnore(event.target))
        return true;

      var value_row = toggle_edit.value_row.locate(event.target);
      var now_isInner = value_row.length > 1;
      var isToggle = toggle_edit.target.isToggle(event.target);
      var isAnother = value_row.get(0) != toggle_edit.editing().get(0) || (now_isInner && !toggle_edit._isInner);
      if (now_isInner && !toggle_edit._isInner)
        toggle_edit.setEditing(value_row);
      toggle_edit._isInner = now_isInner;

      if (!isToggle && value_row.attr('without-click-edit') != undefined)
        return;

      if (isToggle) {
        if (isAnother)
          toggle_edit.value_row.toggle_edit();
        toggle_edit.edit(value_row);

        return false;
      } else if (isAnother || !toggle_edit.isEditing()) {
        if (toggle_edit.isEditing())
          toggle_edit.value_row.toggle_edit();
        toggle_edit.setEditing(value_row);
        if (!toggle_edit.isEditing())
          toggle_edit.value_row.toggle_edit();

        return false;
      }

      return true;
    },

    toggle_edit: function (toggle) {
      toggle_edit.editing().toggleClass('edit', toggle);
      eval(toggle_edit.editing().attr('toggle-edit'));
      if (!toggle_edit.isEditing()) {
        if (toggle_edit._editing.length > 1)
          toggle_edit.setEditing(jQuery(toggle_edit._editing[1]));
        else
          toggle_edit.setEditing(jQuery());
      }
    },
    reload: function () {
      toggle_edit.value_row.toggle_edit(true);
    },
  },
};

jQuery('.value-row').live('mouseenter', toggle_edit.value_row.mouseenter);
jQuery('.value-row').live('mouseleave', toggle_edit.value_row.mouseleave);
jQuery('.value-row').live('click', toggle_edit.value_row.click);
jQuery(document).click(toggle_edit.document_click);
jQuery(document).ready(toggle_edit.open_anchor);
jQuery(window).bind('hashchange', toggle_edit.open_anchor);

}