Rewrote category editor. This breaks the JSON API. Also fixed a few bugs with how Wiki Mode is set in $paths. (Hopefully that doesn't cause infinite loops, heh). Fixes issue 20.
+ − 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');
+ − }
+ −