Otwieranie do edycji motywów i przypisów zaraz po ich wstawieniu.
[redakcja.git] / platforma / static / js / main.js
index ed22f59..9262c18 100644 (file)
@@ -253,7 +253,7 @@ function transform(editor) {
 };
 
 
 };
 
 
-function reverseTransform(editor) {
+function reverseTransform(editor, cont) {
     var serializer = new XMLSerializer();
     if ($('#html-view .error').length > 0) {
         return;
     var serializer = new XMLSerializer();
     if ($('#html-view .error').length > 0) {
         return;
@@ -265,6 +265,9 @@ function reverseTransform(editor) {
             success: function(text) {
                 editor.setCode(text);
                 $.unblockUI();
             success: function(text) {
                 editor.setCode(text);
                 $.unblockUI();
+                if (cont) {
+                    cont();
+                }
             }, error: function(text) {
                 $('#source-editor').html('<p>Wystąpił błąd:</p><pre>' + text + '</pre>');
                 $.unblockUI();
             }, error: function(text) {
                 $('#source-editor').html('<p>Wystąpił błąd:</p><pre>' + text + '</pre>');
                 $.unblockUI();
@@ -296,47 +299,211 @@ function html(element) {
         }
     };
     
         }
     };
     
+    function verifyTagInsertPoint(node) {
+        if(node.nodeType == 3) { // Text Node
+            node = node.parentNode;
+        }
+
+        if (node.nodeType != 1) { 
+            return false;
+        }
+
+        console.log('Selection point:', node);
+        
+        node = $(node);
+        var xtype = node.attr('x-node');
+
+        if (!xtype || (xtype.search(':') >= 0) ||
+            xtype == 'motyw' || xtype == 'begin' || xtype == 'end') {
+            return false;
+        }
+        
+        // don't allow themes inside annotations
+        if( node.is('*[x-annotation-box] *') )
+            return false;
+
+        return true;
+    }
+    
+    function addAnnotation()
+    {
+        var selection = window.getSelection();
+        var n = selection.rangeCount;
+
+        console.log("Range count:", n);
+        if (n == 0) {
+            window.alert("Nie zaznaczono żadnego obszaru");
+            return false;
+        }
+
+        // for now allow only 1 range
+        if (n > 1) {
+            window.alert("Zaznacz jeden obszar");
+            return false;
+        }
+
+        // remember the selected range
+        var range = selection.getRangeAt(0);
+
+        if (!verifyTagInsertPoint(range.endContainer)) {
+            window.alert("Nie można wstawić w to miejsce przypisu.");
+            return false;
+        }
+
+        var text = range.toString();
+        var tag = $('<span></span>');
+        range.collapse(false);
+        range.insertNode(tag[0]);
+
+        xml2html({
+            xml: '<pr><slowo_obce>'+text+'</slowo_obce> --- </pr>',
+            success: function(text) {
+                var t = $(text);
+                tag.replaceWith(t);
+                openForEdit(t);
+            },
+            error: function() {
+                tag.remove();
+                alert('Błąd przy dodawaniu przypisu:' + errors);                
+            }
+        })
+    }
+    
+    function addTheme()
+    {
+        var selection = window.getSelection();
+        var n = selection.rangeCount;
+
+        console.log("Range count:", n);
+        if(n == 0) {
+            window.alert("Nie zaznaczono żadnego obszaru");
+            return false;
+        }
+
+        // for now allow only 1 range
+        if(n > 1) {
+            window.alert("Zaznacz jeden obszar");
+            return false;
+        }
+
+        // remember the selected range
+        var range = selection.getRangeAt(0);
+        console.log(range.startContainer, range.startOffset, range.endContainer, range.endOffset);
+
+        // verify if the start/end points make even sense -
+        // they must be inside a x-node (otherwise they will be discarded)
+        // and the x-node must be a main text
+        if (!verifyTagInsertPoint(range.startContainer)) {
+            window.alert("Motyw nie może się zaczynać w tym miejscu.");
+            return false;
+        }
+
+        if (!verifyTagInsertPoint(range.endContainer)) {
+            window.alert("Motyw nie może się kończyć w tym miejscu.");
+            return false;
+        }
+
+        var date = (new Date()).getTime();
+        var random = Math.floor(4000000000*Math.random());
+        var id = (''+date) + '-' + (''+random);
+
+        var spoint = document.createRange();
+        var epoint = document.createRange();
+
+        spoint.setStart(range.startContainer, range.startOffset);
+        epoint.setStart(range.endContainer, range.endOffset);
+
+        console.log('spoint', spoint.startContainer, spoint.startOffset, spoint.endContainer, spoint.endOffset);
+        console.log('epoint', epoint.startContainer, epoint.startOffset, epoint.endContainer, epoint.endOffset);
+
+        var mtag, btag, etag, errors;
+
+        // insert theme-ref
+                
+        xml2html({
+            xml: '<end id="e'+id+'" />',
+            success: function(text) {
+                etag = $('<span></span>');
+                epoint.insertNode(etag[0]);
+                etag.replaceWith(text);
+                xml2html({
+                    xml: '<motyw id="m'+id+'">motyw</motyw>',
+                    success: function(text) {
+                        mtag = $('<span></span>');
+                        spoint.insertNode(mtag[0]);
+                        mtag.replaceWith(text);
+                        xml2html({
+                            xml: '<begin id="b'+id+'" />',
+                            success: function(text) {
+                                btag = $('<span></span>');
+                                spoint.insertNode(btag[0])
+                                btag.replaceWith(text);
+                                selection.removeAllRanges();
+                                openForEdit($('.motyw[theme-class=' + id + ']'));
+                            }
+                        });
+                    }
+                });
+            }
+        });
+    }
     
     function openForEdit($origin)
     {       
     
     function openForEdit($origin)
     {       
-        // if(this.currentOpen && this.currentOpen != $origin) {
-        //     this.closeWithSave(this.currentOpen);
-        // }
-        
         var $box = null
     
         // annotations overlay their sub box - not their own box //
         var $box = null
     
         // annotations overlay their sub box - not their own box //
-        if($origin.is(".annotation-inline-box"))
+        if($origin.is(".annotation-inline-box")) {
             $box = $("*[x-annotation-box]", $origin);
             $box = $("*[x-annotation-box]", $origin);
-        else
+            console.log('annotation!', $box);
+        } else {
             $box = $origin;
             $box = $origin;
+        }
         
         var x = $box[0].offsetLeft;
         var y = $box[0].offsetTop;
         var w = $box.outerWidth();
         var h = $box.innerHeight();
     
         
         var x = $box[0].offsetLeft;
         var y = $box[0].offsetTop;
         var w = $box.outerWidth();
         var h = $box.innerHeight();
     
+        if ($origin.is(".annotation-inline-box")) {
+            w = Math.max(w, 400);
+            h = Math.max(h, 60);
+        }
+        
+        console.log('width:', w, 'height:', h);
+
         // start edition on this node
         // start edition on this node
-        var $overlay = $('<div class="html-editarea"><textarea></textarea></div>');
+        var $overlay = $('<div class="html-editarea"><textarea></textarea></div>').css({
+            position: 'absolute',
+            height: h,
+            left: x,
+            top: y,
+            width: w
+        }).appendTo($box[0].offsetParent || $box.parent()).show();
+        
+        console.log($overlay, $box[0].offsetParent || $box.parent());
+        
         var serializer = new XMLSerializer();
     
         var serializer = new XMLSerializer();
     
+        console.log($box.html());
         html2xml({
         html2xml({
-            xml: serializer.serializeToString($box.get(0)),
+            xml: serializer.serializeToString($box[0]),
+            inner: true,
             success: function(text) {
                 $('textarea', $overlay).val($.trim(text));
             success: function(text) {
                 $('textarea', $overlay).val($.trim(text));
+                console.log($.trim(text));
                 
                 setTimeout(function() {
                 
                 setTimeout(function() {
-                    console.log('focus!');
                     $('textarea', $overlay).focus();
                     $('textarea', $overlay).focus();
-                }, 100);
+                }, 50);
                 
                 $('textarea', $overlay).one('blur', function(event) {
                 
                 $('textarea', $overlay).one('blur', function(event) {
+                    var nodeName = $box.attr('x-node') || 'pe';
                     xml2html({
                     xml2html({
-                        xml: $('textarea', $overlay).val(),
+                        xml: '<' + nodeName + '>' + $('textarea', $overlay).val() + '</' + nodeName + '>',
                         success: function(element) {
                         success: function(element) {
-                            $box.after(element);
+                            $box.html($(element).html());
                             $overlay.remove();
                             $overlay.remove();
-                            $box.remove();
                         },
                         error: function(text) {
                             $overlay.remove();
                         },
                         error: function(text) {
                             $overlay.remove();
@@ -348,21 +515,6 @@ function html(element) {
                 alert('Błąd! ' + text);
             }
         });
                 alert('Błąd! ' + text);
             }
         });
-        
-        // h = Math.max(h, 2*parseInt($box.css('line-height')));
-        
-        console.log(h);
-        
-        $overlay.css({
-            position: 'absolute',
-            height: h,
-            left: x,
-            top: y,
-            right: 0
-        });
-        
-        $($box[0].offsetParent).append($overlay);
-        console.log($overlay);
     }
     
     $('.edit-button').live('click', function(event) {
     }
     
     $('.edit-button').live('click', function(event) {
@@ -382,6 +534,16 @@ function html(element) {
     $('.motyw').live('click', function() {
         selectTheme($(this).attr('theme-class'));
     });
     $('.motyw').live('click', function() {
         selectTheme($(this).attr('theme-class'));
     });
+    
+    $('#insert-annotation-button').click(function() {
+        addAnnotation();
+        return false;
+    });
+    
+    $('#insert-theme-button').click(function() {
+        addTheme();
+        return false;
+    });
 }
 
 
 }
 
 
@@ -409,41 +571,49 @@ $(function() {
             $('#save-ok').click(function() {
                 $.blockUI({message: 'Zapisywanie...'});
                 
             $('#save-ok').click(function() {
                 $.blockUI({message: 'Zapisywanie...'});
                 
-                var metaComment = '<!--';
-                $('#document-meta div').each(function() {
-                    metaComment += '\n\t' + $(this).attr('class') + ': ' + $(this).html();
-                });
-                metaComment += '\n-->'
-                
-                var data = {
-                    name: $('#document-name').html(),
-                    text: metaComment + editor.getCode(),
-                    revision: $('#document-revision').html(),
-                    author: 'annonymous',
-                    comment: $('#komentarz').val()
-                };
-                
-                console.log(data);
+                function doSave (argument) {
+                    var metaComment = '<!--';
+                    $('#document-meta div').each(function() {
+                        metaComment += '\n\t' + $(this).attr('class') + ': ' + $(this).html();
+                    });
+                    metaComment += '\n-->'
+
+                    var data = {
+                        name: $('#document-name').html(),
+                        text: metaComment + editor.getCode(),
+                        revision: $('#document-revision').html(),
+                        author: 'annonymous',
+                        comment: $('#komentarz').val()
+                    };
+
+                    console.log(data);
+
+                    $.ajax({
+                        url: document.location.href,
+                        type: "POST",
+                        dataType: "json",
+                        data: data,                
+                        success: function(data) {
+                            if (data.text) {
+                                editor.setCode(data.text);
+                                $('#document-revision').html(data.revision);
+                            } else {
+                                console.log(data.errors);
+                                alert(data.errors);
+                            }
+                            $.unblockUI();
+                        },
+                        error: function(xhr, textStatus, errorThrown) {
+                            alert('error: ' + textStatus + ' ' + errorThrown);
+                        },
+                    })
+                }
                 
                 
-                $.ajax({
-                    url: document.location.href,
-                    type: "POST",
-                    dataType: "json",
-                    data: data,                
-                    success: function(data) {
-                        if (data.text) {
-                            editor.setCode(data.text);
-                            $('#document-revision').html(data.revision);
-                        } else {
-                            console.log(data.errors);
-                            alert(data.errors);
-                        }
-                        $.unblockUI();
-                    },
-                    error: function(xhr, textStatus, errorThrown) {
-                        alert('error: ' + textStatus + ' ' + errorThrown);
-                    },
-                })
+                if ('#simple-view-tab.active') {
+                    reverseTransform(editor, doSave);
+                } else {
+                    doSave();
+                }
             });
             
             $('#save-cancel').click(function() {
             });
             
             $('#save-cancel').click(function() {