Minor cleanup.
[redakcja.git] / platforma / static / js / wiki / main.js
1
2 if (!window.console) {
3     window.console = {
4         log: function(){
5         }
6     }
7 }
8
9 THEMES = ['Alkohol', 'Ambicja', 'Anioł', 'Antysemityzm', 'Arkadia', 'Artysta', 'Bezdomność', 'Bezpieczeństwo', 'Bieda', 'Bijatyka', 'Błazen', 'Błądzenie', 'Błoto', 'Bogactwo', 'Bóg', 'Brat', 'Bunt', 'Buntownik', 'Burza', 'Car', 'Carpe diem', 'Ciemność', 'Cień', 'Cisza', 'Chciwość', 'Chleb', 'Chłop', 'Choroba', 'Chrystus', 'Chrzest', 'Ciało', 'Cierpienie', 'Cmentarz', 'Cnota', 'Córka', 'Cud', 'Czarownika', 'Czary', 'Czas', 'Czyn', 'Czyściec', 'Dama', 'Danse macabre', 'Deszcz', 'Diabeł', 'Dobro', 'Dom', 'Dorosłość', 'Drzewo', 'Duch', 'Dusza', 'Duma', 'Dworek', 'Dworzanin', 'Dwór', 'Dzieciństwo', 'Dziecko', 'Dziedzictwo', 'Dziewictwo', 'Dźwięk', 'Egzorcyzm', 'Elita', 'Emigrant', 'Fałsz', 'Filozof', 'Fircyk', 'Flirt', 'Głupiec', 'Głupota', 'Głód', 'Gospodarz', 'Gospodyni', 'Gość', 'Gotycyzm', 'Góra', 'Gra', 'Grób', 'Grzech', 'Grzeczność', 'Gwiazda', 'Handel', 'Hańba', 'Historia', 'Honor', 'Idealista', 'Imię', 'Interes', 'Jabłka', 'Jedzenie', 'Jesień', 'Kaleka', 'Kara', 'Karczma', 'Klęska', 'Kłamstwo', 'Kłótnia', 'Kobieta', 'Kobieta demoniczna', 'Kobieta "upadła"', 'Kochanek', 'Kochanek romantyczny', 'Kolonializm', 'Kondycja ludzka', 'Konflikt', 'Konflikt wewnętrzny', 'Koniec świata', 'Koń', 'Korzyść', 'Kot', 'Kradzież', 'Krew', 'Król', 'Krzywda', 'Ksiądz', 'Książka', 'Księżyc', 'Kuchnia', 'Kuszenie', 'Kwiaty', 'Labirynt', 'Las', 'Lato', 'Lekarz', 'Lenistwo', 'List', 'Liberat', 'Los', 'Lud', 'Lustro', 'Łzy', 'Małżeństwo', 'Marzenie', 'Maska', 'Maszyna', 'Matka', 'Matka Boska', 'Mądrość', 'Mąż', 'Melancholia', 'Mędrzec', 'Mężczyzna', 'Miasto', 'Mieszczanin', 'Miłosierdzie', 'Miłość', 'Miłość niespełniona', 'Miłość platoniczna', 'Miłość romantyczna', 'Miłość silniejsza niż śmierć', 'Miłość spełniona', 'Miłość tragiczna', 'Mizoginia', 'Młodość', 'Moda', 'Modlitwa', 'Morderstwo', 'Morze', 'Motyl', 'Mucha', 'Muzyka', 'Narodziny', 'Naród', 'Natura', 'Nauczyciel', 'Nauczycielka', 'Nauka', 'Niebezpieczeństwo', 'Niedziela', 'Niemiec', 'Nienawiść', 'Nieśmiertelność', 'Niewola', 'Noc', 'Nuda', 'Obcy', 'Obłok', 'Obowiązek', 'Obraz świata', 'Obrzędy', 'Obyczaje', 'Obywatel', 'Odrodzenie przez grób', 'Odwaga', 'Ofiara', 'Ogień', 'Ogród', 'Ojciec', 'Ojczyzna', 'Oko', 'Okręt', 'Okrucieństwo', 'Omen', 'Opieka', 'Organizm', 'Otchłań', 'Pająk', 'Pamięć', 'Pan', 'Panna młoda', 'Państwo', 'Patriota', 'Piekło', 'Pielgrzym', 'Pieniądz', 'Pies', 'Piętno', 'Pijaństwo', 'Piwnica', 'Plotka', 'Pobożność', 'Pocałunek', 'Pochlebstwo', 'Poeta', 'Poetka', 'Poezja', 'Podróż', 'Podstęp', 'Pogrzeb', 'Pojedynek', 'Pokora', 'Pokusa', 'Polak', 'Polityka', 'Polowanie', 'Polska', 'Portret', 'Porwanie', 'Poświęcenie', 'Potwór', 'Powstanie', 'Powstaniec', 'Pozory', 'Pozycja społeczna', 'Pożar', 'Pożądanie', 'Praca', 'Praca u podstaw', 'Praca organiczna', 'Prawda', 'Prawnik', 'Prometeusz', 'Proroctwo', 'Prorok', 'Próżność', 'Przebranie', 'Przeczucie', 'Przedmurze chrześcijaństwa', 'Przekleństwo', 'Przekupstwo', 'Przemiana', 'Przemijanie', 'Przemoc', 'Przestrzeń', 'Przyjaźń', 'Przyroda nieożywiona', 'Przysięga', 'Przywódca', 'Ptak', 'Pustynia', 'Pycha', 'Raj', 'Realista', 'Religia', 'Rewolucja', 'Robak', 'Robotnik', 'Rodzina', 'Rosja', 'Rosjanin', 'Rośliny', 'Rozczarowanie', 'Rozpacz', 'Rozstanie', 'Rozum', 'Ruiny', 'Rycerz', 'Rzeka', 'Salon', 'Samobójstwo', 'Samolubstwo', 'Samotnik', 'Samotność', 'Sarmata', 'Sąsiad', 'Sąd', 'Sąd Ostateczny', 'Sen', 'Serce', 'Sędzia', 'Sielanka', 'Sierota', 'Siła', 'Siostra', 'Sława', 'Słońce', 'Słowo', 'Sługa', 'Służalczość', 'Skąpiec', 'Sobowtór', 'Społecznik', 'Spowiedź', 'Sprawiedliwość', 'Starość', 'Strach', 'Strój', 'Stworzenie', 'Sumienie', 'Swaty', 'Syberia', 'Syn', 'Syn marnotrawny', 'Syzyf', 'Szaleniec', 'Szaleństwo', 'Szantaż', 'Szatan', 'Szczęście', 'Szkoła', 'Szlachcic', 'Szpieg', 'Sztuka', 'Ślub', 'Śmiech', 'Śmierć', 'Śmierć bohaterska', 'Śpiew', 'Światło', 'Świętoszek', 'Święty', 'Świt', 'Tajemnica', 'Taniec', 'Tchórzostwo', 'Teatr', 'Testament', 'Tęsknota', 'Theatrum mundi', 'Tłum', 'Trucizna', 'Trup', 'Twórczość', 'Uczeń', 'Uczta', 'Uroda', 'Umiarkowanie', 'Upadek', 'Upiór', 'Urzędnik', 'Vanitas', 'Walka', 'Walka klas', 'Wampir', 'Warszawa', 'Wąż', 'Wdowa', 'Wdowiec', 'Wesele', 'Wiatr', 'Wierność', 'Wierzenia', 'Wieś', 'Wiedza', 'Wieża Babel', 'Więzienie', 'Więzień', 'Wina', 'Wino', 'Wiosna', 'Wizja', 'Władza', 'Własność', 'Woda', 'Wojna', 'Wojna pokoleń', 'Wolność', 'Wróg', 'Wspomnienia', 'Współpraca', 'Wygnanie', 'Wyrzuty sumienia', 'Wyspa', 'Wzrok', 'Zabawa', 'Zabobony', 'Zamek', 'Zaręczyny', 'Zaświaty', 'Zazdrość', 'Zbawienie', 'Zbrodnia', 'Zbrodniarz', 'Zdrada', 'Zdrowie', 'Zemsta', 'Zesłaniec', 'Ziarno', 'Ziemia', 'Zima', 'Zło', 'Złodziej', 'Złoty wiek', 'Zmartwychwstanie', 'Zwątpienie', 'Zwierzęta', 'Zwycięstwo', 'Żałoba', 'Żebrak', 'Żołnierz', 'Żona', 'Życie jako wędrówka', 'Życie snem', 'Żyd', 'Żywioły', 'Oświadczyny']
10
11 function gallery(element, url){
12     var element = $(element);
13     var imageDimensions = {};
14     element.data('images', []);
15     
16     function changePage(pageNumber){
17         $('.gallery-image img', element).attr('src', element.data('images')[pageNumber - 1]);
18     }
19     
20     function normalizeNumber(pageNumber){
21         // Numer strony musi być pomiędzy 1 a najwyższym numerem
22         var pageCount = element.data('images').length;
23         pageNumber = parseInt(pageNumber, 10);
24         
25         if (!pageNumber || pageNumber == NaN || pageNumber == Infinity || pageNumber == -Infinity) {
26             return 1;
27         }
28         else 
29             if (pageNumber < 1) {
30                 return 1;
31             }
32             else 
33                 if (pageNumber > pageCount) {
34                     return pageCount;
35                 }
36                 else {
37                     return pageNumber;
38                 }
39     }
40     
41     var pn = $('.page-number', element);
42     pn.change(function(event){
43         event.preventDefault();
44         var n = normalizeNumber(pn.val());
45         pn.val(n);
46         changePage(n);
47     });
48     $('.previous-page', element).click(function(){
49         pn.val(normalizeNumber(pn.val()) - 1);
50         pn.change();
51     });
52     $('.next-page', element).click(function(){
53         pn.val(normalizeNumber(pn.val()) + 1);
54         pn.change();
55     });
56     
57     
58     var image = $('.gallery-image img', element).attr('unselectable', 'on');
59     var origin = {};
60     var imageOrigin = {};
61     var zoomFactor = 1;
62     
63     $('.zoom-in', element).click(function(){
64         zoomFactor = Math.min(2, zoomFactor + 0.2);
65         zoom();
66     });
67     $('.zoom-out', element).click(function(){
68         zoomFactor = Math.max(0.2, zoomFactor - 0.2);
69         zoom();
70     });
71     $('.change-gallery', element).click(function(){
72         $('.chosen-gallery').val($('#document-meta .gallery').html() || '/platforma/gallery/');
73         $('.gallery-image').animate({
74             top: 60
75         }, 200);
76         $('.chosen-gallery').focus();
77     });
78     $('.change-gallery-ok', element).click(function(){
79         if ($('#document-meta .gallery').length == 0) {
80             $('<div class="gallery"></div>').appendTo('#document-meta');
81         }
82         $('#document-meta .gallery').html($('.chosen-gallery').val());
83         updateGallery($('.chosen-gallery').val());
84         $('.gallery-image').animate({
85             top: 30
86         }, 200);
87     });
88     $('.change-gallery-cancel', element).click(function(){
89         $('.gallery-image').animate({
90             top: 30
91         }, 200);
92     });
93     
94     $('.gallery-image img', element).load(function(){
95         image.css({
96             width: null,
97             height: null
98         });
99         imageDimensions = {
100             width: $(this).width() * zoomFactor,
101             height: $(this).height() * zoomFactor,
102             originWidth: $(this).width(),
103             originHeight: $(this).height(),
104             galleryWidth: $(this).parent().width(),
105             galleryHeight: $(this).parent().height()
106         };
107         
108         if (!(imageDimensions.width && imageDimensions.height)) {
109             setTimeout(function(){
110                 $('.gallery-image img', element).load();
111             }, 100);
112         }
113         var position = normalizePosition(image.position().left, image.position().top, imageDimensions.galleryWidth, imageDimensions.galleryHeight, imageDimensions.width, imageDimensions.height);
114         image.css({
115             left: position.x,
116             top: position.y,
117             width: $(this).width() * zoomFactor,
118             height: $(this).height() * zoomFactor
119         });
120     });
121     
122     $(window).resize(function(){
123         imageDimensions.galleryWidth = image.parent().width();
124         imageDimensions.galleryHeight = image.parent().height();
125     });
126     
127     function bounds(galleryWidth, galleryHeight, imageWidth, imageHeight){
128         return {
129             maxX: 0,
130             maxY: 0,
131             minX: galleryWidth - imageWidth,
132             minY: galleryHeight - imageHeight
133         }
134     }
135     
136     function normalizePosition(x, y, galleryWidth, galleryHeight, imageWidth, imageHeight){
137         var b = bounds(galleryWidth, galleryHeight, imageWidth, imageHeight);
138         return {
139             x: Math.min(b.maxX, Math.max(b.minX, x)),
140             y: Math.min(b.maxY, Math.max(b.minY, y))
141         }
142     }
143     
144     function onMouseMove(event){
145         var position = normalizePosition(event.clientX - origin.x + imageOrigin.left, event.clientY - origin.y + imageOrigin.top, imageDimensions.galleryWidth, imageDimensions.galleryHeight, imageDimensions.width, imageDimensions.height);
146         image.css({
147             position: 'absolute',
148             top: position.y,
149             left: position.x
150         });
151         return false;
152     }
153     
154     function setZoom(factor){
155         zoomFactor = factor;
156     }
157     
158     function zoom(){
159         imageDimensions.width = imageDimensions.originWidth * zoomFactor;
160         imageDimensions.height = imageDimensions.originHeight * zoomFactor;
161         var position = normalizePosition(image.position().left, image.position().top, imageDimensions.galleryWidth, imageDimensions.galleryHeight, imageDimensions.width, imageDimensions.height);
162         image.css({
163             width: imageDimensions.width,
164             height: imageDimensions.height,
165             left: position.x,
166             top: position.y
167         });
168         
169     }
170     
171     function onMouseUp(event){
172         $(document).unbind('mousemove.gallery').unbind('mouseup.gallery');
173         return false;
174     }
175     
176     image.bind('mousedown', function(event){
177         origin = {
178             x: event.clientX,
179             y: event.clientY
180         };
181         imageOrigin = image.position();
182         $(document).bind('mousemove.gallery', onMouseMove).bind('mouseup.gallery', onMouseUp);
183         return false;
184     });
185     
186     function updateGallery(url){
187         $.ajax({
188             url: url,
189             type: 'GET',
190             dataType: 'json',
191             
192             success: function(data){
193                 element.data('images', data);
194                 pn.val(1);
195                 pn.change();
196                 $('.gallery-image img', element).show();
197             },
198             
199             error: function(data){
200                 element.data('images', []);
201                 pn.val(1);
202                 pn.change();
203                 $('.gallery-image img', element).hide();
204             }
205         });
206     }
207     
208     if (url) {
209         updateGallery(url);
210     }
211 }
212
213 $(function() {
214     // gallery('#sidebar', $('#document-meta .gallery').html());
215         
216         var tabs = $('ol#tabs li');             
217         var perspectives = {};
218         var wikidoc = new $.wikiapi.WikiDocument("document-meta");
219         
220         function activePerspective() {
221                 return perspectives[$("#tabs " + document.location.hash + "-tab").attr('data-ui-jsclass')];             
222         };
223                 
224     function initialize() 
225         {               
226                 /* The save button */
227         $('#save-button').click(function(event){
228             event.preventDefault();
229             $.blockUI({
230                 message: $('#save-dialog')
231             });
232         });
233         
234         $('#save-ok').click(function(){
235             $.blockUI({
236                 message: 'Zapisywanie...'
237             });
238                         
239                         var ap = activePerspective();
240                         
241                         /* exit perspective */
242                         ap.onExit();          
243                         
244                         function finalize() {
245                                 ap.onEnter();
246                                 $.unblockUI();
247                         };
248                         
249                         wikidoc.save( $("#komentarz").text(), 
250                                 function(doc, changed) {
251                                         console.log("Saved.");                          
252                                         finalize();                             
253                                 }, 
254                                 function(doc, message) {
255                                         alert(message);
256                                         finalize();                                     
257                                 }
258                         );
259         });
260         
261         $('#save-cancel').click(function(){
262             $.unblockUI();
263         }); 
264                                 
265                 $('.editor').hide();   
266                 
267                 /*
268                  * TABS 
269                  */             
270         tabs.click(function(event, callback) {
271                         /* hide old */
272             var $old = tabs.filter('.active');
273                                                 
274                         $old.each(function(){
275                                 $(this).removeClass('active');
276                                 $('#' + $(this).attr('data-ui-related')).hide();
277                                 perspectives[$(this).attr('data-ui-jsclass')].onExit();
278                         });                     
279                         
280                         /* show new */                                          
281             $(this).addClass('active');
282             $('#' + $(this).attr('data-ui-related')).show();                    
283             perspectives[$(this).attr('data-ui-jsclass')].onEnter();
284         });
285                         
286         
287         $(window).resize(function(){
288             $('iframe').height($(window).height() - $('#tabs').outerHeight() - $('#source-editor .toolbar').outerHeight());
289         });
290         
291         $(window).resize();
292         
293         $('.vsplitbar').click(function(){
294             if ($('#sidebar').width() == 0) {
295                 $('#sidebar').width(480).css({
296                     right: 0
297                 }).show();
298                 $('#editor .editor').css({
299                     right: 495
300                 });
301                 $('.vsplitbar').css({
302                     right: 480
303                 }).addClass('active');
304             }
305             else {
306                 $('#sidebar').width(0).hide();
307                 $('#editor .editor').css({
308                     right: 15
309                 });
310                 $('.vsplitbar').css({
311                     right: 0
312                 }).removeClass('active');
313             }
314             $(window).resize();
315         });
316         
317         $(window).bind('beforeunload', function(event){
318             return "Na stronie mogą być zmiany.";
319         });
320                 
321                 console.log("prepare for fetch");
322                 
323                 wikidoc.fetch({
324                         success: function(){
325                                 console.log("Fetch success");
326                                 $('#loading-overlay').fadeOut();                                
327                                 var active_tab = document.location.hash || "#VisualPerspective";
328                                 var $active = $("#tabs " + active_tab + "-tab");
329                                 
330                                 $active.trigger("click");
331                         },
332                         failure: function() {
333                                 $('#loading-overlay').fadeOut();
334                                 alert("FAILURE");
335                         }
336                 });
337                                                 
338     }; /* end of initialize() */
339         
340         var initAll = function(a, f) {                          
341                 if (a.length == 0) return f();  
342                         
343                 var klass = a.pop();
344                 console.log("INIT", klass);             
345                 var p = new $.wiki[klass](wikidoc, function() {
346                         perspectives[this.perspective_id] = this;                        
347                         initAll(a, f); 
348                 });                                             
349                 
350         };
351         
352         /*
353          * Initialize all perspectives 
354          */
355         initAll($.makeArray( $('ol#tabs li').map(function(){
356                         return $(this).attr('data-ui-jsclass');                                         
357         })), initialize);
358         
359         console.log(location.hash);
360         
361 });