Wstawianie przypisów w HTML.
[redakcja.git] / platforma / static / js / main.js
index 0928bf8..739808d 100644 (file)
@@ -64,7 +64,6 @@ function gallery(element, url) {
     
     var pn = $('.page-number', element);
     pn.change(function(event) {
-        console.log('change!', $(this).val());
         event.preventDefault();
         var n = normalizeNumber(pn.val());
         pn.val(n);
@@ -120,7 +119,10 @@ function gallery(element, url) {
             galleryWidth: $(this).parent().width(),
             galleryHeight: $(this).parent().height()
         };
-        console.log('load', imageDimensions)
+        
+        if (!(imageDimensions.width && imageDimensions.height)) {
+            setTimeout(function() { $('img', element).load(); }, 100);
+        }        
         var position = normalizePosition(
             image.position().left,
             image.position().top, 
@@ -182,7 +184,6 @@ function gallery(element, url) {
             imageDimensions.width,
             imageDimensions.height
         );
-        console.log(image.position(), imageDimensions, position);
         image.css({width: imageDimensions.width, height: imageDimensions.height,
             left: position.x, top: position.y});
 
@@ -252,7 +253,7 @@ function transform(editor) {
 };
 
 
-function reverseTransform(editor) {
+function reverseTransform(editor, cont) {
     var serializer = new XMLSerializer();
     if ($('#html-view .error').length > 0) {
         return;
@@ -264,6 +265,9 @@ function reverseTransform(editor) {
             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();
@@ -273,14 +277,15 @@ function reverseTransform(editor) {
 }
 
 
+// =============
+// = HTML View =
+// =============
 function html(element) {
     var element = $(element);
     
     function selectTheme(themeId)
     {
         var selection = window.getSelection();
-
-        // remove current selection
         selection.removeAllRanges();
 
         var range = document.createRange();
@@ -294,52 +299,148 @@ function html(element) {
         }
     };
     
-    // 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 //
-    //     if($origin.is(".annotation-inline-box"))
-    //         $box = $("*[x-annotation-box]", $origin);
-    //     else
-    //         $box = $origin;
-    //     
-    //     var x = $box[0].offsetLeft;
-    //     var y = $box[0].offsetTop;
-    //     var w = $box.outerWidth();
-    //     var h = $box.innerHeight();
-    // 
-    //     console.log("Edit origin:", $origin, " box:", $box);
-    //     console.log("offsetParent:", $box[0].offsetParent);
-    //     console.log("Dimensions: ", x, y, w , h);
-    // 
-    //     // start edition on this node
-    //     var $overlay = $('<div class="html-editarea"><textarea></textarea></div>');
-    // 
-    //     h = Math.max(h - 20, 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() {
-    //     openForEdit($(this).parent());
-    // });
-    // 
+    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;
+        }
+
+        // this is hopefully redundant
+        //if(! node.is('*.utwor *') )
+        //    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) {
+                tag.replaceWith(text);
+            },
+            error: function() {
+                tag.remove();
+                alert('Błąd przy dodawaniu przypisu:' + errors);                
+            }
+        })
+    }
+    
+    function openForEdit($origin)
+    {       
+        var $box = null
+    
+        // annotations overlay their sub box - not their own box //
+        if($origin.is(".annotation-inline-box")) {
+            $box = $("*[x-annotation-box]", $origin);
+            console.log('annotation!', $box);
+        } else {
+            $box = $origin;
+        }
+        
+        var x = $box[0].offsetLeft;
+        var y = $box[0].offsetTop;
+        var w = $box.outerWidth();
+        var h = $box.innerHeight();
+    
+        console.log('width:', w, 'height:', h);
+
+        // start edition on this node
+        var $overlay = $('<div class="html-editarea"><textarea></textarea></div>').css({
+            position: 'absolute',
+            height: h,
+            left: x,
+            top: y,
+            width: w
+            // right: 0
+        }).appendTo($box[0].offsetParent || element).show();
+        
+        console.log($overlay, $box[0].offsetParent || element);
+        
+        var serializer = new XMLSerializer();
+    
+        console.log($box.html());
+        html2xml({
+            xml: serializer.serializeToString($box[0]),
+            inner: true,
+            success: function(text) {
+                $('textarea', $overlay).val($.trim(text));
+                console.log($.trim(text));
+                
+                setTimeout(function() {
+                    $('textarea', $overlay).focus();
+                }, 100);
+                
+                $('textarea', $overlay).one('blur', function(event) {
+                    var nodeName = $box.attr('x-node') || 'pe';
+                    xml2html({
+                        xml: '<' + nodeName + '>' + $('textarea', $overlay).val() + '</' + nodeName + '>',
+                        success: function(element) {
+                            $box.html($(element).html());
+                            $overlay.remove();
+                        },
+                        error: function(text) {
+                            $overlay.remove();
+                            alert('Błąd! ' + text);
+                        }
+                    })
+                });
+            }, error: function(text) {
+                alert('Błąd! ' + text);
+            }
+        });
+    }
+    
+    $('.edit-button').live('click', function(event) {
+        event.preventDefault();
+        openForEdit($(this).parent());
+    });
+    
     var button = $('<button class="edit-button">Edytuj</button>');
     $(element).bind('mousemove', function(event) {
         var editable = $(event.target).closest('*[x-editable]');
@@ -352,6 +453,11 @@ function html(element) {
     $('.motyw').live('click', function() {
         selectTheme($(this).attr('theme-class'));
     });
+    
+    $('#insert-annotation-button').click(function() {
+        addAnnotation();
+        return false;
+    });
 }
 
 
@@ -379,41 +485,49 @@ $(function() {
             $('#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() {