[SPIP][PLUGINS] v3.0-->v3.2
[lhc/web/www.git] / www / plugins-dist / porte_plume / javascript / jquery.previsu_spip.js
1 ;(function($) {
2 $.fn.previsu_spip = function(settings) {
3 var options;
4
5 options = {
6 previewParserPath: '' ,
7 previewParserVar: 'data',
8 textEditer: 'Editer',
9 textVoir: 'Voir',
10 textFullScreen: 'Plein écran'
11 };
12 $.extend(options, settings);
13
14 return this.each(function() {
15
16 var $$, textarea, tabs, preview;
17 $$ = $(this);
18 textarea = this;
19
20 // init and build previsu buttons
21 function init() {
22 $$.addClass("pp_previsualisation");
23
24 // s'il n'y a pas de barre d'outil, mais qu'on demande une previsu,
25 // insérer une barre d'outil vide.
26 if (! $$.parent().has('.markItUpContainer').length) {
27 $$.barre_outils('vide');
28 }
29 var mark = $$.parent();
30
31
32 tabs = $('<div class="markItUpTabs"></div>').prependTo(mark);
33 $(tabs).append(
34 '<a href="#fullscreen" class="fullscreen">' + options.textFullScreen + '</a>' +
35 '<a href="#previsuVoir" class="previsuVoir">' + options.textVoir + '</a>' +
36 '<a href="#previsuEditer" class="previsuEditer on">' + options.textEditer + '</a>'
37 );
38
39 preview = $('<div class="markItUpPreview"></div>').insertAfter(mark.find('.markItUpHeader'));
40 preview.hide();
41
42 var is_full_screen = false;
43
44 var objet = mark.parents('.formulaire_spip')[0].className.match(/formulaire_editer_(\w+)/);
45 objet = (objet ? objet[1] : '');
46 var champ = mark.parents('.editer')[0].className.match(/editer_(\w+)/);
47 champ = (champ ? champ[1].toUpperCase() : '');
48 var textarea = mark.find('textarea.pp_previsualisation');
49 var preview = mark.find('.markItUpPreview');
50 var dir = textarea.attr('dir');
51 if(dir){
52 preview.attr('dir',dir);
53 }
54
55 tabs.find('.fullscreen').click(function(){
56 // On commence par garder en mémoire la valeur d'origine de la taille du champ
57 if (!mark.is('.fullscreen')) {
58 textarea.data('height-origin', textarea.css('height'));
59 }
60
61 mark.toggleClass('fullscreen');
62
63 // Si on vient de passer en fullscreen
64 if (mark.is('.fullscreen')){
65 is_full_screen = true;
66 // afficher les boutons de la barre s'ils étaient masqués (cf prévisu)
67 mark.find('.markItUpHeader a').show();
68 if (!mark.is('.livepreview')){
69 var original_texte="";
70
71 function refresh_preview(){
72 var texte = textarea.val();
73 if (original_texte == texte){
74 return;
75 }
76 renderPreview(preview.addClass('ajaxLoad'),texte,champ,objet);
77 original_texte = texte;
78 }
79
80 var timerPreview=null;
81 mark.addClass('livepreview').find('.markItUpEditor').on('keyup click change focus refreshpreview',function(e){
82 if (is_full_screen){
83 if (timerPreview) clearTimeout(timerPreview);
84 timerPreview = setTimeout(refresh_preview,500);
85 }
86 });
87
88 $(window).on('keyup',function(e){
89 if (is_full_screen) {
90 // Touche Echap pour sortir du mode fullscreen
91 if (e.type=='keyup' && e.keyCode==27 && !markitup_prompt){
92 mark.removeClass('fullscreen');
93 // On remet la taille d'origine
94 textarea.css('height', textarea.data('height-origin'));
95 is_full_screen = false;
96 }
97 }
98 });
99 }
100 mark.find('.markItUpEditor').trigger('refreshpreview');
101 }
102 // Si on sort du fullscreen
103 else {
104 // On remet la taille d'origine
105 textarea.css('height', textarea.data('height-origin'));
106 // masquer les boutons de la barre s'ils étaient masqués avant le plein écran (cf prévisu)
107 if ($(this).next().hasClass('on')) {
108 mark.find('.markItUpHeader a').hide();
109 }
110 is_full_screen = false;
111 }
112
113 return false;
114 });
115
116 tabs.find('.previsuVoir').click(function(){
117 preview.height(
118 mark.find('.markItUpEditor').height()
119 + mark.find('.markItUpFooter').height()
120 );
121
122 mark.find('.markItUpHeader a,.markItUpEditor,.markItUpFooter').hide();
123 $(this).addClass('on').next().removeClass('on');
124 renderPreview(
125 preview.show().addClass('ajaxLoad'),
126 mark.find('textarea.pp_previsualisation').val(),
127 champ,
128 objet,
129 false
130 );
131
132 return false;
133 });
134 tabs.find('.previsuEditer').click(function(){
135 mark.find('.markItUpPreview').hide();
136 mark.find('.markItUpHeader a,.markItUpEditor,.markItUpFooter').show();
137 $(this).addClass('on').prev().removeClass('on');
138
139 return false;
140 });
141 }
142
143 function renderPreview(node, val, champ, objet, async) {
144 if (options.previewParserPath !== '') {
145 $.ajax( {
146 type: 'POST',
147 async: typeof (async)=="undefined"?true:async,
148 url: options.previewParserPath,
149 data: 'champ='+champ
150 +'&objet='+objet
151 +'&' + options.previewParserVar+'='+encodeURIComponent(val),
152 success: function(data) {
153 node.html(data).removeClass('ajaxLoad');
154 //ouvre un nouvel onglet lorsqu'on clique sur un lien dans la prévisualisation
155 $("a",node).attr("target","blank");
156 }
157 } );
158 }
159 }
160
161 init();
162 });
163 };
164 })(jQuery);