a044b87d403294a8a7de081278903d4cc3697632
[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                         htmlElement: $('#html-view div').get(0),
333             /* xml: serializer.serializeToString($('#html-view div').get(0)), */
334             success: function(text) {
335                 editor.setCode(text);
336                 if (!dontBlock) {
337                     $.unblockUI();
338                 }
339                 if (cont) {
340                     cont();
341                 }
342             }, error: function(text) {
343                 $('#source-editor').html('<p>Wystąpił błąd:</p><pre>' + text + '</pre>');
344                 if (!dontBlock) {
345                     $.unblockUI();
346                 }
347                 if (errorCont) {
348                     errorCont();
349                 }
350             }
351         });
352     }, 200);
353 }
354
355
356 // =============
357 // = HTML View =
358 // =============
359 function html(element) {
360     var element = $(element);
361     
362     function selectTheme(themeId)
363     {
364         var selection = window.getSelection();
365         selection.removeAllRanges();
366
367         var range = document.createRange();
368         var s = $(".motyw[theme-class='"+themeId+"']")[0];
369         var e = $(".end[theme-class='"+themeId+"']")[0];
370
371         if(s && e) {
372             range.setStartAfter(s);
373             range.setEndBefore(e);
374             selection.addRange(range);
375         }
376     };
377     
378     function verifyTagInsertPoint(node) {
379         if(node.nodeType == 3) { // Text Node
380             node = node.parentNode;
381         }
382
383         if (node.nodeType != 1) { 
384             return false;
385         }
386
387         node = $(node);
388         var xtype = node.attr('x-node');
389
390         if (!xtype || (xtype.search(':') >= 0) ||
391             xtype == 'motyw' || xtype == 'begin' || xtype == 'end') {
392             return false;
393         }
394         
395         // don't allow themes inside annotations
396         if( node.is('*[x-annotation-box] *') )
397             return false;
398
399         return true;
400     }
401         
402         var ANNOT_ALLOWED = ['wyroznienie'];
403         
404         function html2plainText(fragment) {
405                 var text = "";
406                 
407                 $(fragment.childNodes).each(function() {
408                         if(this.nodeType == 3) // textNode
409                             text += this.nodeValue;
410                         else if (this.nodeType == 1 
411                             && $.inArray($(this).attr('x-node'), ANNOT_ALLOWED) != -1 ){
412                                 text += html2plainText(this);                           
413                         }                       
414                 });
415                 
416                 return text;            
417         }
418     
419     function addAnnotation()
420     {
421         var selection = window.getSelection();
422         var n = selection.rangeCount;
423
424         if (n == 0) {
425             window.alert("Nie zaznaczono żadnego obszaru");
426             return false;
427         }
428
429         // for now allow only 1 range
430         if (n > 1) {
431             window.alert("Zaznacz jeden obszar");
432             return false;
433         }
434
435         // remember the selected range
436         var range = selection.getRangeAt(0);
437
438         if (!verifyTagInsertPoint(range.endContainer)) {
439             window.alert("Nie można wstawić w to miejsce przypisu.");
440             return false;
441         }
442
443                 // BUG #273 - selected text can contain themes, which should be omited from
444                 // defining term
445         var text = html2plainText( range.cloneContents() ); 
446                 
447         var tag = $('<span></span>');
448         range.collapse(false);
449         range.insertNode(tag[0]);
450
451         xml2html({
452             xml: '<pr><slowo_obce>'+text+'</slowo_obce> --- </pr>',
453             success: function(text) {
454                 var t = $(text);
455                 tag.replaceWith(t);
456                 openForEdit(t);
457             },
458             error: function() {
459                 tag.remove();
460                 alert('Błąd przy dodawaniu przypisu:' + errors);                
461             }
462         })
463     }
464     
465     function addTheme()
466     {
467         var selection = window.getSelection();
468         var n = selection.rangeCount;
469
470         if(n == 0) {
471             window.alert("Nie zaznaczono żadnego obszaru");
472             return false;
473         }
474
475         // for now allow only 1 range
476         if(n > 1) {
477             window.alert("Zaznacz jeden obszar.");
478             return false;
479         }
480                  
481
482         // remember the selected range
483         var range = selection.getRangeAt(0);
484                 
485                 
486                 if( $(range.startContainer).is('.html-editarea') 
487                  || $(range.endContainer).is('.html-editarea') ) {
488                         window.alert("Motywy można oznaczać tylko na tekście nie otwartym do edycji. \n Zamknij edytowany fragment i spróbuj ponownie.");
489             return false;
490                  }               
491
492         // verify if the start/end points make even sense -
493         // they must be inside a x-node (otherwise they will be discarded)
494         // and the x-node must be a main text
495         if (!verifyTagInsertPoint(range.startContainer)) {
496             window.alert("Motyw nie może się zaczynać w tym miejscu.");
497             return false;
498         }
499
500         if (!verifyTagInsertPoint(range.endContainer)) {
501             window.alert("Motyw nie może się kończyć w tym miejscu.");
502             return false;
503         }
504
505         var date = (new Date()).getTime();
506         var random = Math.floor(4000000000*Math.random());
507         var id = (''+date) + '-' + (''+random);
508
509         var spoint = document.createRange();
510         var epoint = document.createRange();
511
512         spoint.setStart(range.startContainer, range.startOffset);
513         epoint.setStart(range.endContainer, range.endOffset);
514
515         var mtag, btag, etag, errors;
516
517         // insert theme-ref
518                 
519         xml2html({
520             xml: '<end id="e'+id+'" />',
521             success: function(text) {
522                 etag = $('<span></span>');
523                 epoint.insertNode(etag[0]);
524                 etag.replaceWith(text);
525                 xml2html({
526                     xml: '<motyw id="m'+id+'"></motyw>',
527                     success: function(text) {                                           
528                         mtag = $('<span></span>');
529                         spoint.insertNode(mtag[0]);
530                         mtag.replaceWith(text);
531                         xml2html({
532                             xml: '<begin id="b'+id+'" />',
533                             success: function(text) {
534                                 btag = $('<span></span>');
535                                 spoint.insertNode(btag[0])
536                                 btag.replaceWith(text);
537                                 selection.removeAllRanges();
538                                 openForEdit($('.motyw[theme-class=' + id + ']'));
539                             }
540                         });
541                     }
542                 });
543             }
544         });
545     }
546     
547     function openForEdit($origin)
548     {       
549         var $box = null
550     
551         // annotations overlay their sub box - not their own box //
552         if($origin.is(".annotation-inline-box")) {
553             $box = $("*[x-annotation-box]", $origin);
554         } else {
555             $box = $origin;
556         }
557         
558         var x = $box[0].offsetLeft;
559         var y = $box[0].offsetTop;
560         var w = $box.outerWidth();
561         var h = $box.innerHeight();
562     
563         if ($origin.is(".annotation-inline-box")) {
564             w = Math.max(w, 400);
565             h = Math.max(h, 60);
566         }
567         
568         // start edition on this node
569         var $overlay = $('<div class="html-editarea"><button class="accept-button">Zapisz</button><button class="delete-button">Usuń</button><textarea></textarea></div>').css({
570             position: 'absolute',
571             height: h,
572             left: x,
573             top: y,
574             width: w
575         }).appendTo($box[0].offsetParent || $box.parent()).show();
576         
577         if ($origin.is('.motyw')) {
578             $('textarea', $overlay).autocomplete(THEMES, {
579                 autoFill: true,
580                 multiple: true,
581                 selectFirst: true
582             });
583         }
584         
585         $('.delete-button', $overlay).click(function() {
586             if ($origin.is('.motyw')) {
587                 $('[theme-class=' + $origin.attr('theme-class') + ']').remove();
588             } else {
589                 $origin.remove();
590             }
591             $overlay.remove();
592             $(document).unbind('click.blur-overlay');
593             return false;
594         })
595         
596         
597         var serializer = new XMLSerializer();
598         
599         html2xml({
600             xml: serializer.serializeToString($box[0]),
601             inner: true,
602             success: function(text) {
603                 $('textarea', $overlay).val($.trim(text));
604                 
605                 setTimeout(function() {
606                     $('textarea', $overlay).elastic().focus();
607                 }, 50);
608                 
609                 function save(argument) {
610                     var nodeName = $box.attr('x-node') || 'pe';
611                                         var insertedText = $('textarea', $overlay).val();
612                                         
613                                         if ($origin.is('.motyw')) {
614                                                 insertedText = insertedText.replace(/,\s*$/, '');
615                                         }
616                                         
617                     xml2html({
618                         xml: '<' + nodeName + '>' + insertedText + '</' + nodeName + '>',
619                         success: function(element) {
620                             $box.html($(element).html());
621                             $overlay.remove();
622                         },
623                         error: function(text) {
624                             $overlay.remove();
625                             alert('Błąd! ' + text);
626                         }
627                     })
628                 }
629                 
630                 $('.accept-button', $overlay).click(function() {
631                     save();
632                 });
633                 
634                 $(document).bind('click.blur-overlay', function(event) {
635                     if ($(event.target).parents('.html-editarea').length > 0) {
636                         return;
637                     }
638                     save();
639                     
640                     $(document).unbind('click.blur-overlay');
641                 });
642                 
643             }, error: function(text) {
644                 alert('Błąd! ' + text);
645             }
646         });
647     }
648     
649     $('.edit-button').live('click', function(event) {
650         event.preventDefault();
651         openForEdit($(this).parent());
652     });
653     
654
655     
656     var button = $('<button class="edit-button">Edytuj</button>');
657     $(element).bind('mousemove', function(event) {
658         var editable = $(event.target).closest('*[x-editable]');
659         $('.active[x-editable]', element).not(editable).removeClass('active').children('.edit-button').remove();
660         if (!editable.hasClass('active')) {
661             editable.addClass('active').append(button);
662         }
663         if (editable.is('.annotation-inline-box')) {
664             $('*[x-annotation-box]', editable)
665                 .css({width: 300, position: 'absolute', left: event.clientX - editable.offset().left + 5, top: event.clientY - editable.offset().top + 5})
666                 .show();
667         } else {
668             $('*[x-annotation-box]').hide();
669         }
670     });
671
672     $('.motyw').live('click', function() {
673         selectTheme($(this).attr('theme-class'));
674     });
675     
676     $('#insert-annotation-button').click(function() {
677         addAnnotation();
678         return false;
679     });
680     
681     $('#insert-theme-button').click(function() {
682         addTheme();
683         return false;
684     });
685 }
686
687 /*
688  * History
689  */
690
691 function refreshHistory(callback){
692         $.blockUI({
693                 message: 'Odświeżanie historii...'
694         });
695         
696         $.ajax({
697                 url: document.location.href + '/history',
698         dataType: 'json',
699                 error: function() {
700                         $('#history-view .message-box').html('Nie udało się odświeżyć historii').show();
701                         $.unblockUI();          
702                 },
703                 success: function(data) {
704                         $('#history-view .message-box').hide();
705                         var changes_list = $('#changes-list');
706                         changes_list.html('');
707                         
708                         $.each(data, function() {
709                                 var val = this[0];
710                                 changes_list.append('<tr>'
711                                         +'<td><input type="radio" name="rev_from" value="'+val+'">'
712                                                 + '<input type="radio" name="rev_to" value="'+val+'">'
713                                         +'<td>'+ this[0]+'</td>'
714                                         +'<td>'+ this[3]+'</td>'
715                                         +'<td>'+ this[2]+'</td>'
716                                         +'<td>'+ this[1]+'</td></tr>')                  
717                         });                                                     
718                         $.unblockUI();  
719                         callback();
720                 }
721         });
722 };
723
724 function historyDiff(callback) {
725         var changelist = $('#changes-list');
726         var rev_a = $("input[name='rev_from']:checked", changelist);
727         var rev_b = $("input[name='rev_to']:checked", changelist);
728         
729         if (rev_a.length != 1 || rev_b.length != 1) {
730                 window.alert("Musisz zaznaczyć dwie wersje do porównania.");
731                 return false;
732         }
733         
734         if (rev_a.val() == rev_b.val()) {
735                 window.alert("Musisz zaznaczyć dwie różne wersje do porównania.");
736                 return false;
737         }
738                         
739         $.blockUI({
740                 message: 'Wczytywanie porównania...'
741         });
742         
743         $.ajax({
744                 url: document.location.href + '/diff/'+rev_a.val() + '/'+ rev_b.val(),
745         dataType: 'html',
746                 error: function() {
747                         $.unblockUI();
748                         window.alert('Nie udało się wykonać porównania :(.')                                        
749                 },
750                 success: function(data) {
751                         $.unblockUI();                  
752                         var diffview = $('#diff-view');                 
753                         diffview.html(data);
754                         diffview.show();                                                        
755                 }
756         });
757 }
758         
759
760 $(function() {
761     gallery('#sidebar', $('#document-meta .gallery').html());
762     html('#html-view');
763     
764     CodeMirror.fromTextArea('id_text', {
765         parserfile: 'parsexml.js',
766         path: STATIC_URL + "js/lib/codemirror/",
767         stylesheet: STATIC_URL + "css/xmlcolors.css",
768         parserConfig: {
769             useHTMLKludges: false
770         },
771         iframeClass: 'xml-iframe',
772         textWrapping: true,
773                 /* lineNumbers: true, */
774         tabMode: 'spaces',
775         indentUnit: 0,
776         initCallback: function(editor) {
777             $('#save-button').click(function(event) {
778                 event.preventDefault();
779                 $.blockUI({message: $('#save-dialog')});
780             });
781             
782             $('#save-ok').click(function() {
783                 $.blockUI({message: 'Zapisywanie...'});
784                 
785                 function doSave (argument) {
786                     var metaComment = '<!--';
787                     $('#document-meta div').each(function() {
788                         metaComment += '\n\t' + $(this).attr('class') + ': ' + $(this).html();
789                     });
790                     metaComment += '\n-->'
791
792                     var data = {
793                         name: $('#document-name').html(),
794                         text: metaComment + editor.getCode(),
795                         revision: $('#document-revision').html(),
796                         author: $('#username').html() || 'annonymous',
797                         comment: $('#komentarz').val()
798                     };
799
800                     $.ajax({
801                         url: document.location.href,
802                         type: "POST",
803                         dataType: "json",
804                         data: data,                
805                         success: function(data) {
806                             if (data.text) {
807                                 editor.setCode(data.text);
808                                 $('#document-revision').html(data.revision);
809                             } else {
810                                 alert(data.errors);
811                             }
812                             $.unblockUI();
813                         },
814                         error: function(xhr, textStatus, errorThrown) {
815                             alert('error: ' + textStatus + ' ' + errorThrown);
816                         },
817                     })
818                 }
819                 
820                 if ($('#simple-view-tab').hasClass('active')) {
821                     reverseTransform(editor, doSave);
822                 } else {
823                     doSave();
824                 }
825             });
826             
827             $('#save-cancel').click(function() {
828                 $.unblockUI();
829             });
830                                 
831             var tabs = $('ol#tabs li');
832                         
833                         tabs.click(function(event, callback) {
834                                 tabs.removeClass('active');
835                                 $('.editor').hide();
836                                 $(this).addClass('active');
837                                 $('#' + $(this).attr('ui:related')).show();                             
838                                 $(this).trigger('wl:tabload', callback);                                                                
839                         });     
840                         
841                         
842             $('#simple-view-tab').bind('wl:tabload', function(event, callback) {
843                 transform(editor, callback);
844             });
845                         
846                         $('#source-view-tab').bind('wl:tabload', function(event, callback) {
847                 reverseTransform(editor, callback);
848             });                                 
849                         
850                         $('#history-view-tab').bind('wl:tabload', function(event, callback) {
851                                 refreshHistory(callback);                                                               
852                         }); 
853                         
854                         $('#make-diff-button').click(historyDiff);
855
856             $('#source-editor .toolbar button').click(function(event) {
857                 event.preventDefault();
858                 var params = eval("(" + $(this).attr('ui:action-params') + ")");
859                 scriptletCenter.scriptlets[$(this).attr('ui:action')](editor, params);
860             });                 
861
862             $('.toolbar select').change(function(event) {
863                 var slug = $(this).val();
864
865                 $('.toolbar-buttons-container').hide().filter('[data-group=' + slug + ']').show();
866                 $(window).resize();
867             });
868
869             $('.toolbar-buttons-container').hide();
870             $('.toolbar select').change();
871
872                         
873                         $('#simple-view-tab').trigger('click', 
874                                 function() { 
875                                         $('#loading-overlay').fadeOut();
876                                         return false; 
877                                 });            
878         }
879     });
880     
881     $(window).resize(function() {
882         $('iframe').height($(window).height() - $('#tabs').outerHeight() - $('#source-editor .toolbar').outerHeight());
883     });
884     
885     $(window).resize();
886     
887     $('.vsplitbar').click(function() {
888         if ($('#sidebar').width() == 0) {
889             $('#sidebar').width(480).css({right: 0}).show();
890             $('#source-editor, #simple-editor').css({right: 495});
891             $('.vsplitbar').css({right: 480}).addClass('active');
892         } else {
893             $('#sidebar').width(0).hide();
894             $('#source-editor, #simple-editor').css({right: 15});
895             $('.vsplitbar').css({right: 0}).removeClass('active');
896         }
897         $(window).resize();
898     });
899                 
900
901 });