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 $('.gallery-image 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 = $('.gallery-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: 60}, 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: 30}, 200);
159 $('.change-gallery-cancel', element).click(function() {
160 $('.gallery-image').animate({top: 30}, 200);
163 $('.gallery-image 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() { $('.gallery-image 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 $('.gallery-image img', element).show();
275 error: function(data) {
276 element.data('images', []);
279 $('.gallery-image 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 var message = $('<pre></pre>');
306 $('#html-view').html('<p class="error">Wystąpił błąd:</p><pre>' +
307 message.html() + '</pre>');
319 function reverseTransform(editor, cont, errorCont, dontBlock) {
320 var serializer = new XMLSerializer();
321 if ($('#html-view .error').length > 0) {
328 $.blockUI({message: 'Ładowanie...'});
330 setTimeout(function() {
332 xml: serializer.serializeToString($('#html-view div').get(0)),
333 success: function(text) {
334 editor.setCode(text);
341 }, error: function(text) {
342 $('#source-editor').html('<p>Wystąpił błąd:</p><pre>' + text + '</pre>');
358 function html(element) {
359 var element = $(element);
361 function selectTheme(themeId)
363 var selection = window.getSelection();
364 selection.removeAllRanges();
366 var range = document.createRange();
367 var s = $(".motyw[theme-class='"+themeId+"']")[0];
368 var e = $(".end[theme-class='"+themeId+"']")[0];
371 range.setStartAfter(s);
372 range.setEndBefore(e);
373 selection.addRange(range);
377 function verifyTagInsertPoint(node) {
378 if(node.nodeType == 3) { // Text Node
379 node = node.parentNode;
382 if (node.nodeType != 1) {
387 var xtype = node.attr('x-node');
389 if (!xtype || (xtype.search(':') >= 0) ||
390 xtype == 'motyw' || xtype == 'begin' || xtype == 'end') {
394 // don't allow themes inside annotations
395 if( node.is('*[x-annotation-box] *') )
401 var ANNOT_ALLOWED = ['wyroznienie'];
403 function html2plainText(fragment) {
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);
418 function addAnnotation()
420 var selection = window.getSelection();
421 var n = selection.rangeCount;
424 window.alert("Nie zaznaczono żadnego obszaru");
428 // for now allow only 1 range
430 window.alert("Zaznacz jeden obszar");
434 // remember the selected range
435 var range = selection.getRangeAt(0);
437 if (!verifyTagInsertPoint(range.endContainer)) {
438 window.alert("Nie można wstawić w to miejsce przypisu.");
442 // BUG #273 - selected text can contain themes, which should be omited from
444 var text = html2plainText( range.cloneContents() );
446 var tag = $('<span></span>');
447 range.collapse(false);
448 range.insertNode(tag[0]);
451 xml: '<pr><slowo_obce>'+text+'</slowo_obce> --- </pr>',
452 success: function(text) {
459 alert('Błąd przy dodawaniu przypisu:' + errors);
466 var selection = window.getSelection();
467 var n = selection.rangeCount;
470 window.alert("Nie zaznaczono żadnego obszaru");
474 // for now allow only 1 range
476 window.alert("Zaznacz jeden obszar");
480 // remember the selected range
481 var range = selection.getRangeAt(0);
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.");
491 if (!verifyTagInsertPoint(range.endContainer)) {
492 window.alert("Motyw nie może się kończyć w tym miejscu.");
496 var date = (new Date()).getTime();
497 var random = Math.floor(4000000000*Math.random());
498 var id = (''+date) + '-' + (''+random);
500 var spoint = document.createRange();
501 var epoint = document.createRange();
503 spoint.setStart(range.startContainer, range.startOffset);
504 epoint.setStart(range.endContainer, range.endOffset);
506 var mtag, btag, etag, errors;
511 xml: '<end id="e'+id+'" />',
512 success: function(text) {
513 etag = $('<span></span>');
514 epoint.insertNode(etag[0]);
515 etag.replaceWith(text);
517 xml: '<motyw id="m'+id+'"></motyw>',
518 success: function(text) {
519 mtag = $('<span></span>');
520 spoint.insertNode(mtag[0]);
521 mtag.replaceWith(text);
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 + ']'));
538 function openForEdit($origin)
542 // annotations overlay their sub box - not their own box //
543 if($origin.is(".annotation-inline-box")) {
544 $box = $("*[x-annotation-box]", $origin);
549 var x = $box[0].offsetLeft;
550 var y = $box[0].offsetTop;
551 var w = $box.outerWidth();
552 var h = $box.innerHeight();
554 if ($origin.is(".annotation-inline-box")) {
555 w = Math.max(w, 400);
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',
566 }).appendTo($box[0].offsetParent || $box.parent()).show();
568 if ($origin.is('.motyw')) {
569 $('textarea', $overlay).autocomplete(THEMES, {
576 $('.delete-button', $overlay).click(function() {
577 if ($origin.is('.motyw')) {
578 $('[theme-class=' + $origin.attr('theme-class') + ']').remove();
583 $(document).unbind('click.blur-overlay');
588 var serializer = new XMLSerializer();
591 xml: serializer.serializeToString($box[0]),
593 success: function(text) {
594 $('textarea', $overlay).val($.trim(text));
596 setTimeout(function() {
597 $('textarea', $overlay).elastic().focus();
600 function save(argument) {
601 var nodeName = $box.attr('x-node') || 'pe';
602 var insertedText = $('textarea', $overlay).val();
604 if ($origin.is('.motyw')) {
605 insertedText = insertedText.replace(/,\s*$/, '');
609 xml: '<' + nodeName + '>' + insertedText + '</' + nodeName + '>',
610 success: function(element) {
611 $box.html($(element).html());
614 error: function(text) {
616 alert('Błąd! ' + text);
621 $('.accept-button', $overlay).click(function() {
625 $(document).bind('click.blur-overlay', function(event) {
626 if ($(event.target).parents('.html-editarea').length > 0) {
631 $(document).unbind('click.blur-overlay');
634 }, error: function(text) {
635 alert('Błąd! ' + text);
640 $('.edit-button').live('click', function(event) {
641 event.preventDefault();
642 openForEdit($(this).parent());
647 var button = $('<button class="edit-button">Edytuj</button>');
648 $(element).bind('mousemove', function(event) {
649 var editable = $(event.target).closest('*[x-editable]');
650 $('.active[x-editable]', element).not(editable).removeClass('active').children('.edit-button').remove();
651 if (!editable.hasClass('active')) {
652 editable.addClass('active').append(button);
656 $('.motyw').live('click', function() {
657 selectTheme($(this).attr('theme-class'));
660 $('#insert-annotation-button').click(function() {
665 $('#insert-theme-button').click(function() {
673 gallery('#sidebar', $('#document-meta .gallery').html());
676 CodeMirror.fromTextArea('id_text', {
677 parserfile: 'parsexml.js',
678 path: STATIC_URL + "js/lib/codemirror/",
679 stylesheet: STATIC_URL + "css/xmlcolors.css",
681 useHTMLKludges: false
683 iframeClass: 'xml-iframe',
687 initCallback: function(editor) {
688 $('#save-button').click(function(event) {
689 event.preventDefault();
690 $.blockUI({message: $('#save-dialog')});
693 $('#save-ok').click(function() {
694 $.blockUI({message: 'Zapisywanie...'});
696 function doSave (argument) {
697 var metaComment = '<!--';
698 $('#document-meta div').each(function() {
699 metaComment += '\n\t' + $(this).attr('class') + ': ' + $(this).html();
701 metaComment += '\n-->'
704 name: $('#document-name').html(),
705 text: metaComment + editor.getCode(),
706 revision: $('#document-revision').html(),
707 author: $('#username').html() || 'annonymous',
708 comment: $('#komentarz').val()
712 url: document.location.href,
716 success: function(data) {
718 editor.setCode(data.text);
719 $('#document-revision').html(data.revision);
725 error: function(xhr, textStatus, errorThrown) {
726 alert('error: ' + textStatus + ' ' + errorThrown);
731 if ($('#simple-view-tab').hasClass('active')) {
732 reverseTransform(editor, doSave);
738 $('#save-cancel').click(function() {
742 function changeTab(callback) {
743 if ($('#simple-view-tab').hasClass('active')) {
746 $('#simple-view-tab').addClass('active');
747 $('#source-view-tab').removeClass('active');
748 $('#source-editor').hide();
749 $('#simple-editor').show();
750 transform(editor, callback);
752 $('#simple-view-tab').click(function() { changeTab(); });
754 $('#source-view-tab').click(function() {
755 if ($(this).hasClass('active')) {
758 $(this).addClass('active');
759 $('#simple-view-tab').removeClass('active');
760 $('#simple-editor').hide();
761 $('#source-editor').show();
762 reverseTransform(editor);
765 $('#source-editor .toolbar button').click(function(event) {
766 event.preventDefault();
767 var params = eval("(" + $(this).attr('ui:action-params') + ")");
768 scriptletCenter.scriptlets[$(this).attr('ui:action')](editor, params);
771 $('.toolbar select').change(function() {
772 var slug = $(this).val();
774 $('.toolbar-buttons-container').hide().filter('[data-group=' + slug + ']').show();
778 $('.toolbar-buttons-container').hide();
779 $('.toolbar select').change();
781 changeTab(function() { $('#loading-overlay').fadeOut() }, function() { $('#loading-overlay').fadeOut() }, true)
785 $(window).resize(function() {
786 $('iframe').height($(window).height() - $('#tabs').outerHeight() - $('#source-editor .toolbar').outerHeight());
791 $('.vsplitbar').click(function() {
792 if ($('#sidebar').width() == 0) {
793 $('#sidebar').width(480).css({right: 0}).show();
794 $('#source-editor, #simple-editor').css({right: 495});
795 $('.vsplitbar').css({right: 480}).addClass('active');
797 $('#sidebar').width(0).hide();
798 $('#source-editor, #simple-editor').css({right: 15});
799 $('.vsplitbar').css({right: 0}).removeClass('active');