diff --git a/editor/jgraduate/jquery.jgraduate.js b/editor/jgraduate/jquery.jgraduate.js index 3fa4ca8f..72bc200d 100644 --- a/editor/jgraduate/jquery.jgraduate.js +++ b/editor/jgraduate/jquery.jgraduate.js @@ -49,6 +49,22 @@ if(!window.console) { this.dir = function(str) {}; }; } +$.cloneNode = function(el) { + if(!window.opera) return el.cloneNode(true); + // manually create a copy of the element + opera.postError(ns.svg, el.nodeName); + var new_el = document.createElementNS(ns.svg, el.nodeName); + $.each(el.attributes, function(i, attr) { + new_el.setAttributeNS(ns.svg, attr.nodeName, attr.nodeValue); + }); + $.each(el.childNodes, function(i, child) { + if(child.nodeType == 1) { + new_el.appendChild($.cloneNode(child)); + } + }); + return new_el; +} + $.jGraduate = { Paint: function(opt) { @@ -69,7 +85,7 @@ $.jGraduate = { break; case "linearGradient": this.solidColor = null; - this.linearGradient = options.copy.linearGradient.cloneNode(true); + this.linearGradient = $.cloneNode(options.copy.linearGradient); break; } } @@ -77,7 +93,7 @@ $.jGraduate = { else if (options.linearGradient) { this.type = "linearGradient"; this.solidColor = null; - this.linearGradient = options.linearGradient.cloneNode(true); + this.linearGradient = $.cloneNode(options.linearGradient); } // create solid color paint else if (options.solidColor) { @@ -209,7 +225,8 @@ jQuery.fn.jGraduate = // if we are sent a gradient, import it if ($this.paint.type == "linearGradient") { $this.paint.linearGradient.id = id+'_jgraduate_grad'; - $this.paint.linearGradient = svg.appendChild(document.importNode($this.paint.linearGradient, true)); +// $this.paint.linearGradient = svg.appendChild(document.importNode($this.paint.linearGradient, true)); + $this.paint.linearGradient = svg.appendChild($.cloneNode($this.paint.linearGradient)); } else { // we create a gradient var grad = svg.appendChild(document.createElementNS(ns.svg, 'linearGradient')); diff --git a/editor/svg-editor.js b/editor/svg-editor.js index bdc00107..e84088a3 100644 --- a/editor/svg-editor.js +++ b/editor/svg-editor.js @@ -229,7 +229,6 @@ function svg_edit_setup() { var getPaint = function(color, opac) { // update the editor's fill paint var opts = null; - if (color.substr(0,5) == "url(#") { opts = { alpha: opac, @@ -825,6 +824,7 @@ function svg_edit_setup() { var clickClear = function(){ if( confirm(uiStrings.QwantToClear) ) { svgCanvas.clear(); + populateLayers(); updateContextPanel(); } }; @@ -1413,6 +1413,7 @@ function svg_edit_setup() { if (paint.type == "linearGradient") { svgbox.removeChild(oldgrad); var newgrad = svgbox.appendChild(document.importNode(paint.linearGradient, true)); + svgCanvas.fixOperaXML(newgrad, paint.linearGradient) newgrad.id = "gradbox_"+picker; rectbox.setAttribute("fill", "url(#gradbox_" + picker + ")"); } diff --git a/editor/svgcanvas.js b/editor/svgcanvas.js index 7b05fa39..e152fbe9 100644 --- a/editor/svgcanvas.js +++ b/editor/svgcanvas.js @@ -982,7 +982,6 @@ function BatchCommand(text) { node.nodeValue = node.nodeValue.replace(/^\s+|\s+$/g, ""); } if (node.nodeType != 1) return; - var doc = node.ownerDocument; var parent = node.parentNode; // can parent ever be null here? I think the root node's parent is the document... @@ -1054,7 +1053,7 @@ function BatchCommand(text) { var i = lgrads.length; while (i--) { var grad = lgrads[i]; - var id = grad.getAttribute('id'); + var id = grad.id; var url_id = 'url(#' + id + ')'; if($.inArray(url_id, grad_uses) == -1) { // Not found, so remove @@ -1166,7 +1165,7 @@ function BatchCommand(text) { // importNode, like cloneNode, causes the comma-to-period // issue in Opera/Win/non-en. Thankfully we can compare to the original XML // and simply use the original value when necessary - var fixOperaXML = function(elem, orig_el) { + this.fixOperaXML = function(elem, orig_el) { var x_attrs = elem.attributes; $.each(x_attrs, function(i, attr) { if(attr.nodeValue.indexOf(',') == -1) return; @@ -1174,14 +1173,18 @@ function BatchCommand(text) { var ns = attr.nodeName == 'href' ? xlinkns : attr.prefix == "xml" ? xmlns : null; var good_attrval = orig_el.getAttribute(attr.nodeName); - elem.setAttributeNS(ns, attr.nodeName, good_attrval); + if(ns) { + elem.setAttributeNS(ns, attr.nodeName, good_attrval); + } else { + elem.setAttribute(attr.nodeName, good_attrval); + } }); var childs = elem.childNodes; var o_childs = orig_el.childNodes; $.each(childs, function(i, child) { if(child.nodeType == 1) { - fixOperaXML(child, o_childs[i]); + canvas.fixOperaXML(child, o_childs[i]); } }); } @@ -3881,7 +3884,7 @@ function BatchCommand(text) { // Fix XML for Opera/Win/Non-EN if(window.opera) { - fixOperaXML(svgcontent, newDoc.documentElement); + canvas.fixOperaXML(svgcontent, newDoc.documentElement); } svgcontent.setAttribute('id', 'svgcontent'); @@ -4685,7 +4688,9 @@ function BatchCommand(text) { var defs = findDefs(); // no duplicate found, so import gradient into defs if (!duplicate_grad) { + var orig_grad = grad; grad = defs.appendChild( svgdoc.importNode(grad, true) ); + canvas.fixOperaXML(grad, orig_grad); // get next id and set it on the grad grad.id = getNextId(); }