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']
59 function highlight(colour) {
61 if (window.getSelection) {
63 sel = window.getSelection();
65 range = sel.getRangeAt(0);
67 document.designMode = "on";
69 sel.removeAllRanges();
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);
76 document.designMode = "off";
77 } else if (document.selection && document.selection.createRange) {
79 range = document.selection.createRange();
80 range.execCommand("BackColor", false, colour);
84 // function unselectThemes(themeId) {
85 // $('.Apple-style-span').each(function() {
86 // $(this).after($(this).html());
91 function gallery(element, url) {
92 var element = $(element);
93 var imageDimensions = {};
94 element.data('images', []);
96 function changePage(pageNumber) {
97 $('img', element).attr('src', element.data('images')[pageNumber - 1]);
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);
105 if (!pageNumber || pageNumber == NaN || pageNumber == Infinity || pageNumber == -Infinity) {
107 } else if (pageNumber < 1) {
109 } else if (pageNumber > pageCount) {
116 var pn = $('.page-number', element);
117 pn.change(function(event) {
118 event.preventDefault();
119 var n = normalizeNumber(pn.val());
123 $('.previous-page', element).click(function() {
124 pn.val(normalizeNumber(pn.val()) - 1);
127 $('.next-page', element).click(function() {
128 pn.val(normalizeNumber(pn.val()) + 1);
133 var image = $('img', element).attr('unselectable', 'on');
135 var imageOrigin = {};
138 $('.zoom-in', element).click(function() {
139 zoomFactor = Math.min(2, zoomFactor + 0.2);
142 $('.zoom-out', element).click(function() {
143 zoomFactor = Math.max(0.2, zoomFactor - 0.2);
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();
151 $('.change-gallery-ok', element).click(function() {
152 if ($('#document-meta .gallery').length == 0) {
153 $('<div class="gallery"></div>').appendTo('#document-meta');
155 $('#document-meta .gallery').html($('.chosen-gallery').val());
156 updateGallery($('.chosen-gallery').val());
157 $('.gallery-image').animate({top: 27}, 200);
159 $('.change-gallery-cancel', element).click(function() {
160 $('.gallery-image').animate({top: 27}, 200);
163 $('img', element).load(function() {
164 image.css({width: null, height: null});
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()
174 if (!(imageDimensions.width && imageDimensions.height)) {
175 setTimeout(function() { $('img', element).load(); }, 100);
177 var position = normalizePosition(
178 image.position().left,
179 image.position().top,
180 imageDimensions.galleryWidth,
181 imageDimensions.galleryHeight,
182 imageDimensions.width,
183 imageDimensions.height
185 image.css({left: position.x, top: position.y, width: $(this).width() * zoomFactor, height: $(this).height() * zoomFactor});
188 $(window).resize(function() {
189 imageDimensions.galleryWidth = image.parent().width();
190 imageDimensions.galleryHeight = image.parent().height();
193 function bounds(galleryWidth, galleryHeight, imageWidth, imageHeight) {
197 minX: galleryWidth - imageWidth,
198 minY: galleryHeight - imageHeight
202 function normalizePosition(x, y, galleryWidth, galleryHeight, imageWidth, imageHeight) {
203 var b = bounds(galleryWidth, galleryHeight, imageWidth, imageHeight);
205 x: Math.min(b.maxX, Math.max(b.minX, x)),
206 y: Math.min(b.maxY, Math.max(b.minY, y))
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
219 image.css({position: 'absolute', top: position.y, left: position.x});
223 function setZoom(factor) {
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
238 image.css({width: imageDimensions.width, height: imageDimensions.height,
239 left: position.x, top: position.y});
243 function onMouseUp(event) {
245 .unbind('mousemove.gallery')
246 .unbind('mouseup.gallery');
250 image.bind('mousedown', function(event) {
255 imageOrigin = image.position();
257 .bind('mousemove.gallery', onMouseMove)
258 .bind('mouseup.gallery', onMouseUp);
262 function updateGallery(url) {
268 success: function(data) {
269 element.data('images', data);
272 $('img', element).show();
275 error: function(data) {
276 element.data('images', []);
279 $('img', element).hide();
290 function transform(editor, callback) {
292 $.blockUI({message: 'Ładowanie...'});
294 setTimeout(function() {
296 xml: editor.getCode(),
297 success: function(element) {
298 $('#html-view').html(element);
303 }, error: function(text) {
304 $('#html-view').html('<p class="error">Wystąpił błąd:</p><pre>' + text + '</pre>');
315 function reverseTransform(editor, cont, errorCont, dontBlock) {
316 var serializer = new XMLSerializer();
317 if ($('#html-view .error').length > 0) {
324 $.blockUI({message: 'Ładowanie...'});
326 setTimeout(function() {
328 xml: serializer.serializeToString($('#html-view div').get(0)),
329 success: function(text) {
330 editor.setCode(text);
337 }, error: function(text) {
338 $('#source-editor').html('<p>Wystąpił błąd:</p><pre>' + text + '</pre>');
354 function html(element) {
355 var element = $(element);
357 function selectTheme(themeId)
359 var selection = window.getSelection();
360 selection.removeAllRanges();
362 var range = document.createRange();
363 var s = $(".motyw[theme-class='"+themeId+"']")[0];
364 var e = $(".end[theme-class='"+themeId+"']")[0];
367 range.setStartAfter(s);
368 range.setEndBefore(e);
369 selection.addRange(range);
373 function verifyTagInsertPoint(node) {
374 if(node.nodeType == 3) { // Text Node
375 node = node.parentNode;
378 if (node.nodeType != 1) {
383 var xtype = node.attr('x-node');
385 if (!xtype || (xtype.search(':') >= 0) ||
386 xtype == 'motyw' || xtype == 'begin' || xtype == 'end') {
390 // don't allow themes inside annotations
391 if( node.is('*[x-annotation-box] *') )
397 function addAnnotation()
399 var selection = window.getSelection();
400 var n = selection.rangeCount;
403 window.alert("Nie zaznaczono żadnego obszaru");
407 // for now allow only 1 range
409 window.alert("Zaznacz jeden obszar");
413 // remember the selected range
414 var range = selection.getRangeAt(0);
416 if (!verifyTagInsertPoint(range.endContainer)) {
417 window.alert("Nie można wstawić w to miejsce przypisu.");
421 var text = range.toString();
422 var tag = $('<span></span>');
423 range.collapse(false);
424 range.insertNode(tag[0]);
427 xml: '<pr><slowo_obce>'+text+'</slowo_obce> --- </pr>',
428 success: function(text) {
435 alert('Błąd przy dodawaniu przypisu:' + errors);
442 var selection = window.getSelection();
443 var n = selection.rangeCount;
446 window.alert("Nie zaznaczono żadnego obszaru");
450 // for now allow only 1 range
452 window.alert("Zaznacz jeden obszar");
456 // remember the selected range
457 var range = selection.getRangeAt(0);
459 // verify if the start/end points make even sense -
460 // they must be inside a x-node (otherwise they will be discarded)
461 // and the x-node must be a main text
462 if (!verifyTagInsertPoint(range.startContainer)) {
463 window.alert("Motyw nie może się zaczynać w tym miejscu.");
467 if (!verifyTagInsertPoint(range.endContainer)) {
468 window.alert("Motyw nie może się kończyć w tym miejscu.");
472 var date = (new Date()).getTime();
473 var random = Math.floor(4000000000*Math.random());
474 var id = (''+date) + '-' + (''+random);
476 var spoint = document.createRange();
477 var epoint = document.createRange();
479 spoint.setStart(range.startContainer, range.startOffset);
480 epoint.setStart(range.endContainer, range.endOffset);
482 var mtag, btag, etag, errors;
487 xml: '<end id="e'+id+'" />',
488 success: function(text) {
489 etag = $('<span></span>');
490 epoint.insertNode(etag[0]);
491 etag.replaceWith(text);
493 xml: '<motyw id="m'+id+'"></motyw>',
494 success: function(text) {
495 mtag = $('<span></span>');
496 spoint.insertNode(mtag[0]);
497 mtag.replaceWith(text);
499 xml: '<begin id="b'+id+'" />',
500 success: function(text) {
501 btag = $('<span></span>');
502 spoint.insertNode(btag[0])
503 btag.replaceWith(text);
504 selection.removeAllRanges();
505 openForEdit($('.motyw[theme-class=' + id + ']'));
514 function openForEdit($origin)
518 // annotations overlay their sub box - not their own box //
519 if($origin.is(".annotation-inline-box")) {
520 $box = $("*[x-annotation-box]", $origin);
525 var x = $box[0].offsetLeft;
526 var y = $box[0].offsetTop;
527 var w = $box.outerWidth();
528 var h = $box.innerHeight();
530 if ($origin.is(".annotation-inline-box")) {
531 w = Math.max(w, 400);
535 // start edition on this node
536 var $overlay = $('<div class="html-editarea"><button class="accept-button">Zapisz</button><button class="delete-button">Usuń</button><textarea></textarea></div>').css({
537 position: 'absolute',
542 }).appendTo($box[0].offsetParent || $box.parent()).show();
544 if ($origin.is('.motyw')) {
545 $('textarea', $overlay).autocomplete(THEMES, {
552 $('.delete-button', $overlay).click(function() {
553 if ($origin.is('.motyw')) {
554 $('[theme-class=' + $origin.attr('theme-class') + ']').remove();
559 $(document).unbind('click.blur-overlay');
564 var serializer = new XMLSerializer();
567 xml: serializer.serializeToString($box[0]),
569 success: function(text) {
570 $('textarea', $overlay).val($.trim(text));
572 setTimeout(function() {
573 $('textarea', $overlay).elastic().focus();
576 function save(argument) {
577 var nodeName = $box.attr('x-node') || 'pe';
579 xml: '<' + nodeName + '>' + $('textarea', $overlay).val() + '</' + nodeName + '>',
580 success: function(element) {
581 $box.html($(element).html());
584 error: function(text) {
586 alert('Błąd! ' + text);
591 $('.accept-button', $overlay).click(function() {
595 $(document).bind('click.blur-overlay', function(event) {
596 if ($(event.target).parents('.html-editarea').length > 0) {
601 $(document).unbind('click.blur-overlay');
604 }, error: function(text) {
605 alert('Błąd! ' + text);
610 $('.edit-button').live('click', function(event) {
611 event.preventDefault();
612 openForEdit($(this).parent());
617 var button = $('<button class="edit-button">Edytuj</button>');
618 $(element).bind('mousemove', function(event) {
619 var editable = $(event.target).closest('*[x-editable]');
620 $('.active[x-editable]', element).not(editable).removeClass('active').children('.edit-button').remove();
621 if (!editable.hasClass('active')) {
622 editable.addClass('active').append(button);
626 $('.motyw').live('click', function() {
627 selectTheme($(this).attr('theme-class'));
630 $('#insert-annotation-button').click(function() {
635 $('#insert-theme-button').click(function() {
643 gallery('#sidebar', $('#document-meta .gallery').html());
646 CodeMirror.fromTextArea('id_text', {
647 parserfile: 'parsexml.js',
648 path: STATIC_URL + "js/lib/codemirror/",
649 stylesheet: STATIC_URL + "css/xmlcolors.css",
651 useHTMLKludges: false
653 iframeClass: 'xml-iframe',
657 initCallback: function(editor) {
658 $('#save-button').click(function(event) {
659 event.preventDefault();
660 $.blockUI({message: $('#save-dialog')});
663 $('#save-ok').click(function() {
664 $.blockUI({message: 'Zapisywanie...'});
666 function doSave (argument) {
667 var metaComment = '<!--';
668 $('#document-meta div').each(function() {
669 metaComment += '\n\t' + $(this).attr('class') + ': ' + $(this).html();
671 metaComment += '\n-->'
674 name: $('#document-name').html(),
675 text: metaComment + editor.getCode(),
676 revision: $('#document-revision').html(),
677 author: $('#username').html() || 'annonymous',
678 comment: $('#komentarz').val()
682 url: document.location.href,
686 success: function(data) {
688 editor.setCode(data.text);
689 $('#document-revision').html(data.revision);
695 error: function(xhr, textStatus, errorThrown) {
696 alert('error: ' + textStatus + ' ' + errorThrown);
701 if ($('#simple-view-tab').hasClass('active')) {
702 reverseTransform(editor, doSave);
708 $('#save-cancel').click(function() {
712 function changeTab(callback) {
713 if ($('#simple-view-tab').hasClass('active')) {
716 $('#simple-view-tab').addClass('active');
717 $('#source-view-tab').removeClass('active');
718 $('#source-editor').hide();
719 $('#simple-editor').show();
720 transform(editor, callback);
722 $('#simple-view-tab').click(function() { changeTab(); });
724 $('#source-view-tab').click(function() {
725 if ($(this).hasClass('active')) {
728 $(this).addClass('active');
729 $('#simple-view-tab').removeClass('active');
730 $('#simple-editor').hide();
731 $('#source-editor').show();
732 reverseTransform(editor);
735 $('#source-editor .toolbar button').click(function(event) {
736 event.preventDefault();
737 var params = eval("(" + $(this).attr('ui:action-params') + ")");
738 scriptletCenter.scriptlets[$(this).attr('ui:action')](editor, params);
741 $('.toolbar select').change(function() {
742 var slug = $(this).val();
744 $('.toolbar-buttons-container').hide().filter('[data-group=' + slug + ']').show();
748 $('.toolbar-buttons-container').hide();
749 $('.toolbar select').change();
751 changeTab(function() { $('#loading-overlay').fadeOut() }, function() { $('#loading-overlay').fadeOut() }, true)
755 $(window).resize(function() {
756 $('iframe').height($(window).height() - $('#tabs').outerHeight() - $('#source-editor .toolbar').outerHeight());
761 $('.vsplitbar').click(function() {
762 if ($('#sidebar').width() == 0) {
763 $('#sidebar').width(480).css({right: 0}).show();
764 $('#source-editor, #simple-editor').css({right: 495});
765 $('.vsplitbar').css({right: 480}).addClass('active');
767 $('#sidebar').width(0).hide();
768 $('#source-editor, #simple-editor').css({right: 15});
769 $('.vsplitbar').css({right: 0}).removeClass('active');