edd82e3510562bc06322a3f10083360f940bf1e1
[redakcja.git] / platforma / static / js / main.js
1 if (!window.console) {
2     window.console = {
3         log: function() {}
4     }
5 }
6
7 THEMES = ['Alkohol', 'Ambicja', 'Anioł', 'Antysemityzm', 'Arkadia', 'Artysta', 'Bezdomność',
8 'Bezpieczeństwo', 'Bieda', 'Bijatyka', 'Błazen', 'Błądzenie', 'Błoto', 'Bogactwo', 'Bóg', 'Brat',
9 'Bunt', 'Buntownik', 'Burza', 'Car', 'Carpe diem', 'Ciemność', 'Cień', 'Cisza', 'Chciwość', 'Chleb',
10 'Chłop', 'Choroba', 'Chrystus', 'Chrzest', 'Ciało', 'Cierpienie', 'Cmentarz', 'Cnota', 'Córka', 'Cud',
11 'Czarownika', 'Czary', 'Czas', 'Czyn', 'Czyściec', 'Dama', 'Danse macabre', 'Deszcz', 'Diabeł',
12 'Dobro', 'Dom', 'Dorosłość', 'Drzewo', 'Duch', 'Dusza', 'Duma', 'Dworek', 'Dworzanin', 'Dwór',
13 'Dzieciństwo', 'Dziecko', 'Dziedzictwo', 'Dziewictwo', 'Dźwięk', 'Egzorcyzm', 'Elita', 'Emigrant',
14 'Fałsz', 'Filozof', 'Fircyk', 'Flirt', 'Głupiec', 'Głupota', 'Głód', 'Gospodarz', 'Gospodyni', 'Gość',
15 'Gotycyzm', 'Góra', 'Gra', 'Grób', 'Grzech', 'Grzeczność', 'Gwiazda', 'Handel', 'Hańba', 'Historia',
16 'Honor', 'Idealista', 'Imię', 'Interes', 'Jabłka', 'Jedzenie', 'Jesień', 'Kaleka', 'Kara', 'Karczma',
17 'Klęska', 'Kłamstwo', 'Kłótnia', 'Kobieta', 'Kobieta demoniczna', 'Kobieta "upadła"', 'Kochanek',
18 'Kochanek romantyczny', 'Kolonializm', 'Kondycja ludzka', 'Konflikt', 'Konflikt wewnętrzny', 'Koniec świata',
19 'Koń', 'Korzyść', 'Kot', 'Kradzież', 'Krew', 'Król', 'Krzywda', 'Ksiądz', 'Książka',
20 'Księżyc', 'Kuchnia', 'Kuszenie', 'Kwiaty', 'Labirynt', 'Las', 'Lato', 'Lekarz', 'Lenistwo', 'List',
21 'Liberat', 'Los', 'Lud', 'Lustro', 'Łzy', 'Małżeństwo', 'Marzenie', 'Maska', 'Maszyna', 'Matka',
22 'Matka Boska', 'Mądrość', 'Mąż', 'Melancholia', 'Mędrzec', 'Mężczyzna', 'Miasto', 'Mieszczanin',
23 'Miłosierdzie', 'Miłość', 'Miłość niespełniona', 'Miłość platoniczna', 'Miłość romantyczna', 
24 'Miłość silniejsza niż śmierć', 'Miłość spełniona', 'Miłość tragiczna', 'Mizoginia', 'Młodość', 'Moda',
25 'Modlitwa', 'Morderstwo', 'Morze', 'Motyl', 'Mucha', 'Muzyka', 'Narodziny', 'Naród', 'Natura',
26 'Nauczyciel', 'Nauczycielka', 'Nauka', 'Niebezpieczeństwo', 'Niedziela', 'Niemiec', 'Nienawiść',
27 'Nieśmiertelność', 'Niewola', 'Noc', 'Nuda', 'Obcy', 'Obłok', 'Obowiązek', 'Obraz świata', 'Obrzędy',
28 'Obyczaje', 'Obywatel', 'Odrodzenie przez grób', 'Odwaga', 'Ofiara', 'Ogień', 'Ogród', 'Ojciec',
29 'Ojczyzna', 'Oko', 'Okręt', 'Okrucieństwo', 'Omen', 'Opieka', 'Organizm', 'Otchłań', 'Pająk', 'Pamięć',
30 'Pan', 'Panna młoda', 'Państwo', 'Patriota', 'Piekło', 'Pielgrzym', 'Pieniądz', 'Pies', 'Piętno',
31 'Pijaństwo', 'Piwnica', 'Plotka', 'Pobożność', 'Pocałunek', 'Pochlebstwo', 'Poeta', 'Poetka', 'Poezja',
32 'Podróż', 'Podstęp', 'Pogrzeb', 'Pojedynek', 'Pokora', 'Pokusa', 'Polak', 'Polityka', 'Polowanie',
33 'Polska', 'Portret', 'Porwanie', 'Poświęcenie', 'Potwór', 'Powstanie', 'Powstaniec', 'Pozory',
34 'Pozycja społeczna', 'Pożar', 'Pożądanie', 'Praca', 'Praca u podstaw', 'Praca organiczna', 'Prawda', 'Prawnik',
35 'Prometeusz', 'Proroctwo', 'Prorok', 'Próżność', 'Przebranie', 'Przeczucie', 'Przedmurze chrześcijaństwa',
36 'Przekleństwo', 'Przekupstwo', 'Przemiana', 'Przemijanie', 'Przemoc', 'Przestrzeń',
37 'Przyjaźń', 'Przyroda nieożywiona', 'Przysięga', 'Przywódca', 'Ptak', 'Pustynia', 'Pycha', 'Raj',
38 'Realista', 'Religia', 'Rewolucja', 'Robak', 'Robotnik', 'Rodzina', 'Rosja', 'Rosjanin', 'Rośliny',
39 'Rozczarowanie', 'Rozpacz', 'Rozstanie', 'Rozum', 'Ruiny', 'Rycerz', 'Rzeka', 'Salon', 'Samobójstwo',
40 'Samolubstwo', 'Samotnik', 'Samotność', 'Sarmata', 'Sąsiad', 'Sąd', 'Sąd Ostateczny', 'Sen', 'Serce',
41 'Sędzia', 'Sielanka', 'Sierota', 'Siła', 'Siostra', 'Sława', 'Słońce', 'Słowo', 'Sługa', 'Służalczość',
42 'Skąpiec', 'Sobowtór', 'Społecznik', 'Spowiedź', 'Sprawiedliwość', 'Starość', 'Strach', 'Strój',
43 'Stworzenie', 'Sumienie', 'Swaty', 'Syberia', 'Syn', 'Syn marnotrawny', 'Syzyf', 'Szaleniec',
44 'Szaleństwo', 'Szantaż', 'Szatan', 'Szczęście', 'Szkoła', 'Szlachcic', 'Szpieg', 'Sztuka', 'Ślub',
45 'Śmiech', 'Śmierć', 'Śmierć bohaterska', 'Śpiew', 'Światło', 'Świętoszek', 'Święty', 'Świt',
46 'Tajemnica', 'Taniec', 'Tchórzostwo', 'Teatr', 'Testament', 'Tęsknota', 'Theatrum mundi', 'Tłum',
47 'Trucizna', 'Trup', 'Twórczość', 'Uczeń', 'Uczta', 'Uroda', 'Umiarkowanie', 'Upadek', 'Upiór',
48 'Urzędnik', 'Vanitas', 'Walka', 'Walka klas', 'Wampir', 'Warszawa', 'Wąż', 'Wdowa', 'Wdowiec',
49 'Wesele', 'Wiatr', 'Wierność', 'Wierzenia', 'Wieś', 'Wiedza', 'Wieża Babel', 'Więzienie', 'Więzień',
50 'Wina', 'Wino', 'Wiosna', 'Wizja', 'Władza', 'Własność', 'Woda', 'Wojna', 'Wojna pokoleń', 'Wolność',
51 'Wróg', 'Wspomnienia', 'Współpraca', 'Wygnanie', 'Wyrzuty sumienia', 'Wyspa', 'Wzrok', 'Zabawa',
52 'Zabobony', 'Zamek', 'Zaręczyny', 'Zaświaty', 'Zazdrość', 'Zbawienie', 'Zbrodnia', 'Zbrodniarz',
53 'Zdrada', 'Zdrowie', 'Zemsta', 'Zesłaniec', 'Ziarno', 'Ziemia', 'Zima', 'Zło', 'Złodziej', 'Złoty wiek',
54 'Zmartwychwstanie', 'Zwątpienie', 'Zwierzęta', 'Zwycięstwo', 'Żałoba', 'Żebrak', 'Żołnierz',
55 'Żona', 'Życie jako wędrówka', 'Życie snem', 'Żyd', 'Żywioły', 'Oświadczyny']
56
57
58 // Teraz nieużywane
59 function highlight(colour) {
60     var range, sel;
61     if (window.getSelection) {
62         // Non-IE case
63         sel = window.getSelection();
64         if (sel.getRangeAt) {
65             range = sel.getRangeAt(0);
66         }
67         document.designMode = "on";
68         if (range) {
69             sel.removeAllRanges();
70             sel.addRange(range);
71         }
72         // Use HiliteColor since some browsers apply BackColor to the whole block
73         if ( !document.execCommand("HiliteColor", false, colour) ) {
74             document.execCommand("BackColor", false, colour);
75         }
76         document.designMode = "off";
77     } else if (document.selection && document.selection.createRange) {
78         // IE case
79         range = document.selection.createRange();
80         range.execCommand("BackColor", false, colour);
81     }
82 }
83
84 // function unselectThemes(themeId) {
85 //     $('.Apple-style-span').each(function() {
86 //         $(this).after($(this).html());
87 //         $(this).remove();
88 //     });
89 // }
90
91 function gallery(element, url) {    
92     var element = $(element);
93     var imageDimensions = {};
94     element.data('images', []);
95     
96     function changePage(pageNumber) {        
97         $('img', element).attr('src', element.data('images')[pageNumber - 1]);
98     }
99     
100     function normalizeNumber(pageNumber) {
101         // Numer strony musi być pomiędzy 1 a najwyższym numerem
102         var pageCount = element.data('images').length;
103         pageNumber = parseInt(pageNumber, 10);
104         
105         if (!pageNumber || pageNumber == NaN || pageNumber == Infinity || pageNumber == -Infinity) {
106             return 1;
107         } else if (pageNumber < 1) {
108             return 1;
109         } else if (pageNumber > pageCount) {
110             return pageCount;
111         } else {
112             return pageNumber;
113         }
114     }
115     
116     var pn = $('.page-number', element);
117     pn.change(function(event) {
118         event.preventDefault();
119         var n = normalizeNumber(pn.val());
120         pn.val(n);
121         changePage(n);
122     });
123     $('.previous-page', element).click(function() {
124         pn.val(normalizeNumber(pn.val()) - 1);
125         pn.change();
126     });
127     $('.next-page', element).click(function() {
128         pn.val(normalizeNumber(pn.val()) + 1);
129         pn.change();
130     });
131     
132     
133     var image = $('img', element).attr('unselectable', 'on');
134     var origin = {};
135     var imageOrigin = {};
136     var zoomFactor = 1;
137     
138     $('.zoom-in', element).click(function() {
139         zoomFactor = Math.min(2, zoomFactor + 0.2);
140         zoom();
141     });
142     $('.zoom-out', element).click(function() {
143         zoomFactor = Math.max(0.2, zoomFactor - 0.2);
144         zoom();
145     });
146     $('.change-gallery', element).click(function() {
147         $('.chosen-gallery').val($('#document-meta .gallery').html() || '/platforma/gallery/');
148         $('.gallery-image').animate({top: 53}, 200);
149         $('.chosen-gallery').focus();
150     });
151     $('.change-gallery-ok', element).click(function() {
152         if ($('#document-meta .gallery').length == 0) {
153             $('<div class="gallery"></div>').appendTo('#document-meta');
154         }
155         $('#document-meta .gallery').html($('.chosen-gallery').val());
156         updateGallery($('.chosen-gallery').val());
157         $('.gallery-image').animate({top: 27}, 200);
158     });
159     $('.change-gallery-cancel', element).click(function() {
160         $('.gallery-image').animate({top: 27}, 200);
161     });
162     
163     $('img', element).load(function() {
164         image.css({width: null, height: null});
165         imageDimensions = {
166             width: $(this).width() * zoomFactor,
167             height: $(this).height() * zoomFactor,
168             originWidth: $(this).width(),
169             originHeight: $(this).height(),
170             galleryWidth: $(this).parent().width(),
171             galleryHeight: $(this).parent().height()
172         };
173         
174         if (!(imageDimensions.width && imageDimensions.height)) {
175             setTimeout(function() { $('img', element).load(); }, 100);
176         }        
177         var position = normalizePosition(
178             image.position().left,
179             image.position().top, 
180             imageDimensions.galleryWidth,
181             imageDimensions.galleryHeight,
182             imageDimensions.width,
183             imageDimensions.height
184         );
185         image.css({left: position.x, top: position.y, width: $(this).width() * zoomFactor, height: $(this).height() * zoomFactor});
186     });
187
188     $(window).resize(function() {
189         imageDimensions.galleryWidth = image.parent().width();
190         imageDimensions.galleryHeight = image.parent().height();
191     });
192     
193     function bounds(galleryWidth, galleryHeight, imageWidth, imageHeight) {
194         return {
195             maxX: 0,
196             maxY: 0,
197             minX: galleryWidth - imageWidth,
198             minY: galleryHeight - imageHeight
199         }
200     }
201     
202     function normalizePosition(x, y, galleryWidth, galleryHeight, imageWidth, imageHeight) {
203         var b = bounds(galleryWidth, galleryHeight, imageWidth, imageHeight);
204         return {
205             x: Math.min(b.maxX, Math.max(b.minX, x)),
206             y: Math.min(b.maxY, Math.max(b.minY, y))
207         }
208     }
209     
210     function onMouseMove(event) {
211         var position = normalizePosition(
212             event.clientX - origin.x + imageOrigin.left,
213             event.clientY - origin.y + imageOrigin.top, 
214             imageDimensions.galleryWidth,
215             imageDimensions.galleryHeight,
216             imageDimensions.width,
217             imageDimensions.height
218         );
219         image.css({position: 'absolute', top: position.y, left: position.x});
220         return false;
221     }
222     
223     function setZoom(factor) {
224         zoomFactor = factor;
225     }
226     
227     function zoom() {
228         imageDimensions.width = imageDimensions.originWidth * zoomFactor;
229         imageDimensions.height = imageDimensions.originHeight * zoomFactor;
230         var position = normalizePosition(
231             image.position().left,
232             image.position().top, 
233             imageDimensions.galleryWidth,
234             imageDimensions.galleryHeight,
235             imageDimensions.width,
236             imageDimensions.height
237         );
238         image.css({width: imageDimensions.width, height: imageDimensions.height,
239             left: position.x, top: position.y});
240
241     }
242     
243     function onMouseUp(event) {
244         $(document)
245             .unbind('mousemove.gallery')
246             .unbind('mouseup.gallery');
247         return false;
248     }
249     
250     image.bind('mousedown', function(event) {
251         origin = {
252             x: event.clientX,
253             y: event.clientY
254         };
255         imageOrigin = image.position();
256         $(document)
257             .bind('mousemove.gallery', onMouseMove)
258             .bind('mouseup.gallery', onMouseUp);
259         return false;
260     });
261     
262     function updateGallery(url) {
263         $.ajax({
264             url: url,
265             type: 'GET',
266             dataType: 'json',
267
268             success: function(data) {
269                 element.data('images', data);
270                 pn.val(1);
271                 pn.change();
272                 $('img', element).show();
273             },
274             
275             error: function(data) {
276                 element.data('images', []);
277                 pn.val(1);
278                 pn.change();
279                 $('img', element).hide();
280             }
281         });
282     }
283     
284     if (url) {
285         updateGallery(url);
286     }
287 }
288
289
290 function transform(editor) {
291     $.blockUI({message: 'Ładowanie...'});
292     setTimeout(function() {
293         xml2html({
294             xml: editor.getCode(),
295             success: function(element) {
296                 $('#html-view').html(element);
297                 $.unblockUI();
298             }, error: function(text) {
299                 $('#html-view').html('<p class="error">Wystąpił błąd:</p><pre>' + text + '</pre>');
300                 $.unblockUI();
301             }
302         });
303     }, 200);
304 };
305
306
307 function reverseTransform(editor, cont) {
308     var serializer = new XMLSerializer();
309     if ($('#html-view .error').length > 0) {
310         return;
311     }
312     $.blockUI({message: 'Ładowanie...'});
313     setTimeout(function() {
314         html2xml({
315             xml: serializer.serializeToString($('#html-view div').get(0)),
316             success: function(text) {
317                 editor.setCode(text);
318                 $.unblockUI();
319                 if (cont) {
320                     cont();
321                 }
322             }, error: function(text) {
323                 $('#source-editor').html('<p>Wystąpił błąd:</p><pre>' + text + '</pre>');
324                 $.unblockUI();
325             }
326         });
327     }, 200);
328 }
329
330
331 // =============
332 // = HTML View =
333 // =============
334 function html(element) {
335     var element = $(element);
336     
337     function selectTheme(themeId)
338     {
339         var selection = window.getSelection();
340         selection.removeAllRanges();
341
342         var range = document.createRange();
343         var s = $(".motyw[theme-class='"+themeId+"']")[0];
344         var e = $(".end[theme-class='"+themeId+"']")[0];
345
346         if(s && e) {
347             range.setStartAfter(s);
348             range.setEndBefore(e);
349             selection.addRange(range);
350         }
351     };
352     
353     function verifyTagInsertPoint(node) {
354         if(node.nodeType == 3) { // Text Node
355             node = node.parentNode;
356         }
357
358         if (node.nodeType != 1) { 
359             return false;
360         }
361
362         node = $(node);
363         var xtype = node.attr('x-node');
364
365         if (!xtype || (xtype.search(':') >= 0) ||
366             xtype == 'motyw' || xtype == 'begin' || xtype == 'end') {
367             return false;
368         }
369         
370         // don't allow themes inside annotations
371         if( node.is('*[x-annotation-box] *') )
372             return false;
373
374         return true;
375     }
376     
377     function addAnnotation()
378     {
379         var selection = window.getSelection();
380         var n = selection.rangeCount;
381
382         if (n == 0) {
383             window.alert("Nie zaznaczono żadnego obszaru");
384             return false;
385         }
386
387         // for now allow only 1 range
388         if (n > 1) {
389             window.alert("Zaznacz jeden obszar");
390             return false;
391         }
392
393         // remember the selected range
394         var range = selection.getRangeAt(0);
395
396         if (!verifyTagInsertPoint(range.endContainer)) {
397             window.alert("Nie można wstawić w to miejsce przypisu.");
398             return false;
399         }
400
401         var text = range.toString();
402         var tag = $('<span></span>');
403         range.collapse(false);
404         range.insertNode(tag[0]);
405
406         xml2html({
407             xml: '<pr><slowo_obce>'+text+'</slowo_obce> --- </pr>',
408             success: function(text) {
409                 var t = $(text);
410                 tag.replaceWith(t);
411                 openForEdit(t);
412             },
413             error: function() {
414                 tag.remove();
415                 alert('Błąd przy dodawaniu przypisu:' + errors);                
416             }
417         })
418     }
419     
420     function addTheme()
421     {
422         var selection = window.getSelection();
423         var n = selection.rangeCount;
424
425         if(n == 0) {
426             window.alert("Nie zaznaczono żadnego obszaru");
427             return false;
428         }
429
430         // for now allow only 1 range
431         if(n > 1) {
432             window.alert("Zaznacz jeden obszar");
433             return false;
434         }
435
436         // remember the selected range
437         var range = selection.getRangeAt(0);
438
439         // verify if the start/end points make even sense -
440         // they must be inside a x-node (otherwise they will be discarded)
441         // and the x-node must be a main text
442         if (!verifyTagInsertPoint(range.startContainer)) {
443             window.alert("Motyw nie może się zaczynać w tym miejscu.");
444             return false;
445         }
446
447         if (!verifyTagInsertPoint(range.endContainer)) {
448             window.alert("Motyw nie może się kończyć w tym miejscu.");
449             return false;
450         }
451
452         var date = (new Date()).getTime();
453         var random = Math.floor(4000000000*Math.random());
454         var id = (''+date) + '-' + (''+random);
455
456         var spoint = document.createRange();
457         var epoint = document.createRange();
458
459         spoint.setStart(range.startContainer, range.startOffset);
460         epoint.setStart(range.endContainer, range.endOffset);
461
462         var mtag, btag, etag, errors;
463
464         // insert theme-ref
465                 
466         xml2html({
467             xml: '<end id="e'+id+'" />',
468             success: function(text) {
469                 etag = $('<span></span>');
470                 epoint.insertNode(etag[0]);
471                 etag.replaceWith(text);
472                 xml2html({
473                     xml: '<motyw id="m'+id+'"></motyw>',
474                     success: function(text) {
475                         mtag = $('<span></span>');
476                         spoint.insertNode(mtag[0]);
477                         mtag.replaceWith(text);
478                         xml2html({
479                             xml: '<begin id="b'+id+'" />',
480                             success: function(text) {
481                                 btag = $('<span></span>');
482                                 spoint.insertNode(btag[0])
483                                 btag.replaceWith(text);
484                                 selection.removeAllRanges();
485                                 openForEdit($('.motyw[theme-class=' + id + ']'));
486                             }
487                         });
488                     }
489                 });
490             }
491         });
492     }
493     
494     function openForEdit($origin)
495     {       
496         var $box = null
497     
498         // annotations overlay their sub box - not their own box //
499         if($origin.is(".annotation-inline-box")) {
500             $box = $("*[x-annotation-box]", $origin);
501         } else {
502             $box = $origin;
503         }
504         
505         var x = $box[0].offsetLeft;
506         var y = $box[0].offsetTop;
507         var w = $box.outerWidth();
508         var h = $box.innerHeight();
509     
510         if ($origin.is(".annotation-inline-box")) {
511             w = Math.max(w, 400);
512             h = Math.max(h, 60);
513         }
514         
515         // start edition on this node
516         var $overlay = $('<div class="html-editarea"><button class="accept-button">Zapisz</button><button class="delete-button">Usuń</button><textarea></textarea></div>').css({
517             position: 'absolute',
518             height: h,
519             left: x,
520             top: y,
521             width: w
522         }).appendTo($box[0].offsetParent || $box.parent()).show();
523         
524         if ($origin.is('.motyw')) {
525             $('textarea', $overlay).autocomplete(THEMES, {
526                 autoFill: true,
527                 multiple: true,
528                 selectFirst: true
529             });
530         }
531         
532         $('.delete-button', $overlay).click(function() {
533             if ($origin.is('.motyw')) {
534                 $('[theme-class=' + $origin.attr('theme-class') + ']').remove();
535             } else {
536                 $origin.remove();
537             }
538             $overlay.remove();
539             $(document).unbind('click.blur-overlay');
540             return false;
541         })
542         
543         
544         var serializer = new XMLSerializer();
545         
546         html2xml({
547             xml: serializer.serializeToString($box[0]),
548             inner: true,
549             success: function(text) {
550                 $('textarea', $overlay).val($.trim(text));
551                 
552                 setTimeout(function() {
553                     $('textarea', $overlay).elastic().focus();
554                 }, 50);
555                 
556                 function save(argument) {
557                     var nodeName = $box.attr('x-node') || 'pe';
558                     xml2html({
559                         xml: '<' + nodeName + '>' + $('textarea', $overlay).val() + '</' + nodeName + '>',
560                         success: function(element) {
561                             $box.html($(element).html());
562                             $overlay.remove();
563                         },
564                         error: function(text) {
565                             $overlay.remove();
566                             alert('Błąd! ' + text);
567                         }
568                     })
569                 }
570                 
571                 $('.accept-button', $overlay).click(function() {
572                     save();
573                 });
574                 
575                 $(document).bind('click.blur-overlay', function(event) {
576                     if ($(event.target).parents('.html-editarea').length > 0) {
577                         return;
578                     }
579                     save();
580                     
581                     $(document).unbind('click.blur-overlay');
582                 });
583                 
584             }, error: function(text) {
585                 alert('Błąd! ' + text);
586             }
587         });
588     }
589     
590     $('.edit-button').live('click', function(event) {
591         event.preventDefault();
592         openForEdit($(this).parent());
593     });
594     
595
596     
597     var button = $('<button class="edit-button">Edytuj</button>');
598     $(element).bind('mousemove', function(event) {
599         var editable = $(event.target).closest('*[x-editable]');
600         $('.active[x-editable]', element).not(editable).removeClass('active').children('.edit-button').remove();
601         if (!editable.hasClass('active')) {
602             editable.addClass('active').append(button);
603         }
604     });
605
606     $('.motyw').live('click', function() {
607         selectTheme($(this).attr('theme-class'));
608     });
609     
610     $('#insert-annotation-button').click(function() {
611         addAnnotation();
612         return false;
613     });
614     
615     $('#insert-theme-button').click(function() {
616         addTheme();
617         return false;
618     });
619 }
620
621
622 $(function() {
623     gallery('#sidebar', $('#document-meta .gallery').html());
624     html('#html-view');
625     
626     CodeMirror.fromTextArea('id_text', {
627         parserfile: 'parsexml.js',
628         path: STATIC_URL + "js/lib/codemirror/",
629         stylesheet: STATIC_URL + "css/xmlcolors.css",
630         parserConfig: {
631             useHTMLKludges: false
632         },
633         iframeClass: 'xml-iframe',
634         textWrapping: true,
635         tabMode: 'spaces',
636         indentUnit: 0,
637         initCallback: function(editor) {
638             $('#save-button').click(function(event) {
639                 event.preventDefault();
640                 $.blockUI({message: $('#save-dialog')});
641             });
642             
643             $('#save-ok').click(function() {
644                 $.blockUI({message: 'Zapisywanie...'});
645                 
646                 function doSave (argument) {
647                     var metaComment = '<!--';
648                     $('#document-meta div').each(function() {
649                         metaComment += '\n\t' + $(this).attr('class') + ': ' + $(this).html();
650                     });
651                     metaComment += '\n-->'
652
653                     var data = {
654                         name: $('#document-name').html(),
655                         text: metaComment + editor.getCode(),
656                         revision: $('#document-revision').html(),
657                         author: 'annonymous',
658                         comment: $('#komentarz').val()
659                     };
660
661                     $.ajax({
662                         url: document.location.href,
663                         type: "POST",
664                         dataType: "json",
665                         data: data,                
666                         success: function(data) {
667                             if (data.text) {
668                                 editor.setCode(data.text);
669                                 $('#document-revision').html(data.revision);
670                             } else {
671                                 alert(data.errors);
672                             }
673                             $.unblockUI();
674                         },
675                         error: function(xhr, textStatus, errorThrown) {
676                             alert('error: ' + textStatus + ' ' + errorThrown);
677                         },
678                     })
679                 }
680                 
681                 if ($('#simple-view-tab').hasClass('active')) {
682                     reverseTransform(editor, doSave);
683                 } else {
684                     doSave();
685                 }
686             });
687             
688             $('#save-cancel').click(function() {
689                 $.unblockUI();
690             });
691
692             $('#simple-view-tab').click(function() {
693                 if ($(this).hasClass('active')) {
694                     return;
695                 }
696                 $(this).addClass('active');
697                 $('#source-view-tab').removeClass('active');
698                 $('#source-editor').hide();
699                 $('#simple-editor').show();
700                 transform(editor);
701             });
702
703             $('#source-view-tab').click(function() {
704                 if ($(this).hasClass('active')) {
705                     return;
706                 }
707                 $(this).addClass('active');
708                 $('#simple-view-tab').removeClass('active');
709                 $('#simple-editor').hide();
710                 $('#source-editor').show();
711                 reverseTransform(editor);
712             });
713
714             $('#source-editor .toolbar button').click(function(event) {
715                 event.preventDefault();
716                 var params = eval("(" + $(this).attr('ui:action-params') + ")");
717                 scriptletCenter.scriptlets[$(this).attr('ui:action')](editor, params);
718             });
719
720             $('.toolbar select').change(function() {
721                 var slug = $(this).val();
722
723                 $('.toolbar-buttons-container').hide().filter('[data-group=' + slug + ']').show();
724                 $(window).resize();
725             });
726
727             $('.toolbar-buttons-container').hide();
728             $('.toolbar select').change();
729
730             $('#simple-view-tab').click();
731         }
732     });
733     
734     $(window).resize(function() {
735         $('iframe').height($(window).height() - $('#tabs').outerHeight() - $('#source-editor .toolbar').outerHeight());
736     });
737     
738     $(window).resize();
739     
740     $('.vsplitbar').click(function() {
741         if ($('#sidebar').width() == 0) {
742             $('#sidebar').width(480).css({right: 0}).show();
743             $('#source-editor, #simple-editor').css({right: 495});
744             $('.vsplitbar').css({right: 480}).addClass('active');
745         } else {
746             $('#sidebar').width(0).hide();
747             $('#source-editor, #simple-editor').css({right: 15});
748             $('.vsplitbar').css({right: 0}).removeClass('active');
749         }
750         $(window).resize();
751     });
752                 
753
754 });