c7e0af862ca1173cdbd3a5267931a176fa7baae3
[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         $('.gallery-image 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 = $('.gallery-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: 60}, 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: 30}, 200);
158     });
159     $('.change-gallery-cancel', element).click(function() {
160         $('.gallery-image').animate({top: 30}, 200);
161     });
162     
163     $('.gallery-image 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() { $('.gallery-image 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                 $('.gallery-image img', element).show();
273             },
274             
275             error: function(data) {
276                 element.data('images', []);
277                 pn.val(1);
278                 pn.change();
279                 $('.gallery-image img', element).hide();
280             }
281         });
282     }
283     
284     if (url) {
285         updateGallery(url);
286     }
287 }
288
289
290 function transform(editor, callback) {
291     if (!callback) {
292         $.blockUI({message: 'Ładowanie...'});
293     }
294     setTimeout(function() {
295         xml2html({
296             xml: editor.getCode(),
297             success: function(element) {
298                 $('#html-view').html(element);
299                 $.unblockUI();
300                 if (callback) {
301                     callback();
302                 }
303             }, error: function(text) {
304                                 var message = $('<pre></pre>');
305                                 message.text(text);
306                 $('#html-view').html('<p class="error">Wystąpił błąd:</p><pre>' + 
307                                     message.html() + '</pre>');
308                                         
309                 $.unblockUI();
310                 if (callback) {
311                     callback();
312                 }
313             }
314         });
315     }, 200);
316 };
317
318
319 function reverseTransform(editor, cont, errorCont, dontBlock) {
320     var serializer = new XMLSerializer();
321     if ($('#html-view .error').length > 0) {
322         if (errorCont) {
323             errorCont();
324         }
325         return;
326     }
327     if (!dontBlock) {
328         $.blockUI({message: 'Ładowanie...'});
329     }
330     setTimeout(function() {
331         html2xml({
332             xml: serializer.serializeToString($('#html-view div').get(0)),
333             success: function(text) {
334                 editor.setCode(text);
335                 if (!dontBlock) {
336                     $.unblockUI();
337                 }
338                 if (cont) {
339                     cont();
340                 }
341             }, error: function(text) {
342                 $('#source-editor').html('<p>Wystąpił błąd:</p><pre>' + text + '</pre>');
343                 if (!dontBlock) {
344                     $.unblockUI();
345                 }
346                 if (errorCont) {
347                     errorCont();
348                 }
349             }
350         });
351     }, 200);
352 }
353
354
355 // =============
356 // = HTML View =
357 // =============
358 function html(element) {
359     var element = $(element);
360     
361     function selectTheme(themeId)
362     {
363         var selection = window.getSelection();
364         selection.removeAllRanges();
365
366         var range = document.createRange();
367         var s = $(".motyw[theme-class='"+themeId+"']")[0];
368         var e = $(".end[theme-class='"+themeId+"']")[0];
369
370         if(s && e) {
371             range.setStartAfter(s);
372             range.setEndBefore(e);
373             selection.addRange(range);
374         }
375     };
376     
377     function verifyTagInsertPoint(node) {
378         if(node.nodeType == 3) { // Text Node
379             node = node.parentNode;
380         }
381
382         if (node.nodeType != 1) { 
383             return false;
384         }
385
386         node = $(node);
387         var xtype = node.attr('x-node');
388
389         if (!xtype || (xtype.search(':') >= 0) ||
390             xtype == 'motyw' || xtype == 'begin' || xtype == 'end') {
391             return false;
392         }
393         
394         // don't allow themes inside annotations
395         if( node.is('*[x-annotation-box] *') )
396             return false;
397
398         return true;
399     }
400         
401         var ANNOT_ALLOWED = ['wyroznienie'];
402         
403         function html2plainText(fragment) {
404                 var text = "";
405                 
406                 $(fragment.childNodes).each(function() {
407                         if(this.nodeType == 3) // textNode
408                             text += this.nodeValue;
409                         else if (this.nodeType == 1 
410                             && $.inArray($(this).attr('x-node'), ANNOT_ALLOWED) != -1 ){
411                                 text += html2plainText(this);                           
412                         }                       
413                 });
414                 
415                 return text;            
416         }
417     
418     function addAnnotation()
419     {
420         var selection = window.getSelection();
421         var n = selection.rangeCount;
422
423         if (n == 0) {
424             window.alert("Nie zaznaczono żadnego obszaru");
425             return false;
426         }
427
428         // for now allow only 1 range
429         if (n > 1) {
430             window.alert("Zaznacz jeden obszar");
431             return false;
432         }
433
434         // remember the selected range
435         var range = selection.getRangeAt(0);
436
437         if (!verifyTagInsertPoint(range.endContainer)) {
438             window.alert("Nie można wstawić w to miejsce przypisu.");
439             return false;
440         }
441
442                 // BUG #273 - selected text can contain themes, which should be omited from
443                 // defining term
444         var text = html2plainText( range.cloneContents() ); 
445                 
446         var tag = $('<span></span>');
447         range.collapse(false);
448         range.insertNode(tag[0]);
449
450         xml2html({
451             xml: '<pr><slowo_obce>'+text+'</slowo_obce> --- </pr>',
452             success: function(text) {
453                 var t = $(text);
454                 tag.replaceWith(t);
455                 openForEdit(t);
456             },
457             error: function() {
458                 tag.remove();
459                 alert('Błąd przy dodawaniu przypisu:' + errors);                
460             }
461         })
462     }
463     
464     function addTheme()
465     {
466         var selection = window.getSelection();
467         var n = selection.rangeCount;
468
469         if(n == 0) {
470             window.alert("Nie zaznaczono żadnego obszaru");
471             return false;
472         }
473
474         // for now allow only 1 range
475         if(n > 1) {
476             window.alert("Zaznacz jeden obszar");
477             return false;
478         }
479
480         // remember the selected range
481         var range = selection.getRangeAt(0);
482
483         // verify if the start/end points make even sense -
484         // they must be inside a x-node (otherwise they will be discarded)
485         // and the x-node must be a main text
486         if (!verifyTagInsertPoint(range.startContainer)) {
487             window.alert("Motyw nie może się zaczynać w tym miejscu.");
488             return false;
489         }
490
491         if (!verifyTagInsertPoint(range.endContainer)) {
492             window.alert("Motyw nie może się kończyć w tym miejscu.");
493             return false;
494         }
495
496         var date = (new Date()).getTime();
497         var random = Math.floor(4000000000*Math.random());
498         var id = (''+date) + '-' + (''+random);
499
500         var spoint = document.createRange();
501         var epoint = document.createRange();
502
503         spoint.setStart(range.startContainer, range.startOffset);
504         epoint.setStart(range.endContainer, range.endOffset);
505
506         var mtag, btag, etag, errors;
507
508         // insert theme-ref
509                 
510         xml2html({
511             xml: '<end id="e'+id+'" />',
512             success: function(text) {
513                 etag = $('<span></span>');
514                 epoint.insertNode(etag[0]);
515                 etag.replaceWith(text);
516                 xml2html({
517                     xml: '<motyw id="m'+id+'"></motyw>',
518                     success: function(text) {
519                         mtag = $('<span></span>');
520                         spoint.insertNode(mtag[0]);
521                         mtag.replaceWith(text);
522                         xml2html({
523                             xml: '<begin id="b'+id+'" />',
524                             success: function(text) {
525                                 btag = $('<span></span>');
526                                 spoint.insertNode(btag[0])
527                                 btag.replaceWith(text);
528                                 selection.removeAllRanges();
529                                 openForEdit($('.motyw[theme-class=' + id + ']'));
530                             }
531                         });
532                     }
533                 });
534             }
535         });
536     }
537     
538     function openForEdit($origin)
539     {       
540         var $box = null
541     
542         // annotations overlay their sub box - not their own box //
543         if($origin.is(".annotation-inline-box")) {
544             $box = $("*[x-annotation-box]", $origin);
545         } else {
546             $box = $origin;
547         }
548         
549         var x = $box[0].offsetLeft;
550         var y = $box[0].offsetTop;
551         var w = $box.outerWidth();
552         var h = $box.innerHeight();
553     
554         if ($origin.is(".annotation-inline-box")) {
555             w = Math.max(w, 400);
556             h = Math.max(h, 60);
557         }
558         
559         // start edition on this node
560         var $overlay = $('<div class="html-editarea"><button class="accept-button">Zapisz</button><button class="delete-button">Usuń</button><textarea></textarea></div>').css({
561             position: 'absolute',
562             height: h,
563             left: x,
564             top: y,
565             width: w
566         }).appendTo($box[0].offsetParent || $box.parent()).show();
567         
568         if ($origin.is('.motyw')) {
569             $('textarea', $overlay).autocomplete(THEMES, {
570                 autoFill: true,
571                 multiple: true,
572                 selectFirst: true
573             });
574         }
575         
576         $('.delete-button', $overlay).click(function() {
577             if ($origin.is('.motyw')) {
578                 $('[theme-class=' + $origin.attr('theme-class') + ']').remove();
579             } else {
580                 $origin.remove();
581             }
582             $overlay.remove();
583             $(document).unbind('click.blur-overlay');
584             return false;
585         })
586         
587         
588         var serializer = new XMLSerializer();
589         
590         html2xml({
591             xml: serializer.serializeToString($box[0]),
592             inner: true,
593             success: function(text) {
594                 $('textarea', $overlay).val($.trim(text));
595                 
596                 setTimeout(function() {
597                     $('textarea', $overlay).elastic().focus();
598                 }, 50);
599                 
600                 function save(argument) {
601                     var nodeName = $box.attr('x-node') || 'pe';
602                     xml2html({
603                         xml: '<' + nodeName + '>' + $('textarea', $overlay).val() + '</' + nodeName + '>',
604                         success: function(element) {
605                             $box.html($(element).html());
606                             $overlay.remove();
607                         },
608                         error: function(text) {
609                             $overlay.remove();
610                             alert('Błąd! ' + text);
611                         }
612                     })
613                 }
614                 
615                 $('.accept-button', $overlay).click(function() {
616                     save();
617                 });
618                 
619                 $(document).bind('click.blur-overlay', function(event) {
620                     if ($(event.target).parents('.html-editarea').length > 0) {
621                         return;
622                     }
623                     save();
624                     
625                     $(document).unbind('click.blur-overlay');
626                 });
627                 
628             }, error: function(text) {
629                 alert('Błąd! ' + text);
630             }
631         });
632     }
633     
634     $('.edit-button').live('click', function(event) {
635         event.preventDefault();
636         openForEdit($(this).parent());
637     });
638     
639
640     
641     var button = $('<button class="edit-button">Edytuj</button>');
642     $(element).bind('mousemove', function(event) {
643         var editable = $(event.target).closest('*[x-editable]');
644         $('.active[x-editable]', element).not(editable).removeClass('active').children('.edit-button').remove();
645         if (!editable.hasClass('active')) {
646             editable.addClass('active').append(button);
647         }
648     });
649
650     $('.motyw').live('click', function() {
651         selectTheme($(this).attr('theme-class'));
652     });
653     
654     $('#insert-annotation-button').click(function() {
655         addAnnotation();
656         return false;
657     });
658     
659     $('#insert-theme-button').click(function() {
660         addTheme();
661         return false;
662     });
663 }
664
665
666 $(function() {
667     gallery('#sidebar', $('#document-meta .gallery').html());
668     html('#html-view');
669     
670     CodeMirror.fromTextArea('id_text', {
671         parserfile: 'parsexml.js',
672         path: STATIC_URL + "js/lib/codemirror/",
673         stylesheet: STATIC_URL + "css/xmlcolors.css",
674         parserConfig: {
675             useHTMLKludges: false
676         },
677         iframeClass: 'xml-iframe',
678         textWrapping: true,
679         tabMode: 'spaces',
680         indentUnit: 0,
681         initCallback: function(editor) {
682             $('#save-button').click(function(event) {
683                 event.preventDefault();
684                 $.blockUI({message: $('#save-dialog')});
685             });
686             
687             $('#save-ok').click(function() {
688                 $.blockUI({message: 'Zapisywanie...'});
689                 
690                 function doSave (argument) {
691                     var metaComment = '<!--';
692                     $('#document-meta div').each(function() {
693                         metaComment += '\n\t' + $(this).attr('class') + ': ' + $(this).html();
694                     });
695                     metaComment += '\n-->'
696
697                     var data = {
698                         name: $('#document-name').html(),
699                         text: metaComment + editor.getCode(),
700                         revision: $('#document-revision').html(),
701                         author: $('#username').html() || 'annonymous',
702                         comment: $('#komentarz').val()
703                     };
704
705                     $.ajax({
706                         url: document.location.href,
707                         type: "POST",
708                         dataType: "json",
709                         data: data,                
710                         success: function(data) {
711                             if (data.text) {
712                                 editor.setCode(data.text);
713                                 $('#document-revision').html(data.revision);
714                             } else {
715                                 alert(data.errors);
716                             }
717                             $.unblockUI();
718                         },
719                         error: function(xhr, textStatus, errorThrown) {
720                             alert('error: ' + textStatus + ' ' + errorThrown);
721                         },
722                     })
723                 }
724                 
725                 if ($('#simple-view-tab').hasClass('active')) {
726                     reverseTransform(editor, doSave);
727                 } else {
728                     doSave();
729                 }
730             });
731             
732             $('#save-cancel').click(function() {
733                 $.unblockUI();
734             });
735             
736             function changeTab(callback) {
737                 if ($('#simple-view-tab').hasClass('active')) {
738                     return;
739                 }
740                 $('#simple-view-tab').addClass('active');
741                 $('#source-view-tab').removeClass('active');
742                 $('#source-editor').hide();
743                 $('#simple-editor').show();
744                 transform(editor, callback);
745             }        
746             $('#simple-view-tab').click(function() { changeTab(); });
747             
748             $('#source-view-tab').click(function() { 
749                 if ($(this).hasClass('active')) {
750                     return;
751                 }
752                 $(this).addClass('active');
753                 $('#simple-view-tab').removeClass('active');
754                 $('#simple-editor').hide();
755                 $('#source-editor').show();
756                 reverseTransform(editor);    
757             });
758
759             $('#source-editor .toolbar button').click(function(event) {
760                 event.preventDefault();
761                 var params = eval("(" + $(this).attr('ui:action-params') + ")");
762                 scriptletCenter.scriptlets[$(this).attr('ui:action')](editor, params);
763             });
764
765             $('.toolbar select').change(function() {
766                 var slug = $(this).val();
767
768                 $('.toolbar-buttons-container').hide().filter('[data-group=' + slug + ']').show();
769                 $(window).resize();
770             });
771
772             $('.toolbar-buttons-container').hide();
773             $('.toolbar select').change();
774
775             changeTab(function() { $('#loading-overlay').fadeOut() }, function() { $('#loading-overlay').fadeOut() }, true)
776         }
777     });
778     
779     $(window).resize(function() {
780         $('iframe').height($(window).height() - $('#tabs').outerHeight() - $('#source-editor .toolbar').outerHeight());
781     });
782     
783     $(window).resize();
784     
785     $('.vsplitbar').click(function() {
786         if ($('#sidebar').width() == 0) {
787             $('#sidebar').width(480).css({right: 0}).show();
788             $('#source-editor, #simple-editor').css({right: 495});
789             $('.vsplitbar').css({right: 480}).addClass('active');
790         } else {
791             $('#sidebar').width(0).hide();
792             $('#source-editor, #simple-editor').css({right: 15});
793             $('.vsplitbar').css({right: 0}).removeClass('active');
794         }
795         $(window).resize();
796     });
797                 
798
799 });