Ticket #63: jquery.wymeditor.modal_dialog.js

File jquery.wymeditor.modal_dialog.js, 11.9 KB (added by samuelcole, 17 months ago)
Line 
1// Override the default dialog action
2// Original at line 1153
3
4// modified from http://trac.wymeditor.org/trac/ticket/63
5
6// Called in postInit()
7/*
8postInit: function(wym) {
9    wym.modal_dialog(wym);
10},
11
12*/
13
14(function($) {
15
16var $wym_dialog = $([]);
17var modal_dialog;
18var savedSelection;
19
20WYMeditor.editor.prototype.dialog = function( dialogType, dialogFeatures, bodyHtml )
21{
22    var features = dialogFeatures || this._wym._options.dialogFeatures;
23    var sBodyHtml = "";
24   
25    this._options.dialogLinkHtml = wym_dialogLinkHtml;
26    this._options.dialogImageHtml = wym_dialogImageHtml;
27    this._options.dialogTableHtml = wym_dialogTableHtml;
28    this._options.dialogPasteHtml = wym_dialogPasteHtml;
29   
30    this._options.dialogHtml = WYMeditor.DIALOG_BODY;
31
32    switch( dialogType )
33    {
34        case(WYMeditor.DIALOG_LINK):
35            sBodyHtml = this._options.dialogLinkHtml;
36        break;
37        case(WYMeditor.DIALOG_IMAGE):
38            sBodyHtml = this._options.dialogImageHtml;
39        break;
40        case(WYMeditor.DIALOG_TABLE):
41            sBodyHtml = this._options.dialogTableHtml;
42        break;
43        case(WYMeditor.DIALOG_PASTE):
44            sBodyHtml = this._options.dialogPasteHtml;
45        break;
46        case(WYMeditor.PREVIEW):
47            sBodyHtml = this._options.dialogPreviewHtml;
48        break;
49        default:
50            sBodyHtml = bodyHtml;
51        break;
52    }
53
54    var h = WYMeditor.Helper;
55
56    //construct the dialog
57    var dialogHtml = this._options.dialogHtml;
58    dialogHtml = h.replaceAll(dialogHtml, WYMeditor.BASE_PATH, this._options.basePath);
59    dialogHtml = h.replaceAll(dialogHtml, WYMeditor.DIRECTION, this._options.direction);
60    dialogHtml = h.replaceAll(dialogHtml, WYMeditor.DIALOG_TITLE, this.encloseString( dialogType ));
61    dialogHtml = h.replaceAll(dialogHtml, WYMeditor.DIALOG_BODY, sBodyHtml);
62    dialogHtml = h.replaceAll(dialogHtml, WYMeditor.INDEX, this._index);
63
64    dialogHtml = this.replaceStrings(dialogHtml);
65    dialogTitle = dialogType.replace("_", " ");
66       
67    $wym_dialog = $.create_modal_dialog(dialogTitle, dialogHtml);   
68    modal_dialog = $wym_dialog.data('modal_dialog');
69    modal_dialog.open();
70
71    WYMeditor.INIT_DIALOG(this._index);
72};
73
74WYMeditor.editor.prototype.modal_dialog = function(wym)
75{
76    $('.wym_tools a').click(function(){
77        //savedSelection = rangy.saveRestore.saveSelection();
78    });
79};
80
81/*
82Plugin for all dialogs to use to close the window.
83
84Set a really short time out, it seems to need this otherwise it won't close
85after updating the HTML in the editor window.
86*/
87jQuery.fn.closeDialog = function(){
88
89    //rangy.saveRestore.restoreSelection(savedSelection);
90   
91    setTimeout({
92        run: function() {
93            modal_dialog.close();
94        }
95    }.run, 250);
96};
97
98WYMeditor.INIT_DIALOG = function(index)
99{
100    var wym = WYMeditor.INSTANCES[index];
101    var doc = window.document;
102    var selected = wym.selected();
103    var dialogType = jQuery(wym._options.dialogTypeSelector).val();
104    var sStamp = wym.uniqueStamp();
105   
106    switch(dialogType)
107    {
108        case WYMeditor.DIALOG_LINK:
109            //ensure that we select the link to populate the fields
110            if(selected && selected.tagName && selected.tagName.toLowerCase != WYMeditor.A)
111            selected = jQuery(selected).parentsOrSelf(WYMeditor.A);
112
113            //fix MSIE selection if link image has been clicked
114            if(!selected && wym._selected_image)
115            selected = jQuery(wym._selected_image).parentsOrSelf(WYMeditor.A);
116        break;
117        default:
118        break;
119    }
120
121    //pre-init functions
122    if(jQuery.isFunction(wym._options.preInitDialog))
123    {
124        wym._options.preInitDialog(wym,window);
125    }
126
127    //add css rules from options
128    var styles = doc.styleSheets[0];
129    var aCss = eval(wym._options.dialogStyles);
130
131    wym.addCssRules(doc, aCss);
132
133    //auto populate fields if selected container (e.g. A)
134    if(selected)
135    {
136        jQuery('.wym_css_class', doc).val(jQuery(selected).attr('class'));
137        jQuery('.wym_rel', doc).val(jQuery(selected).attr('rel'));
138       
139        jQuery(wym._options.hrefSelector).val(jQuery(selected).attr(WYMeditor.HREF));
140        jQuery(wym._options.srcSelector).val(jQuery(selected).attr(WYMeditor.SRC));
141        jQuery(wym._options.titleSelector).val(jQuery(selected).attr(WYMeditor.TITLE));
142        jQuery(wym._options.altSelector).val(jQuery(selected).attr(WYMeditor.ALT));
143    }
144   
145    // Bind the same action to all Cancel buttons
146    jQuery(wym._options.cancelSelector, doc).click(function(){
147        jQuery().closeDialog();
148    });
149
150    // Handle Links
151    jQuery(wym._options.dialogLinkSelector +" "+ wym._options.submitSelector).submit(function(e){
152         e.preventDefault();
153         
154         var sUrl = jQuery(wym._options.hrefSelector, doc).val();
155
156         if(sUrl.length > 0)
157         {           
158            var link;
159
160            if (selected[0] && selected[0].tagName.toLowerCase() == WYMeditor.A) {
161                link = selected;
162            } else {
163                wym._exec(WYMeditor.CREATE_LINK, sStamp);
164                link = jQuery("a[href=" + sStamp + "]", wym._doc.body);
165            }
166
167            link.attr(WYMeditor.HREF, sUrl).attr(WYMeditor.TITLE, jQuery(wym._options.titleSelector).val()).attr('class', jQuery('.wym_css_class').val()).attr('rel', jQuery('.wym_rel').val());
168         }
169         
170         jQuery().closeDialog();
171     });
172
173    //auto populate image fields if selected image
174    if(wym._selected_image)
175    {
176        jQuery(wym._options.dialogImageSelector + " " + wym._options.srcSelector).val(jQuery(wym._selected_image).attr(WYMeditor.SRC));
177     
178        jQuery(wym._options.dialogImageSelector + " " + wym._options.titleSelector).val(jQuery(wym._selected_image).attr(WYMeditor.TITLE));
179     
180        jQuery(wym._options.dialogImageSelector + " " + wym._options.altSelector).val(jQuery(wym._selected_image).attr(WYMeditor.ALT));
181    }
182
183
184    jQuery(wym._options.dialogImageSelector +" "+ wym._options.submitSelector).submit(function() {
185       
186        var sUrl = jQuery(wym._options.srcSelector).val();
187
188        if(sUrl.length > 0)
189        {
190            wym._exec(WYMeditor.INSERT_IMAGE, sStamp);
191
192            jQuery("img[src$=" + sStamp + "]", wym._doc.body).attr(WYMeditor.SRC, sUrl).attr(WYMeditor.TITLE, jQuery(wym._options.titleSelector).val()).attr(WYMeditor.ALT, jQuery(wym._options.altSelector).val());
193        }
194   
195        jQuery().closeDialog();
196    });
197
198    jQuery(wym._options.dialogTableSelector +" "+ wym._options.submitSelector).submit(function() {
199
200        var iRows = jQuery(wym._options.rowsSelector).val();
201        var iCols = jQuery(wym._options.colsSelector).val();
202
203        if(iRows > 0 && iCols > 0)
204        {
205            var table = wym._doc.createElement(WYMeditor.TABLE);
206            var newRow = null;
207            var newCol = null;
208
209            var sCaption = jQuery(wym._options.captionSelector).val();
210
211            //we create the caption
212            var newCaption = table.createCaption();
213            newCaption.innerHTML = sCaption;
214
215            //we create the rows and cells
216            for(x=0; x<iRows; x++) {
217                newRow = table.insertRow(x);
218                for(y=0; y<iCols; y++) {newRow.insertCell(y);}
219            }
220
221            //set the summary attr
222            jQuery(table).attr('summary', jQuery(wym._options.summarySelector).val());
223
224            //append the table after the selected container
225            var node = jQuery(wym.findUp(wym.container(), WYMeditor.MAIN_CONTAINERS)).get(0);
226            if(!node || !node.parentNode)
227            {
228                jQuery(wym._doc.body).append(table);
229            }
230            else
231            {
232                jQuery(node).after(table);
233            }
234        }
235       
236        jQuery().closeDialog();
237    });
238
239    jQuery(wym._options.dialogPasteSelector +" "+ wym._options.submitSelector).submit(function() {
240
241        var sText = jQuery(wym._options.textSelector).val();
242        wym.paste(sText);
243       
244        jQuery().closeDialog();
245    });
246
247    /* Removed this option, it's useless
248    jQuery(wym._options.dialogPreviewSelector +" "+ wym._options.previewSelector).click(function(){
249        wym_dialog.html(wym.xhtml());
250    });
251    */
252   
253    //pre-init functions
254    if(jQuery.isFunction(wym._options.postInitDialog))
255    wym._options.postInitDialog(wym,window);
256
257};
258
259
260
261
262// Custom Dialogs
263
264var wym_dialogLinkHtml = "<div class='wym_dialog wym_dialog_link'><form>"
265    + "<fieldset>"
266    + "<input type='hidden' class='wym_dialog_type' value='"+ WYMeditor.DIALOG_LINK + "' />"
267   
268    + "<div class='row'>"
269    + "<label>{URL}</label>"
270    + "<input type='text' class='wym_href' value='' size='40' />"
271    + "</div>"
272   
273    + "<div class='row'>"
274    + "<label>{Title}</label>"
275    + "<input type='text' class='wym_title' value='' size='40' />"
276    + "</div>"
277
278    + "<div class='row'>"
279    + "<label>CSS Class</label>"
280    + "<input type='text' class='wym_css_class' value='' size='40' />"
281    + "</div>"
282
283    + "<div class='row'>"
284    + "<label>Target</label>"
285    + "<select class='wym_rel'>"
286       + "<option value=''>Same Window</option>"
287       + "<option value='_blank'>New Window</option>"
288    + "</select>"
289    + "</div>"
290
291    + "<div class='row row-indent'>"
292    + "<input class='wym_submit' type='submit' value='{Submit}' />"
293    + "<input class='wym_cancel' type='button' value='{Cancel}' />"
294    + "</div>"
295   
296    + "</fieldset>"
297    + "</form>"
298    + "<fieldset class='page_listing' style='display: none;'><legend>Pages</legend><div class='container'>{PAGES_HTML}</div></fieldset>"
299    + "</div>";
300
301var wym_dialogImageHtml = "<div class='wym_dialog wym_dialog_image'><form>"
302    + "<fieldset>"
303    + "<input type='hidden' class='wym_dialog_type' value='"+ WYMeditor.DIALOG_IMAGE +"' />"
304
305    + "<div class='row'>"
306    + "<label>{URL}</label>"
307    + "<input type='text' class='wym_src' value='' size='40' />"
308    + "</div>"
309
310    + "<div class='row'>"
311    + "<label>{Alternative_Text}</label>"
312    + "<input type='text' class='wym_alt' value='' size='40' />"
313    + "</div>"
314
315    + "<div class='row'>"
316    + "<label>{Title}</label>"
317    + "<input type='text' class='wym_title' value='' size='40' />"
318    + "</div>"
319   
320    + "<div class='row row-indent'>"
321    + "<input class='wym_submit' type='submit' value='{Submit}' />"
322    + "<input class='wym_cancel' type='button' value='{Cancel}' />"
323    + "</div>"
324   
325    + "</fieldset>"
326    + "</form>";
327
328var wym_dialogTableHtml = "<div class='wym_dialog wym_dialog_table'><form>"
329    + "<fieldset>"
330    + "<input type='hidden' class='wym_dialog_type' value='"+ WYMeditor.DIALOG_TABLE +"' />"
331
332    + "<div class='row'>"
333    + "<label>{Caption}</label>"
334    + "<input type='text' class='wym_caption' value='' size='40' />"
335    + "</div>"
336
337    + "<div class='row'>"
338    + "<label>{Summary}</label>"
339    + "<input type='text' class='wym_summary' value='' size='40' />"
340    + "</div>"
341
342    + "<div class='row'>"
343    + "<label>{Number_Of_Rows}</label>"
344    + "<input type='text' class='wym_rows' value='3' size='3' />"
345    + "</div>"
346
347    + "<div class='row'>"
348    + "<label>{Number_Of_Cols}</label>"
349    + "<input type='text' class='wym_cols' value='2' size='3' />"
350    + "</div>"
351
352    + "<div class='row row-indent'>"
353    + "<input class='wym_submit' type='submit' value='{Submit}' />"
354    + "<input class='wym_cancel' type='button' value='{Cancel}' />"
355    + "</div>"
356   
357    + "</fieldset>"
358    + "</form>";
359
360var wym_dialogPasteHtml = "<div class='wym_dialog wym_dialog_paste'><form>"
361    + "<fieldset>"
362    + "<input type='hidden' class='wym_dialog_type' value='"+ WYMeditor.DIALOG_PASTE +"' />"
363   
364    + "<div class='row'>"
365    + "<textarea class='wym_text' rows='10' cols='50'></textarea>"
366    + "</div>"
367   
368    + "<div class='row row-indent'>"
369    + "<input class='wym_submit' type='submit' value='{Submit}' />"
370    + "<input class='wym_cancel' type='button' value='{Cancel}' />"
371    + "</div>"
372   
373    + "</fieldset>"
374    + "</form>";
375
376var wym_dialogPreviewHtml = "<div class='wym_dialog wym_dialog_preview'><div>";
377
378})(jQuery);