2010-10-26 07:25:21 +00:00
|
|
|
/**
|
2010-11-05 17:00:32 +00:00
|
|
|
* Package: svgedit.browsersupport
|
2010-10-26 07:25:21 +00:00
|
|
|
*
|
|
|
|
* Licensed under the Apache License, Version 2
|
|
|
|
*
|
|
|
|
* Copyright(c) 2010 Jeff Schiller
|
|
|
|
* Copyright(c) 2010 Alexis Deveria
|
|
|
|
*/
|
|
|
|
|
|
|
|
// Dependencies:
|
|
|
|
// 1) jQuery (for $.alert())
|
|
|
|
|
|
|
|
(function() {
|
|
|
|
|
2010-10-29 05:09:39 +00:00
|
|
|
if (!window.svgedit) {
|
2010-10-26 16:33:44 +00:00
|
|
|
window.svgedit = {};
|
|
|
|
}
|
|
|
|
|
2010-11-05 17:00:32 +00:00
|
|
|
if (!svgedit.browsersupport) {
|
|
|
|
svgedit.browsersupport = {};
|
2010-10-29 05:09:39 +00:00
|
|
|
}
|
2010-10-26 07:25:21 +00:00
|
|
|
|
|
|
|
var svgns = 'http://www.w3.org/2000/svg';
|
|
|
|
var userAgent = navigator.userAgent;
|
2010-11-08 18:03:33 +00:00
|
|
|
var svg = document.createElementNS(svgns, 'svg');
|
2010-10-26 07:25:21 +00:00
|
|
|
|
|
|
|
// Note: Browser sniffing should only be used if no other detection method is possible
|
2010-11-07 20:14:05 +00:00
|
|
|
var isOpera_ = !!window.opera;
|
|
|
|
var isWebkit_ = userAgent.indexOf("AppleWebKit") >= 0;
|
|
|
|
var isGecko_ = userAgent.indexOf('Gecko/') >= 0;
|
|
|
|
|
|
|
|
svgedit.browsersupport.isOpera = function() { return isOpera_; }
|
|
|
|
svgedit.browsersupport.isWebkit = function() { return isWebkit_; }
|
|
|
|
svgedit.browsersupport.isGecko = function() { return isGecko_; }
|
2010-10-26 07:25:21 +00:00
|
|
|
|
|
|
|
// segList functions (for FF1.5 and 2.0)
|
2010-10-29 05:09:39 +00:00
|
|
|
function supportPathReplaceItem() {
|
2010-11-08 18:03:33 +00:00
|
|
|
var path = document.createElementNS(svgns, 'path');
|
2010-10-26 07:25:21 +00:00
|
|
|
path.setAttribute('d','M0,0 10,10');
|
|
|
|
var seglist = path.pathSegList;
|
|
|
|
var seg = path.createSVGPathSegLinetoAbs(5,5);
|
|
|
|
try {
|
|
|
|
seglist.replaceItem(seg, 0);
|
|
|
|
return true;
|
|
|
|
} catch(err) {}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2010-10-29 05:09:39 +00:00
|
|
|
function supportPathInsertItemBefore() {
|
2010-10-26 07:25:21 +00:00
|
|
|
var path = document.createElementNS(svgns,'path');
|
|
|
|
path.setAttribute('d','M0,0 10,10');
|
|
|
|
var seglist = path.pathSegList;
|
|
|
|
var seg = path.createSVGPathSegLinetoAbs(5,5);
|
|
|
|
try {
|
|
|
|
seglist.insertItemBefore(seg, 0);
|
|
|
|
return true;
|
|
|
|
} catch(err) {}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
// text character positioning
|
2010-10-29 05:09:39 +00:00
|
|
|
function supportTextCharPos() {
|
2010-10-26 07:25:21 +00:00
|
|
|
var retValue = false;
|
|
|
|
var svgcontent = document.createElementNS(svgns, 'svg');
|
|
|
|
document.documentElement.appendChild(svgcontent);
|
|
|
|
try {
|
|
|
|
var text = document.createElementNS(svgns,'text');
|
|
|
|
text.textContent = 'a';
|
|
|
|
svgcontent.appendChild(text);
|
|
|
|
text.getStartPositionOfChar(0);
|
|
|
|
retValue = true;
|
|
|
|
} catch(err) {}
|
|
|
|
document.documentElement.removeChild(svgcontent);
|
|
|
|
return retValue;
|
|
|
|
}
|
|
|
|
|
2010-10-29 05:09:39 +00:00
|
|
|
function supportEditableText() {
|
2010-10-26 07:25:21 +00:00
|
|
|
// TODO: Find better way to check support for this
|
2010-11-07 20:14:05 +00:00
|
|
|
return svgedit.browsersupport.isOpera();
|
2010-10-26 07:25:21 +00:00
|
|
|
}
|
|
|
|
|
2010-10-29 05:09:39 +00:00
|
|
|
function supportGoodDecimals() {
|
2010-10-26 07:25:21 +00:00
|
|
|
// Correct decimals on clone attributes (Opera < 10.5/win/non-en)
|
2010-11-08 18:03:33 +00:00
|
|
|
var rect = document.createElementNS(svgns, 'rect');
|
2010-10-26 07:25:21 +00:00
|
|
|
rect.setAttribute('x',.1);
|
|
|
|
var crect = rect.cloneNode(false);
|
|
|
|
var retValue = (crect.getAttribute('x').indexOf(',') == -1);
|
|
|
|
if(!retValue) {
|
|
|
|
$.alert("NOTE: This version of Opera is known to contain bugs in SVG-edit.\n\
|
|
|
|
Please upgrade to the <a href='http://opera.com'>latest version</a> in which the problems have been fixed.");
|
|
|
|
}
|
|
|
|
return retValue;
|
|
|
|
}
|
|
|
|
|
2010-10-29 05:09:39 +00:00
|
|
|
function supportNonScalingStroke() {
|
2010-11-08 18:03:33 +00:00
|
|
|
var rect = document.createElementNS(svgns, 'rect');
|
2010-10-26 07:25:21 +00:00
|
|
|
rect.setAttribute('style','vector-effect:non-scaling-stroke');
|
|
|
|
return rect.style.vectorEffect === 'non-scaling-stroke';
|
|
|
|
}
|
|
|
|
|
2010-11-08 18:03:33 +00:00
|
|
|
function supportNativeSVGTransformLists() {
|
|
|
|
var rect = document.createElementNS(svgns, 'rect');
|
|
|
|
var rxform = rect.transform.baseVal;
|
|
|
|
|
|
|
|
var t1 = svg.createSVGTransform();
|
|
|
|
rxform.appendItem(t1);
|
|
|
|
return rxform.getItem(0) == t1;
|
|
|
|
}
|
|
|
|
|
2010-11-05 17:00:32 +00:00
|
|
|
svgedit.browsersupport.pathReplaceItem = supportPathReplaceItem();
|
|
|
|
svgedit.browsersupport.pathInsertItemBefore = supportPathInsertItemBefore();
|
|
|
|
svgedit.browsersupport.textCharPos = supportTextCharPos();
|
|
|
|
svgedit.browsersupport.editableText = supportEditableText();
|
|
|
|
svgedit.browsersupport.goodDecimals = supportGoodDecimals();
|
|
|
|
svgedit.browsersupport.nonScalingStroke = supportNonScalingStroke();
|
2010-11-08 18:03:33 +00:00
|
|
|
svgedit.browsersupport.nativeTransformLists = supportNativeSVGTransformLists();
|
2010-10-26 07:25:21 +00:00
|
|
|
|
|
|
|
})();
|