41afe21d56457506129fa13366d122d909b76b2f
[redakcja.git] / platforma / static / js / main.js
1 // Teraz nieużywane
2 function highlight(colour) {
3     var range, sel;
4     if (window.getSelection) {
5         // Non-IE case
6         sel = window.getSelection();
7         if (sel.getRangeAt) {
8             range = sel.getRangeAt(0);
9         }
10         document.designMode = "on";
11         if (range) {
12             sel.removeAllRanges();
13             sel.addRange(range);
14         }
15         // Use HiliteColor since some browsers apply BackColor to the whole block
16         if ( !document.execCommand("HiliteColor", false, colour) ) {
17             document.execCommand("BackColor", false, colour);
18         }
19         document.designMode = "off";
20     } else if (document.selection && document.selection.createRange) {
21         // IE case
22         range = document.selection.createRange();
23         range.execCommand("BackColor", false, colour);
24     }
25 }
26
27 // function unselectThemes(themeId) {
28 //     $('.Apple-style-span').each(function() {
29 //         $(this).after($(this).html());
30 //         $(this).remove();
31 //     });
32 // }
33
34 function gallery(element, url) {    
35     var element = $(element);
36     var imageDimensions = {};
37     element.data('images', []);
38     
39     function changePage(pageNumber) {        
40         $('img', element).attr('src', element.data('images')[pageNumber - 1]);
41     }
42     
43     function normalizeNumber(pageNumber) {
44         // Numer strony musi być pomiędzy 1 a najwyższym numerem
45         var pageCount = element.data('images').length;
46         pageNumber = parseInt(pageNumber, 10);
47         
48         if (!pageNumber || pageNumber == NaN || pageNumber == Infinity || pageNumber == -Infinity) {
49             return 1;
50         } else if (pageNumber < 1) {
51             return 1;
52         } else if (pageNumber > pageCount) {
53             return pageCount;
54         } else {
55             return pageNumber;
56         }
57     }
58     
59     var pn = $('.page-number', element);
60     pn.change(function(event) {
61         console.log('change!', $(this).val());
62         event.preventDefault();
63         var n = normalizeNumber(pn.val());
64         pn.val(n);
65         changePage(n);
66     });
67     $('.previous-page', element).click(function() {
68         pn.val(normalizeNumber(pn.val()) - 1);
69         pn.change();
70     });
71     $('.next-page', element).click(function() {
72         pn.val(normalizeNumber(pn.val()) + 1);
73         pn.change();
74     });
75     
76     
77     var image = $('img', element).attr('unselectable', 'on');
78     var origin = {};
79     var imageOrigin = {};
80     var zoomFactor = 1;
81     
82     $('.zoom-in', element).click(function() {
83         zoomFactor = Math.min(2, zoomFactor + 0.2);
84         zoom();
85     });
86     $('.zoom-out', element).click(function() {
87         zoomFactor = Math.max(0.2, zoomFactor - 0.2);
88         zoom();
89     });
90     $('.change-gallery', element).click(function() {
91         $('.chosen-gallery').val($('#document-meta .gallery').html() || '/gallery/');
92         $('.gallery-image').animate({top: 53}, 200);
93         $('.chosen-gallery').focus();
94     });
95     $('.change-gallery-ok', element).click(function() {
96         if ($('#document-meta .gallery').length == 0) {
97             $('<div class="gallery"></div>').appendTo('#document-meta');
98         }
99         $('#document-meta .gallery').html($('.chosen-gallery').val());
100         updateGallery($('.chosen-gallery').val());
101         $('.gallery-image').animate({top: 27}, 200);
102     });
103     $('.change-gallery-cancel', element).click(function() {
104         $('.gallery-image').animate({top: 27}, 200);
105     });
106     
107     $('img', element).load(function() {
108         image.css({width: null, height: null});
109         imageDimensions = {
110             width: $(this).width() * zoomFactor,
111             height: $(this).height() * zoomFactor,
112             originWidth: $(this).width(),
113             originHeight: $(this).height(),
114             galleryWidth: $(this).parent().width(),
115             galleryHeight: $(this).parent().height()
116         };
117         console.log('load', imageDimensions)
118         var position = normalizePosition(
119             image.position().left,
120             image.position().top, 
121             imageDimensions.galleryWidth,
122             imageDimensions.galleryHeight,
123             imageDimensions.width,
124             imageDimensions.height
125         );
126         image.css({left: position.x, top: position.y, width: $(this).width() * zoomFactor, height: $(this).height() * zoomFactor});
127     });
128
129     $(window).resize(function() {
130         imageDimensions.galleryWidth = image.parent().width();
131         imageDimensions.galleryHeight = image.parent().height();
132     });
133     
134     function bounds(galleryWidth, galleryHeight, imageWidth, imageHeight) {
135         return {
136             maxX: 0,
137             maxY: 0,
138             minX: galleryWidth - imageWidth,
139             minY: galleryHeight - imageHeight
140         }
141     }
142     
143     function normalizePosition(x, y, galleryWidth, galleryHeight, imageWidth, imageHeight) {
144         var b = bounds(galleryWidth, galleryHeight, imageWidth, imageHeight);
145         return {
146             x: Math.min(b.maxX, Math.max(b.minX, x)),
147             y: Math.min(b.maxY, Math.max(b.minY, y))
148         }
149     }
150     
151     function onMouseMove(event) {
152         var position = normalizePosition(
153             event.clientX - origin.x + imageOrigin.left,
154             event.clientY - origin.y + imageOrigin.top, 
155             imageDimensions.galleryWidth,
156             imageDimensions.galleryHeight,
157             imageDimensions.width,
158             imageDimensions.height
159         );
160         image.css({position: 'absolute', top: position.y, left: position.x});
161         return false;
162     }
163     
164     function setZoom(factor) {
165         zoomFactor = factor;
166     }
167     
168     function zoom() {
169         imageDimensions.width = imageDimensions.originWidth * zoomFactor;
170         imageDimensions.height = imageDimensions.originHeight * zoomFactor;
171         var position = normalizePosition(
172             image.position().left,
173             image.position().top, 
174             imageDimensions.galleryWidth,
175             imageDimensions.galleryHeight,
176             imageDimensions.width,
177             imageDimensions.height
178         );
179         console.log(image.position(), imageDimensions, position);
180         image.css({width: imageDimensions.width, height: imageDimensions.height,
181             left: position.x, top: position.y});
182
183     }
184     
185     function onMouseUp(event) {
186         $(document)
187             .unbind('mousemove.gallery')
188             .unbind('mouseup.gallery');
189         return false;
190     }
191     
192     image.bind('mousedown', function(event) {
193         origin = {
194             x: event.clientX,
195             y: event.clientY
196         };
197         imageOrigin = image.position();
198         $(document)
199             .bind('mousemove.gallery', onMouseMove)
200             .bind('mouseup.gallery', onMouseUp);
201         return false;
202     });
203     
204     function updateGallery(url) {
205         $.ajax({
206             url: url,
207             type: 'GET',
208             dataType: 'json',
209
210             success: function(data) {
211                 element.data('images', data);
212                 pn.val(1);
213                 pn.change();
214                 $('img', element).show();
215             },
216             
217             error: function(data) {
218                 element.data('images', []);
219                 pn.val(1);
220                 pn.change();
221                 $('img', element).hide();
222             }
223         });
224     }
225     
226     if (url) {
227         updateGallery(url);
228     }
229 }
230
231
232 function transform(editor) {
233     $.blockUI({message: 'Ładowanie...'});
234     setTimeout(function() {
235         xml2html({
236             xml: editor.getCode(),
237             success: function(element) {
238                 $('#html-view').html(element);
239                 $.unblockUI();
240             }, error: function(text) {
241                 $('#html-view').html('<p class="error">Wystąpił błąd:</p><pre>' + text + '</pre>');
242                 $.unblockUI();
243             }
244         });
245     }, 200);
246 };
247
248
249 function reverseTransform(editor) {
250     var serializer = new XMLSerializer();
251     if ($('#html-view .error').length > 0) {
252         return;
253     }
254     $.blockUI({message: 'Ładowanie...'});
255     setTimeout(function() {
256         html2xml({
257             xml: serializer.serializeToString($('#html-view div').get(0)),
258             success: function(text) {
259                 editor.setCode(text);
260                 $.unblockUI();
261             }, error: function(text) {
262                 $('#source-editor').html('<p>Wystąpił błąd:</p><pre>' + text + '</pre>');
263                 $.unblockUI();
264             }
265         });
266     }, 200);
267 }
268
269
270 function html(element) {
271     var element = $(element);
272     
273     function selectTheme(themeId)
274     {
275         var selection = window.getSelection();
276
277         // remove current selection
278         selection.removeAllRanges();
279
280         var range = document.createRange();
281         var s = $(".motyw[theme-class='"+themeId+"']")[0];
282         var e = $(".end[theme-class='"+themeId+"']")[0];
283
284         if(s && e) {
285             range.setStartAfter(s);
286             range.setEndBefore(e);
287             selection.addRange(range);
288         }
289     };
290     
291     // function openForEdit($origin)
292     // {       
293     //     // if(this.currentOpen && this.currentOpen != $origin) {
294     //     //     this.closeWithSave(this.currentOpen);
295     //     // }
296     //     
297     //     var $box = null
298     // 
299     //     // annotations overlay their sub box - not their own box //
300     //     if($origin.is(".annotation-inline-box"))
301     //         $box = $("*[x-annotation-box]", $origin);
302     //     else
303     //         $box = $origin;
304     //     
305     //     var x = $box[0].offsetLeft;
306     //     var y = $box[0].offsetTop;
307     //     var w = $box.outerWidth();
308     //     var h = $box.innerHeight();
309     // 
310     //     console.log("Edit origin:", $origin, " box:", $box);
311     //     console.log("offsetParent:", $box[0].offsetParent);
312     //     console.log("Dimensions: ", x, y, w , h);
313     // 
314     //     // start edition on this node
315     //     var $overlay = $('<div class="html-editarea"><textarea></textarea></div>');
316     // 
317     //     h = Math.max(h - 20, 2*parseInt($box.css('line-height')));
318     //     
319     //     console.log(h);
320     //     
321     //     $overlay.css({
322     //         position: 'absolute',
323     //         height: h,
324     //         left: x,
325     //         top: y,
326     //         right: 0
327     //     });
328     //     
329     //     $($box[0].offsetParent).append($overlay);
330     //     console.log($overlay);
331     // }
332     // 
333     // $('.edit-button').live('click', function() {
334     //     openForEdit($(this).parent());
335     // });
336     // 
337     var button = $('<button class="edit-button">Edytuj</button>');
338     $(element).bind('mousemove', function(event) {
339         var editable = $(event.target).closest('*[x-editable]');
340         $('.active[x-editable]', element).not(editable).removeClass('active').children('.edit-button').remove();
341         if (!editable.hasClass('active')) {
342             editable.addClass('active').append(button);
343         }
344     });
345
346     $('.motyw').live('click', function() {
347         selectTheme($(this).attr('theme-class'));
348     });
349 }
350
351
352 $(function() {
353     gallery('#sidebar', $('#document-meta .gallery').html());
354     html('#html-view');
355     
356     CodeMirror.fromTextArea('id_text', {
357         parserfile: 'parsexml.js',
358         path: "/static/js/lib/codemirror/",
359         stylesheet: "/static/css/xmlcolors.css",
360         parserConfig: {
361             useHTMLKludges: false
362         },
363         iframeClass: 'xml-iframe',
364         textWrapping: true,
365         tabMode: 'spaces',
366         indentUnit: 0,
367         initCallback: function(editor) {
368             $('#save-button').click(function(event) {
369                 event.preventDefault();
370                 $.blockUI({message: $('#save-dialog')});
371             });
372             
373             $('#save-ok').click(function() {
374                 $.blockUI({message: 'Zapisywanie...'});
375                 
376                 var metaComment = '<!--';
377                 $('#document-meta div').each(function() {
378                     metaComment += '\n\t' + $(this).attr('class') + ': ' + $(this).html();
379                 });
380                 metaComment += '\n-->'
381                 
382                 var data = {
383                     name: $('#document-name').html(),
384                     text: metaComment + editor.getCode(),
385                     revision: $('#document-revision').html(),
386                     author: 'annonymous',
387                     comment: $('#komentarz').val()
388                 };
389                 
390                 console.log(data);
391                 
392                 $.ajax({
393                     url: document.location.href,
394                     type: "POST",
395                     dataType: "json",
396                     data: data,                
397                     success: function(data) {
398                         if (data.text) {
399                             editor.setCode(data.text);
400                             $('#document-revision').html(data.revision);
401                         } else {
402                             console.log(data.errors);
403                             alert(data.errors);
404                         }
405                         $.unblockUI();
406                     },
407                     error: function(xhr, textStatus, errorThrown) {
408                         alert('error: ' + textStatus + ' ' + errorThrown);
409                     },
410                 })
411             });
412             
413             $('#save-cancel').click(function() {
414                 $.unblockUI();
415             });
416
417             $('#simple-view-tab').click(function() {
418                 if ($(this).hasClass('active')) {
419                     return;
420                 }
421                 $(this).addClass('active');
422                 $('#source-view-tab').removeClass('active');
423                 $('#source-editor').hide();
424                 $('#simple-editor').show();
425                 transform(editor);
426             });
427
428             $('#source-view-tab').click(function() {
429                 if ($(this).hasClass('active')) {
430                     return;
431                 }
432                 $(this).addClass('active');
433                 $('#simple-view-tab').removeClass('active');
434                 $('#simple-editor').hide();
435                 $('#source-editor').show();
436                 reverseTransform(editor);
437             });
438
439             $('#source-editor .toolbar button').click(function(event) {
440                 event.preventDefault();
441                 var params = eval("(" + $(this).attr('ui:action-params') + ")");
442                 scriptletCenter.scriptlets[$(this).attr('ui:action')](editor, params);
443             });
444
445             $('.toolbar select').change(function() {
446                 var slug = $(this).val();
447
448                 $('.toolbar-buttons-container').hide().filter('[data-group=' + slug + ']').show();
449                 $(window).resize();
450             });
451
452             $('.toolbar-buttons-container').hide();
453             $('.toolbar select').change();
454
455             $('#simple-view-tab').click();
456         }
457     });
458     
459     $(window).resize(function() {
460         $('iframe').height($(window).height() - $('#tabs').outerHeight() - $('#source-editor .toolbar').outerHeight());
461     });
462     
463     $(window).resize();
464     
465     $('.vsplitbar').click(function() {
466         if ($('#sidebar').width() == 0) {
467             $('#sidebar').width(480).css({right: 0}).show();
468             $('#source-editor, #simple-editor').css({right: 495});
469             $('.vsplitbar').css({right: 480}).addClass('active');
470         } else {
471             $('#sidebar').width(0).hide();
472             $('#source-editor, #simple-editor').css({right: 15});
473             $('.vsplitbar').css({right: 0}).removeClass('active');
474         }
475         $(window).resize();
476     });
477                 
478
479 });