smarter mark final form
[redakcja.git] / redakcja / static / js / wiki / view_editor_wysiwyg.js
index 8fe8051..3ec4f70 100644 (file)
@@ -37,7 +37,7 @@
         }
 
         // don't allow themes inside annotations
-        if (node.is('*[x-annotation-box] *'))
+        if (node.closest('[x-node="pe"]').length > 0)
             return false;
 
         return true;
         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);
-
+        var createPoint = function(container, offset) {
+            var offsetBetweenCommas = function(text, offset) {
+                if(text.length < 2 || offset < 1 || offset > text.length)
+                    return false;
+                return text[offset-1] === ',' && text[offset] === ',';
+            }
+            var point = document.createRange();
+            offset = offsetBetweenCommas(container.textContent, offset) ? offset - 1 : offset;
+            point.setStart(container, offset);
+            return point;
+        }
+        
+        var spoint = createPoint(range.startContainer, range.startOffset);
+        var epoint = createPoint(range.endContainer, range.endOffset);
+               
         var mtag, btag, etag, errors;
 
         // insert theme-ref
         if($('div.html-editarea textarea')[0]) {
             var specialCharsContainer = $("<div id='specialCharsContainer'><a href='#' id='specialCharsClose'>Zamknij</a><table id='tableSpecialChars' style='width: 600px;'></table></div>");
                         
-            var specialChars = ['Ą','ą','Ć','ć','Ę','ę','Ł','ł','Ń','ń','Ó','ó','Ś','ś','Ż','ż','Ź','ź','Á','á','À','à',
+            var specialChars = [' ', 'Ą','ą','Ć','ć','Ę','ę','Ł','ł','Ń','ń','Ó','ó','Ś','ś','Ż','ż','Ź','ź','Á','á','À','à',
             'Â','â','Ä','ä','Å','å','Ā','ā','Ă','ă','Ã','ã',
             'Æ','æ','Ç','ç','Č','č','Ċ','ċ','Ď','ď','É','é','È','è',
             'Ê','ê','Ë','ë','Ē','ē','Ě','ě','Ġ','ġ','Ħ','ħ','Í','í','Î','î',
             'Ī','ī','Ĭ','ĭ','Ľ','ľ','Ñ','ñ','Ň','ň','Ó','ó','Ö','ö',
             'Ô','ô','Ō','ō','Ǒ','ǒ','Œ','œ','Ø','ø','Ř','ř','Š',
-            'š','Ş','ş','Ť','ť','Ţ','ţ','Ű','ű','Ú','ú',
+            'š','Ş','ş','Ť','ť','Ţ','ţ','Ű','ű','Ú','ú','Ù','ù',
             'Ü','ü','Ů','ů','Ū','ū','Û','û','Ŭ','ŭ',
             'Ý','ý','Ž','ž','ß','Ð','ð','Þ','þ','А','а','Б',
             'б','В','в','Г','г','Д','д','Е','е','Ё','ё','Ж',
                 // if we want to surround text with quotes
                 // not sure if just check if value has length == 2
                 
-                if (insertVal.length) == 2) {
+                if (insertVal.length == 2) {
                     var startTag = insertVal[0];
                     var endTag = insertVal[1];
                                var textAreaOpened = editArea;                                                  
                         localStorage.setItem("recentSymbols", insertVal);
                     }
                 }
-                
                 $(specialCharsContainer).remove();
             });         
             $('#specialCharsClose').click(function(){
         /* http://www.scottklarr.com/topic/425/how-to-insert-text-into-a-textarea-where-the-cursor-is/ */
         var scrollPos = txtarea.scrollTop; 
         var strPos = 0; 
+        var backStart = 0;
         var br = ((txtarea.selectionStart || txtarea.selectionStart == '0') ? "ff" : (document.selection ? "ie" : false ) );
         if (br == "ie") { 
             txtarea.focus();
             var range = document.selection.createRange(); 
             range.moveStart ('character', -txtarea.value.length); 
-            strPos = range.text.length; 
-        } else if (br == "ff") strPos = txtarea.selectionStart; 
+            strPos = backStart = range.text.length; 
+        } else if (br == "ff") {
+            strPos = txtarea.selectionStart; 
+            backStart = txtarea.selectionEnd;
+        }
         var front = (txtarea.value).substring(0,strPos); 
-        var back = (txtarea.value).substring(strPos,txtarea.value.length); 
+        var back = (txtarea.value).substring(backStart,txtarea.value.length); 
         txtarea.value=front+text+back; 
         strPos = strPos + text.length; 
         if (br == "ie") { 
                             $overlay.remove();
                         },
                         error: function(text){
-                            $overlay.remove();
                             alert('Błąd! ' + text);
                         }
                     })
 
                 $('.accept-button', $overlay).click(function(){
                     save();
+                    $(document).unbind('click.blur-overlay');
                 });
 
                 $(document).bind('click.blur-overlay', function(event){
-                    if ($(event.target).parents('.html-editarea').length > 0) {
+                    if ($(event.target).closest('.html-editarea, #specialCharsContainer').length > 0) {
                         return;
                     }
                     save();
         xml2html({
             xml: this.doc.text,
             success: function(element){
-                $('#html-view').html(element);
+                var htmlView = $('#html-view');
+                htmlView.html(element);
+                htmlView.find('*[x-node]').dblclick(function(e) {
+                    if($(e.target).is('textarea'))
+                        return;
+                    var selection = window.getSelection();
+                    selection.collapseToStart();
+                    selection.modify('extend', 'forward', 'word');
+                    e.stopPropagation();
+                });
                 _finalize(success);
             },
             error: function(text, source){
             return _finalize(failure);
 
         html2text({
-            element: $('#html-view div').get(0),
+            element: $('#html-view').get(0),
+            stripOuter: true,
             success: function(text){
                 self.doc.setText(text);
                 _finalize(success);