X-Git-Url: https://git.mdrn.pl/redakcja.git/blobdiff_plain/a5103645ffd3cb707677aa733bfbee3c2738f87f..63fa9213819e7006cd1ced0c690dad76f990ec60:/redakcja/static/js/wiki/view_editor_wysiwyg.js
diff --git a/redakcja/static/js/wiki/view_editor_wysiwyg.js b/redakcja/static/js/wiki/view_editor_wysiwyg.js
index ef087a3b..cb7c40f8 100644
--- a/redakcja/static/js/wiki/view_editor_wysiwyg.js
+++ b/redakcja/static/js/wiki/view_editor_wysiwyg.js
@@ -43,8 +43,8 @@
         return true;
     }
 
-    /* Convert HTML frament to plaintext */
-    var ANNOT_FORBIDDEN = ['pt', 'pa', 'pr', 'pe', 'begin', 'end', 'theme'];
+    /* Convert HTML fragment to plaintext */
+    var ANNOT_FORBIDDEN = ['pt', 'pa', 'pr', 'pe', 'begin', 'end', 'motyw'];
 
     function html2plainText(fragment){
         var text = "";
@@ -91,13 +91,12 @@
         // BUG #273 - selected text can contain themes, which should be omitted from
         // defining term
         var text = html2plainText(range.cloneContents());
-
         var tag = $('');
         range.collapse(false);
         range.insertNode(tag[0]);
 
         xml2html({
-            xml: '' + text + ' --- ',
+            xml: '' + text + ' --- ',
             success: function(text){
                 var t = $(text);
                 tag.replaceWith(t);
@@ -194,6 +193,188 @@
         });
     }
 
+    function addSymbol() {
+        if($('div.html-editarea textarea')[0]) {
+            var specialCharsContainer = $("
");
+                        
+            var specialChars = ['Ä','Ä
','Ä','Ä','Ä','Ä','Å','Å','Å','Å','Ã','ó','Å','Å','Å»','ż','Ź','ź','Ã','á','Ã','à',
+            'Ã','â','Ã','ä','Ã
','Ã¥','Ä','Ä','Ä','Ä','Ã','ã',
+            'Ã','æ','Ã','ç','Ä','Ä','Ä','Ä','Ä','Ä','Ã','é','Ã','è',
+            'Ã','ê','Ã','ë','Ä','Ä','Ä','Ä','Ä ','Ä¡','Ħ','ħ','Ã','Ã','Ã','î',
+            'Ī','Ä«','Ĭ','Ä','Ľ','ľ','Ã','ñ','Å','Å','Ã','ó','Ã','ö',
+            'Ã','ô','Å','Å','Ç','Ç','Å','Å','Ã','ø','Å','Å','Å ',
+            'Å¡','Å','Å','Ť','Å¥','Å¢','Å£','Ű','ű','Ã','ú','Ã','ù',
+            'Ã','ü','Å®','ů','Ū','Å«','Ã','û','Ŭ','Å',
+            'Ã','ý','Ž','ž','Ã','Ã','ð','Ã','þ','Ð','а','Ð',
+            'б','Ð','в','Ð','г','Ð','д','Ð','е','Ð','Ñ','Ð',
+            'ж','Ð','з','Ð','и','Ð','й','Ð','к','Ð','л','Ð',
+            'м','Ð','н','Ð','о','Ð','п','Р','Ñ','С','Ñ',
+            'Т','Ñ','У','Ñ','Ф','Ñ','Ð¥','Ñ
','Ц','Ñ','Ч',
+            'Ñ','Ш','Ñ','Щ','Ñ','Ъ','Ñ','Ы','Ñ','Ь','Ñ','Ð',
+            'Ñ','Ю','Ñ','Я','Ñ','Ñ','Ñ','Ñ','Ñ','Ñ','Ñ','Ñ',
+            'Ò','Ò','Î','α','Î','β','Î','γ','Î','δ','Î','ε',
+            'Î','ζ','Î','η','Î','θ','Î','ι','Î','κ','Î','λ','Î',
+            'μ','Î','ν','Î','ξ','Î','ο','Π','Ï','Ρ','Ï','Σ','Ï','Ï',
+            'Τ','Ï','Î¥','Ï
','Φ','Ï','Χ','Ï','Ψ','Ï','Ω','Ï','â',
+            'â','¡','¿','$','¢','£','â¬','©','®','°','¹','²','³',
+            '¼','½','¾','â ','§','â°','â¢','â','â','â','â',
+            'â','â','ââ','«','»','«»','»«','â','[',']','~','|','â','·',
+            'Ã','÷','â','â ','±','â¤','â¥','â'];
+            var tableContent = "";
+            
+            for(var i in specialChars) {
+                if(i % 14 == 0 && i > 0) {
+                    tableContent += "
";
+                }              
+                tableContent += " | ";              
+            }
+            
+            tableContent += "
";                                   
+            $("#content").append(specialCharsContainer);
+            
+            
+             // localStorage for recently used characters - reading
+             if (typeof(localStorage) != 'undefined') {
+                 if (localStorage.getItem("recentSymbols")) {
+                     var recent = localStorage.getItem("recentSymbols");
+                     var recentArray = recent.split(";");
+                     var recentRow = "";
+                     for(var i in recentArray.reverse()) {
+                        recentRow += " | ";              
+                     }
+                     recentRow = "" + recentRow + "
";                              
+                 }
+             }            
+            $("#tableSpecialChars").append(recentRow);
+            $("#tableSpecialChars").append(tableContent);
+            
+            /* events */
+            
+            $('.specialBtn').click(function(){
+                var editArea = $('div.html-editarea textarea')[0];
+                var insertVal = $(this).val();
+                
+                // if we want to surround text with quotes
+                // not sure if just check if value has length == 2
+                
+                if (insertVal.length == 2) {
+                    var startTag = insertVal[0];
+                    var endTag = insertVal[1];
+			        var textAreaOpened = editArea;			                                
+			        //IE support
+		                if (document.selection) {
+		                    textAreaOpened.focus();
+		                    sel = document.selection.createRange();
+		                    sel.text = startTag + sel.text + endTag;
+		                }
+		                //MOZILLA/NETSCAPE support
+		                else if (textAreaOpened.selectionStart || textAreaOpened.selectionStart == '0') {
+		                    var startPos = textAreaOpened.selectionStart;
+		                    var endPos = textAreaOpened.selectionEnd;
+		                    textAreaOpened.value = textAreaOpened.value.substring(0, startPos)
+				          + startTag + textAreaOpened.value.substring(startPos, endPos) + endTag + textAreaOpened.value.substring(endPos, textAreaOpened.value.length);
+		                }                
+                } else {
+                    // if we just want to insert single symbol
+                    insertAtCaret(editArea, insertVal);
+                }
+                
+                // localStorage for recently used characters - saving
+                if (typeof(localStorage) != 'undefined') {
+                    if (localStorage.getItem("recentSymbols")) {
+                        var recent = localStorage.getItem("recentSymbols");
+                        var recentArray = recent.split(";");
+                        var valIndex = $.inArray(insertVal, recentArray);
+                        //alert(valIndex);
+                        if(valIndex == -1) {
+                            // value not present in array yet
+                            if(recentArray.length > 13){
+                                recentArray.shift();
+                                recentArray.push(insertVal);
+                            } else {
+                                recentArray.push(insertVal);
+                            }
+                        } else  {
+                            // value already in the array
+                            for(var i = valIndex; i < recentArray.length; i++){
+                                recentArray[i] = recentArray[i+1];
+                            }
+                            recentArray[recentArray.length-1] = insertVal;
+                        }
+                        localStorage.setItem("recentSymbols", recentArray.join(";"));
+                    } else {
+                        localStorage.setItem("recentSymbols", insertVal);
+                    }
+                }
+                
+                $(specialCharsContainer).remove();
+            });         
+            $('#specialCharsClose').click(function(){
+                $(specialCharsContainer).remove();
+            });                   
+            
+        } else {
+            window.alert('Najedź na fragment tekstu, wybierz "Edytuj" i ustaw kursor na miejscu gdzie chcesz wstawiÄ symbol.');
+        }
+    }
+
+    function insertAtCaret(txtarea,text) { 
+        /* 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 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; 
+        var front = (txtarea.value).substring(0,strPos); 
+        var back = (txtarea.value).substring(strPos,txtarea.value.length); 
+        txtarea.value=front+text+back; 
+        strPos = strPos + text.length; 
+        if (br == "ie") { 
+            txtarea.focus(); 
+            var range = document.selection.createRange(); 
+            range.moveStart ('character', -txtarea.value.length); 
+            range.moveStart ('character', strPos); 
+            range.moveEnd ('character', 0); 
+            range.select(); 
+        } else if (br == "ff") { 
+            txtarea.selectionStart = strPos; 
+            txtarea.selectionEnd = strPos; 
+            txtarea.focus(); 
+        } 
+        txtarea.scrollTop = scrollPos; 
+    } 
+
+    function getXNodeAttributes(node) {
+	var m = {}
+	$.map(node.attributes, function(attrNode) {
+	    if (attrNode.nodeName.indexOf('data-wlf-') === 0) {
+		var n = attrNode.nodeName.substr(9);
+		var v = attrNode.nodeValue;
+		m[n] = v;
+	    };
+	});
+	return m;
+    }
+
+    function setXNodeAttributes(node, attrs) {
+	$.map(node.attributes, function(attrNode) {
+	    var xName = attrNode.nodeName.substr(9);
+	    if (attrNode.nodeName.indexOf('data-wlf-') === 0
+		&& xName in attrs) {
+		attrNode.nodeValue = attrs[xName];
+	    }
+	    if (attrNode.nodeName.indexOf('x-attr-name-') === 0
+		&& attrNode.nodeValue in attrs) {
+		node.setAttribute('x-attr-value-' + attrNode.nodeName.substr("x-attr-name-".length),
+				  attrs[attrNode.nodeValue]);
+	    }
+	});
+    }
+
     /* open edition window for selected fragment */
     function openForEdit($origin){
         var $box = null
@@ -205,32 +386,52 @@
         else {
             $box = $origin;
         }
-
         var x = $box[0].offsetLeft;
-        var y = $box[0].offsetTop;
+        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);
+            if($('.htmlview div').offset().left + $('.htmlview div').width() > ($('.vsplitbar').offset().left - 480)){
+                x = -(Math.max($origin.offset().left, $origin.width())); 
+            } else {
+                x = 100;
+            }
         }
 
         // start edition on this node
-        var $overlay = $('').css({
+        var $overlay = $('');
+	
+	$attributes = $('')
+	
+	$.map(getXNodeAttributes($origin.get(0)),
+	      function(v, n) {
+		$attributes.append('');
+	      });
+	$overlay.append($attributes);
+
+	$overlay.css({
             position: 'absolute',
             height: h,
             left: x,
             top: y,
             width: w
         }).appendTo($box[0].offsetParent || $box.parent()).show();
+        
 
         if ($origin.is('.motyw')) {
-            $('textarea', $overlay).autocomplete(THEMES, {
-                autoFill: true,
-                multiple: true,
-                selectFirst: true
-            });
+	    $('.akap-edit-button').remove();
+            withThemes(function(canonThemes){
+                $('textarea', $overlay).autocomplete(canonThemes, {
+                    autoFill: true,
+                    multiple: true,
+                    selectFirst: true,
+                    highlight: false
+                });
+            })
         }
 
         if ($origin.is('.motyw')){
@@ -254,7 +455,14 @@
             });
         }
         else {
-            $('.delete-button', $overlay).hide();
+            $('.delete-button', $overlay).html("Anuluj");
+            $('.delete-button', $overlay).click(function(){
+                if (window.confirm("Czy jesteÅ pewien, że chcesz anulowaÄ zmiany?")) {
+                    $overlay.remove();
+                    $(document).unbind('click.blur-overlay');
+                    return false;
+                };
+            });
         }
 
 
@@ -281,7 +489,21 @@
                     xml2html({
                         xml: '<' + nodeName + '>' + insertedText + '' + nodeName + '>',
                         success: function(element){
-                            $origin.html($(element).html());
+                            if (nodeName == 'out-of-flow-text') {
+                                $(element).children().insertAfter($origin);
+                                $origin.remove()
+                            }
+                            else {
+                                $origin.html($(element).html());
+                            }
+			    /* Set attributres back to the node */
+			    var attrs = {};
+			    $(".html-editarea-attributes [name]")
+				.each(function(i, textField) {
+				    attrs[textField.name] = textField.value;
+				});
+			    setXNodeAttributes($origin.get(0), attrs);
+
                             $overlay.remove();
                         },
                         error: function(text){
@@ -289,8 +511,57 @@
                             alert('BÅÄ
d! ' + text);
                         }
                     })
+                    
+                    var msg = $("PamiÄtaj, żeby zapisaÄ swoje zmiany.
 ");
+                    $("#base").prepend(msg);
+                    $('#base .saveNotify').fadeOut(3000, function(){
+                        $(this).remove(); 
+                    });
                 }
 
+		$('.akap-edit-button', $overlay).click(function(){
+			var textAreaOpened = $('textarea', $overlay)[0];
+			var startTag = "";
+			var endTag = "";
+			var buttonName = this.innerHTML;
+
+			if(buttonName == "sÅowo obce") {
+				startTag = "";
+				endTag = "";
+			} else if (buttonName == "wyróżnienie") {
+				startTag = "";
+				endTag = "";
+			} else if (buttonName == "tytuÅ dzieÅa") {
+				startTag = "";
+				endTag = "";
+			} else if(buttonName == "znak spec."){
+			    addSymbol();
+			    return false;
+			} else if (buttonName == "luka") {
+				startTag = "";
+				endTag = "";
+			} else if (buttonName == "zastÄ
p") {
+				startTag = "";
+				endTag = "";
+			}
+			
+			var myField = textAreaOpened;			
+                        
+			//IE support
+		        if (document.selection) {
+		            textAreaOpened.focus();
+		            sel = document.selection.createRange();
+		            sel.text = startTag + sel.text + endTag;
+		        }
+		        //MOZILLA/NETSCAPE support
+		        else if (textAreaOpened.selectionStart || textAreaOpened.selectionStart == '0') {
+		            var startPos = textAreaOpened.selectionStart;
+		            var endPos = textAreaOpened.selectionEnd;
+		            textAreaOpened.value = textAreaOpened.value.substring(0, startPos)
+				  + startTag + textAreaOpened.value.substring(startPos, endPos) + endTag + textAreaOpened.value.substring(endPos, textAreaOpened.value.length);
+		        }
+		});
+
                 $('.accept-button', $overlay).click(function(){
                     save();
                 });
@@ -300,7 +571,6 @@
                         return;
                     }
                     save();
-
                     $(document).unbind('click.blur-overlay');
                 });
 
@@ -347,7 +617,7 @@
                 $('#insert-theme-button').click(function(){
                     addTheme();
                     return false;
-                });
+                });            
 
                 $('.edit-button').live('click', function(event){
                     event.preventDefault();
@@ -391,12 +661,11 @@
                 $('#html-view').html(element);
                 _finalize(success);
             },
-            error: function(text){
-                var message = $('');
-                message.text(text);
-                $('#html-view').html('WystÄ
piÅ bÅÄ
d:
' +
-                message.html() +
-                '
');
+            error: function(text, source){
+                err = 'WystÄ
piÅ bÅÄ
d:
'+text+'
';
+                if (source)
+                    err += ''+source.replace(/&/g, '&').replace(/'
+                $('#html-view').html(err);
                 _finalize(failure);
             }
         });
@@ -419,7 +688,8 @@
             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);