includes/clientside/sbedit.js
author Dan
Wed, 08 Jul 2009 18:51:19 -0400
changeset 1042 13ad9c1cb7d4
parent 1039 4226cedb3bc4
child 1274 673a1b6712fa
permissions -rw-r--r--
Namespace_Default::bake_cdata() now guesses values for anything missing

var sbedit_load = function()
  {
    if ( !window.jQuery )
    {
      load_component(['jquery', 'jquery-ui']);
      // this seems to be the only way to make the sortables init properly
      // FIXME find out what we're waiting for here, and wait on it the right way
      window.setTimeout(sbedit_load, 200);
      return true;
    }
    $('.sbedit-column').sortable({
      handle: '.sbedit-handle',
      connectWith: '.sbedit-column',
      stop: function()
      {
        ajaxUpdateSidebarOrder();
      }
    });
  };
  
addOnloadHook(sbedit_load);

function serialize_sidebar()
{
  var columns = {};
  var i = 0;
  try
  {
    $('.sbedit-column').each(function(i, e)
      {
        // console.debug(e, ' TOARRAY: ', $(e).sortable('toArray'));
        var arr = $(e).sortable('toArray');
        if ( !arr )
        {
          console.error('Retrieving order failed!');
          throw new Exception();
        }
          
        for ( var j = 0; j < arr.length; j++ )
          arr[j] = parseInt(arr[j].replace(/^block:/, ''));
        
        i++;
        columns[i] = arr;
      });
  }
  catch ( e )
  {
    return false;
  }
  return toJSONString(columns);
}

function sbedit_open_editor(a)
{
  if ( auth_level < USER_LEVEL_ADMIN )
  {
    load_component('login');
    ajaxDynamicReauth(function(sid)
      {
        sbedit_open_editor(a);
      }, USER_LEVEL_ADMIN);
    return false;
  }
  load_component(['fadefilter', 'l10n']);
  var shade = darken(true, 50, 'sbedit-shade');
  $(shade).css('z-index', 0);
  var parent = sbedit_get_parent(a);
  var offset = $(parent).offset();
  var top = (( getHeight() ) / 2) - 200 + getScrollOffset();
  var box = $(parent)
    .clone()
    .empty()
    .attr('id', 'sb_blockedit')
    .addClass('sbedit-float')
    .css('height', $(parent).height())
    .css('top', offset.top)
    .css('left', offset.left)
    .appendTo('body');
  var item_id = parseInt($(parent).attr('id').replace(/^block:/, ''));
  
  $(box)
    .animate({ width: 500, height: 400, top: top, left: (getWidth() / 2) - 250 }, 400, function()
      {
        var whitey = whiteOutElement(this);
        $(this).append('<textarea style="width: 98%; height: 360px; margin: 0 auto; display: block;" rows="20" cols="80"></textarea>');
        $(this).append('<p style="text-align: center;"><a href="#" onclick="sbedit_edit_save(this); return false;">' + $lang.get('etc_save_changes') + '</a> | <a href="#" onclick="sbedit_edit_cancel(this); return false;">' + $lang.get('etc_cancel') + '</a></p>');
        $.get(makeUrlNS('Special', 'EditSidebar', 'action=getsource&noheaders&id=' + item_id), {}, function(response, statustext)
          {
            $('textarea', box).val(response);
            $(whitey).remove();
            
            $(box).attr('enano:item_id', item_id);
          }, 'html');
      })
    .get(0);
}

function sbedit_edit_save(a)
{
  var box = a.parentNode.parentNode;
  var parent = document.getElementById('block:' + $(box).attr('enano:item_id'));
  var whitey = whiteOutElement(box);
  $.post(makeUrlNS('Special', 'EditSidebar', 'noheaders&action=save&id=' + $(box).attr('enano:item_id')), { content: $('textarea', box).attr('value') }, function(response, statustext)
    {
      whiteOutReportSuccess(whitey);
      setTimeout(function()
        {
          sbedit_close_editor(parent, box);
        }, 1250);
    }, 'html');
}

function sbedit_edit_cancel(a)
{
  var box = a.parentNode.parentNode;
  var parent = document.getElementById('block:' + $(box).attr('enano:item_id'));
  
  sbedit_close_editor(parent, box);
}

function sbedit_close_editor(parent, box)
{
  if ( !parent )
  {
    console.warn('Failed to get DOM object for parent, skipping transition effect');
  }
  
  if ( jQuery.fx.off || !parent )
  {
    enlighten(true, 'sbedit-shade');
    $('body').get(0).removeChild(box);
    return true;
  }
  
  var offset = $(parent).offset();
  $(box).empty().animate(
    {
      width:  $(parent).width(),
      height: $(parent).height(),
      top:    offset.top,
      left:   offset.left,
    }, 400, function()
    {
      $(this).css('background-color', '#f70').fadeOut(1000, function() { $(this).remove(); });
      enlighten(true, 'sbedit-shade');
    });
}

function sbedit_delete_block(a)
{
  var parent = sbedit_get_parent(a);
  load_component(['messagebox', 'fadefilter', 'flyin', 'l10n']);
  var mp = miniPromptMessage({
      title: $lang.get('sbedit_msg_delete_confirm_title'),
      message: $lang.get('sbedit_msg_delete_confirm_body'),
      buttons: [
        {
          text: $lang.get('sbedit_btn_delete_confirm'),
          color: 'red',
          onclick: function()
          {
            var mp = miniPromptGetParent(this);
            sbedit_delete_block_s2(mp.target_block);
            miniPromptDestroy(this);
            return false;
          },
          style: {
            fontWeight: 'bold'
          }
        },
        {
          text: $lang.get('etc_cancel'),
          onclick: function()
          {
            miniPromptDestroy(this);
            return false;
          }
        }
      ]
    });
  mp.target_block = parent;
}

function sbedit_delete_block_s2(box)
{
  var parent = box;
  var id = parseInt($(parent).attr('id').replace(/^block:/, ''));
  var whitey = whiteOutElement(parent);
  
  $.get(makeUrlNS('Special', 'EditSidebar', 'action=delete&ajax=true&noheaders&id=' + id), function(response, statustext)
    {
      if ( response == 'GOOD' )
      {
        whiteOutReportSuccess(whitey);
        setTimeout(function()
          {
            $(parent)
            .hide('blind', { duration: 500 }, function()
              {
                $(this).remove();
                ajaxUpdateSidebarOrder();
              });
          }, 1250);
      }
      else
      {
        whiteOutReportFailure(whitey);
        alert(response);
      }
    }, 'html');
}

function sbedit_rename_block(a)
{
  var parent = sbedit_get_parent(a);
  $('div.sbedit-handle > span', parent).hide();
  var input = $('div.sbedit-handle > input', parent).show().focus().select().keyup(function(e)
    {
      switch(e.keyCode)
      {
        case 13:
          // enter
          var whitey = whiteOutElement(this.parentNode);
          var me = this;
          var id = parseInt($(parent).attr('id').replace(/^block:/, ''));
          $.post(makeUrlNS('Special', 'EditSidebar', 'ajax&noheaders&action=rename&id='+id), { newname: $(this).attr('value') }, function(response, statustext)
            {
              if ( response == 'GOOD' )
              {
                whiteOutReportSuccess(whitey);
                setTimeout(function()
                  {
                    $(me).hide();
                    $('span', me.parentNode).show().text(me.value);
                  }, 1250);
              }
              else
              {
                alert(response);
                whiteOutReportFailure(whitey);
              }
            }, 'html');
          break;
        case 27:
          // escape
          this.value = this.origvalue;
          $(this).hide();
          $('span', this.parentNode).show();
          break;
      }
    }).get(0);
  input.origvalue = input.value;
}

function sbedit_disenable_block(a)
{
  var parent = sbedit_get_parent(a);
  var whitey = whiteOutElement(parent);
  $.get(makeUrlNS('Special', 'EditSidebar', 'action=disenable&ajax=true&noheaders&id=' + parseInt($(parent).attr('id').replace(/^block:/, ''))), {}, function(response, statustext)
    {
      if ( response == 'GOOD' )
      {
        whiteOutReportSuccess(whitey);
        $(parent).toggleClass('disabled');
      }
      else
      {
        whiteOutReportFailure(whitey);
        alert(response);
      }
    }, 'html');
}

function sbedit_get_parent(a)
{
  var o = a.parentNode;
  while ( !$(o).hasClass('sbedit-block') )
    o = o.parentNode;
  
  return o;
}

function ajaxUpdateSidebarOrder()
{
  setAjaxLoading();
  var ser = serialize_sidebar();
  if ( !ser )
  {
    var msg = document.createElement('div');
    $(msg)
      .addClass('error-box-mini')
      .text('jQuery failure: returned invalid serialized sidebar data')
      .css('position', 'fixed')
      .css('bottom', 1)
      .appendTo('body')
      .css('left', ( getWidth() / 2 ) - ( $(msg).width() / 2 ));
    setTimeout(function()
      {
        $(msg).fadeOut(500, function() { $(this).remove(); });
      }, 1000);
    unsetAjaxLoading();
    return false;
  }
  $.post(makeUrlNS('Special', 'EditSidebar', 'update_order'), { order: ser }, function(response, statustext)
    {
      var msg = document.createElement('div');
      $(msg)
        .addClass('info-box-mini')
        .text($lang.get('sbedit_msg_order_saved'))
        .css('position', 'fixed')
        .css('bottom', 1)
        .appendTo('body')
        .css('left', ( getWidth() / 2 ) - ( $(msg).width() / 2 ));
      setTimeout(function()
        {
          $(msg).fadeOut(500, function() { $(this).remove(); });
        }, 1000);
      unsetAjaxLoading();
    }, 'json');
}