]> scripts.mit.edu Git - autoinstalls/wordpress.git/blob - wp-admin/js/widgets.dev.js
Wordpress 3.2
[autoinstalls/wordpress.git] / wp-admin / js / widgets.dev.js
1 var wpWidgets;
2 (function($) {
3
4 wpWidgets = {
5
6         init : function() {
7                 var rem, sidebars = $('div.widgets-sortables'), isRTL = !! ( 'undefined' != typeof isRtl && isRtl ),
8                         margin = ( isRtl ? 'marginRight' : 'marginLeft' );
9
10                 $('#widgets-right').children('.widgets-holder-wrap').children('.sidebar-name').click(function(){
11                         var c = $(this).siblings('.widgets-sortables'), p = $(this).parent();
12                         if ( !p.hasClass('closed') ) {
13                                 c.sortable('disable');
14                                 p.addClass('closed');
15                         } else {
16                                 p.removeClass('closed');
17                                 c.sortable('enable').sortable('refresh');
18                         }
19                 });
20
21                 $('#widgets-left').children('.widgets-holder-wrap').children('.sidebar-name').click(function() {
22                         $(this).siblings('.widget-holder').parent().toggleClass('closed');
23                 });
24
25                 sidebars.not('#wp_inactive_widgets').each(function(){
26                         var h = 50, H = $(this).children('.widget').length;
27                         h = h + parseInt(H * 48, 10);
28                         $(this).css( 'minHeight', h + 'px' );
29                 });
30
31                 $('a.widget-action').live('click', function(){
32                         var css = {}, widget = $(this).closest('div.widget'), inside = widget.children('.widget-inside'), w = parseInt( widget.find('input.widget-width').val(), 10 );
33
34                         if ( inside.is(':hidden') ) {
35                                 if ( w > 250 && inside.closest('div.widgets-sortables').length ) {
36                                         css['width'] = w + 30 + 'px';
37                                         if ( inside.closest('div.widget-liquid-right').length )
38                                                 css[margin] = 235 - w + 'px';
39                                         widget.css(css);
40                                 }
41                                 wpWidgets.fixLabels(widget);
42                                 inside.slideDown('fast');
43                         } else {
44                                 inside.slideUp('fast', function() {
45                                         widget.css({'width':'', margin:''});
46                                 });
47                         }
48                         return false;
49                 });
50
51                 $('input.widget-control-save').live('click', function(){
52                         wpWidgets.save( $(this).closest('div.widget'), 0, 1, 0 );
53                         return false;
54                 });
55
56                 $('a.widget-control-remove').live('click', function(){
57                         wpWidgets.save( $(this).closest('div.widget'), 1, 1, 0 );
58                         return false;
59                 });
60
61                 $('a.widget-control-close').live('click', function(){
62                         wpWidgets.close( $(this).closest('div.widget') );
63                         return false;
64                 });
65
66                 sidebars.children('.widget').each(function() {
67                         wpWidgets.appendTitle(this);
68                         if ( $('p.widget-error', this).length )
69                                 $('a.widget-action', this).click();
70                 });
71
72                 $('#widget-list').children('.widget').draggable({
73                         connectToSortable: 'div.widgets-sortables',
74                         handle: '> .widget-top > .widget-title',
75                         distance: 2,
76                         helper: 'clone',
77                         zIndex: 5,
78                         containment: 'document',
79                         start: function(e,ui) {
80                                 wpWidgets.fixWebkit(1);
81                                 ui.helper.find('div.widget-description').hide();
82                         },
83                         stop: function(e,ui) {
84                                 if ( rem )
85                                         $(rem).hide();
86                                 rem = '';
87                                 wpWidgets.fixWebkit();
88                         }
89                 });
90
91                 sidebars.sortable({
92                         placeholder: 'widget-placeholder',
93                         items: '> .widget',
94                         handle: '> .widget-top > .widget-title',
95                         cursor: 'move',
96                         distance: 2,
97                         containment: 'document',
98                         start: function(e,ui) {
99                                 wpWidgets.fixWebkit(1);
100                                 ui.item.children('.widget-inside').hide();
101                                 ui.item.css({margin:'', 'width':''});
102                         },
103                         stop: function(e,ui) {
104                                 if ( ui.item.hasClass('ui-draggable') && ui.item.data('draggable') )
105                                         ui.item.draggable('destroy');
106
107                                 if ( ui.item.hasClass('deleting') ) {
108                                         wpWidgets.save( ui.item, 1, 0, 1 ); // delete widget
109                                         ui.item.remove();
110                                         return;
111                                 }
112
113                                 var add = ui.item.find('input.add_new').val(),
114                                         n = ui.item.find('input.multi_number').val(),
115                                         id = ui.item.attr('id'),
116                                         sb = $(this).attr('id');
117
118                                 ui.item.css({margin:'', 'width':''});
119                                 wpWidgets.fixWebkit();
120                                 if ( add ) {
121                                         if ( 'multi' == add ) {
122                                                 ui.item.html( ui.item.html().replace(/<[^<>]+>/g, function(m){ return m.replace(/__i__|%i%/g, n); }) );
123                                                 ui.item.attr( 'id', id.replace(/__i__|%i%/g, n) );
124                                                 n++;
125                                                 $('div#' + id).find('input.multi_number').val(n);
126                                         } else if ( 'single' == add ) {
127                                                 ui.item.attr( 'id', 'new-' + id );
128                                                 rem = 'div#' + id;
129                                         }
130                                         wpWidgets.save( ui.item, 0, 0, 1 );
131                                         ui.item.find('input.add_new').val('');
132                                         ui.item.find('a.widget-action').click();
133                                         return;
134                                 }
135                                 wpWidgets.saveOrder(sb);
136                         },
137                         receive: function(e,ui) {
138                                 if ( !$(this).is(':visible') )
139                                         $(this).sortable('cancel');
140                         }
141                 }).sortable('option', 'connectWith', 'div.widgets-sortables').parent().filter('.closed').children('.widgets-sortables').sortable('disable');
142
143                 $('#available-widgets').droppable({
144                         tolerance: 'pointer',
145                         accept: function(o){
146                                 return $(o).parent().attr('id') != 'widget-list';
147                         },
148                         drop: function(e,ui) {
149                                 ui.draggable.addClass('deleting');
150                                 $('#removing-widget').hide().children('span').html('');
151                         },
152                         over: function(e,ui) {
153                                 ui.draggable.addClass('deleting');
154                                 $('div.widget-placeholder').hide();
155
156                                 if ( ui.draggable.hasClass('ui-sortable-helper') )
157                                         $('#removing-widget').show().children('span')
158                                         .html( ui.draggable.find('div.widget-title').children('h4').html() );
159                         },
160                         out: function(e,ui) {
161                                 ui.draggable.removeClass('deleting');
162                                 $('div.widget-placeholder').show();
163                                 $('#removing-widget').hide().children('span').html('');
164                         }
165                 });
166         },
167
168         saveOrder : function(sb) {
169                 if ( sb )
170                         $('#' + sb).closest('div.widgets-holder-wrap').find('img.ajax-feedback').css('visibility', 'visible');
171
172                 var a = {
173                         action: 'widgets-order',
174                         savewidgets: $('#_wpnonce_widgets').val(),
175                         sidebars: []
176                 };
177
178                 $('div.widgets-sortables').each( function() {
179                         a['sidebars[' + $(this).attr('id') + ']'] = $(this).sortable('toArray').join(',');
180                 });
181
182                 $.post( ajaxurl, a, function() {
183                         $('img.ajax-feedback').css('visibility', 'hidden');
184                 });
185
186                 this.resize();
187         },
188
189         save : function(widget, del, animate, order) {
190                 var sb = widget.closest('div.widgets-sortables').attr('id'), data = widget.find('form').serialize(), a;
191                 widget = $(widget);
192                 $('.ajax-feedback', widget).css('visibility', 'visible');
193
194                 a = {
195                         action: 'save-widget',
196                         savewidgets: $('#_wpnonce_widgets').val(),
197                         sidebar: sb
198                 };
199
200                 if ( del )
201                         a['delete_widget'] = 1;
202
203                 data += '&' + $.param(a);
204
205                 $.post( ajaxurl, data, function(r){
206                         var id;
207
208                         if ( del ) {
209                                 if ( !$('input.widget_number', widget).val() ) {
210                                         id = $('input.widget-id', widget).val();
211                                         $('#available-widgets').find('input.widget-id').each(function(){
212                                                 if ( $(this).val() == id )
213                                                         $(this).closest('div.widget').show();
214                                         });
215                                 }
216
217                                 if ( animate ) {
218                                         order = 0;
219                                         widget.slideUp('fast', function(){
220                                                 $(this).remove();
221                                                 wpWidgets.saveOrder();
222                                         });
223                                 } else {
224                                         widget.remove();
225                                         wpWidgets.resize();
226                                 }
227                         } else {
228                                 $('.ajax-feedback').css('visibility', 'hidden');
229                                 if ( r && r.length > 2 ) {
230                                         $('div.widget-content', widget).html(r);
231                                         wpWidgets.appendTitle(widget);
232                                         wpWidgets.fixLabels(widget);
233                                 }
234                         }
235                         if ( order )
236                                 wpWidgets.saveOrder();
237                 });
238         },
239
240         appendTitle : function(widget) {
241                 var title = $('input[id*="-title"]', widget);
242                 if ( title = title.val() ) {
243                         title = title.replace(/<[^<>]+>/g, '').replace(/</g, '&lt;').replace(/>/g, '&gt;');
244                         $(widget).children('.widget-top').children('.widget-title').children()
245                                 .children('.in-widget-title').html(': ' + title);
246                 }
247         },
248
249         resize : function() {
250                 $('div.widgets-sortables').not('#wp_inactive_widgets').each(function(){
251                         var h = 50, H = $(this).children('.widget').length;
252                         h = h + parseInt(H * 48, 10);
253                         $(this).css( 'minHeight', h + 'px' );
254                 });
255         },
256
257     fixWebkit : function(n) {
258         n = n ? 'none' : '';
259         $('body').css({
260                         WebkitUserSelect: n,
261                         KhtmlUserSelect: n
262                 });
263     },
264
265     fixLabels : function(widget) {
266                 widget.children('.widget-inside').find('label').each(function(){
267                         var f = $(this).attr('for');
268                         if ( f && f == $('input', this).attr('id') )
269                                 $(this).removeAttr('for');
270                 });
271         },
272
273     close : function(widget) {
274                 widget.children('.widget-inside').slideUp('fast', function(){
275                         widget.css({'width':'', margin:''});
276                 });
277         }
278 };
279
280 $(document).ready(function($){ wpWidgets.init(); });
281
282 })(jQuery);