Dotclear

source: admin/js/common.js @ 1994:f11a757f6dd3

Revision 1994:f11a757f6dd3, 11.4 KB checked in by Anne Kozlika <kozlika@…>, 12 years ago (diff)

Améliorations de présentation :

  • comportement des liens au survol : disparition de l'underline au profit de la transformation des pointillés en ligne continue
  • liens dans les infos en noir au lieu de bleu
  • calcul de la hauteur de la help-box en fonction du wrapper et non du content
Line 
1/* ChainHandler, py Peter van der Beken
2-------------------------------------------------------- */
3function chainHandler(obj, handlerName, handler) {
4     obj[handlerName] = (function(existingFunction) {
5          return function() {
6               handler.apply(this, arguments);
7               if (existingFunction)
8                    existingFunction.apply(this, arguments);
9          };
10     })(handlerName in obj ? obj[handlerName] : null);
11};
12
13/* jQuery extensions
14-------------------------------------------------------- */
15jQuery.fn.check = function() {
16     return this.each(function() {
17          if (this.checked != undefined) { this.checked = true; }
18     });
19};
20jQuery.fn.unCheck = function() {
21     return this.each(function() {
22          if (this.checked != undefined) { this.checked = false; }
23     });
24};
25jQuery.fn.setChecked = function(status) {
26     return this.each(function() {
27          if (this.checked != undefined) { this.checked = status; }
28     });
29};
30jQuery.fn.toggleCheck = function() {
31     return this.each(function() {
32          if (this.checked != undefined) { this.checked = !this.checked; }
33     });
34};
35
36jQuery.fn.enableShiftClick = function() {
37     this.click(
38     function (event) {
39          if (event.shiftKey) {
40               if (dotclear.lastclicked != '') {
41                    var range;
42                    var trparent = $(this).parents('tr');
43                    if (trparent.nextAll('#'+dotclear.lastclicked).length != 0)
44                         range = trparent.nextUntil('#'+dotclear.lastclicked);
45                    else
46                         range = trparent.prevUntil('#'+dotclear.lastclicked);
47
48                    range.find('input[type=checkbox]').setChecked(dotclear.lastclickedstatus);
49                    this.checked = dotclear.lastclickedstatus;
50               }
51          } else {
52               dotclear.lastclicked = $(this).parents('tr')[0].id;
53               dotclear.lastclickedstatus = this.checked;
54          }
55          return true;
56     });
57}
58
59jQuery.fn.toggleWithLegend = function(target,s) {
60     var defaults = {
61          img_on_src: dotclear.img_plus_src,
62          img_on_alt: dotclear.img_plus_alt,
63          img_off_src: dotclear.img_minus_src,
64          img_off_alt: dotclear.img_minus_alt,
65          unfolded_sections: dotclear.unfolded_sections,
66          hide: true,
67          speed: 0,
68          legend_click: false,
69          fn: false, // A function called on first display,
70          user_pref: false,
71          reverse_user_pref: false // Reverse cookie behavior
72     };
73     var p = jQuery.extend(defaults,s);
74
75     if (!target) { return this; }
76
77     var set_cookie = p.hide ^ p.reverse_cookie;
78     if (p.cookie && jQuery.cookie(p.cookie)) {
79          p.hide = p.reverse_cookie;
80     }
81     
82     var set_user_pref = p.hide ^ p.reverse_user_pref;
83     if (p.user_pref && p.unfolded_sections !== undefined && (p.user_pref in p.unfolded_sections)) {
84          p.hide = p.reverse_user_pref;
85     }
86     var toggle = function(i,speed) {
87          speed = speed || 0;
88          if (p.hide) {
89               $(i).get(0).src = p.img_on_src;
90               $(i).get(0).alt = p.img_on_alt;
91               target.hide(speed);
92          } else {
93               $(i).get(0).src = p.img_off_src;
94               $(i).get(0).alt = p.img_off_alt;
95               target.show(speed);
96               if (p.fn) {
97                    p.fn.apply(target);
98                    p.fn = false;
99               }
100          }
101
102          if (p.cookie && set_cookie) {
103               if (p.hide ^ p.reverse_cookie) {
104                    jQuery.cookie(p.cookie,'',{expires: -1});
105               } else {
106                    jQuery.cookie(p.cookie,1,{expires: 30});
107               }
108          }
109          p.hide = !p.hide;
110     };
111
112     return this.each(function() {
113          var i = document.createElement('img');
114          i.src = p.img_off_src;
115          i.alt = p.img_off_alt;
116          var a = document.createElement('a');
117          a.href= '#';
118          $(a).append(i);
119          $(a).css({
120               border: 'none',
121               outline: 'none'
122          });
123
124          var ctarget = p.legend_click ? this : a;
125
126          $(ctarget).css('cursor','pointer');
127          if (p.legend_click) {
128               $(ctarget).find('label').css('cursor','pointer');
129          }
130          $(ctarget).click(function() {
131               if (p.user_pref && set_user_pref) {
132                    if (p.hide ^ p.reverse_user_pref) {
133                         jQuery.post('services.php', 
134                              {'f':'setSectionFold','section':p.user_pref,'value':1,xd_check: dotclear.nonce},
135                              function(data) {});
136                    } else {
137                         jQuery.post('services.php', 
138                              {'f':'setSectionFold','section':p.user_pref,'value':0,xd_check: dotclear.nonce},
139                              function(data) {});
140                    }
141                    jQuery.cookie(p.user_pref,'',{expires: -1});
142               }
143               toggle(i,p.speed);
144               return false;
145          });
146
147
148          toggle($(i).get(0));
149          $(this).prepend(' ').prepend(a);
150     });
151};
152
153jQuery.fn.helpViewer = function() {
154     if (this.length < 1) {
155          return this;
156     }
157
158     var p = {
159          img_on_src: dotclear.img_plus_src,
160          img_on_alt: dotclear.img_plus_alt,
161          img_off_src: dotclear.img_minus_src,
162          img_off_alt: dotclear.img_minus_alt
163     };
164     var This = this;
165     var toggle = function() {
166          $('#content').toggleClass('with-help');
167          if (document.all) {
168               if ($('#content').hasClass('with-help')) {
169                    select = $('#content select:visible').hide();
170               } else {
171                    select.show();
172               }
173          }
174          $('p#help-button span').text($('#content').hasClass('with-help') ? dotclear.msg.help_hide : dotclear.msg.help);
175          sizeBox();
176          return false;
177     };
178
179     var sizeBox = function() {
180          This.css('height','auto');
181          if ($('#wrapper').height() > This.height()) {
182               This.css('height',$('#wrapper').height() + 'px');
183          }
184     };
185
186     var textToggler = function(o) {
187          var i = $('<img src="'+p.img_on_src+'" alt="'+p.img_on_alt+'" />');
188          o.css('cursor','pointer');
189          var hide = true;
190
191          o.prepend(' ').prepend(i);
192          o.click(function() {
193               $(this).nextAll().each(function() {
194                    if ($(this).is('h4')) {
195                         return false;
196                    }
197                    $(this).toggle();
198                    sizeBox();
199                    return true;
200               });
201               hide = !hide;
202               var img = $(this).find('img');
203               if (!hide) {
204                    img.attr('src',p.img_off_src);
205               } else {
206                    img.attr('src',p.img_on_src);
207               }
208          });
209     };
210
211     this.addClass('help-box');
212     this.find('>hr').remove();
213
214     this.find('h4').each(function() { textToggler($(this)); });
215     this.find('h4:first').nextAll('*:not(h4)').hide();
216     sizeBox();
217
218     var img = $('<p id="help-button"><span>'+dotclear.msg.help+'</span></p>');
219     var select = $();
220     img.click(function() { return toggle(); });
221
222     $('#content').append(img);
223     
224     // listen for scroll
225     var peInPage = $('#help-button').offset().top;
226     $('#help-button').addClass("floatable");
227     var peInFloat = $('#help-button').offset().top;
228     $('#help-button').removeClass("floatable");
229     $(window).scroll(
230          function() {
231               if ($(window).scrollTop() >= peInPage - peInFloat ) {
232                    $('#help-button').addClass("floatable");
233               } else {
234                    $('#help-button').removeClass("floatable");
235               }
236          }
237     );
238
239     return this;
240};
241
242/* Dotclear common object
243-------------------------------------------------------- */
244var dotclear = {
245     msg: {},
246
247     hideLockable: function() {
248          $('div.lockable').each(function() {
249               var current_lockable_div = this;
250               $(this).find('p.form-note').hide();
251               $(this).find('input').each(function() {
252                    this.disabled = true;
253                    $(this).width(($(this).width()-14) + 'px');
254
255                    var imgE = document.createElement('img');
256                    imgE.src = 'images/locker.png';
257                    imgE.style.position = 'absolute';
258                    imgE.style.top = '1.7em';
259                    imgE.style.left = ($(this).width()+12)+'px';
260                    imgE.alt=dotclear.msg.click_to_unlock;
261                    $(imgE).css('cursor','pointer');
262
263                    $(imgE).click(function() {
264                         $(this).hide();
265                         $(this).prev('input').each(function() {
266                              this.disabled = false;
267                              $(this).width(($(this).width()+14) + 'px');
268                         });
269                         $(current_lockable_div).find('p.form-note').show();
270                    });
271
272                    $(this).parent().css('position','relative');
273                    $(this).after(imgE);
274               });
275          });
276     },
277
278     checkboxesHelpers: function(e, target) {
279          $(e).append(document.createTextNode(dotclear.msg.to_select));
280          $(e).append(document.createTextNode(' '));
281
282          target = target || $(e).parents('form').find('input[type="checkbox"]');
283         
284          var a = document.createElement('a');
285          a.href='#';
286          $(a).append(document.createTextNode(dotclear.msg.select_all));
287          a.onclick = function() {
288               target.check();
289               return false;
290          };
291          $(e).append(a);
292
293          $(e).append(document.createTextNode(' | '));
294
295          a = document.createElement('a');
296          a.href='#';
297          $(a).append(document.createTextNode(dotclear.msg.no_selection));
298          a.onclick = function() {
299               target.unCheck();
300               return false;
301          };
302          $(e).append(a);
303
304          $(e).append(document.createTextNode(' - '));
305
306          a = document.createElement('a');
307          a.href='#';
308          $(a).append(document.createTextNode(dotclear.msg.invert_sel));
309          a.onclick = function() {
310               target.toggleCheck();
311               return false;
312          };
313          $(e).append(a);
314     },
315
316     postsActionsHelper: function() {
317          $('#form-entries').submit(function() {
318               var action = $(this).find('select[name="action"]').val();
319               var checked = false;
320
321               $(this).find('input[name="entries[]"]').each(function() {
322                    if (this.checked) {
323                         checked = true;
324                    }
325               });
326
327               if (!checked) { return false; }
328
329               if (action == 'delete') {
330                    return window.confirm(dotclear.msg.confirm_delete_posts.replace('%s',$('input[name="entries[]"]:checked').size()));
331               }
332
333               return true;
334          });
335     },
336
337     commentsActionsHelper: function() {
338          $('#form-comments').submit(function() {
339               var action = $(this).find('select[name="action"]').val();
340               var checked = false;
341
342               $(this).find('input[name="comments[]"]').each(function() {
343                    if (this.checked) {
344                         checked = true;
345                    }
346               });
347
348               if (!checked) { return false; }
349
350               if (action == 'delete') {
351                    return window.confirm(dotclear.msg.confirm_delete_comments.replace('%s',$('input[name="comments[]"]:checked').size()));
352               }
353
354               return true;
355          });
356     }
357};
358
359/* On document ready
360-------------------------------------------------------- */
361$(function() {
362     // remove class no-js from html tag; cf style/default.css for examples
363     $('body').removeClass('no-js').addClass('with-js');
364     
365     $('#wrapper').contents().each(function() {
366          if (this.nodeType==8) {
367               $('#footer a[href!="help.php"]').attr('title', $('#footer a[href!="help.php"]').attr('title') + this.data );
368          }
369     });
370
371     // Blog switcher
372     $('#switchblog').change(function() {
373          this.form.submit();
374     });
375
376     var menu_settings = {
377          img_on_src: dotclear.img_menu_off,
378          img_off_src: dotclear.img_menu_on,
379          legend_click: true,
380          speed: 100
381     }
382     $('#blog-menu h3:first').toggleWithLegend($('#blog-menu ul:first'),
383          $.extend({user_pref:'dc_blog_menu'},menu_settings)
384     );
385     $('#system-menu h3:first').toggleWithLegend($('#system-menu ul:first'),
386          $.extend({user_pref:'dc_system_menu'},menu_settings)
387     );
388     $('#plugins-menu h3:first').toggleWithLegend($('#plugins-menu ul:first'),
389          $.extend({user_pref:'dc_plugins_menu'},menu_settings)
390     );
391     $('#favorites-menu h3:first').toggleWithLegend($('#favorites-menu ul:first'),
392          $.extend({user_pref:'dc_favorites_menu',hide:false,reverse_user_pref:true},menu_settings)
393     );
394
395     $('#help').helpViewer();
396
397     $('.message').backgroundFade({sColor:'#cccccc',eColor:'#676e78',steps:20});
398     $('.error').backgroundFade({sColor:'#ffdec8',eColor:'#ffbaba',steps:20});
399     $('.success').backgroundFade({sColor:'#9BCA1C',eColor:'#bee74b',steps:20});
400
401     $('form:has(input[type=password][name=your_pwd])').submit(function() {
402          var e = this.elements['your_pwd'];
403          if (e.value == '') {
404               e.focus();
405               $(e).backgroundFade({sColor:'#ffffff',eColor:'#ffbaba',steps:50},function() {
406                    $(this).backgroundFade({sColor:'#ffbaba',eColor:'#ffffff'});
407               });
408               return false;
409          }
410          return true;
411     });
412
413     // Main menu collapser
414    var objMain = $('#wrapper');
415    function showSidebar(){
416         // Show sidebar
417        objMain.removeClass('hide-mm');
418        $.cookie('sidebar-pref',null,{expires:30});
419    }
420    function hideSidebar(){
421         // Hide sidebar
422        objMain.addClass('hide-mm');
423        $.cookie('sidebar-pref','hide-mm',{expires:30});
424    }
425    // Sidebar separator
426    var objSeparator = $('#collapser');
427    objSeparator.click(function(e){
428        e.preventDefault();
429        if ( objMain.hasClass('hide-mm') ){
430            showSidebar();
431        }
432        else {
433            hideSidebar();
434        }
435    });
436     if ( $.cookie('sidebar-pref') == 'hide-mm' ){
437          objMain.addClass('hide-mm');
438     } else {
439          objMain.removeClass('hide-mm');
440     }
441});
Note: See TracBrowser for help on using the repository browser.

Sites map