-/*SIE-SVG without Plugin under LGPL2.1 & GPL2.0 & Mozilla Public Lisence
- *http://sie.sourceforge.jp/
- *Usage: <script defer="defer" type="text/javascript" src="sie.js"></script>
- */
-/* ***** BEGIN LICENSE BLOCK *****
- * Version: MPL 1.1/GPL 2.0/LGPL 2.1
- *
- * The contents of this file are subject to the Mozilla Public License Version
- * 1.1 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- * http://www.mozilla.org/MPL/
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * The Original Code is the Mozilla SVG Cairo Renderer project.
- *
- * The Initial Developer of the Original Code is IBM Corporation.
- * Portions created by the Initial Developer are Copyright (C) 2004
- * the Initial Developer. All Rights Reserved.
- *
- * Parts of this file contain code derived from the following files(s)
- * of the Mozilla SVG project (these parts are Copyright (C) by their
- * respective copyright-holders):
- * layout/svg/renderer/src/libart/nsSVGLibartBPathBuilder.cpp
- *
- * Contributor(s):DHRNAME revulo bellbind
- *
- * Alternatively, the contents of this file may be used under the terms of
- * either of the GNU General Public License Version 2 or later (the "GPL"),
- * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
- * in which case the provisions of the GPL or the LGPL are applicable instead
- * of those above. If you wish to allow use of your version of this file only
- * under the terms of either the GPL or the LGPL, and not to allow others to
- * use your version of this file under the terms of the MPL, indicate your
- * decision by deleting the provisions above and replace them with the notice
- * and other provisions required by the GPL or the LGPL. If you do not delete
- * the provisions above, a recipient may use your version of this file under
- * the terms of any one of the MPL, the GPL or the LGPL.
- *
- * ***** END LICENSE BLOCK ***** */
-/*
- * Copyright (c) 2000 World Wide Web Consortium,
- * (Massachusetts Institute of Technology, Institut National de
- * Recherche en Informatique et en Automatique, Keio University). All
- * Rights Reserved. This program is distributed under the W3C's Software
- * Intellectual Property License. This program is distributed in the
- * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
- * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
- * PURPOSE.
- * See W3C License http://www.w3.org/Consortium/Legal/ for more details.
- */
-
-
-//これを頭に付けたら、内部処理用
-var NAIBU = {};
-
-/*
-// File: svg.idl
-#ifndef _SVG_IDL_
-#define _SVG_IDL_
-// For access to DOM2 core
-#include "dom.idl"
-// For access to DOM2 events
-#include "events.idl"
-// For access to those parts from DOM2 CSS OM used by SVG DOM.
-#include "css.idl"
-// For access to those parts from DOM2 Views OM used by SVG DOM.
-#include "views.idl"
-// For access to the SMIL OM used by SVG DOM.
-#include "smil.idl"
-#pragma prefix "dom.w3c.org"
-#pragma javaPackage "org.w3c.dom"
-module svg
-{
- typedef dom::DOMString DOMString;
- typedef dom::DOMException DOMException;
- typedef dom::Element Element;
- typedef dom::Document Document;
- typedef dom::NodeList NodeList;
- // Predeclarations
- interface SVGElement;
- interface SVGLangSpace;
- interface SVGExternalResourcesRequired;
- interface SVGTests;
- interface SVGFitToViewBox;
- interface SVGZoomAndPan;
- interface SVGViewSpec;
- interface SVGURIReference;
- interface SVGPoint;
- interface SVGMatrix;
- interface SVGPreserveAspectRatio;
- interface SVGAnimatedPreserveAspectRatio;
- interface SVGTransformList;
- interface SVGAnimatedTransformList;
- interface SVGTransform;
- interface SVGICCColor;
- interface SVGColor;
- interface SVGPaint;
- interface SVGTransformable;
- interface SVGDocument;
- interface SVGSVGElement;
- interface SVGElementInstance;
- interface SVGElementInstanceList;
-*/
-function SVGException(code) {
- /*unsigned short*/ this.code = code;
- if (this.code === /*SVGException.SVG_WRONG_TYPE_ERR*/ 0) {
- this.message = "SVG Wrong Type Error";
- } else if (this.code === /*SVGException.SVG_INVALID_VALUE_ERR*/ 1) {
- this.message = "SVG Invalid Value Error";
- } else if (this.code === /*SVGException.SVG_MATRIX_NOT_INVERTABLE*/ 2) {
- this.message = "SVG Matrix Not Invertable";
- }
- return this;
-};
-SVGException.prototype = Object._create(Error);
-// SVGExceptionCode
-/*const unsigned short SVGException.SVG_WRONG_TYPE_ERR = 0;
-/*const unsigned short SVGException.SVG_INVALID_VALUE_ERR = 1;
-/*const unsigned short SVGException.SVG_MATRIX_NOT_INVERTABLE = 2;*/
-
-/*SVGElement
- *すべてのSVG関連要素の雛形となるオブジェクト
- */
-function SVGElement() {
- Element.call(this);
- SVGStylable.call(this); //ElementCSSInlineStyleのインタフェースを継承
- /*interface SVGTransformable : SVGLocatable
- *TransformListはtransform属性を行列で表現したあとのリスト構造
- */
- /*readonly attribute SVGAnimatedTransformList*/ this.transform = new SVGAnimatedTransformList();
- //描画の際、SVGStylabaleで指定しておいたプロパティの処理をする
- this.addEventListener("DOMAttrModified", function(evt){
- if (evt.eventPhase === /*Event.BUBBLING_PHASE*/ 3) {
- return;
- }
- var name = evt.attrName,
- tar = evt.target;
- if (!!CSS2Properties[name] || (name.indexOf("-") > -1)) { //スタイルシートのプロパティならば
- tar._attributeStyle.setProperty(name, evt.newValue, "");
- }
- if (evt.relatedNode.localName === "id") { //xml:idあるいはid属性ならば
- tar.id = evt.newValue;
- } else if ((name === "transform") && !!tar.transform) {
- var tft = evt.newValue,
- degR = tar._degReg,
- coma = tft.match(tar._comaReg), //コマンド文字にマッチ translate
- list = tft.match(tar._strReg), //カッコ内のリストにマッチ (10 20 30...)
- a,b,c,d,e,f,
- lis,
- com,
- deg,
- rad,
- degli,
- s,
- cm,
- degz,
- etod = evt.target.ownerDocument.documentElement,
- ttb = tar.transform.baseVal;
- //transform属性の値を、SVGTransformListであるtransformプロパティに結びつける
- for (var j=0,cli=coma.length;j<cli;j++) {
- s = etod.createSVGTransform();
- lis = list[j],
- com = coma[j];
- deg = lis.match(degR);
- degli = deg.length;
- if (degli === 6) {
- cm = s.matrix;
- cm.a = +(deg[0]);
- cm.b = +(deg[1]);
- cm.c = +(deg[2]);
- cm.d = +(deg[3]);
- cm.e = +(deg[4]);
- cm.f = +(deg[5]);
- } else {
- if (degli === 3) {
- degz = +(deg[0]);
- s.setRotate(degz, +(deg[1]), +(deg[2]))
- } else if (degli <= 2) {
- degz = +(deg[0]);
- if (com === "translate") {
- s.setTranslate(degz, +(deg[1] || 0));
- } else if (com === "scale") {
- s.setScale(degz, +(deg[1] || deg[0]));
- } else if (com === "rotate") {
- s.setRotate(degz, 0, 0);
- } else if (com === "skewX") {
- s.setSkewX(degz);
- } else if (com === "skewY") {
- s.setSkewY(degz);
- }
- }
- }
- ttb.appendItem(s);
- }
- tft = degR = coma = list = a = b = c = d = e = f = lis = com = deg = rad = degli = s = cm = degz = etod = ttb = void 0;
- } else if (name === "style") {
- var sc = evt.newValue,
- style = tar.style,
- a,
- ai,
- m;
- style.cssText = sc;
- if (sc !== "") {
- //style属性値の解析
- sc = sc.replace(tar._shouReg, "")
- .replace(tar._conReg, ":")
- .replace(tar._bouReg, ";");
- a = sc.split(";");
- for (var i=0, ali=a.length;i<ali;++i) {
- ai = a[i],
- m = ai.split(":");
- if (ai !== "") {
- style.setProperty(m[0], m[1]);
- }
- ai = m = void 0;
- }
- }
- a = sc = style = void 0;
- } else if (name === "class") {
- tar.className = evt.newValue;
- } else if (name.indexOf("on") === 0) { //event属性ならば
- /*ECMA 262-3においては、eval("(function(){})")はFunctionオブジェクトを返さなければならない
- *ところが、IEでは、undefinedの値を返してしまう。
- *他のブラウザではECMAの仕様にしたがっているようなので、IEだけの問題であることに注意
- */
- NAIBU.eval("document._s = (function(evt){" +evt.newValue+ "})");
- var v = name.slice(2);
- if (v === "load") {
- v = "SVGLoad";
- } else if (v === "unload") {
- v = "SVGUnload";
- } else if (v === "abort") {
- v = "SVGAbort";
- } else if (v === "error") {
- v = "SVGError";
- } else if (v === "resize") {
- v = "SVGResize";
- } else if (v === "scroll") {
- v = "SVGScroll";
- } else if (v === "zoom") {
- v = "SVGZoom";
- } else if (v === "begin") {
- v = "beginEvent";
- } else if (v === "end") {
- v = "endEvent";
- } else if (v === "repeat") {
- v = "repeatEvent";
- }
- tar.addEventListener(v, document._s, false);
- } else if (evt.relatedNode.nodeName === "xml:base") { //xml:base属性ならば
- tar.xmlbase = evt.newValue;
- } else if (!!tar[name] && (tar[name] instanceof SVGAnimatedLength)) {
- var tea = tar[name],
- tod = tar.nearestViewportElement || tar.ownerDocument.documentElement,
- tvw = tod.viewport.width,
- tvh = tod.viewport.height,
- s,
- n = evt.newValue.slice(-2),
- m = n.charAt(1),
- type = /*SVGLength.SVG_LENGTHTYPE_NUMBER*/ 1,
- _parseFloat = parseFloat;
- if (m >= "0" && m <= "9") { //軽量化のためにチェックを設ける
- } else if (m === "%") {
- if (tar._x1width[name]) {
- tea.baseVal._percent = tvw * 0.01;
- } else if (tar._y1height[name]) {
- tea.baseVal._percent = tvh * 0.01;
- } else {
- tea.baseVal._percent = Math.sqrt((tvw*tvw + tvh*tvh) / 2) * 0.01;
- }
- type = /*SVGLength.SVG_LENGTHTYPE_PERCENTAGE*/ 2;
- } else if (n === "em") {
- type = /*SVGLength.SVG_LENGTHTYPE_EMS*/ 3;
- } else if (n === "ex") {
- type = /*SVGLength.SVG_LENGTHTYPE_EXS*/ 4;
- } else if (n === "px") {
- type = /*SVGLength.SVG_LENGTHTYPE_PX*/ 5;
- } else if (n === "cm") {
- type = /*SVGLength.SVG_LENGTHTYPE_CM*/ 6;
- } else if (n === "mm") {
- type = /*SVGLength.SVG_LENGTHTYPE_MM*/ 7;
- } else if (n === "in") {
- type = /*SVGLength.SVG_LENGTHTYPE_IN*/ 8;
- } else if (n === "pt") {
- type = /*SVGLength.SVG_LENGTHTYPE_PT*/ 9;
- } else if (n === "pc") {
- type = /*SVGLength.SVG_LENGTHTYPE_PC*/ 10;
- }
- s = _parseFloat(evt.newValue);
- s = isNaN(s) ? 0 : s;
- tea.baseVal.newValueSpecifiedUnits(type, s);
- tea = tod = tvw = tvh = n = type = _parseFloat = s = void 0;
- }
- evt = _parseFloat = name = tar = null;
- }, false);
- return this;
-};
-SVGElement.prototype = Object._create(Element);
-
-/*関数スコープを避けるため、グローバルスコープでevalさせる関数*/
-NAIBU.eval = function(code) {
- eval(code);
-};
-
-(function(){
- /*以下の正規表現は属性のパーサの際に用いる*/
- this._degReg = /[\-\d\.e]+/g;
- this._comaReg = /[A-Za-z]+(?=\s*\()/g;
- this._strReg = /\([^\)]+\)/g;
- this._syouReg = /^[^a-z\-]+/;
- this._conReg = /\:\s+/g;
- this._bouReg = /\s*;[^a-z\-]*/g;
- /*_cacheMatrixプロパティはSVGMatrixのキャッシュとして、
- *getCTMメソッドで使う
- */
- this._cacheMatrix = null;
- /*以下のオブジェクトは単位がパーセント付きの属性の名前を示し、処理に使う*/
- this._x1width = {
- "x" : 1,
- "x1" : 1,
- "x2" : 1,
- "width" : 1,
- "cx" : 1
- };
- this._y1height = {
- "y" : 1,
- "y1" : 1,
- "y2" : 1,
- "height" : 1,
- "cy" : 1
- };
- /*String*/ this.id = null; //id属性の値
- /*String*/ this.xmlbase = null; //xml:base属性の値
- /*SVGSVGElement*/ this.ownerSVGElement; //ルート要素であるsvg要素
- /*readonly SVGElement*/ this.viewportElement; //ビューポートを形成する要素(多くはsvg要素)
- /*readonly attribute SVGElement*/ this.nearestViewportElement = null;
- /*readonly attribute SVGElement*/ this.farthestViewportElement = null;
-
- /*interface SVGLocatable*/
- /*SVGRect*/ this.getBBox = function(){
- var s = new SVGRect(),
- data = this._tar.path.value,
- vi = this.ownerDocument.documentElement.viewport,
- el = vi.width,
- et = vi.height,
- er = 0,
- eb = 0,
- degis = data.match(/[0-9\-]+/g),
- nx,
- ny;
- /*要素の境界領域を求める(四隅の座標を求める)
- *etは境界領域の上からビューポート(例えばsvg要素)の上端までの距離であり、ebは境界領域の下からビューポートの下端までの距離
- *elは境界領域の左からビューポートの左端までの距離であり、erは境界領域の右からビューポートの右端までの距離
- */
- for (var i=0,degisli=degis.length;i<degisli;i+=2) {
- nx = +(degis[i]),
- ny = +(degis[i+1]);
- el = el > nx ? nx : el;
- et = et > ny ? ny : et;
- er = er > nx ? er : nx;
- eb = eb > ny ? eb : ny;
- }
- s.x = el;
- s.y = et;
- s.width = er - el;
- s.height = eb - et;
- nx = ny = data = degis =el = et = er = eb = vi = void 0;
- return s;
- };
-
- /*getCTMメソッド
- *CTMとは現在の利用座標系に対する変換行列
- *注意点として、SVG1.1とSVG Tiny1.2では内容が異なる。たとえば、
- *1.2ではgetCTMが言及されていない
- *もし、要素の中心座標を取得したい人がいれば、transformプロパティのconsolidateメソッドを使うこと
- */
- /*SVGMatrix*/ this.getCTM = function() {
- var s, m;
- if (!!this._cacheMatrix) { //キャッシュがあれば
- s = this._cacheMatrix;
- } else {
- m = this.transform.baseVal.consolidate();
- if (m) {
- m = m.matrix;
- } else {
- m = this.ownerDocument.documentElement.createSVGMatrix();
- }
- if (this.parentNode && !!this.parentNode.getCTM) {
- s = this.parentNode.getCTM().multiply(m);
- } else {
- s = m;
- }
- m = void 0;
- this._cacheMatrix = s; //キャッシュをためて次回で使う
- }
- return s;
- };
-
- /*SVGMatrix*/ this.getScreenCTM = function(){
- if (!this.parentNode) {
- return null;
- }
- var view = this.nearestViewportElement || this.ownerDocument.documentElement;
- var s = view.getScreenCTM().multiply(this.getCTM());
- view = null;
- return s;
- };
-
- /*getTransformToElementメソッド
- *これは、あるelementへの変換行列を計算して返す
- *たとえばある要素から別の要素への引越しをする際の変換行列を算出することが可能
- */
- /*SVGMatrix*/ this.getTransformToElement = function(/*SVGElement*/ element ){
- var s = this.getScreenCTM().inverse().multiply(element.getScreenCTM());
- return s;
- };
-}).apply(SVGElement.prototype);
-
-function SVGAnimatedBoolean() {
- /*boolean*/ this.animVal = this.baseVal = true;
- return this;
-};
-
-function SVGAnimatedString() {
- /*String*/ this.animVal = this.baseVal = "";
- return this;
-};
-
-function SVGStringList() {
- return this;
-};
-SVGStringList.prototype = Object._create(Array);
-(function(){
- /*readonly unsigned long*/ this.numberOfItems = 0;
- /*void*/ this.clear = function(){
- for (var i=0, tli=this.length;i<tli;++i) {
- delete this[i];
- }
- this.numberOfItems = 0;
- };
- /*DOMString*/ this.initialize = function(/*DOMString*/ newItem ) {
- this.clear();
- this[0] = newItem;
- this.numberOfItems = 1;
- return newItem;
- };
- /*DOMString*/ this.getItem = function(/*unsigned long*/ index ) {
- if (index >= this.numberOfItems || index < 0) {
- throw (new DOMException(/*DOMException.INDEX_SIZE_ERR*/ 1));
- } else {
- return (this[index]);
- }
- };
- /*DOMString*/ this.insertItemBefore = function(/*DOMString*/ newItem, /*unsigned long*/ index ){
- if (index >= this.numberOfItems) {
- this.appendItem(newItem);
- } else {
- this.splice(index, 1, newItem, this.getItem[index]);
- ++this.numberOfItems;
- }
- return newItem;
- };
- /*DOMString*/ this.replaceItem = function(/*DOMString*/ newItem, /*unsigned long*/ index ){
- if (index >= this.numberOfItems || index < 0) {
- throw (new DOMException(/*DOMException.INDEX_SIZE_ERR*/ 1));
- } else {
- this.splice(index, 1, newItem);
- }
- return newItem;
- };
- //raises( DOMException, SVGException );
- /*DOMString*/ this.removeItem = function(/*unsigned long*/ index ){
- if (index >= this.numberOfItems || index < 0) {
- throw (new DOMException(/*DOMException.INDEX_SIZE_ERR*/ 1));
- } else {
- this.splice(index, 1);
- --this.numberOfItems;
- }
- return newItem;
- };
- /*DOMString*/ this.appendItem = function(/*DOMString*/ newItem ){
- this[this.numberOfItems] = newItem;
- ++this.numberOfItems;
- };
-}).apply(SVGStringList.prototype);
-
-function SVGAnimatedEnumeration() {
- /*unsigned short*/ this.baseVal = 0;
- // raises DOMException on setting
- /*readonly unsigned short*/ this.animVal = 0;
- return this;
-};
-function SVGAnimatedInteger() {
- /*long*/ this.baseVal = 0;
- // raises DOMException on setting
- /*readonly long*/ this.animVal = 0;
- return this;
-};
-function SVGNumber() {
- /*float*/ this.value = 0;
- // raises DOMException on setting
- return this;
-};
-function SVGAnimatedNumber() {
- /*float*/ this.baseVal = this.animVal = 0;
- return this;
-};
-
-function SVGNumberList() {
- return this;
-};
-/*SVGUnmberListのメソッドはSVGPathSegListを参照*/
-
-function SVGAnimatedNumberList() {
- /*readonly SVGNumberList*/ this.animVal = this.baseVal = new SVGNumberList();
- return this;
-};
-/*SVGLengthクラス
- *長さを設定する(単位pxに統一する方便として使う)
- *valueInSpecifiedUnitsプロパティはpxに統一する前の数値。valueプロパティはpxに統一した後の数値
- */
-function SVGLength() {
- return this;
-};
-/*(function(t) {
- // Length Unit Types
- /*const unsigned short t.SVG_LENGTHTYPE_UNKNOWN = 0;
- /*const unsigned short t.SVG_LENGTHTYPE_NUMBER = 1;
- /*const unsigned short t.SVG_LENGTHTYPE_PERCENTAGE = 2;
- /*const unsigned short t.SVG_LENGTHTYPE_EMS = 3;
- /*const unsigned short t.SVG_LENGTHTYPE_EXS = 4;
- /*const unsigned short t.SVG_LENGTHTYPE_PX = 5;
- /*const unsigned short t.SVG_LENGTHTYPE_CM = 6;
- /*const unsigned short t.SVG_LENGTHTYPE_MM = 7;
- /*const unsigned short t.SVG_LENGTHTYPE_IN = 8;
- /*const unsigned short t.SVG_LENGTHTYPE_PT = 9;
- /*const unsigned short t.SVG_LENGTHTYPE_PC = 10;
-})(SVGLength);*/
-
-SVGLength.prototype = {
- /*readonly attribute unsigned short*/ unitType : /*SVGLength.SVG_LENGTHTYPE_UNKNOWN*/ 0,
- /*attribute float*/ value : 0, //利用単位における値
- /*attribute float*/ valueInSpecifiedUnits : /*SVGLength.SVG_LENGTHTYPE_UNKNOWN*/ 0, //unitTypeにおける値
- /*attribute DOMString*/ valueAsString : "0",
- _percent : 0.01, //単位に%が使われていた場合、このプロパティの数値を1%として使う
- _fontSize : 12, //単位のemとexで使われるfont-sizeの値
-/*newValueSpedifiedUnitsメソッド
- *新しくunitTypeにおける値を設定する
- *例:2pxならば、x.newValueSpecifiedUnits(SVGLength.SVG_LENGTHTYPE_PX, 2);となる
- */
- newValueSpecifiedUnits : function (/*unsigned short*/ unitType, /*float*/ valueInSpecifiedUnits) {
- var n = 1,
- _s = ""; //nは各単位から利用単位への変換数値。_sは単位の文字列を表す
- if (unitType === /*SVGLength.SVG_LENGTHTYPE_NUMBER*/ 1) {
- } else if (unitType === /*SVGLength.SVG_LENGTHTYPE_PX*/ 5) {
- _s = "px";
- } else if (unitType === /*SVGLength.SVG_LENGTHTYPE_PERCENTAGE*/ 2) {
- n = this._percent;
- _s = "%"
- } else if (unitType === /*SVGLength.SVG_LENGTHTYPE_EMS*/ 3) {
- n = this._fontSize;
- _s = "em";
- } else if (unitType === /*SVGLength.SVG_LENGTHTYPE_EXS*/ 4) {
- n = this._fontSize * 0.5;
- _s = "ex";
- } else if (unitType === /*SVGLength.SVG_LENGTHTYPE_CM*/ 6) {
- n = 35.43307;
- _s = "cm";
- } else if (unitType === /*SVGLength.SVG_LENGTHTYPE_MM*/ 7) {
- n = 3.543307;
- _s = "mm";
- } else if (unitType === /*SVGLength.SVG_LENGTHTYPE_IN*/ 8) {
- n = 90;
- _s = "in";
- } else if (unitType === /*SVGLength.SVG_LENGTHTYPE_PT*/ 9) {
- n = 1.25;
- _s = "pt";
- } else if (unitType === /*SVGLength.SVG_LENGTHTYPE_PC*/ 10) {
- n = 15;
- _s = "pc";
- } else {
- throw new DOMException(/*DOMException.NOT_SUPPORTED_ERR*/ 9);
- }
- this.unitType = unitType;
- this.value = valueInSpecifiedUnits * n;
- this.valueInSpecifiedUnits = valueInSpecifiedUnits;
- this.valueAsString = valueInSpecifiedUnits + _s;
- valueInSpecifiedUnits = unitType = n = _s = void 0;
- },
-/*convertToSpecifiedUnitsメソッド
- *valueプロパティを書き換えずに、単位だけを変換する
- *例:2cmをmmに変換したい場合
- * x.newValueSpecifiedUnits(SVGLength.SVG_LENGTHTYPE_CM, 2);
- * x.convertToSpecifiedUnits(SVGLength.SVG_LENGTHTYPE_MM);
- * alert(x.valueAsString); //20mm
- */
- convertToSpecifiedUnits : function (/*unsigned short*/ unitType) {
- if (this.value === 0) {
- this.newValueSpecifiedUnits(unitType, 0);
- return;
- }
- var v = this.value;
- this.newValueSpecifiedUnits(unitType, this.valueInSpecifiedUnits);
- v = v / this.value * this.valueInSpecifiedUnits;
- this.newValueSpecifiedUnits(unitType, v);
- },
- /*_emToUnitメソッド
- *emやexが単位に使われていたときに、@fontSizeの値を手がかりに、新たな値へとvalueを変換させる
- *単位が%の場合は、新しいvalueへと変換させておく
- */
- _emToUnit : function (/*float*/ fontSize) {
- if ((this.unitType === /*SVGLength.SVG_LENGTHTYPE_EMS*/ 3) || (this.unitType === 4)) {
- this._fontSize = fontSize;
- this.newValueSpecifiedUnits(this.unitType, this.valueInSpecifiedUnits);
- }
- }
-};
-function SVGAnimatedLength() {
- /*readonly SVGLength*/ this.animVal;
- this.baseVal = new SVGLength();
- this.baseVal.unitType = 1;
- return this;
-};
-function SVGLengthList() {
- return this;
-};
-/*SVGLengthListのメソッドはSVGPathSegListを参照*/
-
-function SVGAnimatedLengthList() {
- /*readonly SVGNumberList*/ this.animVal = this.baseVal = new SVGLengthList();
- return this;
-};
-function SVGAngle() {
- return this;
-};
-SVGAngle.prototype = {
- /*readonly attribute unsigned short*/ unitType : 0,
- /*attribute float*/ value : 0,
- // raises DOMException on setting
- /*attribute float*/ valueInSpecifiedUnits : 0,
- // raises DOMException on setting
- /*attribute DOMString*/ valueAsString : "0",
- // raises DOMException on setting
- /*void*/ newValueSpecifiedUnits : function (/*in unsigned short*/ unitType, /*in float*/ valueInSpecifiedUnits ) {
- var n = 1,
- _s = ""; //nは各単位から度への変換数値。_sは単位の文字列を表す
- if (unitType === /*SVGAngle.SVG_ANGLETYPE_UNSPECIFIED*/ 1) {
- } else if (unitType === /*SVGAngle.SVG_ANGLETYPE_DEG*/ 2) {
- _s = "deg"
- } else if (unitType === /*SVGAngle.SVG_ANGLETYPE_RAD*/ 3) {
- n = Math.PI / 180;
- _s = "rad";
- } else if (unitType === /*SVGAngle.SVG_ANGLETYPE_GRAD*/ 4) {
- n = 9 / 10;
- _s = "grad";
- } else {
- throw new DOMException(/*DOMException.NOT_SUPPORTED_ERR*/ 9);
- }
- this.unitType = unitType;
- this.value = valueInSpecifiedUnits * n;
- this.valueInSpecifiedUnits = valueInSpecifiedUnits;
- this.valueAsString = valueInSpecifiedUnits + _s;
- n = _s = void 0;
- //raises( DOMException );
- },
- /*void*/ convertToSpecifiedUnits : function (/*in unsigned short*/ unitType ) {
- if (this.value === 0) {
- this.newValueSpecifiedUnits(unitType, 0);
- return;
- }
- var v = this.value;
- this.newValueSpecifiedUnits(unitType, this.valueInSpecifiedUnits);
- v = v / this.value * this.valueInSpecifiedUnits;
- this.newValueSpecifiedUnits(unitType, v);
- //raises( DOMException );
- }
-};
-// Angle Unit Types
-/*const unsigned short SVGAngle.SVG_ANGLETYPE_UNKNOWN = 0;
-/*const unsigned short SVGAngle.SVG_ANGLETYPE_UNSPECIFIED = 1;
-/*const unsigned short SVGAngle.SVG_ANGLETYPE_DEG = 2;
-/*const unsigned short SVGAngle.SVG_ANGLETYPE_RAD = 3;
-/*const unsigned short SVGAngle.SVG_ANGLETYPE_GRAD = 4;*/
-function SVGAnimatedAngle() {
- /*readonly attribute SVGAngle*/ this.baseVal = new SVGAngle();
- /*readonly attribute SVGAngle*/ this.animVal = this.baseVal;
- return this;
-};
-function SVGColor() {
- CSSValue.apply(this);
- /*readonly css::RGBColor*/ this.rgbColor = new RGBColor();
- return this;
-};
-
- // Color Types
-/*unsigned short SVGColor.SVG_COLORTYPE_UNKNOWN = 0;
-/*unsigned short SVGColor.SVG_COLORTYPE_RGBCOLOR = 1;
-/*unsigned short SVGColor.SVG_COLORTYPE_RGBCOLOR_ICCCOLOR = 2;
-/*unsigned short SVGColor.SVG_COLORTYPE_CURRENTCOLOR = 3;*/
-SVGColor.prototype = Object._create(CSSValue); //ノードのプロトタイプチェーンを作って、継承
-
-(function(){
- /*readonly unsigned short*/ this.colorType = /*SVGColor.SVG_COLORTYPE_UNKNOWN*/ 0;
- /*readonly SVGICCColor*/ this.iccColor = null;
- this._regD = /\d+/g;
- this._regDP = /[\d.]+%/g;
- this._exceptionsvg = /*SVGException.SVG_INVALID_VALUE_ERR*/ 1;
- /*void*/ this.setRGBColor = function(/*DOMString*/ rgbColor ){
- var s,
- _parseInt,
- r, g, b;
- if (!rgbColor || (typeof rgbColor !== "string")) {
- throw new SVGException(this._exceptionsvg);
- }
- rgbColor = this._keywords[rgbColor] || rgbColor;
- if (rgbColor.indexOf("%", 5) > 0) { // %を含むrgb形式の場合
- rgbColor = rgbColor.replace(this._regDP, function(s) {
- return Math.round((2.55 * parseFloat(s)));
- });
- s = rgbColor.match(this._regD);
- } else if (rgbColor.indexOf("#") === 0) { //#を含む場合
- s = [];
- _parseInt = parseInt;
- if (rgbColor.length < 5) {
- r = rgbColor.charAt(1);
- g = rgbColor.charAt(2);
- b = rgbColor.charAt(3)
- rgbColor = "#" + r + r + g + g + b + b;
- }
- s[0] = _parseInt(rgbColor.slice(1, 3), 16)+ "";
- s[1] = _parseInt(rgbColor.slice(3, 5), 16)+ "";
- s[2] = _parseInt(rgbColor.slice(5, 7), 16)+ "";
- r = g = b = void 0;
- } else {
- s = rgbColor.match(this._regD);
- if (!s || (s.length < 3)) { //数値が含まれていなければ強制的に終了
- rgbColor = void 0;
- throw new SVGException(this._exceptionsvg);
- }
- }
- this.rgbColor.red.setFloatValue(/*CSSPrimitiveValue.CSS_NUMBER*/ 1, s[0]);
- this.rgbColor.green.setFloatValue(1, s[1]);
- this.rgbColor.blue.setFloatValue(1, s[2]);
- rgbColor = s = _parseInt = void 0;
-};
-
-// raises( SVGException );
-/*void*/ this.setColor =function(/*unsigned short*/ colorType, /*DOMString*/ rgbColor, /*DOMString*/ iccColor ){
- this.colorType = colorType;
- if ((colorType === /*SVGColor.SVG_COLORTYPE_RGBCOLOR*/ 1) && iccColor) {
- throw new SVGException(this._exceptionsvg);
- } else if (colorType === /*SVGColor.SVG_COLORTYPE_RGBCOLOR*/ 1) {
- this.setRGBColor(rgbColor);
- } else if (rgbColor && (colorType === /*SVGColor.SVG_COLORTYPE_CURRENTCOLOR*/ 3)) {
- this.setRGBColor(rgbColor);
- } else if ((colorType === /*SVGColor.SVG_COLORTYPE_UNKNOWN*/ 0) && (rgbColor || iccColor)) {
- throw new SVGException(this._exceptionsvg);
- } else if ((colorType === /*SVGColor.SVG_COLORTYPE_RGBCOLOR_ICCCOLOR*/ 2) && (rgbColor || !iccColor)) {
- throw new SVGException(this._exceptionsvg);
- }
- colorType = rgbColor = void 0;
-}
-// raises( SVGException );
-//色キーワード
-this._keywords = {
- aliceblue: "rgb(240,248,255)",
- antiquewhite: "rgb(250,235,215)",
- aqua: "rgb(0,255,255)",
- aquamarine: "rgb(127,255,212)",
- azure: "rgb(240,255,255)",
- beige: "rgb(245,245,220)",
- bisque: "rgb(255,228,196)",
- black: "rgb(0,0,0)",
- blanchedalmond:"rgb(255,235,205)",
- blue: "rgb(0,0,255)",
- blueviolet: "rgb(138,43,226)",
- brown: "rgb(165,42,42)",
- burlywood: "rgb(222,184,135)",
- cadetblue: "rgb(95,158,160)",
- chartreuse: "rgb(127,255,0)",
- chocolate: "rgb(210,105,30)",
- coral: "rgb(255,127,80)",
- cornflowerblue:"rgb(100,149,237)",
- cornsilk: "rgb(255,248,220)",
- crimson: "rgb(220,20,60)",
- cyan: "rgb(0,255,255)",
- darkblue: "rgb(0,0,139)",
- darkcyan: "rgb(0,139,139)",
- darkgoldenrod:"rgb(184,134,11)",
- darkgray: "rgb(169,169,169)",
- darkgreen: "rgb(0,100,0)",
- darkgrey: "rgb(169,169,169)",
- darkkhaki: "rgb(189,183,107)",
- darkmagenta: "rgb(139,0,139)",
- darkolivegreen:"rgb(85,107,47)",
- darkorange: "rgb(255,140,0)",
- darkorchid: "rgb(153,50,204)",
- darkred: "rgb(139,0,0)",
- darksalmon: "rgb(233,150,122)",
- darkseagreen: "rgb(143,188,143)",
- darkslateblue:"rgb(72,61,139)",
- darkslategray:"rgb(47,79,79)",
- darkslategrey:"rgb(47,79,79)",
- darkturquoise:"rgb(0,206,209)",
- darkviolet: "rgb(148,0,211)",
- deeppink: "rgb(255,20,147)",
- deepskyblue: "rgb(0,191,255)",
- dimgray: "rgb(105,105,105)",
- dimgrey: "rgb(105,105,105)",
- dodgerblue: "rgb(30,144,255)",
- firebrick: "rgb(178,34,34)",
- floralwhite: "rgb(255,250,240)",
- forestgreen: "rgb(34,139,34)",
- fuchsia: "rgb(255,0,255)",
- gainsboro: "rgb(220,220,220)",
- ghostwhite: "rgb(248,248,255)",
- gold: "rgb(255,215,0)",
- goldenrod: "rgb(218,165,32)",
- gray: "rgb(128,128,128)",
- grey: "rgb(128,128,128)",
- green: "rgb(0,128,0)",
- greenyellow: "rgb(173,255,47)",
- honeydew: "rgb(240,255,240)",
- hotpink: "rgb(255,105,180)",
- indianred: "rgb(205,92,92)",
- indigo: "rgb(75,0,130)",
- ivory: "rgb(255,255,240)",
- khaki: "rgb(240,230,140)",
- lavender: "rgb(230,230,250)",
- lavenderblush:"rgb(255,240,245)",
- lawngreen: "rgb(124,252,0)",
- lemonchiffon: "rgb(255,250,205)",
- lightblue: "rgb(173,216,230)",
- lightcoral: "rgb(240,128,128)",
- lightcyan: "rgb(224,255,255)",
- lightgoldenrodyellow:"rgb(250,250,210)",
- lightgray: "rgb(211,211,211)",
- lightgreen: "rgb(144,238,144)",
- lightgrey: "rgb(211,211,211)",
- lightpink: "rgb(255,182,193)",
- lightsalmon: "rgb(255,160,122)",
- lightseagree: "rgb(32,178,170)",
- lightskyblue: "rgb(135,206,250)",
- lightslategray:"rgb(119,136,153)",
- lightslategrey:"rgb(119,136,153)",
- lightsteelblue:"rgb(176,196,222)",
- lightyellow: "rgb(255,255,224)",
- lime: "rgb(0,255,0)",
- limegreen: "rgb(50,205,50)",
- linen: "rgb(250,240,230)",
- magenta: "rgb(255,0,255)",
- maroon: "rgb(128,0,0)",
- mediumaquamarine:"rgb(102,205,170)",
- mediumblue: "rgb(0,0,205)",
- mediumorchid: "rgb(186,85,211)",
- mediumpurple: "rgb(147,112,219)",
- mediumseagreen:"rgb(60,179,113)",
- mediumslateblue:"rgb(123,104,238)",
- mediumspringgreen:"rgb(0,250,154)",
- mediumturquoise:"rgb(72,209,204)",
- mediumvioletred:"rgb(199,21,133)",
- midnightblue: "rgb(25,25,112)",
- mintcream: "rgb(245,255,250)",
- mistyrose: "rgb(255,228,225)",
- moccasin: "rgb(255,228,181)",
- navajowhite: "rgb(255,222,173)",
- navy: "rgb(0,0,128)",
- oldlace: "rgb(253,245,230)",
- olive: "rgb(128,128,0)",
- olivedrab: "rgb(107,142,35)",
- orange: "rgb(255,165,0)",
- orangered: "rgb(255,69,0)",
- orchid: "rgb(218,112,214)",
- palegoldenrod: "rgb(238,232,170)",
- palegreen: "rgb(152,251,152)",
- paleturquoise: "rgb(175,238,238)",
- palevioletred: "rgb(219,112,147)",
- papayawhip: "rgb(255,239,213)",
- peachpuff: "rgb(255,218,185)",
- peru: "rgb(205,133,63)",
- pink: "rgb(255,192,203)",
- plum: "rgb(221,160,221)",
- powderblue: "rgb(176,224,230)",
- purple: "rgb(128,0,128)",
- red: "rgb(255,0,0)",
- rosybrown: "rgb(188,143,143)",
- royalblue: "rgb(65,105,225)",
- saddlebrown: "rgb(139,69,19)",
- salmon: "rgb(250,128,114)",
- sandybrown: "rgb(244,164,96)",
- seagreen: "rgb(46,139,87)",
- seashell: "rgb(255,245,238)",
- sienna: "rgb(160,82,45)",
- silver: "rgb(192,192,192)",
- skyblue: "rgb(135,206,235)",
- slateblue: "rgb(106,90,205)",
- slategray: "rgb(112,128,144)",
- slategrey: "rgb(112,128,144)",
- snow: "rgb(255,250,250)",
- springgreen: "rgb(0,255,127)",
- steelblue: "rgb(70,130,180)",
- tan: "rgb(210,180,140)",
- teal: "rgb(0,128,128)",
- thistle: "rgb(216,191,216)",
- tomato: "rgb(255,99,71)",
- turquoise: "rgb(64,224,208)",
- violet: "rgb(238,130,238)",
- wheat: "rgb(245,222,179)",
- white: "rgb(255,255,255)",
- whitesmoke: "rgb(245,245,245)",
- yellow: "rgb(255,255,0)",
- yellowgreen: "rgb(154,205,50)"
-};
-}).apply(SVGColor.prototype);
-
-function SVGRect() {
- /*float*/ this.x = 0;
- // raises DOMException on setting
- /*float*/ this.y = 0;
- // raises DOMException on setting
- /*float*/ this.width = 0;
- // raises DOMException on setting
- /*float*/ this.height = 0;
- // raises DOMException on setting
- return this;
-};
-
-function SVGAnimatedRect() {
- /*readonly SVGRect*/ this.animVal = this.baseVal = new SVGRect();
- return this;
-};
-
-/*SVGUnitTypes = {
- // Unit Types
- /*unsigned short SVG_UNIT_TYPE_UNKNOWN : 0,
- /*unsigned short SVG_UNIT_TYPE_USERSPACEONUSE : 1,
- /*unsigned short SVG_UNIT_TYPE_OBJECTBOUNDINGBOX : 2
-};*/
-function SVGStylable() {
- /*readonly attribute SVGAnimatedString*/ this.className = new SVGAnimatedString();
- /*readonly attribute css::CSSStyleDeclaration*/ this.style = new CSSStyleDeclaration();
- this._attributeStyle = new CSSStyleDeclaration(); //プレゼンテーション属性の値を格納する
- //styleのcssTextプロパティを解析するリスナーを登録しておく
-};
-/*getPresentationAttributeメソッド
- *プレゼンテーション属性の値をCSSValueとして得る。これはCSSのスタイルの設定値を定めるときや、内部の動的処理に役立つ
- */
-/*css::CSSValue*/ SVGElement.prototype.getPresentationAttribute = function( /*DOMString*/ name ){
- var s = this._attributeStyle.getPropertyCSSValue(name);
- if (s) {
- return s;
- } else {
- return null;
- }
-};
-
-/*SVGURIReferenceオブジェクトはURI参照を用いる要素に適用される
- *SIEでは、もっぱらXLink言語の処理を行う
- */
-function SVGURIReference() {
- /*readonly SVGAnimatedString*/ this.href = new SVGAnimatedString();
- this._instance = null; //埋め込みの場合に、読み込んだDOMツリーを結び付けておくプロパティ
- this._text = "";
- this.addEventListener("DOMAttrModified", function(evt){
- if ((evt.relatedNode.namespaceURI === "http://www.w3.org/1999/xlink") && (evt.attrName === "xlink:href")) {
- evt.target.href.baseVal = evt.newValue;
- /*_svgload_limitedを+1とすることで、
- *SVGLoadイベントは発火されなくなる。1を引く必要がある
- */
- evt.target.ownerDocument.documentElement._svgload_limited++;
- }
- evt = void 0;
- }, false);
- this.addEventListener("DOMNodeInserted", function(evt){
- var tar = evt.target;
- if (evt.eventPhase === /*Event.BUBBLING_PHASE*/ 3) {
- return; //強制終了させる
- }
- tar.addEventListener("DOMNodeInsertedIntoDocument", function(evt){
- var tar = evt.target,
- base,
- href = tar.href.baseVal,
- show, egbase, ep, b, lh, uri, xmlhttp, ui, id, doc, ele, ev;
- /*xlink:href属性とxml:base属性を手がかりに、
- *ハイパーリンクのURIを決定する処理を行う
- */
- if (href !== "") { //xlink:href属性が指定されたとき
- egbase = tar.xmlbase;
- if (!egbase) {
- ep = tar.parentNode;
- b = null;
- while (!b && ep) {
- b = ep.xmlbase;
- ep = ep.parentNode;
- }
- base = b;
- if (!b) { //xml:baseの指定がなければ
- if (href.indexOf("#") !== 0) { //href属性において#が一番につかない場合
- lh = location.href;
- base = lh.replace(/\/[^\/]+?$/, "/"); //URIの最後尾にあるファイル名は消す。例: /n/sie.js -> /n/
- } else {
- base = location.href;
- }
- }
- } else {
- base = egbase;
- }
- if (href.indexOf(":") !== -1) { //絶対URIの場合
- base = "";
- }
- uri = base + href;
- show = tar.getAttributeNS("http://www.w3.org/1999/xlink", "show") || "embed";
- if (href.indexOf(".") === 0) { //相対URIの場合
- uri = href;
- }
- if (show === "replace") {
- tar._tar.setAttribute("href", uri);
- } else if (show === "new") {
- tar._tar.setAttribute("target", "_blank");
- tar._tar.setAttribute("href", uri);
- } else if (show === "embed") {
- xmlhttp = NAIBU.xmlhttp;
- ui = uri.indexOf("#");
- if (ui > -1) {
- id = uri.slice(ui+1);
- uri = uri.replace(/#.+$/, "");
- } else {
- id = null;
- }
- if (href.indexOf("#") === 0) { //URIが#で始まるのであれば
- doc = tar.ownerDocument;
- ele = doc.getElementById(id);
- tar._instance = ele;
- ev = doc.createEvent("SVGEvents");
- ev.initEvent("S_Load", false, false);
- tar.dispatchEvent(ev);
- tar = xmlhttp = void 0;
- } else if (uri.indexOf("data:") > -1) {
- tar._tar.src = uri;
- tar = xmlhttp = void 0;
- } else if ((uri.indexOf("http:") > -1) || (uri.indexOf(".") === 0)){
- if ((tar.localName === "image") && (uri.indexOf(".svg") === -1)) {
- tar._tar.src = uri;
- } else {
- /*ここの_svgload_limitedは、リンクを読み込んだ後でSVGLoadイベントを実行させるという遅延処理で必要*/
- tar.ownerDocument.documentElement._svgload_limited++;
- xmlhttp.open("GET", uri, false);
- xmlhttp.setRequestHeader("X-Requested-With", "XMLHttpRequest");
- xmlhttp.onreadystatechange = function() {
- if ((xmlhttp.readyState === 4) && (xmlhttp.status === 200)) {
- var type = xmlhttp.getResponseHeader('Content-Type') || "text",
- doc, str, ele, ev;
- if ((type.indexOf("text") > -1) || (type.indexOf("xml") > -1) || (type.indexOf("script") > -1)) { //ファイルがtext形式である場合
- /*responseXMLを使うと、時々、空のデータを返すことがあるため(原因はcontent-typeが"text/xml"など特定のものでないと受け付けないため)、
- *ここでは、responseTextを用いる
- */
- /*script要素とstyle要素は、
- *_textプロパティに読み込んだテキストを格納しておく
- *それら以外は、_instanceプロパティにDOMツリーを格納しておく
- */
- if (tar.localName !== "script" && tar.localName !== "style") {
- doc = new ActiveXObject("MSXML2.DomDocument");
- str = xmlhttp.responseText.replace(/!DOCTYPE/,"!--").replace(/(dtd">|\]>)/,"-->");
- NAIBU.doc.async = false;
- NAIBU.doc.validateOnParse = false;
- NAIBU.doc.resolveExternals = false;
- NAIBU.doc.preserveWhiteSpace = false;
- doc.loadXML(str);
- ele = doc.documentElement;
- tar._instance = tar.ownerDocument.importNode(ele, true);
- if (id) {
- tar._instance = tar._instance.ownerDocument.getElementById(id);
- }
- } else {
- tar._text = xmlhttp.responseText;
- }
- } else if (!!tar._tar) {
- tar._tar.src = uri;
- }
- /*S_LoadイベントとはSIE独自のイベント。
- *XLink言語によって、リンク先のコンテンツが読み込まれた時点で発火する
- */
- ev = tar.ownerDocument.createEvent("SVGEvents");
- ev.initEvent("S_Load", false, false);
- tar.dispatchEvent(ev);
- tar.ownerDocument.documentElement._svgload_limited--;
- /*すべてのリンクが読み込みを終了した場合、SVGLoadイベントを発火*/
- if (tar.ownerDocument.documentElement._svgload_limited < 0) {
- ev = tar.ownerDocument.createEvent("SVGEvents");
- ev.initEvent("SVGLoad", false, false);
- tar.ownerDocument.documentElement.dispatchEvent(ev);
- }
- tar = type = doc = str = ev = void 0;
- /*IEのメモリリーク対策として、空関数を入力*/
- xmlhttp.onreadystatechange = NAIBU.emptyFunction;
- xmlhttp = void 0;
- }
- };
- xmlhttp.send(null);
- }
- }
- }
- tar.ownerDocument.documentElement._svgload_limited--;
- }
- evt = base = href = egbase = ep = b = lh = uri = ui = id = doc = ele = ev = show= void 0;
- }, false);
- tar = evt = void 0;
- }, false);
- return this;
-};
-function SVGCSSRule() {
- CSSRule.apply(this, arguments);
- // Additional CSS RuleType to support ICC color specifications
- /*const unsigned short*/ this.COLOR_PROFILE_RULE = 7;
- return this;
-};
-SVGCSSRule.prototype = Object._create(CSSRule); //ノードのプロトタイプチェーンを作って、継承
-
-/*SVGDocument
- *SVGの文書オブジェクト
- */
-function SVGDocument(){
- Document.apply(this);
- DocumentStyle.apply(this);
- /*readonly DOMString*/ this.title = "";
- /*readonly DOMString*/ this.referrer = document.referrer;
- /*readonly DOMString*/ this.domain = document.domain;
- /*readonly DOMString*/ this.URL = document.location;
- /*readonly SVGSVGElement*/ this.rootElement;
- return this;
-};
-SVGDocument.prototype = Object._create(Document); //ノードのプロトタイプチェーンを作って、継承
-
-/*軽量化のために、頻繁に使われる処理をSVGDocumentの独自メソッドとしてまとめておく*/
-SVGDocument.prototype._domnodeEvent = function() {
- var evtt = this.createEvent("MutationEvents");
- evtt.initMutationEvent("DOMNodeInsertedIntoDocument", false, false, null, null, null, null, null);
- return evtt;
-};
-
-/*SVGSVGElement
- *svg要素をあらわすオブジェクト
- */
-function SVGSVGElement(_doc) {
- SVGElement.apply(this, arguments);
- _doc && (this._tar = _doc.createElement("v:group"));
- _doc = void 0;
- /*_svgload_limitedはSVGLoadイベントを発火させる判定基準。
- * Xlink言語が使われていない限り0であり、SVGLoadイベントが発火される*/
- this._svgload_limited = 0;
-/* SVGElement,
- SVGTests,
- SVGLangSpace,
- SVGExternalResourcesRequired,
- SVGStylable,
- SVGLocatable,
- SVGFitToViewBox,
- SVGZoomAndPan,
- events::EventTarget,
- events::DocumentEvent,
- css::ViewCSS,
- css::DocumentCSS {*/
- /*以下のx,y,width,heightプロパティは
- *それぞれ、svg要素の同名属性に対応。たとえば、xならば、x属性に対応している
- *1000というのは、W3Cで触れていないため、独自の初期値を採用
- */
- var slen = SVGAnimatedLength;
- /*readonly SVGAnimatedLength*/ this.x = new slen();
- /*readonly SVGAnimatedLength*/ this.y = new slen();
- /*readonly SVGAnimatedLength*/ this.width = new slen();
- /*readonly SVGAnimatedLength*/ this.height = new slen();
- slen = void 0;
- /*DOMString*/ this.contentScriptType = "application/ecmascript"; //古い仕様では、text/ecmascript
- /*DOMString*/ this.contentStyleType = "text/css";
- /*readonly SVGRect*/ this.viewport = this.createSVGRect();
- /*useCurrentViewプロパティ
- * view要素やハイパーリンクなどで呼び出された場合、true。それ以外の通常表示はfalse。
- */
- /*boolean*/ this.useCurrentView = false;
- /*currentViewプロパティ
- * ズームやパンがされていない初期表示のviewBoxプロパティなどを示す。通常はDOM属性と連動
- */
- /*readonly SVGViewSpec*/ this.currentView = new SVGViewSpec(this);
- /*もし、画像をズームやパンしたとき、どのような倍率になるかを
- *以下のプロパティを使って次の行列で示すことができる
- *2x3 行列 [a b c d e f] = [currentScale 0 0 currentScale currentTranslate.x currentTranslate.y]
- */
- /*float*/ this.currentScale = 1;
- /*readonly SVGPoint*/ this.currentTranslate = this.createSVGPoint();
- /*以下は、SVGFitToViewBoxのインターフェースを用いる
- *もし、ズームやパンがあれば、真っ先にこれらのプロパティを別のオブジェクトに変更すること
- */
- /*readonly SVGAnimatedRect*/ this.viewBox = this.currentView.viewBox;
- /*readonly SVGAnimatedPreserveAspectRatio*/ this.preserveAspectRatio = this.currentView.preserveAspectRatio;
- /*unsigned short*/ this.zoomAndPan = /*SVGZoomAndPan.SVG_ZOOMANDPAN_DISABLE*/ 1;
- this._tx = 0;
- this._ty = 0;
- /*int*/ this._currentTime = 0;
- /*DOMAttrModifiedイベントを利用して、
- *随時、属性の値をDOMプロパティに変換しておくリスナー登録
- */
- this.addEventListener("DOMAttrModified", function(evt){
- if (evt.eventPhase === /*Event.BUBBLING_PHASE*/ 3) {
- return; //強制終了させる
- }
- var tar = evt.target,
- name = evt.attrName,
- tv, ovb, par, tp, sa, mos;
- if (name === "viewBox") {
- tar._cacheScreenCTM = null;
- tv = tar.viewBox.baseVal;
- ovb = evt.newValue.replace(/^\s+|\s+$/g, "").split(/[\s,]+/);
- tv.x = parseFloat(ovb[0]);
- tv.y = parseFloat(ovb[1]);
- tv.width = parseFloat(ovb[2]);
- tv.height = parseFloat(ovb[3]);
- tar.viewBox.baseVal._isUsed = 1;
- } else if (name === "preserveAspectRatio") {
- tar._cacheScreenCTM = null;
- par = evt.newValue;
- tp = tar.preserveAspectRatio.baseVal;
- sa = 1;
- mos = /*SVGPreserveAspectRatio.SVG_MEETORSLICE_UNKNOWN*/ 0;
- if (!!par.match(/x(Min|Mid|Max)Y(Min|Mid|Max)(?:\s+(meet|slice))?/)) {
- switch (RegExp.$1) {
- case "Min":
- sa += 1;
- break;
- case "Mid":
- sa += 2;
- break;
- case "Max":
- sa += 3;
- break;
- }
- switch (RegExp.$2) {
- case "Min":
- break;
- case "Mid":
- sa += 3;
- break;
- case "Max":
- sa += 6;
- break;
- }
- if (RegExp.$3 === "slice") {
- mos = /*SVGPreserveAspectRatio.SVG_MEETORSLICE_SLICE*/ 2;
- } else {
- mos = /*SVGPreserveAspectRatio.SVG_MEETORSLICE_MEET*/ 1;
- }
- }
- tp.align = sa;
- tp.meetOrSlice = mos;
- } else if (name === "width") {
- /*viewportを更新する*/
- tar.viewport.width = tar.width.baseVal.value;
- } else if (name === "height") {
- tar.viewport.height = tar.height.baseVal.value;
- }
- evt = name = tv = ovb = par = tp = sa = mos = void 0;
- }, false);
- this.addEventListener("SVGLoad", function(evt){
- /*以下のDOMAttrModifiedは浮上フェーズのときに、再描画をするように
- *処理を書いたもの。属性が書き換わるたびに、再描画される
- */
- evt.target.addEventListener("DOMAttrModified", function(evt){
- var tar,
- evtt, tce, slist;
- if (evt.eventPhase === /*Event.BUBBLING_PHASE*/ 3) {
- tar = evt.target;
- if (tar.parentNode) {
- evtt = tar.ownerDocument._domnodeEvent();
- evtt.target = tar;
- evtt.eventPhase = /*Event.AT_TARGET*/ 2;
- tce = tar._capter; //tceは登録しておいたリスナーのリスト
- for (var j=0,tcli=tce.length;j<tcli;++j){
- if (tce[j]) {
- tce[j].handleEvent(evtt);
- }
- }
- if (((tar.localName === "g") || (tar.localName === "a")) && (tar.namespaceURI === "http://www.w3.org/2000/svg")) {
- tar._cacheMatrix = void 0; //キャッシュを消去
- if (tar.firstChild) {
- slist = tar.getElementsByTagNameNS("http://www.w3.org/2000/svg", "*");
- for (var i=0,sli=slist.length;i<sli;++i) {
- tar = slist[i];
- tar._cacheMatrix = void 0;
- evtt = tar.ownerDocument.createEvent("MutationEvents");
- evtt.initMutationEvent("DOMNodeInsertedIntoDocument", false, false, null, null, null, null, null);
- evtt.target = tar;
- evtt.eventPhase = /*Event.AT_TARGET*/ 2;
- tce = tar._capter; //tceは登録しておいたリスナーのリスト
- for (var j=0,tcli=tce.length;j<tcli;++j){
- if (tce[j]) {
- tce[j].handleEvent(evtt);
- }
- }
- }
- }
- }
- }
- }
- evtt = tar = evt = tce = slist = void 0;
- }, false)
- evt.target.addEventListener("DOMNodeRemovedFromDocument", function(evt){
- var tar = evt.target;
- tar._tar && tar._tar.parentNode && tar._tar.parentNode.removeChild(tar._tar);
- evt = tar = void 0;
- }, true);
- evt = void 0;
- }, false);
- return this;
-};
-SVGSVGElement.prototype = Object._create(SVGElement);
-(function(sproto) {
-/*void*/ sproto.forceRedraw = function() {
-};
-/*float*/ sproto.getCurrentTime = function(){
- return (this._currentTime);
-};
-/*void*/ sproto.setCurrentTime = function(/*float*/ seconds ){
- this._currentTime = seconds;
-};
-/*SVGNumber*/ sproto.createSVGNumber = function(){
- var s = new SVGNumber();
- s.value = 0;
- return s;
-};
-/*SVGAngle*/ sproto.createSVGAngle = function(){
- var s = new SVGAngle();
- s.value = 0;
- s.unitType = 1;
- return s;
-};
-/*SVGLength*/ sproto.createSVGLength = function(){
- var s = new SVGLength();
- s.unitType = /*SVG_LENGTHTYPE_NUMBER*/ 1;
- return s;
-};
-/*SVGPoint*/ sproto.createSVGPoint = function(){
- return new SVGPoint();
-};
-/*SVGMatrix*/ sproto.createSVGMatrix = function(){
- //単位行列を作成
- return new SVGMatrix();
-};
-/*SVGRect*/ sproto.createSVGRect = function(){
- return new SVGRect();
-};
-/*SVGTransform*/ sproto.createSVGTransform = function(){
- var s = this.createSVGTransformFromMatrix(this.createSVGMatrix());
- return s;
-};
-/*SVGTransform*/ sproto.createSVGTransformFromMatrix = function(/*SVGMatrix*/ matrix ){
- var s = new SVGTransform();
- s.setMatrix(matrix);
- return s;
-};
-/*getScreenCTM
- *SVGElement(SVGLocatable)で指定しておいたメソッドであるが、ここで、算出方法が違うため、再定義をする
- */
-/*SVGMatrix*/ sproto.getScreenCTM = function(){
- if (!!this._cacheScreenCTM) { //キャッシュがあれば
- return (this._cacheScreenCTM);
- }
- var vw = this.viewport.width,
- vh = this.viewport.height,
- vB, par, m, vbx, vby, vbw, vbh, rw, rh, xr, yr, tx, ty, ttps;
- if (!this.useCurrentView) {
- vB = this.viewBox.baseVal;
- par = this.preserveAspectRatio.baseVal;
- } else {
- vB = this.currentView.viewBox.baseVal;
- par = this.currentView.preserveAspectRatio.baseVal;
- }
- if (!!!vB._isUsed) { //viewBox属性が指定されていなければ
- this._tx = this._ty = 0;
- m = this.createSVGMatrix();
- this._cacheScreenCTM = m; //キャッシュを作っておく
- return m;
- } else {
- vbx = vB.x;
- vby = vB.y;
- vbw = vB.width;
- vbh = vB.height;
- rw = vw / vbw;
- rh = vh / vbh;
- xr = 1;
- yr = 1;
- tx = 0;
- ty = 0;
- if (par.align === 1) { //none
- xr = rw;
- yr = rh;
- tx = -vbx * xr;
- ty = -vby * yr;
- } else {
- var ax = (par.align + 1) % 3 + 1;
- var ay = Math.round(par.align / 3);
- switch (par.meetOrSlice) {
- case 1: //meet
- xr = yr = Math.min(rw, rh);
- break;
- case 2: //slice
- xr = yr = Math.max(rw, rh);
- break;
- }
- tx = -vbx * xr;
- ty = -vby * yr;
- switch (ax) {
- case 1: //xMin
- break;
- case 2: //xMid
- tx += (vw - vbw * xr) / 2;
- break;
- case 3: //xMax
- tx += vw - vbw * xr;
- break;
- }
- switch (ay) {
- case 1: //YMin
- break;
- case 2: //YMid
- ty += (vh - vbh * yr) / 2;
- break;
- case 3: //YMax
- ty += vh - vbh * yr;
- break;
- }
- }
- }
- //text要素の位置調整に使うため、ここで、viewの移動量を記録しておく
- this._tx = tx;
- this._ty = ty;
- ttps = this._tar.style;
- ttps.marginLeft = tx+ "px";
- ttps.marginTop = ty+ "px";
- m = this.createSVGMatrix();
- m.a = xr;
- m.d = yr;
- this._cacheScreenCTM = m; //キャッシュを作っておく
- vw = vh = vB = par = vbx = vby = vbw = vbh = rw = rh = xr = yr = tx = ty = ttps = void 0;
- return m;
-};
-})(SVGSVGElement.prototype);
-
- /*interface SVGZoomAndPan*/
- // Zoom and Pan Types
-/*SVGZoomAndPan = {
- /*const unsigned short SVG_ZOOMANDPAN_UNKNOWN : 0,
- /*const unsigned short SVG_ZOOMANDPAN_DISABLE : 1,
- /*const unsigned short SVG_ZOOMANDPAN_MAGNIFY : 2
-};*/
-
-function SVGFitToViewBox() {
- /*readonly SVGAnimatedRect*/ this.viewBox = new SVGAnimatedRect();
- /*readonly SVGAnimatedPreserveAspectRatio*/ this.preserveAspectRatio = new SVGAnimatedPreserveAspectRatio();
- return this;
-};
-function SVGViewSpec(ele) {
- SVGFitToViewBox.apply(this, arguments);
- /*readonly SVGTransformList*/ this.transform = new SVGTransformList();
- /*readonly SVGElement*/ this.viewTarget = ele;
- /*readonly DOMString*/ this.viewBoxString = this.preserveAspectRatioString = this.transformString = this.viewTargetString = "";
- return this;
-};
-SVGViewSpec.prototype = Object._create(SVGFitToViewBox);
-
-function SVGGElement(_doc) {
- SVGElement.apply(this);
- this._tar = _doc.createElement("v:group");
- _doc = void 0;
- /*以下の処理は、この子要素ノードがDOMツリーに追加されて初めて、
- *描画が開始されることを示す。つまり、appendChildで挿入されない限り、描画をしない。
- */
- this.addEventListener("DOMNodeInserted", function(evt){
- var tar = evt.target;
- if (evt.eventPhase === /*Event.BUBBLING_PHASE*/ 3) {
- return; //強制終了させる
- }
- var tnext = tar.nextSibling,
- tpart = tar.parentNode._tar,
- isLast = true;
- if (tnext && tnext._tar && tpart && (tnext._tar.parentNode === tpart)) {
- tpart.insertBefore(tar._tar, tnext._tar);
- } else if (tnext && !tnext._tar && tpart) {
- /*以下の処理は、_tarプロパティがない要素オブジェクトがあるため、それに対処するもの
- *use要素や実体参照などは_tarプロパティがないことに注意
- */
- while (tnext) {
- if (tnext._tar && (tnext._tar.parentNode === tpart)) {
- tpart.insertBefore(tar._tar, tnext._tar);
- isLast = false;
- }
- tnext = tnext.nextSibling;
- }
- if (isLast) {
- tpart.appendChild(tar._tar);
- }
- } else if (!tnext && tpart) {
- tpart.appendChild(tar._tar);
- }
- tnext = tpart = isLast = evt = tar = void 0;
- }, false);
- return this;
-};
-SVGGElement.prototype = Object._create(SVGElement);
-
-function SVGDefsElement() {
- SVGElement.apply(this, arguments);
- this.style.setProperty("display", "none");
- return this;
-};
-SVGDefsElement.prototype = Object._create(SVGElement);
-
-function SVGDescElement() {
- SVGElement.apply(this, arguments);
- return this;
-}
-SVGDescElement.prototype = Object._create(SVGElement);
-
-function SVGTitleElement() {
- SVGElement.apply(this, arguments);
- this.addEventListener("DOMCharacterDataModified", function(evt){
- evt.target.ownerDocument.title = evt.target.firstChild.nodeValue;
- }, false);
- return this;
-}
-SVGTitleElement.prototype = Object._create(SVGElement);
-
-function SVGSymbolElement(_doc) {
- SVGElement.apply(this, arguments);
- return this;
-}
-SVGSymbolElement.prototype = Object._create(SVGElement);
-
-function SVGUseElement() {
- SVGGElement.apply(this, arguments);
- var slen = SVGAnimatedLength;
- /*readonly SVGAnimatedLength*/ this.x = new slen(); //use要素のx属性に対応(以下、同様)
- /*readonly SVGAnimatedLength*/ this.y = new slen();
- /*readonly SVGAnimatedLength*/ this.width = new slen();
- /*readonly SVGAnimatedLength*/ this.height = new slen();
- slen = void 0;
- /*readonly SVGElementInstance*/ this.instanceRoot = new SVGElementInstance(); //参照先インスタンスのルート
- /*readonly SVGElementInstance*/ this.animatedInstanceRoot = new SVGElementInstance();//アニメの最中のインスタンス。静止中は通常
- this.addEventListener("DOMNodeInserted", function(evt){
- if (evt.eventPhase === /*Event.BUBBLING_PHASE*/ 3) {
- return; //強制終了させる
- }
- evt.target.setAttributeNS("http://www.w3.org/1999/xlink", "xlink:show", "embed");
- }, false);
- this.addEventListener("S_Load", function(evt){
- var tar = evt.target,
- style = tar.ownerDocument.defaultView.getComputedStyle(tar, ""),
- fontSize = parseFloat(style.getPropertyValue("font-size")),
- trans = tar.ownerDocument.documentElement.createSVGTransform(),
- tari = tar._instance,
- svg, ti, ta, tn;
- tar.x.baseVal._emToUnit(fontSize);
- tar.y.baseVal._emToUnit(fontSize);
- tar.width.baseVal._emToUnit(fontSize);
- tar.height.baseVal._emToUnit(fontSize);
- tar.instanceRoot = tar.animatedInstanceRoot = tar.ownerDocument.importNode(tari, true);
- trans.setTranslate(tar.x.baseVal.value, tar.y.baseVal.value);
- tar.transform.baseVal.appendItem(trans);
- if (tar._instance.localName === "symbol") {
- /*symbol要素の場合、別途svg要素に置き換える*/
- svg = tar.ownerDocument.createElementNS("http://www.w3.org/2000/svg", "svg");
- svg.addEventListener("DOMNodeInsertedIntoDocument", function(evt){
- /*viewportをsymbol要素として新規に設定*/
- evt.target.nearestViewportElement = evt.currentTarget;
- }, true);
- tar._tar.appendChild(svg._tar);
- tn = tar.getScreenCTM();
- svg.setAttributeNS(null, "width", tar.width.baseVal.value);
- svg.setAttributeNS(null, "height", tar.height.baseVal.value);
- tari.hasAttributeNS(null, "viewBox") && svg.setAttributeNS(null, "viewBox", tari.getAttributeNS(null, "viewBox"));
- tari.hasAttributeNS(null, "preserveAspectRatio") && svg.setAttributeNS(null, "preserveAspectRatio", tari.getAttributeNS(null, "preserveAspectRatio"));
- svg._cacheScreenCTM = tn.multiply(svg.getScreenCTM());
- ti = tar.instanceRoot.firstChild;
- while (ti) {
- ta = ti.nextSibling;
- svg.appendChild(ti);
- ti.getScreenCTM && ti.getScreenCTM();
- ti = ta;
- }
- tar.appendChild(svg);
- } else {
- tar.appendChild(tar.instanceRoot);
- }
- evt = trans = tar = evtt = style = fontSize = svg = ti = ta = tn = void 0;
- }, false);
- SVGURIReference.apply(this);
- return this;
-};
-SVGUseElement.prototype = Object._create(SVGElement);
-
-function SVGElementInstance() {
- /*EventTargetの代用として
- *Nodeオブジェクトを継承させる
- */
- Node.apply(this, arguments);
- /*readonly SVGElement*/ this.correspondingElement; //use要素で使われる参照先の要素
- /*readonly SVGUseElement*/ this.correspondingUseElement; //参照先の要素にuse要素が含まれているとき、ここにuse要素を収納
- /*readonly SVGElementInstance*/ this.parentNode;
- /*readonly SVGElementInstanceList*/ this.childNodes;
- /*readonly SVGElementInstance*/ this.firstChild;
- /*readonly SVGElementInstance*/ this.lastChild;
- /*readonly SVGElementInstance*/ this.previousSibling;
- /*readonly SVGElementInstance*/ this.nextSibling;
- return this;
-};
-SVGElementInstance.prototype = Object._create(Node);
-/*SVGElementInstanceList
- */
-function SVGElementInstanceList() {
- /*readonly unsigned long*/ this.length = 0;
- return this;
-};
-/*SVGElementInstance*/ SVGElementInstanceList.prototype.item = function(/*unsigned long*/ index ) {
- return (this[index]);
-}
-function SVGImageElement(_doc) {
- SVGElement.apply(this, arguments);
- this._tar = _doc.createElement("v:image");
- //以下は、与えられた属性の値に対応する
- var slen = SVGAnimatedLength;
- /*readonly SVGAnimatedLength*/ this.x = new slen();
- /*readonly SVGAnimatedLength*/ this.y = new slen();
- /*readonly SVGAnimatedLength*/ this.width = new slen();
- /*readonly SVGAnimatedLength*/ this.height = new slen();
- _doc = slen = void 0;
- /*readonly SVGAnimatedPreserveAspectRatio*/ this.preserveAspectRatio = new SVGAnimatedPreserveAspectRatio();
- this.addEventListener("DOMNodeInserted", function(evt){
- if (evt.eventPhase === /*Event.BUBBLING_PHASE*/ 3) {
- return; //強制終了させる
- }
- var tar = evt.target;
- tar.setAttributeNS("http://www.w3.org/1999/xlink", "xlink:show", "embed");
- if (tar.nextSibling) {
- if (!!tar.parentNode._tar && !!tar.nextSibling._tar) {
- tar.parentNode._tar.insertBefore(tar._tar, tar.nextSibling._tar);
- }
- } else if (!!tar.parentNode._tar){
- tar.parentNode._tar.appendChild(tar._tar);
- }
- tar.addEventListener("DOMNodeInsertedIntoDocument", function(evt) {
- var tar = evt.target,
- style = tar.ownerDocument.defaultView.getComputedStyle(tar, ""),
- fontSize = parseFloat(style.getPropertyValue("font-size")),
- ts = tar._tar.style,
- ctm = tar.getScreenCTM(),
- po = tar.ownerDocument.documentElement.createSVGPoint(),
- fillOpacity = parseFloat(style.getPropertyValue("fill-opacity")),
- ttfia;
- tar.x.baseVal._emToUnit(fontSize);
- tar.y.baseVal._emToUnit(fontSize);
- tar.width.baseVal._emToUnit(fontSize);
- tar.height.baseVal._emToUnit(fontSize);
- ts.position = "absolute";
- po.x = tar.x.baseVal.value;
- po.y = tar.y.baseVal.value;
- po = po.matrixTransform(ctm);
- ts.left = po.x + "px";
- ts.top = po.y + "px";
- ts.width = tar.width.baseVal.value * ctm.a + "px";
- ts.height = tar.height.baseVal.value * ctm.d + "px";
- if (fillOpacity !== 1) {
- ts.filter = "progid:DXImageTransform.Microsoft.Alpha";
- ttfia = tar._tar.filters.item('DXImageTransform.Microsoft.Alpha');
- ttfia.Style = 0;
- ttfia.Opacity = fillOpacity * 100;
- ttfia = void 0;
- }
- evt = tar = style = fontSize = ts = ctm = po = fillOpacity = void 0;
- }, false);
- evt = tar = void 0;
- }, false);
- SVGURIReference.apply(this);
- return this;
-};
-SVGImageElement.prototype = Object._create(SVGElement);
-
-function SVGSwitchElement() {
- SVGElement.apply(this, arguments);
- return this;
-};
-SVGSwitchElement.prototype = Object._create(SVGElement);
-
-//bookmarkletから呼び出されたらtrue
-var sieb_s;
-function GetSVGDocument(ele) {
- this._tar = ele;
- this._next = null;
- return this;
-}
-function _ca_() {
- if ((NAIBU._that.xmlhttp.readyState === 4) && (NAIBU._that.xmlhttp.status === 200)) {
- NAIBU._that._ca();
- }
-};
- GetSVGDocument.prototype = {
- /*_initメソッド
- *object(embed)要素で指定されたSVG文書を読み込んで、SVGを処理して表示させるメソッド
- */
- _init : function() {
- /*objeiはobject要素かembed要素*/
- var xmlhttp = NAIBU.xmlhttp,
- objei = this._tar,
- data;
- if (this._tar.nodeName === "OBJECT") {
- data = "data";
- } else {
- data = "src";
- }
- xmlhttp.open("GET", objei.getAttribute(data), true);
- objei.style.display = "none";
- xmlhttp.setRequestHeader("X-Requested-With", "XMLHttpRequest");
- this.xmlhttp = xmlhttp;
- /*クロージャを利用しないことで、軽量化を計る*/
- NAIBU._that = this;
- xmlhttp.onreadystatechange = _ca_;
- xmlhttp.send(null);
- xmlhttp = objei = data = void 0;
- },
- /*コール関数。全処理を担う*/
- _ca : function() {
- /*responseXMLを使うと、時々、空のデータを返すことがあるため(原因はcontent-typeが"text/xml"など特定のものでないと受け付けないため)、
- *ここでは、responseTextを用いる
- */
- var ifr = this._tar.previousSibling,
- ifcw = ifr.contentWindow,
- _doc;
- if (ifcw) {
- ifr.contentWindow.screen.updateInterval = 999;
- _doc = ifr.contentWindow.document;
- _doc.write("");
- _doc.close(); // これがないと document.body は null になる
- } else { //インラインSVGの場合
- _doc = document;
- }
- if (("namespaces" in _doc) && !_doc.namespaces["v"]) {
- _doc.namespaces.add("v","urn:schemas-microsoft-com:vml");
- _doc.namespaces.add("o","urn:schemas-microsoft-com:office:office");
- var st = _doc.createStyleSheet(),
- vmlUrl = "behavior: url(#default#VML);display: inline-block;} "; //inline-blockはIEのバグ対策
- st.cssText = "v\\:rect{" +vmlUrl+ "v\\:image{" +vmlUrl+ "v\\:fill{" +vmlUrl+ "v\\:stroke{" +vmlUrl+ "o\\:opacity2{" +vmlUrl
- + "dn\\:defs{display:none}"
- + "v\\:group{text-indent:0px;position:relative;width:100%;height:100%;" +vmlUrl
- + "v\\:shape{width:100%;height:100%;" +vmlUrl;
- st = vmlUrl = void 0;
- }
- DOMImplementation._doc_ = _doc; //_doc_プロパティはcreateDocumentメソッドで使う
- var str = this.xmlhttp.responseText,
- objei = this._tar,
- s = DOMImplementation.createDocument("http://www.w3.org/2000/svg", "svg"),
- tar = s.documentElement,
- tview = tar.viewport,
- objw, objh, fi, n, attr, att, w, h,
- sdt = tar._tar,
- sp = _doc.createElement("div"),
- dcp = _doc.createElement("v:group"),
- backr = _doc.createElement("v:rect"),
- style, fontSize, sw, sh, trstyle, backrs, viewWidth, viewHeight, backdown, backright,
- bfl, bft, bl, text,
- _parseFloat = parseFloat,
- ndoc = NAIBU.doc || this.xmlhttp.responseXML,
- oba = _doc.createElement("div"); //obaはradialGradient要素で使う
- if (!ndoc) { //何らかの原因で読み込み失敗した場合、実行させないようにする
- this.xmlhttp.onreadystatechange = NAIBU.emptyFunction;
- return;
- }
- s._iframe = ifr; //_iframeプロパティはSVGAElementでリンク置換のときに扱う
- oba.setAttribute("id","_NAIBU_outline");
- _doc.body.appendChild(oba);
- sp.style.margin = "-1px,0px,0px,-1px"
- if (ifcw) {
- _doc.body.style.backgroundColor = objei.parentNode.currentStyle.backgroundColor;
- }
- ndoc.async = false;
- /*下記のプロパティについては、Microsoftのサイトを参照
- *ResolveExternals Property [Second-level DOM]
- * http://msdn.microsoft.com/en-us/library/ms761375%28VS.85%29.aspx
- *ValidateOnParse Property [Second-level DOM]
- * http://msdn.microsoft.com/en-us/library/ms760286%28VS.85%29.asp
- */
- ndoc.validateOnParse = false;
- ndoc.resolveExternals = false;
- ndoc.preserveWhiteSpace = true;
- ndoc.loadXML(str.replace(/^[\s\S]*?<svg/, "<svg")); //XML宣言のUTF-8は問題が起きるので削除
- /*IE6-8のみで使えるupdateIntervalは、
- *描画間隔の調整が可能。デフォルトは0。
- *スクロール時にバグが起きるので、0に戻してやる必要がある。
- */
- screen.updateInterval = 999;
- if (/&[^;]+;/.test(str)) {
- /*以下の処理は、実体参照を使ったとき
- *代替の処理を用いて、実体参照を処理するもの
- */
- var tmp = str;
- var enti = (ndoc.doctype)? ndoc.doctype.entities: { length:0 };
- for (var i=0; i<enti.length; i++) {
- var map = enti.item(i);
- var regex = new RegExp("&"+map.nodeName+";", "g");
- tmp = tmp.replace(regex, map.firstChild.xml);
- }
- ndoc.loadXML(tmp);
- tmp = void 0;
- }
- tview.top = 0;
- tview.left = 0;
- tview.width = objei.clientWidth;
- tview.height = objei.clientHeight;
- if (tview.height < 24) { //IEの標準モードではclientHeightプロパティの値が小さくなることがある
- tview.height = screen.availHeight;
- }
- if (tar.viewport.height < 24) { //IEの標準モードではclientHeightプロパティの値が小さくなることがある
- tar.viewport.height = screen.width;
- }
- objw = objei.getAttribute("width");
- objh = objei.getAttribute("height");
- if (objw) {
- tar.setAttributeNS(null, "width", objw);
- }
- if (objh) {
- tar.setAttributeNS(null, "height", objh);
- }
- fi = ndoc.documentElement.firstChild;
- attr = ndoc.documentElement.attributes;
- /*ルート要素のNamedNodeMapを検索する*/
- for (var i=0,atli=attr.length;i<atli;++i) {
- att = s.importNode(attr[i], false);
- tar.setAttributeNodeNS(att);
- }
- str = attr = void 0;
- dcp.style.width = tview.width+ "px";
- dcp.style.height = tview.height+ "px";
- dcp.coordsize = tview.width+ " " +tview.height;
- sp.appendChild(dcp);
- if (ifcw) {
- _doc.body.appendChild(sp);
- } else {
- this._tar.parentNode.insertBefore(sp, this._tar);
- }
- dcp.appendChild(sdt);
- while (fi) { //子ノードを検索して、子供がいれば、importNodeメソッドを再帰的に実行する
- n = s.importNode(fi, true);
- tar.appendChild(n);
- fi = fi.nextSibling;
- }
- fi = void 0;
- /*dom/event.jsのaddEventListenerメソッドなどで、iframe要素のwindowオブジェクトを利用する必要があるため、
- *ドキュメントにそのオブジェクトを結び付けておく
- */
- s._window = ifcw;
- /*以下では、VMLの要素とHTMLのCSSのプロパティを用いて、背景を
- *作り出す作業を行う。これは必須
- */
- style = tar.ownerDocument.defaultView.getComputedStyle(tar, "");
- fontSize = _parseFloat(style.getPropertyValue("font-size"));
- tar.x.baseVal._emToUnit(fontSize);
- tar.y.baseVal._emToUnit(fontSize);
- tar.width.baseVal._emToUnit(fontSize);
- tar.height.baseVal._emToUnit(fontSize);
- sw = tar.width.baseVal.value;
- sh = tar.height.baseVal.value;
- backr.style.position = "absolute";
- w = tview.width;
- h = tview.height;
- backr.style.width = w+ "px";
- backr.style.height = h+ "px";
- backr.style.zIndex = -1;
- backr.stroked = "false";
- backr.filled = "false";
- tar._tar.appendChild(backr);
- trstyle = tar._tar.style;
- trstyle.visibility = "visible";
- trstyle.position = "absolute";
- /*以下、画像を切り取り*/
- trstyle.overflow = "hidden";
- /*ウィンドウ枠の長さを決定する*/
- viewWidth = w > sw ? sw : w;
- viewHeight = h > sh ? sh : h;
- backrs = backr.currentStyle;
- bfl = _parseFloat(backrs.left);
- bft = _parseFloat(backrs.top);
- bl = -tar._tx; //blやbtは、ずれを調整するのに使う
- bt = -tar._ty;
- if (bfl !== 0 && !isNaN(bfl)) { //内部の図形にずれが生じたとき(isNaNはIE8でautoがデフォルト値のため)
- bl = bfl;
- dcp.style.left = -bl+ "px";
- }
- if (bft !== 0 && !isNaN(bfl)) {
- bt = bft;
- dcp.style.top = -bt+ "px";
- }
- backright = bl + viewWidth + 1;
- backdown = bt + viewHeight + 1;
- trstyle.clip = "rect(" +bt+ "px " +backright+ "px " +backdown+ "px " +bl+ "px)";
- this._document = s;
- if ("_svgload_limited" in s.documentElement) {
- /*_svgload_limitedプロパティはXlink言語が使われていない限り、0である。
- *xlink:href属性が指定されるたびに+1となる。
- *0以外は、SVGLoadイベントが発火されない仕組みとなっている
- *
- *目的:
- * Xlinkのリンク先のソースを読み込むまで、SVGLoadイベントを発火させないため
- */
- s.documentElement._svgload_limited--;
- if (s.documentElement._svgload_limited < 0) {
- var evt = s.createEvent("SVGEvents");
- evt.initEvent("SVGLoad", false, false);
- s.documentElement.dispatchEvent(evt);
- }
- }
- //以下、テキストの位置を修正
- text = s.documentElement._tar.getElementsByTagName("div");
- for (var i=0, texti;text[i];++i) {
- texti = text[i];
- if (texti.firstChild.nodeName !== "shape") { //radialGradient用のdiv要素でないならば
- var tis = texti.style;
- tis.left = _parseFloat(tis.left) - bl + "px";
- tis.top = _parseFloat(tis.top) - bt + "px";
- tis = void 0;
- }
- }
- //ビューポートの位置をスクロールで調整 (なお、_txプロパティはSVGSVGElementのSIEコードを参照)
- ifcw && ifcw.scroll(-s.documentElement._tx, -s.documentElement._ty);
- s._isLoaded = 1; //_isLoadedプロパティはevents::dispatchEventメソッドで使う
- s.defaultView._cache = s.defaultView._cache_ele = null;
- oba = _doc = evt = ndoc = objei = tar = tview = objw = objh = n = att = sdt = sp = dcp = backr = sw = sh = style = fontSize = void 0;
- trstyle = backrs = text = texti = i = bfl = bft = bl = bt = text = _parseFloat = w = h = viewWidth = viewHeight = backdown = backright = void 0;
- /*IEのメモリリーク対策として、空関数を入力*/
- this.xmlhttp.onreadystatechange = NAIBU.emptyFunction;
- if (this._next) {
- ifcw && (ifr.contentWindow.screen.updateInterval = 0);
- ifr = ifcw = s = void 0;
- this._next._init();
- } else {
- /*全要素の読み込みが終了した場合*/
- if (s.implementation._buffer_) {
- screen.updateInterval = 0;
- /*以下はバッファリングにためておいた要素とイベントを、後から実行する*/
- NAIBU._buff_num = 0;
- NAIBU._buff = setInterval(function(){
- var n = NAIBU._buff_num,
- dbuf = DOMImplementation._buffer_,
- dbufli = dbuf ? dbuf.length : 0, //極端な負荷がかかると、dbufはnullになる可能性あり
- s, evt;
- if (dbufli === 0) {
- clearInterval(NAIBU._buff);
- } else {
- for (var i=0;i<50;++i) {
- s = dbuf[n];
- evt = dbuf[n+1];
- s.dispatchEvent(evt);
- n += 2;
- s = evt = void 0;
- if (n >= dbufli) {
- clearInterval(NAIBU._buff);
- DOMImplementation._buffer_ = null;
- NAIBU.Time.start();
- dbuf = n = dbufli = void 0;
- return;
- }
- }
- NAIBU._buff_num = n;
- }
- dbuf = n = dbufli = void 0;
- }, 1);
- ifr = ifcw = s = void 0;
- } else {
- ifr = ifcw = s = void 0;
- NAIBU.Time.start();
- }
- delete NAIBU.doc;
- }
- },
- /*SVGDocument*/ getSVGDocument : function() {
- return (this._document);
- }
-};
-/*空関数(IEのメモリリーク対策)*/
-NAIBU.emptyFunction = function() {};
-
-/*SVGStyleElement
- *style要素をあらわすオブジェクト
- */
-function SVGStyleElement(_doc) {
- SVGElement.apply(this);
- LinkStyle.apply(this);
- /*LinkStyleに関しては、以下の仕様を参照のこと。なお、これはSVG DOMでは継承されていないので要注意。
- *CSS2 1. Document Object Model Style Sheets
- * 1.3. Document Extensions
- * Interface LinkStyle (introduced in DOM Level 2)
- * http://www.w3.org/TR/DOM-Level-2-Style/stylesheets.html#StyleSheets-LinkStyle
- */
- /*以下はそれぞれ、属性の値に対応している*/
- /*DOMString*/ this.xmlspace;
- /*DOMString*/ this.type = "text/css";
- /*DOMString*/ this.media;
- /*DOMString*/ this.title;
- SVGURIReference.apply(this);
- this.addEventListener("DOMAttrModified", function(evt){
- if (evt.attrName === "type") {
- evt.target.type = evt.newValue;
- } else if (evt.attrName === "title") {
- evt.target.title = evt.newValue;
- }
- evt = void 0;
- }, false);
- this.addEventListener("S_Load", function(evt){
- var tar = evt.target,
- sheet = tar.sheet,
- styleText = tar._text,
- tod = tar.ownerDocument,
- style = _doc.createElement("style"),
- ri, rsc, scri, rsi;
- NAIBU._temp_doc = tod;
- sheet = tod.styleSheets[tod.styleSheets.length] = DOMImplementation.createCSSStyleSheet(tar.title, tar.media);
- sheet.ownerNode = tar;
- /*以下は、IEのCSSパーサを使って、スタイルシートのルールを実装していく*/
- _doc.documentElement.firstChild.appendChild(style);
- style.styleSheet.cssText = styleText;
- for (var i=0, rules=style.styleSheet.rules, rli=rules.length;i<rli;++i) {
- ri = rules[i];
- scri = new CSSStyleRule();
- scri.selectorText = ri.selectorText;
- scri.style.cssText = ri.style.cssText;
- rsc = scri.style.cssText.split(";");
- for (var j=0, rsli=rsc.length;j<rsli;++j) {
- rsi = rsc[j].split(": ");
- scri.style.setProperty(rsi[0], rsi[1]);
- }
- sheet.cssRules[sheet.cssRules.length] = scri;
- }
- tod.documentElement.addEventListener("DOMNodeInsertedIntoDocument", function(evt) {
- var tar = evt.target,
- doc = tar.ownerDocument,
- rules = doc.styleSheets[0] ? doc.styleSheets[0].cssRules : [],
- selector, ru, tcb = tar.className.baseVal || ".,.";
- for (var i=0, rli=rules.length;i<rli;++i) {
- selector = rules[i].selectorText;
- /*_rulesプロパティはCSSモジュールのgetCoumputedStyleメソッドで使う*/
- ru = tar._rules || [];
- if ((selector.indexOf("." +tcb) > -1) || (selector.indexOf("#" +tar.id) > -1)
- || (tar.nodeName === selector)) {
- ru[ru.length] = rules[i];
- }
- tar._rules = ru;
- }
- tar = doc = rules = void 0;
- }, true);
- tar = evt = style = sheet = styleText = tod = i = rules = rli = void 0;
- }, false);
- this.addEventListener("DOMNodeInserted", function(evt){
- var tar = evt.target;
- if (evt.eventPhase === /*Event.BUBBLING_PHASE*/ 3) {
- if (tar.nodeName === "#cdata-section") {
- evt.currentTarget._text = tar.data;
- }
- return;
- }
- tar.addEventListener("DOMNodeInsertedIntoDocument", function(evt){
- var tar = evt.target;
- if ((evt.eventPhase === /*Event.AT_TARGET*/ 2) && !tar.getAttributeNodeNS("http://www.w3.org/1999/xlink", "xlink:href")) {
- var evtt = tar.ownerDocument.createEvent("SVGEvents");
- evtt.initEvent("S_Load", false, false);
- evt.currentTarget.dispatchEvent(evtt);
- }
- tar = evt = void 0;
- }, false);
- }, false);
- return this;
-};
-SVGStyleElement.prototype = Object._create(SVGElement);
-
-/*SVGPoint
- *2次元座標の点(x,y)を表すオブジェクト
- */
-function SVGPoint() {
- return this;
-};
-/*float*/SVGPoint.prototype.x = SVGPoint.prototype.y = 0;
-SVGPoint.prototype.matrixTransform = function(/*SVGMatrix*/ matrix ) {
- if (!isFinite(matrix.a) || !isFinite(matrix.b) || !isFinite(matrix.c) || !isFinite(matrix.d) || !isFinite(matrix.e) || !isFinite(matrix.f)) {
- throw (new Error("Type Error: 引数の値がNumber型ではありません"));
- }
- var s = new SVGPoint();
- s.x = matrix.a * this.x + matrix.c * this.y + matrix.e;
- s.y = matrix.b * this.x + matrix.d * this.y + matrix.f;
- return s;
-};
-
-function SVGPointList() {
- return this;
-};
-/*SVGPointListのメソッドはSVGPathSegListを参照*/
-
-/*SVGMatrix
- *行列をあらわすオブジェクト。写像に用いる。以下のように表現できる
- *[a c e]
- *[b d f]
- *[0 0 1]
- */
-function SVGMatrix() {
- return this;
-};
-SVGMatrix.prototype = {
- /*float*/ a : 1,
- /*float*/ b : 0,
- /*float*/ c : 0,
- /*float*/ d : 1,
- /*float*/ e : 0,
- /*float*/ f : 0,
- /*multiplyメソッド
- *行列の積を求めて返す
- */
- /*SVGMatrix*/ multiply : function(/*SVGMatrix*/ secondMatrix ) {
- var s = new SVGMatrix(),
- m = secondMatrix,
- isf = isFinite,
- t = this;
- if (!isf(m.a) || !isf(m.b) || !isf(m.c) || !isf(m.d) || !isf(m.e) || !isf(m.f)) {
- throw (new Error("Type Error: 引数の値がNumber型ではありません"));
- }
- s.a = t.a * m.a + t.c * m.b;
- s.b = t.b * m.a + t.d * m.b;
- s.c = t.a * m.c + t.c * m.d;
- s.d = t.b * m.c + t.d * m.d;
- s.e = t.a * m.e + t.c * m.f + t.e;
- s.f = t.b * m.e + t.d * m.f + t.f;
- m = t = secondMatrix = isf = void 0;
- return s;
- },
- /*inverseメソッド
- *逆行列を返す
- */
- /*SVGMatrix*/ inverse : function() {
- var s = new SVGMatrix(), n = this._determinant();
- if (n !== 0) {
- s.a = this.d / n;
- s.b = -this.b / n;
- s.c = -this.c / n;
- s.d = this.a / n;
- s.e = (this.c * this.f - this.d * this.e) / n;
- s.f = (this.b * this.e - this.a * this.f) / n;
- return s;
- } else {
- throw (new SVGException(/*SVGException.SVG_MATRIX_NOT_INVERTABLE*/ 2));
- }
- },
- /*SVGMatrix*/ translate : function(/*float*/ x, /*float*/ y ) {
- var m = new SVGMatrix();
- m.e = x;
- m.f = y;
- var s = this.multiply(m);
- m = void 0;
- return s;
- },
- /*SVGMatrix*/ scale : function(/*float*/ scaleFactor ) {
- var m = new SVGMatrix();
- m.a = scaleFactor;
- m.d = scaleFactor;
- var s = this.multiply(m);
- m = void 0;
- return s;
- },
- /*SVGMatrix*/ scaleNonUniform : function(/*float*/ scaleFactorX, /*float*/ scaleFactorY ) {
- var m = new SVGMatrix();
- m.a = scaleFactorX;
- m.d = scaleFactorY;
- var s = this.multiply(m);
- m = void 0;
- return s;
- },
- /*SVGMatrix*/ rotate : function(/*float*/ angle ) {
- var m = new SVGMatrix(), rad = angle / 180 * Math.PI; //ラジアン変換
- m.a = Math.cos(rad);
- m.b = Math.sin(rad);
- m.c = -m.b;
- m.d = m.a;
- var s = this.multiply(m);
- m = rad = void 0;
- return s;
- },
- //座標(x, y)と原点の角度の分だけ、回転する
- /*SVGMatrix*/ rotateFromVector : function(/*float*/ x, /*float*/ y ) {
- if ((x === 0) || (y === 0) || !isFinite(x) || !isFinite(y)) {
- throw (new SVGException(/*SVGException.SVG_INVALID_VALUE_ERR*/ 1))
- }
- var m = new SVGMatrix(), rad = Math.atan2(y, x);
- m.a = Math.cos(rad);
- m.b = Math.sin(rad);
- m.c = -m.b;
- m.d = m.a;
- var s = this.multiply(m);
- m = rad = void 0;
- return s;
- },
- /*SVGMatrix*/ flipX : function() {
- var m = new SVGMatrix();
- m.a = -m.a;
- var s = this.multiply(m);
- m = void 0;
- return s;
- },
- /*SVGMatrix*/ flipY : function() {
- var m = new SVGMatrix();
- m.d = -m.d;
- var s = this.multiply(m);
- m = void 0;
- return s;
- },
- /*SVGMatrix*/ skewX : function(/*float*/ angle ){
- var m = new SVGMatrix(), rad = angle / 180 * Math.PI; //ラジアン変換
- m.c = Math.tan(rad);
- var s = this.multiply(m);
- m = void 0;
- return s;
- },
- /*SVGMatrix*/ skewY : function(/*float*/ angle ){
- var m = new SVGMatrix(), rad = angle / 180 * Math.PI;
- m.b = Math.tan(rad);
- var s = this.multiply(m);
- m = void 0;
- return s;
- },
- //行列式
- /*float*/ _determinant : function() {
- return (this.a * this.d - this.b * this.c);
- }
-};
-
-function SVGTransform() {
- /*readonly SVGMatrix*/ this.matrix = new SVGMatrix();
- return this;
-};
- // Transform Types
- /*unsigned short SVGTransform.SVG_TRANSFORM_UNKNOWN = 0;
- /*unsigned short SVGTransform.SVG_TRANSFORM_MATRIX = 1;
- /*unsigned short SVGTransform.SVG_TRANSFORM_TRANSLATE = 2;
- /*unsigned short SVGTransform.SVG_TRANSFORM_SCALE = 3;
- /*unsigned short SVGTransform.SVG_TRANSFORM_ROTATE = 4;
- /*unsigned short SVGTransform.SVG_TRANSFORM_SKEWX = 5;
- /*unsigned short SVGTransform.SVG_TRANSFORM_SKEWY = 6;*/
-SVGTransform.prototype = {
- /*ダミーの単位行列。各メソッドで使う*/
- _matrix : (new SVGMatrix()),
- /*readonly unsigned short*/ type : /*SVGTransform.SVG_TRANSFORM_UNKNOWN*/ 0,
- /*readonly float*/ angle : 0,
- /*void*/ setMatrix : function(/*SVGMatrix*/ matrix ) {
- this.type = /*SVGTransform.SVG_TRANSFORM_MATRIX*/ 1;
- this.matrix = this._matrix.multiply(matrix);
- },
- /*void*/ setTranslate : function(/*float*/ tx, /*float*/ ty ) {
- this.type = /*SVGTransform.SVG_TRANSFORM_TRANSLATE*/ 2;
- this.matrix = this._matrix.translate(tx, ty);
- },
- /*void*/ setScale : function(/*float*/ sx, /*float*/ sy ) {
- this.type = /*SVGTransform.SVG_TRANSFORM_SCALE*/ 3;
- this.matrix = this._matrix.scaleNonUniform(sx, sy);
- },
- /*void*/ setRotate : function(/*float*/ angle, /*float*/ cx, /*float*/ cy ) {
- this.angle = angle;
- this.type = /*SVGTransform.SVG_TRANSFORM_ROTATE*/ 4;
- this.matrix = this._matrix.rotate(angle);
- this.matrix.e = (1-this.matrix.a)*cx - this.matrix.c*cy;
- this.matrix.f = -this.matrix.b*cx + (1-this.matrix.d)*cy;
- },
- /*void*/ setSkewX : function(/*float*/ angle ) {
- this.angle = angle;
- this.type = /*SVGTransform.SVG_TRANSFORM_SKEWX*/ 5;
- this.matrix = this._matrix.skewX(angle);
- },
- /*void*/ setSkewY : function(/*float*/ angle ) {
- this.angle = angle;
- this.type = /*SVGTransform.SVG_TRANSFORM_SKEWY*/ 6;
- this.matrix = this._matrix.skewY(angle);
- }
-};
-
-function SVGTransformList() {
- return this;
-};
-/*SVGTransformListのメソッドはSVGPathSegListを参照*/
-
-/*SVGTransform*/ SVGTransformList.prototype.createSVGTransformFromMatrix = function(/*SVGMatrix*/ matrix ) {
- var t = new SVGTransform();
- t.setMatrix(matrix);
- return t;
-}
-/*SVGTransform*/ SVGTransformList.prototype.consolidate = function() {
- if(this.numberOfItems === 0) {
- return null;
- } else {
- var s = this.getItem(0), m = s.matrix;
- for (var i=1,nli=this.numberOfItems;i<nli;++i) {
- m = m.multiply(this.getItem(i).matrix);
- }
- s.setMatrix(m);
- this.initialize(s);
- return s;
- }
-}
-
-function SVGAnimatedTransformList() {
- /*readonly SVGTransformList*/ this.animVal = this.baseVal = new SVGTransformList();
- return this;
-};
-function SVGPreserveAspectRatio() {
- /*unsigned short*/ this.align = /*SVGPreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMIDYMID*/ 6;
- /*unsigned short*/ this.meetOrSlice = /*SVGPreserveAspectRatio.SVG_MEETORSLICE_MEET*/ 1;
- return this;
-};
-/*(function(t) {
- // Alignment Types
- /*unsigned short t.SVG_PRESERVEASPECTRATIO_UNKNOWN = 0;
- /*unsigned short t.SVG_PRESERVEASPECTRATIO_NONE = 1;
- /*unsigned short t.SVG_PRESERVEASPECTRATIO_XMINYMIN = 2;
- /*unsigned short t.SVG_PRESERVEASPECTRATIO_XMIDYMIN = 3;
- /*unsigned short t.SVG_PRESERVEASPECTRATIO_XMAXYMIN = 4;
- /*unsigned short t.SVG_PRESERVEASPECTRATIO_XMINYMID = 5;
- /*unsigned short t.SVG_PRESERVEASPECTRATIO_XMIDYMID = 6;
- /*unsigned short t.SVG_PRESERVEASPECTRATIO_XMAXYMID = 7;
- /*unsigned short t.SVG_PRESERVEASPECTRATIO_XMINYMAX = 8;
- /*unsigned short t.SVG_PRESERVEASPECTRATIO_XMIDYMAX = 9;
- /*unsigned short t.SVG_PRESERVEASPECTRATIO_XMAXYMAX = 10;
- // Meet-or-slice Types
- /*unsigned short t.SVG_MEETORSLICE_UNKNOWN = 0;
- /*unsigned short t.SVG_MEETORSLICE_MEET = 1;
- /*unsigned short t.SVG_MEETORSLICE_SLICE = 2;
-})(SVGPreserveAspectRatio);*/
-
-function SVGAnimatedPreserveAspectRatio() {
- /*readonly SVGPreserveAspectRatio*/ this.animVal = this.baseVal = new SVGPreserveAspectRatio();
- return this;
-};
-
-function SVGPathSeg() {
- /*readonly unsigned short*/ this.pathSegType = /*SVGPathSeg.PATHSEG_UNKNOWN*/ 0;
- /*readonly DOMString*/ this.pathSegTypeAsLetter = null;
- return this;
-};
-
-/*(function(t) {
- // Path Segment Types
- /*unsigned short t.PATHSEG_UNKNOWN = 0;
- /*unsigned short t.PATHSEG_CLOSEPATH = 1;
- /*unsigned short t.PATHSEG_MOVETO_ABS = 2;
- /*unsigned short t.PATHSEG_MOVETO_REL = 3;
- /*unsigned short t.PATHSEG_LINETO_ABS = 4;
- /*unsigned short t.PATHSEG_LINETO_REL = 5;
- /*unsigned short t.PATHSEG_CURVETO_CUBIC_ABS = 6;
- /*unsigned short t.PATHSEG_CURVETO_CUBIC_REL = 7;
- /*unsigned short t.PATHSEG_CURVETO_QUADRATIC_ABS = 8;
- /*unsigned short t.PATHSEG_CURVETO_QUADRATIC_REL = 9;
- /*unsigned short t.PATHSEG_ARC_ABS = 10;
- /*unsigned short t.PATHSEG_ARC_REL = 11;
- /*unsigned short t.PATHSEG_LINETO_HORIZONTAL_ABS = 12;
- /*unsigned short t.PATHSEG_LINETO_HORIZONTAL_REL = 13;
- /*unsigned short t.PATHSEG_LINETO_VERTICAL_ABS = 14;
- /*unsigned short t.PATHSEG_LINETO_VERTICAL_REL = 15;
- /*unsigned short t.PATHSEG_CURVETO_CUBIC_SMOOTH_ABS = 16;
- /*unsigned short t.PATHSEG_CURVETO_CUBIC_SMOOTH_REL = 17;
- /*unsigned short t.PATHSEG_CURVETO_QUADRATIC_SMOOTH_ABS = 18;
- /*unsigned short t.PATHSEG_CURVETO_QUADRATIC_SMOOTH_REL = 19;
-})(SVGPathSeg);*/
-/*SVGPathSegxx
- *軽量化のために、SVGPathSegの継承をしない。また、{}オブジェクトで代用する予定
- */
-function SVGPathSegClosePath() {
- return this;
-};
-SVGPathSegClosePath.prototype = {
- pathSegType : /*SVGPathSeg.PATHSEG_CLOSEPATH*/ 1,
- pathSegTypeAsLetter : "z"
-};
-function SVGPathSegMovetoAbs() {
- /*float* this.x;
- /*float* this.y;*/
- return this;
-};
-SVGPathSegMovetoAbs.prototype = {
- pathSegType : /*SVGPathSeg.PATHSEG_MOVETO_ABS*/ 2,
- pathSegTypeAsLetter : "M"
-};
-function SVGPathSegMovetoRel() {
- /*float*/ this.x;
- /*float*/ this.y;
- return this;
-};
-SVGPathSegMovetoRel.prototype = {
- pathSegType : /*SVGPathSeg.PATHSEG_MOVETO_REL*/ 3,
- pathSegTypeAsLetter : "m"
-};
-function SVGPathSegLinetoAbs() {
- /*float* this.x;
- /*float* this.y;*/
- return this;
-};
-SVGPathSegLinetoAbs.prototype = {
- pathSegType : /*SVGPathSeg.PATHSEG_LINETO_ABS*/ 4,
- pathSegTypeAsLetter : "L"
-};
-function SVGPathSegLinetoRel() {
- /*float*/ this.x;
- /*float*/ this.y;
- return this;
-};
-SVGPathSegLinetoRel.prototype = {
- pathSegType : /*SVGPathSeg.PATHSEG_LINETO_REL*/ 5,
- pathSegTypeAsLetter : "l"
-};
-function SVGPathSegCurvetoCubicAbs() {
- /*float* this.x;
- /*float* this.y;
- /*float* this.x1;
- /*float* this.y1;
- /*float* this.x2;
- /*float* this.y2;*/
- return this;
-};
-SVGPathSegCurvetoCubicAbs.prototype = {
- pathSegType : /*SVGPathSeg.PATHSEG_CURVETO_CUBIC_ABS*/ 6,
- pathSegTypeAsLetter : "C"
-};
-function SVGPathSegCurvetoCubicRel() {
- /*float* this.x;
- /*float* this.y;
- /*float* this.x1;
- /*float* this.y1;
- /*float* this.x2;
- /*float* this.y2;*/
- return this;
-};
-SVGPathSegCurvetoCubicRel.prototype = {
- pathSegType : /*SVGPathSeg.PATHSEG_CURVETO_CUBIC_REL*/ 7,
- pathSegTypeAsLetter : "c"
-};
-function SVGPathSegCurvetoQuadraticAbs() {
- /*float*/ this.x;
- /*float*/ this.y;
- /*float*/ this.x1;
- /*float*/ this.y1;
- this.pathSegType = /*SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_ABS*/ 8;
- this.pathSegTypeAsLetter = "Q";
- return this;
-};
-function SVGPathSegCurvetoQuadraticRel() {
- /*float*/ this.x;
- /*float*/ this.y;
- /*float*/ this.x1;
- /*float*/ this.y1;
- this.pathSegType = /*SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_REL*/ 9;
- this.pathSegTypeAsLetter = "q";
- return this;
-};
-
-function SVGPathSegArcAbs() {
- /*float*/ this.x;
- /*float*/ this.y;
- /*float*/ this.r1;
- /*float*/ this.r2;
- /*float*/ this.angle;
- return this;
-};
-SVGPathSegArcAbs.prototype = {
- /*boolean*/ largeArcFlag : true,
- /*boolean*/ sweepFlag : true,
- pathSegType : /*SVGPathSeg.PATHSEG_ARC_ABS*/ 10,
- pathSegTypeAsLetter : "A"
-};
-function SVGPathSegArcRel() {
- /*float*/ this.x;
- /*float*/ this.y;
- /*float*/ this.r1;
- /*float*/ this.r2;
- /*float*/ this.angle;
- return this;
-};
-SVGPathSegArcRel.prototype = {
- /*boolean*/ largeArcFlag : true,
- /*boolean*/ sweepFlag : true,
- pathSegType : /*SVGPathSeg.PATHSEG_ARC_REL*/ 11,
- pathSegTypeAsLetter : "a"
-};
-function SVGPathSegLinetoHorizontalAbs() {
- /*float*/ this.x;
- this.pathSegType = /*SVGPathSeg.PATHSEG_LINETO_HORIZONTAL_ABS*/ 12;
- this.pathSegTypeAsLetter = "H";
- return this;
-};
-function SVGPathSegLinetoHorizontalRel() {
- /*float*/ this.x;
- this.pathSegType = /*SVGPathSeg.PATHSEG_LINETO_HORIZONTAL_REL*/ 13;
- this.pathSegTypeAsLetter = "h";
- return this;
-};
-function SVGPathSegLinetoVerticalAbs() {
- /*float*/ this.y;
- this.pathSegType = /*SVGPathSeg.PATHSEG_LINETO_VERTICAL_ABS*/ 14;
- this.pathSegTypeAsLetter = "V";
- return this;
-};
-function SVGPathSegLinetoVerticalRel() {
- /*float*/ this.y;
- this.pathSegType = /*SVGPathSeg.PATHSEG_LINETO_VERTICAL_REL*/ 15;
- this.pathSegTypeAsLetter = "v";
- return this;
-};
-function SVGPathSegCurvetoCubicSmoothAbs() {
- /*float*/ this.x;
- /*float*/ this.y;
- /*float*/ this.x2;
- /*float*/ this.y2;
- this.pathSegType = /*SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_ABS*/ 16;
- this.pathSegTypeAsLetter = "S";
- return this;
-};
-function SVGPathSegCurvetoCubicSmoothRel() {
- /*float*/ this.x;
- /*float*/ this.y;
- /*float*/ this.x2;
- /*float*/ this.y2;
- this.pathSegType = /*SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_REL*/ 17;
- this.pathSegTypeAsLetter = "s";
- return this;
-};
-function SVGPathSegCurvetoQuadraticSmoothAbs() {
- /*float*/ this.x;
- /*float*/ this.y;
- this.pathSegType = /*SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_SMOOTH_ABS*/ 18;
- this.pathSegTypeAsLetter = "T";
- return this;
-};
-function SVGPathSegCurvetoQuadraticSmoothRel() {
- /*float*/ this.x;
- /*float*/ this.y;
- this.pathSegType = /*SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_SMOOTH_REL*/ 19;
- this.pathSegTypeAsLetter = "t";
- return this;
-};
-function SVGPathSegList() {
- return this;
-};
-for (var prop in SVGStringList.prototype) { //prototypeのコピーで継承を行う
- SVGNumberList.prototype[prop] = SVGLengthList.prototype[prop] = SVGPointList.prototype[prop] = SVGTransformList.prototype[prop] = SVGPathSegList.prototype[prop] = SVGStringList.prototype[prop];
-};
-prop = void 0;
-
-/*documentは引数の変数として登録しておく*/
-(function(_doc, _math) {
-//freeArg関数はunloadで使う解放処理
-NAIBU.freeArg = function() {
- SVGPathElement = _doc = _math = void 0;
-};
-//仮のfill属性とstroke属性の処理
-NAIBU._setPaint = function(tar, matrix) {
- /*以下では、スタイルシートを用いて、fill-とstroke-関連の
- *処理を行う。SVGPaintインターフェースをも用いる
- */
- var tod = tar.ownerDocument,
- _doc = tod._document_,
- el = tar._tar,
- style = tod.defaultView.getComputedStyle(tar, ""),
- fill = style.getPropertyCSSValue("fill"),
- stroke = style.getPropertyCSSValue("stroke"),
- fp = fill.paintType,
- sp = stroke.paintType,
- fillElement, fc,
- num = /*CSSPrimitiveValue.CSS_NUMBER*/ 1,
- t, evtt, fillOpacity, strs, cursor, vis, disp,
- strokeElement, strokeOpacity, tgebtstroke, sgsw, w, h, swx, tsd, strokedasharray;
- if (!el) {
- return;
- }
- /*あらかじめ、v:fill要素とv:stroke要素は消しておく*/
- while (el.firstChild) {
- el.removeChild(el.firstChild);
- }
- if ((fp === /*SVGPaint.SVG_PAINTTYPE_RGBCOLOR*/ 1) || (fp === /*SVGPaint.SVG_PAINTTYPE_CURRENTCOLOR*/ 102)) {
- if (fp === /*SVGPaint.SVG_PAINTTYPE_CURRENTCOLOR*/ 102) {
- /*再度、設定。css.jsのsetPropertyを参照*/
- style.setProperty("color", style.getPropertyValue("color"));
- }
- fillElement = _doc.createElement("v:fill");
- fc = fill.rgbColor;
- num = /*CSSPrimitiveValue.CSS_NUMBER*/ 1;
- fillElement.setAttribute("color", "rgb(" +fc.red.getFloatValue(num)+ "," +fc.green.getFloatValue(num)+ "," +fc.blue.getFloatValue(num)+ ")");
- fillOpacity = +(style.getPropertyValue("fill-opacity")) * style._list._opacity; //opacityを掛け合わせる
- if (fillOpacity < 1) {
- fillElement.setAttribute("opacity", fillOpacity+"");
- }
- el.appendChild(fillElement);
- fillElement = fc = fillOpacity = void 0;
- } else if (fill.uri) {
- /*以下では、Gradation関連の要素に、イベントを渡すことで、
- *この要素の、グラデーション描画を行う
- */
- t = tod.getElementById(fill.uri);
- if (t) {
- evtt = tod._domnodeEvent();
- evtt._tar = _doc.createElement("v:fill");
- evtt._style = style;
- evtt._ttar = tar;
- t.dispatchEvent(evtt);
- if (t.localName !== "radialGradient") {
- el.appendChild(evtt._tar);
- }
- t = evtt = void 0;
- }
- } else {
- el.filled = "false";
- }
- if ((sp === /*SVGPaint.SVG_PAINTTYPE_RGBCOLOR*/ 1) || (sp === /*SVGPaint.SVG_PAINTTYPE_CURRENTCOLOR*/ 102)) {
- if (sp === /*SVGPaint.SVG_PAINTTYPE_CURRENTCOLOR*/ 102) {
- /*再度、設定。css.jsのsetPropertyを参照*/
- style.setProperty("color", style.getPropertyValue("color"));
- }
- strokeElement = _doc.createElement("v:stroke");
- sgsw = style.getPropertyCSSValue("stroke-width");
- w = tod.documentElement.viewport.width;
- h = tod.documentElement.viewport.height;
- sgsw._percent = _math.sqrt((w*w + h*h) / 2);
- swx = sgsw.getFloatValue(/*CSSPrimitiveValue.CSS_NUMBER*/ 1) * _math.sqrt(_math.abs(matrix._determinant()));
- strokeElement.setAttribute("weight", swx + "px");
- sgsw = w = h = void 0;
- if (!stroke.uri) {
- fc = stroke.rgbColor;
- strokeElement.setAttribute("color", "rgb(" +fc.red.getFloatValue(num)+ "," +fc.green.getFloatValue(num)+ "," +fc.blue.getFloatValue(num)+ ")");
- strokeOpacity = +(style.getPropertyValue("stroke-opacity")) * (+(style.getPropertyValue("opacity"))); //opacityを掛け合わせる
- if (swx < 1) {
- strokeOpacity *= swx; //太さが1px未満なら色を薄くする
- }
- if (strokeOpacity < 1) {
- strokeElement.setAttribute("opacity", strokeOpacity+"");
- }
- fc = strokeOpacity = void 0;
- }
- strokeElement.setAttribute("miterlimit", style.getPropertyValue("stroke-miterlimit"));
- strokeElement.setAttribute("joinstyle", style.getPropertyValue("stroke-linejoin"));
- if (style.getPropertyValue("stroke-linecap") === "butt") {
- strokeElement.setAttribute("endcap", "flat");
- } else {
- strokeElement.setAttribute("endcap", style.getPropertyValue("stroke-linecap"));
- }
- tsd = style.getPropertyValue("stroke-dasharray");
- if (tsd !== "none") {
- if (tsd.indexOf(",") > 0) { //コンマ区切りの文字列の場合
- strs = tsd.split(",");
- for (var i = 0, sli = strs.length; i < sli; ++i) {
- strs[i] = _math.ceil(+(strs[i]) / parseFloat(style.getPropertyValue("stroke-width"))); //精密ではないので注意
- }
- strokedasharray = strs.join(" ");
- if (strs.length % 2 === 1) {
- strokedasharray += " " + strokedasharray;
- }
- }
- strokeElement.setAttribute("dashstyle", strokedasharray);
- tsd = strs = void 0;
- }
- el.appendChild(strokeElement);
- strokeElement = tsd = void 0;
- } else {
- el.stroked = "false";
- }
- if (el.style) {
- cursor = style.getPropertyCSSValue("cursor");
- if (cursor && !cursor._isDefault) { //初期値でないならば
- el.style.cursor = cursor.cssText.split(":")[1];
- }
- vis = style.getPropertyCSSValue("visibility");
- if (vis && !vis._isDefault) {
- el.style.visibility = vis.cssText.split(":")[1];
- }
- disp = style.getPropertyCSSValue("display");
- if (disp && !disp._isDefault && (disp.cssText.indexOf("none") > -1)) {
- el.style.display = "none";
- } else if (disp && !disp._isDefault && (disp.cssText.indexOf("inline-block") === -1)) {
- el.style.display = "inline-block";
- }
- }
- tod = _doc = el = fill = stroke = sp = fp = style = cursor = tar = matrix = vis = disp = num = void 0;
-};
-
-function SVGPathElement(_doc) {
- SVGElement.apply(this);
- this._tar = _doc.createElement("v:shape");
- //interface SVGAnimatedPathData
- var sp = SVGPathSegList;
- /*readonly SVGPathSegList*/ this.pathSegList = new sp();
- this.animatedPathSegList = this.pathSegList;
- /*readonly SVGPathSegList*/ this.normalizedPathSegList = new sp();
- sp = _doc = void 0;
- this.animatedNormalizedPathSegList = this.normalizedPathSegList;
- /*readonly SVGAnimatedNumber*/ this.pathLength = new SVGAnimatedNumber();
- //以下は、d属性に変更があった場合の処理
- this.addEventListener("DOMAttrModified", this._attrModi, false);
- /*以下の処理は、このpath要素ノードがDOMツリーに追加されて初めて、
- *描画が開始されることを示す。つまり、appendChildで挿入されない限り、描画をしない。
- */
- this.addEventListener("DOMNodeInserted", this._nodeInsert, false);
- return this;
-};
-SVGPathElement.prototype = Object._create(SVGElement);
-(function(_sproto) {
-_sproto._attrModi = function(evt){
- var tar = evt.target;
- if (evt.attrName === "d" && evt.newValue !== ""){
- /* d属性の値が空の場合は、描画を行わないようにする
- *
- *SVG1.1 「8.3.9 The grammar for path data」の項目にある最後の文章を参照
- */
- var tnl = tar.normalizedPathSegList,
- tlist = tar.pathSegList;
- if (tnl.numberOfItems > 0) {
- tnl.clear();
- tlist.clear();
- }
- /*d属性の値を正規表現を用いて、二次元配列Dに変換している。もし、d属性の値が"M 20 30 L20 40"ならば、
- *JSONにおける表現は以下のとおり
- *D = [["M", 20, 30], ["L", 20 40]]
- */
- var taco = tar._com,
- sgs = taco.isSp,
- dd = evt.newValue
- .replace(taco.isRa, " -")
- .replace(taco.isRb, " ")
- .replace(taco.isRc, ",$1 ")
- .replace(taco.isRd, ",$1 1")
- .replace(taco.isRe, "")
- .replace(/\.(\d+)\./g, ".$1 0.")
- .replace(/[^\w\d\+\-\.\,\n\r\s].*/, "")
- .split(","),
- dli=dd.length,
- isZ = taco._isZ,
- isM = taco._isM,
- isC = taco._isC,
- isL = taco._isL,
- tcc = tar.createSVGPathSegCurvetoCubicAbs,
- tcll = tar.createSVGPathSegLinetoAbs,
- flag, sflag;
- for (var i=0;i<dli;++i) {
- var di = dd[i].match(sgs),
- s;
- for (var j=1, dii=di[0], dili=di.length; j < dili; ++j) {
- if (isC[dii]) {
- s = tcc(+di[j+4], +di[j+5], +di[j], +di[j+1], +di[j+2], +di[j+3]);
- j += 5;
- } else if (isL[dii]) {
- s = tcll(+di[j], +di[j+1]);
- ++j;
- } else if (isM[dii]) {
- s = tar.createSVGPathSegMovetoAbs(+di[j], +di[j+1]);
- ++j;
- } else if (isZ[dii]) {
- s = tar.createSVGPathSegClosePath();
- } else if (dii === "A") {
- flag = di[j+3];
- if (flag.length > 1 && (+flag >= 0)) { /*if no commawsp*/
- di.splice(j+3, 1, flag.charAt(0), flag.slice(1));
- ++dili;
- }
- sflag = di[j+4];
- if (sflag.length > 1 && (+sflag >= 0)) {
- di.splice(j+4, 1, sflag.charAt(0), sflag.slice(1));
- ++dili;
- }
- flag = di[j+3];
- sflag = di[j+4];
- if (((+flag < 0) || (+flag > 1)) || ((+sflag < 0) || (+sflag > 1))) {
- /*仕様では、フラグが0か1しか認められていない*/
- j += 6;
- continue;
- }
- s = tar.createSVGPathSegArcAbs(+di[j+5], +di[j+6], +di[j], +di[j+1], +di[j+2], +flag, +sflag);
- j += 6;
- } else if (dii === "m") {
- s = tar.createSVGPathSegMovetoRel(+di[j], +di[j+1]);
- ++j;
- } else if (dii === "l") {
- s = tar.createSVGPathSegLinetoRel(+di[j], +di[j+1]);
- ++j;
- } else if (dii === "c") {
- s = tar.createSVGPathSegCurvetoCubicRel(+di[j+4], +di[j+5], +di[j], +di[j+1], +di[j+2], +di[j+3]);
- j += 5;
- } else if (dii === "Q") {
- s = tar.createSVGPathSegCurvetoQuadraticAbs(+di[j+2], +di[j+3], +di[j], +di[j+1]);
- j += 3;
- } else if (dii === "q") {
- s = tar.createSVGPathSegCurvetoQuadraticRel(+di[j+2], +di[j+3], +di[j], +di[j+1]);
- j += 3;
- } else if (dii === "a") {
- flag = di[j+3];
- if (flag.length > 1 && (+flag >= 0)) { /*if no commawsp*/
- di.splice(j+3, 1, flag.charAt(0), flag.slice(1));
- ++dili;
- }
- sflag = di[j+4];
- if (sflag.length > 1 && (+sflag >= 0)) {
- di.splice(j+4, 1, sflag.charAt(0), sflag.slice(1));
- ++dili;
- }
- flag = di[j+3];
- sflag = di[j+4];
- if (((+flag < 0) || (+flag > 1)) || ((+sflag < 0) || (+sflag > 1))) {
- /*仕様では、フラグが0か1しか認められていない*/
- j += 6;
- continue;
- }
- s = tar.createSVGPathSegArcRel(+di[j+5], +di[j+6], +di[j], +di[j+1], +di[j+2], +flag, +sflag);
- j += 6;
- } else if (dii === "S") {
- s = tar.createSVGPathSegCurvetoCubicSmoothAbs(+di[j+2], +di[j+3], +di[j], +di[j+1]);
- j += 3;
- } else if (dii === "s") {
- s = tar.createSVGPathSegCurvetoCubicSmoothRel(+di[j+2], +di[j+3], +di[j], +di[j+1]);
- j += 3;
- } else if (dii === "T") {
- s = tar.createSVGPathSegCurvetoQuadraticSmoothAbs(+di[j], +di[j+1]);
- ++j;
- } else if (dii === "t") {
- s = tar.createSVGPathSegCurvetoQuadraticSmoothRel(+di[j], +di[j+1]);
- ++j;
- } else if (dii === "H") {
- s = tar.createSVGPathSegLinetoHorizontalAbs(+di[j]);
- } else if (dii === "h") {
- s = tar.createSVGPathSegLinetoHorizontalRel(+di[j]);
- } else if (dii === "V") {
- s = tar.createSVGPathSegLinetoVerticalAbs(+di[j]);
- } else if (dii === "v") {
- s = tar.createSVGPathSegLinetoVerticalRel(+di[j]);
- } else {
- s = new SVGPathSeg();
- }
- tlist.appendItem(s);
- }
- }
- di = s = sgs = dd = void 0;
- /*以下の処理は、pathSegListからnormalizedPathSegListへの
- *変換をする処理。相対座標を絶対座標に変換して、M、L、Cコマンドに正規化していく
- */
- var cx = 0, cy = 0, //現在セグメントの終了点の絶対座標を示す (相対座標を絶対座標に変換するときに使用)
- xn = 0, yn = 0, //T,tコマンドで仮想的な座標を算出するのに用いる。第一コントロール点
- startx = 0, starty = 0; //M,mコマンドにおける始点座標(Z,zコマンドで用いる)
- for (var j=0, tli=tlist.numberOfItems;j<tli;++j) {
- var ti = tlist.getItem(j),
- ts = ti.pathSegType,
- dii = ti.pathSegTypeAsLetter;
- if (ts === /*SVGPathSeg.PATHSEG_UNKNOWN*/ 0) {
- } else {
- var rx = cx, ry = cy; //rx, ryは前のセグメントの終了点
- if (ts % 2 === 1) { //相対座標ならば
- cx += ti.x;
- cy += ti.y;
- } else {
- cx = ti.x;
- cy = ti.y;
- }
- if (isC[dii]) {
- tnl.appendItem(ti);
- } else if (isL[dii]) {
- tnl.appendItem(ti);
- } else if (isM[dii]) {
- if (j !== 0) {
- /*Mコマンドが続いた場合は、2番目以降はLコマンドと解釈する
- *W3C SVG1.1の「8.3.2 The "moveto" commands」を参照
- *http://www.w3.org/TR/SVG11/paths.html#PathDataMovetoCommands
- */
- var tg = tlist.getItem(j-1);
- if (tg.pathSegTypeAsLetter === "M") {
- tnl.appendItem(tcll(cx, cy));
- continue;
- }
- }
- startx = cx;
- starty = cy;
- tnl.appendItem(ti);
- } else if (dii === "m") {
- if (j !== 0) {
- var tg = tlist.getItem(j-1);
- if (tg.pathSegTypeAsLetter === "m") {
- tnl.appendItem(tcll(cx, cy));
- continue;
- }
- }
- startx = cx;
- starty = cy;
- tnl.appendItem(tar.createSVGPathSegMovetoAbs(cx, cy));
- } else if (dii === "l") {
- tnl.appendItem(tcll(cx, cy));
- } else if (dii === "c") {
- tnl.appendItem(tcc(cx, cy, ti.x1+rx, ti.y1+ry, ti.x2+rx, ti.y2+ry));
- } else if (isZ[dii]) {
- cx = startx;
- cy = starty;
- tnl.appendItem(ti);
- } else if (dii === "Q") {
- xn = 2*cx - ti.x1;
- yn = 2*cy - ti.y1;
- //2次スプライン曲線は近似的な3次ベジェ曲線に変換している
- tnl.appendItem(tcc(cx, cy, (rx + 2*ti.x1) / 3, (ry + 2*ti.y1) / 3, (2*ti.x1 + cx) / 3, (2*ti.y1 + cy) / 3));
- } else if (dii === "q") {
- var x1 = ti.x1 + rx, y1 = ti.y1 + ry;
- xn = 2*cx - x1;
- yn = 2*cy - y1;
- tnl.appendItem(tcc(cx, cy, (rx + 2*x1) / 3, (ry + 2*y1) / 3, (2*x1 + cx) / 3, (2*y1 + cy) / 3));
- x1 = y1 = void 0;
- } else if (dii === "A" || dii === "a") {
- (function(ti, cx, cy, rx, ry, tar, tnl) { //変数を隠蔽するためのfunction
- /*以下は、Arctoを複数のCuvetoに変換する処理
- *SVG 1.1 「F.6 Elliptical arc implementation notes」の章を参照
- *http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes
- */
- if (ti.r1 === 0 || ti.r2 === 0) {
- return;
- }
- var fS = ti.sweepFlag,
- psai = ti.angle,
- r1 = _math.abs(ti.r1),
- r2 = _math.abs(ti.r2),
- ctx = (rx - cx) / 2, cty = (ry - cy) / 2,
- cpsi = _math.cos(psai * _math.PI / 180),
- spsi = _math.sin(psai * _math.PI / 180),
- rxd = cpsi*ctx + spsi*cty,
- ryd = -1*spsi*ctx + cpsi*cty,
- rxdd = rxd * rxd, rydd = ryd * ryd,
- r1x = r1 * r1,
- r2y = r2 * r2,
- lamda = rxdd/r1x + rydd/r2y,
- sds;
- if (lamda > 1) {
- r1 = _math.sqrt(lamda) * r1;
- r2 = _math.sqrt(lamda) * r2;
- sds = 0;
- } else{
- var seif = 1;
- if (ti.largeArcFlag === fS) {
- seif = -1;
- }
- sds = seif * _math.sqrt((r1x*r2y - r1x*rydd - r2y*rxdd) / (r1x*rydd + r2y*rxdd));
- }
- var txd = sds*r1*ryd / r2,
- tyd = -1 * sds*r2*rxd / r1,
- tx = cpsi*txd - spsi*tyd + (rx+cx)/2,
- ty = spsi*txd + cpsi*tyd + (ry+cy)/2,
- rad = _math.atan2((ryd-tyd)/r2, (rxd-txd)/r1) - _math.atan2(0, 1),
- s1 = (rad >= 0) ? rad : 2 * _math.PI + rad,
- rad = _math.atan2((-ryd-tyd)/r2, (-rxd-txd)/r1) - _math.atan2((ryd-tyd)/r2, (rxd-txd)/r1),
- dr = (rad >= 0) ? rad : 2 * _math.PI + rad;
- if (!fS && dr > 0) {
- dr -= 2*_math.PI;
- } else if (fS && dr < 0) {
- dr += 2*_math.PI;
- }
- var sse = dr * 2 / _math.PI,
- seg = _math.ceil(sse<0 ? -1*sse : sse),
- segr = dr / seg,
- t = 8/3 * _math.sin(segr/4) * _math.sin(segr/4) / _math.sin(segr/2),
- cpsir1 = cpsi * r1, cpsir2 = cpsi * r2,
- spsir1 = spsi * r1, spsir2 = spsi * r2,
- mc = _math.cos(s1),
- ms = _math.sin(s1),
- x2 = rx - t * (cpsir1*ms + spsir2*mc),
- y2 = ry - t * (spsir1*ms - cpsir2*mc);
- for (var n = 0; n < seg; ++n) {
- s1 += segr;
- mc = _math.cos(s1);
- ms = _math.sin(s1);
- var x3 = cpsir1*mc - spsir2*ms + tx,
- y3 = spsir1*mc + cpsir2*ms + ty,
- dx = -t * (cpsir1*ms + spsir2*mc),
- dy = -t * (spsir1*ms - cpsir2*mc);
- tnl.appendItem(tcc(x3, y3, x2, y2, x3-dx, y3-dy));
- x2 = x3 + dx;
- y2 = y3 + dy;
- }
- ti= cx= cy= rx= ry= tar= tnl = void 0;
- })(ti, cx, cy, rx, ry, tar, tnl);
- } else if (dii === "S") {
- if (j !== 0) {
- var tg = tnl.getItem(tnl.numberOfItems-1);
- if (tg.pathSegTypeAsLetter === "C") {
- var x1 = 2*tg.x - tg.x2,
- y1 = 2*tg.y - tg.y2;
- } else { //前のコマンドがCでなければ、現在の座標を第1コントロール点に用いる
- var x1 = rx,
- y1 = ry;
- }
- } else {
- var x1 = rx,
- y1 = ry;
- }
- tnl.appendItem(tcc(cx, cy, x1, y1, ti.x2, ti.y2));
- x1 = y1 = void 0;
- } else if (dii === "s") {
- if (j !== 0) {
- var tg = tnl.getItem(tnl.numberOfItems-1);
- if (tg.pathSegTypeAsLetter === "C") {
- var x1 = 2*tg.x - tg.x2,
- y1 = 2*tg.y - tg.y2;
- } else {
- var x1 = rx,
- y1 = ry;
- }
- } else {
- var x1 = rx,
- y1 = ry;
- }
- tnl.appendItem(tcc(cx, cy, x1, y1, ti.x2+rx, ti.y2+ry));
- x1 = y1 = void 0;
- } else if (dii === "T" || dii === "t") {
- if (j !== 0) {
- var tg = tlist.getItem(j-1);
- if ("QqTt".indexOf(tg.pathSegTypeAsLetter) > -1) {
- } else {
- xn = rx, yn = ry;
- }
- } else {
- xn = rx, yn = ry;
- }
- tnl.appendItem(tcc(cx, cy, (rx + 2*xn) / 3, (ry + 2*yn) / 3, (2*xn + cx) / 3, (2*yn + cy) / 3));
- xn = 2*cx - xn;
- yn = 2*cy - yn;
- xx1 = yy1 = void 0;
- } else if (dii === "H" || dii === "h") {
- tnl.appendItem(tcll(cx, ry));
- cy = ry; //勝手にti.yが0としているため
- } else if (dii === "V" || dii === "v") {
- tnl.appendItem(tcll(rx, cy));
- cx = rx;
- }
- }
- }
- }
- evt = tar = taco = cx = cy = xn = yn = startx = starty = tnl = tlist = ti = dii = ts = isZ = isM = isL = isC = s = tcc = tcll = void 0;
-};
-_sproto._nodeInsert = function(evt){
- var tar = evt.target;
- if (evt.eventPhase === /*Event.BUBBLING_PHASE*/ 3) {
- return; //強制終了させる
- }
- var tnext = tar.nextSibling,
- tpart = tar.parentNode._tar,
- isLast = true;
- if (tnext && tnext._tar && tpart && (tnext._tar.parentNode === tpart)) {
- tpart.insertBefore(tar._tar, tnext._tar);
- } else if (tnext && !tnext._tar && tpart) {
- /*以下の処理は、_tarプロパティがない要素オブジェクトがあるため、それに対処するもの
- *use要素や実体参照などは_tarプロパティがないことに注意
- */
- while (tnext) {
- if (tnext._tar && (tnext._tar.parentNode === tpart)) {
- tpart.insertBefore(tar._tar, tnext._tar);
- isLast = false;
- }
- tnext = tnext.nextSibling;
- }
- if (isLast) {
- tpart.appendChild(tar._tar);
- }
- } else if (!tnext && tpart) {
- tpart.appendChild(tar._tar);
- }
- tnext = tpart = isLast = void 0;
- tar.addEventListener("DOMNodeInsertedIntoDocument", tar._nodeInsertInto, false);
- evt = tar = void 0;
-};
-_sproto._nodeInsertInto = function(evt){
- /*以下の処理は、normalizedpathSegListとCTMに基づいて、
- *SVGのd属性をVMLに変換していく処理である。
- */
- var tar = evt.target,
- matrix = tar.getScreenCTM(),
- tlist = tar.normalizedPathSegList,
- dat = [],
- ma = matrix.a, mb = matrix.b, mc = matrix.c, md = matrix.d, me = matrix.e, mf = matrix.f,
- cname = tar._com._nameCom,
- isZ = tar._com._isZ, isC = tar._com._isC,
- mr = _math.round;
- for (var i=0, tli=tlist.numberOfItems;i<tli;++i) {
- var ti = tlist[i],
- tx = ti.x,
- ty = ti.y,
- tps = ti.pathSegTypeAsLetter,
- t = cname[tps];
- if (isC[tps]) {
- /*CTM(mx)の行列と座標(x, y)の積を算出する。数学における表現は以下のとおり
- *[ma mc me] [x]
- *[mb md mf] * [y]
- *[0 0 1 ] [1]
- */
- t += [mr(ma*ti.x1 + mc*ti.y1 + me),
- mr(mb*ti.x1 + md*ti.y1 + mf),
- mr(ma*ti.x2 + mc*ti.y2 + me),
- mr(mb*ti.x2 + md*ti.y2 + mf),
- mr(ma*tx + mc*ty + me),
- mr(mb*tx + md*ty + mf)].join(" ");
- } else if (!isZ[tps]) {
- t += mr(ma*tx + mc*ty + me)+ " " +mr(mb*tx + md*ty + mf);
- }
- dat[i] = t;
- }
- var vi = tar.ownerDocument.documentElement,
- tt = tar._tar;
- dat.push(" e");
- tt.path = dat.join(" ");
- tt.coordsize = vi.width.baseVal.value + " " + vi.height.baseVal.value;
- NAIBU._setPaint(tar, matrix);
- delete tar._cacheMatrix;
- evt = tar = dat = t = tx = ty = matrix = tlist = x = y = mr = ma = mb = mc = md = me = mf = vi = isZ = isC = i = tli = tps = ti = cname = tt = void 0;
-};
-_sproto._com = {
- _nameCom : {
- z : " x ",
- Z : " x ",
- C : "c",
- L : "l",
- M : "m"
- },
- _isZ : {
- z : 1,
- Z : 1
- },
- _isC : {
- C : 1
- },
- _isL : {
- L : 1
- },
- _isM : {
- M : 1
- },
- isRa : /\-/g,
- isRb : /,/g,
- isRc : /([a-yA-Y])/g,
- isRd : /([zZ])/g,
- isRe : /,/,
- isSp : /\S+/g
-};
- /*float*/ _sproto.getTotalLength = function() {
- var s = 0,
- nl = this.normalizedPathSegList;
- for (var i=1,nln=nl.numberOfItems,ms=null;i<nln;++i) {
- var seg = nl.getItem(i);
- if (seg.pathSegType === /*SVGPathSeg.PATHSEG_LINETO_ABS*/ 4) {
- var ps = nl.getItem(i-1);
- s += _math.sqrt(_math.pow((seg.x-ps.x), 2) + _math.pow((seg.y-ps.y), 2));
- } else if (seg.pathSegType === /*SVGPathSeg.PATHSEG_CURVETO_CUBIC_ABS*/ 6) {
- } else if (seg.pathSegType === /*SVGPathSeg.PATHSEG_CLOSEPATH*/ 1) {
- var ps = nl.getItem(i-1), ms = nl.getItem(0);
- s += _math.sqrt(_math.pow((ps.x-ms.x), 2) + _math.pow((ps.y-ms.y), 2));
- }
-
- }
- this.pathLength.baseVal = s;
- return s;
- };
- /*SVGPoint*/ _sproto.getPointAtLength = function(/*float*/ distance ) {
- var segn = this.getPathSegAtLength(distance),
- x = 0,
- y = 0,
- nl = this.normalizedPathSegList,
- seg = nl.getItem(segn),
- s = this.ownerDocument.documentElement.createSVGPoint();
- if ((segn-1) <= 0) {
- s.x = seg.x;
- s.y = seg.y;
- return s;
- }
- var ps = nl.getItem(segn-1);
- if (seg.pathSegType === /*SVGPathSeg.PATHSEG_LINETO_ABS*/ 4) {
- var segl = _math.sqrt(_math.pow((seg.x-ps.x), 2) + _math.pow((seg.y-ps.y), 2));
- var t = (segl + this._dis) / segl;
- s.x = ps.x + t * (seg.x-ps.x);
- s.y = ps.y + t * (seg.y-ps.y);
- } else if (seg.pathSegType === /*VGPathSeg.PATHSEG_CURVETO_CUBIC_ABS*/ 6) {
- var dd = 0;
- dd += _math.sqrt(_math.pow((seg.x1-ps.x), 2) + _math.pow((seg.y1-ps.y), 2));
- dd += _math.sqrt(_math.pow((seg.x2-seg.x1), 2) + _math.pow((seg.y2-seg.y1), 2));
- dd += _math.sqrt(_math.pow((seg.x2-seg.x1), 2) + _math.pow((seg.y2-seg.y1), 2));
- dd += _math.sqrt(_math.pow((seg.x-ps.x), 2) + _math.pow((seg.y-ps.y), 2));
- var segl = dd / 2;
- var t = (segl + this._dis) / segl;
- /*以下はベジェ曲線の公式について、パラメータtによってまとめて整理したものを、
- *使って、ポイントの座標を演算する
- */
- s.x = (3*seg.x1 + seg.x - 3*seg.x2 - ps.x) * _math.pow(t, 3)
- +3*(ps.x - 2*seg.x1 + seg.x2) * _math.pow(t, 2)
- +3*(seg.x1 - ps.x) * t
- +ps.x;
- s.y = (3*seg.y1 + seg.y - 3*seg.y2 - ps.y) * _math.pow(t, 3)
- +3*(ps.y - 2*seg.y1 + seg.y2) * _math.pow(t, 2)
- +3*(seg.y1 - ps.y) * t
- +ps.y;
- } else if (seg.pathSegType === /*SVGPathSeg.MOVETO_ABS*/ 2) {
- s.x = seg.x;
- s.y = seg.y;
- } else if (seg.pathSegType === /*SVGPathSeg.PATHSEG_CLOSEPATH*/ 1) {
- var ms = nl.getItem(0), segl = _math.sqrt(_math.pow((seg.x-mx.x), 2) + _math.pow((seg.y-ms.y), 2));
- var t = (segl + this._dis) / segl;
- s.x = ms.x + t * (seg.x-ms.x);
- s.y = ms.y + t * (seg.y-ms.y);
- }
- return s;
- };
- /*unsigned long*/ _sproto.getPathSegAtLength = function(/*float*/ distance ) {
- var nl = this.normalizedPathSegList; //仕様ではpathSegList
- for (var i=0,nln=nl.numberOfItems,ms=null;i<nln;++i) {
- var seg = nl.getItem(i);
- if (seg.pathSegType === /*SVGPathSeg.PATHSEG_LINETO_ABS*/ 4) {
- var ps = nl.getItem(i-1);
- distance -= _math.sqrt(_math.pow((seg.x-ps.x), 2) + _math.pow((seg.y-ps.y), 2));
- } else if (seg.pathSegType === /*SVGPathSeg.PATHSEG_CURVETO_CUBIC_ABS*/ 6) {
- } else if (seg.pathSegType === /*SVGPathSeg.PATHSEG_CLOSEPATH*/ 1) {
- var ps = nl.getItem(i-1), ms = nl.getItem(0);
- distance -= _math.sqrt(_math.pow((ps.x-ms.x), 2) + _math.pow((ps.y-ms.y), 2));
- }
- if (distance <= 0) {
- /*_disプロパティは前述のgetPointAtLengthメソッドで使う*/
- this._dis = distance;
- distance = void 0;
- return i;
- }
- }
- /*もし、distanceがパスの距離よりも長い場合、
- *最後のセグメントの番号を返す
- *なお、これはSVG1.1の仕様の想定外のこと
- */
- return (nl.numberOfItems - 1);
- };
- /*SVGPathSegClosePath*/ _sproto.createSVGPathSegClosePath = function() {
- var _SVGPathSegClosePath = SVGPathSegClosePath;
- return (new _SVGPathSegClosePath());
- };
- /*SVGPathSegMovetoAbs*/ _sproto.createSVGPathSegMovetoAbs = function(/*float*/ x, /*float*/ y ) {
- var _SVGPathSegMovetoAbs = SVGPathSegMovetoAbs, s = new _SVGPathSegMovetoAbs();
- s.x = x;
- s.y = y;
- return s;
- };
- /*SVGPathSegMovetoRel*/ _sproto.createSVGPathSegMovetoRel = function(/*float*/ x, /*float*/ y ) {
- var s = new SVGPathSegMovetoRel();
- s.x = x;
- s.y = y;
- return s;
- };
- /*SVGPathSegLinetoAbs*/ _sproto.createSVGPathSegLinetoAbs = function(/*float*/ x, /*float*/ y ) {
- var s = new SVGPathSegLinetoAbs();
- s.x = x;
- s.y = y;
- return s;
- };
- /*SVGPathSegLinetoRel*/ _sproto.createSVGPathSegLinetoRel = function(/*float*/ x, /*float*/ y ) {
- var s = new SVGPathSegLinetoRel();
- s.x = x;
- s.y = y;
- return s;
- };
- /*SVGPathSegCurvetoCubicAbs*/ _sproto.createSVGPathSegCurvetoCubicAbs = function(/*float*/ x, /*float*/ y, /*float*/ x1, /*float*/ y1, /*float*/ x2, /*float*/ y2 ) {
- var _SVGPathSegCurvetoCubicAbs = SVGPathSegCurvetoCubicAbs, s = new _SVGPathSegCurvetoCubicAbs();
- s.x = x;
- s.y = y;
- s.x1 = x1;
- s.y1 = y1;
- s.x2 = x2;
- s.y2 = y2;
- return s;
- };
- /*SVGPathSegCurvetoCubicRel*/ _sproto.createSVGPathSegCurvetoCubicRel = function(/*float*/ x, /*float*/ y, /*float*/ x1, /*float*/ y1, /*float*/ x2, /*float*/ y2 ) {
- var s = new SVGPathSegCurvetoCubicRel();
- s.x = x;
- s.y = y;
- s.x1 = x1;
- s.y1 = y1;
- s.x2 = x2;
- s.y2 = y2;
- return s;
- };
- /*SVGPathSegCurvetoQuadraticAbs*/ _sproto.createSVGPathSegCurvetoQuadraticAbs = function(/*float*/ x, /*float*/ y, /*float*/ x1, /*float*/ y1 ) {
- var s = new SVGPathSegCurvetoQuadraticAbs();
- s.x = x;
- s.y = y;
- s.x1 = x1;
- s.y1 = y1;
- return s;
- };
- /*SVGPathSegCurvetoQuadraticRel*/ _sproto.createSVGPathSegCurvetoQuadraticRel = function(/*float*/ x, /*float*/ y, /*float*/ x1, /*float*/ y1 ) {
- var s = new SVGPathSegCurvetoQuadraticRel();
- s.x = x;
- s.y = y;
- s.x1 = x1;
- s.y1 = y1;
- return s;
- };
- /*SVGPathSegArcAbs*/ _sproto.createSVGPathSegArcAbs = function(/*float*/ x, /*float*/ y, /*float*/ r1, /*float*/ r2, /*float*/ angle, /*boolean*/ largeArcFlag, /*boolean*/ sweepFlag ) {
- var s = new SVGPathSegArcAbs();
- s.x = x;
- s.y = y;
- s.r1 = r1;
- s.r2 = r2;
- s.angle = angle;
- s.largeArcFlag = largeArcFlag;
- s.sweepFlag = sweepFlag;
- return s;
- };
- /*SVGPathSegArcRel*/ _sproto.createSVGPathSegArcRel = function(/*float*/ x, /*float*/ y, /*float*/ r1, /*float*/ r2, /*float*/ angle, /*boolean*/ largeArcFlag, /*boolean*/ sweepFlag ) {
- var s = new SVGPathSegArcRel();
- s.x = x;
- s.y = y;
- s.r1 = r1;
- s.r2 = r2;
- s.angle = angle;
- s.largeArcFlag = largeArcFlag;
- s.sweepFlag = sweepFlag;
- return s;
- };
- /*SVGPathSegLinetoHorizontalAbs*/ _sproto.createSVGPathSegLinetoHorizontalAbs = function(/*float*/ x ) {
- var s = new SVGPathSegLinetoHorizontalAbs();
- s.x = x;
- s.y = 0; //DOMでは指定されていないが、変換処理が楽なので用いる
- return s;
- };
- /*SVGPathSegLinetoHorizontalRel*/ _sproto.createSVGPathSegLinetoHorizontalRel = function(/*float*/ x ) {
- var s = new SVGPathSegLinetoHorizontalRel();
- s.x = x;
- s.y = 0;
- return s;
- };
- /*SVGPathSegLinetoVerticalAbs*/ _sproto.createSVGPathSegLinetoVerticalAbs = function(/*float*/ y ) {
- var s = new SVGPathSegLinetoVerticalAbs();
- s.x = 0;
- s.y = y;
- return s;
- };
- /*SVGPathSegLinetoVerticalRel*/ _sproto.createSVGPathSegLinetoVerticalRel = function(/*float*/ y ) {
- var s = new SVGPathSegLinetoVerticalRel();
- s.x = 0;
- s.y = y;
- return s;
- };
- /*SVGPathSegCurvetoCubicSmoothAbs*/ _sproto.createSVGPathSegCurvetoCubicSmoothAbs = function(/*float*/ x, /*float*/ y, /*float*/ x2, /*float*/ y2 ) {
- var s = new SVGPathSegCurvetoCubicSmoothAbs();
- s.x = x;
- s.y = y;
- s.x2 = x2;
- s.y2 = y2;
- return s;
- };
- /*SVGPathSegCurvetoCubicSmoothRel*/ _sproto.createSVGPathSegCurvetoCubicSmoothRel = function(/*float*/ x, /*float*/ y, /*float*/ x2, /*float*/ y2 ) {
- var s = new SVGPathSegCurvetoCubicSmoothRel();
- s.x = x;
- s.y = y;
- s.x2 = x2;
- s.y2 = y2;
- return s;
- };
- /*SVGPathSegCurvetoQuadraticSmoothAbs*/ _sproto.createSVGPathSegCurvetoQuadraticSmoothAbs = function(/*float*/ x, /*float*/ y ) {
- var s = new SVGPathSegCurvetoQuadraticSmoothAbs();
- s.x = x;
- s.y = y;
- return s;
- };
- /*SVGPathSegCurvetoQuadraticSmoothRel*/ _sproto.createSVGPathSegCurvetoQuadraticSmoothRel = function(/*float*/ x, /*float*/ y ) {
- var s = new SVGPathSegCurvetoQuadraticSmoothRel();
- s.x = x;
- s.y = y;
- return s;
- };
-})(SVGPathElement.prototype)
- NAIBU.SVGPathElement = SVGPathElement; //IE8では、SVGPathElementはローカル変数
-})(document, Math);
-
-function SVGRectElement(_doc) {
- SVGElement.apply(this);
- this._tar = _doc.createElement("v:shape");
- var slen = SVGAnimatedLength;
- /*readonly SVGAnimatedLength*/ this.x = new slen();
- /*readonly SVGAnimatedLength*/ this.y = new slen();
- /*readonly SVGAnimatedLength*/ this.width = new slen();
- /*readonly SVGAnimatedLength*/ this.height = new slen();
- /*readonly SVGAnimatedLength*/ this.rx = new slen();
- /*readonly SVGAnimatedLength*/ this.ry = new slen();
- _doc = slen = void 0;
- this.addEventListener("DOMNodeInserted", function(evt){
- if (evt.eventPhase === /*Event.BUBBLING_PHASE*/ 3) {
- return; //強制終了させる
- }
- var tar = evt.target,
- tnext = tar.nextSibling,
- tpart = tar.parentNode._tar,
- isLast = true;
- if (tnext && tnext._tar && tpart && (tnext._tar.parentNode === tpart)) {
- tpart.insertBefore(tar._tar, tnext._tar);
- } else if (tnext && !tnext._tar && tpart) {
- /*以下の処理は、_tarプロパティがない要素オブジェクトがあるため、それに対処するもの
- *use要素や実体参照などは_tarプロパティがないことに注意
- */
- while (tnext) {
- if (tnext._tar && (tnext._tar.parentNode === tpart)) {
- tpart.insertBefore(tar._tar, tnext._tar);
- isLast = false;
- }
- tnext = tnext.nextSibling;
- }
- if (isLast) {
- tpart.appendChild(tar._tar);
- }
- } else if (!tnext && tpart) {
- tpart.appendChild(tar._tar);
- }
- tnext = tpart = isLast = void 0;
- tar.addEventListener("DOMNodeInsertedIntoDocument", function(evt) {
- var tar = evt.target,
- style = tar.ownerDocument.defaultView.getComputedStyle(tar, ""),
- fontSize = parseFloat(style.getPropertyValue("font-size"));
- tar.x.baseVal._emToUnit(fontSize);
- tar.y.baseVal._emToUnit(fontSize);
- tar.width.baseVal._emToUnit(fontSize);
- tar.height.baseVal._emToUnit(fontSize);
- var rx = tar.getAttributeNS(null, "rx"),
- ry = tar.getAttributeNS(null, "ry"),
- x = tar.x.baseVal.value,
- y = tar.y.baseVal.value,
- xw = x + tar.width.baseVal.value,
- yh = y + tar.height.baseVal.value,
- list;
- if ((rx || ry) && (rx !== "0") && (ry !== "0")) {
- tar.rx.baseVal._emToUnit(fontSize);
- tar.ry.baseVal._emToUnit(fontSize);
- var thrx = tar.rx.baseVal,
- thry = tar.ry.baseVal,
- twidth = tar.width.baseVal.value,
- theight = tar.height.baseVal.value;
- thrx.value = rx ? thrx.value : thry.value;
- thry.value = ry ? thry.value : thrx.value;
- //rx属性が幅より大きければ、幅の半分を属性に設定(ry属性は高さと比較する)
- if (thrx.value > twidth / 2) {
- thrx.value = twidth / 2;
- }
- if (thry.value > theight / 2) {
- thry.value = theight / 2;
- }
- var rxv = thrx.value,
- ryv = thry.value,
- rrx = rxv * 0.55228,
- rry = ryv * 0.55228,
- a = xw - rxv,
- b = x + rxv,
- c = y + ryv,
- d = yh - ryv;
- list = ["m",b,y, "l",a,y, "c",a+rrx,y,xw,c-rry,xw,c, "l",xw,d, "c",xw,d+rry,a+rrx,yh,a,yh, "l",b,yh, "c",b-rrx,yh,x,d+rry,x,d, "l",x,c, "c",x,c-rry,b-rrx,y,b,y];
- } else {
- list = ["m",x,y, "l",x,yh, xw,yh, xw,y, "x e"];
- }
- //以下は、配列listそのものをCTMで座標変換していく処理
- var par = tar.ownerDocument.documentElement,
- ctm = tar.getScreenCTM(),
- dat, p, pmt,
- ele = tar._tar,
- vi = tar.ownerDocument.documentElement,
- w = vi.width.baseVal.value,
- h = vi.height.baseVal.value,
- mr = Math.round;
- for (var i=0, lili=list.length;i<lili;) {
- if (isNaN(list[i])) { //コマンド文字は読み飛ばす
- ++i;
- continue;
- }
- p = par.createSVGPoint();
- p.x = list[i];
- p.y = list[i+1];
- pmt = p.matrixTransform(ctm);
- list[i] = mr(pmt.x);
- ++i;
- list[i] = mr(pmt.y);
- ++i;
- p = pmt = void 0;
- }
- dat = list.join(" ");
- //VMLに結び付けていく
- ele.path = dat;
- ele.coordsize = w + " " + h;
- NAIBU._setPaint(tar, ctm);
- delete tar._cacheMatrix;
- evt = tar = style = list = mr = dat = ele = vi = fontSize = void 0;
- }, false);
- evt = tar = void 0;
- }, false);
- return this;
-};
-SVGRectElement.prototype = Object._create(SVGElement);
-
-function SVGCircleElement(_doc) {
- SVGElement.apply(this);
- this._tar = _doc.createElement("v:shape");
- var sl = SVGAnimatedLength;
- /*readonly SVGAnimatedLength*/ this.cx = new sl();
- /*readonly SVGAnimatedLength*/ this.cy = new sl();
- /*readonly SVGAnimatedLength*/ this.r = new sl();
- _doc = sl = void 0;
- this.addEventListener("DOMNodeInserted", function(evt){
- var tar = evt.target;
- if (evt.eventPhase === /*Event.BUBBLING_PHASE*/ 3) {
- return; //強制終了させる
- }
- var tnext = tar.nextSibling,
- tpart = tar.parentNode._tar,
- isLast = true;
- if (tnext && tnext._tar && tpart && (tnext._tar.parentNode === tpart)) {
- tpart.insertBefore(tar._tar, tnext._tar);
- } else if (tnext && !tnext._tar && tpart) {
- /*以下の処理は、_tarプロパティがない要素オブジェクトがあるため、それに対処するもの
- *use要素や実体参照などは_tarプロパティがないことに注意
- */
- while (tnext) {
- if (tnext._tar && (tnext._tar.parentNode === tpart)) {
- tpart.insertBefore(tar._tar, tnext._tar);
- isLast = false;
- }
- tnext = tnext.nextSibling;
- }
- if (isLast) {
- tpart.appendChild(tar._tar);
- }
- } else if (!tnext && tpart) {
- tpart.appendChild(tar._tar);
- }
- tnext = tpart = isLast = void 0;
- tar.addEventListener("DOMNodeInsertedIntoDocument", function(evt) {
- var tar = evt.target,
- style = tar.ownerDocument.defaultView.getComputedStyle(tar, ""),
- fontSize = parseFloat(style.getPropertyValue("font-size"));
- tar.cx.baseVal._emToUnit(fontSize);
- tar.cy.baseVal._emToUnit(fontSize);
- tar.r.baseVal._emToUnit(fontSize);
- var cx = tar.cx.baseVal.value,
- cy = tar.cy.baseVal.value,
- rx = ry = tar.r.baseVal.value,
- top = cy - ry,
- left = cx - rx,
- bottom = cy + ry,
- right = cx + rx,
- rrx = rx * 0.55228,
- rry = ry * 0.55228,
- list = ["m", cx,top, "c", cx-rrx,top, left,cy-rry, left,cy, left,cy+rry, cx-rrx,bottom, cx,bottom, cx+rrx,bottom, right,cy+rry, right,cy, right,cy-rry, cx+rrx,top, cx,top, "x e"];
- //以下は、配列listそのものをCTMで座標変換していく処理
- var par = tar.ownerDocument.documentElement,
- ctm = tar.getScreenCTM(),
- mr = Math.round;
- for (var i=0, lili=list.length;i<lili;) {
- if (isNaN(list[i])) { //コマンド文字は読み飛ばす
- ++i;
- continue;
- }
- var p = par.createSVGPoint();
- p.x = list[i];
- p.y = list[i+1];
- var pmt = p.matrixTransform(ctm);
- list[i] = mr(pmt.x);
- ++i;
- list[i] = mr(pmt.y);
- ++i;
- p = pmt = void 0;
- }
- var dat = list.join(" "),
- ele = tar._tar,
- vi = tar.ownerDocument.documentElement,
- w = vi.width.baseVal.value,
- h = vi.height.baseVal.value;
- //VMLに結び付けていく
- ele.path = dat;
- ele.coordsize = w + " " + h;
- NAIBU._setPaint(tar, ctm);
- delete tar._cacheMatrix;
- evt = tar = list = mr = style = fontSize = dat = ele = void 0;
- }, false);
- evt = tar = void 0;
- }, false);
- return this;
-};
-SVGCircleElement.prototype = Object._create(SVGElement);
-
-function SVGEllipseElement(_doc) {
- SVGElement.apply(this);
- this._tar = _doc.createElement("v:shape");
- var sl = SVGAnimatedLength;
- /*readonly SVGAnimatedLength*/ this.cx = new sl();
- /*readonly SVGAnimatedLength*/ this.cy = new sl();
- /*readonly SVGAnimatedLength*/ this.rx = new sl();
- /*readonly SVGAnimatedLength*/ this.ry = new sl();
- _doc = sl = void 0;
- this.addEventListener("DOMNodeInserted", function(evt){
- var tar = evt.target;
- if (evt.eventPhase === /*Event.BUBBLING_PHASE*/ 3) {
- return; //強制終了させる
- }
- var tnext = tar.nextSibling,
- tpart = tar.parentNode._tar,
- isLast = true;
- if (tnext && tnext._tar && tpart && (tnext._tar.parentNode === tpart)) {
- tpart.insertBefore(tar._tar, tnext._tar);
- } else if (tnext && !tnext._tar && tpart) {
- /*以下の処理は、_tarプロパティがない要素オブジェクトがあるため、それに対処するもの
- *use要素や実体参照などは_tarプロパティがないことに注意
- */
- while (tnext) {
- if (tnext._tar && (tnext._tar.parentNode === tpart)) {
- tpart.insertBefore(tar._tar, tnext._tar);
- isLast = false;
- }
- tnext = tnext.nextSibling;
- }
- if (isLast) {
- tpart.appendChild(tar._tar);
- }
- } else if (!tnext && tpart) {
- tpart.appendChild(tar._tar);
- }
- tnext = tpart = isLast = void 0;
- tar.addEventListener("DOMNodeInsertedIntoDocument", function(evt) {
- var tar = evt.target,
- style = tar.ownerDocument.defaultView.getComputedStyle(tar, ""),
- fontSize = parseFloat(style.getPropertyValue("font-size"));
- tar.cx.baseVal._emToUnit(fontSize);
- tar.cy.baseVal._emToUnit(fontSize);
- tar.rx.baseVal._emToUnit(fontSize);
- tar.ry.baseVal._emToUnit(fontSize);
- var cx = tar.cx.baseVal.value,
- cy = tar.cy.baseVal.value,
- rx = tar.rx.baseVal.value,
- ry = tar.ry.baseVal.value,
- top = cy - ry,
- left = cx - rx,
- bottom = cy + ry,
- right = cx + rx,
- rrx = rx * 0.55228,
- rry = ry * 0.55228,
- list = ["m", cx,top, "c", cx-rrx,top, left,cy-rry, left,cy, left,cy+rry, cx-rrx,bottom, cx,bottom, cx+rrx,bottom, right,cy+rry, right,cy, right,cy-rry, cx+rrx,top, cx,top, "x e"];
- //以下は、配列listそのものをCTMで座標変換していく処理
- var par = tar.ownerDocument.documentElement,
- ctm = tar.getScreenCTM(),
- mr = Math.round;
- for (var i=0, lili=list.length;i<lili;) {
- if (isNaN(list[i])) { //コマンド文字は読み飛ばす
- ++i;
- continue;
- }
- var p = par.createSVGPoint();
- p.x = list[i];
- p.y = list[i+1];
- var pmt = p.matrixTransform(ctm);
- list[i] = mr(pmt.x);
- ++i;
- list[i] = mr(pmt.y);
- ++i;
- p = pmt = void 0;
- }
- var dat = list.join(" "),
- ele = tar._tar,
- vi = tar.ownerDocument.documentElement,
- w = vi.width.baseVal.value,
- h = vi.height.baseVal.value;
- //VMLに結び付けていく
- ele.path = dat;
- ele.coordsize = w + " " + h;
- NAIBU._setPaint(tar, ctm);
- delete tar._cacheMatrix;
- evt = ele = tar = style = fontSize = dat = list = mr = ctm = w = h = void 0;
- }, false);
- evt = tar = void 0;
- }, false);
- return this;
-};
-SVGEllipseElement.prototype = Object._create(SVGElement);
-
-function SVGLineElement(_doc) {
- SVGElement.apply(this);
- this._tar = _doc.createElement("v:shape");
- var sl = SVGAnimatedLength;
- /*readonly SVGAnimatedLength*/ this.x1 = new sl();
- /*readonly SVGAnimatedLength*/ this.y1 = new sl();
- /*readonly SVGAnimatedLength*/ this.x2 = new sl();
- /*readonly SVGAnimatedLength*/ this.y2 = new sl();
- _doc = sl = void 0;
- this.addEventListener("DOMNodeInserted", function(evt){
- var tar = evt.target;
- if (evt.eventPhase === /*Event.BUBBLING_PHASE*/ 3) {
- return; //強制終了させる
- }
- var tnext = tar.nextSibling,
- tpart = tar.parentNode._tar,
- isLast = true;
- if (tnext && tnext._tar && tpart && (tnext._tar.parentNode === tpart)) {
- tpart.insertBefore(tar._tar, tnext._tar);
- } else if (tnext && !tnext._tar && tpart) {
- /*以下の処理は、_tarプロパティがない要素オブジェクトがあるため、それに対処するもの
- *use要素や実体参照などは_tarプロパティがないことに注意
- */
- while (tnext) {
- if (tnext._tar && (tnext._tar.parentNode === tpart)) {
- tpart.insertBefore(tar._tar, tnext._tar);
- isLast = false;
- }
- tnext = tnext.nextSibling;
- }
- if (isLast) {
- tpart.appendChild(tar._tar);
- }
- } else if (!tnext && tpart) {
- tpart.appendChild(tar._tar);
- }
- tnext = tpart = isLast = void 0;
- tar.addEventListener("DOMNodeInsertedIntoDocument", function(evt) {
- var tar = evt.target,
- style = tar.ownerDocument.defaultView.getComputedStyle(tar, ""),
- fontSize = parseFloat(style.getPropertyValue("font-size"));
- tar.x1.baseVal._emToUnit(fontSize);
- tar.y1.baseVal._emToUnit(fontSize);
- tar.x2.baseVal._emToUnit(fontSize);
- tar.y2.baseVal._emToUnit(fontSize);
- //以下は、配列listそのものをCTMで座標変換していく処理
- var vi = tar.ownerDocument.documentElement,
- ctm = tar.getScreenCTM(),
- dat = "m ",
- mr = Math.round,
- p = vi.createSVGPoint();
- p.x = tar.x1.baseVal.value;
- p.y = tar.y1.baseVal.value;
- var pmt = p.matrixTransform(ctm);
- dat += mr(pmt.x)+ " " +mr(pmt.y)+ " l ";
- p.x = tar.x2.baseVal.value;
- p.y = tar.y2.baseVal.value;
- pmt = p.matrixTransform(ctm);
- dat += mr(pmt.x)+ " " +mr(pmt.y);
- p = pmt = void 0;
- //VMLに結び付けていく
- var ele = tar._tar,
- w = vi.width.baseVal.value,
- h = vi.height.baseVal.value;
- ele.path = dat;
- ele.coordsize = w + " " + h;
- NAIBU._setPaint(tar, ctm);
- delete tar._cacheMatrix;
- evt = ele = tar = style = fontSize = dat = list = mr = ctm = vi = w = h = void 0;
- }, false);
- evt = tar = void 0;
- }, false);
- return this;
-};
-SVGLineElement.prototype = Object._create(SVGElement);
-
-/*_GenericSVGPolyElementインターフェース
- * このインターフェースはpolygonとpolyline要素共通のインターフェースとして使用。
- * ファイルサイズを軽量にすることができる
- */
-NAIBU._GenericSVGPolyElement = function (_doc, xclose) {
- SVGElement.apply(this);
- this._tar = _doc.createElement("v:shape");
- _doc = void 0;
- //interface SVGAnimatedPoints
- /*readonly SVGPointList*/ this.animatedPoints = this.points = new SVGPointList();
- this.addEventListener("DOMAttrModified", function(evt){
- var tar = evt.target;
- if (evt.attrName === "points") {
- var tp = tar.points, par = tar.ownerDocument.documentElement;
- var list = evt.newValue.replace(/^\s+|\s+$/g, "").split(/[\s,]+/);
- for (var i=0, p, lili=list.length;i<lili;i+=2) {
- if (isNaN(list[i])) {
- --i;
- continue;
- }
- p = par.createSVGPoint();
- p.x = parseFloat(list[i]);
- p.y = parseFloat(list[i+1]);
- tp.appendItem(p);
- }
- }
- evt = tar = list = tp = par = p = void 0;
- }, false);
- this.addEventListener("DOMNodeInserted", function(evt){
- var tar = evt.target;
- if (evt.eventPhase === /*Event.BUBBLING_PHASE*/ 3) {
- return; //強制終了させる
- }
- var tnext = tar.nextSibling,
- tpart = tar.parentNode._tar,
- isLast = true;
- if (tnext && tnext._tar && tpart && (tnext._tar.parentNode === tpart)) {
- tpart.insertBefore(tar._tar, tnext._tar);
- } else if (tnext && !tnext._tar && tpart) {
- /*以下の処理は、_tarプロパティがない要素オブジェクトがあるため、それに対処するもの
- *use要素や実体参照などは_tarプロパティがないことに注意
- */
- while (tnext) {
- if (tnext._tar && (tnext._tar.parentNode === tpart)) {
- tpart.insertBefore(tar._tar, tnext._tar);
- isLast = false;
- }
- tnext = tnext.nextSibling;
- }
- if (isLast) {
- tpart.appendChild(tar._tar);
- }
- } else if (!tnext && tpart) {
- tpart.appendChild(tar._tar);
- }
- tnext = tpart = isLast = void 0;
- tar.addEventListener("DOMNodeInsertedIntoDocument", function(evt) {
- var tar = evt.target,
- tp = tar.points,
- ctm = tar.getScreenCTM(),
- mr = Math.round;
- //以下は、配列listそのものをCTMで座標変換していく処理
- for (var i=0, list = [], lili=tp.numberOfItems;i<lili;++i) {
- var p = tp.getItem(i),
- pmt = p.matrixTransform(ctm);
- list[2*i] = mr(pmt.x);
- list[2*i + 1] = mr(pmt.y);
- p = pmt = void 0;
- }
- list.splice(2, 0, "l");
- var dat = "m" + list.join(" ") + xclose,
- ele = tar._tar,
- vi = tar.ownerDocument.documentElement;
- w = vi.width.baseVal.value,
- h = vi.height.baseVal.value;
- //VMLに結び付けていく
- ele.path = dat;
- ele.coordsize = w + " " + h;
- NAIBU._setPaint(tar, ctm);
- delete tar._cacheMatrix;
- evt = ele = tar = dat = list = mr = ctm = w = h = vi = void 0;
- }, false);
- evt = tar = void 0;
- }, false);
- return this;
-}
-function SVGPolylineElement(_doc) {
- NAIBU._GenericSVGPolyElement.call(this, _doc, "e");
- _doc = void 0;
- return this;
-};
-SVGPolylineElement.prototype = Object._create(SVGElement);
-
-function SVGPolygonElement(_doc) {
- NAIBU._GenericSVGPolyElement.call(this, _doc, "x e");
- _doc = void 0;
- return this;
-};
-SVGPolygonElement.prototype = Object._create(SVGElement);
-
-function SVGTextContentElement(_doc) {
- SVGElement.apply(this);
- /*readonly SVGAnimatedLength*/ this.textLength = new SVGAnimatedLength();
- /*readonly SVGAnimatedEnumeration*/ this.lengthAdjust = new SVGAnimatedEnumeration(/*SVGTextContentElement.LENGTHADJUST_UNKNOWN*/ 0);
- this.addEventListener("DOMNodeInserted", function(evt){
- var tar = evt.target,
- cur = evt.currentTarget,
- eph = evt.eventPhase;
- /*Bubblingフェーズの時にはもう、div要素をDOMツリーに挿入しておく必要があるため、
- *あらかじめ、Capturingフェーズで処理しておく
- */
- if ((eph === /*Event.CAPTURING_PHASE*/ 1) && (tar.localName === "a") && (tar.namespaceURI === "http://www.w3.org/2000/svg") && tar.firstChild) {
- /*a要素の場合はtarをすりかえておく*/
- tar = tar.firstChild;
- }
- if ((eph === /*Event.CAPTURING_PHASE*/ 1) && (tar.nodeType === /*Node.TEXT_NODE*/ 3) && !!!tar._tars) {
- /*Textノードにdiv要素を格納したリストをプロパティとして蓄えておく*/
- tar._tars = [];
- var data = tar.data.replace(/^\s+/, "").replace(/\s+$/, "");
- tar.data = data;
- tar.length = data.length
- data = data.split('');
- for (var i=0, tdli=data.length;i<tdli;++i) {
- var d = _doc.createElement("div"),
- dstyle = d.style;
- dstyle.position = "absolute";
- dstyle.textIndent = dstyle.marginLeft = dstyle.marginRight = dstyle.marginTop = dstyle.paddingTop = dstyle.paddingLeft = "0px";
- dstyle.whiteSpace = "nowrap";
- d.appendChild(_doc.createTextNode(data[i]));
- tar._tars[tar._tars.length] = d;
- }
- data = void 0;
- }
- evt = tar = cur = eph = void 0;
- }, true);
- this.addEventListener("DOMNodeRemoved", function(evt){
- var tar = evt.target;
- if (evt.eventPhase === /*Event.BUBBLING_PHASE*/ 3) {
- delete evt.currentTarget._length;
- tar = evt = void 0;
- }
- }, false);
- return this;
-};
-
-(function(t) {
-t.prototype = Object._create(SVGElement);
- // lengthAdjust Types
- /*unsigned short t.LENGTHADJUST_UNKNOWN = 0;
- /*unsigned short t.LENGTHADJUST_SPACING = 1;
- /*unsigned short t.LENGTHADJUST_SPACINGANDGLYPHS = 2;*/
- t.prototype._list = null; //文字の位置を格納しておくリストのキャッシュ
- t.prototype._length = null; //全文字数のキャッシュ
- t.prototype._stx = t.prototype._sty = 0; //初めの文字の位置
- t.prototype._chars = 0; //tspan (tref)要素が全体の何文字目から始まっているか
- t.prototype._isYokogaki = true; //横書きかどうか
-/*long*/ t.prototype.getNumberOfChars = function() {
- if (this._length) {
- return (this._length);
- } else {
- var s = 0,
- f = function (ts) {
- while (ts) {
- if (ts.length && (ts.nodeType === /*Node.TEXT_NODE*/ 3)) {
- s += ts.length;
- } else if (ts.getNumberOfChars) { //tspan要素などであれば
- s += ts.getNumberOfChars();
- } else if (ts.firstChild && (ts.nodeType === /*Node.ELEMENT_NODE*/ 1)) {
- f(ts.firstChild); //再帰的に呼び出す
- }
- ts = ts.nextSibling;
- }
- ts = void 0;
- };
- f(this.firstChild);
- this._length = s;
- return s;
- }
-};
-/*float*/ t.prototype.getComputedTextLength = function() {
- var l = this.textLength.baseVal;
- if ((l.value === 0) && (this.getNumberOfChars() > 0)) {
- /*何も設定されていない場合のみ、初期化を行う*/
- l.newValueSpecifiedUnits(/*SVGLength.SVG_LENGTHTYPE_NUMBER*/ 1, this.getSubStringLength(0, this.getNumberOfChars()));
- }
- l = void 0;
- return (this.textLength.baseVal.value);
-};
-/*getSubStringLengthメソッド
- *charnum番目の文字からnchars+charnum-1番目までの文字列の長さを求めて返す
- */
-/*float*/ t.prototype.getSubStringLength = function(/*unsigned long*/ charnum, /*unsigned long*/ nchars ) {
- if (nchars === 0) {
- return 0;
- }
- var tg = this.getNumberOfChars();
- if (tg < (nchars+charnum)) {
- /*ncharsが文字列の長さよりも長くなってしまったときには、
- *文字列の末端までの長さを求めるとする(SVG1.1の仕様より)
- */
- nchars = tg - charnum + 1;
- }
- var end = this.getEndPositionOfChar(nchars+charnum-1), st = this.getStartPositionOfChar(charnum);
- if (this._isYokogaki) {
- var s = end.x - st.x;
- } else {
- var s = end.y - st.y;
- }
- tg = end = st = void 0;
- return s;
-}
-/*SVGPoint*/ t.prototype.getStartPositionOfChar = function (/*unsigned long*/ charnum ) {
- if (charnum > this.getNumberOfChars() || charnum < 0) {
- throw (new DOMException(/*DOMException.INDEX_SIZE_ERR*/ 1));
- } else {
- var tar = this,
- ti = tar.firstChild,
- tp = tar.parentNode;
- if (!!!tar._list) {
- tar._list = [];
- var chars = tar._chars, //現在、何文字目にあるのか
- x = tar._stx, y = tar._sty, n = 0, //現在のテキスト位置と順番
- style = tar.ownerDocument.defaultView.getComputedStyle(tar, null),
- isYokogaki = ((style.getPropertyValue("writing-mode")) === "lr-tb") ? true : false,
- fontSize = parseFloat(style.getPropertyValue("font-size")),
- tx = tar.x.baseVal, ty = tar.y.baseVal, tdx = tar.dx.baseVal, tdy = tar.dy.baseVal;
- /*親要素の属性も参照しておく*/
- if (tp && ((tp.localName === "text") ||(tp.localName === "tspan"))) {
- var ptx = tp.x.baseVal,
- pty = tp.y.baseVal,
- ptdx = tp.dx.baseVal,
- ptdy = tp.dy.baseVal;
- } else {
- var ptx = pty = ptdx = ptdy = {numberOfItems : 0};
- }
- var kern = "f ijltIr.,:;'-\"()",
- akern = "1234567890abcdeghknopquvxyz",
- tt, alm, tdc, tcca, p, almx, almy, tlist, tg;
- if (isYokogaki && (tar.localName === "text")) {
- y += fontSize * 0.2;
- } else if (tar.localName === "text"){
- x -= fontSize * 0.5;
- }
- while (ti) {
- if (ti.nodeType === /*Node.TEXT_NODE*/ 3) {
- tt = ti._tars;
- /*tspan(tref)要素のx属性で指定された座標の個数よりも、文字数が多い場合は、祖先(親)のx属性を
- *使う。また、属性が指定されていないときも同様に祖先や親を使う。
- *もし、仮に祖先や親がx属性を指定されていなければ、現在のテキスト位置(変数xに格納している)を使う。
- *この処理はdx属性やdy、y属性でも同様とする
- *参照資料SVG1.1 Text
- *http://www.hcn.zaq.ne.jp/___/REC-SVG11-20030114/text.html
- *
- *注意:ここでは、tspan要素だけではなく、text要素にも適用しているが、本来はtspan要素のみに処理させること
- */
- for (var i=0, tli=tt.length;i<tli;++i) {
- if (n < ptx.numberOfItems - chars) {
- x = ptx.getItem(n).value;
- if (!isYokogaki) {
- x -= fontSize * 0.5;
- }
- } else if (n < tx.numberOfItems) {
- x = tx.getItem(n).value;
- if (!isYokogaki) {
- x -= fontSize * 0.5;
- }
- }
- if (n < pty.numberOfItems - chars) {
- y = pty.getItem(n).value;
- if (isYokogaki) {
- y += fontSize * 0.2;
- }
- } else if (n < ty.numberOfItems) {
- y = ty.getItem(n).value;
- if (isYokogaki) {
- y += fontSize * 0.2;
- }
- }
- if (n < ptdx.numberOfItems - chars) {
- x += ptdx.getItem(n).value;
- } else if (n < tdx.numberOfItems) {
- x += tdx.getItem(n).value;
- }
- if (n < ptdy.numberOfItems - chars) {
- y += ptdy.getItem(n).value;
- } else if (n < tdy.numberOfItems) {
- y += tdy.getItem(n).value;
- }
- alm = 0;
- if (isYokogaki) {
- //カーニングを求めて、字の幅を文字ごとに調整する
- tdc = ti.data.charAt(i);
- if (kern.indexOf(tdc) > -1) {
- alm = fontSize * 0.68;
- } else if (tdc === "s"){
- alm = fontSize * 0.52;
- } else if ((tdc === "C") || (tdc === "D") || (tdc === "M") || (tdc === "W") || (tdc === "G") || (tdc === "m")){
- alm = fontSize * 0.2;
- } else if (akern.indexOf(tdc) > -1){
- alm = fontSize * 0.45;
- } else {
- alm = fontSize * 0.3;
- }
- tcca = tdc.charCodeAt(0);
- if ((12288 <= tcca) && (tcca <= 65533)) {
- alm = -fontSize * 0.01;
- if ((tdc === "う") || (tdc === "く") || (tdc === "し") || (tdc === "ち")) {
- alm += fontSize * 0.2;
- }
- }
- }
- tlist = tar._list;
- tlist[tlist.length] = x;
- tlist[tlist.length] = y;
- tlist[tlist.length] = fontSize - alm;
- if (isYokogaki) {
- x += fontSize;
- x -= alm;
- } else {
- y += fontSize;
- }
- ++n;
- }
- chars += tli;
- if (ti.parentNode && (ti.parentNode.localName === "a")) { //a要素が親である場合は、tiを親に戻しておく
- ti = ti.parentNode;
- }
- ti = ti.nextSibling;
- } else if (((ti.localName === "tspan") || (ti.localName === "tref"))
- && (ti.namespaceURI === "http://www.w3.org/2000/svg") && ti.firstChild) {
- /*現在のテキスト位置(x,y)の分だけ、tspan (tref)要素をずらしておく。
- *さらに、現在のテキスト位置を更新する
- */
- ti._stx = x;
- ti._sty = y;
- ti._chars = chars;
- p = ti.getStartPositionOfChar(ti.getNumberOfChars());
- almx = 0;
- almy = 0;
- tlist = ti._list;
- if (isYokogaki) {
- almx = tlist[tlist.length-1];
- } else {
- almy = tlist[tlist.length-1];
- }
- x = tlist[tlist.length-3] + almx;
- y = tlist[tlist.length-2] + almy;
- tar._list = tar._list.concat(tlist);
- tg = ti.getNumberOfChars();
- n += tg;
- chars += tg;
- ti = ti.nextSibling;
- } else if ((ti.localName === "a") && (ti.namespaceURI === "http://www.w3.org/2000/svg") && ti.firstChild) {
- /*a要素のテキストノードも処理する*/
- ti = ti.firstChild;
- } else {
- ti = ti.nextSibling;
- }
- }
- tar._isYokogaki = isYokogaki //getEndPositionOfCharメソッドなどで使う
- }
- tar = ti = tp = ptx = pty = tx = ty = chars = style = x = y = isYokogaki = kern = akern = tt = alm = tdc = tcca = p = almx = almy = tlist = tg = void 0;
- var s = this.ownerDocument.documentElement.createSVGPoint();
- s.x = this._list[charnum*3];
- s.y = this._list[charnum*3 + 1];
- s = s.matrixTransform(this.getScreenCTM());
- return s;
- }
-};
-/*SVGPoint*/ t.prototype.getEndPositionOfChar = function(/*unsigned long*/ charnum ) {
- if (charnum > this.getNumberOfChars() || charnum < 0) {
- throw (new DOMException(/*DOMException.INDEX_SIZE_ERR*/ 1));
- } else {
- var s = this.getStartPositionOfChar(charnum);
- //アドバンス値(すなわちフォントの大きさ)をCTMの行列式を用いて、算出する
- var n = this._list[charnum*3 + 2] * Math.sqrt(Math.abs(this.getScreenCTM()._determinant()));
- if (this._isYokogaki) {
- s.x += n;
- } else {
- s.y += n;
- }
- return s;
- }
-};
-/*SVGRect*/ t.prototype.getExtentOfChar = function(/*unsigned long*/ charnum ) {
-
-};
-/*float*/ t.prototype.getRotationOfChar = function(/*unsigned long*/ charnum ) {
-
-};
-/*long*/ t.prototype.getCharNumAtPosition = function(/*SVGPoint*/ point ) {
-
-};
-/*void*/ t.prototype.selectSubString = function(/*unsigned long*/ charnum,/*unsigned long*/ nchars ) {
-
-};
-})(SVGTextContentElement);
-
-function SVGTextPositioningElement(_doc) {
- SVGTextContentElement.apply(this, arguments);
- var sl = SVGAnimatedLengthList;
- /*readonly SVGAnimatedLengthList*/ this.x = new sl();
- /*readonly SVGAnimatedLengthList*/ this.y = new sl();
- /*readonly SVGAnimatedLengthList*/ this.dx = new sl();
- /*readonly SVGAnimatedLengthList*/ this.dy = new sl();
- sl = void 0;
- /*readonly SVGAnimatedNumberList*/ this.rotate = new SVGAnimatedNumberList();
- this.addEventListener("DOMAttrModified", function(evt){
- var tar = evt.target,
- name = evt.attrName,
- tod = tar.ownerDocument.documentElement,
- _parseFloat = parseFloat;
- if ((name === "x") || (name === "y") || (name === "dx") || (name === "dy")) {
- var enr = evt.newValue.replace(/^\s+|\s+$/g, "").split(/[\s,]+/),
- teas = tar[name].baseVal;
- for (var i=0, tli=enr.length;i<tli;++i) {
- var tea = tod.createSVGLength(),
- n = enr[i].slice(-1),
- type = 0;
- if (n >= "0" && n <= "9") {
- type = /*SVGLength.SVG_LENGTHTYPE_NUMBER*/ 1;
- } else if (n === "%") {
- if ((name === "x") || (name === "dx")) {
- tea._percent *= tod.viewport.width;
- } else if ((name === "y") || (name === "dy")) {
- tea._percent *= tod.viewport.height;
- }
- type = /*SVGLength.SVG_LENGTHTYPE_PERCENTAGE*/ 2;
- } else {
- n = enr[i].slice(-2);
- if (n === "em") {
- var style = tar.ownerDocument.defaultView.getComputedStyle(tar, null);
- tea._percent *= _parseFloat(style.getPropertyValue("font-size"));
- style = void 0;
- type = /*SVGLength.SVG_LENGTHTYPE_EMS*/ 3;
- } else if (n === "ex") {
- type = /*SVGLength.SVG_LENGTHTYPE_EXS*/ 4;
- } else if (n === "px") {
- type = /*SVGLength.SVG_LENGTHTYPE_PX*/ 5;
- } else if (n === "cm") {
- type = /*SVGLength.SVG_LENGTHTYPE_CM*/ 6;
- } else if (n === "mm") {
- type = /*SVGLength.SVG_LENGTHTYPE_MM*/ 7;
- } else if (n === "in") {
- type = /*SVGLength.SVG_LENGTHTYPE_IN*/ 8;
- } else if (n === "pt") {
- type = /*SVGLength.SVG_LENGTHTYPE_PT*/ 9;
- } else if (n === "pc") {
- type = /*SVGLength.SVG_LENGTHTYPE_PC*/ 10;
- }
- }
- var s = _parseFloat(enr[i]);
- s = isNaN(s) ? 0 : s;
- tea.newValueSpecifiedUnits(type, s);
- teas.appendItem(tea);
- }
- tar._list = null;
- }
- evt = tar = void 0;
- }, false);
- this.addEventListener("DOMNodeInserted", function(evt){
- if (evt.eventPhase === /*Event.BUBBLING_PHASE*/ 3) {
- var tar = evt.target;
- if (tar.nodeType !== /*Node.TEXT_NODE*/ 3) {
- tar._list = void 0;
- evt.currentTarget._list = null;
- }
- evt = tar = void 0;
- }
- }, false);
- if (_doc) {
- this._tar = _doc.createElement("v:group");
- this._doc = _doc; //_docプロパティは_texto関数内で使われる
- }
- this.addEventListener("DOMNodeInserted", function(evt){
- if (evt.eventPhase === /*Event.BUBBLING_PHASE*/ 3) {
- return; //強制終了させる
- }
- var tar = evt.target,
- tnext = tar.nextSibling,
- tpart = tar.parentNode._tar,
- isLast = true;
- if (tnext && tnext._tar && tpart && (tnext._tar.parentNode === tpart)) {
- tpart.insertBefore(tar._tar, tnext._tar);
- } else if (tnext && !tnext._tar && tpart) {
- /*以下の処理は、_tarプロパティがない要素オブジェクトがあるため、それに対処するもの
- *use要素や実体参照などは_tarプロパティがないことに注意
- */
- while (tnext) {
- if (tnext._tar && (tnext._tar.parentNode === tpart)) {
- tpart.insertBefore(tar._tar, tnext._tar);
- isLast = false;
- }
- tnext = tnext.nextSibling;
- }
- if (isLast) {
- tpart.appendChild(tar._tar);
- }
- } else if (!tnext && tpart) {
- tpart.appendChild(tar._tar);
- }
- tnext = tpart = isLast = void 0;
- tar.addEventListener("DOMNodeInsertedIntoDocument", tar._texto, false);
- evt = tar = void 0;
- },false);
- return this;
-};
-SVGTextPositioningElement.constructor = SVGTextContentElement;
-SVGTextPositioningElement.prototype = Object._create(SVGTextContentElement);
-SVGTextPositioningElement.prototype._texto = function(evt) {
- var tar = evt.target,
- ti = tar.firstChild,
- ttp = tar._tar,
- style = tar.ownerDocument.defaultView.getComputedStyle(tar, null),
- deter = Math.sqrt(Math.abs(tar.getScreenCTM()._determinant())),
- n = parseFloat(style.getPropertyValue("font-size")) * deter,
- tod = tar.ownerDocument.documentElement,
- ttpc = ttp, //ttpcはttpのキャッシュ
- tlen = tar.getComputedTextLength(),
- anchor = style.getPropertyValue("text-anchor"),
- tedeco = style.getPropertyValue("text-decoration"), //text-decorationは継承しないので、個々に設定する
- ttps = ttp.style,
- ae = [],
- lts = parseFloat(style.getPropertyValue("letter-spacing")),
- wds = parseFloat(style.getPropertyValue("word-spacing"));
- ttps.fontSize = n + "px"; //nは算出された文字の大きさ (CSSではなく、SVG独自のCTM方式による)
- ttps.fontFamily = style.getPropertyValue("font-family");
- ttps.fontStyle = style.getPropertyValue("font-style");
- ttps.fontWeight = style.getPropertyValue("font-weight");
- if (isFinite(lts)) {
- ttps.letterSpacing = lts * deter + "px";
- }
- if (isFinite(parseFloat(wds))) {
- ttps.wordSpacing = wds * deter + "px";
- }
- /*ここでの変数jは前回ノードまでの総文字数*/
- for (var i=0, j=0, tli=tar.getNumberOfChars();i<tli;++i) {
- if (ti) {
- if (!!ti._tars && (ti._tars.length !== 0)) {
- var ij = (i > j) ? i - j : j - i
- var sty = ti._tars[ij].style,
- p = tar.getStartPositionOfChar(i);
- sty.position = "absolute";
- if (tar._isYokogaki) {
- if (anchor === "middle") {
- p.x -= tlen / 2;
- } else if (anchor === "end") {
- p.x -= tlen;
- }
- } else {
- if (anchor === "middle") {
- p.y -= tlen / 2;
- } else if (anchor === "end") {
- p.y -= tlen;
- }
- }
- sty.left = p.x + "px";
- sty.top = p.y + "px";
- sty.width = "0px";
- sty.height = "0px";
- sty.marginTop = tar._isYokogaki ? -n-5+ "px" : "-5px";
- sty.lineHeight = n+10+ "px";
- sty.textDecoration = tedeco;
- sty.display = "none"
- ttp.appendChild(ti._tars[ij]);
- sty = p = void 0;
- }
- if (ti.nodeName === "#text") {
- if ((ti.data.length+j) <= i+1) { //テキストノード内の文字をすべて処理し終えれば
- j = j + ti.data.length;
- if (ti.data === "") {
- /*空文字列の場合、文字数をカウントせず、iを減らしておく*/
- --i;
- }
- if (ti.parentNode.localName === "a") {
- ti = ti.parentNode;
- ttp = ttpc;
- }
- ti = ti.nextSibling;
- }
- } else if (!!ti.getNumberOfChars) {
- if ((ti.getNumberOfChars()+j) <= i+1) {
- j = j + ti.getNumberOfChars();
- ti = ti.nextSibling;
- }
- } else if ((ti.localName === "a") && (ti.namespaceURI === "http://www.w3.org/2000/svg") && ti.firstChild) {
- ttp = ti._tar;
- ti = ti.firstChild;
- ae[ae.length] = ti;
- if (i === 0) {
- --i;
- } else {
- /*前にテキストノードがある場合など、iが0以上であれば、カウントを前回のテキストノードまでリセットしておく*/
- i-=2;
- }
- }
- }
- }
- var color = style.getPropertyValue("fill"),
- cursor = style.getPropertyCSSValue("cursor"),
- vis = style.getPropertyCSSValue("visibility"),
- disp = style.getPropertyCSSValue("display"),
- tts = tar._tar.style,
- tft = tar.firstChild._tars, //空白のテキストノードの場合、tftがundefinedになる恐れがある
- ttt = tft[0] ? tft[0].innerText.charAt(0) : [""], //あらかじめ初期化しておく
- tfti;
- if (color === "none"){
- tts.color = "transparent";
- } else if (color.indexOf("url") === -1) {
- tts.color = color;
- } else {
- tts.color = "black";
- }
- if (cursor && !cursor._isDefault) { //初期値でないならば
- var tc = cursor.cssText;
- tts.cursor = tc.split(":")[1];
- tc = void 0;
- }
- if ((tar.x.baseVal.numberOfItems === 1) && (tar.y.baseVal.numberOfItems === 1)
- && tar._isYokogaki && (tar.firstChild.nodeName === "#text")) {
- /*xとy属性が一つの値しか取らないとき、字詰めの処理をすべてブラウザに任せておく。
- *以下では、他のdiv要素のテキストをすべて、最初のdiv要素にまとめている
- */
- for (var i=1, tli=tft.length;i<tli;++i) {
- tfti = tft[i];
- ttt += tfti.innerText;
- tfti.parentNode.removeChild(tfti);
- }
- //以下でinnerTextやinnerHTMLを使うのは、IE6でエラーとなる可能性がある
- if (tft[0] && tft[0].replaceChild) {
- tft[0].replaceChild(tar._doc.createTextNode(ttt), tft[0].firstChild);
- }
- ttt = void 0;
- }
- var isRect = true,
- di = "block";
- if (ttp.lastChild) {
- if (ttp.lastChild.nodeName !== "rect") {
- isRect = false;
- }
- } else {
- isRect = false;
- }
- if (!isRect) {
- var backr = tar._doc.createElement("v:rect"),
- backrs = backr.style; //ずれを修正するためのもの
- backrs.width = backrs.height = "1px";
- backrs.left = backrs.top = "0px";
- backr.stroked = backr.filled = "false";
- ttp.appendChild(backr);
- }
- if (vis && !vis._isDefault) {
- tts.visibility = vis.cssText.split(":")[1];
- }
- /*dipslayプロパティだけはdiv要素の個々に設定しておく必要がある
- *なぜかといえば、div要素をdisplay:none;であらかじめ設定しているため。
- */
- if (disp && !disp._isDefault && (disp.cssText.indexOf("none") > -1)) {
- di = "none";
- } else if (disp && !disp._isDefault) {
- di = "block";
- }
- var jt = tar._tar.firstChild,
- j = 0;
- while (jt) {
- jt.style.display = di;
- jt = jt.nextSibling;
- }
- while (ae[j]) { //要素内部にあるa要素の処理
- for (var l=0, tli=ae[j]._tars.length;l<tli;++l) {
- ae[j]._tars[l].style.display = di;
- }
- l = void 0;
- ++j;
- }
- delete tar._cacheMatrix;
- ae = isRect = evt = tar = style = tedeco = tpp = ttpc = style = color = cursor = disp = vis = ttps = backr = backrs = di = tft = jt = lts = deter = void 0;
-};
-
-function SVGTextElement(_doc) {
- SVGTextPositioningElement.apply(this, arguments);
- return this;
-};
-SVGTextElement.constructor = SVGTextPositioningElement;
-SVGTextElement.prototype = Object._create(SVGTextPositioningElement);
-
-function SVGTSpanElement() {
- SVGTextElement.apply(this, arguments);
- return this;
-};
-SVGTSpanElement.constructor = SVGTextPositioningElement;
-SVGTSpanElement.prototype = Object._create(SVGTextPositioningElement);
-
-function SVGTRefElement(_doc) {
- SVGTextPositioningElement.apply(this, arguments);
- this.addEventListener("DOMNodeInserted", function(evt){
- if (evt.eventPhase === /*Event.BUBBLING_PHASE*/ 3) {
- return; //強制終了させる
- }
- evt.target.setAttributeNS("http://www.w3.org/1999/xlink", "xlink:show", "embed");
- }, false);
- this.addEventListener("S_Load", function(evt){
- var tar = evt.target,
- tic = tar._instance.firstChild;
- /*textノードのデータだけを処理*/
- while (tic && (tic.nodeName !== "#text")) {
- tic = tic.nextSibling;
- }
- tic && tar.parentNode.insertBefore(tar.ownerDocument.importNode(tic, false), tar);
- evt.target = tar.parentNode;
- tar.parentNode._texto(evt);
- tar = tic = evtt = void 0;
- }, false);
- SVGURIReference.apply(this, arguments);
- return this;
-};
-SVGTRefElement.constructor = SVGTextPositioningElement;
-SVGTRefElement.prototype = Object._create(SVGTextPositioningElement);
-
-function SVGTextPathElement() {
- SVGTextContentElement.apply(this, arguments);
- /*readonly SVGAnimatedLength*/ this.startOffset;
- /*readonly SVGAnimatedEnumeration*/ this.method;
- /*readonly SVGAnimatedEnumeration*/ this.spacing;
- SVGURIReference.apply(this, arguments);
- return this;
-};
-SVGTextPathElement.constructor = SVGTextContentElement;
-SVGTextPathElement.prototype = Object._create(SVGTextContentElement);
-
-(function(t){
- // textPath Method Types
- /*unsigned short t.TEXTPATH_METHODTYPE_UNKNOWN = 0;
- /*unsigned short t.TEXTPATH_METHODTYPE_ALIGN = 1;
- /*unsigned short t.TEXTPATH_METHODTYPE_STRETCH = 2;
- // textPath Spacing Types
- /*unsigned short t.TEXTPATH_SPACINGTYPE_UNKNOWN = 0;
- /*unsigned short t.TEXTPATH_SPACINGTYPE_AUTO = 1;
- /*unsigned short t.TEXTPATH_SPACINGTYPE_EXACT = 2;*/
-})(SVGTextPathElement);
-
-function SVGAltGlyphElement() {
- SVGTextPositioningElement.apply(this, arguments);
- /*DOMString*/ this.glyphRef;
- /*DOMString*/ this.format;
- SVGURIReference.apply(this, arguments);
- return this;
-};
-SVGAltGlyphElement.constructor = SVGTextPositioningElement;
-SVGAltGlyphElement.prototype = Object._create(SVGTextPositioningElement);
-
-function SVGAltGlyphDefElement() {
- SVGElement.apply(this, arguments);
- return this;
-};
-SVGAltGlyphDefElement.prototype = Object._create(SVGElement);
-
-function SVGAltGlyphItemElement() {
- SVGElement.apply(this, arguments);
- return this;
-};
-SVGAltGlyphItemElement.prototype = Object._create(SVGElement);
-
-function SVGGlyphRefElement() {
- SVGElement.apply(this, arguments);
- /*DOMString*/ this.glyphRef;
- /*DOMString*/ this.format;
- /*float*/ this.x;
- /*float*/ this.y;
- /*float*/ this.dx;
- /*float*/ this.dy;
- SVGURIReference.apply(this, arguments);
- return this;
-};
-SVGGlyphRefElement.prototype = Object._create(SVGElement);
-
-function SVGPaint() {
- SVGColor.apply(this, arguments);
- return this;
-};
-
-(function(t){
-t.prototype = Object._create(SVGColor);
- // Paint Types
- /*unsigned short t.SVG_PAINTTYPE_UNKNOWN = 0;
- /*unsigned short t.SVG_PAINTTYPE_RGBCOLOR = 1;
- /*unsigned short t.SVG_PAINTTYPE_RGBCOLOR_ICCCOLOR = 2;
- /*unsigned short t.SVG_PAINTTYPE_NONE = 101;
- /*unsigned short t.SVG_PAINTTYPE_CURRENTCOLOR = 102;
- /*unsigned short t.SVG_PAINTTYPE_URI_NONE = 103;
- /*unsigned short t.SVG_PAINTTYPE_URI_CURRENTCOLOR = 104;
- /*unsigned short t.SVG_PAINTTYPE_URI_RGBCOLOR = 105;
- /*unsigned short t.SVG_PAINTTYPE_URI_RGBCOLOR_ICCCOLOR = 106;
- /*unsigned short t.SVG_PAINTTYPE_URI = 107;*/
- /*readonly unsigned short*/ t.prototype.paintType = /*t.SVG_PAINTTYPE_UNKNOWN*/ 0;
- /*readonly DOMString*/ t.prototype.uri = null;
-/*void*/ t.prototype.setUri = function(/*DOMString*/ uri ) {
- this.setPaint(/*SVGPaint.SVG_PAINTTYPE_URI_NONE*/ 103, uri, null, null);
-};
-/*void*/ t.prototype.setPaint = function(/*unsigned short*/ paintType, /*DOMString*/ uri, /*DOMString*/ rgbColor, /*DOMString*/ iccColor ) {
- if ((paintType < 101 && uri) || (paintType > 102 && !uri)) {
- throw new SVGException(/*SVGException.SVG_INVALID_VALUE_ERR*/ 1);
- }
- this.uri = uri;
- this.paintType = paintType;
- if (paintType === /*SVGPaint.SVG_PAINTTYPE_CURRENTCOLOR*/ 102) {
- paintType = /*SVGColor.SVG_COLORTYPE_CURRENTCOLOR*/ 3;
- }
- this.setColor(paintType, rgbColor, iccColor); //SVGColorのsetColorメソッドを用いる
-};
-// raises( SVGException );
-t = void 0;
-})(SVGPaint);
-
-function SVGMarkerElement(){
- SVGSVGElement.apply(this, [{createElement:function(){}}]);
- this._tar = {style:{}}; //getScreenCTMメソッド対策
- var sl = SVGAnimatedLength;
- /*readonly SVGAnimatedLength*/ this.refX = new sl();
- /*readonly SVGAnimatedLength*/ this.refY = new sl();
- /*readonly SVGAnimatedEnumeration*/ this.markerUnits = new SVGAnimatedEnumeration();
- this.markerUnits.baseVal = /*SVGMarkerElement.SVG_MARKERUNITS_STROKEWIDTH*/ 2;
- /*readonly SVGAnimatedLength*/ this.markerWidth = new sl();
- /*readonly SVGAnimatedLength*/ this.markerHeight = new sl();
- this.refX.baseVal.newValueSpecifiedUnits(1, 0);
- this.refY.baseVal.newValueSpecifiedUnits(1, 0);
- this.markerWidth.baseVal.newValueSpecifiedUnits(1, 3);
- this.markerHeight.baseVal.newValueSpecifiedUnits(1, 3);
- sl = void 0;
- /*readonly SVGAnimatedEnumeration*/ this.orientType = new SVGAnimatedEnumeration();
- this.orientType.baseVal = /*SVGMarkerElement.SVG_MARKER_ORIENT_ANGLE*/ 2;
- /*readonly SVGAnimatedAngle*/ this.orientAngle = new SVGAnimatedAngle();
- //SVGFitToViewBoxのインターフェースはSVGSVGElementで代用
- this.addEventListener("DOMAttrModified", function(evt) {
- var tar = evt.target,
- en = evt.newValue,
- angle;
- if (evt.attrName === "orient") {
- if (en === "auto") {
- tar.setOrientToAuto();
- } else {
- angle = tar.ownerDocument.documentElement.createSVGAngle();
- angle.newValueSpecifiedUnits(1, +en);
- tar.setOrientToAngle(angle);
- }
- } else if (evt.attrName === "markerUnits") {
- if (en === "strokeWidth") {
- tar.markerUnits.baseVal = /*SVGMarkerElement.SVG_MARKERUNITS_STROKEWIDTH*/ 2;
- } else {
- tar.markerUnits.baseVal = /*SVGMarkerElement.SVG_MARKERUNITS_USERSPACEONUSE*/ 1;
- }
- }
- }, false);
- this.addEventListener("DOMNodeInsertedIntoDocument", function(evt) {
- /*注意: グローバル関数を書き換えているので注意を要する*/
- var ns = NAIBU._setPaint,
- id = evt.target.getAttributeNS(null, "id");
- NAIBU._setPaint = (function(ns, id) {
- return function(tar, ctm) {
- ns(tar, ctm);
- var td = tar.ownerDocument,
- tde = td.documentElement,
- style = td.defaultView.getComputedStyle(tar, ""),
- ms = style.getPropertyValue("marker-start").slice(5, -1),
- me = style.getPropertyValue("marker-end").slice(5, -1),
- mid = style.getPropertyValue("marker-mid").slice(5, -1),
- marker,
- cmarker,
- gmarker,
- tr,
- tn,
- ttr,
- sth,
- ctm,
- sstyle,
- nstyle,
- plist,
- regAZ,
- regm,
- u, t,
- lf = function (x, y) {
- cmarker = marker.cloneNode(true);
- gmarker = td.createElementNS("http://www.w3.org/2000/svg", "g");
- /*marker要素の子要素はすべて、g要素としてまとめておく*/
- while (cmarker.lastChild) {
- gmarker.appendChild(cmarker.lastChild);
- }
- tr = gmarker.transform.baseVal;
- ttr = tar.transform.baseVal.consolidate() || td.documentElement.createSVGMatrix();
- if (marker.markerUnits.baseVal === /*SVGMarkerElement.SVG_MARKERUNITS_STROKEWIDTH*/ 2) {
- sth = +style.getPropertyValue("stroke-width");
- } else {
- /*参照要素の行列の積を適用*/
- sth = 1;
- }
- if (marker.hasAttributeNS(null, "viewBox")) {
- marker.viewport.width = marker.markerWidth.baseVal.value;
- marker.viewport.height = marker.markerHeight.baseVal.value;
- /*applyを使って、marker要素のCTMを算出*/
- ctm = tde.getScreenCTM.apply(marker);
- } else {
- ctm = tde.createSVGMatrix();
- }
- if (marker.orientType.baseVal === /*SVGMarkerElement.SVG_MARKER_ORIENT_AUTO*/ 1) {
- angle = Math.atan2(plist[1].y-plist[0].y, plist[1].x-plist[0].x)*180/Math.PI;
- } else {
- angle = marker.orientAngle.baseVal.value;
- }
- tr.appendItem(tr.createSVGTransformFromMatrix(ttr.translate(x, y)
- .rotate(angle)
- .scale(sth)
- .multiply(ctm)
- .translate(-marker.refX.baseVal.value, -marker.refY.baseVal.value)));
- sstyle = td.defaultView.getComputedStyle(marker, "");
- nstyle = gmarker.style;
- regAZ = /([A-Z])/;
- regm = /\-/;
- for (var i in CSS2Properties) {
- if (CSS2Properties.hasOwnProperty(i) && (i !== "_list")) {
- i = i.replace(regAZ, "-");
- if (RegExp.$1) {
- u = "-" +RegExp.$1.toLowerCase();
- } else {
- u = "-";
- }
- i = i.replace(regm, u);
- nstyle.setProperty(i, sstyle.getPropertyValue(i), "");
- }
- }
- tar.parentNode.insertBefore(gmarker, tar.nextSibling);
- };
- /*url(#id)で一致する文字列があるかどうか*/
- if (ms === id) {
- marker = td.getElementById(ms);
- if (tar.normalizedPathSegList || tar.points) {
- tn = tar.normalizedPathSegList || tar.points;
- plist = [tn.getItem(0), tn.getItem(1)];
- } else if (tar.x1) {
- plist = [{x:tar.x1, y:tar.y1}, {x:tar.x2, y:tar.y2}];
- }
- lf(plist[0].x, plist[0].y);
- }
- if (me === id) {
- marker = td.getElementById(me);
- if (tar.normalizedPathSegList || tar.points) {
- tn = tar.normalizedPathSegList || tar.points;
- plist = [tn.getItem(tn.numberOfItems-2), tn.getItem(tn.numberOfItems-1)];
- } else if (tar.x1) {
- plist = [{x:tar.x1, y:tar.y1}, {x:tar.x2, y:tar.y2}];
- }
- lf(plist[1].x, plist[1].y);
- }
- if (mid === id) {
- marker = td.getElementById(mid);
- }
- td = tde = style = sstyle = nstyle = ms = me = mid = marker = cmarker = gmarker = ctm = sth = tr = tn = ttr = plist = regAZ = regm = u = t = lf = void 0;
- };
- })(ns, id);
- }, false);
- return this;
-};
-(function(t){
- // Marker Unit Types
- /*unsigned short t.SVG_MARKERUNITS_UNKNOWN = 0;
- /*unsigned short t.SVG_MARKERUNITS_USERSPACEONUSE = 1;
- /*unsigned short t.SVG_MARKERUNITS_STROKEWIDTH = 2;
- // Marker Orientation Types
- /*unsigned short t.SVG_MARKER_ORIENT_UNKNOWN = 0;
- /*unsigned short t.SVG_MARKER_ORIENT_AUTO = 1;
- /*unsigned short t.SVG_MARKER_ORIENT_ANGLE = 2;*/
- t.prototype = Object._create(SVGSVGElement);
- t.prototype.getScreenCTM = SVGElement.prototype.getScreenCTM;
- /*void*/ t.prototype.setOrientToAuto = function() {
- this.orientType.baseVal = /*t.SVG_MARKER_ORIENT_AUTO*/ 1;
-};
-/*void*/ t.prototype.setOrientToAngle = function(/*SVGAngle*/ angle ) {
- this.orientType.baseVal = /*t.SVG_MARKER_ORIENT_ANGLE*/ 2;
- this.orientAngle.baseVal = angle;
-
-};
-})(SVGMarkerElement);
-function SVGColorProfileElement() {
- SVGElement.apply(this);
- /*DOMString*/ this._local;
- // raises DOMException on setting
- // (NOTE: is prefixed by "_"
- // as "local" is an IDL keyword. The
- // prefix will be removed upon processing)
- /*DOMString*/ this.name;
- /*unsigned short*/ this.renderingIntent;
- SVGURIReference.apply(this, arguments);
- return this;
-};
-SVGColorProfileElement.prototype = Object._create(SVGElement);
-
-function SVGColorProfileRule() {
- SVGCSSRule.apply(this);
- /*DOMString*/ this.src;
- /*DOMString*/ this.name;
- /*unsigned short*/ this.renderingIntent;
- return this;
-};
-SVGColorProfileRule.prototype = Object._create(SVGCSSRule);
-
-function SVGGradientElement() {
- SVGElement.apply(this);
- SVGURIReference.apply(this);
- /*readonly SVGAnimatedEnumeration*/ this.gradientUnits = new SVGAnimatedEnumeration();
- /*readonly SVGAnimatedTransformList*/ this.gradientTransform = new SVGAnimatedTransformList();
- /*readonly SVGAnimatedEnumeration*/ this.spreadMethod = new SVGAnimatedEnumeration();
- this.addEventListener("DOMNodeInsertedIntoDocument", function(evt) {
- var grad = evt.target,
- ele = evt._tar,
- t = evt._style, //eleはv:fill要素やv:stroke要素のノード、tはラップした要素ノードのスタイルを収納
- grad2 = grad,
- href, stops, length,
- color = [],
- colors = [],
- opacity = [],
- stop, sstyle, ci;
- if (!ele || !grad) { //まだ、path要素などが設定されていない場合
- grad = ele = t = grad2 = href = stops = length = color = colors = opacity = void 0;
- return;
- }
- if (grad._instance) { //xlink言語で呼び出されたノードが_instanceに収納されているならば
- grad2 = grad._instance;
- }
- stops = grad2.getElementsByTagNameNS("http://www.w3.org/2000/svg", "stop");
- if (!stops) {
- ele = t = href = grad = grad2 = stops = color = colors = opacity = void 0;
- return;
- }
- length = stops.length;
- for (var i = 0; i < length; ++i) {
- stop = stops[i];
- sstyle = stop.ownerDocument.defaultView.getComputedStyle(stop, "");
- ci = sstyle.getPropertyCSSValue("stop-color");
- if (ci && (ci.colorType === /*SVGColor.SVG_COLORTYPE_CURRENTCOLOR*/ 3)) {
- /*再度、設定。css.jsのsetPropertyを参照*/
- sstyle.setProperty("color", sstyle.getPropertyValue("color"));
- }
- color[i] = "rgb(" +ci.rgbColor.red.getFloatValue(1)+ "," +ci.rgbColor.green.getFloatValue(1)+ "," +ci.rgbColor.blue.getFloatValue(1)+ ")";
- colors[i] = stop.offset.baseVal + " " + color[i];
- opacity[i] = (sstyle.getPropertyValue("stop-opacity") || 1) * t.getPropertyValue("fill-opacity") * t.getPropertyValue("opacity");
- }
- ele["method"] = "none";
- ele["color"] = color[0];
- ele["color2"] = color[length-1];
- ele["colors"] = colors.join(",");
- // When colors attribute is used, the meanings of opacity and o:opacity2 are reversed.
- ele["opacity"] = opacity[length-1]+ "";
- ele["o:opacity2"] = opacity[0]+ "";
- /*SVGRadialGradientElementインターフェースで利用する*/
- grad._color = color;
- var gt = grad2.getAttributeNS(null, "gradientTransform");
- if (gt) {
- grad.setAttributeNS(null, "transform", gt);
- }
- grad = grad2 = ele = stops = length = color = colors = opacity = evt = t = href = stop = sstyle = ci = void 0;
- }, false);
- return this;
-};
-SVGGradientElement.prototype = Object._create(SVGElement);
- // Spread Method Types
- /*unsigned short SVGGradientElement.SVG_SPREADMETHOD_UNKNOWN = 0;
- /*unsigned short SVGGradientElement.SVG_SPREADMETHOD_PAD = 1;
- /*unsigned short SVGGradientElement.SVG_SPREADMETHOD_REFLECT = 2;
- /*unsigned short SVGGradientElement.SVG_SPREADMETHOD_REPEAT = 3;*/
-
-function SVGLinearGradientElement() {
- SVGGradientElement.apply(this);
- var sl = SVGAnimatedLength;
- /*readonly SVGAnimatedLength*/ this.x1 = new sl();
- /*readonly SVGAnimatedLength*/ this.y1 = new sl();
- /*readonly SVGAnimatedLength*/ this.x2 = new sl();
- /*readonly SVGAnimatedLength*/ this.y2 = new sl();
- sl = void 0;
- this.addEventListener("DOMNodeInsertedIntoDocument", function(evt) {
- var grad = evt.target, ele = evt._tar, angle = 270;
- if (!!!ele) { //まだ、path要素などが設定されていない場合
- return;
- }
- var style = grad.ownerDocument.defaultView.getComputedStyle(grad, "");
- var fontSize = parseFloat(style.getPropertyValue("font-size"));
- grad.x1.baseVal._emToUnit(fontSize);
- grad.y1.baseVal._emToUnit(fontSize);
- grad.x2.baseVal._emToUnit(fontSize);
- grad.y2.baseVal._emToUnit(fontSize);
- angle = 270 - Math.atan2(grad.y2.baseVal.value-grad.y1.baseVal.value, grad.x2.baseVal.value-grad.x1.baseVal.value) * 180 / Math.PI;
- if (angle >= 360) {
- angle -= 360;
- }
- ele.setAttribute("type", "gradient");
- ele.setAttribute("angle", angle + "");
- evt = ele = grad = angle = style = fontSize = void 0;
- }, false);
- return this;
-};
-SVGLinearGradientElement.prototype = Object._create(SVGGradientElement);
-
-function SVGRadialGradientElement(_doc) {
- SVGGradientElement.apply(this);
- var sl = SVGAnimatedLength;
- /*readonly SVGAnimatedLength*/ this.cx = new sl();
- /*readonly SVGAnimatedLength*/ this.cy = new sl();
- /*readonly SVGAnimatedLength*/ this.r = new sl();
- /*readonly SVGAnimatedLength*/ this.fx = new sl();
- /*readonly SVGAnimatedLength*/ this.fy = new sl();
- sl = void 0;
- this.cx.baseVal.value = this.cy.baseVal.value = this.r.baseVal.value = 0.5;
- this.addEventListener("DOMNodeInsertedIntoDocument", function(evt) {
- var grad = evt.target,
- ele = evt._tar,
- tar = evt._ttar; //eleはv:fill要素。tarはターゲットとになる要素
- if (!!!ele) { //まだ、path要素などが設定されていない場合
- return;
- }
- ele.setAttribute("type", "gradientTitle");
- ele.setAttribute("focus", "100%");
- ele.setAttribute("focusposition", "0.5 0.5");
- if (tar.localName === "rect") {
- /*VMLでは、図の形状に沿って、円状のグラデーションを処理するようになっているため、
- *四角だとおかしな模様が出てしまう。以下はそれを避ける処理
- */
- var style = grad.ownerDocument.defaultView.getComputedStyle(tar, ""),
- fontSize = parseFloat(style.getPropertyValue("font-size"));
- grad.cx.baseVal._emToUnit(fontSize);
- grad.cy.baseVal._emToUnit(fontSize);
- grad.r.baseVal._emToUnit(fontSize);
- grad.fx.baseVal._emToUnit(fontSize);
- grad.fy.baseVal._emToUnit(fontSize);
- var cx = grad.cx.baseVal.value,
- cy = grad.cy.baseVal.value,
- r = grad.r.baseVal.value,
- mr = Math.round,
- rx, ry;
- rx = ry = r;
- var tarrect = tar.getBBox(),
- vi = tar.ownerDocument.documentElement.viewport,
- el = mr(vi.width),
- et = mr(vi.height),
- er = 0,
- eb = 0,
- units = grad.getAttributeNS(null, "gradientUnits");
- if (!units || units === "objectBoundingBox") {
- //%の場合は小数点に変換(10% -> 0.1)
- cx = cx > 1 ? cx/100 : cx;
- cy = cy > 1 ? cy/100 : cy;
- r = r > 1 ? r/100 : r;
- //要素の境界領域を求める(四隅の座標を求める)
- var nx = tarrect.x,
- ny = tarrect.y,
- wid = tarrect.width,
- hei = tarrect.height;
- cx = cx*wid + nx;
- cy = cy*hei + ny;
- rx = r*wid;
- ry = r*hei;
- nx = ny = wid = hei = void 0;
- }
- var matrix = tar.getScreenCTM().multiply(grad.getCTM());
- el = cx - rx;
- et = cy - ry;
- er = cx + rx;
- eb = cy + ry;
- var rrx = rx * 0.55228,
- rry = ry * 0.55228,
- list = ["m", cx,et, "c", cx-rrx,et, el,cy-rry, el,cy, el,cy+rry, cx-rrx,eb, cx,eb, cx+rrx,eb, er,cy+rry, er,cy, er,cy-rry, cx+rrx,et, cx,et, "x e"];
- for (var i = 0, lili = list.length; i < lili;) {
- if (isNaN(list[i])) { //コマンド文字は読み飛ばす
- ++i;
- continue;
- }
- var p = grad.ownerDocument.documentElement.createSVGPoint();
- p.x = parseFloat(list[i]);
- p.y = parseFloat(list[i+1]);
- var pmt = p.matrixTransform(matrix);
- list[i] = mr(pmt.x);
- i++;
- list[i] = mr(pmt.y);
- i++;
- p = pmt = void 0;
- }
- var ellipse = list.join(" "),
- outline = _doc.getElementById("_NAIBU_outline"),
- background = _doc.createElement("div"),
- bstyle = background.style;
- bstyle.position = "absolute";
- bstyle.display = "inline-block";
- var w = vi.width,
- h = vi.height;
- bstyle.textAlign = "left";
- bstyle.top = "0px";
- bstyle.left = "0px";
- bstyle.width = w+ "px";
- bstyle.height = h+ "px";
- outline.appendChild(background);
- bstyle.filter = "progid:DXImageTransform.Microsoft.Compositor";
- background.filters.item('DXImageTransform.Microsoft.Compositor').Function = 23;
- var circle = '<v:shape style="display:inline-block; position:relative; antialias:false; top:0px; left:0px;" coordsize="' +w+ ' ' +h+ '" path="' +ellipse+ '" stroked="f">' +ele.outerHTML+ '</v:shape>',
- data = tar._tar.path.value;
- background.innerHTML = '<v:shape style="display:inline-block; position:relative; top:0px; left:0px;" coordsize="' +w+ ' ' +h+ '" path="' +data+ '" stroked="f" fillcolor="' +grad._color[grad._color.length-1]+ '" ></v:shape>';
- background.filters[0].apply();
- background.innerHTML = circle;
- background.filters[0].play();
- tar._tar.parentNode.insertBefore(background, tar._tar);
- tar._tar.filled = "false";
- ellipse = outline = background = style = fontSize = bstyle = circle = data = list = mr = gt = cx = cy = r = w = h = matrix = void 0;
- } else if (!ele.parentNode){
- tar._tar.appendChild(ele);
- }
- evt = tar = ele = gard = void 0;
- }, false);
- return this;
-};
-SVGRadialGradientElement.prototype = Object._create(SVGGradientElement);
-
-function SVGStopElement() {
- SVGElement.apply(this, arguments);
- /*readonly SVGAnimatedNumber*/ this.offset = new SVGAnimatedNumber();
- this.addEventListener("DOMAttrModified", function(evt) {
- if (evt.attrName === "offset") {
- evt.target.offset.baseVal = parseFloat(evt.newValue);
- }
- evt = void 0;
- }, false);
- return this;
-};
-SVGStopElement.prototype = Object._create(SVGElement);
-
-function SVGPatternElement() {
- SVGElement.apply(this);
- var sl = SVGAnimatedLength;
- /*readonly SVGAnimatedEnumeration*/ this.patternUnits = new SVGAnimatedEnumeration();
- /*readonly SVGAnimatedEnumeration*/ this.patternContentUnits = new SVGAnimatedEnumeration();
- /*readonly SVGAnimatedTransformList*/ this.patternTransform = new SVGAnimatedTransformList();
- /*readonly SVGAnimatedLength*/ this.x = new sl();
- /*readonly SVGAnimatedLength*/ this.y = new sl();
- /*readonly SVGAnimatedLength*/ this.width = new sl();
- /*readonly SVGAnimatedLength*/ this.height = new sl();
- sl = void 0;
- SVGURIReference.apply(this, arguments);
- //SVGFitToViewBoxのインターフェースを用いる
- /*readonly SVGAnimatedRect*/ this.viewBox = new SVGAnimatedRect();
- /*readonly SVGAnimatedPreserveAspectRatio*/ this.preserveAspectRatio = new SVGAnimatedPreserveAspectRatio();
- /*unsigned short*/ this.zoomAndPan = /*SVGZoomAndPan.SVG_ZOOMANDPAN_DISABLE*/ 1;
- return this;
-};
-SVGPatternElement.prototype = Object._create(SVGElement);
-
-function SVGClipPathElement() {
- SVGElement.apply(this, arguments);
- /*readonly SVGAnimatedEnumeration*/ this.clipPathUnits = new SVGAnimatedEnumeration();
- return this;
-};
-SVGClipPathElement.prototype = Object._create(SVGElement);
-
-function SVGMaskElement() {
- SVGElement.apply(this);
- var sl = SVGAnimatedLength;
- /*readonly SVGAnimatedEnumeration*/ this.maskUnits = new SVGAnimatedEnumeration();
- /*readonly SVGAnimatedEnumeration*/ this.maskContentUnits = new SVGAnimatedEnumeration();
- /*readonly SVGAnimatedLength*/ this.x = new sl();
- /*readonly SVGAnimatedLength*/ this.y = new sl();
- /*readonly SVGAnimatedLength*/ this.width = new sl();
- /*readonly SVGAnimatedLength*/ this.height = new sl();
- sl = void 0;
- return this;
-};
-SVGMaskElement.prototype = Object._create(SVGElement);
-
-function SVGFilterElement() {
- SVGElement.apply(this);
- var sl = SVGAnimatedLength;
- /*readonly SVGAnimatedEnumeration*/ this.filterUnits = new SVGAnimatedEnumeration();
- /*readonly SVGAnimatedEnumeration*/ this.primitiveUnits = new SVGAnimatedEnumeration();
- /*readonly SVGAnimatedLength*/ this.x = new sl();
- /*readonly SVGAnimatedLength*/ this.y = new sl();
- /*readonly SVGAnimatedLength*/ this.width = new sl();
- /*readonly SVGAnimatedLength*/ this.height = new sl();
- sl = void 0;
- /*readonly SVGAnimatedInteger*/ this.filterResX = new SVGAnimatedInteger();
- /*readonly SVGAnimatedInteger*/ this.filterResY = new SVGAnimatedInteger();
- SVGURIReference.apply(this, arguments);
- //setFilterRes (/*unsigned long*/ filterResX,/*unsigned long*/ filterResY );
- return this;
-};
-SVGFilterElement.prototype = Object._create(SVGElement);
-
-function SVGFilterPrimitiveStandardAttributes(ele) {
- SVGStylable.apply(this, arguments);
- this._tar = ele;
- var sl = SVGAnimatedLength;
- /*readonly SVGAnimatedLength*/ this.x = new sl();
- /*readonly SVGAnimatedLength*/ this.y = new sl();
- /*readonly SVGAnimatedLength*/ this.width = new sl();
- /*readonly SVGAnimatedLength*/ this.height = new sl();
- /*readonly SVGAnimatedString*/ this.result = new sl();
- sl = void 0;
- };
-SVGFilterPrimitiveStandardAttributes.prototype = Object._create(SVGStylable);
-
-function SVGFEBlendElement() {
- SVGElement.apply(this, arguments);
- /*readonly SVGAnimatedString*/ this.in1 = new SVGAnimatedString();
- /*readonly SVGAnimatedString*/ this.in2 = new SVGAnimatedString();
- /*readonly SVGAnimatedEnumeration*/ this.mode = new SVGAnimatedEnumeration();
- this._fpsa = SVGFilterPrimitiveStandardAttributes(this);
- return this;
-};
-SVGFEBlendElement.prototype = Object._create(SVGElement);
- // Blend Mode Types
- /*unsigned short SVGFEBlendElement.SVG_FEBLEND_MODE_UNKNOWN = 0;
- /*unsigned short SVGFEBlendElement.SVG_FEBLEND_MODE_NORMAL = 1;
- /*unsigned short SVGFEBlendElement.SVG_FEBLEND_MODE_MULTIPLY = 2;
- /*unsigned short SVGFEBlendElement.SVG_FEBLEND_MODE_SCREEN = 3;
- /*unsigned short SVGFEBlendElement.SVG_FEBLEND_MODE_DARKEN = 4;
- /*unsigned short SVGFEBlendElement.SVG_FEBLEND_MODE_LIGHTEN = 5;*/
-
-function SVGFEGaussianBlurElement() {
- SVGElement.apply(this, arguments);
- /*readonly SVGAnimatedString*/ this.in1 = new SVGAnimatedString();
- /*readonly SVGAnimatedNumber*/ this.stdDeviationX = new SVGAnimatedNumber();
- /*readonly SVGAnimatedNumber*/ this.stdDeviationY = new SVGAnimatedNumber();
- this._fpsa = SVGFilterPrimitiveStandardAttributes(this);
- return this;
-};
-SVGFEGaussianBlurElement.prototype = Object._create(SVGElement);
-/*void*/ SVGFEGaussianBlurElement.prototype.setStdDeviation = function(/*float*/ stdDeviationX, /*float*/ stdDeviationY ) {
-
-};
-
-function SVGCursorElement() {
- SVGElement.apply(this, arguments);
- /*readonly SVGAnimatedLength*/ this.x = new SVGAnimatedLength();
- /*readonly SVGAnimatedLength*/ this.y = new SVGAnimatedLength();
- SVGURIReference.apply(this, arguments);
- return this;
-};
-SVGCursorElement.prototype = Object._create(SVGElement);
-
-function SVGAElement(_doc) {
- SVGElement.apply(this);
- this._tar = _doc.createElement("a");
- _doc = void 0;
- /*readonly SVGAnimatedString*/ this.target = new SVGAnimatedString();
- this.target.baseVal = "_self";
- this.addEventListener("DOMAttrModified", function(evt){
- var tar = evt.target;
- if (evt.eventPhase === /*Event.BUBBLING_PHASE*/ 3) {
- return; //強制終了させる
- }
- if (evt.attrName === "target") {
- tar.target.baseVal = evt.newValue;
- } else if (evt.attrName === "xlink:title") {
- tar._tar.setAttribute("title", evt.newValue);
- }
- evt = void 0;
- }, false);
- this.addEventListener("DOMNodeInserted", function(evt){
- var tar = evt.target;
- if (evt.eventPhase === /*Event.BUBBLING_PHASE*/ 3) {
- return; //強制終了させる
- }
- if (tar.nextSibling) {
- if (!!tar.parentNode._tar && !!tar.nextSibling._tar) {
- tar.parentNode._tar.insertBefore(tar._tar, tar.nextSibling._tar);
- }
- } else if (!!tar.parentNode._tar){
- tar.parentNode._tar.appendChild(tar._tar);
- }
- var txts = tar._tar.style;
- txts.cursor = "hand";
- txts.left = "0px";
- txts.top = "0px";
- txts.textDecoration = "none";
- txts = void 0;
- var t = tar.target.baseVal;
- var st = "replace";
- if (t === "_blank") {
- st = "new";
- }
- tar.setAttributeNS("http://www.w3.org/1999/xlink", "xlink:show", st);
- tar._tar.style.color = tar.ownerDocument.defaultView.getComputedStyle(tar, "").getPropertyValue("fill");
- tar = evt = void 0;
- }, false);
- this.addEventListener("DOMNodeInsertedIntoDocument", function(evt){
- var tar = evt.target;
- if (!!tar._tar && (tar.nodeType === /*Node.ELEMENT_NODE*/ 1)) {
- var txts = tar._tar.style;
- txts.cursor = "hand";
- txts.textDecoration = "none";
- txts = void 0;
- }
- tar = evt = void 0;
- return; //強制終了させる
- }, true);
- this.addEventListener("DOMNodeInsertedIntoDocument", function(evt){
- var tar = evt.target;
- tar._tar.setAttribute("target", tar.target.baseVal);
- if (tar.href.baseVal.indexOf(".svg") !== -1) { //もし、リンク先がSVGファイルならば
- tar.addEventListener("click", function(evt){
- var tar = evt.target,
- sd = document.body,
- ob, nd;
- sd.lastChild.innerHTML = "<object data='" +tar.href.baseVal.split("#")[0]+ "' width='" +screen.width+ "' height='" +screen.height+ "' type='image/svg+xml'></object>";
- if (tar.target.baseVal === "_self") {
- nd = tar.ownerDocument._iframe;
- nd.parentNode.insertBefore(sd.lastChild.firstChild, nd);
- ob = nd.nextSibling;
- if (ob && (ob.tagName === "OBJECT")) {
- nd.previousSibling.setAttribute("width", ob.getAttribute("width"));
- nd.previousSibling.setAttribute("height", ob.getAttribute("height"));
- nd.parentNode.removeChild(ob);
- }
- ob = NAIBU._search([nd.previousSibling]);
- nd.parentNode.removeChild(nd);
- } else {
- sd.appendChild(sd.lastChild.firstChild);
- while (sd.firstChild !== sd.lastChild) { //オブジェクト要素以外を除去
- sd.removeChild(sd.firstChild);
- }
- ob = NAIBU._search([sd.lastChild]);
- }
- NAIBU.doc = new ActiveXObject("MSXML2.DomDocument");
- evt.preventDefault();
- ob._next = {
- _init: (function (ob) {
- return (function(){
- document.title = ob.getSVGDocument().title;
- ob = void 0;
- });
- })(ob)
- };
- ob._init();
- sd = ob = nd = void 0;
- }, false);
- }
- tar = void 0;
- }, false);
- SVGURIReference.apply(this, arguments);
- return this;
-};
-SVGAElement.prototype = Object._create(SVGElement);
-
-function SVGViewElement() {
- SVGElement.apply(this, arguments);
- /*readonly SVGStringList*/ this.viewTarget = new SVGStringList();
- //SVGFitToViewBoxのインターフェースを用いる
- /*readonly SVGAnimatedRect*/ this.viewBox = new SVGAnimatedRect();
- /*readonly SVGAnimatedPreserveAspectRatio*/ this.preserveAspectRatio = new SVGAnimatedPreserveAspectRatio();
- /*unsigned short*/ this.zoomAndPan = /*SVGZoomAndPan.SVG_ZOOMANDPAN_DISABLE*/ 1;
- return this;
-};
-SVGViewElement.prototype = Object._create(SVGElement);
-
-function SVGScriptElement() {
- SVGElement.apply(this);
- /*DOMString*/ this.type;
- SVGURIReference.apply(this, arguments);
- this.addEventListener("DOMAttrModified", function(evt){
- if (evt.attrName === "type") {
- evt.target.type = evt.newValue;
- }
- evt = void 0;
- }, false);
- this.addEventListener("S_Load", function(evt){
- var tar = evt.target, script = tar._text;
- var tod = tar.ownerDocument;
- NAIBU._temp_doc = tod;
- script = script.replace(/function\s+(\w+)/g, "$1 = function");
- script = "(function(document){" +script+ "})(NAIBU._temp_doc);"
- try {
- NAIBU.eval(script);
- } catch (e) { //IE9では、documentがconstとして定数指定されているため、引数として指定できない
- script = script.replace(/function\(document\){/, "function() {");
- NAIBU.eval(script);
- }
- tar = evt = script = void 0;
- }, false);
- this.addEventListener("DOMNodeInserted", function(evt){
- var tar = evt.target;
- if (evt.eventPhase === /*Event.BUBBLING_PHASE*/ 3) {
- if (tar.nodeName === "#cdata-section") {
- evt.currentTarget._text = tar.data;
- }
- return;
- }
- tar.addEventListener("DOMNodeInsertedIntoDocument", function(evt){
- var tar = evt.target;
- if (evt.eventPhase === /*Event.AT_TARGET*/ 2 && !tar.getAttributeNodeNS("http://www.w3.org/1999/xlink", "xlink:href")) {
- var evtt = tar.ownerDocument.createEvent("SVGEvents");
- evtt.initEvent("S_Load", false, false);
- evt.currentTarget.dispatchEvent(evtt);
- }
- tar = evt = void 0;
- }, false);
- }, false);
- return this;
-};
-SVGScriptElement.prototype = Object._create(SVGElement);
-
-function SVGEvent() {
- Event.apply(this, arguments);
- return this;
-};
-SVGEvent.prototype = Object._create(Event);
-
-function SVGZoomEvent() {
- UIEvent.apply(this, arguments);
- /*readonly SVGRect*/ this.zoomRectScreen = new SVGRect();
- /*readonly float*/ this.previousScale = 1;
- /*readonly SVGPoint*/ this.previousTranslate = new SVGPoint();
- /*readonly float*/ this.newScale = 1;
- /*readonly SVGPoint*/ this.newTranslate = new SVGPoint();
- return this;
-};
-SVGZoomEvent.prototype = Object._create(UIEvent);
-
-function SVGAnimationElement(es) {
- if (!!es) {
- return this;
- }
- SVGElement.apply(this);
- /*SIEにおけるSVGElementでは、fill属性とStyleSheetを結びつける機構があるため、
- *styleのsetPropertyメソッドを無効化させておく必要がある
- */
- this.style.setProperty = function(){};
- this._tar = null;
- /*readonly SVGElement*/ this.targetElement;
- /*それぞれのプロパティは、_を除いた属性に対応している*/
- this._begin = this._end = this._repeatCount = this._repeatDur = this._dur = this._resatrt = null;
- this._currentFrame = 0;
- /*_isRepeatと_numRepeatは繰り返し再生のときに使う。なお、後者は現在のリピート回数*/
- this._isRepeat = false;
- this._numRepeat = 0;
- /*_isStartプロパティは一度は起動したかどうか*/
- this._isStarted = false;
- /*_startと_finishプロパティはミリ秒数のリストを収納する。
- *_startはアニメ開始時の秒数リスト。_finishはアニメ終了時の秒数のリスト。
- *なお、文書読み込み終了時(アニメ開始時刻)の秒数を0とする。
- *_startingプロパティは現在アニメーションでの開始時刻。getSartTimeメソッドで使う
- */
- this._start = this._finish = this._starting = null;
- /*_activeDurプロパティは現時点でのアニメーションの活動期間*/
- this._activeDur = 0;
- this._from = this._to = this._values = this._by = null;
- this._keyTimes = null;
- this.addEventListener("beginEvent", function(evt) {
- try {
- var tar = evt.target,
- begin = tar.getStartTime(),
- durv = tar._dur,
- dur = tar._getOffset(durv),
- end = tar._finish,
- endv= tar._end,
- td = tar._repeatDur,
- tc = tar._repeatCount,
- ac = null;
- if (end) {
- for (var i=0, eli=end.length;i<eli;++i) {
- /*endの配列(ソース済み)からbeginに最も近い数値を選ぶ*/
- if (end[i] >= begin) {
- end = end[i];
- break;
- }
- }
- } else {
- /*イベント待ちの場合は、endの値を、indefiniteとみなす。参照: http://www.w3.org/TR/smil-animation/#ComputingActiveDur
- *
- * 3.3.4. Computing the active duration
- *
- * If the value of end cannot be resolved (e.g. when it is event-based),
- * the value is considered to be "indefinite" for the purposes of evaluating the active duration.
- *
- */
- endv = null;
- }
- /*Activate Duration (活性持続時間と呼ぶことにする)を計算
- *計算方法は以下を参照のこと
- *http://www.w3.org/TR/smil-animation/#ComputingActiveDur
- *3.3.4. Computing the active duration
- */
- if ((td === "indefinite") || (tc === "indefinite")) {
- if (endv) {
- ac = end - begin;
- } else {
- /*活性持続時間が不定(indefinite)なので、強制的にアニメを終了させる*/
- ac = null;
- }
- } else if (durv === "indefinite") {
- if (!tc && !endv) {
- /*活性持続時間が不定(indefinite)なので、強制的にアニメを終了させる*/
- ac = null;
- } else if (tc && !endv) {
- ac = tar._getOffset(td);
- } else if (!tc && endv) {
- ac = end - begin;
- } else {
- ac = (tar._getOffset(td) > (end - begin)) ? tar._getOffset(td) : (end - begin);
- }
- } else if (durv && !td && !tc && !endv) {
- ac = dur;
- } else if (durv && !td && tc && !endv) {
- ac = dur * (+tc);
- } else if (durv && td && !tc && !endv) {
- ac = tar._getOffset(td);
- } else if (durv && !td && !tc && endv) {
- ac = (dur > (end - begin)) ? dur : (end - begin);
- } else if (durv && td && tc && !endv) {
- ac = (+tc*dur > tar._getOffset(td)) ? +tc*dur : tar._getOffset(td);
- } else if (durv && td && tc && endv) {
- ac = (+tc*dur > Math.min(+td, (end-begin))) ? +tc*dur : Math.min(tar._getOffset(td), (end - begin));
- } else if (durv && td && !tc && endv) {
- ac = (tar._getOffset(td) > (end - begin)) ? tar._getOffset(td) : (end - begin);
- } else if (durv && !td && tc && endv) {
- ac = (+tc*dur > (end - begin)) ? +tc*dur : (end - begin)
- }
- } catch (e) {
- tar.endElementAt(1);
- throw new DOMException(/*DOMException.INVALID_STATE_ERR*/ 11);
- }
- if ((ac || (ac === 0)) && isFinite(ac)) {
- /*endの値がすでにある場合は、二重指定を避ける*/
- endv || tar.endElementAt(ac);
- tar._activeDur = ac;
- }
- tar = begin = dur = durv = end = endv= td = tc = ac = void 0;
- }, false);
- this.addEventListener("DOMAttrModified", function(evt){
- if (evt.eventPhase === /*Event.BUBBLING_PHASE*/ 3) {
- return;
- }
- var tar = evt.target,
- name = evt.attrName,
- evtv = evt.newValue;
- if (name === "begin") {
- tar._begin = evtv.replace(/\s+/g, "").split(";"); //空白は取り除く
- } else if (name === "end") {
- tar._end = evtv.replace(/\s+/g, "").split(";");
- } else if (name === "dur") {
- tar._dur = evtv;
- } else if (name === "repeatCount") {
- tar._repeatCount = evtv;
- tar._isRepeat = true;
- } else if (name === "repeatDur") {
- tar._repeatCount = evtv;
- tar._isRepeat = true;
- } else if (name === "from") {
- tar._from = evtv;
- } else if (name === "to") {
- tar._to = evtv;
- } else if (name === "values") {
- tar._values = evtv.split(";");
- } else if (name === "by") {
- tar._by = evtv;
- } else if (name === "keyTimes") {
- var s = evtv.split(";");
- tar._keyTimes = []; //_keyTimesプロパティを初期化
- for (var i=0;i<s.length;++i) {
- tar._keyTimes[i] = parseFloat(s[i]);
- }
- s = void 0;
- } else if (name === "restart") {
- tar._restart = evtv;
- }
- evt = evtv = void 0;
- }, false);
- this.addEventListener("DOMNodeInserted", function(evt){
- if (evt.eventPhase === /*Event.BUBBLING_PHASE*/ 3) {
- return; //強制終了させる
- }
- var tar = evt.target;
- tar.addEventListener("DOMNodeInsertedIntoDocument", function(evt){
- var tar = evt.target;
- /*以降の場合分けルールに関しては、下記の仕様を参照
- *http://www.jsa.or.jp/stdz/instac/syoukai/H13/H13annual_report/12/ngc-wg3/offline/smil_20_20020131/animation.html#AnimationNS-FromToBy
- */
- if (tar._values) {
- } else if (tar._from && tar._to) {
- tar._values = [tar._from, tar._to];
- } else if (tar._from && tar._by) {
- var n = parseFloat(tar._from) + parseFloat(tar._by), tanni = tar._from.match(/\D+/) || [""];
- tar._values = [tar._from, n+tanni[0]];
- } else if (tar._to) {
- tar._values = [null, tar._to];
- } else if (tar._by) {
- tar._values = [null, null, tar._by];
- } else if (!tar.hasChildNodes() && !tar.hasAttributeNS(null, "path")) { //SVGAnimateMotionElementに留意
- /*アニメーションの効果が出ないように調整する
- *SMILアニメーションの仕様を参照
- *
- *>if none of the from, to, by or values attributes are specified, the animation will have no effect
- *「3.2.2. Animation function values」より引用
- *http://www.w3.org/TR/2001/REC-smil-animation-20010904/#AnimFuncValues
- */
- return this;
- }
- /*begin属性とend属性を処理する*/
- var that = tar,
- timing = function(val, name, offset) {
- /*timing関数は時間のタイミングをidとeventと、clock-value(offset)に分割して処理していく
- *まず、idを検出するためのsearcIdローカル関数を作る
- */
- var searchId = function () {
- var n = val.indexOf(".");
- if ((n > 0) && (/[a-z]/i).test(val.charAt(n+1))) { //. (dot)の後がアルファベットならば
- return (val.slice(0, n));
- }
- n = nn = void 0;
- return "";
- },
- id;
- /*
- *W3CのSMIl AnimationのTimingモデルは7パターンがあるので、場合分けする
- */
- if (isFinite(parseFloat(val))) { //1) offset-valueの場合
- that[name](offset);
- } else if (val.indexOf("repeat(") > -1) { //2) repeat-valueの場合
- var inte = parseFloat(val.slice(7)),
- ds = (function(that, name, offset) {
- return function (evt) {
- if (inte === evt.target._numRepeat) {
- that[name](offset);
- }
- };
- })(that, name, offset),
- id = searchId();
- if (id) {
- that.ownerDocument.getElementById(id).addEventListener("repeatEvent", ds);
- } else {
- that.addEventListener("repeatEvent", ds);
- }
- } else if (/\.(begin|end)/.test(val)) { //3) syncbase-valueの場合
- id = searchId();
- if (id) {
- var ds = (function(that, name, offset) {
- return function (evt) {
- that[name](offset);
- };
- })(that, name, offset),
- ev = "";
- /\.(begin|end)/.test(val); //RegExp.$1のために、もう一度する必要がある
- if (RegExp.$1 === "begin") {
- ev = "beginEvent";
- } else if (RegExp.$1 === "end") {
- ev = "endEvent";
- }
- that.ownerDocument.getElementById(id).addEventListener(ev, ds, false);
- }
- } else if (val.indexOf("wallclock(") === 0) { //4) wallclock-valueの場合
-
- } else if (val === "indefinite") { //5) indefiniteの場合
- } else if (val.indexOf("accesskey(") > -1) { //6) accesskey-valueの場合
-
- } else { //7) event-valueの場合
- id = searchId();
- var ds = (function(that, name, offset) {
- return function (evt) {
- that[name](offset);
- };
- })(that, name, offset);
- if (id && val.match(/\.([a-z]+)/i)) {
- that.ownerDocument.getElementById(id).addEventListener(RegExp.$1, ds);
- } else if (val){
- that.targetElement.addEventListener(val.match(/^[a-z]+/i)[0], ds)
- }
- }
- val = searchId = id = void 0;
- };
- if (tar._begin) {
- for (var i=0,tli=tar._begin.length;i<tli;++i) {
- timing(tar._begin[i], "beginElementAt", tar._getOffset(tar._begin[i]));
- }
- } else {
- tar.beginElementAt(0);
- }
- if (tar._end) {
- for (var i=0,tli=tar._end.length;i<tli;++i) {
- timing(tar._end[i], "endElementAt", tar._getOffset(tar._end[i]));
- }
- }
- that = void 0;
- if (tar.hasAttributeNS("http://www.w3.org/1999/xlink", "xlink:href")) {
- tar.targetElement = tar.ownerDocument.getElementById(tar.getAttributeNS("http://www.w3.org/1999/xlink", "xlink:href").slice(1))
- } else {
- tar.targetElement = tar.parentNode;
- }
- evt = tar = void 0;
- }, false);
- evt = tar = void 0;
- }, false);
- return this;
-};
-SVGAnimationElement.prototype = Object._create(SVGElement);
-/*以下のメソッド(beginElementなど)については、
- *別モジュールであるsmil::ElementTimeControl(smil.js)を参照のこと
- */
-/*void*/ SVGAnimationElement.prototype.beginElement = function() {
- var ttd = this.ownerDocument,
- evt = ttd.createEvent("TimeEvents");
- this._starting = ttd.documentElement.getCurrentTime(); //getStartTimeメソッドで使う開始時刻
- if (this._isStarted && ((this._restart === "never")
- || ((this._restart === "whenNotActive") && (this.getCurrentTime() > 0)))) {
- return; //restart属性の設定により、再起動させないようにする
- }
- if (this.getCurrentTime() > 0) {
- /*アニメーションの最中で、beginEventが起きるときは、endEventが前もって起こされる。SVG1.1の仕様を参照
- *
- * 19.4.2 Interface TimeEvent
- * Note that if an element is restarted while it is currently playing, the element will raise an end event and another begin event, as the element restarts.
- *
- * http://www.w3.org/TR/SVG/animate.html#InterfaceTimeEvent
- *
- */
- this.endElement();
- }
- evt.initTimeEvent("beginEvent", ttd.defaultView, 0);
- this.dispatchEvent(evt);
- /*新しくリストの頭を更新して、別の値も実行させるようにする*/
- this._start && this._start.shift();
- this._isStarted = true;
- ttd = evt = void 0;
-};
-/*void*/ SVGAnimationElement.prototype.endElement = function() {
- var ttd = this.ownerDocument,
- evt = ttd.createEvent("TimeEvents");
- evt.initTimeEvent("endEvent", ttd.defaultView, 0);
- this.dispatchEvent(evt);
- this._finish && this._finish.shift();
- this._currentFrame = 0;
-};
-/*void*/ SVGAnimationElement.prototype.beginElementAt = function(/*float*/ offset) {
- var ntc = this.ownerDocument.documentElement.getCurrentTime(),
- start = this._start || [];
- for (var i=0,sli=start.length;i<sli;++i) {
- if (start[i] === (offset+ntc)) {
- ntc = start = offset = void 0;
- return;
- }
- }
- start.push(offset + ntc);
- start.sort(function(a, b) {
- return a - b;
- });
- this._start = start;
- ntc = start = offset = void 0;
-};
-/*void*/ SVGAnimationElement.prototype.endElementAt = function(/*float*/ offset) {
- var ntc = this.ownerDocument.documentElement.getCurrentTime(),
- fin = this._finish || [];
- for (var i=0,fli=fin.length;i<fli;++i) {
- if (fin[i] === (offset+ntc)) {
- ntc = fin = offset = void 0;
- return;
- }
- }
- fin.push(offset + ntc);
- fin.sort(function(a, b) {
- return a - b;
- });
- this._finish = fin;
- ntc = start = offset = void 0;
-};
-SVGAnimationElement.prototype._eventRegExp = /(mouse|activ|clic|begi|en)[a-z]+/;
-SVGAnimationElement.prototype._timeRegExp = /[\-\d\.]+(h|min|s|ms)?$/;
-SVGAnimationElement.prototype._unit = {
- "h" : 3600000,
- "min" : 60000,
- "s" : 1000
-};
-/*_getOffsetメソッド
- * どれだけズレの時間があるかを計測するメソッド
- *tに数値が使われていないときは0を返す
- *これはSMILアニメーションモジュールの以下の記述にあるように、値のデフォルトが0であることに起因する
- *http://www.w3.org/TR/2001/REC-smil20-20010807/smil-timing.html#Timing-Ex:0DurDiscreteMedia
- *http://www.w3.org/TR/2001/REC-smil20-20010807/smil-timing.html#Timing-DurValueSemantics
- ** Note that when the simple duration is "indefinite", some simple use cases can yield surprising results. See the related example #4 in Appendix B.
- */
-SVGAnimationElement.prototype._getOffset = function(/*string*/ val) {
- var t = null, //tは最初の数値
- n = [val.indexOf("+"), val.indexOf("-")],
- s;
- if (n[0] > -1) {
- s = val.slice(n[0]);
- t = parseFloat(s);
- } else if (n[1] > -1) {
- s = val.slice(n[1]);
- t = parseFloat(s);
- } else {
- s = val;
- t = parseFloat(val);
- }
- if (isFinite(t)) {
- if (/\d+\:(\d\d)\:([\d\.]+)$/.test(s)) { //Full-Clock-Valueの場合
- t = (t*3600 + parseInt(RegExp.$1, 10)*60 + parseFloat(RegExp.$2)) * 1000;
- } else if (/\d\d\:([\d\.]+)$/.test(s)) {
- t = (t*60 + parseFloat(RegExp.$1)) * 1000;
- } else if (/(h|min|s)$/.test(s)) {
- t *= this._unit[RegExp.$1];
- }
- if (isFinite(t)) {
- t *= 0.8;
- return t;
- }
- }
- return 0;
-};
-
-/*float*/ SVGAnimationElement.prototype.getStartTime = function(){
- if (this._starting || (this._starting === 0)) {
- return (this._starting);
- } else {
- throw new DOMException(/*DOMException.INVALID_STATE_ERR*/ 11);
- }
-};
-/*getCurrentTimeメソッド
- *現在の時間コンテナ内での時刻であり、
- *決して現在時刻ではない。要素のbeginイベントの発火したときが0sである。
- */
-/*float*/ SVGAnimationElement.prototype.getCurrentTime = function(){
- return (this._currentFrame * 125 * 0.8);
-};
-/*float*/ SVGAnimationElement.prototype.getSimpleDuration = function(){
- if (!this._dur && !this._finish && (this._dur === "indefinite")) {
- throw new DOMException(/*DOMException.NOT_SUPPORTED_ERR*/ 9);
- } else {
- return (this._getOffset(this._dur));
- }
-};
- //raises( DOMException );
-NAIBU.Time = {
- currentFrame : 0,
- Max : 17000,
- start : function() {
- if (NAIBU.Clip.length > 0) {
- screen.updateInterval = 42; //24fpsとして描画処理
- window.onscroll = function () {
- screen.updateInterval = 0;
- screen.updateInterval = 42;
- }
- NAIBU.stop = setInterval( (function() {
- try {
- var ntc = NAIBU.Time.currentFrame,
- nc = NAIBU.Clip,
- s = ntc * 100; //フレーム数ntcをミリ秒数sに変換 (100 = 125 * 0.8)
- if (ntc > NAIBU.Time.Max) {
- clearInterval(NAIBU.stop);
- }
- nc[0] && nc[0].ownerDocument.documentElement.setCurrentTime(s);
- for (var i=0,ncli=nc.length;i<ncli;++i) {
- var nci = nc[i]
- s2 = s + 100,
- s1 = s - 100;
- if (nci._start) {
- var sti = nci._start[0];
- if (sti && nci._finish && (sti === nci._finish[0])) { //アニメーションの途中ならば
- nci.endElement();
- }
- if ((sti || (sti === 0)) && (s1 <= sti) && (sti < s)) {
- nci.beginElement();
- }
- sti = void 0;
- }
- if (nci._isRepeat && (nci.getCurrentTime() >= nci.getSimpleDuration()*nci._numRepeat)) {
- /*リピート処理*/
- var ttd = nci.ownerDocument,
- evt = ttd.createEvent("TimeEvents");
- ++nci._numRepeat;
- evt.initTimeEvent("repeatEvent", ttd.defaultView, nci._numRepeat);
- nci.dispatchEvent(evt);
- ttd = evt = void 0;
- }
- if (nci._finish && (nci.getCurrentTime() !== 0)) {
- var fti = nci._finish[0];
- if ((fti || (fti === 0)) && (s1 <= fti) && (fti <= s)) {
- nci.endElement();
- }
- fti = void 0;
- }
- if (nci._frame) {
- ++nci._currentFrame;
- nci._frame();
- }
- }
- ++NAIBU.Time.currentFrame;
- ntc = nc = s = nci = s1 = s2 = void 0;
- } catch (e) {
- }
- }),
- 1
- );
- } else {
- window.onscroll = function () {
- screen.updateInterval = 0;
- window.onscroll = NAIBU.emptyFunction;
- }
- }
- }
-};
-NAIBU.Clip = [];
-
-function SVGAnimateElement(){
- SVGAnimationElement.apply(this);
- /*NAIBU.Clipについては、NAIBU.Timeで使う
- *くわしくはNAIBU.Time.start関数のコードを参照
- */
- NAIBU.Clip[NAIBU.Clip.length] = this;
- /*_valueListプロパティは、
- *機械が理解できる形で保管されているvalueの値の配列リスト
- */
- this._valueList = [];
- this._isDiscrete = false;
- this.addEventListener("DOMAttrModified", function(evt){
- if (evt.eventPhase === /*Event.BUBBLING_PHASE*/ 3) {
- return; //強制終了させる
- }
- if ((evt.attrName === "calcMode") && (evt.newValue === "discrete")) {
- evt.target._isDiscrete = true;
- }
- }, false);
- this.addEventListener("DOMNodeInserted", function(evt){
- if (evt.eventPhase === /*Event.BUBBLING_PHASE*/ 3) {
- return; //強制終了させる
- }
- var tar = evt.target;
- tar.addEventListener("DOMNodeInsertedIntoDocument", function(evt){
- var tar = evt.target,
- attrName = tar.getAttributeNS(null, "attributeName"),
- ttr = tar.targetElement,
- tta = ttr[attrName];
- /*tar.valuesのリスト: ["12px", "13px"]
- *tar._valueList: [(new SVGPoint()), (new SVGPoint())]
- * tar.valuesを機械が理解できるように変換したものがtar._valueList
- *この_valueListプロパティはアニメの際に使うので、_valuesプロパティはアニメ中に使わないことに注意
- */
- var vi = ttr.cloneNode(false);
- if (!tar._values[0]) { //to属性か、by属性が設定されている場合
- var ttrs = ttr.ownerDocument.defaultView.getComputedStyle(ttr, "");
- tar._values[0] = ttr.getAttributeNS(null, attrName) || ttrs.getPropertyValue(attrName);
- if (!tar._values[1] && tar._values[2]) { //by属性のみが設定されている場合
- var v2 = parseFloat(tar._values[0]) + parseFloat(tar._values[2]), tanni = tar._values[0].match(/\D+/) || [""];
- tar._values[1] = v2 + tanni[0];
- tar._values.pop();
- v2 = tanni = void 0;
- }
- }
- if (("animatedPoints" in ttr) && (attrName === "points")) {
- ttr.animatedPoints = vi.points;
- for (var i=0, tav=tar._values, tvli=tav.length;i<tvli;++i) {
- var vir = ttr.cloneNode(false);
- delete vir._tar;
- vir.setAttributeNS(null, "points", tav[i]);
- tar._valueList[tar._valueList.length] = vir.points;
- }
- } else if (!!tta) {
- tta.animVal = vi[attrName].baseVal;
- for (var i=0, tav=tar._values, tvli=tav.length;i<tvli;++i) {
- var vir = ttr.cloneNode(false); //仮の要素
- delete vir._tar;
- vir.setAttributeNS(null, attrName, tav[i]);
- tar._valueList[tar._valueList.length] = vir[attrName].baseVal;
- }
- } else if (!!CSS2Properties[attrName] || attrName.indexOf("-") > -1) { //スタイルシートのプロパティならば
- for (var i=0, tav=tar._values, tvli=tav.length;i<tvli;++i) {
- if ((attrName === "fill") || (attrName === "stroke") || (attrName === "stop-color")) {
- tar._valueList[i] = new SVGPaint();
- tar._valueList[i].setPaint(1, null, tav[i], null)
- } else {
- tar._valueList[i] = parseFloat(tav[i]);
- }
- }
- } else if (("normalizedPathSegList" in ttr) && (attrName === "d")) {
- ttr.animatedNormalizedPathSegList = vi.normalizedPathSegList;
- for (var i=0, tav=tar._values, tvli=tav.length;i<tvli;++i) {
- var vir = ttr.cloneNode(false);
- delete vir._tar;
- vir.setAttributeNS(null, "d", tav[i]);
- tar._valueList[tar._valueList.length] = vir.normalizedPathSegList;
- }
- } else {
- vi = void 0;
- return;
- }
- evt = tta = vir = vi = void 0;
- }, false);
- }, false);
- this.addEventListener("beginEvent", function(evt) {
- var _tar = evt.target,
- attrName = _tar.getAttributeNS(null, "attributeName"),
- newAttr = _tar.targetElement.attributes.getNamedItemNS(null, attrName),
- ttr = _tar.targetElement,
- tta = ttr[attrName];
- _tar._frame = function() {
- var tar = _tar,
- d = tar._isRepeat ? tar.getSimpleDuration() : tar._activeDur,
- n = tar._valueList.length-1,
- tg = tar.getCurrentTime();
- tar._activeDur || (d = 0);
- d *= 0.8;
- if ((n !== -1) && (d !== 0) && (tg <= d)) {
- if (tar._isDiscrete) {
- ++n; //discreteモードは他のモードに比べて、分割数が多いことに注意
- }
- var ii = Math.floor((tg*n) / d);
- if (ii === n) { //iiが境い目のときは、n-2を適用
- ii -= 1;
- }
- } else {
- return;
- }
- /*setAttrbute(NS)メソッドはDOM属性を書き換えるため利用しない。
- *
- * 参照:アニメーションサンドイッチモデル
- * >アニメーションが起動している時,それは実際,DOMの中の属性値は変化しない。
- *http://www.jsa.or.jp/stdz/instac/syoukai/H13/H13annual_report/12/ngc-wg3/offline/smil_20_20020131/animation.html#animationNS-AnimationSandwichModel
- */
- var evt = tar.ownerDocument._domnodeEvent();
- if (tar._keyTimes) {
- var di = (tar._keyTimes[ii+1] - tar._keyTimes[ii]) * d;
- var ti = tar._keyTimes[ii];
- } else {
- var di = d / n; //keyTimesがなければ均等に時間を配分しておく
- var ti = ii / n;
- }
- if (("animatedPoints" in ttr) && (attrName === "points")) {
- var base = ttr.points;
- ttr.points = ttr.animatedPoints;
- ttr.dispatchEvent(evt);
- ttr.animatedPoints = ttr.points;
- ttr.points = base;
- } else if (!!tta) {
- var base = tta.baseVal, tanim = tta.animVal;
- var v1 = tar._valueList[ii].value;
- /*vを求める公式に関しては、SMIL2.0 Animation Moduleの単純アニメーション関数の項を参照
- * 3.4.2 Specifying the simple animation function f(t)
- *http://www.w3.org/TR/2005/REC-SMIL2-20050107/animation.html#animationNS-SpecifyingAnimationFunction
- */
- if (!tar._isDiscrete) {
- var v2 = tar._valueList[ii+1].value, v = v1 + (v2-v1) * (tg-ti*d) / di;
- } else {
- var v = v1;
- }
- tanim.newValueSpecifiedUnits(base.unitType, v);
- tta.baseVal = tanim;
- tanim = void 0;
- ttr.dispatchEvent(evt);
- /*変化値はanimValプロパティに収納しておき、
- *変化する前の、元の値はbaseValプロパティに再び収納しておく
- */
- tta.animVal = tta.baseVal;
- tta.baseVal = base;
- di = void 0;
- } else if (!!CSS2Properties[attrName] || attrName.indexOf("-") > -1) { //スタイルシートのプロパティならば
- var base = null;
- var v1 = tar._valueList[ii].value, v2 = tar._valueList[ii+1].value;
- if (!tar._isDiscrete) {
- var v = v1 + (v2-v1) * (tg-ti*d) / di;
- } else {
- var v = v1;
- }
- } else if (("normalizedPathSegList" in ttr) && (attrName === "d")) {
- var base = ttr.normalizedPathSegList;
- ttr.normalizedPathSegList = ttr.animatedNormalizedPathSegList;
- ttr.dispatchEvent(evt);
- ttr.animatedNormalizedPathSegList = ttr.normalizedPathSegList;
- ttr.normalizedPathSegList = base;
- }
- evt = tar = v1 = v2 = v = d = n = ii = tg = void 0;
- };
- evt = vir = void 0;
- }, false);
- this.addEventListener("endEvent", function(evt) {
- var tar = evt.target,
- fill = tar.getAttributeNS(null, "fill");
- if (!fill || (fill === "remove")) {
- var evt = tar.ownerDocument._domnodeEvent();
- tar.targetElement.dispatchEvent(evt);
- evt = void 0;
- tar._frame && tar._frame();
- }
- delete tar._frame;
- }, false);
- this.addEventListener("repeatEvent", function(evt) {
- var tar = evt.target;
- }, false);
- return this;
-};
-SVGAnimateElement.prototype = Object._create(SVGAnimationElement);
-
-function SVGSetElement(){
- SVGAnimationElement.apply(this);
- NAIBU.Clip[NAIBU.Clip.length] = this;
- this._to = "";
- this.addEventListener("DOMAttrModified", function(evt) {
- var tar = evt.target, name = evt.attrName;
- if (name === "to") {
- tar._to = evt.newValue;
- }
- tar = name = void 0;
- }, false);
- this.addEventListener("beginEvent", function(evt) {
- var tar = evt.target;
- tar._currentFrame = 1; //これがないと、NAIBU.stopの内部の処理の都合上、endEventが発動しない。
- if (tar.targetElement) {
- var attrName = tar.getAttributeNS(null, "attributeName"),
- newAttr = tar.targetElement.attributes.getNamedItemNS(null, attrName),
- tta = tar.targetElement[attrName];
- if (!!CSS2Properties[attrName] || attrName.indexOf("-") > -1) { //スタイルシートのプロパティならば
- /*前もって、スタイルシートの値を取得しておいて、endEventの際に使う*/
- tar._prestyle = tar.ownerDocument.defaultView.getComputedStyle(tar.targetElement, "").getPropertyValue(attrName);
- var style = tar.ownerDocument.getOverrideStyle(tar.targetElement, "");
- style.setProperty(attrName, tar.getAttributeNS(null, "to"), null);
- style = void 0;
- } else if (!!tta) {
- var base = tta.baseVal;
- if (base instanceof SVGLength) {
- tta.baseVal = tar.ownerDocument.documentElement.createSVGLength();
- } else if (base instanceof SVGRect) {
- tta.baseVal = tar.ownerDocument.documentElement.createSVGRect();
- }
- /*setAttrbute(NS)メソッドはDOM属性を書き換えるため利用しない。
- *
- * 参照:アニメーションサンドイッチモデル
- * >アニメーションが起動している時,それは実際,DOMの中の属性値は変化しない。
- *http://www.jsa.or.jp/stdz/instac/syoukai/H13/H13annual_report/12/ngc-wg3/offline/smil_20_20020131/animation.html#animationNS-AnimationSandwichModel
- */
- var evt = tar.ownerDocument.createEvent("MutationEvents");
- evt.initMutationEvent("DOMAttrModified", true, false, newAttr, newAttr, tar._to, attrName, /*MutationEvent.MODIFICATION*/ 1);
- tar.targetElement.dispatchEvent(evt);
- evt = void 0;
- /*変化値はanimValプロパティに収納しておき、
- *変化する前の、元の値はbaseValプロパティに再び収納しておく
- */
- tta.animVal = tta.baseVal;
- tta.baseVal = base;
- }
- }
- evt = tar = attrName = void 0;
- }, false);
- this.addEventListener("endEvent", function(evt) {
- var tar = evt.target,
- fill = tar.getAttributeNS(null, "fill");
- if (!fill || (fill === "remove")) {
- var attrName = tar.getAttributeNS(null, "attributeName"),
- style = tar.ownerDocument.getOverrideStyle(tar.targetElement, "");
- if (tar._prestyle) { //スタイルシートの変更ならば
- style.setProperty(attrName, tar._prestyle, null);
- } else {
- var evtt = tar.ownerDocument._domnodeEvent();
- tar.targetElement.dispatchEvent(evtt);
- }
- attrName = style = evtt = void 0;
- }
- tar = fill = void 0;
- }, false);
- this.addEventListener("repeatEvent", function(evt) {
- var tar = evt.target, attrName = tar.getAttributeNS(null, "attributeName"), style = tar.ownerDocument.defaultView.getComputedStyle(tar.targetElement, "");
- }, false);
- return this;
-};
-SVGSetElement.prototype = new SVGAnimationElement(1);
-
-function SVGAnimateMotionElement(){
- SVGAnimationElement.apply(this);
- NAIBU.Clip[NAIBU.Clip.length] = this;
- this.addEventListener("DOMAttrModified", function(evt){
- if (evt.eventPhase === /*Event.BUBBLING_PHASE*/ 3) {
- return;
- }
- var tar = evt.target,
- name = evt.attrName;
- if (name === "path") {
- var d = tar.ownerDocument.createElementNS("http://www.w3.org/2000/svg", "path");
- d.setAttributeNS(null, "d", evt.newValue);
- tar._path = d;
- d = void 0;
- }
- }, false);
- this.addEventListener("DOMNodeInserted", function(evt){
- if (evt.eventPhase === /*Event.BUBBLING_PHASE*/ 3) {
- return; //強制終了させる
- }
- var tar = evt.target;
- tar.addEventListener("DOMNodeInsertedIntoDocument", function(evt){
- var vlist = [],
- ti;
- if (tar._values) {
- for (var i=0, tav=tar._values, tvli=tav.length;i<tvli;++i) {
- ti = tav[i];
- ti = ti.split(",");
- vlist[i] = [+ti[0], +ti[1]];
- }
- tar._valueList = vlist;
- }
- }, false);
- }, false);
- this.addEventListener("beginEvent", function(evt) {
- var tar = evt.target,
- trans = tar.targetElement.transform;
- /*アニメーション中に変化すべき値をanimValプロパティに入力して、
- *baseValと同じような値に設定。
- */
- trans.animVal = new SVGTransformList();
- if (trans.baseVal.numberOfItems !== 0) {
- trans.baseVal.consolidate();
- trans.animVal.initialize(trans.baseVal.createSVGTransformFromMatrix(trans.baseVal.getItem(0).matrix));
- } else {
- trans.animVal.appendItem(tar.ownerDocument.documentElement.createSVGTransform());
- }
- tar._frame = function() {
- var _tar = tar,
- tpn = _tar._path,
- tgsd = _tar._isRepeat ? _tar.getSimpleDuration() : _tar._activeDur,
- d = tgsd * 0.8,
- tg = _tar.getCurrentTime(),
- ii;
- _tar._activeDur || (d = 0);
- if (tgsd === 0) {
- tgsd = void 0;
- return;
- }
- if (tpn) { //path属性が指定されていた場合、tpnは属性値となる
- var st = tpn.getTotalLength() * tg / d, //stは現在に至るまでの距離
- p = tpn.getPointAtLength(st),
- trans = _tar.targetElement.transform;
- trans.animVal.getItem(trans.animVal.numberOfItems-1).setTranslate(p.x, p.y);
- var base = trans.baseVal;
- trans.baseVal = trans.animVal;
- _tar.targetElement._cacheMatrix = null;
- var evtt = _tar.ownerDocument.createEvent("MutationEvents");
- evtt.initMutationEvent("DOMNodeInsertedIntoDocument", false, false, null, null, null, null, null);
- _tar.targetElement.dispatchEvent(evtt);
- trans.baseVal = base;
- evtt = base = trans = st = p = void 0;
- } else if (tar._valueList) {
- var total = 0, //totalは総距離
- st = 0, //stは現在にいたるまでの距離
- tav = tar._valueList,
- n = tav.length - 1;
- if ((n !== -1) && (d !== 0) && (tg <= d)) {
- ii = Math.floor((tg*n) / d);
- if (ii === n) { //iiが境い目のときは、n-2を適用
- ii -= 1;
- }
- } else {
- return;
- }
- for (var i=1, tvli=tav.length;i<tvli;i+=2) {
- total += Math.sqrt(Math.pow(tav[i][1] - tav[i-1][1], 2) + Math.pow(tav[i][0] - tav[i-1][0], 2));
- }
- for (var i=1;i<ii;i+=2) {
- st += Math.sqrt(Math.pow(tav[i][1] - tav[i-1][1], 2) + Math.pow(tav[i][0] - tav[i-1][0], 2));
- }
- var p = tar.ownerDocument.documentElement.createSVGPoint(),
- trans = _tar.targetElement.transform;
- st = (st / total) * d;
- p.x = tav[ii][0] + (tav[ii+1][0] - tav[ii][0]) * (tg - st) / d;
- p.y = tav[ii][1] + (tav[ii+1][1] - tav[ii][1]) * (tg - st) / d;
- trans.animVal.getItem(trans.animVal.numberOfItems-1).setTranslate(p.x, p.y);
- var base = trans.baseVal;
- trans.baseVal = trans.animVal;
- _tar.targetElement._cacheMatrix = void 0;
- var evtt = _tar.ownerDocument.createEvent("MutationEvents");
- evtt.initMutationEvent("DOMNodeInsertedIntoDocument", false, false, null, null, null, null, null);
- _tar.targetElement.dispatchEvent(evtt);
- trans.baseVal = base;
- evtt = base = trans = st = p = i = void 0;
- }
- }
- evt = trans = tpn = tgsd = void 0;
- }, false);
- this.addEventListener("endEvent", function(evt) {
- var tar = evt.target,
- trans = tar.targetElement.transform,
- fill = tar.getAttributeNS(null, "fill"),
- tavli = tar._valueList,
- tb;
- if (!fill || (fill === "remove")) {
- /*アニメが開始される前の状態に戻す*/
- var evtt = tar.ownerDocument._domnodeEvent();
- tar.targetElement.dispatchEvent(evtt);
- tar._frame && tar._frame();
- } else {
- /*_frame関数で終了位置に会わないことがあるので、以下の処理で位置を修正*/
- trans.animVal.getItem(trans.animVal.numberOfItems-1).setTranslate(tavli[tavli.length-1][0], tavli[tavli.length-1][1]);
- tb = trans.baseVal;
- trans.baseVal = trans.animVal;
- var evtt = tar.ownerDocument._domnodeEvent();
- tar.targetElement.dispatchEvent(evtt);
- trans.baseVal = tb;
- }
- delete tar._frame;
- evt = evtt = trans = fill = tar = tavli = tb = void 0;
- }, false);
- this.addEventListener("repeatEvent", function(evt) {
- var tar = evt.target;
- }, false);
- return this;
-};
-SVGAnimateMotionElement.prototype = Object._create(SVGAnimationElement);
-
-function SVGMPathElement() /* :
- SVGElement,
- SVGURIReference,
- SVGExternalResourcesRequired*/ {
- SVGElement.apply(this);
- SVGURIReference.apply(this);
- return this;
-};
-SVGMPathElement.prototype = Object._create(SVGElement);
-
-function SVGAnimateColorElement() {
- SVGAnimationElement.apply(this);
- NAIBU.Clip[NAIBU.Clip.length] = this;
- this._valueList = [];
- this.addEventListener("DOMNodeInserted", function(evt){
- if (evt.eventPhase === /*Event.BUBBLING_PHASE*/ 3) {
- return; //強制終了させる
- }
- var tar = evt.target;
- tar.addEventListener("DOMNodeInsertedIntoDocument", function(evt){
- var tar = evt.target,
- attrName = tar.getAttributeNS(null, "attributeName"),
- ttr = tar.targetElement,
- fstyle = tar.ownerDocument.defaultView.getComputedStyle(ttr, ""),
- css, n;
- if (!tar._values[0]) {
- tar._values[0] = fstyle.getPropertyValue(attrName);
- }
- for (var i=0, tav=tar._values, tvli=tav.length;i<tvli;++i) {
- var to = new SVGColor();
- if (tar._values[i] === "currentColor") {
- to.setRGBColor(fstyle.getPropertyValue("color") || "black");
- } else if (tar._values[i] === "inherit") {
- /*いったん、cssValueTypeプロパティをinheritに指定して、継承元のオブジェクトを取得*/
- css = fstyle.getPropertyCSSValue(attrName);
- n = css.cssValueType;
- css.cssValueType = /*CSSValue.CSS_INHERIT*/ 0;
- to = fstyle.getPropertyCSSValue(attrName);
- css.cssValueType = n;
- } else {
- to.setRGBColor(tar._values[i]);
- }
- tar._valueList[tar._valueList.length] = to;
- to = void 0;
- }
- tar = ttr = fstyle = css = n = attrName = void 0;
- }, false);
- }, false);
- this.addEventListener("beginEvent", function(evt) {
- var tar = evt.target,
- attrName = tar.getAttributeNS(null, "attributeName"),
- style = tar.ownerDocument.getOverrideStyle(tar.targetElement, ""),
- fstyle = tar.ownerDocument.defaultView.getComputedStyle(tar.targetElement, "");
- tar._frame = function() {
- var _tar = tar;
- /*公式に関しては、SMIL2.0 Animation Moduleの単純アニメーション関数の項を参照
- * 3.4.2 Specifying the simple animation function f(t)
- *http://www.w3.org/TR/2005/REC-SMIL2-20050107/animation.html#animationNS-SpecifyingAnimationFunction
- */
- var d = _tar._isRepeat ? _tar.getSimpleDuration() : _tar._activeDur,
- n = _tar._valueList.length - 1,
- tg = _tar.getCurrentTime(),
- ii, di, ti;
- _tar._activeDur || (d = 0);
- d *= 0.8;
- if ((n !== -1) && (d !== 0) && (tg <= d)) {
- ii = Math.floor((tg*n) / d);
- if (ii === n) { //iiが境い目のときは、n-2を適用
- ii -= 1;
- }
- } else {
- return;
- }
- if (tar._keyTimes) {
- di = (tar._keyTimes[ii+1] - tar._keyTimes[ii]) * d;
- ti = tar._keyTimes[ii];
- } else {
- di = d / n; //keyTimesがなければ均等に時間を配分しておく
- ti = ii / n;
- }
- var fc = _tar._valueList[ii].rgbColor,
- tc = _tar._valueList[ii+1].rgbColor,
- durd = (tg-ti*d) / di,
- num = /*CSSPrimitiveValue.CSS_NUMBER*/ 1,
- fr = fc.red.getFloatValue(num),
- fg = fc.green.getFloatValue(num),
- fb = fc.blue.getFloatValue(num),
- r = fr + (tc.red.getFloatValue(num) - fr) * durd,
- g = fg + (tc.green.getFloatValue(num) - fg) * durd,
- b = fb + (tc.blue.getFloatValue(num) - fb) * durd;
- style.setProperty(attrName, "rgb(" +Math.ceil(r)+ "," +Math.ceil(g)+ "," +Math.ceil(b)+ ")", null);
- _tar = d = n = tg = fc = tc = fr = fg = fb = num = r = g = b = ii = void 0;
- };
- tar._frame();
- }, false);
- this.addEventListener("endEvent", function(evt) {
- var tar = evt.target,
- fill = tar.getAttributeNS(null, "fill");
- if (!fill || (fill === "remove")) {
- var evtt = tar.ownerDocument._domnodeEvent();
- tar.targetElement.dispatchEvent(evtt);
- tar._frame && tar._frame();
- }
- delete tar._frame;
- evt = evtt = tar = fill = void 0;
- }, false);
- this.addEventListener("repeatEvent", function(evt) {
- var tar = evt.target;
- }, false);
- return this;
-};
-SVGAnimateColorElement.prototype = Object._create(SVGAnimationElement);
-
-function SVGAnimateTransformElement() {
- SVGAnimationElement.apply(this);
- NAIBU.Clip[NAIBU.Clip.length] = this;
- this.addEventListener("beginEvent", function(evt) {
- var tar = evt.target, trans = tar.targetElement.transform;
- /*アニメーション中に変化すべき値をanimValプロパティに入力して、
- *baseValと同じような値に設定。
- */
- trans.animVal = new SVGTransformList();
- if (trans.baseVal.numberOfItems !== 0) {
- trans.animVal.initialize(trans.baseVal.createSVGTransformFromMatrix(trans.baseVal.getItem(0).matrix));
- }
- trans.animVal.appendItem(tar.ownerDocument.documentElement.createSVGTransform());
- }, false);
- this.addEventListener("endEvent", function(evt) {
- var tar = evt.target,
- fill = tar.getAttributeNS(null, "fill");
- if (!fill || (fill === "remove")) {
- var evtt = tar.ownerDocument._domnodeEvent();
- tar.targetElement.dispatchEvent(evtt);
- tar._frame && tar._frame();
- }
- delete tar._frame;
- evt = evtt = tar = fill = void 0;
- }, false);
- this.addEventListener("repeatEvent", function(evt) {
- var tar = evt.target;
- }, false);
- return this;
-};
-SVGAnimateTransformElement.prototype = Object._create(SVGAnimationElement);
-
-function SVGFontElement() /*:
- SVGElement,
- SVGExternalResourcesRequired,
- SVGStylable*/ {
- SVGElement.apply(this);
- /*_isExternalは外部から呼び出されたfont要素ならば、真(1)となる*/
- /*boolean or number*/ this._isExternal = 0;
- this.addEventListener("DOMNodeInserted", function(evt){
- var tar = evt.target;
- if (evt.eventPhase === /*Event.BUBBLING_PHASE*/ 3) {
- return;
- }
- tar.addEventListener("DOMNodeInsertedIntoDocument", function(evt){
- var tar = evt.target, svgns = "http://www.w3.org/2000/svg", fontFace = tar.getElementsByTagNameNS(svgns, "font-face").item(0);
- var nefunc = function(evt){
- var svg = evt.target;
- /*以下のtarはfont要素*/
- var familyName = fontFace.getAttributeNS(null, "font-family");
- var textElements = tar.ownerDocument.getElementsByTagNameNS(svgns, "text");
- for (var i=0,_tar=tar,tli=textElements.length;i<tli;++i) {
- var ti = textElements[i], style = _tar.ownerDocument.defaultView.getComputedStyle(ti, '');
- if (style.getPropertyValue("font-family", null).indexOf(familyName) > -1) {
- NAIBU._noie_createFont(ti, _tar, true);
- }
- }
- evt = tar = svg = curt = textElments = svgns = _tar = void 0;
- };
- if (!fontFace.__isLinked || tar._isExternal) {
- tar.ownerDocument.documentElement._svgload_limited = 0;
- tar.ownerDocument.documentElement.addEventListener("SVGLoad", nefunc, false);
- }
- }, false);
- }, false);
- return this;
-};
-SVGFontElement.prototype = Object._create(SVGElement);
-
-function SVGGlyphElement() /*:
- SVGElement,
- SVGStylable*/ {
- SVGElement.apply(this);
- return this;
-};
-SVGGlyphElement.prototype = Object._create(SVGElement);
-
-function SVGMissingGlyphElement() /*:
- SVGElement,
- SVGStylable*/ {
- SVGElement.apply(this);
- return this;
-};
-SVGMissingGlyphElement.prototype = Object._create(SVGElement);
-
-function SVGHKernElement() {
- SVGElement.apply(this);
- return this;
-};
-SVGHKernElement.prototype = Object._create(SVGElement);
-
-function SVGVKernElement() {
- SVGElement.apply(this);
- return this;
-};
-SVGVKernElement.prototype = Object._create(SVGElement);
-
-function SVGFontFaceElement() {
- SVGElement.apply(this);
- /*boolean(or number)*/ this._isLinked = 0;
- this.addEventListener("DOMNodeInserted", function(evt){
- if (evt.eventPhase === /*Event.BUBBLING_PHASE*/ 3) {
- if (evt.target.localName === "font-face-uri") { //外部リンクがあれば
- evt.currentTarget._isLinked = 1;
- }
- return; //強制終了させる
- }
- }, false);
- return this;
-};
-SVGFontFaceElement.prototype = Object._create(SVGElement);
-
-function SVGFontFaceSrcElement() {
- SVGElement.apply(this);
- return this;
-};
-SVGFontFaceSrcElement.prototype = Object._create(SVGElement);
-
-function SVGFontFaceUriElement() {
- SVGElement.apply(this);
- this.addEventListener("DOMNodeInserted", function(evt){
- if (evt.eventPhase === /*Event.BUBBLING_PHASE*/ 3) {
- return; //強制終了させる
- }
- evt.target.ownerDocument.documentElement._svgload_limited--
- evt.target.setAttributeNS("http://www.w3.org/1999/xlink", "xlink:show", "embed");
- }, false);
- this.addEventListener("S_Load", function(evt){
- var tar = evt.target, tpp = tar.parentNode.parentNode.parentNode;
- if (tpp.localName === "defs") {
- tpp = tar.parentNode.parentNode; //tppをfont-face要素としておく
- }
- tar._instance._isExternal = 1;
- tpp.parentNode.appendChild(tar._instance);
- evt = tar = tpp = void 0;
- }, false);
- SVGURIReference.apply(this);
- return this;
-};
-SVGFontFaceUriElement.prototype = Object._create(SVGElement);
-
-function SVGFontFaceFormatElement() {
- SVGElement.apply(this);
- return this;
-};
-SVGFontFaceFormatElement.prototype = Object._create(SVGElement);
-
-function SVGFontFaceNameElement() {
- SVGElement.apply(this);
- return this;
-};
-SVGFontFaceNameElement.prototype = Object._create(SVGElement);
-
-function SVGDefinitionSrcElement() {
- SVGElement.apply(this);
- return this;
-};
-SVGDefinitionSrcElement.prototype = Object._create(SVGElement);
-
-function SVGMetadataElement() {
- SVGElement.apply(this);
- return this;
-};
-SVGMetadataElement.prototype = Object._create(SVGElement);
-
-function SVGForeignObjectElement() /*:
- SVGElement,
- SVGTests,
- SVGLangSpace,
- SVGExternalResourcesRequired,
- SVGStylable,
- SVGTransformable,
- events::EventTarget*/ {
- SVGElement.apply(this);
- var sl = SVGAnimatedLength;
- /*readonly SVGAnimatedLength*/ this.x = new sl();
- /*readonly SVGAnimatedLength*/ this.y = new sl();
- /*readonly SVGAnimatedLength*/ this.width = new sl();
- /*readonly SVGAnimatedLength*/ this.height = new sl();
- sl = void 0;
- return this;
-};
-SVGForeignObjectElement.prototype = Object._create(SVGElement);
-
-//#endif _SVG_IDL_
-/*SVGの要素マッピング(DOMでは定められていないが、必須)
- *本来であれば、SVGDocumentのcreateElementNSメソッドを上書きすることが望ましいが、
- *SIEでは軽量化のために、マッピングを用いた
- */
-DOMImplementation["http://www.w3.org/2000/svg"] = {
- Document: SVGDocument,
- svg: SVGSVGElement,
- g: SVGGElement,
- path: NAIBU.SVGPathElement,
- title: SVGTitleElement,
- desc: SVGDescElement,
- defs: SVGDefsElement,
- linearGradient: SVGLinearGradientElement,
- radialGradient: SVGRadialGradientElement,
- stop: SVGStopElement,
- rect: SVGRectElement,
- circle: SVGCircleElement,
- ellipse: SVGEllipseElement,
- polyline: SVGPolylineElement,
- polygon: SVGPolygonElement,
- text: SVGTextElement,
- tspan: SVGTSpanElement,
- image: SVGImageElement,
- line: SVGLineElement,
- a: SVGAElement,
- altGlyphDef: SVGAltGlyphDefElement,
- altGlyph: SVGAltGlyphElement,
- altGlyphItem: SVGAltGlyphItemElement,
- animateColor: SVGAnimateColorElement,
- animate: SVGAnimateElement,
- animateMotion: SVGAnimateMotionElement,
- animateTransform:SVGAnimateTransformElement,
- clipPath: SVGClipPathElement,
- colorProfile: SVGColorProfileElement,
- cursor: SVGCursorElement,
- definitionSrc: SVGDefinitionSrcElement,
- feBlend: SVGFEBlendElement,
- feGaussianBlur: SVGFEGaussianBlurElement,
- filter: SVGFilterElement,
- font: SVGFontElement,
- "font-face": SVGFontFaceElement,
- "font-face-format":SVGFontFaceFormatElement,
- "font-face-name":SVGFontFaceNameElement,
- "font-face-src": SVGFontFaceSrcElement,
- "font-face-uri": SVGFontFaceUriElement,
- foreignObject: SVGForeignObjectElement,
- glyph: SVGGlyphElement,
- glyphRef: SVGGlyphRefElement,
- hkern: SVGHKernElement,
- marker: SVGMarkerElement,
- mask: SVGMaskElement,
- metadata: SVGMetadataElement,
- missingGlyph: SVGMissingGlyphElement,
- mpath: SVGMPathElement,
- script: SVGScriptElement,
- set: SVGSetElement,
- style: SVGStyleElement,
- "switch": SVGSwitchElement,
- "symbol": SVGSymbolElement,
- textPath: SVGTextPathElement,
- tref: SVGTRefElement,
- use: SVGUseElement,
- view: SVGViewElement,
- vkern: SVGVKernElement,
- pattern: SVGPatternElement
-};
-
-NAIBU._fontSearchURI = function(evt){
- var doc = evt.target.ownerDocument;
- var tsrc = doc.getElementsByTagNameNS("http://www.w3.org/2000/svg", "font-face-uri");
- for (var i=0;i<tsrc.length;++i) {
- var src = tsrc[i].getAttributeNS("http://www.w3.org/1999/xlink", "href"),
- ids = src.split(":")[1],
- xmlhttp = NAIBU.xmlhttp;
- xmlhttp.open("GET", src.replace(/#.+$/, ""), true);
- xmlhttp.setRequestHeader("X-Requested-With", "XMLHttpRequest");
- xmlhttp.onreadystatechange = function() {
- if ((xmlhttp.readyState === 4) && (xmlhttp.status === 200)) {
- var doce = (new DOMParser()).parseFromString(xmlhttp.responseText, "text/xml");
- NAIBU._font({document:doce, docu:doc, id:ids});
- xmlhttp = doc = doce = void 0;
- }
- };
- xmlhttp.send(null);
- }
-};
-/*_font関数は、SVGFontで使う*/
-NAIBU._font = function (data) {
- var doc = data.document, svgns = "http://www.w3.org/2000/svg";
- //getElementByIdは使えないので注意(DOMParserを使った場合、DTDでの指定が必要)
- var font = doc.getElementsByTagNameNS(svgns, "font").item(0);
- var familyName = font.getElementsByTagNameNS(svgns, "font-face").item(0).getAttributeNS(null, "font-family");
- if (familyName && (font.getAttributeNS(null, "id") === data.id)) {
- var textElements = data.docu.getElementsByTagNameNS(svgns, "text");
- for (var i=0,tli=textElements.length;i<tli;++i) {
- var ti = textElements[i], style = data.docu.defaultView.getComputedStyle(ti, '');
- if (style.getPropertyValue("font-family", null).indexOf(familyName) > -1) {
- NAIBU._noie_createFont(ti, font, false);
- }
- }
- }
- doc = data = void 0;
-};
-NAIBU._noie_createFont = function(/*Element*/ ti, /*Element*/ font, /*boolean*/ isMSIE) {
- var style = ti.ownerDocument.defaultView.getComputedStyle(ti, ''),
- svgns = "http://www.w3.org/2000/svg",
- //isTategakiは縦書きならば真
- isTategaki = ti.getAttributeNS(null, "writing-mode") || ti.parentNode.getAttributeNS(null, "writing-mode"),
- horizOrVert = isTategaki ? "vert-adv-y" : "horiz-adv-x",
- node = ti.firstChild, data, glyphs = font.getElementsByTagNameNS(svgns, "glyph"),
- em = parseFloat(font.getElementsByTagNameNS(svgns, "font-face").item(0).getAttributeNS(null, "units-per-em") || 1000),
- advX = parseFloat( (font.getAttributeNS(null, horizOrVert) || em) ), //字幅の設定
- dx = parseFloat(ti.getAttributeNS(null, "x") || 0),
- dy = parseFloat(ti.getAttributeNS(null, "y") || 0),
- fontSize = parseFloat(style.getPropertyValue("font-size")),
- fe = fontSize / em,
- ds = false, npdlist = ["fill",
- "fill-opacity",
- "stroke",
- "stroke-width",
- "stroke-linecap",
- "stroke-linejoin",
- "stroke-miterlimit",
- "stroke-dasharray",
- "stroke-opacity",
- "opacity",
- "cursor"];
- if (/a/[-1] === 'a') { //Firefoxならば
- ds = true;
- } else if (isMSIE || isTategaki) {
- ds = true;
- }
- if (ds){
- while(node) {
- if (!glyphs) {
- break;
- }
- data = node.data;
- if (data !== void 0) { //dataがある場合
- var advanceX = [], glyphData = [];
- for (var i=0,gli=glyphs.length;i<gli;++i) {
- var glyph = glyphs[i], unicode = glyph.getAttributeNS(null, "unicode") || "なし"; //unicode属性に指定がない場合、処理させないようにする
- var orientation = glyph.getAttributeNS(null, "orientation"), isVert = true, isOrientationAttribute = true;
- if (orientation) {
- if (orientation === "h") {
- isVert = false;
- }
- } else {
- isOrientationAttribute = false;
- }
- if ( (isTategaki && isVert) || !(isTategaki || isVert) || !isOrientationAttribute){
- //indexは該当する文字が何番目にあるかの数字
- var index = data.indexOf(unicode);
- while (index > -1) {
- advanceX[index] = parseFloat(glyph.getAttributeNS(null, horizOrVert) || advX); //字幅を収納
- glyphData[index] = glyph.getAttributeNS(null, "d");
- index = data.indexOf(unicode, index+1);
- }
- }
- }
- for (var i=0,adv=0;i<data.length;++i) {
- if (advanceX[i] !== void 0) { //配列に含まれていれば
- var path = ti.ownerDocument.createElementNS(svgns, "path");
- //advance、すなわち字幅の長さ分、ずらしていく
- var matrix = ti.ownerDocument.documentElement.createSVGMatrix();
- matrix.a = fe;
- matrix.d = -fe;
- for (var j=0;j<npdlist.length;++j){
- var nj = npdlist[j],
- tg = ti.getAttributeNS(null, nj) || style.getPropertyValue(nj);
- if (nj === "stroke-width") {
- tg = style.getPropertyCSSValue(nj).getFloatValue(1) / fe;
- tg += "";
- }
- if (tg) {
- path.setAttributeNS(null, nj, tg);
- }
- }
- if (isTategaki) {
- var y= dy + adv*fe, x = dx;
- if ("、。".indexOf(data.charAt(i)) > -1) { //句読点の場合
- var fms = fontSize / Math.SQRT2;
- x += fms;
- y -= fms;
- fms = void 0;
- }
- matrix.e = x;
- matrix.f = y;
- } else {
- matrix.e = dx + adv*fe;
- matrix.f = dy;
- }
- path.setAttributeNS(null, "transform", "matrix(" +matrix.a+ "," +matrix.b+ "," +matrix.c+ "," +matrix.d+ "," +matrix.e+ "," +matrix.f+ ")");
- path.setAttributeNS(null, "d", glyphData[i]);
- ti.parentNode.insertBefore(path, ti);
- adv += advanceX[i];
- matrix = void 0;
- }
- }
- adv = advanceX = glyphData = void 0;
- } else if ("tspan|a".indexOf(node.localName) > -1){
- NAIBU._noie_createFont(node, font, isMSIE);
- }
- node = node.nextSibling;
- }
- if (isMSIE) {
- var style = ti.ownerDocument.getOverrideStyle(ti, null);
- style.setProperty("visibility", "hidden");
- style = void 0;
- } else {
- ti.setAttributeNS(null, "opacity", "0");
- }
- }
- data = isTategaki = horizOrVert = em = advX = dx = dy = fontSize = style = svgns = node = void 0;
-};
-
-/*以下は、getComputedStyleメソッドで使うために、CSS2Propertiesの_listプロパティに、
- *CSSprimitiveValueのリストを収納している。なお、その際に、writingModeなどはwriting-modeに変更している
- */
-(function(){
- var s = new CSSStyleDeclaration(),
- slis = s._list,
- n = 0,
- regAZ = /([A-Z])/,
- regm = /\-/,
- u, t;
- for (var i in CSS2Properties) {
- if(CSS2Properties.hasOwnProperty(i)) {
- t = i.replace(regAZ, "-");
- if (!!RegExp.$1) {
- u = "-" +RegExp.$1.toLowerCase();
- } else {
- u = "-";
- }
- t = t.replace(regm, u);
- s.setProperty(t, CSS2Properties[i]);
- slis[t] = slis[n]; //この処理はCSSモジュールのgetComputedStyleメソッドのため
- slis[n]._isDefault = 1;
- ++n;
- i = t = u = void 0;
- }
- }
- slis._opacity = 1;
- slis._fontSize = 12;
- CSS2Properties._list = slis;
- Document.prototype.defaultView._defaultCSS = slis;
- s = n = regAZ = regm = slis =null;
-})();
-
-NAIBU.addEvent = function(evt,lis){
- if (window.addEventListener) {
- window.addEventListener(evt, lis, false);
- } else if (window.attachEvent) {
- window.attachEvent('on'+evt, lis);
- } else {
- window['on'+evt] = lis;
- }
- //Sieb用
- if (sieb_s) {
- lis();
- }
-};
-
-function unsvgtovml() {
- try {
- if ("stop" in NAIBU) {
- clearInterval(NAIBU.stop);
- }
- window.onscroll = NAIBU.emptyFunction;
- window.detachEvent("onload", NAIBU._main);
- NAIBU.freeArg();
- delete Object._create;
- Element = SVGElement = Attr = NamedNodeMap = CSS2Properties = CSSValue = CSSPrimitiveValue = NAIBU.xmlhttp = Node = Event = NAIBU = STLog = SVGColor = SVGPaint = void 0;
- Array = ActiveXObject = void 0;
- } catch(e) {}
-}
-/*_main関数
- *一番最初に起動するべき関数
- */
-NAIBU._main = function() {
- var xmlhttp, //XMLHttpオブジェクトを生成
- _doc = document; //documentのエイリアスを作成
- try {
- if (XMLHttpRequest) {
- xmlhttp = false;
- } else {
- xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
- }
- } catch (e) {
- try {
- xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
- } catch (E) {
- xmlhttp = false;
- }
- }
- if (!xmlhttp) {
- try {
- xmlhttp = new XMLHttpRequest();
- } catch (e) {
- xmlhttp = false;
- }
- }
- NAIBU.xmlhttp = xmlhttp;
- var nd;
- if (("namespaces" in _doc) && !_doc.namespaces["v"]) {
- try {
- NAIBU.doc = new ActiveXObject("MSXML2.DomDocument");
- } catch (e) {
-
- }
- nd = NAIBU.doc;
- _doc.namespaces.add("v","urn:schemas-microsoft-com:vml");
- _doc.namespaces.add("o","urn:schemas-microsoft-com:office:office");
- var st = _doc.createStyleSheet(),
- vmlUrl = "behavior: url(#default#VML);display: inline-block;} "; //inline-blockはIEのバグ対策
- st.cssText = "v\\:rect{" +vmlUrl+ "v\\:image{" +vmlUrl+ "v\\:fill{" +vmlUrl+ "v\\:stroke{" +vmlUrl+ "o\\:opacity2{" +vmlUrl
- + "dn\\:defs{display:none}"
- + "v\\:group{text-indent:0px;position:relative;width:100%;height:100%;" +vmlUrl
- + "v\\:shape{width:100%;height:100%;" +vmlUrl;
- }
- var ary = _doc.getElementsByTagName("script");
- //全script要素をチェックして、type属性がimage/svg+xmlならば、中身をSVGとして処理する
- for (var i=0; ary[i]; ++i) {
- var ai = ary[i],
- hoge = ai.type;
- if (ai.type === "image/svg+xml") {
- var ait = ai.text;
- if (sieb_s && ait.match(/<svg/)) {
- //ソース内のタグを除去
- ait = ait.replace(/<.+?>/g, "");
- //エンティティを文字に戻す
- ait = ait.replace(/</g, "<").replace(/>/g, ">").replace(/"/g, '"').replace(/&/g, "&");
- }
- if (NAIBU.isMSIE) {
- var gsd = new GetSVGDocument(ai);
- gsd.xmlhttp = {
- readyState : 4,
- status : 200,
- responseText : ait.replace(/\shref=/g, " target='_top' xlink:href=")
- }
- gsd._ca();
- } else {
- var base = location.href.replace(/\/[^\/]+?$/,"/"); //URIの最後尾にあるファイル名は消す。例: /n/sie.js -> /n/
- ait = ait.replace(/\shref=(['"a-z]+?):\/\//g, " target='_top' xlink:href=$1://").replace(/\shref=(.)/g, " target='_top' xlink:href=$1"+base);
- var s = NAIBU.textToSVG(ait,ai.getAttribute("width"),ai.getAttribute("height"));
- ai.parentNode.insertBefore(s,ai);
- }
- ai = ait = void 0;
- }
- hoge = void 0;
- }
- NAIBU.doc = nd;
- nd = ary = void 0;
- if (xmlhttp && NAIBU.isMSIE) {
- if (!!_doc.createElementNS && !!_doc.createElementNS( "http://www.w3.org/2000/svg", "svg").createSVGRect) { //IE9ならば
- } else { //IE6-8ならば
- var ob = _doc.getElementsByTagName("object"),
- s=[],
- t = [],
- _search = function(_ob) {
- var ifr, obi, n,
- w = "width",
- h = "height";
- s || (s = []); //NAIBU._searchで呼ばれたときに必要
- _doc || (_doc = document);
- for (var i=0;_ob[i];++i) {
- obi = _ob[i];
- s[s.length] = new GetSVGDocument(obi);
- ifr = _doc.createElement("iframe");
- ifr.style.cssText = obi.style.cssText;
- ifr.style.background = "black";
- n = obi.getAttribute(w);
- n && ifr.setAttribute(w, n);
- n = obi.getAttribute(h);
- n && ifr.setAttribute(h, n);
- ifr.marginWidth = ifr.marginHeight = "0px"; //このマージン設定がないと、全体がずれてしまう
- ifr.scrolling = "no";
- ifr.frameBorder = "0";
- /*iframe要素を使って、描画のプロセスを分離する
- *したがって、_docはdocumentとは別のオブジェクトとなる
- */
- obi.parentNode.insertBefore(ifr, obi);
- }
- i = obi = ifr = _ob = w = h = void 0;
- return s[s.length-1];
- };
- _search(ob);
- var img = _doc.getElementsByTagName("img"),
- em = _doc.getElementsByTagName("embed");
- for (var i=0,j=0;img[i];++i) {
- /*img要素の処理*/
- if (img[i].getAttribute("src").indexOf(".svg") > -1) { //拡張子があればSVG画像と判断
- t[j] = img[i];
- ++j;
- }
- }
- _search(t);
- _search(em);
- NAIBU._search = _search; //a要素がクリックされたときに使う関数
- ob = em = t = img = _search = void 0;
- for (var i=0;i<s.length;++i) {
- /*あとで変数iが使われるために、次の条件分岐が必要*/
- if (i < s.length-1) {
- s[i]._next = s[i+1]
- }
- }
- if (i > 0) {
- s[0]._init(); //初期化作業を開始
- }
- s = void 0;
- }
- } else {
- var ob = _doc.getElementsByTagName("object");
- for (var i=0;i<ob.length;++i) {
- if (ob[i].contentDocument) {
- NAIBU._fontSearchURI({target:{ownerDocument:ob[i].contentDocument}});
- } else if (ob[i].getSVGDocument) {
- ob[i].getSVGDocument()._docElement.addEventListener("SVGLoad", NAIBU._fontSearchURI, false);
- } else {
- }
- }
- }
- xmlhttp = _doc = void 0;
-};
-NAIBU.addEvent("load", NAIBU._main);
-NAIBU.utf16 = function ( /*string*/ s) {
- return unescape(s);
-}
-NAIBU.unescapeUTF16 = function ( /*string*/ s) {
- return s.replace(/%u\w\w\w\w/g, NAIBU.utf16);
-}
-//Text2SVG機能。SVGのソース(文章)をSVG画像に変換できる。
-NAIBU.textToSVG = function ( /*string*/ source, /*float*/ w, /*float*/ h) {
- /*Safari3.xでは、DOMParser方式だと、文字が表示されないバグがあるため、
- *dataスキーム方式を採用する
- */
- if (navigator.userAgent.indexOf('WebKit') > -1 || navigator.userAgent.indexOf('Safari') > -1) { //WebKit系ならば
- var data = 'data:image/svg+xml;charset=utf-8,' + NAIBU.unescapeUTF16(escape(source));
- var ob = document.createElement("object");
- ob.setAttribute("data",data);
- ob.setAttribute("width",w);
- ob.setAttribute("height",h);
- ob.setAttribute("type","image/svg+xml");
- return ob;
- } else {
- var doc = (new DOMParser()).parseFromString(source, "text/xml");
- return (document.importNode(doc.documentElement, true));
- }
-};
-NAIBU.addEvent("unload", unsvgtovml);
-//IEならばtrue
+/*SIE-SVG without Plugin under LGPL2.1 & GPL2.0 & Mozilla Public Lisence\r
+ *http://sie.sourceforge.jp/\r
+ *Usage: <script defer="defer" type="text/javascript" src="sie.js"></script>\r
+ */\r
+/* ***** BEGIN LICENSE BLOCK *****\r
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1\r
+ *\r
+ * The contents of this file are subject to the Mozilla Public License Version\r
+ * 1.1 (the "License"); you may not use this file except in compliance with\r
+ * the License. You may obtain a copy of the License at\r
+ * http://www.mozilla.org/MPL/\r
+ *\r
+ * Software distributed under the License is distributed on an "AS IS" basis,\r
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License\r
+ * for the specific language governing rights and limitations under the\r
+ * License.\r
+ *\r
+ * The Original Code is the Mozilla SVG Cairo Renderer project.\r
+ *\r
+ * The Initial Developer of the Original Code is IBM Corporation.\r
+ * Portions created by the Initial Developer are Copyright (C) 2004\r
+ * the Initial Developer. All Rights Reserved.\r
+ *\r
+ * Parts of this file contain code derived from the following files(s)\r
+ * of the Mozilla SVG project (these parts are Copyright (C) by their\r
+ * respective copyright-holders):\r
+ * layout/svg/renderer/src/libart/nsSVGLibartBPathBuilder.cpp\r
+ *\r
+ * Contributor(s):DHRNAME revulo bellbind\r
+ *\r
+ * Alternatively, the contents of this file may be used under the terms of\r
+ * either of the GNU General Public License Version 2 or later (the "GPL"),\r
+ * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),\r
+ * in which case the provisions of the GPL or the LGPL are applicable instead\r
+ * of those above. If you wish to allow use of your version of this file only\r
+ * under the terms of either the GPL or the LGPL, and not to allow others to\r
+ * use your version of this file under the terms of the MPL, indicate your\r
+ * decision by deleting the provisions above and replace them with the notice\r
+ * and other provisions required by the GPL or the LGPL. If you do not delete\r
+ * the provisions above, a recipient may use your version of this file under\r
+ * the terms of any one of the MPL, the GPL or the LGPL.\r
+ *\r
+ * ***** END LICENSE BLOCK ***** */\r
+/*\r
+ * Copyright (c) 2000 World Wide Web Consortium,\r
+ * (Massachusetts Institute of Technology, Institut National de\r
+ * Recherche en Informatique et en Automatique, Keio University). All\r
+ * Rights Reserved. This program is distributed under the W3C's Software\r
+ * Intellectual Property License. This program is distributed in the\r
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even\r
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR\r
+ * PURPOSE.\r
+ * See W3C License http://www.w3.org/Consortium/Legal/ for more details.\r
+ */\r
+\r
+\r
+//これを頭に付けたら、内部処理用\r
+var NAIBU = {};\r
+\r
+/*\r
+// File: svg.idl\r
+#ifndef _SVG_IDL_\r
+#define _SVG_IDL_\r
+// For access to DOM2 core\r
+#include "dom.idl"\r
+// For access to DOM2 events\r
+#include "events.idl"\r
+// For access to those parts from DOM2 CSS OM used by SVG DOM.\r
+#include "css.idl"\r
+// For access to those parts from DOM2 Views OM used by SVG DOM.\r
+#include "views.idl"\r
+// For access to the SMIL OM used by SVG DOM.\r
+#include "smil.idl"\r
+#pragma prefix "dom.w3c.org"\r
+#pragma javaPackage "org.w3c.dom"\r
+module svg\r
+{\r
+ typedef dom::DOMString DOMString;\r
+ typedef dom::DOMException DOMException;\r
+ typedef dom::Element Element;\r
+ typedef dom::Document Document;\r
+ typedef dom::NodeList NodeList;\r
+ // Predeclarations\r
+ interface SVGElement;\r
+ interface SVGLangSpace;\r
+ interface SVGExternalResourcesRequired;\r
+ interface SVGTests;\r
+ interface SVGFitToViewBox;\r
+ interface SVGZoomAndPan;\r
+ interface SVGViewSpec;\r
+ interface SVGURIReference;\r
+ interface SVGPoint;\r
+ interface SVGMatrix;\r
+ interface SVGPreserveAspectRatio;\r
+ interface SVGAnimatedPreserveAspectRatio;\r
+ interface SVGTransformList;\r
+ interface SVGAnimatedTransformList;\r
+ interface SVGTransform;\r
+ interface SVGICCColor;\r
+ interface SVGColor;\r
+ interface SVGPaint;\r
+ interface SVGTransformable;\r
+ interface SVGDocument;\r
+ interface SVGSVGElement;\r
+ interface SVGElementInstance;\r
+ interface SVGElementInstanceList;\r
+*/\r
+function SVGException(code) {\r
+ /*unsigned short*/ this.code = code;\r
+ if (this.code === /*SVGException.SVG_WRONG_TYPE_ERR*/ 0) {\r
+ this.message = "SVG Wrong Type Error";\r
+ } else if (this.code === /*SVGException.SVG_INVALID_VALUE_ERR*/ 1) {\r
+ this.message = "SVG Invalid Value Error";\r
+ } else if (this.code === /*SVGException.SVG_MATRIX_NOT_INVERTABLE*/ 2) {\r
+ this.message = "SVG Matrix Not Invertable";\r
+ }\r
+ return this;\r
+};\r
+SVGException.prototype = Object._create(Error);\r
+// SVGExceptionCode\r
+/*const unsigned short SVGException.SVG_WRONG_TYPE_ERR = 0;\r
+/*const unsigned short SVGException.SVG_INVALID_VALUE_ERR = 1;\r
+/*const unsigned short SVGException.SVG_MATRIX_NOT_INVERTABLE = 2;*/\r
+\r
+/*SVGElement\r
+ *すべてのSVG関連要素の雛形となるオブジェクト\r
+ */\r
+function SVGElement() {\r
+ Element.call(this);\r
+ SVGStylable.call(this); //ElementCSSInlineStyleのインタフェースを継承\r
+ /*interface SVGTransformable : SVGLocatable\r
+ *TransformListはtransform属性を行列で表現したあとのリスト構造\r
+ */\r
+ /*readonly attribute SVGAnimatedTransformList*/ this.transform = new SVGAnimatedTransformList();\r
+ //描画の際、SVGStylabaleで指定しておいたプロパティの処理をする\r
+ this.addEventListener("DOMAttrModified", function(evt){\r
+ if (evt.eventPhase === /*Event.BUBBLING_PHASE*/ 3) {\r
+ return;\r
+ }\r
+ var name = evt.attrName,\r
+ tar = evt.target;\r
+ if (!!CSS2Properties[name] || (name.indexOf("-") > -1)) { //スタイルシートのプロパティならば\r
+ tar._attributeStyle.setProperty(name, evt.newValue, "");\r
+ }\r
+ if (evt.relatedNode.localName === "id") { //xml:idあるいはid属性ならば\r
+ tar.id = evt.newValue;\r
+ } else if ((name === "transform") && !!tar.transform) {\r
+ var tft = evt.newValue,\r
+ degR = tar._degReg,\r
+ coma = tft.match(tar._comaReg), //コマンド文字にマッチ translate\r
+ list = tft.match(tar._strReg), //カッコ内のリストにマッチ (10 20 30...)\r
+ a,b,c,d,e,f,\r
+ lis,\r
+ com,\r
+ deg,\r
+ rad,\r
+ degli,\r
+ s,\r
+ cm,\r
+ degz,\r
+ etod = evt.target.ownerDocument.documentElement,\r
+ ttb = tar.transform.baseVal;\r
+ //transform属性の値を、SVGTransformListであるtransformプロパティに結びつける\r
+ for (var j=0,cli=coma.length;j<cli;j++) {\r
+ s = etod.createSVGTransform();\r
+ lis = list[j],\r
+ com = coma[j];\r
+ deg = lis.match(degR);\r
+ degli = deg.length;\r
+ if (degli === 6) {\r
+ cm = s.matrix;\r
+ cm.a = +(deg[0]);\r
+ cm.b = +(deg[1]);\r
+ cm.c = +(deg[2]);\r
+ cm.d = +(deg[3]);\r
+ cm.e = +(deg[4]);\r
+ cm.f = +(deg[5]);\r
+ } else {\r
+ if (degli === 3) {\r
+ degz = +(deg[0]);\r
+ s.setRotate(degz, +(deg[1]), +(deg[2]));\r
+ } else if (degli <= 2) {\r
+ degz = +(deg[0]);\r
+ if (com === "translate") {\r
+ s.setTranslate(degz, +(deg[1] || 0));\r
+ } else if (com === "scale") {\r
+ s.setScale(degz, +(deg[1] || deg[0]));\r
+ } else if (com === "rotate") {\r
+ s.setRotate(degz, 0, 0);\r
+ } else if (com === "skewX") {\r
+ s.setSkewX(degz);\r
+ } else if (com === "skewY") {\r
+ s.setSkewY(degz);\r
+ }\r
+ }\r
+ }\r
+ ttb.appendItem(s);\r
+ }\r
+ tft = degR = coma = list = a = b = c = d = e = f = lis = com = deg = rad = degli = s = cm = degz = etod = ttb = void 0;\r
+ } else if (name === "style") {\r
+ var sc = evt.newValue,\r
+ style = tar.style,\r
+ a,\r
+ ai,\r
+ m;\r
+ style.cssText = sc;\r
+ if (sc !== "") {\r
+ //style属性値の解析\r
+ sc = sc.replace(tar._shouReg, "")\r
+ .replace(tar._conReg, ":")\r
+ .replace(tar._bouReg, ";");\r
+ a = sc.split(";");\r
+ for (var i=0, ali=a.length;i<ali;++i) {\r
+ ai = a[i],\r
+ m = ai.split(":");\r
+ if (ai !== "") {\r
+ style.setProperty(m[0], m[1]);\r
+ }\r
+ ai = m = void 0;\r
+ }\r
+ }\r
+ a = sc = style = void 0;\r
+ } else if (name === "class") {\r
+ tar.className = evt.newValue;\r
+ } else if (name.indexOf("on") === 0) { //event属性ならば\r
+ /*ECMA 262-3においては、eval("(function(){})")はFunctionオブジェクトを返さなければならない\r
+ *ところが、IEでは、undefinedの値を返してしまう。\r
+ *他のブラウザではECMAの仕様にしたがっているようなので、IEだけの問題であることに注意\r
+ */\r
+ NAIBU.eval("document._s = (function(evt){" +evt.newValue+ "})");\r
+ var v = name.slice(2);\r
+ if (v === "load") {\r
+ v = "SVGLoad";\r
+ } else if (v === "unload") {\r
+ v = "SVGUnload";\r
+ } else if (v === "abort") {\r
+ v = "SVGAbort";\r
+ } else if (v === "error") {\r
+ v = "SVGError";\r
+ } else if (v === "resize") {\r
+ v = "SVGResize";\r
+ } else if (v === "scroll") {\r
+ v = "SVGScroll";\r
+ } else if (v === "zoom") {\r
+ v = "SVGZoom";\r
+ } else if (v === "begin") {\r
+ v = "beginEvent";\r
+ } else if (v === "end") {\r
+ v = "endEvent";\r
+ } else if (v === "repeat") {\r
+ v = "repeatEvent";\r
+ }\r
+ tar.addEventListener(v, document._s, false);\r
+ } else if (evt.relatedNode.nodeName === "xml:base") { //xml:base属性ならば\r
+ tar.xmlbase = evt.newValue;\r
+ } else if (!!tar[name] && (tar[name] instanceof SVGAnimatedLength)) {\r
+ var tea = tar[name],\r
+ tod = tar.nearestViewportElement || tar.ownerDocument.documentElement,\r
+ tvw = tod.viewport.width,\r
+ tvh = tod.viewport.height,\r
+ s,\r
+ n = evt.newValue.slice(-2),\r
+ m = n.charAt(1),\r
+ type = /*SVGLength.SVG_LENGTHTYPE_NUMBER*/ 1,\r
+ _parseFloat = parseFloat;\r
+ if (m >= "0" && m <= "9") { //軽量化のためにチェックを設ける\r
+ } else if (m === "%") {\r
+ if (tar._x1width[name]) {\r
+ tea.baseVal._percent = tvw * 0.01;\r
+ } else if (tar._y1height[name]) {\r
+ tea.baseVal._percent = tvh * 0.01;\r
+ } else {\r
+ tea.baseVal._percent = Math.sqrt((tvw*tvw + tvh*tvh) / 2) * 0.01;\r
+ }\r
+ type = /*SVGLength.SVG_LENGTHTYPE_PERCENTAGE*/ 2;\r
+ } else if (n === "em") {\r
+ type = /*SVGLength.SVG_LENGTHTYPE_EMS*/ 3;\r
+ } else if (n === "ex") {\r
+ type = /*SVGLength.SVG_LENGTHTYPE_EXS*/ 4;\r
+ } else if (n === "px") {\r
+ type = /*SVGLength.SVG_LENGTHTYPE_PX*/ 5;\r
+ } else if (n === "cm") {\r
+ type = /*SVGLength.SVG_LENGTHTYPE_CM*/ 6;\r
+ } else if (n === "mm") {\r
+ type = /*SVGLength.SVG_LENGTHTYPE_MM*/ 7;\r
+ } else if (n === "in") {\r
+ type = /*SVGLength.SVG_LENGTHTYPE_IN*/ 8;\r
+ } else if (n === "pt") {\r
+ type = /*SVGLength.SVG_LENGTHTYPE_PT*/ 9;\r
+ } else if (n === "pc") {\r
+ type = /*SVGLength.SVG_LENGTHTYPE_PC*/ 10;\r
+ }\r
+ s = _parseFloat(evt.newValue);\r
+ s = isNaN(s) ? 0 : s;\r
+ tea.baseVal.newValueSpecifiedUnits(type, s);\r
+ tea = tod = tvw = tvh = n = type = _parseFloat = s = void 0;\r
+ }\r
+ evt = _parseFloat = name = tar = null;\r
+ }, false);\r
+ return this;\r
+};\r
+SVGElement.prototype = Object._create(Element);\r
+\r
+/*関数スコープを避けるため、グローバルスコープでevalさせる関数*/\r
+NAIBU.eval = function(code) {\r
+ eval(code);\r
+};\r
+\r
+(function(){\r
+ /*以下の正規表現は属性のパーサの際に用いる*/\r
+ this._degReg = /[\-\d\.e]+/g;\r
+ this._comaReg = /[A-Za-z]+(?=\s*\()/g;\r
+ this._strReg = /\([^\)]+\)/g;\r
+ this._syouReg = /^[^a-z\-]+/;\r
+ this._conReg = /\:\s+/g;\r
+ this._bouReg = /\s*;[^a-z\-]*/g;\r
+ /*_cacheMatrixプロパティはSVGMatrixのキャッシュとして、\r
+ *getCTMメソッドで使う\r
+ */\r
+ this._cacheMatrix = null;\r
+ /*以下のオブジェクトは単位がパーセント付きの属性の名前を示し、処理に使う*/\r
+ this._x1width = {\r
+ "x" : 1,\r
+ "x1" : 1,\r
+ "x2" : 1,\r
+ "width" : 1,\r
+ "cx" : 1\r
+ };\r
+ this._y1height = {\r
+ "y" : 1,\r
+ "y1" : 1,\r
+ "y2" : 1,\r
+ "height" : 1,\r
+ "cy" : 1 \r
+ };\r
+ /*String*/ this.id = null; //id属性の値\r
+ /*String*/ this.xmlbase = null; //xml:base属性の値\r
+ /*SVGSVGElement*/ this.ownerSVGElement; //ルート要素であるsvg要素\r
+ /*readonly SVGElement*/ this.viewportElement; //ビューポートを形成する要素(多くはsvg要素)\r
+ /*readonly attribute SVGElement*/ this.nearestViewportElement = null;\r
+ /*readonly attribute SVGElement*/ this.farthestViewportElement = null;\r
+ \r
+ /*interface SVGLocatable*/\r
+ /*SVGRect*/ this.getBBox = function(){\r
+ var s = new SVGRect(),\r
+ data = this._tar.path.value,\r
+ vi = this.ownerDocument.documentElement.viewport,\r
+ el = vi.width,\r
+ et = vi.height,\r
+ er = 0,\r
+ eb = 0,\r
+ degis = data.match(/[0-9\-]+/g),\r
+ nx,\r
+ ny;\r
+ /*要素の境界領域を求める(四隅の座標を求める)\r
+ *etは境界領域の上からビューポート(例えばsvg要素)の上端までの距離であり、ebは境界領域の下からビューポートの下端までの距離\r
+ *elは境界領域の左からビューポートの左端までの距離であり、erは境界領域の右からビューポートの右端までの距離\r
+ */\r
+ for (var i=0,degisli=degis.length;i<degisli;i+=2) {\r
+ nx = +(degis[i]),\r
+ ny = +(degis[i+1]);\r
+ el = el > nx ? nx : el;\r
+ et = et > ny ? ny : et;\r
+ er = er > nx ? er : nx;\r
+ eb = eb > ny ? eb : ny;\r
+ }\r
+ s.x = el;\r
+ s.y = et;\r
+ s.width = er - el;\r
+ s.height = eb - et;\r
+ nx = ny = data = degis =el = et = er = eb = vi = void 0;\r
+ return s;\r
+ };\r
+\r
+ /*getCTMメソッド\r
+ *CTMとは現在の利用座標系に対する変換行列\r
+ *注意点として、SVG1.1とSVG Tiny1.2では内容が異なる。たとえば、\r
+ *1.2ではgetCTMが言及されていない\r
+ *もし、要素の中心座標を取得したい人がいれば、transformプロパティのconsolidateメソッドを使うこと\r
+ */\r
+ /*SVGMatrix*/ this.getCTM = function() {\r
+ var s, m;\r
+ if (!!this._cacheMatrix) { //キャッシュがあれば\r
+ s = this._cacheMatrix;\r
+ } else {\r
+ m = this.transform.baseVal.consolidate();\r
+ if (m) {\r
+ m = m.matrix;\r
+ } else {\r
+ m = this.ownerDocument.documentElement.createSVGMatrix();\r
+ }\r
+ if (this.parentNode && !!this.parentNode.getCTM) {\r
+ s = this.parentNode.getCTM().multiply(m);\r
+ } else {\r
+ s = m;\r
+ }\r
+ m = void 0;\r
+ this._cacheMatrix = s; //キャッシュをためて次回で使う\r
+ }\r
+ return s;\r
+ };\r
+\r
+ /*SVGMatrix*/ this.getScreenCTM = function(){\r
+ if (!this.parentNode) {\r
+ return null;\r
+ }\r
+ var view = this.nearestViewportElement || this.ownerDocument.documentElement;\r
+ var s = view.getScreenCTM().multiply(this.getCTM());\r
+ view = null;\r
+ return s;\r
+ };\r
+\r
+ /*getTransformToElementメソッド\r
+ *これは、あるelementへの変換行列を計算して返す\r
+ *たとえばある要素から別の要素への引越しをする際の変換行列を算出することが可能\r
+ */\r
+ /*SVGMatrix*/ this.getTransformToElement = function(/*SVGElement*/ element ){\r
+ var s = this.getScreenCTM().inverse().multiply(element.getScreenCTM());\r
+ return s;\r
+ };\r
+}).apply(SVGElement.prototype);\r
+\r
+function SVGAnimatedBoolean() {\r
+ /*boolean*/ this.animVal = this.baseVal = true;\r
+ return this;\r
+};\r
+\r
+function SVGAnimatedString() {\r
+ /*String*/ this.animVal = this.baseVal = "";\r
+ return this;\r
+};\r
+\r
+function SVGStringList() {\r
+ return this;\r
+};\r
+SVGStringList.prototype = Object._create(Array);\r
+(function(){\r
+ /*readonly unsigned long*/ this.numberOfItems = 0;\r
+ /*void*/ this.clear = function(){\r
+ for (var i=0, tli=this.length;i<tli;++i) {\r
+ delete this[i];\r
+ }\r
+ this.numberOfItems = 0;\r
+ };\r
+ /*DOMString*/ this.initialize = function(/*DOMString*/ newItem ) {\r
+ this.clear();\r
+ this[0] = newItem;\r
+ this.numberOfItems = 1;\r
+ return newItem;\r
+ };\r
+ /*DOMString*/ this.getItem = function(/*unsigned long*/ index ) {\r
+ if (index >= this.numberOfItems || index < 0) {\r
+ throw (new DOMException(/*DOMException.INDEX_SIZE_ERR*/ 1));\r
+ } else {\r
+ return (this[index]);\r
+ }\r
+ };\r
+ /*DOMString*/ this.insertItemBefore = function(/*DOMString*/ newItem, /*unsigned long*/ index ){\r
+ if (index >= this.numberOfItems) {\r
+ this.appendItem(newItem);\r
+ } else {\r
+ this.splice(index, 1, newItem, this.getItem[index]);\r
+ ++this.numberOfItems;\r
+ }\r
+ return newItem;\r
+ };\r
+ /*DOMString*/ this.replaceItem = function(/*DOMString*/ newItem, /*unsigned long*/ index ){\r
+ if (index >= this.numberOfItems || index < 0) {\r
+ throw (new DOMException(/*DOMException.INDEX_SIZE_ERR*/ 1));\r
+ } else {\r
+ this.splice(index, 1, newItem);\r
+ }\r
+ return newItem;\r
+ };\r
+ //raises( DOMException, SVGException );\r
+ /*DOMString*/ this.removeItem = function(/*unsigned long*/ index ){\r
+ if (index >= this.numberOfItems || index < 0) {\r
+ throw (new DOMException(/*DOMException.INDEX_SIZE_ERR*/ 1));\r
+ } else {\r
+ this.splice(index, 1);\r
+ --this.numberOfItems;\r
+ }\r
+ return newItem;\r
+ };\r
+ /*DOMString*/ this.appendItem = function(/*DOMString*/ newItem ){\r
+ this[this.numberOfItems] = newItem;\r
+ ++this.numberOfItems;\r
+ };\r
+}).apply(SVGStringList.prototype);\r
+\r
+function SVGAnimatedEnumeration() {\r
+ /*unsigned short*/ this.baseVal = 0;\r
+ // raises DOMException on setting\r
+ /*readonly unsigned short*/ this.animVal = 0;\r
+ return this;\r
+};\r
+function SVGAnimatedInteger() {\r
+ /*long*/ this.baseVal = 0;\r
+ // raises DOMException on setting\r
+ /*readonly long*/ this.animVal = 0;\r
+ return this;\r
+};\r
+function SVGNumber() {\r
+ /*float*/ this.value = 0;\r
+ // raises DOMException on setting\r
+ return this;\r
+};\r
+function SVGAnimatedNumber() {\r
+ /*float*/ this.baseVal = this.animVal = 0;\r
+ return this;\r
+};\r
+\r
+function SVGNumberList() {\r
+ return this;\r
+};\r
+/*SVGUnmberListのメソッドはSVGPathSegListを参照*/\r
+\r
+function SVGAnimatedNumberList() {\r
+ /*readonly SVGNumberList*/ this.animVal = this.baseVal = new SVGNumberList();\r
+ return this;\r
+};\r
+/*SVGLengthクラス\r
+ *長さを設定する(単位pxに統一する方便として使う)\r
+ *valueInSpecifiedUnitsプロパティはpxに統一する前の数値。valueプロパティはpxに統一した後の数値\r
+ */\r
+function SVGLength() {\r
+ return this;\r
+};\r
+/*(function(t) {\r
+ // Length Unit Types\r
+ /*const unsigned short t.SVG_LENGTHTYPE_UNKNOWN = 0;\r
+ /*const unsigned short t.SVG_LENGTHTYPE_NUMBER = 1;\r
+ /*const unsigned short t.SVG_LENGTHTYPE_PERCENTAGE = 2;\r
+ /*const unsigned short t.SVG_LENGTHTYPE_EMS = 3;\r
+ /*const unsigned short t.SVG_LENGTHTYPE_EXS = 4;\r
+ /*const unsigned short t.SVG_LENGTHTYPE_PX = 5;\r
+ /*const unsigned short t.SVG_LENGTHTYPE_CM = 6;\r
+ /*const unsigned short t.SVG_LENGTHTYPE_MM = 7;\r
+ /*const unsigned short t.SVG_LENGTHTYPE_IN = 8;\r
+ /*const unsigned short t.SVG_LENGTHTYPE_PT = 9;\r
+ /*const unsigned short t.SVG_LENGTHTYPE_PC = 10;\r
+})(SVGLength);*/\r
+\r
+SVGLength.prototype = {\r
+ /*readonly attribute unsigned short*/ unitType : /*SVGLength.SVG_LENGTHTYPE_UNKNOWN*/ 0,\r
+ /*attribute float*/ value : 0, //利用単位における値\r
+ /*attribute float*/ valueInSpecifiedUnits : /*SVGLength.SVG_LENGTHTYPE_UNKNOWN*/ 0, //unitTypeにおける値\r
+ /*attribute DOMString*/ valueAsString : "0",\r
+ _percent : 0.01, //単位に%が使われていた場合、このプロパティの数値を1%として使う\r
+ _fontSize : 12, //単位のemとexで使われるfont-sizeの値\r
+/*newValueSpedifiedUnitsメソッド\r
+ *新しくunitTypeにおける値を設定する\r
+ *例:2pxならば、x.newValueSpecifiedUnits(SVGLength.SVG_LENGTHTYPE_PX, 2);となる\r
+ */\r
+ newValueSpecifiedUnits : function (/*unsigned short*/ unitType, /*float*/ valueInSpecifiedUnits) {\r
+ var n = 1,\r
+ _s = ""; //nは各単位から利用単位への変換数値。_sは単位の文字列を表す\r
+ if (unitType === /*SVGLength.SVG_LENGTHTYPE_NUMBER*/ 1) {\r
+ } else if (unitType === /*SVGLength.SVG_LENGTHTYPE_PX*/ 5) {\r
+ _s = "px";\r
+ } else if (unitType === /*SVGLength.SVG_LENGTHTYPE_PERCENTAGE*/ 2) {\r
+ n = this._percent;\r
+ _s = "%";\r
+ } else if (unitType === /*SVGLength.SVG_LENGTHTYPE_EMS*/ 3) {\r
+ n = this._fontSize;\r
+ _s = "em";\r
+ } else if (unitType === /*SVGLength.SVG_LENGTHTYPE_EXS*/ 4) {\r
+ n = this._fontSize * 0.5;\r
+ _s = "ex";\r
+ } else if (unitType === /*SVGLength.SVG_LENGTHTYPE_CM*/ 6) {\r
+ n = 35.43307;\r
+ _s = "cm";\r
+ } else if (unitType === /*SVGLength.SVG_LENGTHTYPE_MM*/ 7) {\r
+ n = 3.543307;\r
+ _s = "mm";\r
+ } else if (unitType === /*SVGLength.SVG_LENGTHTYPE_IN*/ 8) {\r
+ n = 90;\r
+ _s = "in";\r
+ } else if (unitType === /*SVGLength.SVG_LENGTHTYPE_PT*/ 9) {\r
+ n = 1.25;\r
+ _s = "pt";\r
+ } else if (unitType === /*SVGLength.SVG_LENGTHTYPE_PC*/ 10) {\r
+ n = 15;\r
+ _s = "pc";\r
+ } else {\r
+ throw new DOMException(/*DOMException.NOT_SUPPORTED_ERR*/ 9);\r
+ }\r
+ this.unitType = unitType;\r
+ this.value = valueInSpecifiedUnits * n;\r
+ this.valueInSpecifiedUnits = valueInSpecifiedUnits;\r
+ this.valueAsString = valueInSpecifiedUnits + _s;\r
+ valueInSpecifiedUnits = unitType = n = _s = void 0;\r
+ },\r
+/*convertToSpecifiedUnitsメソッド\r
+ *valueプロパティを書き換えずに、単位だけを変換する\r
+ *例:2cmをmmに変換したい場合\r
+ * x.newValueSpecifiedUnits(SVGLength.SVG_LENGTHTYPE_CM, 2);\r
+ * x.convertToSpecifiedUnits(SVGLength.SVG_LENGTHTYPE_MM);\r
+ * alert(x.valueAsString); //20mm\r
+ */\r
+ convertToSpecifiedUnits : function (/*unsigned short*/ unitType) {\r
+ if (this.value === 0) {\r
+ this.newValueSpecifiedUnits(unitType, 0);\r
+ return;\r
+ }\r
+ var v = this.value;\r
+ this.newValueSpecifiedUnits(unitType, this.valueInSpecifiedUnits);\r
+ v = v / this.value * this.valueInSpecifiedUnits;\r
+ this.newValueSpecifiedUnits(unitType, v); \r
+ },\r
+ /*_emToUnitメソッド\r
+ *emやexが単位に使われていたときに、@fontSizeの値を手がかりに、新たな値へとvalueを変換させる\r
+ *単位が%の場合は、新しいvalueへと変換させておく\r
+ */\r
+ _emToUnit : function (/*float*/ fontSize) {\r
+ if ((this.unitType === /*SVGLength.SVG_LENGTHTYPE_EMS*/ 3) || (this.unitType === 4)) {\r
+ this._fontSize = fontSize;\r
+ this.newValueSpecifiedUnits(this.unitType, this.valueInSpecifiedUnits);\r
+ }\r
+ }\r
+};\r
+function SVGAnimatedLength() {\r
+ /*readonly SVGLength*/ this.animVal;\r
+ this.baseVal = new SVGLength();\r
+ this.baseVal.unitType = 1;\r
+ return this;\r
+};\r
+function SVGLengthList() {\r
+ return this;\r
+};\r
+/*SVGLengthListのメソッドはSVGPathSegListを参照*/\r
+\r
+function SVGAnimatedLengthList() {\r
+ /*readonly SVGNumberList*/ this.animVal = this.baseVal = new SVGLengthList();\r
+ return this;\r
+};\r
+function SVGAngle() { \r
+ return this;\r
+};\r
+SVGAngle.prototype = {\r
+ /*readonly attribute unsigned short*/ unitType : 0,\r
+ /*attribute float*/ value : 0,\r
+ // raises DOMException on setting\r
+ /*attribute float*/ valueInSpecifiedUnits : 0,\r
+ // raises DOMException on setting\r
+ /*attribute DOMString*/ valueAsString : "0",\r
+ // raises DOMException on setting\r
+ /*void*/ newValueSpecifiedUnits : function (/*in unsigned short*/ unitType, /*in float*/ valueInSpecifiedUnits ) {\r
+ var n = 1,\r
+ _s = ""; //nは各単位から度への変換数値。_sは単位の文字列を表す\r
+ if (unitType === /*SVGAngle.SVG_ANGLETYPE_UNSPECIFIED*/ 1) {\r
+ } else if (unitType === /*SVGAngle.SVG_ANGLETYPE_DEG*/ 2) {\r
+ _s = "deg";\r
+ } else if (unitType === /*SVGAngle.SVG_ANGLETYPE_RAD*/ 3) {\r
+ n = Math.PI / 180;\r
+ _s = "rad";\r
+ } else if (unitType === /*SVGAngle.SVG_ANGLETYPE_GRAD*/ 4) {\r
+ n = 9 / 10;\r
+ _s = "grad";\r
+ } else {\r
+ throw new DOMException(/*DOMException.NOT_SUPPORTED_ERR*/ 9);\r
+ }\r
+ this.unitType = unitType;\r
+ this.value = valueInSpecifiedUnits * n;\r
+ this.valueInSpecifiedUnits = valueInSpecifiedUnits;\r
+ this.valueAsString = valueInSpecifiedUnits + _s;\r
+ n = _s = void 0;\r
+ //raises( DOMException );\r
+ },\r
+ /*void*/ convertToSpecifiedUnits : function (/*in unsigned short*/ unitType ) {\r
+ if (this.value === 0) {\r
+ this.newValueSpecifiedUnits(unitType, 0);\r
+ return;\r
+ }\r
+ var v = this.value;\r
+ this.newValueSpecifiedUnits(unitType, this.valueInSpecifiedUnits);\r
+ v = v / this.value * this.valueInSpecifiedUnits;\r
+ this.newValueSpecifiedUnits(unitType, v); \r
+ //raises( DOMException );\r
+ }\r
+};\r
+// Angle Unit Types\r
+/*const unsigned short SVGAngle.SVG_ANGLETYPE_UNKNOWN = 0;\r
+/*const unsigned short SVGAngle.SVG_ANGLETYPE_UNSPECIFIED = 1;\r
+/*const unsigned short SVGAngle.SVG_ANGLETYPE_DEG = 2;\r
+/*const unsigned short SVGAngle.SVG_ANGLETYPE_RAD = 3;\r
+/*const unsigned short SVGAngle.SVG_ANGLETYPE_GRAD = 4;*/\r
+function SVGAnimatedAngle() { \r
+ /*readonly attribute SVGAngle*/ this.baseVal = new SVGAngle();\r
+ /*readonly attribute SVGAngle*/ this.animVal = this.baseVal;\r
+ return this;\r
+};\r
+function SVGColor() {\r
+ CSSValue.apply(this);\r
+ /*readonly css::RGBColor*/ this.rgbColor = new RGBColor();\r
+ return this;\r
+};\r
+\r
+ // Color Types\r
+/*unsigned short SVGColor.SVG_COLORTYPE_UNKNOWN = 0;\r
+/*unsigned short SVGColor.SVG_COLORTYPE_RGBCOLOR = 1;\r
+/*unsigned short SVGColor.SVG_COLORTYPE_RGBCOLOR_ICCCOLOR = 2;\r
+/*unsigned short SVGColor.SVG_COLORTYPE_CURRENTCOLOR = 3;*/\r
+SVGColor.prototype = Object._create(CSSValue); //ノードのプロトタイプチェーンを作って、継承\r
+\r
+(function(){\r
+ /*readonly unsigned short*/ this.colorType = /*SVGColor.SVG_COLORTYPE_UNKNOWN*/ 0;\r
+ /*readonly SVGICCColor*/ this.iccColor = null;\r
+ this._regD = /\d+/g;\r
+ this._regDP = /[\d.]+%/g;\r
+ this._exceptionsvg = /*SVGException.SVG_INVALID_VALUE_ERR*/ 1;\r
+ /*void*/ this.setRGBColor = function(/*DOMString*/ rgbColor ){\r
+ var s,\r
+ _parseInt,\r
+ r, g, b;\r
+ if (!rgbColor || (typeof rgbColor !== "string")) {\r
+ throw new SVGException(this._exceptionsvg);\r
+ }\r
+ rgbColor = this._keywords[rgbColor] || rgbColor;\r
+ if (rgbColor.indexOf("%", 5) > 0) { // %を含むrgb形式の場合\r
+ rgbColor = rgbColor.replace(this._regDP, function(s) {\r
+ return Math.round((2.55 * parseFloat(s)));\r
+ });\r
+ s = rgbColor.match(this._regD);\r
+ } else if (rgbColor.indexOf("#") === 0) { //#を含む場合\r
+ s = [];\r
+ _parseInt = parseInt;\r
+ if (rgbColor.length < 5) {\r
+ r = rgbColor.charAt(1);\r
+ g = rgbColor.charAt(2);\r
+ b = rgbColor.charAt(3);\r
+ rgbColor = "#" + r + r + g + g + b + b;\r
+ }\r
+ s[0] = _parseInt(rgbColor.slice(1, 3), 16)+ "";\r
+ s[1] = _parseInt(rgbColor.slice(3, 5), 16)+ "";\r
+ s[2] = _parseInt(rgbColor.slice(5, 7), 16)+ "";\r
+ r = g = b = void 0;\r
+ } else {\r
+ s = rgbColor.match(this._regD);\r
+ if (!s || (s.length < 3)) { //数値が含まれていなければ強制的に終了\r
+ rgbColor = void 0;\r
+ throw new SVGException(this._exceptionsvg);\r
+ }\r
+ }\r
+ this.rgbColor.red.setFloatValue(/*CSSPrimitiveValue.CSS_NUMBER*/ 1, s[0]);\r
+ this.rgbColor.green.setFloatValue(1, s[1]);\r
+ this.rgbColor.blue.setFloatValue(1, s[2]);\r
+ rgbColor = s = _parseInt = void 0;\r
+};\r
+\r
+// raises( SVGException );\r
+/*void*/ this.setColor =function(/*unsigned short*/ colorType, /*DOMString*/ rgbColor, /*DOMString*/ iccColor ){\r
+ this.colorType = colorType;\r
+ if ((colorType === /*SVGColor.SVG_COLORTYPE_RGBCOLOR*/ 1) && iccColor) {\r
+ throw new SVGException(this._exceptionsvg);\r
+ } else if (colorType === /*SVGColor.SVG_COLORTYPE_RGBCOLOR*/ 1) {\r
+ this.setRGBColor(rgbColor);\r
+ } else if (rgbColor && (colorType === /*SVGColor.SVG_COLORTYPE_CURRENTCOLOR*/ 3)) {\r
+ this.setRGBColor(rgbColor);\r
+ } else if ((colorType === /*SVGColor.SVG_COLORTYPE_UNKNOWN*/ 0) && (rgbColor || iccColor)) {\r
+ throw new SVGException(this._exceptionsvg);\r
+ } else if ((colorType === /*SVGColor.SVG_COLORTYPE_RGBCOLOR_ICCCOLOR*/ 2) && (rgbColor || !iccColor)) {\r
+ throw new SVGException(this._exceptionsvg);\r
+ }\r
+ colorType = rgbColor = void 0;\r
+};\r
+// raises( SVGException );\r
+//色キーワード\r
+this._keywords = {\r
+ aliceblue: "rgb(240,248,255)",\r
+ antiquewhite: "rgb(250,235,215)",\r
+ aqua: "rgb(0,255,255)",\r
+ aquamarine: "rgb(127,255,212)",\r
+ azure: "rgb(240,255,255)",\r
+ beige: "rgb(245,245,220)",\r
+ bisque: "rgb(255,228,196)",\r
+ black: "rgb(0,0,0)",\r
+ blanchedalmond:"rgb(255,235,205)",\r
+ blue: "rgb(0,0,255)",\r
+ blueviolet: "rgb(138,43,226)",\r
+ brown: "rgb(165,42,42)",\r
+ burlywood: "rgb(222,184,135)",\r
+ cadetblue: "rgb(95,158,160)",\r
+ chartreuse: "rgb(127,255,0)",\r
+ chocolate: "rgb(210,105,30)",\r
+ coral: "rgb(255,127,80)",\r
+ cornflowerblue:"rgb(100,149,237)",\r
+ cornsilk: "rgb(255,248,220)",\r
+ crimson: "rgb(220,20,60)",\r
+ cyan: "rgb(0,255,255)",\r
+ darkblue: "rgb(0,0,139)",\r
+ darkcyan: "rgb(0,139,139)",\r
+ darkgoldenrod:"rgb(184,134,11)",\r
+ darkgray: "rgb(169,169,169)",\r
+ darkgreen: "rgb(0,100,0)",\r
+ darkgrey: "rgb(169,169,169)",\r
+ darkkhaki: "rgb(189,183,107)",\r
+ darkmagenta: "rgb(139,0,139)",\r
+ darkolivegreen:"rgb(85,107,47)",\r
+ darkorange: "rgb(255,140,0)",\r
+ darkorchid: "rgb(153,50,204)",\r
+ darkred: "rgb(139,0,0)",\r
+ darksalmon: "rgb(233,150,122)",\r
+ darkseagreen: "rgb(143,188,143)",\r
+ darkslateblue:"rgb(72,61,139)",\r
+ darkslategray:"rgb(47,79,79)",\r
+ darkslategrey:"rgb(47,79,79)",\r
+ darkturquoise:"rgb(0,206,209)",\r
+ darkviolet: "rgb(148,0,211)",\r
+ deeppink: "rgb(255,20,147)",\r
+ deepskyblue: "rgb(0,191,255)",\r
+ dimgray: "rgb(105,105,105)",\r
+ dimgrey: "rgb(105,105,105)",\r
+ dodgerblue: "rgb(30,144,255)",\r
+ firebrick: "rgb(178,34,34)",\r
+ floralwhite: "rgb(255,250,240)",\r
+ forestgreen: "rgb(34,139,34)",\r
+ fuchsia: "rgb(255,0,255)",\r
+ gainsboro: "rgb(220,220,220)",\r
+ ghostwhite: "rgb(248,248,255)",\r
+ gold: "rgb(255,215,0)",\r
+ goldenrod: "rgb(218,165,32)",\r
+ gray: "rgb(128,128,128)",\r
+ grey: "rgb(128,128,128)",\r
+ green: "rgb(0,128,0)",\r
+ greenyellow: "rgb(173,255,47)",\r
+ honeydew: "rgb(240,255,240)",\r
+ hotpink: "rgb(255,105,180)",\r
+ indianred: "rgb(205,92,92)",\r
+ indigo: "rgb(75,0,130)",\r
+ ivory: "rgb(255,255,240)",\r
+ khaki: "rgb(240,230,140)",\r
+ lavender: "rgb(230,230,250)",\r
+ lavenderblush:"rgb(255,240,245)",\r
+ lawngreen: "rgb(124,252,0)",\r
+ lemonchiffon: "rgb(255,250,205)",\r
+ lightblue: "rgb(173,216,230)",\r
+ lightcoral: "rgb(240,128,128)",\r
+ lightcyan: "rgb(224,255,255)",\r
+ lightgoldenrodyellow:"rgb(250,250,210)",\r
+ lightgray: "rgb(211,211,211)",\r
+ lightgreen: "rgb(144,238,144)",\r
+ lightgrey: "rgb(211,211,211)",\r
+ lightpink: "rgb(255,182,193)",\r
+ lightsalmon: "rgb(255,160,122)",\r
+ lightseagree: "rgb(32,178,170)",\r
+ lightskyblue: "rgb(135,206,250)",\r
+ lightslategray:"rgb(119,136,153)",\r
+ lightslategrey:"rgb(119,136,153)",\r
+ lightsteelblue:"rgb(176,196,222)",\r
+ lightyellow: "rgb(255,255,224)",\r
+ lime: "rgb(0,255,0)",\r
+ limegreen: "rgb(50,205,50)",\r
+ linen: "rgb(250,240,230)",\r
+ magenta: "rgb(255,0,255)",\r
+ maroon: "rgb(128,0,0)",\r
+ mediumaquamarine:"rgb(102,205,170)",\r
+ mediumblue: "rgb(0,0,205)",\r
+ mediumorchid: "rgb(186,85,211)",\r
+ mediumpurple: "rgb(147,112,219)",\r
+ mediumseagreen:"rgb(60,179,113)",\r
+ mediumslateblue:"rgb(123,104,238)",\r
+ mediumspringgreen:"rgb(0,250,154)",\r
+ mediumturquoise:"rgb(72,209,204)",\r
+ mediumvioletred:"rgb(199,21,133)",\r
+ midnightblue: "rgb(25,25,112)",\r
+ mintcream: "rgb(245,255,250)",\r
+ mistyrose: "rgb(255,228,225)",\r
+ moccasin: "rgb(255,228,181)",\r
+ navajowhite: "rgb(255,222,173)",\r
+ navy: "rgb(0,0,128)",\r
+ oldlace: "rgb(253,245,230)",\r
+ olive: "rgb(128,128,0)",\r
+ olivedrab: "rgb(107,142,35)",\r
+ orange: "rgb(255,165,0)",\r
+ orangered: "rgb(255,69,0)",\r
+ orchid: "rgb(218,112,214)",\r
+ palegoldenrod: "rgb(238,232,170)",\r
+ palegreen: "rgb(152,251,152)",\r
+ paleturquoise: "rgb(175,238,238)",\r
+ palevioletred: "rgb(219,112,147)",\r
+ papayawhip: "rgb(255,239,213)",\r
+ peachpuff: "rgb(255,218,185)",\r
+ peru: "rgb(205,133,63)",\r
+ pink: "rgb(255,192,203)",\r
+ plum: "rgb(221,160,221)",\r
+ powderblue: "rgb(176,224,230)",\r
+ purple: "rgb(128,0,128)",\r
+ red: "rgb(255,0,0)",\r
+ rosybrown: "rgb(188,143,143)",\r
+ royalblue: "rgb(65,105,225)",\r
+ saddlebrown: "rgb(139,69,19)",\r
+ salmon: "rgb(250,128,114)",\r
+ sandybrown: "rgb(244,164,96)",\r
+ seagreen: "rgb(46,139,87)",\r
+ seashell: "rgb(255,245,238)",\r
+ sienna: "rgb(160,82,45)",\r
+ silver: "rgb(192,192,192)",\r
+ skyblue: "rgb(135,206,235)",\r
+ slateblue: "rgb(106,90,205)",\r
+ slategray: "rgb(112,128,144)",\r
+ slategrey: "rgb(112,128,144)",\r
+ snow: "rgb(255,250,250)",\r
+ springgreen: "rgb(0,255,127)",\r
+ steelblue: "rgb(70,130,180)",\r
+ tan: "rgb(210,180,140)",\r
+ teal: "rgb(0,128,128)",\r
+ thistle: "rgb(216,191,216)",\r
+ tomato: "rgb(255,99,71)",\r
+ turquoise: "rgb(64,224,208)",\r
+ violet: "rgb(238,130,238)",\r
+ wheat: "rgb(245,222,179)",\r
+ white: "rgb(255,255,255)",\r
+ whitesmoke: "rgb(245,245,245)",\r
+ yellow: "rgb(255,255,0)",\r
+ yellowgreen: "rgb(154,205,50)"\r
+};\r
+}).apply(SVGColor.prototype);\r
+\r
+function SVGRect() { \r
+ /*float*/ this.x = 0;\r
+ // raises DOMException on setting\r
+ /*float*/ this.y = 0;\r
+ // raises DOMException on setting\r
+ /*float*/ this.width = 0;\r
+ // raises DOMException on setting\r
+ /*float*/ this.height = 0;\r
+ // raises DOMException on setting\r
+ return this;\r
+};\r
+\r
+function SVGAnimatedRect() { \r
+ /*readonly SVGRect*/ this.animVal = this.baseVal = new SVGRect();\r
+ return this;\r
+};\r
+\r
+/*SVGUnitTypes = { \r
+ // Unit Types\r
+ /*unsigned short SVG_UNIT_TYPE_UNKNOWN : 0,\r
+ /*unsigned short SVG_UNIT_TYPE_USERSPACEONUSE : 1,\r
+ /*unsigned short SVG_UNIT_TYPE_OBJECTBOUNDINGBOX : 2\r
+};*/\r
+function SVGStylable() {\r
+ /*readonly attribute SVGAnimatedString*/ this.className = new SVGAnimatedString();\r
+ /*readonly attribute css::CSSStyleDeclaration*/ this.style = new CSSStyleDeclaration();\r
+ this._attributeStyle = new CSSStyleDeclaration(); //プレゼンテーション属性の値を格納する\r
+ //styleのcssTextプロパティを解析するリスナーを登録しておく\r
+};\r
+/*getPresentationAttributeメソッド\r
+ *プレゼンテーション属性の値をCSSValueとして得る。これはCSSのスタイルの設定値を定めるときや、内部の動的処理に役立つ\r
+ */\r
+/*css::CSSValue*/ SVGElement.prototype.getPresentationAttribute = function( /*DOMString*/ name ){\r
+ var s = this._attributeStyle.getPropertyCSSValue(name);\r
+ if (s) {\r
+ return s;\r
+ } else {\r
+ return null;\r
+ }\r
+};\r
+\r
+/*SVGURIReferenceオブジェクトはURI参照を用いる要素に適用される\r
+ *SIEでは、もっぱらXLink言語の処理を行う\r
+ */\r
+function SVGURIReference() {\r
+ /*readonly SVGAnimatedString*/ this.href = new SVGAnimatedString();\r
+ this._instance = null; //埋め込みの場合に、読み込んだDOMツリーを結び付けておくプロパティ\r
+ this._text = "";\r
+ this.addEventListener("DOMAttrModified", function(evt){\r
+ if ((evt.relatedNode.namespaceURI === "http://www.w3.org/1999/xlink") && (evt.attrName === "xlink:href")) {\r
+ evt.target.href.baseVal = evt.newValue;\r
+ /*_svgload_limitedを+1とすることで、\r
+ *SVGLoadイベントは発火されなくなる。1を引く必要がある\r
+ */\r
+ evt.target.ownerDocument.documentElement._svgload_limited++;\r
+ }\r
+ evt = void 0;\r
+ }, false);\r
+ this.addEventListener("DOMNodeInserted", function(evt){\r
+ var tar = evt.target;\r
+ if (evt.eventPhase === /*Event.BUBBLING_PHASE*/ 3) {\r
+ return; //強制終了させる\r
+ }\r
+ tar.addEventListener("DOMNodeInsertedIntoDocument", function(evt){\r
+ var tar = evt.target,\r
+ base,\r
+ href = tar.href.baseVal,\r
+ show, egbase, ep, b, lh, uri, xmlhttp, ui, id, doc, ele, ev;\r
+ /*xlink:href属性とxml:base属性を手がかりに、\r
+ *ハイパーリンクのURIを決定する処理を行う\r
+ */\r
+ if (href !== "") { //xlink:href属性が指定されたとき\r
+ egbase = tar.xmlbase;\r
+ if (!egbase) {\r
+ ep = tar.parentNode;\r
+ b = null;\r
+ while (!b && ep) {\r
+ b = ep.xmlbase;\r
+ ep = ep.parentNode;\r
+ }\r
+ base = b;\r
+ if (!b) { //xml:baseの指定がなければ\r
+ if (href.indexOf("#") !== 0) { //href属性において#が一番につかない場合\r
+ lh = location.href;\r
+ base = lh.replace(/\/[^\/]+?$/, "/"); //URIの最後尾にあるファイル名は消す。例: /n/sie.js -> /n/\r
+ } else {\r
+ base = location.href;\r
+ }\r
+ }\r
+ } else {\r
+ base = egbase;\r
+ }\r
+ if (href.indexOf(":") !== -1) { //絶対URIの場合\r
+ base = "";\r
+ }\r
+ uri = base + href;\r
+ show = tar.getAttributeNS("http://www.w3.org/1999/xlink", "show") || "embed";\r
+ if (href.indexOf(".") === 0) { //相対URIの場合\r
+ uri = href;\r
+ }\r
+ if (show === "replace") {\r
+ tar._tar.setAttribute("href", uri);\r
+ } else if (show === "new") {\r
+ tar._tar.setAttribute("target", "_blank");\r
+ tar._tar.setAttribute("href", uri);\r
+ } else if (show === "embed") {\r
+ xmlhttp = NAIBU.xmlhttp;\r
+ ui = uri.indexOf("#");\r
+ if (ui > -1) {\r
+ id = uri.slice(ui+1);\r
+ uri = uri.replace(/#.+$/, "");\r
+ } else {\r
+ id = null;\r
+ }\r
+ if (href.indexOf("#") === 0) { //URIが#で始まるのであれば\r
+ doc = tar.ownerDocument;\r
+ ele = doc.getElementById(id);\r
+ tar._instance = ele;\r
+ ev = doc.createEvent("SVGEvents");\r
+ ev.initEvent("S_Load", false, false);\r
+ tar.dispatchEvent(ev);\r
+ tar = xmlhttp = void 0;\r
+ } else if (uri.indexOf("data:") > -1) {\r
+ tar._tar.src = uri;\r
+ tar = xmlhttp = void 0;\r
+ } else if ((uri.indexOf("http:") > -1) || (uri.indexOf(".") === 0)){\r
+ if ((tar.localName === "image") && (uri.indexOf(".svg") === -1)) {\r
+ tar._tar.src = uri;\r
+ } else {\r
+ /*ここの_svgload_limitedは、リンクを読み込んだ後でSVGLoadイベントを実行させるという遅延処理で必要*/\r
+ tar.ownerDocument.documentElement._svgload_limited++;\r
+ xmlhttp.open("GET", uri, false);\r
+ xmlhttp.setRequestHeader("X-Requested-With", "XMLHttpRequest");\r
+ xmlhttp.onreadystatechange = function() {\r
+ if ((xmlhttp.readyState === 4) && (xmlhttp.status === 200)) {\r
+ var type = xmlhttp.getResponseHeader('Content-Type') || "text",\r
+ doc, str, ele, ev;\r
+ if ((type.indexOf("text") > -1) || (type.indexOf("xml") > -1) || (type.indexOf("script") > -1)) { //ファイルがtext形式である場合\r
+ /*responseXMLを使うと、時々、空のデータを返すことがあるため(原因はcontent-typeが"text/xml"など特定のものでないと受け付けないため)、\r
+ *ここでは、responseTextを用いる\r
+ */\r
+ /*script要素とstyle要素は、\r
+ *_textプロパティに読み込んだテキストを格納しておく\r
+ *それら以外は、_instanceプロパティにDOMツリーを格納しておく\r
+ */\r
+ if (tar.localName !== "script" && tar.localName !== "style") {\r
+ doc = new ActiveXObject("MSXML2.DomDocument");\r
+ str = xmlhttp.responseText.replace(/!DOCTYPE/,"!--").replace(/(dtd">|\]>)/,"-->");\r
+ NAIBU.doc.async = false;\r
+ NAIBU.doc.validateOnParse = false;\r
+ NAIBU.doc.resolveExternals = false;\r
+ NAIBU.doc.preserveWhiteSpace = false;\r
+ doc.loadXML(str);\r
+ ele = doc.documentElement;\r
+ tar._instance = tar.ownerDocument.importNode(ele, true);\r
+ if (id) {\r
+ tar._instance = tar._instance.ownerDocument.getElementById(id);\r
+ }\r
+ } else {\r
+ tar._text = xmlhttp.responseText;\r
+ }\r
+ } else if (!!tar._tar) {\r
+ tar._tar.src = uri;\r
+ }\r
+ /*S_LoadイベントとはSIE独自のイベント。\r
+ *XLink言語によって、リンク先のコンテンツが読み込まれた時点で発火する\r
+ */\r
+ ev = tar.ownerDocument.createEvent("SVGEvents");\r
+ ev.initEvent("S_Load", false, false);\r
+ tar.dispatchEvent(ev);\r
+ tar.ownerDocument.documentElement._svgload_limited--;\r
+ /*すべてのリンクが読み込みを終了した場合、SVGLoadイベントを発火*/\r
+ if (tar.ownerDocument.documentElement._svgload_limited < 0) {\r
+ ev = tar.ownerDocument.createEvent("SVGEvents");\r
+ ev.initEvent("SVGLoad", false, false);\r
+ tar.ownerDocument.documentElement.dispatchEvent(ev);\r
+ }\r
+ tar = type = doc = str = ev = void 0;\r
+ /*IEのメモリリーク対策として、空関数を入力*/\r
+ xmlhttp.onreadystatechange = NAIBU.emptyFunction;\r
+ xmlhttp = void 0;\r
+ }\r
+ };\r
+ xmlhttp.send(null);\r
+ }\r
+ }\r
+ }\r
+ tar.ownerDocument.documentElement._svgload_limited--;\r
+ }\r
+ evt = base = href = egbase = ep = b = lh = uri = ui = id = doc = ele = ev = show= void 0;\r
+ }, false);\r
+ tar = evt = void 0;\r
+ }, false);\r
+ return this;\r
+};\r
+function SVGCSSRule() { \r
+ CSSRule.apply(this, arguments);\r
+ // Additional CSS RuleType to support ICC color specifications\r
+ /*const unsigned short*/ this.COLOR_PROFILE_RULE = 7;\r
+ return this;\r
+};\r
+SVGCSSRule.prototype = Object._create(CSSRule); //ノードのプロトタイプチェーンを作って、継承\r
+\r
+/*SVGDocument\r
+ *SVGの文書オブジェクト\r
+ */\r
+function SVGDocument(){\r
+ Document.apply(this);\r
+ DocumentStyle.apply(this);\r
+ /*readonly DOMString*/ this.title = "";\r
+ /*readonly DOMString*/ this.referrer = document.referrer;\r
+ /*readonly DOMString*/ this.domain = document.domain;\r
+ /*readonly DOMString*/ this.URL = document.location;\r
+ /*readonly SVGSVGElement*/ this.rootElement;\r
+ return this;\r
+};\r
+SVGDocument.prototype = Object._create(Document); //ノードのプロトタイプチェーンを作って、継承\r
+\r
+/*軽量化のために、頻繁に使われる処理をSVGDocumentの独自メソッドとしてまとめておく*/\r
+SVGDocument.prototype._domnodeEvent = function() {\r
+ var evtt = this.createEvent("MutationEvents");\r
+ evtt.initMutationEvent("DOMNodeInsertedIntoDocument", false, false, null, null, null, null, null);\r
+ return evtt;\r
+};\r
+\r
+/*SVGSVGElement\r
+ *svg要素をあらわすオブジェクト\r
+ */\r
+function SVGSVGElement(_doc) {\r
+ SVGElement.apply(this, arguments);\r
+ _doc && (this._tar = _doc.createElement("v:group"));\r
+ _doc = void 0;\r
+ /*_svgload_limitedはSVGLoadイベントを発火させる判定基準。\r
+ * Xlink言語が使われていない限り0であり、SVGLoadイベントが発火される*/\r
+ this._svgload_limited = 0;\r
+/* SVGElement,\r
+ SVGTests,\r
+ SVGLangSpace,\r
+ SVGExternalResourcesRequired,\r
+ SVGStylable,\r
+ SVGLocatable,\r
+ SVGFitToViewBox,\r
+ SVGZoomAndPan,\r
+ events::EventTarget,\r
+ events::DocumentEvent,\r
+ css::ViewCSS,\r
+ css::DocumentCSS {*/\r
+ /*以下のx,y,width,heightプロパティは\r
+ *それぞれ、svg要素の同名属性に対応。たとえば、xならば、x属性に対応している\r
+ *1000というのは、W3Cで触れていないため、独自の初期値を採用\r
+ */\r
+ var slen = SVGAnimatedLength;\r
+ /*readonly SVGAnimatedLength*/ this.x = new slen();\r
+ /*readonly SVGAnimatedLength*/ this.y = new slen();\r
+ /*readonly SVGAnimatedLength*/ this.width = new slen();\r
+ /*readonly SVGAnimatedLength*/ this.height = new slen();\r
+ slen = void 0;\r
+ /*DOMString*/ this.contentScriptType = "application/ecmascript"; //古い仕様では、text/ecmascript\r
+ /*DOMString*/ this.contentStyleType = "text/css";\r
+ /*readonly SVGRect*/ this.viewport = this.createSVGRect();\r
+ /*useCurrentViewプロパティ\r
+ * view要素やハイパーリンクなどで呼び出された場合、true。それ以外の通常表示はfalse。\r
+ */\r
+ /*boolean*/ this.useCurrentView = false;\r
+ /*currentViewプロパティ\r
+ * ズームやパンがされていない初期表示のviewBoxプロパティなどを示す。通常はDOM属性と連動\r
+ */\r
+ /*readonly SVGViewSpec*/ this.currentView = new SVGViewSpec(this);\r
+ /*もし、画像をズームやパンしたとき、どのような倍率になるかを\r
+ *以下のプロパティを使って次の行列で示すことができる\r
+ *2x3 行列 [a b c d e f] = [currentScale 0 0 currentScale currentTranslate.x currentTranslate.y] \r
+ */\r
+ /*float*/ this.currentScale = 1;\r
+ /*readonly SVGPoint*/ this.currentTranslate = this.createSVGPoint();\r
+ /*以下は、SVGFitToViewBoxのインターフェースを用いる\r
+ *もし、ズームやパンがあれば、真っ先にこれらのプロパティを別のオブジェクトに変更すること\r
+ */\r
+ /*readonly SVGAnimatedRect*/ this.viewBox = this.currentView.viewBox;\r
+ /*readonly SVGAnimatedPreserveAspectRatio*/ this.preserveAspectRatio = this.currentView.preserveAspectRatio;\r
+ /*unsigned short*/ this.zoomAndPan = /*SVGZoomAndPan.SVG_ZOOMANDPAN_DISABLE*/ 1;\r
+ this._tx = 0;\r
+ this._ty = 0;\r
+ /*int*/ this._currentTime = 0;\r
+ /*DOMAttrModifiedイベントを利用して、\r
+ *随時、属性の値をDOMプロパティに変換しておくリスナー登録\r
+ */\r
+ this.addEventListener("DOMAttrModified", function(evt){\r
+ if (evt.eventPhase === /*Event.BUBBLING_PHASE*/ 3) {\r
+ return; //強制終了させる\r
+ }\r
+ var tar = evt.target,\r
+ name = evt.attrName,\r
+ tv, ovb, par, tp, sa, mos;\r
+ if (name === "viewBox") {\r
+ tar._cacheScreenCTM = null;\r
+ tv = tar.viewBox.baseVal;\r
+ ovb = evt.newValue.replace(/^\s+|\s+$/g, "").split(/[\s,]+/);\r
+ tv.x = parseFloat(ovb[0]);\r
+ tv.y = parseFloat(ovb[1]);\r
+ tv.width = parseFloat(ovb[2]);\r
+ tv.height = parseFloat(ovb[3]);\r
+ tar.viewBox.baseVal._isUsed = 1;\r
+ } else if (name === "preserveAspectRatio") {\r
+ tar._cacheScreenCTM = null;\r
+ par = evt.newValue;\r
+ tp = tar.preserveAspectRatio.baseVal;\r
+ sa = 1;\r
+ mos = /*SVGPreserveAspectRatio.SVG_MEETORSLICE_UNKNOWN*/ 0;\r
+ if (!!par.match(/x(Min|Mid|Max)Y(Min|Mid|Max)(?:\s+(meet|slice))?/)) {\r
+ switch (RegExp.$1) {\r
+ case "Min":\r
+ sa += 1;\r
+ break;\r
+ case "Mid":\r
+ sa += 2;\r
+ break;\r
+ case "Max":\r
+ sa += 3;\r
+ break;\r
+ }\r
+ switch (RegExp.$2) {\r
+ case "Min":\r
+ break;\r
+ case "Mid":\r
+ sa += 3;\r
+ break;\r
+ case "Max":\r
+ sa += 6;\r
+ break;\r
+ }\r
+ if (RegExp.$3 === "slice") {\r
+ mos = /*SVGPreserveAspectRatio.SVG_MEETORSLICE_SLICE*/ 2;\r
+ } else {\r
+ mos = /*SVGPreserveAspectRatio.SVG_MEETORSLICE_MEET*/ 1;\r
+ }\r
+ }\r
+ tp.align = sa;\r
+ tp.meetOrSlice = mos;\r
+ } else if (name === "width") {\r
+ /*viewportを更新する*/\r
+ tar.viewport.width = tar.width.baseVal.value;\r
+ } else if (name === "height") {\r
+ tar.viewport.height = tar.height.baseVal.value;\r
+ }\r
+ evt = name = tv = ovb = par = tp = sa = mos = void 0;\r
+ }, false);\r
+ this.addEventListener("SVGLoad", function(evt){\r
+ /*以下のDOMAttrModifiedは浮上フェーズのときに、再描画をするように\r
+ *処理を書いたもの。属性が書き換わるたびに、再描画される\r
+ */\r
+ evt.target.addEventListener("DOMAttrModified", function(evt){\r
+ var tar,\r
+ evtt, tce, slist;\r
+ if (evt.eventPhase === /*Event.BUBBLING_PHASE*/ 3) {\r
+ tar = evt.target;\r
+ if (tar.parentNode) {\r
+ evtt = tar.ownerDocument._domnodeEvent();\r
+ evtt.target = tar;\r
+ evtt.eventPhase = /*Event.AT_TARGET*/ 2;\r
+ tce = tar._capter; //tceは登録しておいたリスナーのリスト\r
+ for (var j=0,tcli=tce.length;j<tcli;++j){\r
+ if (tce[j]) {\r
+ tce[j].handleEvent(evtt);\r
+ }\r
+ }\r
+ if (((tar.localName === "g") || (tar.localName === "a")) && (tar.namespaceURI === "http://www.w3.org/2000/svg")) {\r
+ tar._cacheMatrix = void 0; //キャッシュを消去\r
+ if (tar.firstChild) {\r
+ slist = tar.getElementsByTagNameNS("http://www.w3.org/2000/svg", "*");\r
+ for (var i=0,sli=slist.length;i<sli;++i) {\r
+ tar = slist[i];\r
+ tar._cacheMatrix = void 0;\r
+ evtt = tar.ownerDocument.createEvent("MutationEvents");\r
+ evtt.initMutationEvent("DOMNodeInsertedIntoDocument", false, false, null, null, null, null, null);\r
+ evtt.target = tar;\r
+ evtt.eventPhase = /*Event.AT_TARGET*/ 2;\r
+ tce = tar._capter; //tceは登録しておいたリスナーのリスト\r
+ for (var j=0,tcli=tce.length;j<tcli;++j){\r
+ if (tce[j]) {\r
+ tce[j].handleEvent(evtt);\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+ evtt = tar = evt = tce = slist = void 0;\r
+ }, false);\r
+ evt.target.addEventListener("DOMNodeRemovedFromDocument", function(evt){\r
+ var tar = evt.target;\r
+ tar._tar && tar._tar.parentNode && tar._tar.parentNode.removeChild(tar._tar);\r
+ evt = tar = void 0;\r
+ }, true);\r
+ evt = void 0;\r
+ }, false);\r
+ return this;\r
+};\r
+SVGSVGElement.prototype = Object._create(SVGElement);\r
+(function(sproto) {\r
+/*void*/ sproto.forceRedraw = function() {\r
+};\r
+/*float*/ sproto.getCurrentTime = function(){\r
+ return (this._currentTime);\r
+};\r
+/*void*/ sproto.setCurrentTime = function(/*float*/ seconds ){\r
+ this._currentTime = seconds;\r
+};\r
+/*SVGNumber*/ sproto.createSVGNumber = function(){\r
+ var s = new SVGNumber();\r
+ s.value = 0;\r
+ return s;\r
+};\r
+/*SVGAngle*/ sproto.createSVGAngle = function(){\r
+ var s = new SVGAngle();\r
+ s.value = 0;\r
+ s.unitType = 1;\r
+ return s;\r
+};\r
+/*SVGLength*/ sproto.createSVGLength = function(){\r
+ var s = new SVGLength();\r
+ s.unitType = /*SVG_LENGTHTYPE_NUMBER*/ 1;\r
+ return s;\r
+};\r
+/*SVGPoint*/ sproto.createSVGPoint = function(){\r
+ return new SVGPoint();\r
+};\r
+/*SVGMatrix*/ sproto.createSVGMatrix = function(){\r
+ //単位行列を作成\r
+ return new SVGMatrix();\r
+};\r
+/*SVGRect*/ sproto.createSVGRect = function(){\r
+ return new SVGRect();\r
+};\r
+/*SVGTransform*/ sproto.createSVGTransform = function(){\r
+ var s = this.createSVGTransformFromMatrix(this.createSVGMatrix());\r
+ return s;\r
+};\r
+/*SVGTransform*/ sproto.createSVGTransformFromMatrix = function(/*SVGMatrix*/ matrix ){\r
+ var s = new SVGTransform();\r
+ s.setMatrix(matrix);\r
+ return s;\r
+};\r
+/*getScreenCTM\r
+ *SVGElement(SVGLocatable)で指定しておいたメソッドであるが、ここで、算出方法が違うため、再定義をする\r
+ */\r
+/*SVGMatrix*/ sproto.getScreenCTM = function(){\r
+ if (!!this._cacheScreenCTM) { //キャッシュがあれば\r
+ return (this._cacheScreenCTM);\r
+ }\r
+ var vw = this.viewport.width,\r
+ vh = this.viewport.height,\r
+ vB, par, m, vbx, vby, vbw, vbh, rw, rh, xr, yr, tx, ty, ttps;\r
+ if (!this.useCurrentView) {\r
+ vB = this.viewBox.baseVal;\r
+ par = this.preserveAspectRatio.baseVal; \r
+ } else {\r
+ vB = this.currentView.viewBox.baseVal;\r
+ par = this.currentView.preserveAspectRatio.baseVal;\r
+ }\r
+ if (!!!vB._isUsed) { //viewBox属性が指定されていなければ\r
+ this._tx = this._ty = 0;\r
+ m = this.createSVGMatrix();\r
+ this._cacheScreenCTM = m; //キャッシュを作っておく\r
+ return m;\r
+ } else {\r
+ vbx = vB.x;\r
+ vby = vB.y;\r
+ vbw = vB.width;\r
+ vbh = vB.height;\r
+ rw = vw / vbw;\r
+ rh = vh / vbh;\r
+ xr = 1;\r
+ yr = 1;\r
+ tx = 0;\r
+ ty = 0;\r
+ if (par.align === 1) { //none\r
+ xr = rw;\r
+ yr = rh;\r
+ tx = -vbx * xr;\r
+ ty = -vby * yr;\r
+ } else {\r
+ var ax = (par.align + 1) % 3 + 1;\r
+ var ay = Math.round(par.align / 3);\r
+ switch (par.meetOrSlice) {\r
+ case 1: //meet\r
+ xr = yr = Math.min(rw, rh);\r
+ break;\r
+ case 2: //slice\r
+ xr = yr = Math.max(rw, rh);\r
+ break;\r
+ }\r
+ tx = -vbx * xr;\r
+ ty = -vby * yr;\r
+ switch (ax) {\r
+ case 1: //xMin\r
+ break;\r
+ case 2: //xMid\r
+ tx += (vw - vbw * xr) / 2;\r
+ break;\r
+ case 3: //xMax\r
+ tx += vw - vbw * xr;\r
+ break;\r
+ }\r
+ switch (ay) {\r
+ case 1: //YMin\r
+ break;\r
+ case 2: //YMid\r
+ ty += (vh - vbh * yr) / 2;\r
+ break;\r
+ case 3: //YMax\r
+ ty += vh - vbh * yr;\r
+ break;\r
+ }\r
+ }\r
+ }\r
+ //text要素の位置調整に使うため、ここで、viewの移動量を記録しておく\r
+ this._tx = tx;\r
+ this._ty = ty;\r
+ ttps = this._tar.style;\r
+ ttps.marginLeft = tx+ "px";\r
+ ttps.marginTop = ty+ "px";\r
+ m = this.createSVGMatrix();\r
+ m.a = xr;\r
+ m.d = yr;\r
+ this._cacheScreenCTM = m; //キャッシュを作っておく\r
+ vw = vh = vB = par = vbx = vby = vbw = vbh = rw = rh = xr = yr = tx = ty = ttps = void 0;\r
+ return m;\r
+};\r
+})(SVGSVGElement.prototype);\r
+\r
+ /*interface SVGZoomAndPan*/\r
+ // Zoom and Pan Types\r
+/*SVGZoomAndPan = {\r
+ /*const unsigned short SVG_ZOOMANDPAN_UNKNOWN : 0,\r
+ /*const unsigned short SVG_ZOOMANDPAN_DISABLE : 1,\r
+ /*const unsigned short SVG_ZOOMANDPAN_MAGNIFY : 2\r
+};*/\r
+\r
+function SVGFitToViewBox() {\r
+ /*readonly SVGAnimatedRect*/ this.viewBox = new SVGAnimatedRect();\r
+ /*readonly SVGAnimatedPreserveAspectRatio*/ this.preserveAspectRatio = new SVGAnimatedPreserveAspectRatio();\r
+ return this;\r
+};\r
+function SVGViewSpec(ele) {\r
+ SVGFitToViewBox.apply(this, arguments);\r
+ /*readonly SVGTransformList*/ this.transform = new SVGTransformList();\r
+ /*readonly SVGElement*/ this.viewTarget = ele;\r
+ /*readonly DOMString*/ this.viewBoxString = this.preserveAspectRatioString = this.transformString = this.viewTargetString = "";\r
+ return this;\r
+};\r
+SVGViewSpec.prototype = Object._create(SVGFitToViewBox);\r
+\r
+function SVGGElement(_doc) {\r
+ SVGElement.apply(this);\r
+ this._tar = _doc.createElement("v:group");\r
+ _doc = void 0;\r
+ /*以下の処理は、この子要素ノードがDOMツリーに追加されて初めて、\r
+ *描画が開始されることを示す。つまり、appendChildで挿入されない限り、描画をしない。\r
+ */\r
+ this.addEventListener("DOMNodeInserted", function(evt){\r
+ var tar = evt.target;\r
+ if (evt.eventPhase === /*Event.BUBBLING_PHASE*/ 3) {\r
+ return; //強制終了させる\r
+ }\r
+ var tnext = tar.nextSibling,\r
+ tpart = tar.parentNode._tar,\r
+ isLast = true;\r
+ if (tnext && tnext._tar && tpart && (tnext._tar.parentNode === tpart)) {\r
+ tpart.insertBefore(tar._tar, tnext._tar);\r
+ } else if (tnext && !tnext._tar && tpart) {\r
+ /*以下の処理は、_tarプロパティがない要素オブジェクトがあるため、それに対処するもの\r
+ *use要素や実体参照などは_tarプロパティがないことに注意\r
+ */\r
+ while (tnext) {\r
+ if (tnext._tar && (tnext._tar.parentNode === tpart)) {\r
+ tpart.insertBefore(tar._tar, tnext._tar);\r
+ isLast = false;\r
+ } \r
+ tnext = tnext.nextSibling;\r
+ }\r
+ if (isLast) {\r
+ tpart.appendChild(tar._tar);\r
+ }\r
+ } else if (!tnext && tpart) {\r
+ tpart.appendChild(tar._tar); \r
+ }\r
+ tnext = tpart = isLast = evt = tar = void 0;\r
+ }, false);\r
+ return this;\r
+};\r
+SVGGElement.prototype = Object._create(SVGElement);\r
+\r
+function SVGDefsElement() {\r
+ SVGElement.apply(this, arguments);\r
+ this.style.setProperty("display", "none");\r
+ return this;\r
+};\r
+SVGDefsElement.prototype = Object._create(SVGElement);\r
+\r
+function SVGDescElement() {\r
+ SVGElement.apply(this, arguments);\r
+ return this;\r
+}\r
+SVGDescElement.prototype = Object._create(SVGElement);\r
+\r
+function SVGTitleElement() {\r
+ SVGElement.apply(this, arguments);\r
+ this.addEventListener("DOMCharacterDataModified", function(evt){\r
+ evt.target.ownerDocument.title = evt.target.firstChild.nodeValue;\r
+ }, false);\r
+ return this;\r
+}\r
+SVGTitleElement.prototype = Object._create(SVGElement);\r
+\r
+function SVGSymbolElement(_doc) {\r
+ SVGElement.apply(this, arguments);\r
+ return this;\r
+}\r
+SVGSymbolElement.prototype = Object._create(SVGElement);\r
+\r
+function SVGUseElement() {\r
+ SVGGElement.apply(this, arguments);\r
+ var slen = SVGAnimatedLength;\r
+ /*readonly SVGAnimatedLength*/ this.x = new slen(); //use要素のx属性に対応(以下、同様)\r
+ /*readonly SVGAnimatedLength*/ this.y = new slen();\r
+ /*readonly SVGAnimatedLength*/ this.width = new slen();\r
+ /*readonly SVGAnimatedLength*/ this.height = new slen();\r
+ slen = void 0;\r
+ /*readonly SVGElementInstance*/ this.instanceRoot = new SVGElementInstance(); //参照先インスタンスのルート\r
+ /*readonly SVGElementInstance*/ this.animatedInstanceRoot = new SVGElementInstance();//アニメの最中のインスタンス。静止中は通常\r
+ this.addEventListener("DOMNodeInserted", function(evt){\r
+ if (evt.eventPhase === /*Event.BUBBLING_PHASE*/ 3) {\r
+ return; //強制終了させる\r
+ }\r
+ evt.target.setAttributeNS("http://www.w3.org/1999/xlink", "xlink:show", "embed");\r
+ }, false);\r
+ this.addEventListener("S_Load", function(evt){\r
+ var tar = evt.target,\r
+ style = tar.ownerDocument.defaultView.getComputedStyle(tar, ""),\r
+ fontSize = parseFloat(style.getPropertyValue("font-size")),\r
+ trans = tar.ownerDocument.documentElement.createSVGTransform(),\r
+ tari = tar._instance,\r
+ svg, ti, ta, tn;\r
+ tar.x.baseVal._emToUnit(fontSize);\r
+ tar.y.baseVal._emToUnit(fontSize);\r
+ tar.width.baseVal._emToUnit(fontSize);\r
+ tar.height.baseVal._emToUnit(fontSize);\r
+ tar.instanceRoot = tar.animatedInstanceRoot = tar.ownerDocument.importNode(tari, true);\r
+ trans.setTranslate(tar.x.baseVal.value, tar.y.baseVal.value);\r
+ tar.transform.baseVal.appendItem(trans);\r
+ if (tar._instance.localName === "symbol") {\r
+ /*symbol要素の場合、別途svg要素に置き換える*/\r
+ svg = tar.ownerDocument.createElementNS("http://www.w3.org/2000/svg", "svg");\r
+ svg.addEventListener("DOMNodeInsertedIntoDocument", function(evt){\r
+ /*viewportをsymbol要素として新規に設定*/\r
+ evt.target.nearestViewportElement = evt.currentTarget;\r
+ }, true);\r
+ tar._tar.appendChild(svg._tar);\r
+ tn = tar.getScreenCTM();\r
+ svg.setAttributeNS(null, "width", tar.width.baseVal.value);\r
+ svg.setAttributeNS(null, "height", tar.height.baseVal.value);\r
+ tari.hasAttributeNS(null, "viewBox") && svg.setAttributeNS(null, "viewBox", tari.getAttributeNS(null, "viewBox"));\r
+ tari.hasAttributeNS(null, "preserveAspectRatio") && svg.setAttributeNS(null, "preserveAspectRatio", tari.getAttributeNS(null, "preserveAspectRatio"));\r
+ svg._cacheScreenCTM = tn.multiply(svg.getScreenCTM());\r
+ ti = tar.instanceRoot.firstChild;\r
+ while (ti) {\r
+ ta = ti.nextSibling;\r
+ svg.appendChild(ti);\r
+ ti.getScreenCTM && ti.getScreenCTM();\r
+ ti = ta;\r
+ }\r
+ tar.appendChild(svg);\r
+ } else {\r
+ tar.appendChild(tar.instanceRoot);\r
+ }\r
+ evt = trans = tar = evtt = style = fontSize = svg = ti = ta = tn = void 0;\r
+ }, false);\r
+ SVGURIReference.apply(this);\r
+ return this;\r
+};\r
+SVGUseElement.prototype = Object._create(SVGElement);\r
+\r
+function SVGElementInstance() {\r
+ /*EventTargetの代用として\r
+ *Nodeオブジェクトを継承させる\r
+ */\r
+ Node.apply(this, arguments);\r
+ /*readonly SVGElement*/ this.correspondingElement; //use要素で使われる参照先の要素\r
+ /*readonly SVGUseElement*/ this.correspondingUseElement; //参照先の要素にuse要素が含まれているとき、ここにuse要素を収納\r
+ /*readonly SVGElementInstance*/ this.parentNode;\r
+ /*readonly SVGElementInstanceList*/ this.childNodes;\r
+ /*readonly SVGElementInstance*/ this.firstChild;\r
+ /*readonly SVGElementInstance*/ this.lastChild;\r
+ /*readonly SVGElementInstance*/ this.previousSibling;\r
+ /*readonly SVGElementInstance*/ this.nextSibling;\r
+ return this;\r
+};\r
+SVGElementInstance.prototype = Object._create(Node);\r
+/*SVGElementInstanceList\r
+ */\r
+function SVGElementInstanceList() { \r
+ /*readonly unsigned long*/ this.length = 0;\r
+ return this;\r
+};\r
+/*SVGElementInstance*/ SVGElementInstanceList.prototype.item = function(/*unsigned long*/ index ) {\r
+ return (this[index]);\r
+};\r
+function SVGImageElement(_doc) {\r
+ SVGElement.apply(this, arguments);\r
+ this._tar = _doc.createElement("v:image");\r
+ //以下は、与えられた属性の値に対応する\r
+ var slen = SVGAnimatedLength;\r
+ /*readonly SVGAnimatedLength*/ this.x = new slen();\r
+ /*readonly SVGAnimatedLength*/ this.y = new slen();\r
+ /*readonly SVGAnimatedLength*/ this.width = new slen();\r
+ /*readonly SVGAnimatedLength*/ this.height = new slen();\r
+ _doc = slen = void 0;\r
+ /*readonly SVGAnimatedPreserveAspectRatio*/ this.preserveAspectRatio = new SVGAnimatedPreserveAspectRatio();\r
+ this.addEventListener("DOMNodeInserted", function(evt){\r
+ if (evt.eventPhase === /*Event.BUBBLING_PHASE*/ 3) {\r
+ return; //強制終了させる\r
+ }\r
+ var tar = evt.target;\r
+ tar.setAttributeNS("http://www.w3.org/1999/xlink", "xlink:show", "embed");\r
+ if (tar.nextSibling) {\r
+ if (!!tar.parentNode._tar && !!tar.nextSibling._tar) {\r
+ tar.parentNode._tar.insertBefore(tar._tar, tar.nextSibling._tar);\r
+ }\r
+ } else if (!!tar.parentNode._tar){\r
+ tar.parentNode._tar.appendChild(tar._tar);\r
+ }\r
+ tar.addEventListener("DOMNodeInsertedIntoDocument", function(evt) {\r
+ var tar = evt.target,\r
+ style = tar.ownerDocument.defaultView.getComputedStyle(tar, ""),\r
+ fontSize = parseFloat(style.getPropertyValue("font-size")),\r
+ ts = tar._tar.style,\r
+ ctm = tar.getScreenCTM(),\r
+ po = tar.ownerDocument.documentElement.createSVGPoint(),\r
+ fillOpacity = parseFloat(style.getPropertyValue("fill-opacity")),\r
+ ttfia;\r
+ tar.x.baseVal._emToUnit(fontSize);\r
+ tar.y.baseVal._emToUnit(fontSize);\r
+ tar.width.baseVal._emToUnit(fontSize);\r
+ tar.height.baseVal._emToUnit(fontSize);\r
+ ts.position = "absolute";\r
+ po.x = tar.x.baseVal.value;\r
+ po.y = tar.y.baseVal.value;\r
+ po = po.matrixTransform(ctm);\r
+ ts.left = po.x + "px";\r
+ ts.top = po.y + "px";\r
+ ts.width = tar.width.baseVal.value * ctm.a + "px";\r
+ ts.height = tar.height.baseVal.value * ctm.d + "px";\r
+ if (fillOpacity !== 1) {\r
+ ts.filter = "progid:DXImageTransform.Microsoft.Alpha";\r
+ ttfia = tar._tar.filters.item('DXImageTransform.Microsoft.Alpha');\r
+ ttfia.Style = 0;\r
+ ttfia.Opacity = fillOpacity * 100;\r
+ ttfia = void 0;\r
+ }\r
+ evt = tar = style = fontSize = ts = ctm = po = fillOpacity = void 0;\r
+ }, false);\r
+ evt = tar = void 0;\r
+ }, false);\r
+ SVGURIReference.apply(this);\r
+ return this;\r
+};\r
+SVGImageElement.prototype = Object._create(SVGElement);\r
+\r
+function SVGSwitchElement() {\r
+ SVGElement.apply(this, arguments);\r
+ return this;\r
+};\r
+SVGSwitchElement.prototype = Object._create(SVGElement);\r
+\r
+//bookmarkletから呼び出されたらtrue\r
+var sieb_s;\r
+function GetSVGDocument(ele) {\r
+ this._tar = ele;\r
+ this._next = null;\r
+ return this;\r
+}\r
+function _ca_() {\r
+ if ((NAIBU._that.xmlhttp.readyState === 4) && (NAIBU._that.xmlhttp.status === 200)) {\r
+ NAIBU._that._ca();\r
+ }\r
+};\r
+ GetSVGDocument.prototype = {\r
+ /*_initメソッド\r
+ *object(embed)要素で指定されたSVG文書を読み込んで、SVGを処理して表示させるメソッド\r
+ */\r
+ _init : function() {\r
+ /*objeiはobject要素かembed要素*/\r
+ var xmlhttp = NAIBU.xmlhttp,\r
+ objei = this._tar,\r
+ data;\r
+ if (this._tar.nodeName === "OBJECT") {\r
+ data = "data";\r
+ } else {\r
+ data = "src";\r
+ }\r
+ xmlhttp.open("GET", objei.getAttribute(data), true);\r
+ objei.style.display = "none";\r
+ xmlhttp.setRequestHeader("X-Requested-With", "XMLHttpRequest");\r
+ this.xmlhttp = xmlhttp;\r
+ /*クロージャを利用しないことで、軽量化を計る*/\r
+ NAIBU._that = this;\r
+ xmlhttp.onreadystatechange = _ca_;\r
+ xmlhttp.send(null);\r
+ xmlhttp = objei = data = void 0;\r
+ },\r
+ /*コール関数。全処理を担う*/\r
+ _ca : function() {\r
+ /*responseXMLを使うと、時々、空のデータを返すことがあるため(原因はcontent-typeが"text/xml"など特定のものでないと受け付けないため)、\r
+ *ここでは、responseTextを用いる\r
+ */\r
+ var ifr = this._tar.previousSibling,\r
+ ifcw = ifr.contentWindow,\r
+ _doc;\r
+ if (ifcw) {\r
+ ifr.contentWindow.screen.updateInterval = 999;\r
+ _doc = ifr.contentWindow.document;\r
+ _doc.write("");\r
+ _doc.close(); // これがないと document.body は null になる\r
+ } else { //インラインSVGの場合\r
+ _doc = document;\r
+ }\r
+ if (("namespaces" in _doc) && !_doc.namespaces["v"]) {\r
+ _doc.namespaces.add("v","urn:schemas-microsoft-com:vml");\r
+ _doc.namespaces.add("o","urn:schemas-microsoft-com:office:office");\r
+ var st = _doc.createStyleSheet(),\r
+ vmlUrl = "behavior: url(#default#VML);display: inline-block;} "; //inline-blockはIEのバグ対策\r
+ st.cssText = "v\\:rect{" +vmlUrl+ "v\\:image{" +vmlUrl+ "v\\:fill{" +vmlUrl+ "v\\:stroke{" +vmlUrl+ "o\\:opacity2{" +vmlUrl\r
+ + "dn\\:defs{display:none}"\r
+ + "v\\:group{text-indent:0px;position:relative;width:100%;height:100%;" +vmlUrl\r
+ + "v\\:shape{width:100%;height:100%;" +vmlUrl;\r
+ st = vmlUrl = void 0;\r
+ }\r
+ DOMImplementation._doc_ = _doc; //_doc_プロパティはcreateDocumentメソッドで使う\r
+ var str = this.xmlhttp.responseText,\r
+ objei = this._tar,\r
+ s = DOMImplementation.createDocument("http://www.w3.org/2000/svg", "svg"),\r
+ tar = s.documentElement,\r
+ tview = tar.viewport,\r
+ objw, objh, fi, n, attr, att, w, h,\r
+ sdt = tar._tar,\r
+ sp = _doc.createElement("div"),\r
+ dcp = _doc.createElement("v:group"),\r
+ backr = _doc.createElement("v:rect"),\r
+ style, fontSize, sw, sh, trstyle, backrs, viewWidth, viewHeight, backdown, backright,\r
+ bfl, bft, bl, text,\r
+ _parseFloat = parseFloat,\r
+ ndoc = NAIBU.doc || this.xmlhttp.responseXML,\r
+ oba = _doc.createElement("div"); //obaはradialGradient要素で使う\r
+ if (!ndoc) { //何らかの原因で読み込み失敗した場合、実行させないようにする\r
+ this.xmlhttp.onreadystatechange = NAIBU.emptyFunction;\r
+ return;\r
+ }\r
+ s._iframe = ifr; //_iframeプロパティはSVGAElementでリンク置換のときに扱う\r
+ oba.setAttribute("id","_NAIBU_outline");\r
+ _doc.body.appendChild(oba);\r
+ sp.style.margin = "-1px,0px,0px,-1px";\r
+ if (ifcw) {\r
+ _doc.body.style.backgroundColor = objei.parentNode.currentStyle.backgroundColor;\r
+ }\r
+ ndoc.async = false;\r
+ /*下記のプロパティについては、Microsoftのサイトを参照\r
+ *ResolveExternals Property [Second-level DOM]\r
+ * http://msdn.microsoft.com/en-us/library/ms761375%28VS.85%29.aspx\r
+ *ValidateOnParse Property [Second-level DOM]\r
+ * http://msdn.microsoft.com/en-us/library/ms760286%28VS.85%29.asp\r
+ */\r
+ ndoc.validateOnParse = false;\r
+ ndoc.resolveExternals = false;\r
+ ndoc.preserveWhiteSpace = true;\r
+ ndoc.loadXML(str.replace(/^[\s\S]*?<svg/, "<svg")); //XML宣言のUTF-8は問題が起きるので削除\r
+ /*IE6-8のみで使えるupdateIntervalは、\r
+ *描画間隔の調整が可能。デフォルトは0。\r
+ *スクロール時にバグが起きるので、0に戻してやる必要がある。\r
+ */\r
+ screen.updateInterval = 999;\r
+ if (/&[^;]+;/.test(str)) {\r
+ /*以下の処理は、実体参照を使ったとき\r
+ *代替の処理を用いて、実体参照を処理するもの\r
+ */\r
+ var tmp = str;\r
+ var enti = (ndoc.doctype)? ndoc.doctype.entities: { length:0 };\r
+ for (var i=0; i<enti.length; i++) {\r
+ var map = enti.item(i);\r
+ var regex = new RegExp("&"+map.nodeName+";", "g");\r
+ tmp = tmp.replace(regex, map.firstChild.xml);\r
+ }\r
+ ndoc.loadXML(tmp);\r
+ tmp = void 0;\r
+ }\r
+ tview.top = 0;\r
+ tview.left = 0;\r
+ tview.width = objei.clientWidth;\r
+ tview.height = objei.clientHeight;\r
+ if (tview.height < 24) { //IEの標準モードではclientHeightプロパティの値が小さくなることがある\r
+ tview.height = screen.availHeight;\r
+ }\r
+ if (tar.viewport.height < 24) { //IEの標準モードではclientHeightプロパティの値が小さくなることがある\r
+ tar.viewport.height = screen.width;\r
+ }\r
+ objw = objei.getAttribute("width");\r
+ objh = objei.getAttribute("height");\r
+ if (objw) {\r
+ tar.setAttributeNS(null, "width", objw);\r
+ }\r
+ if (objh) {\r
+ tar.setAttributeNS(null, "height", objh);\r
+ }\r
+ fi = ndoc.documentElement.firstChild;\r
+ attr = ndoc.documentElement.attributes;\r
+ /*ルート要素のNamedNodeMapを検索する*/\r
+ for (var i=0,atli=attr.length;i<atli;++i) {\r
+ att = s.importNode(attr[i], false);\r
+ tar.setAttributeNodeNS(att);\r
+ }\r
+ str = attr = void 0;\r
+ dcp.style.width = tview.width+ "px";\r
+ dcp.style.height = tview.height+ "px";\r
+ dcp.coordsize = tview.width+ " " +tview.height;\r
+ sp.appendChild(dcp);\r
+ if (ifcw) {\r
+ _doc.body.appendChild(sp);\r
+ } else {\r
+ this._tar.parentNode.insertBefore(sp, this._tar);\r
+ }\r
+ dcp.appendChild(sdt);\r
+ while (fi) { //子ノードを検索して、子供がいれば、importNodeメソッドを再帰的に実行する\r
+ n = s.importNode(fi, true);\r
+ tar.appendChild(n);\r
+ fi = fi.nextSibling;\r
+ }\r
+ fi = void 0;\r
+ /*dom/event.jsのaddEventListenerメソッドなどで、iframe要素のwindowオブジェクトを利用する必要があるため、\r
+ *ドキュメントにそのオブジェクトを結び付けておく\r
+ */\r
+ s._window = ifcw;\r
+ /*以下では、VMLの要素とHTMLのCSSのプロパティを用いて、背景を\r
+ *作り出す作業を行う。これは必須\r
+ */\r
+ style = tar.ownerDocument.defaultView.getComputedStyle(tar, "");\r
+ fontSize = _parseFloat(style.getPropertyValue("font-size"));\r
+ tar.x.baseVal._emToUnit(fontSize);\r
+ tar.y.baseVal._emToUnit(fontSize);\r
+ tar.width.baseVal._emToUnit(fontSize);\r
+ tar.height.baseVal._emToUnit(fontSize);\r
+ sw = tar.width.baseVal.value;\r
+ sh = tar.height.baseVal.value;\r
+ backr.style.position = "absolute";\r
+ w = tview.width;\r
+ h = tview.height;\r
+ backr.style.width = w+ "px";\r
+ backr.style.height = h+ "px";\r
+ backr.style.zIndex = -1;\r
+ backr.stroked = "false";\r
+ backr.filled = "false";\r
+ tar._tar.appendChild(backr);\r
+ trstyle = tar._tar.style;\r
+ trstyle.visibility = "visible";\r
+ trstyle.position = "absolute";\r
+ /*以下、画像を切り取り*/\r
+ trstyle.overflow = "hidden";\r
+ /*ウィンドウ枠の長さを決定する*/\r
+ viewWidth = w > sw ? sw : w;\r
+ viewHeight = h > sh ? sh : h;\r
+ backrs = backr.currentStyle;\r
+ bfl = _parseFloat(backrs.left);\r
+ bft = _parseFloat(backrs.top);\r
+ bl = -tar._tx; //blやbtは、ずれを調整するのに使う\r
+ bt = -tar._ty;\r
+ if (bfl !== 0 && !isNaN(bfl)) { //内部の図形にずれが生じたとき(isNaNはIE8でautoがデフォルト値のため)\r
+ bl = bfl;\r
+ dcp.style.left = -bl+ "px";\r
+ }\r
+ if (bft !== 0 && !isNaN(bfl)) {\r
+ bt = bft;\r
+ dcp.style.top = -bt+ "px";\r
+ }\r
+ backright = bl + viewWidth + 1;\r
+ backdown = bt + viewHeight + 1;\r
+ trstyle.clip = "rect(" +bt+ "px " +backright+ "px " +backdown+ "px " +bl+ "px)";\r
+ this._document = s;\r
+ if ("_svgload_limited" in s.documentElement) {\r
+ /*_svgload_limitedプロパティはXlink言語が使われていない限り、0である。\r
+ *xlink:href属性が指定されるたびに+1となる。\r
+ *0以外は、SVGLoadイベントが発火されない仕組みとなっている\r
+ *\r
+ *目的:\r
+ * Xlinkのリンク先のソースを読み込むまで、SVGLoadイベントを発火させないため\r
+ */\r
+ s.documentElement._svgload_limited--;\r
+ if (s.documentElement._svgload_limited < 0) {\r
+ var evt = s.createEvent("SVGEvents");\r
+ evt.initEvent("SVGLoad", false, false);\r
+ s.documentElement.dispatchEvent(evt);\r
+ }\r
+ }\r
+ //以下、テキストの位置を修正\r
+ text = s.documentElement._tar.getElementsByTagName("div");\r
+ for (var i=0, texti;text[i];++i) {\r
+ texti = text[i];\r
+ if (texti.firstChild.nodeName !== "shape") { //radialGradient用のdiv要素でないならば\r
+ var tis = texti.style;\r
+ tis.left = _parseFloat(tis.left) - bl + "px";\r
+ tis.top = _parseFloat(tis.top) - bt + "px";\r
+ tis = void 0;\r
+ }\r
+ }\r
+ //ビューポートの位置をスクロールで調整 (なお、_txプロパティはSVGSVGElementのSIEコードを参照)\r
+ ifcw && ifcw.scroll(-s.documentElement._tx, -s.documentElement._ty);\r
+ s._isLoaded = 1; //_isLoadedプロパティはevents::dispatchEventメソッドで使う\r
+ s.defaultView._cache = s.defaultView._cache_ele = null;\r
+ oba = _doc = evt = ndoc = objei = tar = tview = objw = objh = n = att = sdt = sp = dcp = backr = sw = sh = style = fontSize = void 0;\r
+ trstyle = backrs = text = texti = i = bfl = bft = bl = bt = text = _parseFloat = w = h = viewWidth = viewHeight = backdown = backright = void 0;\r
+ /*IEのメモリリーク対策として、空関数を入力*/\r
+ this.xmlhttp.onreadystatechange = NAIBU.emptyFunction;\r
+ if (this._next) {\r
+ ifcw && (ifr.contentWindow.screen.updateInterval = 0);\r
+ ifr = ifcw = s = void 0;\r
+ this._next._init();\r
+ } else {\r
+ /*全要素の読み込みが終了した場合*/\r
+ if (s.implementation._buffer_) {\r
+ screen.updateInterval = 0;\r
+ /*以下はバッファリングにためておいた要素とイベントを、後から実行する*/\r
+ NAIBU._buff_num = 0;\r
+ NAIBU._buff = setInterval(function(){\r
+ var n = NAIBU._buff_num,\r
+ dbuf = DOMImplementation._buffer_,\r
+ dbufli = dbuf ? dbuf.length : 0, //極端な負荷がかかると、dbufはnullになる可能性あり\r
+ s, evt;\r
+ if (dbufli === 0) {\r
+ clearInterval(NAIBU._buff); \r
+ } else {\r
+ for (var i=0;i<50;++i) {\r
+ s = dbuf[n];\r
+ evt = dbuf[n+1];\r
+ s.dispatchEvent(evt);\r
+ n += 2;\r
+ s = evt = void 0;\r
+ if (n >= dbufli) {\r
+ clearInterval(NAIBU._buff);\r
+ DOMImplementation._buffer_ = null;\r
+ NAIBU.Time.start();\r
+ dbuf = n = dbufli = void 0;\r
+ return;\r
+ }\r
+ }\r
+ NAIBU._buff_num = n;\r
+ }\r
+ dbuf = n = dbufli = void 0;\r
+ }, 1);\r
+ ifr = ifcw = s = void 0;\r
+ } else {\r
+ ifr = ifcw = s = void 0;\r
+ NAIBU.Time.start();\r
+ }\r
+ delete NAIBU.doc;\r
+ }\r
+ },\r
+ /*SVGDocument*/ getSVGDocument : function() {\r
+ return (this._document);\r
+ }\r
+};\r
+/*空関数(IEのメモリリーク対策)*/\r
+NAIBU.emptyFunction = function() {};\r
+\r
+/*SVGStyleElement\r
+ *style要素をあらわすオブジェクト\r
+ */\r
+function SVGStyleElement(_doc) {\r
+ SVGElement.apply(this);\r
+ LinkStyle.apply(this);\r
+ /*LinkStyleに関しては、以下の仕様を参照のこと。なお、これはSVG DOMでは継承されていないので要注意。\r
+ *CSS2 1. Document Object Model Style Sheets\r
+ * 1.3. Document Extensions\r
+ * Interface LinkStyle (introduced in DOM Level 2)\r
+ * http://www.w3.org/TR/DOM-Level-2-Style/stylesheets.html#StyleSheets-LinkStyle\r
+ */\r
+ /*以下はそれぞれ、属性の値に対応している*/\r
+ /*DOMString*/ this.xmlspace;\r
+ /*DOMString*/ this.type = "text/css";\r
+ /*DOMString*/ this.media;\r
+ /*DOMString*/ this.title;\r
+ SVGURIReference.apply(this);\r
+ this.addEventListener("DOMAttrModified", function(evt){\r
+ if (evt.attrName === "type") {\r
+ evt.target.type = evt.newValue;\r
+ } else if (evt.attrName === "title") {\r
+ evt.target.title = evt.newValue;\r
+ }\r
+ evt = void 0;\r
+ }, false);\r
+ this.addEventListener("S_Load", function(evt){\r
+ var tar = evt.target,\r
+ sheet = tar.sheet,\r
+ styleText = tar._text,\r
+ tod = tar.ownerDocument,\r
+ style = _doc.createElement("style"),\r
+ ri, rsc, scri, rsi;\r
+ NAIBU._temp_doc = tod;\r
+ sheet = tod.styleSheets[tod.styleSheets.length] = DOMImplementation.createCSSStyleSheet(tar.title, tar.media);\r
+ sheet.ownerNode = tar;\r
+ /*以下は、IEのCSSパーサを使って、スタイルシートのルールを実装していく*/\r
+ _doc.documentElement.firstChild.appendChild(style);\r
+ style.styleSheet.cssText = styleText;\r
+ for (var i=0, rules=style.styleSheet.rules, rli=rules.length;i<rli;++i) {\r
+ ri = rules[i];\r
+ scri = new CSSStyleRule();\r
+ scri.selectorText = ri.selectorText;\r
+ scri.style.cssText = ri.style.cssText;\r
+ rsc = scri.style.cssText.split(";");\r
+ for (var j=0, rsli=rsc.length;j<rsli;++j) {\r
+ rsi = rsc[j].split(": ");\r
+ scri.style.setProperty(rsi[0], rsi[1]);\r
+ }\r
+ sheet.cssRules[sheet.cssRules.length] = scri;\r
+ }\r
+ tod.documentElement.addEventListener("DOMNodeInsertedIntoDocument", function(evt) {\r
+ var tar = evt.target,\r
+ doc = tar.ownerDocument,\r
+ rules = doc.styleSheets[0] ? doc.styleSheets[0].cssRules : [],\r
+ selector, ru, tcb = tar.className.baseVal || ".,.";\r
+ for (var i=0, rli=rules.length;i<rli;++i) {\r
+ selector = rules[i].selectorText;\r
+ /*_rulesプロパティはCSSモジュールのgetCoumputedStyleメソッドで使う*/\r
+ ru = tar._rules || [];\r
+ if ((selector.indexOf("." +tcb) > -1) || (selector.indexOf("#" +tar.id) > -1)\r
+ || (tar.nodeName === selector)) {\r
+ ru[ru.length] = rules[i];\r
+ }\r
+ tar._rules = ru;\r
+ }\r
+ tar = doc = rules = void 0;\r
+ }, true);\r
+ tar = evt = style = sheet = styleText = tod = i = rules = rli = void 0;\r
+ }, false);\r
+ this.addEventListener("DOMNodeInserted", function(evt){\r
+ var tar = evt.target;\r
+ if (evt.eventPhase === /*Event.BUBBLING_PHASE*/ 3) {\r
+ if (tar.nodeName === "#cdata-section") {\r
+ evt.currentTarget._text = tar.data;\r
+ }\r
+ return;\r
+ }\r
+ tar.addEventListener("DOMNodeInsertedIntoDocument", function(evt){\r
+ var tar = evt.target;\r
+ if ((evt.eventPhase === /*Event.AT_TARGET*/ 2) && !tar.getAttributeNodeNS("http://www.w3.org/1999/xlink", "xlink:href")) {\r
+ var evtt = tar.ownerDocument.createEvent("SVGEvents");\r
+ evtt.initEvent("S_Load", false, false);\r
+ evt.currentTarget.dispatchEvent(evtt);\r
+ }\r
+ tar = evt = void 0;\r
+ }, false);\r
+ }, false);\r
+ return this;\r
+};\r
+SVGStyleElement.prototype = Object._create(SVGElement);\r
+\r
+/*SVGPoint\r
+ *2次元座標の点(x,y)を表すオブジェクト\r
+ */\r
+function SVGPoint() { \r
+ return this;\r
+};\r
+/*float*/SVGPoint.prototype.x = SVGPoint.prototype.y = 0;\r
+SVGPoint.prototype.matrixTransform = function(/*SVGMatrix*/ matrix ) {\r
+ if (!isFinite(matrix.a) || !isFinite(matrix.b) || !isFinite(matrix.c) || !isFinite(matrix.d) || !isFinite(matrix.e) || !isFinite(matrix.f)) {\r
+ throw (new Error("Type Error: 引数の値がNumber型ではありません"));\r
+ }\r
+ var s = new SVGPoint();\r
+ s.x = matrix.a * this.x + matrix.c * this.y + matrix.e;\r
+ s.y = matrix.b * this.x + matrix.d * this.y + matrix.f;\r
+ return s;\r
+};\r
+\r
+function SVGPointList() { \r
+ return this;\r
+};\r
+/*SVGPointListのメソッドはSVGPathSegListを参照*/\r
+\r
+/*SVGMatrix\r
+ *行列をあらわすオブジェクト。写像に用いる。以下のように表現できる\r
+ *[a c e]\r
+ *[b d f]\r
+ *[0 0 1]\r
+ */\r
+function SVGMatrix() { \r
+ return this;\r
+};\r
+SVGMatrix.prototype = {\r
+ /*float*/ a : 1,\r
+ /*float*/ b : 0,\r
+ /*float*/ c : 0,\r
+ /*float*/ d : 1,\r
+ /*float*/ e : 0,\r
+ /*float*/ f : 0,\r
+ /*multiplyメソッド\r
+ *行列の積を求めて返す\r
+ */\r
+ /*SVGMatrix*/ multiply : function(/*SVGMatrix*/ secondMatrix ) {\r
+ var s = new SVGMatrix(),\r
+ m = secondMatrix,\r
+ isf = isFinite,\r
+ t = this;\r
+ if (!isf(m.a) || !isf(m.b) || !isf(m.c) || !isf(m.d) || !isf(m.e) || !isf(m.f)) {\r
+ throw (new Error("Type Error: 引数の値がNumber型ではありません"));\r
+ }\r
+ s.a = t.a * m.a + t.c * m.b;\r
+ s.b = t.b * m.a + t.d * m.b;\r
+ s.c = t.a * m.c + t.c * m.d;\r
+ s.d = t.b * m.c + t.d * m.d;\r
+ s.e = t.a * m.e + t.c * m.f + t.e;\r
+ s.f = t.b * m.e + t.d * m.f + t.f;\r
+ m = t = secondMatrix = isf = void 0;\r
+ return s;\r
+ },\r
+ /*inverseメソッド\r
+ *逆行列を返す\r
+ */\r
+ /*SVGMatrix*/ inverse : function() {\r
+ var s = new SVGMatrix(), n = this._determinant();\r
+ if (n !== 0) {\r
+ s.a = this.d / n;\r
+ s.b = -this.b / n;\r
+ s.c = -this.c / n;\r
+ s.d = this.a / n;\r
+ s.e = (this.c * this.f - this.d * this.e) / n;\r
+ s.f = (this.b * this.e - this.a * this.f) / n;\r
+ return s;\r
+ } else {\r
+ throw (new SVGException(/*SVGException.SVG_MATRIX_NOT_INVERTABLE*/ 2));\r
+ }\r
+ },\r
+ /*SVGMatrix*/ translate : function(/*float*/ x, /*float*/ y ) {\r
+ var m = new SVGMatrix();\r
+ m.e = x;\r
+ m.f = y;\r
+ var s = this.multiply(m);\r
+ m = void 0;\r
+ return s;\r
+ },\r
+ /*SVGMatrix*/ scale : function(/*float*/ scaleFactor ) {\r
+ var m = new SVGMatrix();\r
+ m.a = scaleFactor;\r
+ m.d = scaleFactor;\r
+ var s = this.multiply(m);\r
+ m = void 0;\r
+ return s;\r
+ },\r
+ /*SVGMatrix*/ scaleNonUniform : function(/*float*/ scaleFactorX, /*float*/ scaleFactorY ) {\r
+ var m = new SVGMatrix();\r
+ m.a = scaleFactorX;\r
+ m.d = scaleFactorY;\r
+ var s = this.multiply(m);\r
+ m = void 0;\r
+ return s;\r
+ },\r
+ /*SVGMatrix*/ rotate : function(/*float*/ angle ) {\r
+ var m = new SVGMatrix(), rad = angle / 180 * Math.PI; //ラジアン変換\r
+ m.a = Math.cos(rad);\r
+ m.b = Math.sin(rad);\r
+ m.c = -m.b;\r
+ m.d = m.a;\r
+ var s = this.multiply(m);\r
+ m = rad = void 0;\r
+ return s;\r
+ },\r
+ //座標(x, y)と原点の角度の分だけ、回転する\r
+ /*SVGMatrix*/ rotateFromVector : function(/*float*/ x, /*float*/ y ) {\r
+ if ((x === 0) || (y === 0) || !isFinite(x) || !isFinite(y)) {\r
+ throw (new SVGException(/*SVGException.SVG_INVALID_VALUE_ERR*/ 1));\r
+ }\r
+ var m = new SVGMatrix(), rad = Math.atan2(y, x);\r
+ m.a = Math.cos(rad);\r
+ m.b = Math.sin(rad);\r
+ m.c = -m.b;\r
+ m.d = m.a;\r
+ var s = this.multiply(m);\r
+ m = rad = void 0;\r
+ return s;\r
+ },\r
+ /*SVGMatrix*/ flipX : function() {\r
+ var m = new SVGMatrix();\r
+ m.a = -m.a;\r
+ var s = this.multiply(m);\r
+ m = void 0;\r
+ return s;\r
+ },\r
+ /*SVGMatrix*/ flipY : function() {\r
+ var m = new SVGMatrix();\r
+ m.d = -m.d;\r
+ var s = this.multiply(m);\r
+ m = void 0;\r
+ return s;\r
+ },\r
+ /*SVGMatrix*/ skewX : function(/*float*/ angle ){\r
+ var m = new SVGMatrix(), rad = angle / 180 * Math.PI; //ラジアン変換\r
+ m.c = Math.tan(rad);\r
+ var s = this.multiply(m);\r
+ m = void 0;\r
+ return s;\r
+ },\r
+ /*SVGMatrix*/ skewY : function(/*float*/ angle ){\r
+ var m = new SVGMatrix(), rad = angle / 180 * Math.PI;\r
+ m.b = Math.tan(rad);\r
+ var s = this.multiply(m);\r
+ m = void 0;\r
+ return s;\r
+ },\r
+ //行列式\r
+ /*float*/ _determinant : function() {\r
+ return (this.a * this.d - this.b * this.c);\r
+ }\r
+};\r
+\r
+function SVGTransform() { \r
+ /*readonly SVGMatrix*/ this.matrix = new SVGMatrix();\r
+ return this;\r
+};\r
+ // Transform Types\r
+ /*unsigned short SVGTransform.SVG_TRANSFORM_UNKNOWN = 0;\r
+ /*unsigned short SVGTransform.SVG_TRANSFORM_MATRIX = 1;\r
+ /*unsigned short SVGTransform.SVG_TRANSFORM_TRANSLATE = 2;\r
+ /*unsigned short SVGTransform.SVG_TRANSFORM_SCALE = 3;\r
+ /*unsigned short SVGTransform.SVG_TRANSFORM_ROTATE = 4;\r
+ /*unsigned short SVGTransform.SVG_TRANSFORM_SKEWX = 5;\r
+ /*unsigned short SVGTransform.SVG_TRANSFORM_SKEWY = 6;*/\r
+SVGTransform.prototype = {\r
+ /*ダミーの単位行列。各メソッドで使う*/\r
+ _matrix : (new SVGMatrix()),\r
+ /*readonly unsigned short*/ type : /*SVGTransform.SVG_TRANSFORM_UNKNOWN*/ 0,\r
+ /*readonly float*/ angle : 0,\r
+ /*void*/ setMatrix : function(/*SVGMatrix*/ matrix ) {\r
+ this.type = /*SVGTransform.SVG_TRANSFORM_MATRIX*/ 1;\r
+ this.matrix = this._matrix.multiply(matrix);\r
+ },\r
+ /*void*/ setTranslate : function(/*float*/ tx, /*float*/ ty ) {\r
+ this.type = /*SVGTransform.SVG_TRANSFORM_TRANSLATE*/ 2;\r
+ this.matrix = this._matrix.translate(tx, ty);\r
+ },\r
+ /*void*/ setScale : function(/*float*/ sx, /*float*/ sy ) {\r
+ this.type = /*SVGTransform.SVG_TRANSFORM_SCALE*/ 3;\r
+ this.matrix = this._matrix.scaleNonUniform(sx, sy);\r
+ },\r
+ /*void*/ setRotate : function(/*float*/ angle, /*float*/ cx, /*float*/ cy ) {\r
+ this.angle = angle;\r
+ this.type = /*SVGTransform.SVG_TRANSFORM_ROTATE*/ 4;\r
+ this.matrix = this._matrix.rotate(angle);\r
+ this.matrix.e = (1-this.matrix.a)*cx - this.matrix.c*cy;\r
+ this.matrix.f = -this.matrix.b*cx + (1-this.matrix.d)*cy;\r
+ },\r
+ /*void*/ setSkewX : function(/*float*/ angle ) {\r
+ this.angle = angle;\r
+ this.type = /*SVGTransform.SVG_TRANSFORM_SKEWX*/ 5;\r
+ this.matrix = this._matrix.skewX(angle);\r
+ },\r
+ /*void*/ setSkewY : function(/*float*/ angle ) {\r
+ this.angle = angle;\r
+ this.type = /*SVGTransform.SVG_TRANSFORM_SKEWY*/ 6;\r
+ this.matrix = this._matrix.skewY(angle);\r
+ }\r
+};\r
+\r
+function SVGTransformList() { \r
+ return this;\r
+};\r
+/*SVGTransformListのメソッドはSVGPathSegListを参照*/\r
+\r
+/*SVGTransform*/ SVGTransformList.prototype.createSVGTransformFromMatrix = function(/*SVGMatrix*/ matrix ) {\r
+ var t = new SVGTransform();\r
+ t.setMatrix(matrix);\r
+ return t;\r
+};\r
+/*SVGTransform*/ SVGTransformList.prototype.consolidate = function() {\r
+ if(this.numberOfItems === 0) {\r
+ return null;\r
+ } else {\r
+ var s = this.getItem(0), m = s.matrix;\r
+ for (var i=1,nli=this.numberOfItems;i<nli;++i) {\r
+ m = m.multiply(this.getItem(i).matrix);\r
+ }\r
+ s.setMatrix(m);\r
+ this.initialize(s);\r
+ return s;\r
+ }\r
+};\r
+\r
+function SVGAnimatedTransformList() { \r
+ /*readonly SVGTransformList*/ this.animVal = this.baseVal = new SVGTransformList();\r
+ return this;\r
+};\r
+function SVGPreserveAspectRatio() { \r
+ /*unsigned short*/ this.align = /*SVGPreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMIDYMID*/ 6;\r
+ /*unsigned short*/ this.meetOrSlice = /*SVGPreserveAspectRatio.SVG_MEETORSLICE_MEET*/ 1;\r
+ return this;\r
+};\r
+/*(function(t) {\r
+ // Alignment Types\r
+ /*unsigned short t.SVG_PRESERVEASPECTRATIO_UNKNOWN = 0;\r
+ /*unsigned short t.SVG_PRESERVEASPECTRATIO_NONE = 1;\r
+ /*unsigned short t.SVG_PRESERVEASPECTRATIO_XMINYMIN = 2;\r
+ /*unsigned short t.SVG_PRESERVEASPECTRATIO_XMIDYMIN = 3;\r
+ /*unsigned short t.SVG_PRESERVEASPECTRATIO_XMAXYMIN = 4;\r
+ /*unsigned short t.SVG_PRESERVEASPECTRATIO_XMINYMID = 5;\r
+ /*unsigned short t.SVG_PRESERVEASPECTRATIO_XMIDYMID = 6;\r
+ /*unsigned short t.SVG_PRESERVEASPECTRATIO_XMAXYMID = 7;\r
+ /*unsigned short t.SVG_PRESERVEASPECTRATIO_XMINYMAX = 8;\r
+ /*unsigned short t.SVG_PRESERVEASPECTRATIO_XMIDYMAX = 9;\r
+ /*unsigned short t.SVG_PRESERVEASPECTRATIO_XMAXYMAX = 10;\r
+ // Meet-or-slice Types\r
+ /*unsigned short t.SVG_MEETORSLICE_UNKNOWN = 0;\r
+ /*unsigned short t.SVG_MEETORSLICE_MEET = 1;\r
+ /*unsigned short t.SVG_MEETORSLICE_SLICE = 2;\r
+})(SVGPreserveAspectRatio);*/\r
+\r
+function SVGAnimatedPreserveAspectRatio() { \r
+ /*readonly SVGPreserveAspectRatio*/ this.animVal = this.baseVal = new SVGPreserveAspectRatio();\r
+ return this;\r
+};\r
+\r
+function SVGPathSeg() { \r
+ /*readonly unsigned short*/ this.pathSegType = /*SVGPathSeg.PATHSEG_UNKNOWN*/ 0;\r
+ /*readonly DOMString*/ this.pathSegTypeAsLetter = null;\r
+ return this;\r
+};\r
+\r
+/*(function(t) {\r
+ // Path Segment Types\r
+ /*unsigned short t.PATHSEG_UNKNOWN = 0;\r
+ /*unsigned short t.PATHSEG_CLOSEPATH = 1;\r
+ /*unsigned short t.PATHSEG_MOVETO_ABS = 2;\r
+ /*unsigned short t.PATHSEG_MOVETO_REL = 3;\r
+ /*unsigned short t.PATHSEG_LINETO_ABS = 4;\r
+ /*unsigned short t.PATHSEG_LINETO_REL = 5;\r
+ /*unsigned short t.PATHSEG_CURVETO_CUBIC_ABS = 6;\r
+ /*unsigned short t.PATHSEG_CURVETO_CUBIC_REL = 7;\r
+ /*unsigned short t.PATHSEG_CURVETO_QUADRATIC_ABS = 8;\r
+ /*unsigned short t.PATHSEG_CURVETO_QUADRATIC_REL = 9;\r
+ /*unsigned short t.PATHSEG_ARC_ABS = 10;\r
+ /*unsigned short t.PATHSEG_ARC_REL = 11;\r
+ /*unsigned short t.PATHSEG_LINETO_HORIZONTAL_ABS = 12;\r
+ /*unsigned short t.PATHSEG_LINETO_HORIZONTAL_REL = 13;\r
+ /*unsigned short t.PATHSEG_LINETO_VERTICAL_ABS = 14;\r
+ /*unsigned short t.PATHSEG_LINETO_VERTICAL_REL = 15;\r
+ /*unsigned short t.PATHSEG_CURVETO_CUBIC_SMOOTH_ABS = 16;\r
+ /*unsigned short t.PATHSEG_CURVETO_CUBIC_SMOOTH_REL = 17;\r
+ /*unsigned short t.PATHSEG_CURVETO_QUADRATIC_SMOOTH_ABS = 18;\r
+ /*unsigned short t.PATHSEG_CURVETO_QUADRATIC_SMOOTH_REL = 19;\r
+})(SVGPathSeg);*/\r
+/*SVGPathSegxx\r
+ *軽量化のために、SVGPathSegの継承をしない。また、{}オブジェクトで代用する予定\r
+ */\r
+function SVGPathSegClosePath() {\r
+ return this;\r
+};\r
+SVGPathSegClosePath.prototype = {\r
+ pathSegType : /*SVGPathSeg.PATHSEG_CLOSEPATH*/ 1,\r
+ pathSegTypeAsLetter : "z"\r
+};\r
+function SVGPathSegMovetoAbs() { \r
+ /*float* this.x;\r
+ /*float* this.y;*/\r
+ return this;\r
+};\r
+SVGPathSegMovetoAbs.prototype = {\r
+ pathSegType : /*SVGPathSeg.PATHSEG_MOVETO_ABS*/ 2,\r
+ pathSegTypeAsLetter : "M"\r
+};\r
+function SVGPathSegMovetoRel() { \r
+ /*float*/ this.x;\r
+ /*float*/ this.y;\r
+ return this;\r
+};\r
+SVGPathSegMovetoRel.prototype = {\r
+ pathSegType : /*SVGPathSeg.PATHSEG_MOVETO_REL*/ 3,\r
+ pathSegTypeAsLetter : "m"\r
+};\r
+function SVGPathSegLinetoAbs() { \r
+ /*float* this.x;\r
+ /*float* this.y;*/\r
+ return this;\r
+};\r
+SVGPathSegLinetoAbs.prototype = {\r
+ pathSegType : /*SVGPathSeg.PATHSEG_LINETO_ABS*/ 4,\r
+ pathSegTypeAsLetter : "L"\r
+};\r
+function SVGPathSegLinetoRel() { \r
+ /*float*/ this.x;\r
+ /*float*/ this.y;\r
+ return this;\r
+};\r
+SVGPathSegLinetoRel.prototype = {\r
+ pathSegType : /*SVGPathSeg.PATHSEG_LINETO_REL*/ 5,\r
+ pathSegTypeAsLetter : "l"\r
+};\r
+function SVGPathSegCurvetoCubicAbs() { \r
+ /*float* this.x;\r
+ /*float* this.y;\r
+ /*float* this.x1;\r
+ /*float* this.y1;\r
+ /*float* this.x2;\r
+ /*float* this.y2;*/\r
+ return this;\r
+};\r
+SVGPathSegCurvetoCubicAbs.prototype = {\r
+ pathSegType : /*SVGPathSeg.PATHSEG_CURVETO_CUBIC_ABS*/ 6,\r
+ pathSegTypeAsLetter : "C"\r
+};\r
+function SVGPathSegCurvetoCubicRel() { \r
+ /*float* this.x;\r
+ /*float* this.y;\r
+ /*float* this.x1;\r
+ /*float* this.y1;\r
+ /*float* this.x2;\r
+ /*float* this.y2;*/\r
+ return this;\r
+};\r
+SVGPathSegCurvetoCubicRel.prototype = {\r
+ pathSegType : /*SVGPathSeg.PATHSEG_CURVETO_CUBIC_REL*/ 7,\r
+ pathSegTypeAsLetter : "c"\r
+};\r
+function SVGPathSegCurvetoQuadraticAbs() { \r
+ /*float*/ this.x;\r
+ /*float*/ this.y;\r
+ /*float*/ this.x1;\r
+ /*float*/ this.y1;\r
+ this.pathSegType = /*SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_ABS*/ 8;\r
+ this.pathSegTypeAsLetter = "Q";\r
+ return this;\r
+};\r
+function SVGPathSegCurvetoQuadraticRel() { \r
+ /*float*/ this.x;\r
+ /*float*/ this.y;\r
+ /*float*/ this.x1;\r
+ /*float*/ this.y1;\r
+ this.pathSegType = /*SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_REL*/ 9;\r
+ this.pathSegTypeAsLetter = "q";\r
+ return this;\r
+};\r
+\r
+function SVGPathSegArcAbs() { \r
+ /*float*/ this.x;\r
+ /*float*/ this.y;\r
+ /*float*/ this.r1;\r
+ /*float*/ this.r2;\r
+ /*float*/ this.angle;\r
+ return this;\r
+};\r
+SVGPathSegArcAbs.prototype = {\r
+ /*boolean*/ largeArcFlag : true,\r
+ /*boolean*/ sweepFlag : true,\r
+ pathSegType : /*SVGPathSeg.PATHSEG_ARC_ABS*/ 10,\r
+ pathSegTypeAsLetter : "A"\r
+};\r
+function SVGPathSegArcRel() { \r
+ /*float*/ this.x;\r
+ /*float*/ this.y;\r
+ /*float*/ this.r1;\r
+ /*float*/ this.r2;\r
+ /*float*/ this.angle;\r
+ return this;\r
+};\r
+SVGPathSegArcRel.prototype = {\r
+ /*boolean*/ largeArcFlag : true,\r
+ /*boolean*/ sweepFlag : true,\r
+ pathSegType : /*SVGPathSeg.PATHSEG_ARC_REL*/ 11,\r
+ pathSegTypeAsLetter : "a"\r
+};\r
+function SVGPathSegLinetoHorizontalAbs() { \r
+ /*float*/ this.x;\r
+ this.pathSegType = /*SVGPathSeg.PATHSEG_LINETO_HORIZONTAL_ABS*/ 12;\r
+ this.pathSegTypeAsLetter = "H";\r
+ return this;\r
+};\r
+function SVGPathSegLinetoHorizontalRel() { \r
+ /*float*/ this.x;\r
+ this.pathSegType = /*SVGPathSeg.PATHSEG_LINETO_HORIZONTAL_REL*/ 13;\r
+ this.pathSegTypeAsLetter = "h";\r
+ return this;\r
+};\r
+function SVGPathSegLinetoVerticalAbs() { \r
+ /*float*/ this.y;\r
+ this.pathSegType = /*SVGPathSeg.PATHSEG_LINETO_VERTICAL_ABS*/ 14;\r
+ this.pathSegTypeAsLetter = "V";\r
+ return this;\r
+};\r
+function SVGPathSegLinetoVerticalRel() { \r
+ /*float*/ this.y;\r
+ this.pathSegType = /*SVGPathSeg.PATHSEG_LINETO_VERTICAL_REL*/ 15;\r
+ this.pathSegTypeAsLetter = "v";\r
+ return this;\r
+};\r
+function SVGPathSegCurvetoCubicSmoothAbs() { \r
+ /*float*/ this.x;\r
+ /*float*/ this.y;\r
+ /*float*/ this.x2;\r
+ /*float*/ this.y2;\r
+ this.pathSegType = /*SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_ABS*/ 16;\r
+ this.pathSegTypeAsLetter = "S";\r
+ return this;\r
+};\r
+function SVGPathSegCurvetoCubicSmoothRel() {\r
+ /*float*/ this.x;\r
+ /*float*/ this.y;\r
+ /*float*/ this.x2;\r
+ /*float*/ this.y2;\r
+ this.pathSegType = /*SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_REL*/ 17;\r
+ this.pathSegTypeAsLetter = "s";\r
+ return this;\r
+};\r
+function SVGPathSegCurvetoQuadraticSmoothAbs() {\r
+ /*float*/ this.x;\r
+ /*float*/ this.y;\r
+ this.pathSegType = /*SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_SMOOTH_ABS*/ 18;\r
+ this.pathSegTypeAsLetter = "T";\r
+ return this;\r
+};\r
+function SVGPathSegCurvetoQuadraticSmoothRel() {\r
+ /*float*/ this.x;\r
+ /*float*/ this.y;\r
+ this.pathSegType = /*SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_SMOOTH_REL*/ 19;\r
+ this.pathSegTypeAsLetter = "t";\r
+ return this;\r
+};\r
+function SVGPathSegList() {\r
+ return this;\r
+};\r
+for (var prop in SVGStringList.prototype) { //prototypeのコピーで継承を行う\r
+ SVGNumberList.prototype[prop] = SVGLengthList.prototype[prop] = SVGPointList.prototype[prop] = SVGTransformList.prototype[prop] = SVGPathSegList.prototype[prop] = SVGStringList.prototype[prop];\r
+};\r
+prop = void 0;\r
+\r
+/*documentは引数の変数として登録しておく*/\r
+(function(_doc, _math) {\r
+//freeArg関数はunloadで使う解放処理\r
+NAIBU.freeArg = function() {\r
+ SVGPathElement = _doc = _math = void 0;\r
+};\r
+//仮のfill属性とstroke属性の処理\r
+NAIBU._setPaint = function(tar, matrix) {\r
+ /*以下では、スタイルシートを用いて、fill-とstroke-関連の\r
+ *処理を行う。SVGPaintインターフェースをも用いる\r
+ */\r
+ var tod = tar.ownerDocument,\r
+ _doc = tod._document_,\r
+ el = tar._tar,\r
+ style = tod.defaultView.getComputedStyle(tar, ""),\r
+ fill = style.getPropertyCSSValue("fill"),\r
+ stroke = style.getPropertyCSSValue("stroke"),\r
+ fp = fill.paintType,\r
+ sp = stroke.paintType,\r
+ fillElement, fc,\r
+ num = /*CSSPrimitiveValue.CSS_NUMBER*/ 1,\r
+ t, evtt, fillOpacity, strs, cursor, vis, disp,\r
+ strokeElement, strokeOpacity, tgebtstroke, sgsw, w, h, swx, tsd, strokedasharray;\r
+ if (!el) {\r
+ return;\r
+ }\r
+ /*あらかじめ、v:fill要素とv:stroke要素は消しておく*/\r
+ while (el.firstChild) {\r
+ el.removeChild(el.firstChild);\r
+ }\r
+ if ((fp === /*SVGPaint.SVG_PAINTTYPE_RGBCOLOR*/ 1) || (fp === /*SVGPaint.SVG_PAINTTYPE_CURRENTCOLOR*/ 102)) {\r
+ if (fp === /*SVGPaint.SVG_PAINTTYPE_CURRENTCOLOR*/ 102) {\r
+ /*再度、設定。css.jsのsetPropertyを参照*/\r
+ style.setProperty("color", style.getPropertyValue("color"));\r
+ }\r
+ fillElement = _doc.createElement("v:fill");\r
+ fc = fill.rgbColor;\r
+ num = /*CSSPrimitiveValue.CSS_NUMBER*/ 1;\r
+ fillElement.setAttribute("color", "rgb(" +fc.red.getFloatValue(num)+ "," +fc.green.getFloatValue(num)+ "," +fc.blue.getFloatValue(num)+ ")");\r
+ fillOpacity = +(style.getPropertyValue("fill-opacity")) * style._list._opacity; //opacityを掛け合わせる\r
+ if (fillOpacity < 1) {\r
+ fillElement.setAttribute("opacity", fillOpacity+"");\r
+ }\r
+ el.appendChild(fillElement);\r
+ fillElement = fc = fillOpacity = void 0;\r
+ } else if (fill.uri) {\r
+ /*以下では、Gradation関連の要素に、イベントを渡すことで、\r
+ *この要素の、グラデーション描画を行う\r
+ */\r
+ t = tod.getElementById(fill.uri);\r
+ if (t) {\r
+ evtt = tod._domnodeEvent();\r
+ evtt._tar = _doc.createElement("v:fill");\r
+ evtt._style = style;\r
+ evtt._ttar = tar;\r
+ t.dispatchEvent(evtt);\r
+ if (t.localName !== "radialGradient") {\r
+ el.appendChild(evtt._tar);\r
+ }\r
+ t = evtt = void 0;\r
+ }\r
+ } else {\r
+ el.filled = "false";\r
+ }\r
+ if ((sp === /*SVGPaint.SVG_PAINTTYPE_RGBCOLOR*/ 1) || (sp === /*SVGPaint.SVG_PAINTTYPE_CURRENTCOLOR*/ 102)) {\r
+ if (sp === /*SVGPaint.SVG_PAINTTYPE_CURRENTCOLOR*/ 102) {\r
+ /*再度、設定。css.jsのsetPropertyを参照*/\r
+ style.setProperty("color", style.getPropertyValue("color"));\r
+ }\r
+ strokeElement = _doc.createElement("v:stroke");\r
+ sgsw = style.getPropertyCSSValue("stroke-width");\r
+ w = tod.documentElement.viewport.width;\r
+ h = tod.documentElement.viewport.height;\r
+ sgsw._percent = _math.sqrt((w*w + h*h) / 2);\r
+ swx = sgsw.getFloatValue(/*CSSPrimitiveValue.CSS_NUMBER*/ 1) * _math.sqrt(_math.abs(matrix._determinant()));\r
+ strokeElement.setAttribute("weight", swx + "px");\r
+ sgsw = w = h = void 0;\r
+ if (!stroke.uri) {\r
+ fc = stroke.rgbColor;\r
+ strokeElement.setAttribute("color", "rgb(" +fc.red.getFloatValue(num)+ "," +fc.green.getFloatValue(num)+ "," +fc.blue.getFloatValue(num)+ ")");\r
+ strokeOpacity = +(style.getPropertyValue("stroke-opacity")) * (+(style.getPropertyValue("opacity"))); //opacityを掛け合わせる\r
+ if (swx < 1) {\r
+ strokeOpacity *= swx; //太さが1px未満なら色を薄くする\r
+ }\r
+ if (strokeOpacity < 1) {\r
+ strokeElement.setAttribute("opacity", strokeOpacity+"");\r
+ }\r
+ fc = strokeOpacity = void 0;\r
+ }\r
+ strokeElement.setAttribute("miterlimit", style.getPropertyValue("stroke-miterlimit"));\r
+ strokeElement.setAttribute("joinstyle", style.getPropertyValue("stroke-linejoin"));\r
+ if (style.getPropertyValue("stroke-linecap") === "butt") {\r
+ strokeElement.setAttribute("endcap", "flat");\r
+ } else {\r
+ strokeElement.setAttribute("endcap", style.getPropertyValue("stroke-linecap"));\r
+ }\r
+ tsd = style.getPropertyValue("stroke-dasharray");\r
+ if (tsd !== "none") {\r
+ if (tsd.indexOf(",") > 0) { //コンマ区切りの文字列の場合\r
+ strs = tsd.split(",");\r
+ for (var i = 0, sli = strs.length; i < sli; ++i) {\r
+ strs[i] = _math.ceil(+(strs[i]) / parseFloat(style.getPropertyValue("stroke-width"))); //精密ではないので注意\r
+ }\r
+ strokedasharray = strs.join(" ");\r
+ if (strs.length % 2 === 1) {\r
+ strokedasharray += " " + strokedasharray;\r
+ }\r
+ }\r
+ strokeElement.setAttribute("dashstyle", strokedasharray);\r
+ tsd = strs = void 0;\r
+ }\r
+ el.appendChild(strokeElement);\r
+ strokeElement = tsd = void 0;\r
+ } else {\r
+ el.stroked = "false";\r
+ }\r
+ if (el.style) {\r
+ cursor = style.getPropertyCSSValue("cursor");\r
+ if (cursor && !cursor._isDefault) { //初期値でないならば\r
+ el.style.cursor = cursor.cssText.split(":")[1];\r
+ }\r
+ vis = style.getPropertyCSSValue("visibility");\r
+ if (vis && !vis._isDefault) {\r
+ el.style.visibility = vis.cssText.split(":")[1];\r
+ }\r
+ disp = style.getPropertyCSSValue("display");\r
+ if (disp && !disp._isDefault && (disp.cssText.indexOf("none") > -1)) {\r
+ el.style.display = "none";\r
+ } else if (disp && !disp._isDefault && (disp.cssText.indexOf("inline-block") === -1)) {\r
+ el.style.display = "inline-block";\r
+ }\r
+ }\r
+ tod = _doc = el = fill = stroke = sp = fp = style = cursor = tar = matrix = vis = disp = num = void 0;\r
+};\r
+\r
+function SVGPathElement(_doc) {\r
+ SVGElement.apply(this);\r
+ this._tar = _doc.createElement("v:shape");\r
+ //interface SVGAnimatedPathData\r
+ var sp = SVGPathSegList;\r
+ /*readonly SVGPathSegList*/ this.pathSegList = new sp();\r
+ this.animatedPathSegList = this.pathSegList;\r
+ /*readonly SVGPathSegList*/ this.normalizedPathSegList = new sp();\r
+ sp = _doc = void 0;\r
+ this.animatedNormalizedPathSegList = this.normalizedPathSegList;\r
+ /*readonly SVGAnimatedNumber*/ this.pathLength = new SVGAnimatedNumber();\r
+ //以下は、d属性に変更があった場合の処理\r
+ this.addEventListener("DOMAttrModified", this._attrModi, false);\r
+ /*以下の処理は、このpath要素ノードがDOMツリーに追加されて初めて、\r
+ *描画が開始されることを示す。つまり、appendChildで挿入されない限り、描画をしない。\r
+ */\r
+ this.addEventListener("DOMNodeInserted", this._nodeInsert, false);\r
+ return this;\r
+};\r
+SVGPathElement.prototype = Object._create(SVGElement);\r
+(function(_sproto) {\r
+_sproto._attrModi = function(evt){\r
+ var tar = evt.target;\r
+ if (evt.attrName === "d" && evt.newValue !== ""){\r
+ /* d属性の値が空の場合は、描画を行わないようにする\r
+ * \r
+ *SVG1.1 「8.3.9 The grammar for path data」の項目にある最後の文章を参照\r
+ */\r
+ var tnl = tar.normalizedPathSegList,\r
+ tlist = tar.pathSegList;\r
+ if (tnl.numberOfItems > 0) {\r
+ tnl.clear();\r
+ tlist.clear();\r
+ }\r
+ /*d属性の値を正規表現を用いて、二次元配列Dに変換している。もし、d属性の値が"M 20 30 L20 40"ならば、\r
+ *JSONにおける表現は以下のとおり\r
+ *D = [["M", 20, 30], ["L", 20 40]]\r
+ */\r
+ var taco = tar._com,\r
+ sgs = taco.isSp,\r
+ dd = evt.newValue\r
+ .replace(taco.isRa, " -")\r
+ .replace(taco.isRb, " ")\r
+ .replace(taco.isRc, ",$1 ")\r
+ .replace(taco.isRd, ",$1 1")\r
+ .replace(taco.isRe, "")\r
+ .replace(/\.(\d+)\./g, ".$1 0.")\r
+ .replace(/[^\w\d\+\-\.\,\n\r\s].*/, "")\r
+ .split(","),\r
+ dli=dd.length,\r
+ isZ = taco._isZ,\r
+ isM = taco._isM,\r
+ isC = taco._isC,\r
+ isL = taco._isL,\r
+ tcc = tar.createSVGPathSegCurvetoCubicAbs,\r
+ tcll = tar.createSVGPathSegLinetoAbs,\r
+ flag, sflag;\r
+ for (var i=0;i<dli;++i) {\r
+ var di = dd[i].match(sgs),\r
+ s;\r
+ for (var j=1, dii=di[0], dili=di.length; j < dili; ++j) {\r
+ if (isC[dii]) {\r
+ s = tcc(+di[j+4], +di[j+5], +di[j], +di[j+1], +di[j+2], +di[j+3]);\r
+ j += 5;\r
+ } else if (isL[dii]) {\r
+ s = tcll(+di[j], +di[j+1]);\r
+ ++j;\r
+ } else if (isM[dii]) {\r
+ s = tar.createSVGPathSegMovetoAbs(+di[j], +di[j+1]);\r
+ ++j;\r
+ } else if (isZ[dii]) {\r
+ s = tar.createSVGPathSegClosePath();\r
+ } else if (dii === "A") {\r
+ flag = di[j+3];\r
+ if (flag.length > 1 && (+flag >= 0)) { /*if no commawsp*/\r
+ di.splice(j+3, 1, flag.charAt(0), flag.slice(1));\r
+ ++dili;\r
+ }\r
+ sflag = di[j+4];\r
+ if (sflag.length > 1 && (+sflag >= 0)) {\r
+ di.splice(j+4, 1, sflag.charAt(0), sflag.slice(1));\r
+ ++dili;\r
+ }\r
+ flag = di[j+3];\r
+ sflag = di[j+4];\r
+ if (((+flag < 0) || (+flag > 1)) || ((+sflag < 0) || (+sflag > 1))) {\r
+ /*仕様では、フラグが0か1しか認められていない*/\r
+ j += 6;\r
+ continue;\r
+ }\r
+ s = tar.createSVGPathSegArcAbs(+di[j+5], +di[j+6], +di[j], +di[j+1], +di[j+2], +flag, +sflag);\r
+ j += 6;\r
+ } else if (dii === "m") {\r
+ s = tar.createSVGPathSegMovetoRel(+di[j], +di[j+1]);\r
+ ++j;\r
+ } else if (dii === "l") {\r
+ s = tar.createSVGPathSegLinetoRel(+di[j], +di[j+1]);\r
+ ++j;\r
+ } else if (dii === "c") {\r
+ s = tar.createSVGPathSegCurvetoCubicRel(+di[j+4], +di[j+5], +di[j], +di[j+1], +di[j+2], +di[j+3]);\r
+ j += 5;\r
+ } else if (dii === "Q") {\r
+ s = tar.createSVGPathSegCurvetoQuadraticAbs(+di[j+2], +di[j+3], +di[j], +di[j+1]);\r
+ j += 3;\r
+ } else if (dii === "q") {\r
+ s = tar.createSVGPathSegCurvetoQuadraticRel(+di[j+2], +di[j+3], +di[j], +di[j+1]);\r
+ j += 3;\r
+ } else if (dii === "a") {\r
+ flag = di[j+3];\r
+ if (flag.length > 1 && (+flag >= 0)) { /*if no commawsp*/\r
+ di.splice(j+3, 1, flag.charAt(0), flag.slice(1));\r
+ ++dili;\r
+ }\r
+ sflag = di[j+4];\r
+ if (sflag.length > 1 && (+sflag >= 0)) {\r
+ di.splice(j+4, 1, sflag.charAt(0), sflag.slice(1));\r
+ ++dili;\r
+ }\r
+ flag = di[j+3];\r
+ sflag = di[j+4];\r
+ if (((+flag < 0) || (+flag > 1)) || ((+sflag < 0) || (+sflag > 1))) {\r
+ /*仕様では、フラグが0か1しか認められていない*/\r
+ j += 6;\r
+ continue;\r
+ }\r
+ s = tar.createSVGPathSegArcRel(+di[j+5], +di[j+6], +di[j], +di[j+1], +di[j+2], +flag, +sflag);\r
+ j += 6;\r
+ } else if (dii === "S") {\r
+ s = tar.createSVGPathSegCurvetoCubicSmoothAbs(+di[j+2], +di[j+3], +di[j], +di[j+1]);\r
+ j += 3;\r
+ } else if (dii === "s") {\r
+ s = tar.createSVGPathSegCurvetoCubicSmoothRel(+di[j+2], +di[j+3], +di[j], +di[j+1]);\r
+ j += 3;\r
+ } else if (dii === "T") {\r
+ s = tar.createSVGPathSegCurvetoQuadraticSmoothAbs(+di[j], +di[j+1]);\r
+ ++j;\r
+ } else if (dii === "t") {\r
+ s = tar.createSVGPathSegCurvetoQuadraticSmoothRel(+di[j], +di[j+1]);\r
+ ++j;\r
+ } else if (dii === "H") {\r
+ s = tar.createSVGPathSegLinetoHorizontalAbs(+di[j]);\r
+ } else if (dii === "h") {\r
+ s = tar.createSVGPathSegLinetoHorizontalRel(+di[j]);\r
+ } else if (dii === "V") {\r
+ s = tar.createSVGPathSegLinetoVerticalAbs(+di[j]);\r
+ } else if (dii === "v") {\r
+ s = tar.createSVGPathSegLinetoVerticalRel(+di[j]);\r
+ } else {\r
+ s = new SVGPathSeg();\r
+ }\r
+ tlist.appendItem(s);\r
+ }\r
+ }\r
+ di = s = sgs = dd = void 0;\r
+ /*以下の処理は、pathSegListからnormalizedPathSegListへの\r
+ *変換をする処理。相対座標を絶対座標に変換して、M、L、Cコマンドに正規化していく\r
+ */\r
+ var cx = 0, cy = 0, //現在セグメントの終了点の絶対座標を示す (相対座標を絶対座標に変換するときに使用)\r
+ xn = 0, yn = 0, //T,tコマンドで仮想的な座標を算出するのに用いる。第一コントロール点\r
+ startx = 0, starty = 0; //M,mコマンドにおける始点座標(Z,zコマンドで用いる)\r
+ for (var j=0, tli=tlist.numberOfItems;j<tli;++j) {\r
+ var ti = tlist.getItem(j),\r
+ ts = ti.pathSegType,\r
+ dii = ti.pathSegTypeAsLetter;\r
+ if (ts === /*SVGPathSeg.PATHSEG_UNKNOWN*/ 0) {\r
+ } else {\r
+ var rx = cx, ry = cy; //rx, ryは前のセグメントの終了点\r
+ if (ts % 2 === 1) { //相対座標ならば\r
+ cx += ti.x;\r
+ cy += ti.y;\r
+ } else {\r
+ cx = ti.x;\r
+ cy = ti.y;\r
+ }\r
+ if (isC[dii]) {\r
+ tnl.appendItem(ti);\r
+ } else if (isL[dii]) {\r
+ tnl.appendItem(ti);\r
+ } else if (isM[dii]) {\r
+ if (j !== 0) {\r
+ /*Mコマンドが続いた場合は、2番目以降はLコマンドと解釈する\r
+ *W3C SVG1.1の「8.3.2 The "moveto" commands」を参照\r
+ *http://www.w3.org/TR/SVG11/paths.html#PathDataMovetoCommands\r
+ */\r
+ var tg = tlist.getItem(j-1);\r
+ if (tg.pathSegTypeAsLetter === "M") {\r
+ tnl.appendItem(tcll(cx, cy));\r
+ continue;\r
+ }\r
+ }\r
+ startx = cx;\r
+ starty = cy;\r
+ tnl.appendItem(ti);\r
+ } else if (dii === "m") {\r
+ if (j !== 0) {\r
+ var tg = tlist.getItem(j-1);\r
+ if (tg.pathSegTypeAsLetter === "m") {\r
+ tnl.appendItem(tcll(cx, cy));\r
+ continue;\r
+ }\r
+ }\r
+ startx = cx;\r
+ starty = cy;\r
+ tnl.appendItem(tar.createSVGPathSegMovetoAbs(cx, cy));\r
+ } else if (dii === "l") {\r
+ tnl.appendItem(tcll(cx, cy));\r
+ } else if (dii === "c") {\r
+ tnl.appendItem(tcc(cx, cy, ti.x1+rx, ti.y1+ry, ti.x2+rx, ti.y2+ry));\r
+ } else if (isZ[dii]) {\r
+ cx = startx;\r
+ cy = starty;\r
+ tnl.appendItem(ti);\r
+ } else if (dii === "Q") {\r
+ xn = 2*cx - ti.x1;\r
+ yn = 2*cy - ti.y1;\r
+ //2次スプライン曲線は近似的な3次ベジェ曲線に変換している\r
+ tnl.appendItem(tcc(cx, cy, (rx + 2*ti.x1) / 3, (ry + 2*ti.y1) / 3, (2*ti.x1 + cx) / 3, (2*ti.y1 + cy) / 3));\r
+ } else if (dii === "q") {\r
+ var x1 = ti.x1 + rx, y1 = ti.y1 + ry;\r
+ xn = 2*cx - x1;\r
+ yn = 2*cy - y1;\r
+ tnl.appendItem(tcc(cx, cy, (rx + 2*x1) / 3, (ry + 2*y1) / 3, (2*x1 + cx) / 3, (2*y1 + cy) / 3));\r
+ x1 = y1 = void 0;\r
+ } else if (dii === "A" || dii === "a") {\r
+ (function(ti, cx, cy, rx, ry, tar, tnl) { //変数を隠蔽するためのfunction\r
+ /*以下は、Arctoを複数のCuvetoに変換する処理\r
+ *SVG 1.1 「F.6 Elliptical arc implementation notes」の章を参照\r
+ *http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\r
+ */\r
+ if (ti.r1 === 0 || ti.r2 === 0) {\r
+ return;\r
+ }\r
+ var fS = ti.sweepFlag,\r
+ psai = ti.angle,\r
+ r1 = _math.abs(ti.r1),\r
+ r2 = _math.abs(ti.r2),\r
+ ctx = (rx - cx) / 2, cty = (ry - cy) / 2,\r
+ cpsi = _math.cos(psai * _math.PI / 180),\r
+ spsi = _math.sin(psai * _math.PI / 180),\r
+ rxd = cpsi*ctx + spsi*cty,\r
+ ryd = -1*spsi*ctx + cpsi*cty,\r
+ rxdd = rxd * rxd, rydd = ryd * ryd,\r
+ r1x = r1 * r1,\r
+ r2y = r2 * r2,\r
+ lamda = rxdd/r1x + rydd/r2y,\r
+ sds;\r
+ if (lamda > 1) {\r
+ r1 = _math.sqrt(lamda) * r1;\r
+ r2 = _math.sqrt(lamda) * r2;\r
+ sds = 0;\r
+ } else{\r
+ var seif = 1;\r
+ if (ti.largeArcFlag === fS) {\r
+ seif = -1;\r
+ }\r
+ sds = seif * _math.sqrt((r1x*r2y - r1x*rydd - r2y*rxdd) / (r1x*rydd + r2y*rxdd));\r
+ }\r
+ var txd = sds*r1*ryd / r2,\r
+ tyd = -1 * sds*r2*rxd / r1,\r
+ tx = cpsi*txd - spsi*tyd + (rx+cx)/2,\r
+ ty = spsi*txd + cpsi*tyd + (ry+cy)/2,\r
+ rad = _math.atan2((ryd-tyd)/r2, (rxd-txd)/r1) - _math.atan2(0, 1),\r
+ s1 = (rad >= 0) ? rad : 2 * _math.PI + rad,\r
+ rad = _math.atan2((-ryd-tyd)/r2, (-rxd-txd)/r1) - _math.atan2((ryd-tyd)/r2, (rxd-txd)/r1),\r
+ dr = (rad >= 0) ? rad : 2 * _math.PI + rad;\r
+ if (!fS && dr > 0) {\r
+ dr -= 2*_math.PI;\r
+ } else if (fS && dr < 0) {\r
+ dr += 2*_math.PI;\r
+ }\r
+ var sse = dr * 2 / _math.PI,\r
+ seg = _math.ceil(sse<0 ? -1*sse : sse),\r
+ segr = dr / seg,\r
+ t = 8/3 * _math.sin(segr/4) * _math.sin(segr/4) / _math.sin(segr/2),\r
+ cpsir1 = cpsi * r1, cpsir2 = cpsi * r2,\r
+ spsir1 = spsi * r1, spsir2 = spsi * r2,\r
+ mc = _math.cos(s1),\r
+ ms = _math.sin(s1),\r
+ x2 = rx - t * (cpsir1*ms + spsir2*mc),\r
+ y2 = ry - t * (spsir1*ms - cpsir2*mc);\r
+ for (var n = 0; n < seg; ++n) {\r
+ s1 += segr;\r
+ mc = _math.cos(s1);\r
+ ms = _math.sin(s1);\r
+ var x3 = cpsir1*mc - spsir2*ms + tx,\r
+ y3 = spsir1*mc + cpsir2*ms + ty,\r
+ dx = -t * (cpsir1*ms + spsir2*mc),\r
+ dy = -t * (spsir1*ms - cpsir2*mc);\r
+ tnl.appendItem(tcc(x3, y3, x2, y2, x3-dx, y3-dy));\r
+ x2 = x3 + dx;\r
+ y2 = y3 + dy;\r
+ }\r
+ ti= cx= cy= rx= ry= tar= tnl = void 0;\r
+ })(ti, cx, cy, rx, ry, tar, tnl);\r
+ } else if (dii === "S") {\r
+ if (j !== 0) {\r
+ var tg = tnl.getItem(tnl.numberOfItems-1);\r
+ if (tg.pathSegTypeAsLetter === "C") {\r
+ var x1 = 2*tg.x - tg.x2,\r
+ y1 = 2*tg.y - tg.y2;\r
+ } else { //前のコマンドがCでなければ、現在の座標を第1コントロール点に用いる\r
+ var x1 = rx,\r
+ y1 = ry;\r
+ }\r
+ } else {\r
+ var x1 = rx,\r
+ y1 = ry;\r
+ }\r
+ tnl.appendItem(tcc(cx, cy, x1, y1, ti.x2, ti.y2));\r
+ x1 = y1 = void 0;\r
+ } else if (dii === "s") {\r
+ if (j !== 0) {\r
+ var tg = tnl.getItem(tnl.numberOfItems-1);\r
+ if (tg.pathSegTypeAsLetter === "C") {\r
+ var x1 = 2*tg.x - tg.x2,\r
+ y1 = 2*tg.y - tg.y2;\r
+ } else {\r
+ var x1 = rx,\r
+ y1 = ry;\r
+ }\r
+ } else {\r
+ var x1 = rx,\r
+ y1 = ry;\r
+ }\r
+ tnl.appendItem(tcc(cx, cy, x1, y1, ti.x2+rx, ti.y2+ry));\r
+ x1 = y1 = void 0;\r
+ } else if (dii === "T" || dii === "t") {\r
+ if (j !== 0) {\r
+ var tg = tlist.getItem(j-1);\r
+ if ("QqTt".indexOf(tg.pathSegTypeAsLetter) > -1) {\r
+ } else {\r
+ xn = rx, yn = ry;\r
+ }\r
+ } else {\r
+ xn = rx, yn = ry;\r
+ }\r
+ tnl.appendItem(tcc(cx, cy, (rx + 2*xn) / 3, (ry + 2*yn) / 3, (2*xn + cx) / 3, (2*yn + cy) / 3));\r
+ xn = 2*cx - xn;\r
+ yn = 2*cy - yn;\r
+ xx1 = yy1 = void 0;\r
+ } else if (dii === "H" || dii === "h") {\r
+ tnl.appendItem(tcll(cx, ry));\r
+ cy = ry; //勝手にti.yが0としているため\r
+ } else if (dii === "V" || dii === "v") {\r
+ tnl.appendItem(tcll(rx, cy));\r
+ cx = rx;\r
+ }\r
+ }\r
+ }\r
+ }\r
+ evt = tar = taco = cx = cy = xn = yn = startx = starty = tnl = tlist = ti = dii = ts = isZ = isM = isL = isC = s = tcc = tcll = void 0;\r
+};\r
+_sproto._nodeInsert = function(evt){\r
+ var tar = evt.target;\r
+ if (evt.eventPhase === /*Event.BUBBLING_PHASE*/ 3) {\r
+ return; //強制終了させる\r
+ }\r
+ var tnext = tar.nextSibling,\r
+ tpart = tar.parentNode._tar,\r
+ isLast = true;\r
+ if (tnext && tnext._tar && tpart && (tnext._tar.parentNode === tpart)) {\r
+ tpart.insertBefore(tar._tar, tnext._tar);\r
+ } else if (tnext && !tnext._tar && tpart) {\r
+ /*以下の処理は、_tarプロパティがない要素オブジェクトがあるため、それに対処するもの\r
+ *use要素や実体参照などは_tarプロパティがないことに注意\r
+ */\r
+ while (tnext) {\r
+ if (tnext._tar && (tnext._tar.parentNode === tpart)) {\r
+ tpart.insertBefore(tar._tar, tnext._tar);\r
+ isLast = false;\r
+ } \r
+ tnext = tnext.nextSibling;\r
+ }\r
+ if (isLast) {\r
+ tpart.appendChild(tar._tar);\r
+ }\r
+ } else if (!tnext && tpart) {\r
+ tpart.appendChild(tar._tar); \r
+ }\r
+ tnext = tpart = isLast = void 0;\r
+ tar.addEventListener("DOMNodeInsertedIntoDocument", tar._nodeInsertInto, false);\r
+ evt = tar = void 0;\r
+};\r
+_sproto._nodeInsertInto = function(evt){\r
+ /*以下の処理は、normalizedpathSegListとCTMに基づいて、\r
+ *SVGのd属性をVMLに変換していく処理である。\r
+ */\r
+ var tar = evt.target,\r
+ matrix = tar.getScreenCTM(),\r
+ tlist = tar.normalizedPathSegList,\r
+ dat = [],\r
+ ma = matrix.a, mb = matrix.b, mc = matrix.c, md = matrix.d, me = matrix.e, mf = matrix.f,\r
+ cname = tar._com._nameCom,\r
+ isZ = tar._com._isZ, isC = tar._com._isC,\r
+ mr = _math.round;\r
+ for (var i=0, tli=tlist.numberOfItems;i<tli;++i) {\r
+ var ti = tlist[i],\r
+ tx = ti.x,\r
+ ty = ti.y,\r
+ tps = ti.pathSegTypeAsLetter,\r
+ t = cname[tps];\r
+ if (isC[tps]) {\r
+ /*CTM(mx)の行列と座標(x, y)の積を算出する。数学における表現は以下のとおり\r
+ *[ma mc me] [x]\r
+ *[mb md mf] * [y]\r
+ *[0 0 1 ] [1]\r
+ */\r
+ t += [mr(ma*ti.x1 + mc*ti.y1 + me),\r
+ mr(mb*ti.x1 + md*ti.y1 + mf),\r
+ mr(ma*ti.x2 + mc*ti.y2 + me),\r
+ mr(mb*ti.x2 + md*ti.y2 + mf),\r
+ mr(ma*tx + mc*ty + me),\r
+ mr(mb*tx + md*ty + mf)].join(" ");\r
+ } else if (!isZ[tps]) {\r
+ t += mr(ma*tx + mc*ty + me)+ " " +mr(mb*tx + md*ty + mf);\r
+ }\r
+ dat[i] = t;\r
+ }\r
+ var vi = tar.ownerDocument.documentElement,\r
+ tt = tar._tar;\r
+ dat.push(" e");\r
+ tt.path = dat.join(" ");\r
+ tt.coordsize = vi.width.baseVal.value + " " + vi.height.baseVal.value;\r
+ NAIBU._setPaint(tar, matrix);\r
+ delete tar._cacheMatrix;\r
+ evt = tar = dat = t = tx = ty = matrix = tlist = x = y = mr = ma = mb = mc = md = me = mf = vi = isZ = isC = i = tli = tps = ti = cname = tt = void 0;\r
+};\r
+_sproto._com = {\r
+ _nameCom : {\r
+ z : " x ",\r
+ Z : " x ",\r
+ C : "c",\r
+ L : "l",\r
+ M : "m"\r
+ },\r
+ _isZ : {\r
+ z : 1,\r
+ Z : 1\r
+ },\r
+ _isC : {\r
+ C : 1\r
+ },\r
+ _isL : {\r
+ L : 1\r
+ },\r
+ _isM : {\r
+ M : 1\r
+ },\r
+ isRa : /\-/g,\r
+ isRb : /,/g,\r
+ isRc : /([a-yA-Y])/g,\r
+ isRd : /([zZ])/g,\r
+ isRe : /,/,\r
+ isSp : /\S+/g\r
+};\r
+ /*float*/ _sproto.getTotalLength = function() {\r
+ var s = 0,\r
+ nl = this.normalizedPathSegList;\r
+ for (var i=1,nln=nl.numberOfItems,ms=null;i<nln;++i) {\r
+ var seg = nl.getItem(i);\r
+ if (seg.pathSegType === /*SVGPathSeg.PATHSEG_LINETO_ABS*/ 4) {\r
+ var ps = nl.getItem(i-1);\r
+ s += _math.sqrt(_math.pow((seg.x-ps.x), 2) + _math.pow((seg.y-ps.y), 2));\r
+ } else if (seg.pathSegType === /*SVGPathSeg.PATHSEG_CURVETO_CUBIC_ABS*/ 6) {\r
+ } else if (seg.pathSegType === /*SVGPathSeg.PATHSEG_CLOSEPATH*/ 1) {\r
+ var ps = nl.getItem(i-1), ms = nl.getItem(0);\r
+ s += _math.sqrt(_math.pow((ps.x-ms.x), 2) + _math.pow((ps.y-ms.y), 2));\r
+ }\r
+\r
+ }\r
+ this.pathLength.baseVal = s;\r
+ return s;\r
+ };\r
+ /*SVGPoint*/ _sproto.getPointAtLength = function(/*float*/ distance ) {\r
+ var segn = this.getPathSegAtLength(distance),\r
+ x = 0,\r
+ y = 0,\r
+ nl = this.normalizedPathSegList,\r
+ seg = nl.getItem(segn),\r
+ s = this.ownerDocument.documentElement.createSVGPoint();\r
+ if ((segn-1) <= 0) {\r
+ s.x = seg.x;\r
+ s.y = seg.y;\r
+ return s;\r
+ }\r
+ var ps = nl.getItem(segn-1);\r
+ if (seg.pathSegType === /*SVGPathSeg.PATHSEG_LINETO_ABS*/ 4) {\r
+ var segl = _math.sqrt(_math.pow((seg.x-ps.x), 2) + _math.pow((seg.y-ps.y), 2));\r
+ var t = (segl + this._dis) / segl;\r
+ s.x = ps.x + t * (seg.x-ps.x);\r
+ s.y = ps.y + t * (seg.y-ps.y);\r
+ } else if (seg.pathSegType === /*VGPathSeg.PATHSEG_CURVETO_CUBIC_ABS*/ 6) {\r
+ var dd = 0;\r
+ dd += _math.sqrt(_math.pow((seg.x1-ps.x), 2) + _math.pow((seg.y1-ps.y), 2));\r
+ dd += _math.sqrt(_math.pow((seg.x2-seg.x1), 2) + _math.pow((seg.y2-seg.y1), 2));\r
+ dd += _math.sqrt(_math.pow((seg.x2-seg.x1), 2) + _math.pow((seg.y2-seg.y1), 2));\r
+ dd += _math.sqrt(_math.pow((seg.x-ps.x), 2) + _math.pow((seg.y-ps.y), 2));\r
+ var segl = dd / 2;\r
+ var t = (segl + this._dis) / segl;\r
+ /*以下はベジェ曲線の公式について、パラメータtによってまとめて整理したものを、\r
+ *使って、ポイントの座標を演算する\r
+ */\r
+ s.x = (3*seg.x1 + seg.x - 3*seg.x2 - ps.x) * _math.pow(t, 3)\r
+ +3*(ps.x - 2*seg.x1 + seg.x2) * _math.pow(t, 2)\r
+ +3*(seg.x1 - ps.x) * t\r
+ +ps.x;\r
+ s.y = (3*seg.y1 + seg.y - 3*seg.y2 - ps.y) * _math.pow(t, 3)\r
+ +3*(ps.y - 2*seg.y1 + seg.y2) * _math.pow(t, 2)\r
+ +3*(seg.y1 - ps.y) * t\r
+ +ps.y;\r
+ } else if (seg.pathSegType === /*SVGPathSeg.MOVETO_ABS*/ 2) {\r
+ s.x = seg.x;\r
+ s.y = seg.y;\r
+ } else if (seg.pathSegType === /*SVGPathSeg.PATHSEG_CLOSEPATH*/ 1) {\r
+ var ms = nl.getItem(0), segl = _math.sqrt(_math.pow((seg.x-mx.x), 2) + _math.pow((seg.y-ms.y), 2));\r
+ var t = (segl + this._dis) / segl;\r
+ s.x = ms.x + t * (seg.x-ms.x);\r
+ s.y = ms.y + t * (seg.y-ms.y);\r
+ }\r
+ return s;\r
+ };\r
+ /*unsigned long*/ _sproto.getPathSegAtLength = function(/*float*/ distance ) {\r
+ var nl = this.normalizedPathSegList; //仕様ではpathSegList\r
+ for (var i=0,nln=nl.numberOfItems,ms=null;i<nln;++i) {\r
+ var seg = nl.getItem(i);\r
+ if (seg.pathSegType === /*SVGPathSeg.PATHSEG_LINETO_ABS*/ 4) {\r
+ var ps = nl.getItem(i-1);\r
+ distance -= _math.sqrt(_math.pow((seg.x-ps.x), 2) + _math.pow((seg.y-ps.y), 2));\r
+ } else if (seg.pathSegType === /*SVGPathSeg.PATHSEG_CURVETO_CUBIC_ABS*/ 6) {\r
+ } else if (seg.pathSegType === /*SVGPathSeg.PATHSEG_CLOSEPATH*/ 1) {\r
+ var ps = nl.getItem(i-1), ms = nl.getItem(0);\r
+ distance -= _math.sqrt(_math.pow((ps.x-ms.x), 2) + _math.pow((ps.y-ms.y), 2));\r
+ }\r
+ if (distance <= 0) {\r
+ /*_disプロパティは前述のgetPointAtLengthメソッドで使う*/\r
+ this._dis = distance;\r
+ distance = void 0;\r
+ return i;\r
+ }\r
+ }\r
+ /*もし、distanceがパスの距離よりも長い場合、\r
+ *最後のセグメントの番号を返す\r
+ *なお、これはSVG1.1の仕様の想定外のこと\r
+ */\r
+ return (nl.numberOfItems - 1);\r
+ };\r
+ /*SVGPathSegClosePath*/ _sproto.createSVGPathSegClosePath = function() {\r
+ var _SVGPathSegClosePath = SVGPathSegClosePath;\r
+ return (new _SVGPathSegClosePath());\r
+ };\r
+ /*SVGPathSegMovetoAbs*/ _sproto.createSVGPathSegMovetoAbs = function(/*float*/ x, /*float*/ y ) {\r
+ var _SVGPathSegMovetoAbs = SVGPathSegMovetoAbs, s = new _SVGPathSegMovetoAbs();\r
+ s.x = x;\r
+ s.y = y;\r
+ return s;\r
+ };\r
+ /*SVGPathSegMovetoRel*/ _sproto.createSVGPathSegMovetoRel = function(/*float*/ x, /*float*/ y ) {\r
+ var s = new SVGPathSegMovetoRel();\r
+ s.x = x;\r
+ s.y = y;\r
+ return s;\r
+ };\r
+ /*SVGPathSegLinetoAbs*/ _sproto.createSVGPathSegLinetoAbs = function(/*float*/ x, /*float*/ y ) {\r
+ var s = new SVGPathSegLinetoAbs();\r
+ s.x = x;\r
+ s.y = y;\r
+ return s;\r
+ };\r
+ /*SVGPathSegLinetoRel*/ _sproto.createSVGPathSegLinetoRel = function(/*float*/ x, /*float*/ y ) {\r
+ var s = new SVGPathSegLinetoRel();\r
+ s.x = x;\r
+ s.y = y;\r
+ return s;\r
+ };\r
+ /*SVGPathSegCurvetoCubicAbs*/ _sproto.createSVGPathSegCurvetoCubicAbs = function(/*float*/ x, /*float*/ y, /*float*/ x1, /*float*/ y1, /*float*/ x2, /*float*/ y2 ) {\r
+ var _SVGPathSegCurvetoCubicAbs = SVGPathSegCurvetoCubicAbs, s = new _SVGPathSegCurvetoCubicAbs();\r
+ s.x = x;\r
+ s.y = y;\r
+ s.x1 = x1;\r
+ s.y1 = y1;\r
+ s.x2 = x2;\r
+ s.y2 = y2;\r
+ return s;\r
+ };\r
+ /*SVGPathSegCurvetoCubicRel*/ _sproto.createSVGPathSegCurvetoCubicRel = function(/*float*/ x, /*float*/ y, /*float*/ x1, /*float*/ y1, /*float*/ x2, /*float*/ y2 ) {\r
+ var s = new SVGPathSegCurvetoCubicRel();\r
+ s.x = x;\r
+ s.y = y;\r
+ s.x1 = x1;\r
+ s.y1 = y1;\r
+ s.x2 = x2;\r
+ s.y2 = y2;\r
+ return s;\r
+ };\r
+ /*SVGPathSegCurvetoQuadraticAbs*/ _sproto.createSVGPathSegCurvetoQuadraticAbs = function(/*float*/ x, /*float*/ y, /*float*/ x1, /*float*/ y1 ) {\r
+ var s = new SVGPathSegCurvetoQuadraticAbs();\r
+ s.x = x;\r
+ s.y = y;\r
+ s.x1 = x1;\r
+ s.y1 = y1;\r
+ return s;\r
+ };\r
+ /*SVGPathSegCurvetoQuadraticRel*/ _sproto.createSVGPathSegCurvetoQuadraticRel = function(/*float*/ x, /*float*/ y, /*float*/ x1, /*float*/ y1 ) {\r
+ var s = new SVGPathSegCurvetoQuadraticRel();\r
+ s.x = x;\r
+ s.y = y;\r
+ s.x1 = x1;\r
+ s.y1 = y1;\r
+ return s;\r
+ };\r
+ /*SVGPathSegArcAbs*/ _sproto.createSVGPathSegArcAbs = function(/*float*/ x, /*float*/ y, /*float*/ r1, /*float*/ r2, /*float*/ angle, /*boolean*/ largeArcFlag, /*boolean*/ sweepFlag ) {\r
+ var s = new SVGPathSegArcAbs();\r
+ s.x = x;\r
+ s.y = y;\r
+ s.r1 = r1;\r
+ s.r2 = r2;\r
+ s.angle = angle;\r
+ s.largeArcFlag = largeArcFlag;\r
+ s.sweepFlag = sweepFlag;\r
+ return s;\r
+ };\r
+ /*SVGPathSegArcRel*/ _sproto.createSVGPathSegArcRel = function(/*float*/ x, /*float*/ y, /*float*/ r1, /*float*/ r2, /*float*/ angle, /*boolean*/ largeArcFlag, /*boolean*/ sweepFlag ) {\r
+ var s = new SVGPathSegArcRel();\r
+ s.x = x;\r
+ s.y = y;\r
+ s.r1 = r1;\r
+ s.r2 = r2;\r
+ s.angle = angle;\r
+ s.largeArcFlag = largeArcFlag;\r
+ s.sweepFlag = sweepFlag;\r
+ return s;\r
+ };\r
+ /*SVGPathSegLinetoHorizontalAbs*/ _sproto.createSVGPathSegLinetoHorizontalAbs = function(/*float*/ x ) {\r
+ var s = new SVGPathSegLinetoHorizontalAbs();\r
+ s.x = x;\r
+ s.y = 0; //DOMでは指定されていないが、変換処理が楽なので用いる\r
+ return s;\r
+ };\r
+ /*SVGPathSegLinetoHorizontalRel*/ _sproto.createSVGPathSegLinetoHorizontalRel = function(/*float*/ x ) {\r
+ var s = new SVGPathSegLinetoHorizontalRel();\r
+ s.x = x;\r
+ s.y = 0;\r
+ return s;\r
+ };\r
+ /*SVGPathSegLinetoVerticalAbs*/ _sproto.createSVGPathSegLinetoVerticalAbs = function(/*float*/ y ) {\r
+ var s = new SVGPathSegLinetoVerticalAbs();\r
+ s.x = 0;\r
+ s.y = y;\r
+ return s;\r
+ };\r
+ /*SVGPathSegLinetoVerticalRel*/ _sproto.createSVGPathSegLinetoVerticalRel = function(/*float*/ y ) {\r
+ var s = new SVGPathSegLinetoVerticalRel();\r
+ s.x = 0;\r
+ s.y = y;\r
+ return s;\r
+ };\r
+ /*SVGPathSegCurvetoCubicSmoothAbs*/ _sproto.createSVGPathSegCurvetoCubicSmoothAbs = function(/*float*/ x, /*float*/ y, /*float*/ x2, /*float*/ y2 ) {\r
+ var s = new SVGPathSegCurvetoCubicSmoothAbs();\r
+ s.x = x;\r
+ s.y = y;\r
+ s.x2 = x2;\r
+ s.y2 = y2;\r
+ return s;\r
+ };\r
+ /*SVGPathSegCurvetoCubicSmoothRel*/ _sproto.createSVGPathSegCurvetoCubicSmoothRel = function(/*float*/ x, /*float*/ y, /*float*/ x2, /*float*/ y2 ) {\r
+ var s = new SVGPathSegCurvetoCubicSmoothRel();\r
+ s.x = x;\r
+ s.y = y;\r
+ s.x2 = x2;\r
+ s.y2 = y2;\r
+ return s;\r
+ };\r
+ /*SVGPathSegCurvetoQuadraticSmoothAbs*/ _sproto.createSVGPathSegCurvetoQuadraticSmoothAbs = function(/*float*/ x, /*float*/ y ) {\r
+ var s = new SVGPathSegCurvetoQuadraticSmoothAbs();\r
+ s.x = x;\r
+ s.y = y;\r
+ return s;\r
+ };\r
+ /*SVGPathSegCurvetoQuadraticSmoothRel*/ _sproto.createSVGPathSegCurvetoQuadraticSmoothRel = function(/*float*/ x, /*float*/ y ) {\r
+ var s = new SVGPathSegCurvetoQuadraticSmoothRel();\r
+ s.x = x;\r
+ s.y = y;\r
+ return s;\r
+ };\r
+})(SVGPathElement.prototype);\r
+ NAIBU.SVGPathElement = SVGPathElement; //IE8では、SVGPathElementはローカル変数\r
+})(document, Math);\r
+\r
+function SVGRectElement(_doc) {\r
+ SVGElement.apply(this);\r
+ this._tar = _doc.createElement("v:shape");\r
+ var slen = SVGAnimatedLength;\r
+ /*readonly SVGAnimatedLength*/ this.x = new slen();\r
+ /*readonly SVGAnimatedLength*/ this.y = new slen();\r
+ /*readonly SVGAnimatedLength*/ this.width = new slen();\r
+ /*readonly SVGAnimatedLength*/ this.height = new slen();\r
+ /*readonly SVGAnimatedLength*/ this.rx = new slen();\r
+ /*readonly SVGAnimatedLength*/ this.ry = new slen();\r
+ _doc = slen = void 0;\r
+ this.addEventListener("DOMNodeInserted", function(evt){\r
+ if (evt.eventPhase === /*Event.BUBBLING_PHASE*/ 3) {\r
+ return; //強制終了させる\r
+ }\r
+ var tar = evt.target,\r
+ tnext = tar.nextSibling,\r
+ tpart = tar.parentNode._tar,\r
+ isLast = true;\r
+ if (tnext && tnext._tar && tpart && (tnext._tar.parentNode === tpart)) {\r
+ tpart.insertBefore(tar._tar, tnext._tar);\r
+ } else if (tnext && !tnext._tar && tpart) {\r
+ /*以下の処理は、_tarプロパティがない要素オブジェクトがあるため、それに対処するもの\r
+ *use要素や実体参照などは_tarプロパティがないことに注意\r
+ */\r
+ while (tnext) {\r
+ if (tnext._tar && (tnext._tar.parentNode === tpart)) {\r
+ tpart.insertBefore(tar._tar, tnext._tar);\r
+ isLast = false;\r
+ } \r
+ tnext = tnext.nextSibling;\r
+ }\r
+ if (isLast) {\r
+ tpart.appendChild(tar._tar);\r
+ }\r
+ } else if (!tnext && tpart) {\r
+ tpart.appendChild(tar._tar); \r
+ }\r
+ tnext = tpart = isLast = void 0;\r
+ tar.addEventListener("DOMNodeInsertedIntoDocument", function(evt) {\r
+ var tar = evt.target,\r
+ style = tar.ownerDocument.defaultView.getComputedStyle(tar, ""),\r
+ fontSize = parseFloat(style.getPropertyValue("font-size"));\r
+ tar.x.baseVal._emToUnit(fontSize);\r
+ tar.y.baseVal._emToUnit(fontSize);\r
+ tar.width.baseVal._emToUnit(fontSize);\r
+ tar.height.baseVal._emToUnit(fontSize);\r
+ var rx = tar.getAttributeNS(null, "rx"),\r
+ ry = tar.getAttributeNS(null, "ry"),\r
+ x = tar.x.baseVal.value,\r
+ y = tar.y.baseVal.value,\r
+ xw = x + tar.width.baseVal.value,\r
+ yh = y + tar.height.baseVal.value,\r
+ list;\r
+ if ((rx || ry) && (rx !== "0") && (ry !== "0")) {\r
+ tar.rx.baseVal._emToUnit(fontSize);\r
+ tar.ry.baseVal._emToUnit(fontSize);\r
+ var thrx = tar.rx.baseVal,\r
+ thry = tar.ry.baseVal,\r
+ twidth = tar.width.baseVal.value,\r
+ theight = tar.height.baseVal.value;\r
+ thrx.value = rx ? thrx.value : thry.value;\r
+ thry.value = ry ? thry.value : thrx.value;\r
+ //rx属性が幅より大きければ、幅の半分を属性に設定(ry属性は高さと比較する)\r
+ if (thrx.value > twidth / 2) {\r
+ thrx.value = twidth / 2;\r
+ }\r
+ if (thry.value > theight / 2) {\r
+ thry.value = theight / 2;\r
+ }\r
+ var rxv = thrx.value,\r
+ ryv = thry.value,\r
+ rrx = rxv * 0.55228,\r
+ rry = ryv * 0.55228,\r
+ a = xw - rxv,\r
+ b = x + rxv,\r
+ c = y + ryv,\r
+ d = yh - ryv;\r
+ list = ["m",b,y, "l",a,y, "c",a+rrx,y,xw,c-rry,xw,c, "l",xw,d, "c",xw,d+rry,a+rrx,yh,a,yh, "l",b,yh, "c",b-rrx,yh,x,d+rry,x,d, "l",x,c, "c",x,c-rry,b-rrx,y,b,y];\r
+ } else {\r
+ list = ["m",x,y, "l",x,yh, xw,yh, xw,y, "x e"];\r
+ }\r
+ //以下は、配列listそのものをCTMで座標変換していく処理\r
+ var par = tar.ownerDocument.documentElement,\r
+ ctm = tar.getScreenCTM(),\r
+ dat, p, pmt,\r
+ ele = tar._tar,\r
+ vi = tar.ownerDocument.documentElement,\r
+ w = vi.width.baseVal.value,\r
+ h = vi.height.baseVal.value,\r
+ mr = Math.round;\r
+ for (var i=0, lili=list.length;i<lili;) {\r
+ if (isNaN(list[i])) { //コマンド文字は読み飛ばす\r
+ ++i;\r
+ continue;\r
+ }\r
+ p = par.createSVGPoint();\r
+ p.x = list[i];\r
+ p.y = list[i+1];\r
+ pmt = p.matrixTransform(ctm);\r
+ list[i] = mr(pmt.x);\r
+ ++i;\r
+ list[i] = mr(pmt.y);\r
+ ++i;\r
+ p = pmt = void 0;\r
+ }\r
+ dat = list.join(" ");\r
+ //VMLに結び付けていく\r
+ ele.path = dat;\r
+ ele.coordsize = w + " " + h;\r
+ NAIBU._setPaint(tar, ctm);\r
+ delete tar._cacheMatrix;\r
+ evt = tar = style = list = mr = dat = ele = vi = fontSize = void 0;\r
+ }, false);\r
+ evt = tar = void 0;\r
+ }, false);\r
+ return this;\r
+};\r
+SVGRectElement.prototype = Object._create(SVGElement);\r
+\r
+function SVGCircleElement(_doc) { \r
+ SVGElement.apply(this);\r
+ this._tar = _doc.createElement("v:shape");\r
+ var sl = SVGAnimatedLength;\r
+ /*readonly SVGAnimatedLength*/ this.cx = new sl();\r
+ /*readonly SVGAnimatedLength*/ this.cy = new sl();\r
+ /*readonly SVGAnimatedLength*/ this.r = new sl();\r
+ _doc = sl = void 0;\r
+ this.addEventListener("DOMNodeInserted", function(evt){\r
+ var tar = evt.target;\r
+ if (evt.eventPhase === /*Event.BUBBLING_PHASE*/ 3) {\r
+ return; //強制終了させる\r
+ }\r
+ var tnext = tar.nextSibling,\r
+ tpart = tar.parentNode._tar,\r
+ isLast = true;\r
+ if (tnext && tnext._tar && tpart && (tnext._tar.parentNode === tpart)) {\r
+ tpart.insertBefore(tar._tar, tnext._tar);\r
+ } else if (tnext && !tnext._tar && tpart) {\r
+ /*以下の処理は、_tarプロパティがない要素オブジェクトがあるため、それに対処するもの\r
+ *use要素や実体参照などは_tarプロパティがないことに注意\r
+ */\r
+ while (tnext) {\r
+ if (tnext._tar && (tnext._tar.parentNode === tpart)) {\r
+ tpart.insertBefore(tar._tar, tnext._tar);\r
+ isLast = false;\r
+ } \r
+ tnext = tnext.nextSibling;\r
+ }\r
+ if (isLast) {\r
+ tpart.appendChild(tar._tar);\r
+ }\r
+ } else if (!tnext && tpart) {\r
+ tpart.appendChild(tar._tar); \r
+ }\r
+ tnext = tpart = isLast = void 0;\r
+ tar.addEventListener("DOMNodeInsertedIntoDocument", function(evt) {\r
+ var tar = evt.target,\r
+ style = tar.ownerDocument.defaultView.getComputedStyle(tar, ""),\r
+ fontSize = parseFloat(style.getPropertyValue("font-size"));\r
+ tar.cx.baseVal._emToUnit(fontSize);\r
+ tar.cy.baseVal._emToUnit(fontSize);\r
+ tar.r.baseVal._emToUnit(fontSize);\r
+ var cx = tar.cx.baseVal.value,\r
+ cy = tar.cy.baseVal.value,\r
+ rx = ry = tar.r.baseVal.value,\r
+ top = cy - ry,\r
+ left = cx - rx,\r
+ bottom = cy + ry,\r
+ right = cx + rx,\r
+ rrx = rx * 0.55228,\r
+ rry = ry * 0.55228,\r
+ list = ["m", cx,top, "c", cx-rrx,top, left,cy-rry, left,cy, left,cy+rry, cx-rrx,bottom, cx,bottom, cx+rrx,bottom, right,cy+rry, right,cy, right,cy-rry, cx+rrx,top, cx,top, "x e"];\r
+ //以下は、配列listそのものをCTMで座標変換していく処理\r
+ var par = tar.ownerDocument.documentElement,\r
+ ctm = tar.getScreenCTM(),\r
+ mr = Math.round;\r
+ for (var i=0, lili=list.length;i<lili;) {\r
+ if (isNaN(list[i])) { //コマンド文字は読み飛ばす\r
+ ++i;\r
+ continue;\r
+ }\r
+ var p = par.createSVGPoint();\r
+ p.x = list[i];\r
+ p.y = list[i+1];\r
+ var pmt = p.matrixTransform(ctm);\r
+ list[i] = mr(pmt.x);\r
+ ++i;\r
+ list[i] = mr(pmt.y);\r
+ ++i;\r
+ p = pmt = void 0;\r
+ }\r
+ var dat = list.join(" "),\r
+ ele = tar._tar,\r
+ vi = tar.ownerDocument.documentElement,\r
+ w = vi.width.baseVal.value,\r
+ h = vi.height.baseVal.value;\r
+ //VMLに結び付けていく\r
+ ele.path = dat;\r
+ ele.coordsize = w + " " + h;\r
+ NAIBU._setPaint(tar, ctm);\r
+ delete tar._cacheMatrix;\r
+ evt = tar = list = mr = style = fontSize = dat = ele = void 0;\r
+ }, false);\r
+ evt = tar = void 0;\r
+ }, false);\r
+ return this;\r
+};\r
+SVGCircleElement.prototype = Object._create(SVGElement);\r
+\r
+function SVGEllipseElement(_doc) { \r
+ SVGElement.apply(this);\r
+ this._tar = _doc.createElement("v:shape");\r
+ var sl = SVGAnimatedLength;\r
+ /*readonly SVGAnimatedLength*/ this.cx = new sl();\r
+ /*readonly SVGAnimatedLength*/ this.cy = new sl();\r
+ /*readonly SVGAnimatedLength*/ this.rx = new sl();\r
+ /*readonly SVGAnimatedLength*/ this.ry = new sl();\r
+ _doc = sl = void 0;\r
+ this.addEventListener("DOMNodeInserted", function(evt){\r
+ var tar = evt.target;\r
+ if (evt.eventPhase === /*Event.BUBBLING_PHASE*/ 3) {\r
+ return; //強制終了させる\r
+ }\r
+ var tnext = tar.nextSibling,\r
+ tpart = tar.parentNode._tar,\r
+ isLast = true;\r
+ if (tnext && tnext._tar && tpart && (tnext._tar.parentNode === tpart)) {\r
+ tpart.insertBefore(tar._tar, tnext._tar);\r
+ } else if (tnext && !tnext._tar && tpart) {\r
+ /*以下の処理は、_tarプロパティがない要素オブジェクトがあるため、それに対処するもの\r
+ *use要素や実体参照などは_tarプロパティがないことに注意\r
+ */\r
+ while (tnext) {\r
+ if (tnext._tar && (tnext._tar.parentNode === tpart)) {\r
+ tpart.insertBefore(tar._tar, tnext._tar);\r
+ isLast = false;\r
+ } \r
+ tnext = tnext.nextSibling;\r
+ }\r
+ if (isLast) {\r
+ tpart.appendChild(tar._tar);\r
+ }\r
+ } else if (!tnext && tpart) {\r
+ tpart.appendChild(tar._tar); \r
+ }\r
+ tnext = tpart = isLast = void 0;\r
+ tar.addEventListener("DOMNodeInsertedIntoDocument", function(evt) {\r
+ var tar = evt.target,\r
+ style = tar.ownerDocument.defaultView.getComputedStyle(tar, ""),\r
+ fontSize = parseFloat(style.getPropertyValue("font-size"));\r
+ tar.cx.baseVal._emToUnit(fontSize);\r
+ tar.cy.baseVal._emToUnit(fontSize);\r
+ tar.rx.baseVal._emToUnit(fontSize);\r
+ tar.ry.baseVal._emToUnit(fontSize);\r
+ var cx = tar.cx.baseVal.value,\r
+ cy = tar.cy.baseVal.value,\r
+ rx = tar.rx.baseVal.value,\r
+ ry = tar.ry.baseVal.value,\r
+ top = cy - ry,\r
+ left = cx - rx,\r
+ bottom = cy + ry,\r
+ right = cx + rx,\r
+ rrx = rx * 0.55228,\r
+ rry = ry * 0.55228,\r
+ list = ["m", cx,top, "c", cx-rrx,top, left,cy-rry, left,cy, left,cy+rry, cx-rrx,bottom, cx,bottom, cx+rrx,bottom, right,cy+rry, right,cy, right,cy-rry, cx+rrx,top, cx,top, "x e"];\r
+ //以下は、配列listそのものをCTMで座標変換していく処理\r
+ var par = tar.ownerDocument.documentElement,\r
+ ctm = tar.getScreenCTM(),\r
+ mr = Math.round;\r
+ for (var i=0, lili=list.length;i<lili;) {\r
+ if (isNaN(list[i])) { //コマンド文字は読み飛ばす\r
+ ++i;\r
+ continue;\r
+ }\r
+ var p = par.createSVGPoint();\r
+ p.x = list[i];\r
+ p.y = list[i+1];\r
+ var pmt = p.matrixTransform(ctm);\r
+ list[i] = mr(pmt.x);\r
+ ++i;\r
+ list[i] = mr(pmt.y);\r
+ ++i;\r
+ p = pmt = void 0;\r
+ }\r
+ var dat = list.join(" "),\r
+ ele = tar._tar, \r
+ vi = tar.ownerDocument.documentElement,\r
+ w = vi.width.baseVal.value,\r
+ h = vi.height.baseVal.value;\r
+ //VMLに結び付けていく\r
+ ele.path = dat;\r
+ ele.coordsize = w + " " + h;\r
+ NAIBU._setPaint(tar, ctm);\r
+ delete tar._cacheMatrix;\r
+ evt = ele = tar = style = fontSize = dat = list = mr = ctm = w = h = void 0;\r
+ }, false);\r
+ evt = tar = void 0;\r
+ }, false);\r
+ return this;\r
+};\r
+SVGEllipseElement.prototype = Object._create(SVGElement);\r
+\r
+function SVGLineElement(_doc) { \r
+ SVGElement.apply(this);\r
+ this._tar = _doc.createElement("v:shape");\r
+ var sl = SVGAnimatedLength;\r
+ /*readonly SVGAnimatedLength*/ this.x1 = new sl();\r
+ /*readonly SVGAnimatedLength*/ this.y1 = new sl();\r
+ /*readonly SVGAnimatedLength*/ this.x2 = new sl();\r
+ /*readonly SVGAnimatedLength*/ this.y2 = new sl();\r
+ _doc = sl = void 0;\r
+ this.addEventListener("DOMNodeInserted", function(evt){\r
+ var tar = evt.target;\r
+ if (evt.eventPhase === /*Event.BUBBLING_PHASE*/ 3) {\r
+ return; //強制終了させる\r
+ }\r
+ var tnext = tar.nextSibling,\r
+ tpart = tar.parentNode._tar,\r
+ isLast = true;\r
+ if (tnext && tnext._tar && tpart && (tnext._tar.parentNode === tpart)) {\r
+ tpart.insertBefore(tar._tar, tnext._tar);\r
+ } else if (tnext && !tnext._tar && tpart) {\r
+ /*以下の処理は、_tarプロパティがない要素オブジェクトがあるため、それに対処するもの\r
+ *use要素や実体参照などは_tarプロパティがないことに注意\r
+ */\r
+ while (tnext) {\r
+ if (tnext._tar && (tnext._tar.parentNode === tpart)) {\r
+ tpart.insertBefore(tar._tar, tnext._tar);\r
+ isLast = false;\r
+ } \r
+ tnext = tnext.nextSibling;\r
+ }\r
+ if (isLast) {\r
+ tpart.appendChild(tar._tar);\r
+ }\r
+ } else if (!tnext && tpart) {\r
+ tpart.appendChild(tar._tar); \r
+ }\r
+ tnext = tpart = isLast = void 0;\r
+ tar.addEventListener("DOMNodeInsertedIntoDocument", function(evt) {\r
+ var tar = evt.target,\r
+ style = tar.ownerDocument.defaultView.getComputedStyle(tar, ""),\r
+ fontSize = parseFloat(style.getPropertyValue("font-size"));\r
+ tar.x1.baseVal._emToUnit(fontSize);\r
+ tar.y1.baseVal._emToUnit(fontSize);\r
+ tar.x2.baseVal._emToUnit(fontSize);\r
+ tar.y2.baseVal._emToUnit(fontSize);\r
+ //以下は、配列listそのものをCTMで座標変換していく処理\r
+ var vi = tar.ownerDocument.documentElement,\r
+ ctm = tar.getScreenCTM(),\r
+ dat = "m ",\r
+ mr = Math.round,\r
+ p = vi.createSVGPoint();\r
+ p.x = tar.x1.baseVal.value;\r
+ p.y = tar.y1.baseVal.value;\r
+ var pmt = p.matrixTransform(ctm);\r
+ dat += mr(pmt.x)+ " " +mr(pmt.y)+ " l ";\r
+ p.x = tar.x2.baseVal.value;\r
+ p.y = tar.y2.baseVal.value;\r
+ pmt = p.matrixTransform(ctm);\r
+ dat += mr(pmt.x)+ " " +mr(pmt.y);\r
+ p = pmt = void 0;\r
+ //VMLに結び付けていく\r
+ var ele = tar._tar,\r
+ w = vi.width.baseVal.value,\r
+ h = vi.height.baseVal.value;\r
+ ele.path = dat;\r
+ ele.coordsize = w + " " + h;\r
+ NAIBU._setPaint(tar, ctm);\r
+ delete tar._cacheMatrix;\r
+ evt = ele = tar = style = fontSize = dat = list = mr = ctm = vi = w = h = void 0;\r
+ }, false);\r
+ evt = tar = void 0;\r
+ }, false);\r
+ return this;\r
+};\r
+SVGLineElement.prototype = Object._create(SVGElement);\r
+\r
+/*_GenericSVGPolyElementインターフェース\r
+ * このインターフェースはpolygonとpolyline要素共通のインターフェースとして使用。\r
+ * ファイルサイズを軽量にすることができる\r
+ */\r
+NAIBU._GenericSVGPolyElement = function (_doc, xclose) {\r
+ SVGElement.apply(this);\r
+ this._tar = _doc.createElement("v:shape");\r
+ _doc = void 0;\r
+ //interface SVGAnimatedPoints\r
+ /*readonly SVGPointList*/ this.animatedPoints = this.points = new SVGPointList();\r
+ this.addEventListener("DOMAttrModified", function(evt){\r
+ var tar = evt.target;\r
+ if (evt.attrName === "points") {\r
+ var tp = tar.points, par = tar.ownerDocument.documentElement;\r
+ var list = evt.newValue.replace(/^\s+|\s+$/g, "").split(/[\s,]+/);\r
+ for (var i=0, p, lili=list.length;i<lili;i+=2) {\r
+ if (isNaN(list[i])) {\r
+ --i;\r
+ continue;\r
+ }\r
+ p = par.createSVGPoint();\r
+ p.x = parseFloat(list[i]);\r
+ p.y = parseFloat(list[i+1]);\r
+ tp.appendItem(p);\r
+ }\r
+ }\r
+ evt = tar = list = tp = par = p = void 0;\r
+ }, false);\r
+ this.addEventListener("DOMNodeInserted", function(evt){\r
+ var tar = evt.target;\r
+ if (evt.eventPhase === /*Event.BUBBLING_PHASE*/ 3) {\r
+ return; //強制終了させる\r
+ }\r
+ var tnext = tar.nextSibling,\r
+ tpart = tar.parentNode._tar,\r
+ isLast = true;\r
+ if (tnext && tnext._tar && tpart && (tnext._tar.parentNode === tpart)) {\r
+ tpart.insertBefore(tar._tar, tnext._tar);\r
+ } else if (tnext && !tnext._tar && tpart) {\r
+ /*以下の処理は、_tarプロパティがない要素オブジェクトがあるため、それに対処するもの\r
+ *use要素や実体参照などは_tarプロパティがないことに注意\r
+ */\r
+ while (tnext) {\r
+ if (tnext._tar && (tnext._tar.parentNode === tpart)) {\r
+ tpart.insertBefore(tar._tar, tnext._tar);\r
+ isLast = false;\r
+ } \r
+ tnext = tnext.nextSibling;\r
+ }\r
+ if (isLast) {\r
+ tpart.appendChild(tar._tar);\r
+ }\r
+ } else if (!tnext && tpart) {\r
+ tpart.appendChild(tar._tar); \r
+ }\r
+ tnext = tpart = isLast = void 0;\r
+ tar.addEventListener("DOMNodeInsertedIntoDocument", function(evt) {\r
+ var tar = evt.target,\r
+ tp = tar.points,\r
+ ctm = tar.getScreenCTM(),\r
+ mr = Math.round;\r
+ //以下は、配列listそのものをCTMで座標変換していく処理\r
+ for (var i=0, list = [], lili=tp.numberOfItems;i<lili;++i) {\r
+ var p = tp.getItem(i),\r
+ pmt = p.matrixTransform(ctm);\r
+ list[2*i] = mr(pmt.x);\r
+ list[2*i + 1] = mr(pmt.y);\r
+ p = pmt = void 0;\r
+ }\r
+ list.splice(2, 0, "l");\r
+ var dat = "m" + list.join(" ") + xclose,\r
+ ele = tar._tar,\r
+ vi = tar.ownerDocument.documentElement;\r
+ w = vi.width.baseVal.value,\r
+ h = vi.height.baseVal.value;\r
+ //VMLに結び付けていく\r
+ ele.path = dat;\r
+ ele.coordsize = w + " " + h;\r
+ NAIBU._setPaint(tar, ctm);\r
+ delete tar._cacheMatrix;\r
+ evt = ele = tar = dat = list = mr = ctm = w = h = vi = void 0;\r
+ }, false);\r
+ evt = tar = void 0;\r
+ }, false);\r
+ return this;\r
+};\r
+function SVGPolylineElement(_doc) {\r
+ NAIBU._GenericSVGPolyElement.call(this, _doc, "e");\r
+ _doc = void 0;\r
+ return this;\r
+};\r
+SVGPolylineElement.prototype = Object._create(SVGElement);\r
+\r
+function SVGPolygonElement(_doc) {\r
+ NAIBU._GenericSVGPolyElement.call(this, _doc, "x e");\r
+ _doc = void 0;\r
+ return this;\r
+};\r
+SVGPolygonElement.prototype = Object._create(SVGElement);\r
+\r
+function SVGTextContentElement(_doc) { \r
+ SVGElement.apply(this);\r
+ /*readonly SVGAnimatedLength*/ this.textLength = new SVGAnimatedLength();\r
+ /*readonly SVGAnimatedEnumeration*/ this.lengthAdjust = new SVGAnimatedEnumeration(/*SVGTextContentElement.LENGTHADJUST_UNKNOWN*/ 0);\r
+ this.addEventListener("DOMNodeInserted", function(evt){\r
+ var tar = evt.target,\r
+ cur = evt.currentTarget,\r
+ eph = evt.eventPhase;\r
+ /*Bubblingフェーズの時にはもう、div要素をDOMツリーに挿入しておく必要があるため、\r
+ *あらかじめ、Capturingフェーズで処理しておく\r
+ */\r
+ if ((eph === /*Event.CAPTURING_PHASE*/ 1) && (tar.localName === "a") && (tar.namespaceURI === "http://www.w3.org/2000/svg") && tar.firstChild) {\r
+ /*a要素の場合はtarをすりかえておく*/\r
+ tar = tar.firstChild;\r
+ }\r
+ if ((eph === /*Event.CAPTURING_PHASE*/ 1) && (tar.nodeType === /*Node.TEXT_NODE*/ 3) && !!!tar._tars) {\r
+ /*Textノードにdiv要素を格納したリストをプロパティとして蓄えておく*/\r
+ tar._tars = [];\r
+ var data = tar.data.replace(/^\s+/, "").replace(/\s+$/, "");\r
+ tar.data = data;\r
+ tar.length = data.length;\r
+ data = data.split('');\r
+ for (var i=0, tdli=data.length;i<tdli;++i) {\r
+ var d = _doc.createElement("div"),\r
+ dstyle = d.style;\r
+ dstyle.position = "absolute";\r
+ dstyle.textIndent = dstyle.marginLeft = dstyle.marginRight = dstyle.marginTop = dstyle.paddingTop = dstyle.paddingLeft = "0px";\r
+ dstyle.whiteSpace = "nowrap";\r
+ d.appendChild(_doc.createTextNode(data[i]));\r
+ tar._tars[tar._tars.length] = d;\r
+ }\r
+ data = void 0;\r
+ }\r
+ evt = tar = cur = eph = void 0;\r
+ }, true);\r
+ this.addEventListener("DOMNodeRemoved", function(evt){\r
+ var tar = evt.target;\r
+ if (evt.eventPhase === /*Event.BUBBLING_PHASE*/ 3) {\r
+ delete evt.currentTarget._length;\r
+ tar = evt = void 0;\r
+ }\r
+ }, false);\r
+ return this;\r
+};\r
+\r
+(function(t) {\r
+t.prototype = Object._create(SVGElement);\r
+ // lengthAdjust Types\r
+ /*unsigned short t.LENGTHADJUST_UNKNOWN = 0;\r
+ /*unsigned short t.LENGTHADJUST_SPACING = 1;\r
+ /*unsigned short t.LENGTHADJUST_SPACINGANDGLYPHS = 2;*/\r
+ t.prototype._list = null; //文字の位置を格納しておくリストのキャッシュ\r
+ t.prototype._length = null; //全文字数のキャッシュ\r
+ t.prototype._stx = t.prototype._sty = 0; //初めの文字の位置\r
+ t.prototype._chars = 0; //tspan (tref)要素が全体の何文字目から始まっているか\r
+ t.prototype._isYokogaki = true; //横書きかどうか\r
+/*long*/ t.prototype.getNumberOfChars = function() {\r
+ if (this._length) {\r
+ return (this._length);\r
+ } else {\r
+ var s = 0,\r
+ f = function (ts) {\r
+ while (ts) {\r
+ if (ts.length && (ts.nodeType === /*Node.TEXT_NODE*/ 3)) {\r
+ s += ts.length;\r
+ } else if (ts.getNumberOfChars) { //tspan要素などであれば\r
+ s += ts.getNumberOfChars();\r
+ } else if (ts.firstChild && (ts.nodeType === /*Node.ELEMENT_NODE*/ 1)) {\r
+ f(ts.firstChild); //再帰的に呼び出す\r
+ }\r
+ ts = ts.nextSibling;\r
+ }\r
+ ts = void 0;\r
+ };\r
+ f(this.firstChild);\r
+ this._length = s;\r
+ return s;\r
+ }\r
+};\r
+/*float*/ t.prototype.getComputedTextLength = function() {\r
+ var l = this.textLength.baseVal;\r
+ if ((l.value === 0) && (this.getNumberOfChars() > 0)) {\r
+ /*何も設定されていない場合のみ、初期化を行う*/\r
+ l.newValueSpecifiedUnits(/*SVGLength.SVG_LENGTHTYPE_NUMBER*/ 1, this.getSubStringLength(0, this.getNumberOfChars()));\r
+ }\r
+ l = void 0;\r
+ return (this.textLength.baseVal.value);\r
+};\r
+/*getSubStringLengthメソッド\r
+ *charnum番目の文字からnchars+charnum-1番目までの文字列の長さを求めて返す\r
+ */\r
+/*float*/ t.prototype.getSubStringLength = function(/*unsigned long*/ charnum, /*unsigned long*/ nchars ) {\r
+ if (nchars === 0) {\r
+ return 0;\r
+ }\r
+ var tg = this.getNumberOfChars();\r
+ if (tg < (nchars+charnum)) {\r
+ /*ncharsが文字列の長さよりも長くなってしまったときには、\r
+ *文字列の末端までの長さを求めるとする(SVG1.1の仕様より)\r
+ */\r
+ nchars = tg - charnum + 1;\r
+ }\r
+ var end = this.getEndPositionOfChar(nchars+charnum-1), st = this.getStartPositionOfChar(charnum);\r
+ if (this._isYokogaki) {\r
+ var s = end.x - st.x;\r
+ } else {\r
+ var s = end.y - st.y;\r
+ }\r
+ tg = end = st = void 0;\r
+ return s;\r
+};\r
+/*SVGPoint*/ t.prototype.getStartPositionOfChar = function (/*unsigned long*/ charnum ) {\r
+ if (charnum > this.getNumberOfChars() || charnum < 0) {\r
+ throw (new DOMException(/*DOMException.INDEX_SIZE_ERR*/ 1));\r
+ } else {\r
+ var tar = this,\r
+ ti = tar.firstChild,\r
+ tp = tar.parentNode;\r
+ if (!!!tar._list) {\r
+ tar._list = [];\r
+ var chars = tar._chars, //現在、何文字目にあるのか\r
+ x = tar._stx, y = tar._sty, n = 0, //現在のテキスト位置と順番\r
+ style = tar.ownerDocument.defaultView.getComputedStyle(tar, null),\r
+ isYokogaki = ((style.getPropertyValue("writing-mode")) === "lr-tb") ? true : false,\r
+ fontSize = parseFloat(style.getPropertyValue("font-size")),\r
+ tx = tar.x.baseVal, ty = tar.y.baseVal, tdx = tar.dx.baseVal, tdy = tar.dy.baseVal;\r
+ /*親要素の属性も参照しておく*/\r
+ if (tp && ((tp.localName === "text") ||(tp.localName === "tspan"))) {\r
+ var ptx = tp.x.baseVal,\r
+ pty = tp.y.baseVal,\r
+ ptdx = tp.dx.baseVal,\r
+ ptdy = tp.dy.baseVal;\r
+ } else {\r
+ var ptx = pty = ptdx = ptdy = {numberOfItems : 0};\r
+ }\r
+ var kern = "f ijltIr.,:;'-\"()",\r
+ akern = "1234567890abcdeghknopquvxyz",\r
+ tt, alm, tdc, tcca, p, almx, almy, tlist, tg;\r
+ if (isYokogaki && (tar.localName === "text")) {\r
+ y += fontSize * 0.2;\r
+ } else if (tar.localName === "text"){\r
+ x -= fontSize * 0.5;\r
+ }\r
+ while (ti) {\r
+ if (ti.nodeType === /*Node.TEXT_NODE*/ 3) {\r
+ tt = ti._tars;\r
+ /*tspan(tref)要素のx属性で指定された座標の個数よりも、文字数が多い場合は、祖先(親)のx属性を\r
+ *使う。また、属性が指定されていないときも同様に祖先や親を使う。\r
+ *もし、仮に祖先や親がx属性を指定されていなければ、現在のテキスト位置(変数xに格納している)を使う。\r
+ *この処理はdx属性やdy、y属性でも同様とする\r
+ *参照資料SVG1.1 Text\r
+ *http://www.hcn.zaq.ne.jp/___/REC-SVG11-20030114/text.html\r
+ *\r
+ *注意:ここでは、tspan要素だけではなく、text要素にも適用しているが、本来はtspan要素のみに処理させること\r
+ */\r
+ for (var i=0, tli=tt.length;i<tli;++i) {\r
+ if (n < ptx.numberOfItems - chars) {\r
+ x = ptx.getItem(n).value;\r
+ if (!isYokogaki) {\r
+ x -= fontSize * 0.5;\r
+ }\r
+ } else if (n < tx.numberOfItems) {\r
+ x = tx.getItem(n).value;\r
+ if (!isYokogaki) {\r
+ x -= fontSize * 0.5;\r
+ }\r
+ }\r
+ if (n < pty.numberOfItems - chars) {\r
+ y = pty.getItem(n).value;\r
+ if (isYokogaki) {\r
+ y += fontSize * 0.2;\r
+ }\r
+ } else if (n < ty.numberOfItems) {\r
+ y = ty.getItem(n).value;\r
+ if (isYokogaki) {\r
+ y += fontSize * 0.2;\r
+ }\r
+ }\r
+ if (n < ptdx.numberOfItems - chars) {\r
+ x += ptdx.getItem(n).value;\r
+ } else if (n < tdx.numberOfItems) {\r
+ x += tdx.getItem(n).value;\r
+ }\r
+ if (n < ptdy.numberOfItems - chars) {\r
+ y += ptdy.getItem(n).value;\r
+ } else if (n < tdy.numberOfItems) {\r
+ y += tdy.getItem(n).value;\r
+ }\r
+ alm = 0;\r
+ if (isYokogaki) {\r
+ //カーニングを求めて、字の幅を文字ごとに調整する\r
+ tdc = ti.data.charAt(i);\r
+ if (kern.indexOf(tdc) > -1) {\r
+ alm = fontSize * 0.68;\r
+ } else if (tdc === "s"){\r
+ alm = fontSize * 0.52;\r
+ } else if ((tdc === "C") || (tdc === "D") || (tdc === "M") || (tdc === "W") || (tdc === "G") || (tdc === "m")){\r
+ alm = fontSize * 0.2;\r
+ } else if (akern.indexOf(tdc) > -1){\r
+ alm = fontSize * 0.45;\r
+ } else {\r
+ alm = fontSize * 0.3;\r
+ }\r
+ tcca = tdc.charCodeAt(0);\r
+ if ((12288 <= tcca) && (tcca <= 65533)) {\r
+ alm = -fontSize * 0.01;\r
+ if ((tdc === "う") || (tdc === "く") || (tdc === "し") || (tdc === "ち")) {\r
+ alm += fontSize * 0.2;\r
+ }\r
+ }\r
+ }\r
+ tlist = tar._list;\r
+ tlist[tlist.length] = x;\r
+ tlist[tlist.length] = y;\r
+ tlist[tlist.length] = fontSize - alm;\r
+ if (isYokogaki) {\r
+ x += fontSize;\r
+ x -= alm;\r
+ } else {\r
+ y += fontSize;\r
+ }\r
+ ++n;\r
+ }\r
+ chars += tli;\r
+ if (ti.parentNode && (ti.parentNode.localName === "a")) { //a要素が親である場合は、tiを親に戻しておく\r
+ ti = ti.parentNode;\r
+ }\r
+ ti = ti.nextSibling;\r
+ } else if (((ti.localName === "tspan") || (ti.localName === "tref"))\r
+ && (ti.namespaceURI === "http://www.w3.org/2000/svg") && ti.firstChild) {\r
+ /*現在のテキスト位置(x,y)の分だけ、tspan (tref)要素をずらしておく。\r
+ *さらに、現在のテキスト位置を更新する\r
+ */\r
+ ti._stx = x;\r
+ ti._sty = y;\r
+ ti._chars = chars;\r
+ p = ti.getStartPositionOfChar(ti.getNumberOfChars());\r
+ almx = 0;\r
+ almy = 0;\r
+ tlist = ti._list;\r
+ if (isYokogaki) {\r
+ almx = tlist[tlist.length-1];\r
+ } else {\r
+ almy = tlist[tlist.length-1];\r
+ }\r
+ x = tlist[tlist.length-3] + almx;\r
+ y = tlist[tlist.length-2] + almy;\r
+ tar._list = tar._list.concat(tlist);\r
+ tg = ti.getNumberOfChars();\r
+ n += tg;\r
+ chars += tg;\r
+ ti = ti.nextSibling;\r
+ } else if ((ti.localName === "a") && (ti.namespaceURI === "http://www.w3.org/2000/svg") && ti.firstChild) {\r
+ /*a要素のテキストノードも処理する*/\r
+ ti = ti.firstChild;\r
+ } else {\r
+ ti = ti.nextSibling;\r
+ }\r
+ }\r
+ tar._isYokogaki = isYokogaki; //getEndPositionOfCharメソッドなどで使う\r
+ }\r
+ tar = ti = tp = ptx = pty = tx = ty = chars = style = x = y = isYokogaki = kern = akern = tt = alm = tdc = tcca = p = almx = almy = tlist = tg = void 0;\r
+ var s = this.ownerDocument.documentElement.createSVGPoint();\r
+ s.x = this._list[charnum*3];\r
+ s.y = this._list[charnum*3 + 1];\r
+ s = s.matrixTransform(this.getScreenCTM());\r
+ return s;\r
+ }\r
+};\r
+/*SVGPoint*/ t.prototype.getEndPositionOfChar = function(/*unsigned long*/ charnum ) {\r
+ if (charnum > this.getNumberOfChars() || charnum < 0) {\r
+ throw (new DOMException(/*DOMException.INDEX_SIZE_ERR*/ 1));\r
+ } else {\r
+ var s = this.getStartPositionOfChar(charnum);\r
+ //アドバンス値(すなわちフォントの大きさ)をCTMの行列式を用いて、算出する\r
+ var n = this._list[charnum*3 + 2] * Math.sqrt(Math.abs(this.getScreenCTM()._determinant()));\r
+ if (this._isYokogaki) {\r
+ s.x += n;\r
+ } else {\r
+ s.y += n;\r
+ }\r
+ return s;\r
+ }\r
+};\r
+/*SVGRect*/ t.prototype.getExtentOfChar = function(/*unsigned long*/ charnum ) {\r
+ \r
+};\r
+/*float*/ t.prototype.getRotationOfChar = function(/*unsigned long*/ charnum ) {\r
+ \r
+};\r
+/*long*/ t.prototype.getCharNumAtPosition = function(/*SVGPoint*/ point ) {\r
+ \r
+};\r
+/*void*/ t.prototype.selectSubString = function(/*unsigned long*/ charnum,/*unsigned long*/ nchars ) {\r
+ \r
+};\r
+})(SVGTextContentElement);\r
+\r
+function SVGTextPositioningElement(_doc) { \r
+ SVGTextContentElement.apply(this, arguments);\r
+ var sl = SVGAnimatedLengthList;\r
+ /*readonly SVGAnimatedLengthList*/ this.x = new sl();\r
+ /*readonly SVGAnimatedLengthList*/ this.y = new sl();\r
+ /*readonly SVGAnimatedLengthList*/ this.dx = new sl();\r
+ /*readonly SVGAnimatedLengthList*/ this.dy = new sl();\r
+ sl = void 0;\r
+ /*readonly SVGAnimatedNumberList*/ this.rotate = new SVGAnimatedNumberList();\r
+ this.addEventListener("DOMAttrModified", function(evt){\r
+ var tar = evt.target,\r
+ name = evt.attrName,\r
+ tod = tar.ownerDocument.documentElement,\r
+ _parseFloat = parseFloat;\r
+ if ((name === "x") || (name === "y") || (name === "dx") || (name === "dy")) {\r
+ var enr = evt.newValue.replace(/^\s+|\s+$/g, "").split(/[\s,]+/),\r
+ teas = tar[name].baseVal;\r
+ for (var i=0, tli=enr.length;i<tli;++i) {\r
+ var tea = tod.createSVGLength(),\r
+ n = enr[i].slice(-1),\r
+ type = 0;\r
+ if (n >= "0" && n <= "9") {\r
+ type = /*SVGLength.SVG_LENGTHTYPE_NUMBER*/ 1;\r
+ } else if (n === "%") {\r
+ if ((name === "x") || (name === "dx")) {\r
+ tea._percent *= tod.viewport.width;\r
+ } else if ((name === "y") || (name === "dy")) {\r
+ tea._percent *= tod.viewport.height;\r
+ }\r
+ type = /*SVGLength.SVG_LENGTHTYPE_PERCENTAGE*/ 2;\r
+ } else {\r
+ n = enr[i].slice(-2);\r
+ if (n === "em") {\r
+ var style = tar.ownerDocument.defaultView.getComputedStyle(tar, null);\r
+ tea._percent *= _parseFloat(style.getPropertyValue("font-size"));\r
+ style = void 0;\r
+ type = /*SVGLength.SVG_LENGTHTYPE_EMS*/ 3;\r
+ } else if (n === "ex") {\r
+ type = /*SVGLength.SVG_LENGTHTYPE_EXS*/ 4;\r
+ } else if (n === "px") {\r
+ type = /*SVGLength.SVG_LENGTHTYPE_PX*/ 5;\r
+ } else if (n === "cm") {\r
+ type = /*SVGLength.SVG_LENGTHTYPE_CM*/ 6;\r
+ } else if (n === "mm") {\r
+ type = /*SVGLength.SVG_LENGTHTYPE_MM*/ 7;\r
+ } else if (n === "in") {\r
+ type = /*SVGLength.SVG_LENGTHTYPE_IN*/ 8;\r
+ } else if (n === "pt") {\r
+ type = /*SVGLength.SVG_LENGTHTYPE_PT*/ 9;\r
+ } else if (n === "pc") {\r
+ type = /*SVGLength.SVG_LENGTHTYPE_PC*/ 10;\r
+ }\r
+ }\r
+ var s = _parseFloat(enr[i]);\r
+ s = isNaN(s) ? 0 : s;\r
+ tea.newValueSpecifiedUnits(type, s);\r
+ teas.appendItem(tea);\r
+ }\r
+ tar._list = null;\r
+ }\r
+ evt = tar = void 0;\r
+ }, false);\r
+ this.addEventListener("DOMNodeInserted", function(evt){\r
+ if (evt.eventPhase === /*Event.BUBBLING_PHASE*/ 3) {\r
+ var tar = evt.target;\r
+ if (tar.nodeType !== /*Node.TEXT_NODE*/ 3) {\r
+ tar._list = void 0;\r
+ evt.currentTarget._list = null;\r
+ }\r
+ evt = tar = void 0;\r
+ }\r
+ }, false);\r
+ if (_doc) {\r
+ this._tar = _doc.createElement("v:group");\r
+ this._doc = _doc; //_docプロパティは_texto関数内で使われる\r
+ }\r
+ this.addEventListener("DOMNodeInserted", function(evt){\r
+ if (evt.eventPhase === /*Event.BUBBLING_PHASE*/ 3) {\r
+ return; //強制終了させる\r
+ }\r
+ var tar = evt.target,\r
+ tnext = tar.nextSibling,\r
+ tpart = tar.parentNode._tar,\r
+ isLast = true;\r
+ if (tnext && tnext._tar && tpart && (tnext._tar.parentNode === tpart)) {\r
+ tpart.insertBefore(tar._tar, tnext._tar);\r
+ } else if (tnext && !tnext._tar && tpart) {\r
+ /*以下の処理は、_tarプロパティがない要素オブジェクトがあるため、それに対処するもの\r
+ *use要素や実体参照などは_tarプロパティがないことに注意\r
+ */\r
+ while (tnext) {\r
+ if (tnext._tar && (tnext._tar.parentNode === tpart)) {\r
+ tpart.insertBefore(tar._tar, tnext._tar);\r
+ isLast = false;\r
+ } \r
+ tnext = tnext.nextSibling;\r
+ }\r
+ if (isLast) {\r
+ tpart.appendChild(tar._tar);\r
+ }\r
+ } else if (!tnext && tpart) {\r
+ tpart.appendChild(tar._tar); \r
+ }\r
+ tnext = tpart = isLast = void 0;\r
+ tar.addEventListener("DOMNodeInsertedIntoDocument", tar._texto, false);\r
+ evt = tar = void 0;\r
+ },false);\r
+ return this;\r
+};\r
+SVGTextPositioningElement.constructor = SVGTextContentElement;\r
+SVGTextPositioningElement.prototype = Object._create(SVGTextContentElement);\r
+SVGTextPositioningElement.prototype._texto = function(evt) {\r
+ var tar = evt.target,\r
+ ti = tar.firstChild,\r
+ ttp = tar._tar,\r
+ style = tar.ownerDocument.defaultView.getComputedStyle(tar, null),\r
+ deter = Math.sqrt(Math.abs(tar.getScreenCTM()._determinant())),\r
+ n = parseFloat(style.getPropertyValue("font-size")) * deter,\r
+ tod = tar.ownerDocument.documentElement,\r
+ ttpc = ttp, //ttpcはttpのキャッシュ\r
+ tlen = tar.getComputedTextLength(),\r
+ anchor = style.getPropertyValue("text-anchor"),\r
+ tedeco = style.getPropertyValue("text-decoration"), //text-decorationは継承しないので、個々に設定する\r
+ ttps = ttp.style,\r
+ ae = [],\r
+ lts = parseFloat(style.getPropertyValue("letter-spacing")),\r
+ wds = parseFloat(style.getPropertyValue("word-spacing"));\r
+ ttps.fontSize = n + "px"; //nは算出された文字の大きさ (CSSではなく、SVG独自のCTM方式による)\r
+ ttps.fontFamily = style.getPropertyValue("font-family");\r
+ ttps.fontStyle = style.getPropertyValue("font-style");\r
+ ttps.fontWeight = style.getPropertyValue("font-weight");\r
+ if (isFinite(lts)) {\r
+ ttps.letterSpacing = lts * deter + "px";\r
+ }\r
+ if (isFinite(parseFloat(wds))) {\r
+ ttps.wordSpacing = wds * deter + "px";\r
+ }\r
+ /*ここでの変数jは前回ノードまでの総文字数*/\r
+ for (var i=0, j=0, tli=tar.getNumberOfChars();i<tli;++i) {\r
+ if (ti) {\r
+ if (!!ti._tars && (ti._tars.length !== 0)) {\r
+ var ij = (i > j) ? i - j : j - i;\r
+ var sty = ti._tars[ij].style,\r
+ p = tar.getStartPositionOfChar(i);\r
+ sty.position = "absolute";\r
+ if (tar._isYokogaki) {\r
+ if (anchor === "middle") {\r
+ p.x -= tlen / 2;\r
+ } else if (anchor === "end") {\r
+ p.x -= tlen;\r
+ }\r
+ } else {\r
+ if (anchor === "middle") {\r
+ p.y -= tlen / 2;\r
+ } else if (anchor === "end") {\r
+ p.y -= tlen;\r
+ }\r
+ }\r
+ sty.left = p.x + "px";\r
+ sty.top = p.y + "px";\r
+ sty.width = "0px";\r
+ sty.height = "0px";\r
+ sty.marginTop = tar._isYokogaki ? -n-5+ "px" : "-5px";\r
+ sty.lineHeight = n+10+ "px";\r
+ sty.textDecoration = tedeco;\r
+ sty.display = "none";\r
+ ttp.appendChild(ti._tars[ij]);\r
+ sty = p = void 0;\r
+ }\r
+ if (ti.nodeName === "#text") {\r
+ if ((ti.data.length+j) <= i+1) { //テキストノード内の文字をすべて処理し終えれば\r
+ j = j + ti.data.length;\r
+ if (ti.data === "") {\r
+ /*空文字列の場合、文字数をカウントせず、iを減らしておく*/\r
+ --i;\r
+ }\r
+ if (ti.parentNode.localName === "a") {\r
+ ti = ti.parentNode;\r
+ ttp = ttpc;\r
+ }\r
+ ti = ti.nextSibling;\r
+ }\r
+ } else if (!!ti.getNumberOfChars) {\r
+ if ((ti.getNumberOfChars()+j) <= i+1) {\r
+ j = j + ti.getNumberOfChars();\r
+ ti = ti.nextSibling;\r
+ }\r
+ } else if ((ti.localName === "a") && (ti.namespaceURI === "http://www.w3.org/2000/svg") && ti.firstChild) {\r
+ ttp = ti._tar;\r
+ ti = ti.firstChild;\r
+ ae[ae.length] = ti;\r
+ if (i === 0) {\r
+ --i;\r
+ } else {\r
+ /*前にテキストノードがある場合など、iが0以上であれば、カウントを前回のテキストノードまでリセットしておく*/\r
+ i-=2;\r
+ }\r
+ }\r
+ }\r
+ }\r
+ var color = style.getPropertyValue("fill"),\r
+ cursor = style.getPropertyCSSValue("cursor"),\r
+ vis = style.getPropertyCSSValue("visibility"),\r
+ disp = style.getPropertyCSSValue("display"),\r
+ tts = tar._tar.style,\r
+ tft = tar.firstChild._tars, //空白のテキストノードの場合、tftがundefinedになる恐れがある\r
+ ttt = tft[0] ? tft[0].innerText.charAt(0) : [""], //あらかじめ初期化しておく\r
+ tfti;\r
+ if (color === "none"){\r
+ tts.color = "transparent";\r
+ } else if (color.indexOf("url") === -1) {\r
+ tts.color = color;\r
+ } else {\r
+ tts.color = "black";\r
+ }\r
+ if (cursor && !cursor._isDefault) { //初期値でないならば\r
+ var tc = cursor.cssText;\r
+ tts.cursor = tc.split(":")[1];\r
+ tc = void 0;\r
+ }\r
+ if ((tar.x.baseVal.numberOfItems === 1) && (tar.y.baseVal.numberOfItems === 1)\r
+ && tar._isYokogaki && (tar.firstChild.nodeName === "#text")) {\r
+ /*xとy属性が一つの値しか取らないとき、字詰めの処理をすべてブラウザに任せておく。\r
+ *以下では、他のdiv要素のテキストをすべて、最初のdiv要素にまとめている\r
+ */\r
+ for (var i=1, tli=tft.length;i<tli;++i) {\r
+ tfti = tft[i];\r
+ ttt += tfti.innerText;\r
+ tfti.parentNode.removeChild(tfti);\r
+ }\r
+ //以下でinnerTextやinnerHTMLを使うのは、IE6でエラーとなる可能性がある\r
+ if (tft[0] && tft[0].replaceChild) {\r
+ tft[0].replaceChild(tar._doc.createTextNode(ttt), tft[0].firstChild);\r
+ }\r
+ ttt = void 0;\r
+ }\r
+ var isRect = true,\r
+ di = "block";\r
+ if (ttp.lastChild) {\r
+ if (ttp.lastChild.nodeName !== "rect") {\r
+ isRect = false;\r
+ }\r
+ } else {\r
+ isRect = false;\r
+ }\r
+ if (!isRect) {\r
+ var backr = tar._doc.createElement("v:rect"),\r
+ backrs = backr.style; //ずれを修正するためのもの\r
+ backrs.width = backrs.height = "1px";\r
+ backrs.left = backrs.top = "0px";\r
+ backr.stroked = backr.filled = "false";\r
+ ttp.appendChild(backr);\r
+ }\r
+ if (vis && !vis._isDefault) {\r
+ tts.visibility = vis.cssText.split(":")[1];\r
+ }\r
+ /*dipslayプロパティだけはdiv要素の個々に設定しておく必要がある\r
+ *なぜかといえば、div要素をdisplay:none;であらかじめ設定しているため。\r
+ */\r
+ if (disp && !disp._isDefault && (disp.cssText.indexOf("none") > -1)) {\r
+ di = "none";\r
+ } else if (disp && !disp._isDefault) {\r
+ di = "block";\r
+ }\r
+ var jt = tar._tar.firstChild,\r
+ j = 0;\r
+ while (jt) {\r
+ jt.style.display = di;\r
+ jt = jt.nextSibling;\r
+ }\r
+ while (ae[j]) { //要素内部にあるa要素の処理\r
+ for (var l=0, tli=ae[j]._tars.length;l<tli;++l) {\r
+ ae[j]._tars[l].style.display = di;\r
+ }\r
+ l = void 0;\r
+ ++j;\r
+ }\r
+ delete tar._cacheMatrix;\r
+ ae = isRect = evt = tar = style = tedeco = tpp = ttpc = style = color = cursor = disp = vis = ttps = backr = backrs = di = tft = jt = lts = deter = void 0;\r
+};\r
+\r
+function SVGTextElement(_doc) {\r
+ SVGTextPositioningElement.apply(this, arguments);\r
+ return this;\r
+};\r
+SVGTextElement.constructor = SVGTextPositioningElement;\r
+SVGTextElement.prototype = Object._create(SVGTextPositioningElement);\r
+\r
+function SVGTSpanElement() {\r
+ SVGTextElement.apply(this, arguments);\r
+ return this;\r
+};\r
+SVGTSpanElement.constructor = SVGTextPositioningElement;\r
+SVGTSpanElement.prototype = Object._create(SVGTextPositioningElement);\r
+\r
+function SVGTRefElement(_doc) {\r
+ SVGTextPositioningElement.apply(this, arguments);\r
+ this.addEventListener("DOMNodeInserted", function(evt){\r
+ if (evt.eventPhase === /*Event.BUBBLING_PHASE*/ 3) {\r
+ return; //強制終了させる\r
+ }\r
+ evt.target.setAttributeNS("http://www.w3.org/1999/xlink", "xlink:show", "embed");\r
+ }, false);\r
+ this.addEventListener("S_Load", function(evt){\r
+ var tar = evt.target,\r
+ tic = tar._instance.firstChild;\r
+ /*textノードのデータだけを処理*/\r
+ while (tic && (tic.nodeName !== "#text")) {\r
+ tic = tic.nextSibling;\r
+ }\r
+ tic && tar.parentNode.insertBefore(tar.ownerDocument.importNode(tic, false), tar);\r
+ evt.target = tar.parentNode;\r
+ tar.parentNode._texto(evt);\r
+ tar = tic = evtt = void 0;\r
+ }, false);\r
+ SVGURIReference.apply(this, arguments);\r
+ return this;\r
+};\r
+SVGTRefElement.constructor = SVGTextPositioningElement;\r
+SVGTRefElement.prototype = Object._create(SVGTextPositioningElement);\r
+\r
+function SVGTextPathElement() { \r
+ SVGTextContentElement.apply(this, arguments);\r
+ /*readonly SVGAnimatedLength*/ this.startOffset;\r
+ /*readonly SVGAnimatedEnumeration*/ this.method;\r
+ /*readonly SVGAnimatedEnumeration*/ this.spacing;\r
+ SVGURIReference.apply(this, arguments);\r
+ return this;\r
+};\r
+SVGTextPathElement.constructor = SVGTextContentElement;\r
+SVGTextPathElement.prototype = Object._create(SVGTextContentElement);\r
+\r
+(function(t){\r
+ // textPath Method Types\r
+ /*unsigned short t.TEXTPATH_METHODTYPE_UNKNOWN = 0;\r
+ /*unsigned short t.TEXTPATH_METHODTYPE_ALIGN = 1;\r
+ /*unsigned short t.TEXTPATH_METHODTYPE_STRETCH = 2;\r
+ // textPath Spacing Types\r
+ /*unsigned short t.TEXTPATH_SPACINGTYPE_UNKNOWN = 0;\r
+ /*unsigned short t.TEXTPATH_SPACINGTYPE_AUTO = 1;\r
+ /*unsigned short t.TEXTPATH_SPACINGTYPE_EXACT = 2;*/\r
+})(SVGTextPathElement);\r
+\r
+function SVGAltGlyphElement() { \r
+ SVGTextPositioningElement.apply(this, arguments);\r
+ /*DOMString*/ this.glyphRef;\r
+ /*DOMString*/ this.format;\r
+ SVGURIReference.apply(this, arguments);\r
+ return this;\r
+};\r
+SVGAltGlyphElement.constructor = SVGTextPositioningElement;\r
+SVGAltGlyphElement.prototype = Object._create(SVGTextPositioningElement);\r
+\r
+function SVGAltGlyphDefElement() {\r
+ SVGElement.apply(this, arguments);\r
+ return this;\r
+};\r
+SVGAltGlyphDefElement.prototype = Object._create(SVGElement);\r
+\r
+function SVGAltGlyphItemElement() {\r
+ SVGElement.apply(this, arguments);\r
+ return this;\r
+};\r
+SVGAltGlyphItemElement.prototype = Object._create(SVGElement);\r
+\r
+function SVGGlyphRefElement() { \r
+ SVGElement.apply(this, arguments);\r
+ /*DOMString*/ this.glyphRef;\r
+ /*DOMString*/ this.format;\r
+ /*float*/ this.x;\r
+ /*float*/ this.y;\r
+ /*float*/ this.dx;\r
+ /*float*/ this.dy;\r
+ SVGURIReference.apply(this, arguments);\r
+ return this;\r
+};\r
+SVGGlyphRefElement.prototype = Object._create(SVGElement);\r
+\r
+function SVGPaint() { \r
+ SVGColor.apply(this, arguments);\r
+ return this;\r
+};\r
+\r
+(function(t){\r
+t.prototype = Object._create(SVGColor);\r
+ // Paint Types\r
+ /*unsigned short t.SVG_PAINTTYPE_UNKNOWN = 0;\r
+ /*unsigned short t.SVG_PAINTTYPE_RGBCOLOR = 1;\r
+ /*unsigned short t.SVG_PAINTTYPE_RGBCOLOR_ICCCOLOR = 2;\r
+ /*unsigned short t.SVG_PAINTTYPE_NONE = 101;\r
+ /*unsigned short t.SVG_PAINTTYPE_CURRENTCOLOR = 102;\r
+ /*unsigned short t.SVG_PAINTTYPE_URI_NONE = 103;\r
+ /*unsigned short t.SVG_PAINTTYPE_URI_CURRENTCOLOR = 104;\r
+ /*unsigned short t.SVG_PAINTTYPE_URI_RGBCOLOR = 105;\r
+ /*unsigned short t.SVG_PAINTTYPE_URI_RGBCOLOR_ICCCOLOR = 106;\r
+ /*unsigned short t.SVG_PAINTTYPE_URI = 107;*/\r
+ /*readonly unsigned short*/ t.prototype.paintType = /*t.SVG_PAINTTYPE_UNKNOWN*/ 0;\r
+ /*readonly DOMString*/ t.prototype.uri = null;\r
+/*void*/ t.prototype.setUri = function(/*DOMString*/ uri ) {\r
+ this.setPaint(/*SVGPaint.SVG_PAINTTYPE_URI_NONE*/ 103, uri, null, null);\r
+};\r
+/*void*/ t.prototype.setPaint = function(/*unsigned short*/ paintType, /*DOMString*/ uri, /*DOMString*/ rgbColor, /*DOMString*/ iccColor ) {\r
+ if ((paintType < 101 && uri) || (paintType > 102 && !uri)) {\r
+ throw new SVGException(/*SVGException.SVG_INVALID_VALUE_ERR*/ 1);\r
+ }\r
+ this.uri = uri;\r
+ this.paintType = paintType;\r
+ if (paintType === /*SVGPaint.SVG_PAINTTYPE_CURRENTCOLOR*/ 102) {\r
+ paintType = /*SVGColor.SVG_COLORTYPE_CURRENTCOLOR*/ 3;\r
+ }\r
+ this.setColor(paintType, rgbColor, iccColor); //SVGColorのsetColorメソッドを用いる\r
+};\r
+// raises( SVGException );\r
+t = void 0;\r
+})(SVGPaint);\r
+\r
+function SVGMarkerElement(){ \r
+ SVGSVGElement.apply(this, [{createElement:function(){}}]);\r
+ this._tar = {style:{}}; //getScreenCTMメソッド対策\r
+ var sl = SVGAnimatedLength;\r
+ /*readonly SVGAnimatedLength*/ this.refX = new sl();\r
+ /*readonly SVGAnimatedLength*/ this.refY = new sl();\r
+ /*readonly SVGAnimatedEnumeration*/ this.markerUnits = new SVGAnimatedEnumeration();\r
+ this.markerUnits.baseVal = /*SVGMarkerElement.SVG_MARKERUNITS_STROKEWIDTH*/ 2;\r
+ /*readonly SVGAnimatedLength*/ this.markerWidth = new sl();\r
+ /*readonly SVGAnimatedLength*/ this.markerHeight = new sl();\r
+ this.refX.baseVal.newValueSpecifiedUnits(1, 0);\r
+ this.refY.baseVal.newValueSpecifiedUnits(1, 0);\r
+ this.markerWidth.baseVal.newValueSpecifiedUnits(1, 3);\r
+ this.markerHeight.baseVal.newValueSpecifiedUnits(1, 3);\r
+ sl = void 0;\r
+ /*readonly SVGAnimatedEnumeration*/ this.orientType = new SVGAnimatedEnumeration();\r
+ this.orientType.baseVal = /*SVGMarkerElement.SVG_MARKER_ORIENT_ANGLE*/ 2;\r
+ /*readonly SVGAnimatedAngle*/ this.orientAngle = new SVGAnimatedAngle();\r
+ //SVGFitToViewBoxのインターフェースはSVGSVGElementで代用\r
+ this.addEventListener("DOMAttrModified", function(evt) {\r
+ var tar = evt.target,\r
+ en = evt.newValue,\r
+ angle;\r
+ if (evt.attrName === "orient") {\r
+ if (en === "auto") {\r
+ tar.setOrientToAuto();\r
+ } else {\r
+ angle = tar.ownerDocument.documentElement.createSVGAngle();\r
+ angle.newValueSpecifiedUnits(1, +en);\r
+ tar.setOrientToAngle(angle);\r
+ }\r
+ } else if (evt.attrName === "markerUnits") {\r
+ if (en === "strokeWidth") {\r
+ tar.markerUnits.baseVal = /*SVGMarkerElement.SVG_MARKERUNITS_STROKEWIDTH*/ 2;\r
+ } else {\r
+ tar.markerUnits.baseVal = /*SVGMarkerElement.SVG_MARKERUNITS_USERSPACEONUSE*/ 1;\r
+ }\r
+ }\r
+ }, false);\r
+ this.addEventListener("DOMNodeInsertedIntoDocument", function(evt) {\r
+ /*注意: グローバル関数を書き換えているので注意を要する*/\r
+ var ns = NAIBU._setPaint,\r
+ id = evt.target.getAttributeNS(null, "id");\r
+ NAIBU._setPaint = (function(ns, id) {\r
+ return function(tar, ctm) {\r
+ ns(tar, ctm);\r
+ var td = tar.ownerDocument,\r
+ tde = td.documentElement,\r
+ style = td.defaultView.getComputedStyle(tar, ""),\r
+ ms = style.getPropertyValue("marker-start").slice(5, -1),\r
+ me = style.getPropertyValue("marker-end").slice(5, -1),\r
+ mid = style.getPropertyValue("marker-mid").slice(5, -1),\r
+ marker,\r
+ cmarker,\r
+ gmarker,\r
+ tr,\r
+ tn,\r
+ ttr,\r
+ sth,\r
+ ctm,\r
+ sstyle,\r
+ nstyle,\r
+ plist,\r
+ regAZ,\r
+ regm,\r
+ u, t,\r
+ lf = function (x, y) {\r
+ cmarker = marker.cloneNode(true);\r
+ gmarker = td.createElementNS("http://www.w3.org/2000/svg", "g");\r
+ /*marker要素の子要素はすべて、g要素としてまとめておく*/\r
+ while (cmarker.lastChild) {\r
+ gmarker.appendChild(cmarker.lastChild);\r
+ }\r
+ tr = gmarker.transform.baseVal;\r
+ ttr = tar.transform.baseVal.consolidate() || td.documentElement.createSVGMatrix();\r
+ if (marker.markerUnits.baseVal === /*SVGMarkerElement.SVG_MARKERUNITS_STROKEWIDTH*/ 2) {\r
+ sth = +style.getPropertyValue("stroke-width");\r
+ } else {\r
+ /*参照要素の行列の積を適用*/\r
+ sth = 1;\r
+ }\r
+ if (marker.hasAttributeNS(null, "viewBox")) {\r
+ marker.viewport.width = marker.markerWidth.baseVal.value;\r
+ marker.viewport.height = marker.markerHeight.baseVal.value;\r
+ /*applyを使って、marker要素のCTMを算出*/\r
+ ctm = tde.getScreenCTM.apply(marker);\r
+ } else {\r
+ ctm = tde.createSVGMatrix();\r
+ }\r
+ if (marker.orientType.baseVal === /*SVGMarkerElement.SVG_MARKER_ORIENT_AUTO*/ 1) {\r
+ angle = Math.atan2(plist[1].y-plist[0].y, plist[1].x-plist[0].x)*180/Math.PI;\r
+ } else {\r
+ angle = marker.orientAngle.baseVal.value;\r
+ }\r
+ tr.appendItem(tr.createSVGTransformFromMatrix(ttr.translate(x, y)\r
+ .rotate(angle)\r
+ .scale(sth)\r
+ .multiply(ctm)\r
+ .translate(-marker.refX.baseVal.value, -marker.refY.baseVal.value)));\r
+ sstyle = td.defaultView.getComputedStyle(marker, "");\r
+ nstyle = gmarker.style;\r
+ regAZ = /([A-Z])/;\r
+ regm = /\-/;\r
+ for (var i in CSS2Properties) {\r
+ if (CSS2Properties.hasOwnProperty(i) && (i !== "_list")) {\r
+ i = i.replace(regAZ, "-");\r
+ if (RegExp.$1) {\r
+ u = "-" +RegExp.$1.toLowerCase();\r
+ } else {\r
+ u = "-";\r
+ }\r
+ i = i.replace(regm, u);\r
+ nstyle.setProperty(i, sstyle.getPropertyValue(i), "");\r
+ }\r
+ }\r
+ tar.parentNode.insertBefore(gmarker, tar.nextSibling);\r
+ };\r
+ /*url(#id)で一致する文字列があるかどうか*/\r
+ if (ms === id) {\r
+ marker = td.getElementById(ms);\r
+ if (tar.normalizedPathSegList || tar.points) {\r
+ tn = tar.normalizedPathSegList || tar.points;\r
+ plist = [tn.getItem(0), tn.getItem(1)];\r
+ } else if (tar.x1) {\r
+ plist = [{x:tar.x1, y:tar.y1}, {x:tar.x2, y:tar.y2}];\r
+ }\r
+ lf(plist[0].x, plist[0].y);\r
+ }\r
+ if (me === id) {\r
+ marker = td.getElementById(me);\r
+ if (tar.normalizedPathSegList || tar.points) {\r
+ tn = tar.normalizedPathSegList || tar.points;\r
+ plist = [tn.getItem(tn.numberOfItems-2), tn.getItem(tn.numberOfItems-1)];\r
+ } else if (tar.x1) {\r
+ plist = [{x:tar.x1, y:tar.y1}, {x:tar.x2, y:tar.y2}];\r
+ }\r
+ lf(plist[1].x, plist[1].y);\r
+ }\r
+ if (mid === id) {\r
+ marker = td.getElementById(mid);\r
+ }\r
+ td = tde = style = sstyle = nstyle = ms = me = mid = marker = cmarker = gmarker = ctm = sth = tr = tn = ttr = plist = regAZ = regm = u = t = lf = void 0;\r
+ };\r
+ })(ns, id);\r
+ }, false);\r
+ return this;\r
+};\r
+(function(t){\r
+ // Marker Unit Types\r
+ /*unsigned short t.SVG_MARKERUNITS_UNKNOWN = 0;\r
+ /*unsigned short t.SVG_MARKERUNITS_USERSPACEONUSE = 1;\r
+ /*unsigned short t.SVG_MARKERUNITS_STROKEWIDTH = 2;\r
+ // Marker Orientation Types\r
+ /*unsigned short t.SVG_MARKER_ORIENT_UNKNOWN = 0;\r
+ /*unsigned short t.SVG_MARKER_ORIENT_AUTO = 1;\r
+ /*unsigned short t.SVG_MARKER_ORIENT_ANGLE = 2;*/\r
+ t.prototype = Object._create(SVGSVGElement);\r
+ t.prototype.getScreenCTM = SVGElement.prototype.getScreenCTM;\r
+ /*void*/ t.prototype.setOrientToAuto = function() {\r
+ this.orientType.baseVal = /*t.SVG_MARKER_ORIENT_AUTO*/ 1;\r
+};\r
+/*void*/ t.prototype.setOrientToAngle = function(/*SVGAngle*/ angle ) {\r
+ this.orientType.baseVal = /*t.SVG_MARKER_ORIENT_ANGLE*/ 2;\r
+ this.orientAngle.baseVal = angle;\r
+\r
+};\r
+})(SVGMarkerElement);\r
+function SVGColorProfileElement() { \r
+ SVGElement.apply(this);\r
+ /*DOMString*/ this._local;\r
+ // raises DOMException on setting\r
+ // (NOTE: is prefixed by "_"\r
+ // as "local" is an IDL keyword. The\r
+ // prefix will be removed upon processing)\r
+ /*DOMString*/ this.name;\r
+ /*unsigned short*/ this.renderingIntent;\r
+ SVGURIReference.apply(this, arguments);\r
+ return this;\r
+};\r
+SVGColorProfileElement.prototype = Object._create(SVGElement);\r
+\r
+function SVGColorProfileRule() { \r
+ SVGCSSRule.apply(this);\r
+ /*DOMString*/ this.src;\r
+ /*DOMString*/ this.name;\r
+ /*unsigned short*/ this.renderingIntent;\r
+ return this;\r
+};\r
+SVGColorProfileRule.prototype = Object._create(SVGCSSRule);\r
+\r
+function SVGGradientElement() { \r
+ SVGElement.apply(this);\r
+ SVGURIReference.apply(this);\r
+ /*readonly SVGAnimatedEnumeration*/ this.gradientUnits = new SVGAnimatedEnumeration();\r
+ /*readonly SVGAnimatedTransformList*/ this.gradientTransform = new SVGAnimatedTransformList();\r
+ /*readonly SVGAnimatedEnumeration*/ this.spreadMethod = new SVGAnimatedEnumeration();\r
+ this.addEventListener("DOMNodeInsertedIntoDocument", function(evt) {\r
+ var grad = evt.target,\r
+ ele = evt._tar,\r
+ t = evt._style, //eleはv:fill要素やv:stroke要素のノード、tはラップした要素ノードのスタイルを収納\r
+ grad2 = grad,\r
+ href, stops, length,\r
+ color = [],\r
+ colors = [],\r
+ opacity = [],\r
+ stop, sstyle, ci;\r
+ if (!ele || !grad) { //まだ、path要素などが設定されていない場合\r
+ grad = ele = t = grad2 = href = stops = length = color = colors = opacity = void 0;\r
+ return;\r
+ }\r
+ if (grad._instance) { //xlink言語で呼び出されたノードが_instanceに収納されているならば\r
+ grad2 = grad._instance;\r
+ }\r
+ stops = grad2.getElementsByTagNameNS("http://www.w3.org/2000/svg", "stop");\r
+ if (!stops) {\r
+ ele = t = href = grad = grad2 = stops = color = colors = opacity = void 0;\r
+ return;\r
+ }\r
+ length = stops.length;\r
+ for (var i = 0; i < length; ++i) {\r
+ stop = stops[i];\r
+ sstyle = stop.ownerDocument.defaultView.getComputedStyle(stop, "");\r
+ ci = sstyle.getPropertyCSSValue("stop-color");\r
+ if (ci && (ci.colorType === /*SVGColor.SVG_COLORTYPE_CURRENTCOLOR*/ 3)) {\r
+ /*再度、設定。css.jsのsetPropertyを参照*/\r
+ sstyle.setProperty("color", sstyle.getPropertyValue("color"));\r
+ }\r
+ color[i] = "rgb(" +ci.rgbColor.red.getFloatValue(1)+ "," +ci.rgbColor.green.getFloatValue(1)+ "," +ci.rgbColor.blue.getFloatValue(1)+ ")";\r
+ colors[i] = stop.offset.baseVal + " " + color[i];\r
+ opacity[i] = (sstyle.getPropertyValue("stop-opacity") || 1) * t.getPropertyValue("fill-opacity") * t.getPropertyValue("opacity");\r
+ }\r
+ ele["method"] = "none";\r
+ ele["color"] = color[0];\r
+ ele["color2"] = color[length-1];\r
+ ele["colors"] = colors.join(",");\r
+ // When colors attribute is used, the meanings of opacity and o:opacity2 are reversed.\r
+ ele["opacity"] = opacity[length-1]+ "";\r
+ ele["o:opacity2"] = opacity[0]+ "";\r
+ /*SVGRadialGradientElementインターフェースで利用する*/\r
+ grad._color = color;\r
+ var gt = grad2.getAttributeNS(null, "gradientTransform");\r
+ if (gt) {\r
+ grad.setAttributeNS(null, "transform", gt);\r
+ }\r
+ grad = grad2 = ele = stops = length = color = colors = opacity = evt = t = href = stop = sstyle = ci = void 0;\r
+ }, false);\r
+ return this;\r
+};\r
+SVGGradientElement.prototype = Object._create(SVGElement);\r
+ // Spread Method Types\r
+ /*unsigned short SVGGradientElement.SVG_SPREADMETHOD_UNKNOWN = 0;\r
+ /*unsigned short SVGGradientElement.SVG_SPREADMETHOD_PAD = 1;\r
+ /*unsigned short SVGGradientElement.SVG_SPREADMETHOD_REFLECT = 2;\r
+ /*unsigned short SVGGradientElement.SVG_SPREADMETHOD_REPEAT = 3;*/\r
+\r
+function SVGLinearGradientElement() { \r
+ SVGGradientElement.apply(this);\r
+ var sl = SVGAnimatedLength;\r
+ /*readonly SVGAnimatedLength*/ this.x1 = new sl();\r
+ /*readonly SVGAnimatedLength*/ this.y1 = new sl();\r
+ /*readonly SVGAnimatedLength*/ this.x2 = new sl();\r
+ /*readonly SVGAnimatedLength*/ this.y2 = new sl();\r
+ sl = void 0;\r
+ this.addEventListener("DOMNodeInsertedIntoDocument", function(evt) {\r
+ var grad = evt.target, ele = evt._tar, angle = 270;\r
+ if (!!!ele) { //まだ、path要素などが設定されていない場合\r
+ return;\r
+ }\r
+ var style = grad.ownerDocument.defaultView.getComputedStyle(grad, "");\r
+ var fontSize = parseFloat(style.getPropertyValue("font-size"));\r
+ grad.x1.baseVal._emToUnit(fontSize);\r
+ grad.y1.baseVal._emToUnit(fontSize);\r
+ grad.x2.baseVal._emToUnit(fontSize);\r
+ grad.y2.baseVal._emToUnit(fontSize);\r
+ angle = 270 - Math.atan2(grad.y2.baseVal.value-grad.y1.baseVal.value, grad.x2.baseVal.value-grad.x1.baseVal.value) * 180 / Math.PI;\r
+ if (angle >= 360) {\r
+ angle -= 360;\r
+ }\r
+ ele.setAttribute("type", "gradient");\r
+ ele.setAttribute("angle", angle + "");\r
+ evt = ele = grad = angle = style = fontSize = void 0;\r
+ }, false);\r
+ return this;\r
+};\r
+SVGLinearGradientElement.prototype = Object._create(SVGGradientElement);\r
+\r
+function SVGRadialGradientElement(_doc) { \r
+ SVGGradientElement.apply(this);\r
+ var sl = SVGAnimatedLength;\r
+ /*readonly SVGAnimatedLength*/ this.cx = new sl();\r
+ /*readonly SVGAnimatedLength*/ this.cy = new sl();\r
+ /*readonly SVGAnimatedLength*/ this.r = new sl();\r
+ /*readonly SVGAnimatedLength*/ this.fx = new sl();\r
+ /*readonly SVGAnimatedLength*/ this.fy = new sl();\r
+ sl = void 0;\r
+ this.cx.baseVal.value = this.cy.baseVal.value = this.r.baseVal.value = 0.5;\r
+ this.addEventListener("DOMNodeInsertedIntoDocument", function(evt) {\r
+ var grad = evt.target,\r
+ ele = evt._tar,\r
+ tar = evt._ttar; //eleはv:fill要素。tarはターゲットとになる要素\r
+ if (!!!ele) { //まだ、path要素などが設定されていない場合\r
+ return;\r
+ }\r
+ ele.setAttribute("type", "gradientTitle");\r
+ ele.setAttribute("focus", "100%");\r
+ ele.setAttribute("focusposition", "0.5 0.5");\r
+ if (tar.localName === "rect") {\r
+ /*VMLでは、図の形状に沿って、円状のグラデーションを処理するようになっているため、\r
+ *四角だとおかしな模様が出てしまう。以下はそれを避ける処理\r
+ */\r
+ var style = grad.ownerDocument.defaultView.getComputedStyle(tar, ""),\r
+ fontSize = parseFloat(style.getPropertyValue("font-size"));\r
+ grad.cx.baseVal._emToUnit(fontSize);\r
+ grad.cy.baseVal._emToUnit(fontSize);\r
+ grad.r.baseVal._emToUnit(fontSize);\r
+ grad.fx.baseVal._emToUnit(fontSize);\r
+ grad.fy.baseVal._emToUnit(fontSize);\r
+ var cx = grad.cx.baseVal.value,\r
+ cy = grad.cy.baseVal.value,\r
+ r = grad.r.baseVal.value,\r
+ mr = Math.round,\r
+ rx, ry;\r
+ rx = ry = r;\r
+ var tarrect = tar.getBBox(),\r
+ vi = tar.ownerDocument.documentElement.viewport,\r
+ el = mr(vi.width),\r
+ et = mr(vi.height),\r
+ er = 0,\r
+ eb = 0,\r
+ units = grad.getAttributeNS(null, "gradientUnits");\r
+ if (!units || units === "objectBoundingBox") {\r
+ //%の場合は小数点に変換(10% -> 0.1)\r
+ cx = cx > 1 ? cx/100 : cx;\r
+ cy = cy > 1 ? cy/100 : cy;\r
+ r = r > 1 ? r/100 : r;\r
+ //要素の境界領域を求める(四隅の座標を求める)\r
+ var nx = tarrect.x,\r
+ ny = tarrect.y,\r
+ wid = tarrect.width,\r
+ hei = tarrect.height;\r
+ cx = cx*wid + nx;\r
+ cy = cy*hei + ny;\r
+ rx = r*wid;\r
+ ry = r*hei;\r
+ nx = ny = wid = hei = void 0;\r
+ }\r
+ var matrix = tar.getScreenCTM().multiply(grad.getCTM());\r
+ el = cx - rx;\r
+ et = cy - ry;\r
+ er = cx + rx;\r
+ eb = cy + ry;\r
+ var rrx = rx * 0.55228,\r
+ rry = ry * 0.55228,\r
+ list = ["m", cx,et, "c", cx-rrx,et, el,cy-rry, el,cy, el,cy+rry, cx-rrx,eb, cx,eb, cx+rrx,eb, er,cy+rry, er,cy, er,cy-rry, cx+rrx,et, cx,et, "x e"];\r
+ for (var i = 0, lili = list.length; i < lili;) {\r
+ if (isNaN(list[i])) { //コマンド文字は読み飛ばす\r
+ ++i;\r
+ continue;\r
+ }\r
+ var p = grad.ownerDocument.documentElement.createSVGPoint();\r
+ p.x = parseFloat(list[i]);\r
+ p.y = parseFloat(list[i+1]);\r
+ var pmt = p.matrixTransform(matrix);\r
+ list[i] = mr(pmt.x);\r
+ i++;\r
+ list[i] = mr(pmt.y);\r
+ i++;\r
+ p = pmt = void 0;\r
+ }\r
+ var ellipse = list.join(" "),\r
+ outline = _doc.getElementById("_NAIBU_outline"),\r
+ background = _doc.createElement("div"),\r
+ bstyle = background.style;\r
+ bstyle.position = "absolute";\r
+ bstyle.display = "inline-block";\r
+ var w = vi.width,\r
+ h = vi.height;\r
+ bstyle.textAlign = "left";\r
+ bstyle.top = "0px";\r
+ bstyle.left = "0px";\r
+ bstyle.width = w+ "px";\r
+ bstyle.height = h+ "px";\r
+ outline.appendChild(background);\r
+ bstyle.filter = "progid:DXImageTransform.Microsoft.Compositor";\r
+ background.filters.item('DXImageTransform.Microsoft.Compositor').Function = 23;\r
+ var circle = '<v:shape style="display:inline-block; position:relative; antialias:false; top:0px; left:0px;" coordsize="' +w+ ' ' +h+ '" path="' +ellipse+ '" stroked="f">' +ele.outerHTML+ '</v:shape>',\r
+ data = tar._tar.path.value;\r
+ background.innerHTML = '<v:shape style="display:inline-block; position:relative; top:0px; left:0px;" coordsize="' +w+ ' ' +h+ '" path="' +data+ '" stroked="f" fillcolor="' +grad._color[grad._color.length-1]+ '" ></v:shape>';\r
+ background.filters[0].apply();\r
+ background.innerHTML = circle;\r
+ background.filters[0].play();\r
+ tar._tar.parentNode.insertBefore(background, tar._tar);\r
+ tar._tar.filled = "false";\r
+ ellipse = outline = background = style = fontSize = bstyle = circle = data = list = mr = gt = cx = cy = r = w = h = matrix = void 0;\r
+ } else if (!ele.parentNode){\r
+ tar._tar.appendChild(ele);\r
+ }\r
+ evt = tar = ele = gard = void 0;\r
+ }, false);\r
+ return this;\r
+};\r
+SVGRadialGradientElement.prototype = Object._create(SVGGradientElement);\r
+\r
+function SVGStopElement() { \r
+ SVGElement.apply(this, arguments);\r
+ /*readonly SVGAnimatedNumber*/ this.offset = new SVGAnimatedNumber();\r
+ this.addEventListener("DOMAttrModified", function(evt) {\r
+ if (evt.attrName === "offset") {\r
+ evt.target.offset.baseVal = parseFloat(evt.newValue);\r
+ }\r
+ evt = void 0;\r
+ }, false);\r
+ return this;\r
+};\r
+SVGStopElement.prototype = Object._create(SVGElement);\r
+\r
+function SVGPatternElement() { \r
+ SVGElement.apply(this);\r
+ var sl = SVGAnimatedLength;\r
+ /*readonly SVGAnimatedEnumeration*/ this.patternUnits = new SVGAnimatedEnumeration();\r
+ /*readonly SVGAnimatedEnumeration*/ this.patternContentUnits = new SVGAnimatedEnumeration();\r
+ /*readonly SVGAnimatedTransformList*/ this.patternTransform = new SVGAnimatedTransformList();\r
+ /*readonly SVGAnimatedLength*/ this.x = new sl();\r
+ /*readonly SVGAnimatedLength*/ this.y = new sl();\r
+ /*readonly SVGAnimatedLength*/ this.width = new sl();\r
+ /*readonly SVGAnimatedLength*/ this.height = new sl();\r
+ sl = void 0;\r
+ SVGURIReference.apply(this, arguments);\r
+ //SVGFitToViewBoxのインターフェースを用いる\r
+ /*readonly SVGAnimatedRect*/ this.viewBox = new SVGAnimatedRect();\r
+ /*readonly SVGAnimatedPreserveAspectRatio*/ this.preserveAspectRatio = new SVGAnimatedPreserveAspectRatio();\r
+ /*unsigned short*/ this.zoomAndPan = /*SVGZoomAndPan.SVG_ZOOMANDPAN_DISABLE*/ 1;\r
+ return this;\r
+};\r
+SVGPatternElement.prototype = Object._create(SVGElement);\r
+\r
+function SVGClipPathElement() { \r
+ SVGElement.apply(this, arguments);\r
+ /*readonly SVGAnimatedEnumeration*/ this.clipPathUnits = new SVGAnimatedEnumeration();\r
+ return this;\r
+};\r
+SVGClipPathElement.prototype = Object._create(SVGElement);\r
+\r
+function SVGMaskElement() { \r
+ SVGElement.apply(this);\r
+ var sl = SVGAnimatedLength;\r
+ /*readonly SVGAnimatedEnumeration*/ this.maskUnits = new SVGAnimatedEnumeration();\r
+ /*readonly SVGAnimatedEnumeration*/ this.maskContentUnits = new SVGAnimatedEnumeration();\r
+ /*readonly SVGAnimatedLength*/ this.x = new sl();\r
+ /*readonly SVGAnimatedLength*/ this.y = new sl();\r
+ /*readonly SVGAnimatedLength*/ this.width = new sl();\r
+ /*readonly SVGAnimatedLength*/ this.height = new sl();\r
+ sl = void 0;\r
+ return this;\r
+};\r
+SVGMaskElement.prototype = Object._create(SVGElement);\r
+\r
+function SVGFilterElement() { \r
+ SVGElement.apply(this);\r
+ var sl = SVGAnimatedLength;\r
+ /*readonly SVGAnimatedEnumeration*/ this.filterUnits = new SVGAnimatedEnumeration();\r
+ /*readonly SVGAnimatedEnumeration*/ this.primitiveUnits = new SVGAnimatedEnumeration();\r
+ /*readonly SVGAnimatedLength*/ this.x = new sl();\r
+ /*readonly SVGAnimatedLength*/ this.y = new sl();\r
+ /*readonly SVGAnimatedLength*/ this.width = new sl();\r
+ /*readonly SVGAnimatedLength*/ this.height = new sl();\r
+ sl = void 0;\r
+ /*readonly SVGAnimatedInteger*/ this.filterResX = new SVGAnimatedInteger();\r
+ /*readonly SVGAnimatedInteger*/ this.filterResY = new SVGAnimatedInteger();\r
+ SVGURIReference.apply(this, arguments);\r
+ //setFilterRes (/*unsigned long*/ filterResX,/*unsigned long*/ filterResY );\r
+ return this;\r
+};\r
+SVGFilterElement.prototype = Object._create(SVGElement);\r
+\r
+function SVGFilterPrimitiveStandardAttributes(ele) { \r
+ SVGStylable.apply(this, arguments);\r
+ this._tar = ele;\r
+ var sl = SVGAnimatedLength;\r
+ /*readonly SVGAnimatedLength*/ this.x = new sl();\r
+ /*readonly SVGAnimatedLength*/ this.y = new sl();\r
+ /*readonly SVGAnimatedLength*/ this.width = new sl();\r
+ /*readonly SVGAnimatedLength*/ this.height = new sl();\r
+ /*readonly SVGAnimatedString*/ this.result = new sl();\r
+ sl = void 0;\r
+ };\r
+SVGFilterPrimitiveStandardAttributes.prototype = Object._create(SVGStylable);\r
+\r
+function SVGFEBlendElement() {\r
+ SVGElement.apply(this, arguments);\r
+ /*readonly SVGAnimatedString*/ this.in1 = new SVGAnimatedString();\r
+ /*readonly SVGAnimatedString*/ this.in2 = new SVGAnimatedString();\r
+ /*readonly SVGAnimatedEnumeration*/ this.mode = new SVGAnimatedEnumeration();\r
+ this._fpsa = SVGFilterPrimitiveStandardAttributes(this);\r
+ return this;\r
+};\r
+SVGFEBlendElement.prototype = Object._create(SVGElement);\r
+ // Blend Mode Types\r
+ /*unsigned short SVGFEBlendElement.SVG_FEBLEND_MODE_UNKNOWN = 0;\r
+ /*unsigned short SVGFEBlendElement.SVG_FEBLEND_MODE_NORMAL = 1;\r
+ /*unsigned short SVGFEBlendElement.SVG_FEBLEND_MODE_MULTIPLY = 2;\r
+ /*unsigned short SVGFEBlendElement.SVG_FEBLEND_MODE_SCREEN = 3;\r
+ /*unsigned short SVGFEBlendElement.SVG_FEBLEND_MODE_DARKEN = 4;\r
+ /*unsigned short SVGFEBlendElement.SVG_FEBLEND_MODE_LIGHTEN = 5;*/\r
+\r
+function SVGFEGaussianBlurElement() { \r
+ SVGElement.apply(this, arguments);\r
+ /*readonly SVGAnimatedString*/ this.in1 = new SVGAnimatedString();\r
+ /*readonly SVGAnimatedNumber*/ this.stdDeviationX = new SVGAnimatedNumber();\r
+ /*readonly SVGAnimatedNumber*/ this.stdDeviationY = new SVGAnimatedNumber();\r
+ this._fpsa = SVGFilterPrimitiveStandardAttributes(this);\r
+ return this;\r
+};\r
+SVGFEGaussianBlurElement.prototype = Object._create(SVGElement);\r
+/*void*/ SVGFEGaussianBlurElement.prototype.setStdDeviation = function(/*float*/ stdDeviationX, /*float*/ stdDeviationY ) {\r
+ \r
+};\r
+\r
+function SVGCursorElement() { \r
+ SVGElement.apply(this, arguments);\r
+ /*readonly SVGAnimatedLength*/ this.x = new SVGAnimatedLength();\r
+ /*readonly SVGAnimatedLength*/ this.y = new SVGAnimatedLength();\r
+ SVGURIReference.apply(this, arguments);\r
+ return this;\r
+};\r
+SVGCursorElement.prototype = Object._create(SVGElement);\r
+\r
+function SVGAElement(_doc) {\r
+ SVGElement.apply(this);\r
+ this._tar = _doc.createElement("a");\r
+ _doc = void 0;\r
+ /*readonly SVGAnimatedString*/ this.target = new SVGAnimatedString();\r
+ this.target.baseVal = "_self";\r
+ this.addEventListener("DOMAttrModified", function(evt){\r
+ var tar = evt.target;\r
+ if (evt.eventPhase === /*Event.BUBBLING_PHASE*/ 3) {\r
+ return; //強制終了させる\r
+ }\r
+ if (evt.attrName === "target") {\r
+ tar.target.baseVal = evt.newValue;\r
+ } else if (evt.attrName === "xlink:title") {\r
+ tar._tar.setAttribute("title", evt.newValue);\r
+ }\r
+ evt = void 0;\r
+ }, false);\r
+ this.addEventListener("DOMNodeInserted", function(evt){\r
+ var tar = evt.target;\r
+ if (evt.eventPhase === /*Event.BUBBLING_PHASE*/ 3) {\r
+ return; //強制終了させる\r
+ }\r
+ if (tar.nextSibling) {\r
+ if (!!tar.parentNode._tar && !!tar.nextSibling._tar) {\r
+ tar.parentNode._tar.insertBefore(tar._tar, tar.nextSibling._tar);\r
+ }\r
+ } else if (!!tar.parentNode._tar){\r
+ tar.parentNode._tar.appendChild(tar._tar);\r
+ }\r
+ var txts = tar._tar.style;\r
+ txts.cursor = "hand";\r
+ txts.left = "0px";\r
+ txts.top = "0px";\r
+ txts.textDecoration = "none";\r
+ txts = void 0;\r
+ var t = tar.target.baseVal;\r
+ var st = "replace";\r
+ if (t === "_blank") {\r
+ st = "new";\r
+ }\r
+ tar.setAttributeNS("http://www.w3.org/1999/xlink", "xlink:show", st);\r
+ tar._tar.style.color = tar.ownerDocument.defaultView.getComputedStyle(tar, "").getPropertyValue("fill");\r
+ tar = evt = void 0;\r
+ }, false);\r
+ this.addEventListener("DOMNodeInsertedIntoDocument", function(evt){\r
+ var tar = evt.target;\r
+ if (!!tar._tar && (tar.nodeType === /*Node.ELEMENT_NODE*/ 1)) {\r
+ var txts = tar._tar.style;\r
+ txts.cursor = "hand";\r
+ txts.textDecoration = "none";\r
+ txts = void 0;\r
+ }\r
+ tar = evt = void 0;\r
+ return; //強制終了させる\r
+ }, true);\r
+ this.addEventListener("DOMNodeInsertedIntoDocument", function(evt){\r
+ var tar = evt.target;\r
+ tar._tar.setAttribute("target", tar.target.baseVal);\r
+ if (tar.href.baseVal.indexOf(".svg") !== -1) { //もし、リンク先がSVGファイルならば\r
+ tar.addEventListener("click", function(evt){\r
+ var tar = evt.target,\r
+ sd = document.body,\r
+ ob, nd;\r
+ sd.lastChild.innerHTML = "<object data='" +tar.href.baseVal.split("#")[0]+ "' width='" +screen.width+ "' height='" +screen.height+ "' type='image/svg+xml'></object>";\r
+ if (tar.target.baseVal === "_self") {\r
+ nd = tar.ownerDocument._iframe;\r
+ nd.parentNode.insertBefore(sd.lastChild.firstChild, nd);\r
+ ob = nd.nextSibling;\r
+ if (ob && (ob.tagName === "OBJECT")) {\r
+ nd.previousSibling.setAttribute("width", ob.getAttribute("width"));\r
+ nd.previousSibling.setAttribute("height", ob.getAttribute("height"));\r
+ nd.parentNode.removeChild(ob);\r
+ }\r
+ ob = NAIBU._search([nd.previousSibling]);\r
+ nd.parentNode.removeChild(nd);\r
+ } else {\r
+ sd.appendChild(sd.lastChild.firstChild);\r
+ while (sd.firstChild !== sd.lastChild) { //オブジェクト要素以外を除去\r
+ sd.removeChild(sd.firstChild);\r
+ }\r
+ ob = NAIBU._search([sd.lastChild]);\r
+ }\r
+ NAIBU.doc = new ActiveXObject("MSXML2.DomDocument");\r
+ evt.preventDefault();\r
+ ob._next = {\r
+ _init: (function (ob) {\r
+ return (function(){\r
+ document.title = ob.getSVGDocument().title;\r
+ ob = void 0;\r
+ });\r
+ })(ob)\r
+ };\r
+ ob._init();\r
+ sd = ob = nd = void 0;\r
+ }, false);\r
+ }\r
+ tar = void 0;\r
+ }, false);\r
+ SVGURIReference.apply(this, arguments);\r
+ return this;\r
+};\r
+SVGAElement.prototype = Object._create(SVGElement);\r
+\r
+function SVGViewElement() { \r
+ SVGElement.apply(this, arguments);\r
+ /*readonly SVGStringList*/ this.viewTarget = new SVGStringList();\r
+ //SVGFitToViewBoxのインターフェースを用いる\r
+ /*readonly SVGAnimatedRect*/ this.viewBox = new SVGAnimatedRect();\r
+ /*readonly SVGAnimatedPreserveAspectRatio*/ this.preserveAspectRatio = new SVGAnimatedPreserveAspectRatio();\r
+ /*unsigned short*/ this.zoomAndPan = /*SVGZoomAndPan.SVG_ZOOMANDPAN_DISABLE*/ 1;\r
+ return this;\r
+};\r
+SVGViewElement.prototype = Object._create(SVGElement);\r
+\r
+function SVGScriptElement() { \r
+ SVGElement.apply(this);\r
+ /*DOMString*/ this.type;\r
+ SVGURIReference.apply(this, arguments);\r
+ this.addEventListener("DOMAttrModified", function(evt){\r
+ if (evt.attrName === "type") {\r
+ evt.target.type = evt.newValue;\r
+ }\r
+ evt = void 0;\r
+ }, false);\r
+ this.addEventListener("S_Load", function(evt){\r
+ var tar = evt.target, script = tar._text;\r
+ var tod = tar.ownerDocument;\r
+ NAIBU._temp_doc = tod;\r
+ script = script.replace(/function\s+(\w+)/g, "$1 = function");\r
+ script = "(function(document){" +script+ "})(NAIBU._temp_doc);";\r
+ try {\r
+ NAIBU.eval(script);\r
+ } catch (e) { //IE9では、documentがconstとして定数指定されているため、引数として指定できない\r
+ script = script.replace(/function\(document\){/, "function() {");\r
+ NAIBU.eval(script);\r
+ }\r
+ tar = evt = script = void 0;\r
+ }, false);\r
+ this.addEventListener("DOMNodeInserted", function(evt){\r
+ var tar = evt.target;\r
+ if (evt.eventPhase === /*Event.BUBBLING_PHASE*/ 3) {\r
+ if (tar.nodeName === "#cdata-section") {\r
+ evt.currentTarget._text = tar.data;\r
+ }\r
+ return;\r
+ }\r
+ tar.addEventListener("DOMNodeInsertedIntoDocument", function(evt){\r
+ var tar = evt.target;\r
+ if (evt.eventPhase === /*Event.AT_TARGET*/ 2 && !tar.getAttributeNodeNS("http://www.w3.org/1999/xlink", "xlink:href")) {\r
+ var evtt = tar.ownerDocument.createEvent("SVGEvents");\r
+ evtt.initEvent("S_Load", false, false);\r
+ evt.currentTarget.dispatchEvent(evtt);\r
+ }\r
+ tar = evt = void 0;\r
+ }, false);\r
+ }, false);\r
+ return this;\r
+};\r
+SVGScriptElement.prototype = Object._create(SVGElement);\r
+\r
+function SVGEvent() {\r
+ Event.apply(this, arguments);\r
+ return this;\r
+};\r
+SVGEvent.prototype = Object._create(Event);\r
+\r
+function SVGZoomEvent() { \r
+ UIEvent.apply(this, arguments);\r
+ /*readonly SVGRect*/ this.zoomRectScreen = new SVGRect();\r
+ /*readonly float*/ this.previousScale = 1;\r
+ /*readonly SVGPoint*/ this.previousTranslate = new SVGPoint();\r
+ /*readonly float*/ this.newScale = 1;\r
+ /*readonly SVGPoint*/ this.newTranslate = new SVGPoint();\r
+ return this;\r
+};\r
+SVGZoomEvent.prototype = Object._create(UIEvent);\r
+\r
+function SVGAnimationElement(es) {\r
+ if (!!es) {\r
+ return this;\r
+ }\r
+ SVGElement.apply(this);\r
+ /*SIEにおけるSVGElementでは、fill属性とStyleSheetを結びつける機構があるため、\r
+ *styleのsetPropertyメソッドを無効化させておく必要がある\r
+ */\r
+ this.style.setProperty = function(){};\r
+ this._tar = null;\r
+ /*readonly SVGElement*/ this.targetElement;\r
+ /*それぞれのプロパティは、_を除いた属性に対応している*/\r
+ this._begin = this._end = this._repeatCount = this._repeatDur = this._dur = this._resatrt = null;\r
+ this._currentFrame = 0;\r
+ /*_isRepeatと_numRepeatは繰り返し再生のときに使う。なお、後者は現在のリピート回数*/\r
+ this._isRepeat = false;\r
+ this._numRepeat = 0;\r
+ /*_isStartプロパティは一度は起動したかどうか*/\r
+ this._isStarted = false;\r
+ /*_startと_finishプロパティはミリ秒数のリストを収納する。\r
+ *_startはアニメ開始時の秒数リスト。_finishはアニメ終了時の秒数のリスト。\r
+ *なお、文書読み込み終了時(アニメ開始時刻)の秒数を0とする。\r
+ *_startingプロパティは現在アニメーションでの開始時刻。getSartTimeメソッドで使う\r
+ */\r
+ this._start = this._finish = this._starting = null;\r
+ /*_activeDurプロパティは現時点でのアニメーションの活動期間*/\r
+ this._activeDur = 0; \r
+ this._from = this._to = this._values = this._by = null;\r
+ this._keyTimes = null;\r
+ this.addEventListener("beginEvent", function(evt) {\r
+ try {\r
+ var tar = evt.target,\r
+ begin = tar.getStartTime(),\r
+ durv = tar._dur,\r
+ dur = tar._getOffset(durv),\r
+ end = tar._finish,\r
+ endv= tar._end,\r
+ td = tar._repeatDur,\r
+ tc = tar._repeatCount,\r
+ ac = null;\r
+ if (end) {\r
+ for (var i=0, eli=end.length;i<eli;++i) {\r
+ /*endの配列(ソース済み)からbeginに最も近い数値を選ぶ*/\r
+ if (end[i] >= begin) {\r
+ end = end[i];\r
+ break;\r
+ }\r
+ }\r
+ } else {\r
+ /*イベント待ちの場合は、endの値を、indefiniteとみなす。参照: http://www.w3.org/TR/smil-animation/#ComputingActiveDur\r
+ * \r
+ * 3.3.4. Computing the active duration\r
+ * \r
+ * If the value of end cannot be resolved (e.g. when it is event-based),\r
+ * the value is considered to be "indefinite" for the purposes of evaluating the active duration.\r
+ *\r
+ */\r
+ endv = null;\r
+ }\r
+ /*Activate Duration (活性持続時間と呼ぶことにする)を計算\r
+ *計算方法は以下を参照のこと\r
+ *http://www.w3.org/TR/smil-animation/#ComputingActiveDur\r
+ *3.3.4. Computing the active duration\r
+ */\r
+ if ((td === "indefinite") || (tc === "indefinite")) {\r
+ if (endv) {\r
+ ac = end - begin;\r
+ } else {\r
+ /*活性持続時間が不定(indefinite)なので、強制的にアニメを終了させる*/\r
+ ac = null;\r
+ }\r
+ } else if (durv === "indefinite") {\r
+ if (!tc && !endv) {\r
+ /*活性持続時間が不定(indefinite)なので、強制的にアニメを終了させる*/\r
+ ac = null;\r
+ } else if (tc && !endv) {\r
+ ac = tar._getOffset(td);\r
+ } else if (!tc && endv) {\r
+ ac = end - begin;\r
+ } else {\r
+ ac = (tar._getOffset(td) > (end - begin)) ? tar._getOffset(td) : (end - begin);\r
+ }\r
+ } else if (durv && !td && !tc && !endv) {\r
+ ac = dur;\r
+ } else if (durv && !td && tc && !endv) {\r
+ ac = dur * (+tc);\r
+ } else if (durv && td && !tc && !endv) {\r
+ ac = tar._getOffset(td);\r
+ } else if (durv && !td && !tc && endv) {\r
+ ac = (dur > (end - begin)) ? dur : (end - begin);\r
+ } else if (durv && td && tc && !endv) {\r
+ ac = (+tc*dur > tar._getOffset(td)) ? +tc*dur : tar._getOffset(td);\r
+ } else if (durv && td && tc && endv) {\r
+ ac = (+tc*dur > Math.min(+td, (end-begin))) ? +tc*dur : Math.min(tar._getOffset(td), (end - begin));\r
+ } else if (durv && td && !tc && endv) {\r
+ ac = (tar._getOffset(td) > (end - begin)) ? tar._getOffset(td) : (end - begin);\r
+ } else if (durv && !td && tc && endv) {\r
+ ac = (+tc*dur > (end - begin)) ? +tc*dur : (end - begin);\r
+ }\r
+ } catch (e) {\r
+ tar.endElementAt(1);\r
+ throw new DOMException(/*DOMException.INVALID_STATE_ERR*/ 11);\r
+ }\r
+ if ((ac || (ac === 0)) && isFinite(ac)) {\r
+ /*endの値がすでにある場合は、二重指定を避ける*/\r
+ endv || tar.endElementAt(ac);\r
+ tar._activeDur = ac;\r
+ }\r
+ tar = begin = dur = durv = end = endv= td = tc = ac = void 0;\r
+ }, false);\r
+ this.addEventListener("DOMAttrModified", function(evt){\r
+ if (evt.eventPhase === /*Event.BUBBLING_PHASE*/ 3) {\r
+ return;\r
+ }\r
+ var tar = evt.target,\r
+ name = evt.attrName,\r
+ evtv = evt.newValue;\r
+ if (name === "begin") {\r
+ tar._begin = evtv.replace(/\s+/g, "").split(";"); //空白は取り除く\r
+ } else if (name === "end") {\r
+ tar._end = evtv.replace(/\s+/g, "").split(";");\r
+ } else if (name === "dur") {\r
+ tar._dur = evtv;\r
+ } else if (name === "repeatCount") {\r
+ tar._repeatCount = evtv;\r
+ tar._isRepeat = true;\r
+ } else if (name === "repeatDur") {\r
+ tar._repeatCount = evtv;\r
+ tar._isRepeat = true;\r
+ } else if (name === "from") {\r
+ tar._from = evtv;\r
+ } else if (name === "to") {\r
+ tar._to = evtv;\r
+ } else if (name === "values") {\r
+ tar._values = evtv.split(";");\r
+ } else if (name === "by") {\r
+ tar._by = evtv;\r
+ } else if (name === "keyTimes") {\r
+ var s = evtv.split(";");\r
+ tar._keyTimes = []; //_keyTimesプロパティを初期化\r
+ for (var i=0;i<s.length;++i) {\r
+ tar._keyTimes[i] = parseFloat(s[i]);\r
+ }\r
+ s = void 0;\r
+ } else if (name === "restart") {\r
+ tar._restart = evtv;\r
+ }\r
+ evt = evtv = void 0;\r
+ }, false);\r
+ this.addEventListener("DOMNodeInserted", function(evt){\r
+ if (evt.eventPhase === /*Event.BUBBLING_PHASE*/ 3) {\r
+ return; //強制終了させる\r
+ }\r
+ var tar = evt.target;\r
+ tar.addEventListener("DOMNodeInsertedIntoDocument", function(evt){\r
+ var tar = evt.target;\r
+ /*以降の場合分けルールに関しては、下記の仕様を参照\r
+ *http://www.jsa.or.jp/stdz/instac/syoukai/H13/H13annual_report/12/ngc-wg3/offline/smil_20_20020131/animation.html#AnimationNS-FromToBy\r
+ */\r
+ if (tar._values) {\r
+ } else if (tar._from && tar._to) {\r
+ tar._values = [tar._from, tar._to];\r
+ } else if (tar._from && tar._by) {\r
+ var n = parseFloat(tar._from) + parseFloat(tar._by), tanni = tar._from.match(/\D+/) || [""];\r
+ tar._values = [tar._from, n+tanni[0]];\r
+ } else if (tar._to) {\r
+ tar._values = [null, tar._to];\r
+ } else if (tar._by) {\r
+ tar._values = [null, null, tar._by];\r
+ } else if (!tar.hasChildNodes() && !tar.hasAttributeNS(null, "path")) { //SVGAnimateMotionElementに留意\r
+ /*アニメーションの効果が出ないように調整する\r
+ *SMILアニメーションの仕様を参照\r
+ *\r
+ *>if none of the from, to, by or values attributes are specified, the animation will have no effect\r
+ *「3.2.2. Animation function values」より引用\r
+ *http://www.w3.org/TR/2001/REC-smil-animation-20010904/#AnimFuncValues\r
+ */\r
+ return this;\r
+ }\r
+ /*begin属性とend属性を処理する*/\r
+ var that = tar,\r
+ timing = function(val, name, offset) {\r
+ /*timing関数は時間のタイミングをidとeventと、clock-value(offset)に分割して処理していく\r
+ *まず、idを検出するためのsearcIdローカル関数を作る\r
+ */\r
+ var searchId = function () {\r
+ var n = val.indexOf(".");\r
+ if ((n > 0) && (/[a-z]/i).test(val.charAt(n+1))) { //. (dot)の後がアルファベットならば\r
+ return (val.slice(0, n));\r
+ }\r
+ n = nn = void 0;\r
+ return "";\r
+ },\r
+ id;\r
+ /*\r
+ *W3CのSMIl AnimationのTimingモデルは7パターンがあるので、場合分けする\r
+ */\r
+ if (isFinite(parseFloat(val))) { //1) offset-valueの場合\r
+ that[name](offset);\r
+ } else if (val.indexOf("repeat(") > -1) { //2) repeat-valueの場合\r
+ var inte = parseFloat(val.slice(7)),\r
+ ds = (function(that, name, offset) {\r
+ return function (evt) {\r
+ if (inte === evt.target._numRepeat) {\r
+ that[name](offset);\r
+ }\r
+ };\r
+ })(that, name, offset),\r
+ id = searchId();\r
+ if (id) {\r
+ that.ownerDocument.getElementById(id).addEventListener("repeatEvent", ds);\r
+ } else {\r
+ that.addEventListener("repeatEvent", ds);\r
+ }\r
+ } else if (/\.(begin|end)/.test(val)) { //3) syncbase-valueの場合\r
+ id = searchId();\r
+ if (id) {\r
+ var ds = (function(that, name, offset) {\r
+ return function (evt) {\r
+ that[name](offset);\r
+ };\r
+ })(that, name, offset),\r
+ ev = "";\r
+ /\.(begin|end)/.test(val); //RegExp.$1のために、もう一度する必要がある\r
+ if (RegExp.$1 === "begin") {\r
+ ev = "beginEvent";\r
+ } else if (RegExp.$1 === "end") {\r
+ ev = "endEvent";\r
+ }\r
+ that.ownerDocument.getElementById(id).addEventListener(ev, ds, false);\r
+ }\r
+ } else if (val.indexOf("wallclock(") === 0) { //4) wallclock-valueの場合\r
+ \r
+ } else if (val === "indefinite") { //5) indefiniteの場合\r
+ } else if (val.indexOf("accesskey(") > -1) { //6) accesskey-valueの場合\r
+ \r
+ } else { //7) event-valueの場合\r
+ id = searchId();\r
+ var ds = (function(that, name, offset) {\r
+ return function (evt) {\r
+ that[name](offset);\r
+ };\r
+ })(that, name, offset);\r
+ if (id && val.match(/\.([a-z]+)/i)) {\r
+ that.ownerDocument.getElementById(id).addEventListener(RegExp.$1, ds);\r
+ } else if (val){\r
+ that.targetElement.addEventListener(val.match(/^[a-z]+/i)[0], ds);\r
+ }\r
+ }\r
+ val = searchId = id = void 0;\r
+ };\r
+ if (tar._begin) {\r
+ for (var i=0,tli=tar._begin.length;i<tli;++i) {\r
+ timing(tar._begin[i], "beginElementAt", tar._getOffset(tar._begin[i]));\r
+ }\r
+ } else {\r
+ tar.beginElementAt(0);\r
+ }\r
+ if (tar._end) {\r
+ for (var i=0,tli=tar._end.length;i<tli;++i) {\r
+ timing(tar._end[i], "endElementAt", tar._getOffset(tar._end[i]));\r
+ }\r
+ }\r
+ that = void 0;\r
+ if (tar.hasAttributeNS("http://www.w3.org/1999/xlink", "xlink:href")) {\r
+ tar.targetElement = tar.ownerDocument.getElementById(tar.getAttributeNS("http://www.w3.org/1999/xlink", "xlink:href").slice(1));\r
+ } else {\r
+ tar.targetElement = tar.parentNode;\r
+ }\r
+ evt = tar = void 0;\r
+ }, false);\r
+ evt = tar = void 0;\r
+ }, false);\r
+ return this;\r
+};\r
+SVGAnimationElement.prototype = Object._create(SVGElement);\r
+/*以下のメソッド(beginElementなど)については、\r
+ *別モジュールであるsmil::ElementTimeControl(smil.js)を参照のこと\r
+ */\r
+/*void*/ SVGAnimationElement.prototype.beginElement = function() {\r
+ var ttd = this.ownerDocument,\r
+ evt = ttd.createEvent("TimeEvents");\r
+ this._starting = ttd.documentElement.getCurrentTime(); //getStartTimeメソッドで使う開始時刻\r
+ if (this._isStarted && ((this._restart === "never")\r
+ || ((this._restart === "whenNotActive") && (this.getCurrentTime() > 0)))) {\r
+ return; //restart属性の設定により、再起動させないようにする\r
+ }\r
+ if (this.getCurrentTime() > 0) {\r
+ /*アニメーションの最中で、beginEventが起きるときは、endEventが前もって起こされる。SVG1.1の仕様を参照\r
+ * \r
+ * 19.4.2 Interface TimeEvent\r
+ * Note that if an element is restarted while it is currently playing, the element will raise an end event and another begin event, as the element restarts. \r
+ * \r
+ * http://www.w3.org/TR/SVG/animate.html#InterfaceTimeEvent\r
+ * \r
+ */\r
+ this.endElement();\r
+ }\r
+ evt.initTimeEvent("beginEvent", ttd.defaultView, 0);\r
+ this.dispatchEvent(evt);\r
+ /*新しくリストの頭を更新して、別の値も実行させるようにする*/\r
+ this._start && this._start.shift();\r
+ this._isStarted = true;\r
+ ttd = evt = void 0;\r
+};\r
+/*void*/ SVGAnimationElement.prototype.endElement = function() {\r
+ var ttd = this.ownerDocument,\r
+ evt = ttd.createEvent("TimeEvents");\r
+ evt.initTimeEvent("endEvent", ttd.defaultView, 0);\r
+ this.dispatchEvent(evt);\r
+ this._finish && this._finish.shift();\r
+ this._currentFrame = 0;\r
+};\r
+/*void*/ SVGAnimationElement.prototype.beginElementAt = function(/*float*/ offset) {\r
+ var ntc = this.ownerDocument.documentElement.getCurrentTime(),\r
+ start = this._start || [];\r
+ for (var i=0,sli=start.length;i<sli;++i) {\r
+ if (start[i] === (offset+ntc)) {\r
+ ntc = start = offset = void 0;\r
+ return;\r
+ }\r
+ }\r
+ start.push(offset + ntc);\r
+ start.sort(function(a, b) {\r
+ return a - b;\r
+ });\r
+ this._start = start;\r
+ ntc = start = offset = void 0;\r
+};\r
+/*void*/ SVGAnimationElement.prototype.endElementAt = function(/*float*/ offset) {\r
+ var ntc = this.ownerDocument.documentElement.getCurrentTime(),\r
+ fin = this._finish || [];\r
+ for (var i=0,fli=fin.length;i<fli;++i) {\r
+ if (fin[i] === (offset+ntc)) {\r
+ ntc = fin = offset = void 0;\r
+ return;\r
+ }\r
+ }\r
+ fin.push(offset + ntc);\r
+ fin.sort(function(a, b) {\r
+ return a - b;\r
+ });\r
+ this._finish = fin;\r
+ ntc = start = offset = void 0;\r
+};\r
+SVGAnimationElement.prototype._eventRegExp = /(mouse|activ|clic|begi|en)[a-z]+/;\r
+SVGAnimationElement.prototype._timeRegExp = /[\-\d\.]+(h|min|s|ms)?$/;\r
+SVGAnimationElement.prototype._unit = {\r
+ "h" : 3600000,\r
+ "min" : 60000,\r
+ "s" : 1000\r
+};\r
+/*_getOffsetメソッド\r
+ * どれだけズレの時間があるかを計測するメソッド\r
+ *tに数値が使われていないときは0を返す\r
+ *これはSMILアニメーションモジュールの以下の記述にあるように、値のデフォルトが0であることに起因する\r
+ *http://www.w3.org/TR/2001/REC-smil20-20010807/smil-timing.html#Timing-Ex:0DurDiscreteMedia\r
+ *http://www.w3.org/TR/2001/REC-smil20-20010807/smil-timing.html#Timing-DurValueSemantics\r
+ ** Note that when the simple duration is "indefinite", some simple use cases can yield surprising results. See the related example #4 in Appendix B.\r
+ */\r
+SVGAnimationElement.prototype._getOffset = function(/*string*/ val) {\r
+ var t = null, //tは最初の数値\r
+ n = [val.indexOf("+"), val.indexOf("-")],\r
+ s;\r
+ if (n[0] > -1) {\r
+ s = val.slice(n[0]);\r
+ t = parseFloat(s);\r
+ } else if (n[1] > -1) {\r
+ s = val.slice(n[1]);\r
+ t = parseFloat(s);\r
+ } else {\r
+ s = val;\r
+ t = parseFloat(val);\r
+ }\r
+ if (isFinite(t)) {\r
+ if (/\d+\:(\d\d)\:([\d\.]+)$/.test(s)) { //Full-Clock-Valueの場合\r
+ t = (t*3600 + parseInt(RegExp.$1, 10)*60 + parseFloat(RegExp.$2)) * 1000;\r
+ } else if (/\d\d\:([\d\.]+)$/.test(s)) {\r
+ t = (t*60 + parseFloat(RegExp.$1)) * 1000;\r
+ } else if (/(h|min|s)$/.test(s)) {\r
+ t *= this._unit[RegExp.$1];\r
+ }\r
+ if (isFinite(t)) {\r
+ t *= 0.8;\r
+ return t;\r
+ }\r
+ }\r
+ return 0;\r
+};\r
+\r
+/*float*/ SVGAnimationElement.prototype.getStartTime = function(){\r
+ if (this._starting || (this._starting === 0)) {\r
+ return (this._starting);\r
+ } else {\r
+ throw new DOMException(/*DOMException.INVALID_STATE_ERR*/ 11);\r
+ }\r
+};\r
+/*getCurrentTimeメソッド\r
+ *現在の時間コンテナ内での時刻であり、\r
+ *決して現在時刻ではない。要素のbeginイベントの発火したときが0sである。\r
+ */\r
+/*float*/ SVGAnimationElement.prototype.getCurrentTime = function(){\r
+ return (this._currentFrame * 125 * 0.8);\r
+};\r
+/*float*/ SVGAnimationElement.prototype.getSimpleDuration = function(){\r
+ if (!this._dur && !this._finish && (this._dur === "indefinite")) {\r
+ throw new DOMException(/*DOMException.NOT_SUPPORTED_ERR*/ 9);\r
+ } else {\r
+ return (this._getOffset(this._dur));\r
+ }\r
+};\r
+ //raises( DOMException );\r
+NAIBU.Time = {\r
+ currentFrame : 0,\r
+ Max : 17000,\r
+ start : function() {\r
+ if (NAIBU.Clip.length > 0) {\r
+ screen.updateInterval = 42; //24fpsとして描画処理\r
+ window.onscroll = function () {\r
+ screen.updateInterval = 0;\r
+ screen.updateInterval = 42;\r
+ };\r
+ NAIBU.stop = setInterval( (function() {\r
+ try {\r
+ var ntc = NAIBU.Time.currentFrame,\r
+ nc = NAIBU.Clip,\r
+ s = ntc * 100; //フレーム数ntcをミリ秒数sに変換 (100 = 125 * 0.8)\r
+ if (ntc > NAIBU.Time.Max) {\r
+ clearInterval(NAIBU.stop);\r
+ }\r
+ nc[0] && nc[0].ownerDocument.documentElement.setCurrentTime(s);\r
+ for (var i=0,ncli=nc.length;i<ncli;++i) {\r
+ var nci = nc[i],\r
+ s2 = s + 100,\r
+ s1 = s - 100;\r
+ if (nci._start) {\r
+ var sti = nci._start[0];\r
+ if (sti && nci._finish && (sti === nci._finish[0])) { //アニメーションの途中ならば\r
+ nci.endElement();\r
+ }\r
+ if ((sti || (sti === 0)) && (s1 <= sti) && (sti < s)) {\r
+ nci.beginElement();\r
+ }\r
+ sti = void 0;\r
+ }\r
+ if (nci._isRepeat && (nci.getCurrentTime() >= nci.getSimpleDuration()*nci._numRepeat)) {\r
+ /*リピート処理*/\r
+ var ttd = nci.ownerDocument,\r
+ evt = ttd.createEvent("TimeEvents");\r
+ ++nci._numRepeat;\r
+ evt.initTimeEvent("repeatEvent", ttd.defaultView, nci._numRepeat);\r
+ nci.dispatchEvent(evt);\r
+ ttd = evt = void 0;\r
+ }\r
+ if (nci._finish && (nci.getCurrentTime() !== 0)) {\r
+ var fti = nci._finish[0];\r
+ if ((fti || (fti === 0)) && (s1 <= fti) && (fti <= s)) {\r
+ nci.endElement();\r
+ }\r
+ fti = void 0;\r
+ }\r
+ if (nci._frame) {\r
+ ++nci._currentFrame;\r
+ nci._frame();\r
+ }\r
+ }\r
+ ++NAIBU.Time.currentFrame;\r
+ ntc = nc = s = nci = s1 = s2 = void 0;\r
+ } catch (e) {\r
+ }\r
+ }),\r
+ 1\r
+ );\r
+ } else {\r
+ window.onscroll = function () {\r
+ screen.updateInterval = 0;\r
+ window.onscroll = NAIBU.emptyFunction;\r
+ };\r
+ }\r
+ }\r
+};\r
+NAIBU.Clip = [];\r
+ \r
+function SVGAnimateElement(){\r
+ SVGAnimationElement.apply(this);\r
+ /*NAIBU.Clipについては、NAIBU.Timeで使う\r
+ *くわしくはNAIBU.Time.start関数のコードを参照\r
+ */\r
+ NAIBU.Clip[NAIBU.Clip.length] = this;\r
+ /*_valueListプロパティは、\r
+ *機械が理解できる形で保管されているvalueの値の配列リスト\r
+ */\r
+ this._valueList = [];\r
+ this._isDiscrete = false;\r
+ this.addEventListener("DOMAttrModified", function(evt){\r
+ if (evt.eventPhase === /*Event.BUBBLING_PHASE*/ 3) {\r
+ return; //強制終了させる\r
+ }\r
+ if ((evt.attrName === "calcMode") && (evt.newValue === "discrete")) {\r
+ evt.target._isDiscrete = true;\r
+ }\r
+ }, false);\r
+ this.addEventListener("DOMNodeInserted", function(evt){\r
+ if (evt.eventPhase === /*Event.BUBBLING_PHASE*/ 3) {\r
+ return; //強制終了させる\r
+ }\r
+ var tar = evt.target;\r
+ tar.addEventListener("DOMNodeInsertedIntoDocument", function(evt){\r
+ var tar = evt.target,\r
+ attrName = tar.getAttributeNS(null, "attributeName"),\r
+ ttr = tar.targetElement,\r
+ tta = ttr[attrName];\r
+ /*tar.valuesのリスト: ["12px", "13px"]\r
+ *tar._valueList: [(new SVGPoint()), (new SVGPoint())]\r
+ * tar.valuesを機械が理解できるように変換したものがtar._valueList\r
+ *この_valueListプロパティはアニメの際に使うので、_valuesプロパティはアニメ中に使わないことに注意\r
+ */\r
+ var vi = ttr.cloneNode(false);\r
+ if (!tar._values[0]) { //to属性か、by属性が設定されている場合\r
+ var ttrs = ttr.ownerDocument.defaultView.getComputedStyle(ttr, "");\r
+ tar._values[0] = ttr.getAttributeNS(null, attrName) || ttrs.getPropertyValue(attrName);\r
+ if (!tar._values[1] && tar._values[2]) { //by属性のみが設定されている場合\r
+ var v2 = parseFloat(tar._values[0]) + parseFloat(tar._values[2]), tanni = tar._values[0].match(/\D+/) || [""];\r
+ tar._values[1] = v2 + tanni[0];\r
+ tar._values.pop();\r
+ v2 = tanni = void 0;\r
+ }\r
+ }\r
+ if (("animatedPoints" in ttr) && (attrName === "points")) {\r
+ ttr.animatedPoints = vi.points;\r
+ for (var i=0, tav=tar._values, tvli=tav.length;i<tvli;++i) {\r
+ var vir = ttr.cloneNode(false);\r
+ delete vir._tar;\r
+ vir.setAttributeNS(null, "points", tav[i]);\r
+ tar._valueList[tar._valueList.length] = vir.points;\r
+ }\r
+ } else if (!!tta) {\r
+ tta.animVal = vi[attrName].baseVal;\r
+ for (var i=0, tav=tar._values, tvli=tav.length;i<tvli;++i) {\r
+ var vir = ttr.cloneNode(false); //仮の要素\r
+ delete vir._tar;\r
+ vir.setAttributeNS(null, attrName, tav[i]);\r
+ tar._valueList[tar._valueList.length] = vir[attrName].baseVal;\r
+ }\r
+ } else if (!!CSS2Properties[attrName] || attrName.indexOf("-") > -1) { //スタイルシートのプロパティならば\r
+ for (var i=0, tav=tar._values, tvli=tav.length;i<tvli;++i) {\r
+ if ((attrName === "fill") || (attrName === "stroke") || (attrName === "stop-color")) {\r
+ tar._valueList[i] = new SVGPaint();\r
+ tar._valueList[i].setPaint(1, null, tav[i], null);\r
+ } else {\r
+ tar._valueList[i] = parseFloat(tav[i]);\r
+ }\r
+ }\r
+ } else if (("normalizedPathSegList" in ttr) && (attrName === "d")) {\r
+ ttr.animatedNormalizedPathSegList = vi.normalizedPathSegList;\r
+ for (var i=0, tav=tar._values, tvli=tav.length;i<tvli;++i) {\r
+ var vir = ttr.cloneNode(false);\r
+ delete vir._tar;\r
+ vir.setAttributeNS(null, "d", tav[i]);\r
+ tar._valueList[tar._valueList.length] = vir.normalizedPathSegList;\r
+ }\r
+ } else {\r
+ vi = void 0;\r
+ return;\r
+ }\r
+ evt = tta = vir = vi = void 0;\r
+ }, false);\r
+ }, false);\r
+ this.addEventListener("beginEvent", function(evt) {\r
+ var _tar = evt.target,\r
+ attrName = _tar.getAttributeNS(null, "attributeName"),\r
+ newAttr = _tar.targetElement.attributes.getNamedItemNS(null, attrName),\r
+ ttr = _tar.targetElement,\r
+ tta = ttr[attrName];\r
+ _tar._frame = function() {\r
+ var tar = _tar,\r
+ d = tar._isRepeat ? tar.getSimpleDuration() : tar._activeDur,\r
+ n = tar._valueList.length-1,\r
+ tg = tar.getCurrentTime();\r
+ tar._activeDur || (d = 0);\r
+ d *= 0.8;\r
+ if ((n !== -1) && (d !== 0) && (tg <= d)) {\r
+ if (tar._isDiscrete) {\r
+ ++n; //discreteモードは他のモードに比べて、分割数が多いことに注意\r
+ }\r
+ var ii = Math.floor((tg*n) / d);\r
+ if (ii === n) { //iiが境い目のときは、n-2を適用\r
+ ii -= 1;\r
+ }\r
+ } else {\r
+ return;\r
+ }\r
+ /*setAttrbute(NS)メソッドはDOM属性を書き換えるため利用しない。\r
+ *\r
+ * 参照:アニメーションサンドイッチモデル\r
+ * >アニメーションが起動している時,それは実際,DOMの中の属性値は変化しない。\r
+ *http://www.jsa.or.jp/stdz/instac/syoukai/H13/H13annual_report/12/ngc-wg3/offline/smil_20_20020131/animation.html#animationNS-AnimationSandwichModel\r
+ */\r
+ var evt = tar.ownerDocument._domnodeEvent();\r
+ if (tar._keyTimes) {\r
+ var di = (tar._keyTimes[ii+1] - tar._keyTimes[ii]) * d;\r
+ var ti = tar._keyTimes[ii];\r
+ } else {\r
+ var di = d / n; //keyTimesがなければ均等に時間を配分しておく\r
+ var ti = ii / n;\r
+ }\r
+ if (("animatedPoints" in ttr) && (attrName === "points")) {\r
+ var base = ttr.points;\r
+ ttr.points = ttr.animatedPoints;\r
+ ttr.dispatchEvent(evt);\r
+ ttr.animatedPoints = ttr.points;\r
+ ttr.points = base;\r
+ } else if (!!tta) {\r
+ var base = tta.baseVal, tanim = tta.animVal;\r
+ var v1 = tar._valueList[ii].value;\r
+ /*vを求める公式に関しては、SMIL2.0 Animation Moduleの単純アニメーション関数の項を参照\r
+ * 3.4.2 Specifying the simple animation function f(t)\r
+ *http://www.w3.org/TR/2005/REC-SMIL2-20050107/animation.html#animationNS-SpecifyingAnimationFunction\r
+ */\r
+ if (!tar._isDiscrete) {\r
+ var v2 = tar._valueList[ii+1].value, v = v1 + (v2-v1) * (tg-ti*d) / di;\r
+ } else {\r
+ var v = v1;\r
+ }\r
+ tanim.newValueSpecifiedUnits(base.unitType, v);\r
+ tta.baseVal = tanim;\r
+ tanim = void 0;\r
+ ttr.dispatchEvent(evt);\r
+ /*変化値はanimValプロパティに収納しておき、\r
+ *変化する前の、元の値はbaseValプロパティに再び収納しておく\r
+ */\r
+ tta.animVal = tta.baseVal;\r
+ tta.baseVal = base;\r
+ di = void 0;\r
+ } else if (!!CSS2Properties[attrName] || attrName.indexOf("-") > -1) { //スタイルシートのプロパティならば\r
+ var base = null;\r
+ var v1 = tar._valueList[ii].value, v2 = tar._valueList[ii+1].value;\r
+ if (!tar._isDiscrete) {\r
+ var v = v1 + (v2-v1) * (tg-ti*d) / di;\r
+ } else {\r
+ var v = v1;\r
+ }\r
+ } else if (("normalizedPathSegList" in ttr) && (attrName === "d")) {\r
+ var base = ttr.normalizedPathSegList;\r
+ ttr.normalizedPathSegList = ttr.animatedNormalizedPathSegList;\r
+ ttr.dispatchEvent(evt);\r
+ ttr.animatedNormalizedPathSegList = ttr.normalizedPathSegList;\r
+ ttr.normalizedPathSegList = base;\r
+ }\r
+ evt = tar = v1 = v2 = v = d = n = ii = tg = void 0;\r
+ };\r
+ evt = vir = void 0;\r
+ }, false);\r
+ this.addEventListener("endEvent", function(evt) {\r
+ var tar = evt.target,\r
+ fill = tar.getAttributeNS(null, "fill");\r
+ if (!fill || (fill === "remove")) {\r
+ var evt = tar.ownerDocument._domnodeEvent();\r
+ tar.targetElement.dispatchEvent(evt);\r
+ evt = void 0;\r
+ tar._frame && tar._frame();\r
+ }\r
+ delete tar._frame;\r
+ }, false);\r
+ this.addEventListener("repeatEvent", function(evt) {\r
+ var tar = evt.target;\r
+ }, false);\r
+ return this;\r
+};\r
+SVGAnimateElement.prototype = Object._create(SVGAnimationElement);\r
+\r
+function SVGSetElement(){\r
+ SVGAnimationElement.apply(this);\r
+ NAIBU.Clip[NAIBU.Clip.length] = this;\r
+ this._to = "";\r
+ this.addEventListener("DOMAttrModified", function(evt) {\r
+ var tar = evt.target, name = evt.attrName;\r
+ if (name === "to") {\r
+ tar._to = evt.newValue;\r
+ }\r
+ tar = name = void 0;\r
+ }, false);\r
+ this.addEventListener("beginEvent", function(evt) {\r
+ var tar = evt.target;\r
+ tar._currentFrame = 1; //これがないと、NAIBU.stopの内部の処理の都合上、endEventが発動しない。\r
+ if (tar.targetElement) {\r
+ var attrName = tar.getAttributeNS(null, "attributeName"),\r
+ newAttr = tar.targetElement.attributes.getNamedItemNS(null, attrName),\r
+ tta = tar.targetElement[attrName];\r
+ if (!!CSS2Properties[attrName] || attrName.indexOf("-") > -1) { //スタイルシートのプロパティならば\r
+ /*前もって、スタイルシートの値を取得しておいて、endEventの際に使う*/\r
+ tar._prestyle = tar.ownerDocument.defaultView.getComputedStyle(tar.targetElement, "").getPropertyValue(attrName);\r
+ var style = tar.ownerDocument.getOverrideStyle(tar.targetElement, "");\r
+ style.setProperty(attrName, tar.getAttributeNS(null, "to"), null);\r
+ style = void 0;\r
+ } else if (!!tta) {\r
+ var base = tta.baseVal;\r
+ if (base instanceof SVGLength) {\r
+ tta.baseVal = tar.ownerDocument.documentElement.createSVGLength();\r
+ } else if (base instanceof SVGRect) {\r
+ tta.baseVal = tar.ownerDocument.documentElement.createSVGRect();\r
+ }\r
+ /*setAttrbute(NS)メソッドはDOM属性を書き換えるため利用しない。\r
+ *\r
+ * 参照:アニメーションサンドイッチモデル\r
+ * >アニメーションが起動している時,それは実際,DOMの中の属性値は変化しない。\r
+ *http://www.jsa.or.jp/stdz/instac/syoukai/H13/H13annual_report/12/ngc-wg3/offline/smil_20_20020131/animation.html#animationNS-AnimationSandwichModel\r
+ */\r
+ var evt = tar.ownerDocument.createEvent("MutationEvents");\r
+ evt.initMutationEvent("DOMAttrModified", true, false, newAttr, newAttr, tar._to, attrName, /*MutationEvent.MODIFICATION*/ 1);\r
+ tar.targetElement.dispatchEvent(evt);\r
+ evt = void 0;\r
+ /*変化値はanimValプロパティに収納しておき、\r
+ *変化する前の、元の値はbaseValプロパティに再び収納しておく\r
+ */\r
+ tta.animVal = tta.baseVal;\r
+ tta.baseVal = base;\r
+ }\r
+ }\r
+ evt = tar = attrName = void 0;\r
+ }, false);\r
+ this.addEventListener("endEvent", function(evt) {\r
+ var tar = evt.target,\r
+ fill = tar.getAttributeNS(null, "fill");\r
+ if (!fill || (fill === "remove")) {\r
+ var attrName = tar.getAttributeNS(null, "attributeName"),\r
+ style = tar.ownerDocument.getOverrideStyle(tar.targetElement, "");\r
+ if (tar._prestyle) { //スタイルシートの変更ならば\r
+ style.setProperty(attrName, tar._prestyle, null);\r
+ } else {\r
+ var evtt = tar.ownerDocument._domnodeEvent();\r
+ tar.targetElement.dispatchEvent(evtt);\r
+ }\r
+ attrName = style = evtt = void 0;\r
+ }\r
+ tar = fill = void 0;\r
+ }, false);\r
+ this.addEventListener("repeatEvent", function(evt) {\r
+ var tar = evt.target, attrName = tar.getAttributeNS(null, "attributeName"), style = tar.ownerDocument.defaultView.getComputedStyle(tar.targetElement, "");\r
+ }, false);\r
+ return this;\r
+};\r
+SVGSetElement.prototype = new SVGAnimationElement(1);\r
+\r
+function SVGAnimateMotionElement(){\r
+ SVGAnimationElement.apply(this);\r
+ NAIBU.Clip[NAIBU.Clip.length] = this;\r
+ this.addEventListener("DOMAttrModified", function(evt){\r
+ if (evt.eventPhase === /*Event.BUBBLING_PHASE*/ 3) {\r
+ return;\r
+ }\r
+ var tar = evt.target,\r
+ name = evt.attrName;\r
+ if (name === "path") {\r
+ var d = tar.ownerDocument.createElementNS("http://www.w3.org/2000/svg", "path");\r
+ d.setAttributeNS(null, "d", evt.newValue);\r
+ tar._path = d;\r
+ d = void 0;\r
+ }\r
+ }, false);\r
+ this.addEventListener("DOMNodeInserted", function(evt){\r
+ if (evt.eventPhase === /*Event.BUBBLING_PHASE*/ 3) {\r
+ return; //強制終了させる\r
+ }\r
+ var tar = evt.target;\r
+ tar.addEventListener("DOMNodeInsertedIntoDocument", function(evt){\r
+ var vlist = [],\r
+ ti;\r
+ if (tar._values) {\r
+ for (var i=0, tav=tar._values, tvli=tav.length;i<tvli;++i) {\r
+ ti = tav[i];\r
+ ti = ti.split(",");\r
+ vlist[i] = [+ti[0], +ti[1]];\r
+ }\r
+ tar._valueList = vlist;\r
+ }\r
+ }, false);\r
+ }, false);\r
+ this.addEventListener("beginEvent", function(evt) {\r
+ var tar = evt.target,\r
+ trans = tar.targetElement.transform;\r
+ /*アニメーション中に変化すべき値をanimValプロパティに入力して、\r
+ *baseValと同じような値に設定。\r
+ */\r
+ trans.animVal = new SVGTransformList();\r
+ if (trans.baseVal.numberOfItems !== 0) {\r
+ trans.baseVal.consolidate();\r
+ trans.animVal.initialize(trans.baseVal.createSVGTransformFromMatrix(trans.baseVal.getItem(0).matrix));\r
+ } else {\r
+ trans.animVal.appendItem(tar.ownerDocument.documentElement.createSVGTransform());\r
+ }\r
+ tar._frame = function() {\r
+ var _tar = tar,\r
+ tpn = _tar._path,\r
+ tgsd = _tar._isRepeat ? _tar.getSimpleDuration() : _tar._activeDur,\r
+ d = tgsd * 0.8,\r
+ tg = _tar.getCurrentTime(),\r
+ ii;\r
+ _tar._activeDur || (d = 0);\r
+ if (tgsd === 0) {\r
+ tgsd = void 0;\r
+ return;\r
+ }\r
+ if (tpn) { //path属性が指定されていた場合、tpnは属性値となる\r
+ var st = tpn.getTotalLength() * tg / d, //stは現在に至るまでの距離\r
+ p = tpn.getPointAtLength(st),\r
+ trans = _tar.targetElement.transform;\r
+ trans.animVal.getItem(trans.animVal.numberOfItems-1).setTranslate(p.x, p.y);\r
+ var base = trans.baseVal;\r
+ trans.baseVal = trans.animVal;\r
+ _tar.targetElement._cacheMatrix = null;\r
+ var evtt = _tar.ownerDocument.createEvent("MutationEvents");\r
+ evtt.initMutationEvent("DOMNodeInsertedIntoDocument", false, false, null, null, null, null, null);\r
+ _tar.targetElement.dispatchEvent(evtt);\r
+ trans.baseVal = base;\r
+ evtt = base = trans = st = p = void 0;\r
+ } else if (tar._valueList) {\r
+ var total = 0, //totalは総距離\r
+ st = 0, //stは現在にいたるまでの距離\r
+ tav = tar._valueList,\r
+ n = tav.length - 1;\r
+ if ((n !== -1) && (d !== 0) && (tg <= d)) {\r
+ ii = Math.floor((tg*n) / d);\r
+ if (ii === n) { //iiが境い目のときは、n-2を適用\r
+ ii -= 1;\r
+ }\r
+ } else {\r
+ return;\r
+ }\r
+ for (var i=1, tvli=tav.length;i<tvli;i+=2) {\r
+ total += Math.sqrt(Math.pow(tav[i][1] - tav[i-1][1], 2) + Math.pow(tav[i][0] - tav[i-1][0], 2));\r
+ }\r
+ for (var i=1;i<ii;i+=2) {\r
+ st += Math.sqrt(Math.pow(tav[i][1] - tav[i-1][1], 2) + Math.pow(tav[i][0] - tav[i-1][0], 2));\r
+ }\r
+ var p = tar.ownerDocument.documentElement.createSVGPoint(),\r
+ trans = _tar.targetElement.transform;\r
+ st = (st / total) * d;\r
+ p.x = tav[ii][0] + (tav[ii+1][0] - tav[ii][0]) * (tg - st) / d;\r
+ p.y = tav[ii][1] + (tav[ii+1][1] - tav[ii][1]) * (tg - st) / d;\r
+ trans.animVal.getItem(trans.animVal.numberOfItems-1).setTranslate(p.x, p.y);\r
+ var base = trans.baseVal;\r
+ trans.baseVal = trans.animVal;\r
+ _tar.targetElement._cacheMatrix = void 0;\r
+ var evtt = _tar.ownerDocument.createEvent("MutationEvents");\r
+ evtt.initMutationEvent("DOMNodeInsertedIntoDocument", false, false, null, null, null, null, null);\r
+ _tar.targetElement.dispatchEvent(evtt);\r
+ trans.baseVal = base;\r
+ evtt = base = trans = st = p = i = void 0;\r
+ }\r
+ };\r
+ evt = trans = tpn = tgsd = void 0;\r
+ }, false);\r
+ this.addEventListener("endEvent", function(evt) {\r
+ var tar = evt.target,\r
+ trans = tar.targetElement.transform,\r
+ fill = tar.getAttributeNS(null, "fill"),\r
+ tavli = tar._valueList,\r
+ tb;\r
+ if (!fill || (fill === "remove")) {\r
+ /*アニメが開始される前の状態に戻す*/\r
+ var evtt = tar.ownerDocument._domnodeEvent();\r
+ tar.targetElement.dispatchEvent(evtt);\r
+ tar._frame && tar._frame();\r
+ } else {\r
+ /*_frame関数で終了位置に会わないことがあるので、以下の処理で位置を修正*/\r
+ trans.animVal.getItem(trans.animVal.numberOfItems-1).setTranslate(tavli[tavli.length-1][0], tavli[tavli.length-1][1]);\r
+ tb = trans.baseVal;\r
+ trans.baseVal = trans.animVal;\r
+ var evtt = tar.ownerDocument._domnodeEvent();\r
+ tar.targetElement.dispatchEvent(evtt);\r
+ trans.baseVal = tb; \r
+ }\r
+ delete tar._frame;\r
+ evt = evtt = trans = fill = tar = tavli = tb = void 0;\r
+ }, false);\r
+ this.addEventListener("repeatEvent", function(evt) {\r
+ var tar = evt.target;\r
+ }, false);\r
+ return this;\r
+};\r
+SVGAnimateMotionElement.prototype = Object._create(SVGAnimationElement);\r
+\r
+function SVGMPathElement() /* : \r
+ SVGElement,\r
+ SVGURIReference,\r
+ SVGExternalResourcesRequired*/ {\r
+ SVGElement.apply(this);\r
+ SVGURIReference.apply(this);\r
+ return this;\r
+};\r
+SVGMPathElement.prototype = Object._create(SVGElement);\r
+\r
+function SVGAnimateColorElement() {\r
+ SVGAnimationElement.apply(this);\r
+ NAIBU.Clip[NAIBU.Clip.length] = this;\r
+ this._valueList = [];\r
+ this.addEventListener("DOMNodeInserted", function(evt){\r
+ if (evt.eventPhase === /*Event.BUBBLING_PHASE*/ 3) {\r
+ return; //強制終了させる\r
+ }\r
+ var tar = evt.target;\r
+ tar.addEventListener("DOMNodeInsertedIntoDocument", function(evt){\r
+ var tar = evt.target,\r
+ attrName = tar.getAttributeNS(null, "attributeName"),\r
+ ttr = tar.targetElement,\r
+ fstyle = tar.ownerDocument.defaultView.getComputedStyle(ttr, ""),\r
+ css, n;\r
+ if (!tar._values[0]) {\r
+ tar._values[0] = fstyle.getPropertyValue(attrName);\r
+ }\r
+ for (var i=0, tav=tar._values, tvli=tav.length;i<tvli;++i) {\r
+ var to = new SVGColor();\r
+ if (tar._values[i] === "currentColor") {\r
+ to.setRGBColor(fstyle.getPropertyValue("color") || "black");\r
+ } else if (tar._values[i] === "inherit") {\r
+ /*いったん、cssValueTypeプロパティをinheritに指定して、継承元のオブジェクトを取得*/\r
+ css = fstyle.getPropertyCSSValue(attrName);\r
+ n = css.cssValueType;\r
+ css.cssValueType = /*CSSValue.CSS_INHERIT*/ 0;\r
+ to = fstyle.getPropertyCSSValue(attrName);\r
+ css.cssValueType = n;\r
+ } else {\r
+ to.setRGBColor(tar._values[i]);\r
+ }\r
+ tar._valueList[tar._valueList.length] = to;\r
+ to = void 0;\r
+ }\r
+ tar = ttr = fstyle = css = n = attrName = void 0;\r
+ }, false);\r
+ }, false);\r
+ this.addEventListener("beginEvent", function(evt) {\r
+ var tar = evt.target,\r
+ attrName = tar.getAttributeNS(null, "attributeName"),\r
+ style = tar.ownerDocument.getOverrideStyle(tar.targetElement, ""),\r
+ fstyle = tar.ownerDocument.defaultView.getComputedStyle(tar.targetElement, "");\r
+ tar._frame = function() {\r
+ var _tar = tar;\r
+ /*公式に関しては、SMIL2.0 Animation Moduleの単純アニメーション関数の項を参照\r
+ * 3.4.2 Specifying the simple animation function f(t)\r
+ *http://www.w3.org/TR/2005/REC-SMIL2-20050107/animation.html#animationNS-SpecifyingAnimationFunction\r
+ */\r
+ var d = _tar._isRepeat ? _tar.getSimpleDuration() : _tar._activeDur,\r
+ n = _tar._valueList.length - 1,\r
+ tg = _tar.getCurrentTime(),\r
+ ii, di, ti;\r
+ _tar._activeDur || (d = 0);\r
+ d *= 0.8;\r
+ if ((n !== -1) && (d !== 0) && (tg <= d)) {\r
+ ii = Math.floor((tg*n) / d);\r
+ if (ii === n) { //iiが境い目のときは、n-2を適用\r
+ ii -= 1;\r
+ }\r
+ } else {\r
+ return;\r
+ }\r
+ if (tar._keyTimes) {\r
+ di = (tar._keyTimes[ii+1] - tar._keyTimes[ii]) * d;\r
+ ti = tar._keyTimes[ii];\r
+ } else {\r
+ di = d / n; //keyTimesがなければ均等に時間を配分しておく\r
+ ti = ii / n;\r
+ }\r
+ var fc = _tar._valueList[ii].rgbColor,\r
+ tc = _tar._valueList[ii+1].rgbColor,\r
+ durd = (tg-ti*d) / di,\r
+ num = /*CSSPrimitiveValue.CSS_NUMBER*/ 1,\r
+ fr = fc.red.getFloatValue(num),\r
+ fg = fc.green.getFloatValue(num),\r
+ fb = fc.blue.getFloatValue(num),\r
+ r = fr + (tc.red.getFloatValue(num) - fr) * durd,\r
+ g = fg + (tc.green.getFloatValue(num) - fg) * durd,\r
+ b = fb + (tc.blue.getFloatValue(num) - fb) * durd;\r
+ style.setProperty(attrName, "rgb(" +Math.ceil(r)+ "," +Math.ceil(g)+ "," +Math.ceil(b)+ ")", null);\r
+ _tar = d = n = tg = fc = tc = fr = fg = fb = num = r = g = b = ii = void 0;\r
+ };\r
+ tar._frame();\r
+ }, false);\r
+ this.addEventListener("endEvent", function(evt) {\r
+ var tar = evt.target,\r
+ fill = tar.getAttributeNS(null, "fill");\r
+ if (!fill || (fill === "remove")) {\r
+ var evtt = tar.ownerDocument._domnodeEvent();\r
+ tar.targetElement.dispatchEvent(evtt);\r
+ tar._frame && tar._frame();\r
+ }\r
+ delete tar._frame;\r
+ evt = evtt = tar = fill = void 0;\r
+ }, false);\r
+ this.addEventListener("repeatEvent", function(evt) {\r
+ var tar = evt.target;\r
+ }, false);\r
+ return this;\r
+};\r
+SVGAnimateColorElement.prototype = Object._create(SVGAnimationElement);\r
+\r
+function SVGAnimateTransformElement() {\r
+ SVGAnimationElement.apply(this);\r
+ NAIBU.Clip[NAIBU.Clip.length] = this;\r
+ this.addEventListener("beginEvent", function(evt) {\r
+ var tar = evt.target, trans = tar.targetElement.transform;\r
+ /*アニメーション中に変化すべき値をanimValプロパティに入力して、\r
+ *baseValと同じような値に設定。\r
+ */\r
+ trans.animVal = new SVGTransformList();\r
+ if (trans.baseVal.numberOfItems !== 0) {\r
+ trans.animVal.initialize(trans.baseVal.createSVGTransformFromMatrix(trans.baseVal.getItem(0).matrix));\r
+ }\r
+ trans.animVal.appendItem(tar.ownerDocument.documentElement.createSVGTransform());\r
+ }, false);\r
+ this.addEventListener("endEvent", function(evt) {\r
+ var tar = evt.target,\r
+ fill = tar.getAttributeNS(null, "fill");\r
+ if (!fill || (fill === "remove")) {\r
+ var evtt = tar.ownerDocument._domnodeEvent();\r
+ tar.targetElement.dispatchEvent(evtt);\r
+ tar._frame && tar._frame();\r
+ }\r
+ delete tar._frame;\r
+ evt = evtt = tar = fill = void 0;\r
+ }, false);\r
+ this.addEventListener("repeatEvent", function(evt) {\r
+ var tar = evt.target;\r
+ }, false);\r
+ return this;\r
+};\r
+SVGAnimateTransformElement.prototype = Object._create(SVGAnimationElement);\r
+\r
+function SVGFontElement() /*: \r
+ SVGElement,\r
+ SVGExternalResourcesRequired,\r
+ SVGStylable*/ {\r
+ SVGElement.apply(this);\r
+ /*_isExternalは外部から呼び出されたfont要素ならば、真(1)となる*/\r
+ /*boolean or number*/ this._isExternal = 0;\r
+ this.addEventListener("DOMNodeInserted", function(evt){\r
+ var tar = evt.target;\r
+ if (evt.eventPhase === /*Event.BUBBLING_PHASE*/ 3) {\r
+ return;\r
+ }\r
+ tar.addEventListener("DOMNodeInsertedIntoDocument", function(evt){\r
+ var tar = evt.target, svgns = "http://www.w3.org/2000/svg", fontFace = tar.getElementsByTagNameNS(svgns, "font-face").item(0);\r
+ var nefunc = function(evt){\r
+ var svg = evt.target;\r
+ /*以下のtarはfont要素*/\r
+ var familyName = fontFace.getAttributeNS(null, "font-family");\r
+ var textElements = tar.ownerDocument.getElementsByTagNameNS(svgns, "text");\r
+ for (var i=0,_tar=tar,tli=textElements.length;i<tli;++i) {\r
+ var ti = textElements[i], style = _tar.ownerDocument.defaultView.getComputedStyle(ti, '');\r
+ if (style.getPropertyValue("font-family", null).indexOf(familyName) > -1) {\r
+ NAIBU._noie_createFont(ti, _tar, true);\r
+ }\r
+ }\r
+ evt = tar = svg = curt = textElments = svgns = _tar = void 0;\r
+ };\r
+ if (!fontFace.__isLinked || tar._isExternal) {\r
+ tar.ownerDocument.documentElement._svgload_limited = 0;\r
+ tar.ownerDocument.documentElement.addEventListener("SVGLoad", nefunc, false);\r
+ }\r
+ }, false);\r
+ }, false);\r
+ return this;\r
+};\r
+SVGFontElement.prototype = Object._create(SVGElement);\r
+\r
+function SVGGlyphElement() /*: \r
+ SVGElement,\r
+ SVGStylable*/ {\r
+ SVGElement.apply(this);\r
+ return this;\r
+};\r
+SVGGlyphElement.prototype = Object._create(SVGElement);\r
+\r
+function SVGMissingGlyphElement() /*: \r
+ SVGElement,\r
+ SVGStylable*/ {\r
+ SVGElement.apply(this);\r
+ return this;\r
+};\r
+SVGMissingGlyphElement.prototype = Object._create(SVGElement);\r
+\r
+function SVGHKernElement() {\r
+ SVGElement.apply(this);\r
+ return this;\r
+};\r
+SVGHKernElement.prototype = Object._create(SVGElement);\r
+\r
+function SVGVKernElement() {\r
+ SVGElement.apply(this);\r
+ return this;\r
+};\r
+SVGVKernElement.prototype = Object._create(SVGElement);\r
+\r
+function SVGFontFaceElement() {\r
+ SVGElement.apply(this);\r
+ /*boolean(or number)*/ this._isLinked = 0;\r
+ this.addEventListener("DOMNodeInserted", function(evt){\r
+ if (evt.eventPhase === /*Event.BUBBLING_PHASE*/ 3) {\r
+ if (evt.target.localName === "font-face-uri") { //外部リンクがあれば\r
+ evt.currentTarget._isLinked = 1;\r
+ }\r
+ return; //強制終了させる\r
+ }\r
+ }, false);\r
+ return this;\r
+};\r
+SVGFontFaceElement.prototype = Object._create(SVGElement);\r
+\r
+function SVGFontFaceSrcElement() {\r
+ SVGElement.apply(this);\r
+ return this;\r
+};\r
+SVGFontFaceSrcElement.prototype = Object._create(SVGElement);\r
+\r
+function SVGFontFaceUriElement() {\r
+ SVGElement.apply(this);\r
+ this.addEventListener("DOMNodeInserted", function(evt){\r
+ if (evt.eventPhase === /*Event.BUBBLING_PHASE*/ 3) {\r
+ return; //強制終了させる\r
+ }\r
+ evt.target.ownerDocument.documentElement._svgload_limited--;\r
+ evt.target.setAttributeNS("http://www.w3.org/1999/xlink", "xlink:show", "embed");\r
+ }, false);\r
+ this.addEventListener("S_Load", function(evt){\r
+ var tar = evt.target, tpp = tar.parentNode.parentNode.parentNode;\r
+ if (tpp.localName === "defs") {\r
+ tpp = tar.parentNode.parentNode; //tppをfont-face要素としておく\r
+ }\r
+ tar._instance._isExternal = 1;\r
+ tpp.parentNode.appendChild(tar._instance);\r
+ evt = tar = tpp = void 0;\r
+ }, false);\r
+ SVGURIReference.apply(this);\r
+ return this;\r
+};\r
+SVGFontFaceUriElement.prototype = Object._create(SVGElement);\r
+\r
+function SVGFontFaceFormatElement() {\r
+ SVGElement.apply(this);\r
+ return this;\r
+};\r
+SVGFontFaceFormatElement.prototype = Object._create(SVGElement);\r
+\r
+function SVGFontFaceNameElement() {\r
+ SVGElement.apply(this);\r
+ return this;\r
+};\r
+SVGFontFaceNameElement.prototype = Object._create(SVGElement);\r
+\r
+function SVGDefinitionSrcElement() {\r
+ SVGElement.apply(this);\r
+ return this;\r
+};\r
+SVGDefinitionSrcElement.prototype = Object._create(SVGElement);\r
+\r
+function SVGMetadataElement() {\r
+ SVGElement.apply(this);\r
+ return this;\r
+};\r
+SVGMetadataElement.prototype = Object._create(SVGElement);\r
+\r
+function SVGForeignObjectElement() /*: \r
+ SVGElement,\r
+ SVGTests,\r
+ SVGLangSpace,\r
+ SVGExternalResourcesRequired,\r
+ SVGStylable,\r
+ SVGTransformable,\r
+ events::EventTarget*/ { \r
+ SVGElement.apply(this);\r
+ var sl = SVGAnimatedLength;\r
+ /*readonly SVGAnimatedLength*/ this.x = new sl();\r
+ /*readonly SVGAnimatedLength*/ this.y = new sl();\r
+ /*readonly SVGAnimatedLength*/ this.width = new sl();\r
+ /*readonly SVGAnimatedLength*/ this.height = new sl();\r
+ sl = void 0;\r
+ return this;\r
+};\r
+SVGForeignObjectElement.prototype = Object._create(SVGElement);\r
+\r
+//#endif _SVG_IDL_\r
+/*SVGの要素マッピング(DOMでは定められていないが、必須)\r
+ *本来であれば、SVGDocumentのcreateElementNSメソッドを上書きすることが望ましいが、\r
+ *SIEでは軽量化のために、マッピングを用いた\r
+ */\r
+DOMImplementation["http://www.w3.org/2000/svg"] = {\r
+ Document: SVGDocument,\r
+ svg: SVGSVGElement,\r
+ g: SVGGElement,\r
+ path: NAIBU.SVGPathElement,\r
+ title: SVGTitleElement,\r
+ desc: SVGDescElement,\r
+ defs: SVGDefsElement,\r
+ linearGradient: SVGLinearGradientElement,\r
+ radialGradient: SVGRadialGradientElement,\r
+ stop: SVGStopElement,\r
+ rect: SVGRectElement,\r
+ circle: SVGCircleElement,\r
+ ellipse: SVGEllipseElement,\r
+ polyline: SVGPolylineElement,\r
+ polygon: SVGPolygonElement,\r
+ text: SVGTextElement,\r
+ tspan: SVGTSpanElement,\r
+ image: SVGImageElement,\r
+ line: SVGLineElement,\r
+ a: SVGAElement,\r
+ altGlyphDef: SVGAltGlyphDefElement,\r
+ altGlyph: SVGAltGlyphElement,\r
+ altGlyphItem: SVGAltGlyphItemElement,\r
+ animateColor: SVGAnimateColorElement,\r
+ animate: SVGAnimateElement,\r
+ animateMotion: SVGAnimateMotionElement,\r
+ animateTransform:SVGAnimateTransformElement,\r
+ clipPath: SVGClipPathElement,\r
+ colorProfile: SVGColorProfileElement,\r
+ cursor: SVGCursorElement,\r
+ definitionSrc: SVGDefinitionSrcElement,\r
+ feBlend: SVGFEBlendElement,\r
+ feGaussianBlur: SVGFEGaussianBlurElement,\r
+ filter: SVGFilterElement,\r
+ font: SVGFontElement,\r
+ "font-face": SVGFontFaceElement,\r
+ "font-face-format":SVGFontFaceFormatElement,\r
+ "font-face-name":SVGFontFaceNameElement,\r
+ "font-face-src": SVGFontFaceSrcElement,\r
+ "font-face-uri": SVGFontFaceUriElement,\r
+ foreignObject: SVGForeignObjectElement,\r
+ glyph: SVGGlyphElement,\r
+ glyphRef: SVGGlyphRefElement,\r
+ hkern: SVGHKernElement,\r
+ marker: SVGMarkerElement,\r
+ mask: SVGMaskElement,\r
+ metadata: SVGMetadataElement,\r
+ missingGlyph: SVGMissingGlyphElement,\r
+ mpath: SVGMPathElement,\r
+ script: SVGScriptElement,\r
+ set: SVGSetElement,\r
+ style: SVGStyleElement,\r
+ "switch": SVGSwitchElement,\r
+ "symbol": SVGSymbolElement,\r
+ textPath: SVGTextPathElement,\r
+ tref: SVGTRefElement,\r
+ use: SVGUseElement,\r
+ view: SVGViewElement,\r
+ vkern: SVGVKernElement,\r
+ pattern: SVGPatternElement\r
+};\r
+\r
+NAIBU._fontSearchURI = function(evt){\r
+ var doc = evt.target.ownerDocument;\r
+ var tsrc = doc.getElementsByTagNameNS("http://www.w3.org/2000/svg", "font-face-uri");\r
+ for (var i=0;i<tsrc.length;++i) {\r
+ var src = tsrc[i].getAttributeNS("http://www.w3.org/1999/xlink", "href"),\r
+ ids = src.split(":")[1],\r
+ xmlhttp = NAIBU.xmlhttp;\r
+ xmlhttp.open("GET", src.replace(/#.+$/, ""), true);\r
+ xmlhttp.setRequestHeader("X-Requested-With", "XMLHttpRequest");\r
+ xmlhttp.onreadystatechange = function() {\r
+ if ((xmlhttp.readyState === 4) && (xmlhttp.status === 200)) {\r
+ var doce = (new DOMParser()).parseFromString(xmlhttp.responseText, "text/xml");\r
+ NAIBU._font({document:doce, docu:doc, id:ids});\r
+ xmlhttp = doc = doce = void 0;\r
+ }\r
+ };\r
+ xmlhttp.send(null);\r
+ }\r
+};\r
+/*_font関数は、SVGFontで使う*/\r
+NAIBU._font = function (data) {\r
+ var doc = data.document, svgns = "http://www.w3.org/2000/svg";\r
+ //getElementByIdは使えないので注意(DOMParserを使った場合、DTDでの指定が必要)\r
+ var font = doc.getElementsByTagNameNS(svgns, "font").item(0);\r
+ var familyName = font.getElementsByTagNameNS(svgns, "font-face").item(0).getAttributeNS(null, "font-family");\r
+ if (familyName && (font.getAttributeNS(null, "id") === data.id)) {\r
+ var textElements = data.docu.getElementsByTagNameNS(svgns, "text");\r
+ for (var i=0,tli=textElements.length;i<tli;++i) {\r
+ var ti = textElements[i], style = data.docu.defaultView.getComputedStyle(ti, '');\r
+ if (style.getPropertyValue("font-family", null).indexOf(familyName) > -1) {\r
+ NAIBU._noie_createFont(ti, font, false);\r
+ }\r
+ }\r
+ }\r
+ doc = data = void 0;\r
+};\r
+NAIBU._noie_createFont = function(/*Element*/ ti, /*Element*/ font, /*boolean*/ isMSIE) {\r
+ var style = ti.ownerDocument.defaultView.getComputedStyle(ti, ''),\r
+ svgns = "http://www.w3.org/2000/svg",\r
+ //isTategakiは縦書きならば真\r
+ isTategaki = ti.getAttributeNS(null, "writing-mode") || ti.parentNode.getAttributeNS(null, "writing-mode"),\r
+ horizOrVert = isTategaki ? "vert-adv-y" : "horiz-adv-x",\r
+ node = ti.firstChild, data, glyphs = font.getElementsByTagNameNS(svgns, "glyph"),\r
+ em = parseFloat(font.getElementsByTagNameNS(svgns, "font-face").item(0).getAttributeNS(null, "units-per-em") || 1000),\r
+ advX = parseFloat( (font.getAttributeNS(null, horizOrVert) || em) ), //字幅の設定\r
+ dx = parseFloat(ti.getAttributeNS(null, "x") || 0),\r
+ dy = parseFloat(ti.getAttributeNS(null, "y") || 0),\r
+ fontSize = parseFloat(style.getPropertyValue("font-size")),\r
+ fe = fontSize / em,\r
+ ds = false, npdlist = ["fill",\r
+ "fill-opacity",\r
+ "stroke",\r
+ "stroke-width",\r
+ "stroke-linecap",\r
+ "stroke-linejoin",\r
+ "stroke-miterlimit",\r
+ "stroke-dasharray",\r
+ "stroke-opacity",\r
+ "opacity",\r
+ "cursor"];\r
+ if (/a/[-1] === 'a') { //Firefoxならば\r
+ ds = true;\r
+ } else if (isMSIE || isTategaki) {\r
+ ds = true;\r
+ }\r
+ if (ds){\r
+ while(node) {\r
+ if (!glyphs) {\r
+ break;\r
+ }\r
+ data = node.data;\r
+ if (data !== void 0) { //dataがある場合\r
+ var advanceX = [], glyphData = [];\r
+ for (var i=0,gli=glyphs.length;i<gli;++i) {\r
+ var glyph = glyphs[i], unicode = glyph.getAttributeNS(null, "unicode") || "なし"; //unicode属性に指定がない場合、処理させないようにする\r
+ var orientation = glyph.getAttributeNS(null, "orientation"), isVert = true, isOrientationAttribute = true;\r
+ if (orientation) {\r
+ if (orientation === "h") {\r
+ isVert = false;\r
+ }\r
+ } else {\r
+ isOrientationAttribute = false;\r
+ }\r
+ if ( (isTategaki && isVert) || !(isTategaki || isVert) || !isOrientationAttribute){\r
+ //indexは該当する文字が何番目にあるかの数字\r
+ var index = data.indexOf(unicode);\r
+ while (index > -1) {\r
+ advanceX[index] = parseFloat(glyph.getAttributeNS(null, horizOrVert) || advX); //字幅を収納\r
+ glyphData[index] = glyph.getAttributeNS(null, "d");\r
+ index = data.indexOf(unicode, index+1);\r
+ }\r
+ }\r
+ }\r
+ for (var i=0,adv=0;i<data.length;++i) {\r
+ if (advanceX[i] !== void 0) { //配列に含まれていれば\r
+ var path = ti.ownerDocument.createElementNS(svgns, "path");\r
+ //advance、すなわち字幅の長さ分、ずらしていく\r
+ var matrix = ti.ownerDocument.documentElement.createSVGMatrix();\r
+ matrix.a = fe;\r
+ matrix.d = -fe;\r
+ for (var j=0;j<npdlist.length;++j){\r
+ var nj = npdlist[j],\r
+ tg = ti.getAttributeNS(null, nj) || style.getPropertyValue(nj);\r
+ if (nj === "stroke-width") {\r
+ tg = style.getPropertyCSSValue(nj).getFloatValue(1) / fe;\r
+ tg += "";\r
+ }\r
+ if (tg) {\r
+ path.setAttributeNS(null, nj, tg);\r
+ }\r
+ }\r
+ if (isTategaki) {\r
+ var y= dy + adv*fe, x = dx;\r
+ if ("、。".indexOf(data.charAt(i)) > -1) { //句読点の場合\r
+ var fms = fontSize / Math.SQRT2;\r
+ x += fms;\r
+ y -= fms;\r
+ fms = void 0;\r
+ }\r
+ matrix.e = x;\r
+ matrix.f = y;\r
+ } else {\r
+ matrix.e = dx + adv*fe;\r
+ matrix.f = dy;\r
+ }\r
+ path.setAttributeNS(null, "transform", "matrix(" +matrix.a+ "," +matrix.b+ "," +matrix.c+ "," +matrix.d+ "," +matrix.e+ "," +matrix.f+ ")");\r
+ path.setAttributeNS(null, "d", glyphData[i]);\r
+ ti.parentNode.insertBefore(path, ti);\r
+ adv += advanceX[i];\r
+ matrix = void 0;\r
+ }\r
+ }\r
+ adv = advanceX = glyphData = void 0;\r
+ } else if ("tspan|a".indexOf(node.localName) > -1){\r
+ NAIBU._noie_createFont(node, font, isMSIE);\r
+ }\r
+ node = node.nextSibling;\r
+ }\r
+ if (isMSIE) {\r
+ var style = ti.ownerDocument.getOverrideStyle(ti, null);\r
+ style.setProperty("visibility", "hidden");\r
+ style = void 0;\r
+ } else {\r
+ ti.setAttributeNS(null, "opacity", "0");\r
+ }\r
+ }\r
+ data = isTategaki = horizOrVert = em = advX = dx = dy = fontSize = style = svgns = node = void 0;\r
+};\r
+\r
+/*以下は、getComputedStyleメソッドで使うために、CSS2Propertiesの_listプロパティに、\r
+ *CSSprimitiveValueのリストを収納している。なお、その際に、writingModeなどはwriting-modeに変更している\r
+ */\r
+(function(){\r
+ var s = new CSSStyleDeclaration(),\r
+ slis = s._list,\r
+ n = 0,\r
+ regAZ = /([A-Z])/,\r
+ regm = /\-/,\r
+ u, t;\r
+ for (var i in CSS2Properties) {\r
+ if(CSS2Properties.hasOwnProperty(i)) {\r
+ t = i.replace(regAZ, "-");\r
+ if (!!RegExp.$1) {\r
+ u = "-" +RegExp.$1.toLowerCase();\r
+ } else {\r
+ u = "-";\r
+ }\r
+ t = t.replace(regm, u);\r
+ s.setProperty(t, CSS2Properties[i]);\r
+ slis[t] = slis[n]; //この処理はCSSモジュールのgetComputedStyleメソッドのため\r
+ slis[n]._isDefault = 1;\r
+ ++n;\r
+ i = t = u = void 0;\r
+ }\r
+ }\r
+ slis._opacity = 1;\r
+ slis._fontSize = 12;\r
+ CSS2Properties._list = slis;\r
+ Document.prototype.defaultView._defaultCSS = slis;\r
+ s = n = regAZ = regm = slis =null;\r
+})();\r
+\r
+NAIBU.addEvent = function(evt,lis){\r
+ if (window.addEventListener) {\r
+ window.addEventListener(evt, lis, false);\r
+ } else if (window.attachEvent) {\r
+ window.attachEvent('on'+evt, lis);\r
+ } else {\r
+ window['on'+evt] = lis;\r
+ }\r
+ //Sieb用\r
+ if (sieb_s) {\r
+ lis();\r
+ }\r
+};\r
+\r
+function unsvgtovml() {\r
+ try {\r
+ if ("stop" in NAIBU) {\r
+ clearInterval(NAIBU.stop);\r
+ }\r
+ window.onscroll = NAIBU.emptyFunction;\r
+ window.detachEvent("onload", NAIBU._main);\r
+ NAIBU.freeArg();\r
+ delete Object._create;\r
+ Element = SVGElement = Attr = NamedNodeMap = CSS2Properties = CSSValue = CSSPrimitiveValue = NAIBU.xmlhttp = Node = Event = NAIBU = STLog = SVGColor = SVGPaint = void 0;\r
+ Array = ActiveXObject = void 0;\r
+ } catch(e) {}\r
+}\r
+/*_main関数\r
+ *一番最初に起動するべき関数 \r
+ */\r
+NAIBU._main = function() {\r
+ var xmlhttp, //XMLHttpオブジェクトを生成\r
+ _doc = document; //documentのエイリアスを作成\r
+ try {\r
+ if (XMLHttpRequest) {\r
+ xmlhttp = false;\r
+ } else {\r
+ xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");\r
+ }\r
+ } catch (e) {\r
+ try {\r
+ xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");\r
+ } catch (E) {\r
+ xmlhttp = false;\r
+ }\r
+ }\r
+ if (!xmlhttp) {\r
+ try {\r
+ xmlhttp = new XMLHttpRequest();\r
+ } catch (e) {\r
+ xmlhttp = false;\r
+ }\r
+ }\r
+ NAIBU.xmlhttp = xmlhttp;\r
+ var nd;\r
+ if (("namespaces" in _doc) && !_doc.namespaces["v"]) {\r
+ try {\r
+ NAIBU.doc = new ActiveXObject("MSXML2.DomDocument");\r
+ } catch (e) {\r
+ \r
+ }\r
+ nd = NAIBU.doc;\r
+ _doc.namespaces.add("v","urn:schemas-microsoft-com:vml");\r
+ _doc.namespaces.add("o","urn:schemas-microsoft-com:office:office");\r
+ var st = _doc.createStyleSheet(),\r
+ vmlUrl = "behavior: url(#default#VML);display: inline-block;} "; //inline-blockはIEのバグ対策\r
+ st.cssText = "v\\:rect{" +vmlUrl+ "v\\:image{" +vmlUrl+ "v\\:fill{" +vmlUrl+ "v\\:stroke{" +vmlUrl+ "o\\:opacity2{" +vmlUrl\r
+ + "dn\\:defs{display:none}"\r
+ + "v\\:group{text-indent:0px;position:relative;width:100%;height:100%;" +vmlUrl\r
+ + "v\\:shape{width:100%;height:100%;" +vmlUrl;\r
+ }\r
+ var ary = _doc.getElementsByTagName("script");\r
+ //全script要素をチェックして、type属性がimage/svg+xmlならば、中身をSVGとして処理する\r
+ for (var i=0; ary[i]; ++i) {\r
+ var ai = ary[i],\r
+ hoge = ai.type;\r
+ if (ai.type === "image/svg+xml") {\r
+ var ait = ai.text;\r
+ if (sieb_s && ait.match(/<svg/)) {\r
+ //ソース内のタグを除去\r
+ ait = ait.replace(/<.+?>/g, "");\r
+ //エンティティを文字に戻す\r
+ ait = ait.replace(/</g, "<").replace(/>/g, ">").replace(/"/g, '"').replace(/&/g, "&");\r
+ }\r
+ if (NAIBU.isMSIE) {\r
+ var gsd = new GetSVGDocument(ai);\r
+ gsd.xmlhttp = {\r
+ readyState : 4,\r
+ status : 200,\r
+ responseText : ait.replace(/\shref=/g, " target='_top' xlink:href=")\r
+ };\r
+ gsd._ca();\r
+ } else {\r
+ var base = location.href.replace(/\/[^\/]+?$/,"/"); //URIの最後尾にあるファイル名は消す。例: /n/sie.js -> /n/\r
+ ait = ait.replace(/\shref=(['"a-z]+?):\/\//g, " target='_top' xlink:href=$1://").replace(/\shref=(.)/g, " target='_top' xlink:href=$1"+base);\r
+ var s = NAIBU.textToSVG(ait,ai.getAttribute("width"),ai.getAttribute("height"));\r
+ ai.parentNode.insertBefore(s,ai);\r
+ }\r
+ ai = ait = void 0;\r
+ }\r
+ hoge = void 0;\r
+ }\r
+ NAIBU.doc = nd;\r
+ nd = ary = void 0;\r
+ if (xmlhttp && NAIBU.isMSIE) {\r
+ if (!!_doc.createElementNS && !!_doc.createElementNS( "http://www.w3.org/2000/svg", "svg").createSVGRect) { //IE9ならば\r
+ } else { //IE6-8ならば\r
+ var ob = _doc.getElementsByTagName("object"),\r
+ s=[],\r
+ t = [],\r
+ _search = function(_ob) {\r
+ var ifr, obi, n,\r
+ w = "width",\r
+ h = "height";\r
+ s || (s = []); //NAIBU._searchで呼ばれたときに必要\r
+ _doc || (_doc = document);\r
+ for (var i=0;_ob[i];++i) {\r
+ obi = _ob[i];\r
+ s[s.length] = new GetSVGDocument(obi);\r
+ ifr = _doc.createElement("iframe");\r
+ ifr.style.cssText = obi.style.cssText;\r
+ ifr.style.background = "black";\r
+ n = obi.getAttribute(w);\r
+ n && ifr.setAttribute(w, n);\r
+ n = obi.getAttribute(h);\r
+ n && ifr.setAttribute(h, n);\r
+ ifr.marginWidth = ifr.marginHeight = "0px"; //このマージン設定がないと、全体がずれてしまう\r
+ ifr.scrolling = "no";\r
+ ifr.frameBorder = "0";\r
+ /*iframe要素を使って、描画のプロセスを分離する\r
+ *したがって、_docはdocumentとは別のオブジェクトとなる\r
+ */\r
+ obi.parentNode.insertBefore(ifr, obi);\r
+ }\r
+ i = obi = ifr = _ob = w = h = void 0;\r
+ return s[s.length-1];\r
+ };\r
+ _search(ob);\r
+ var img = _doc.getElementsByTagName("img"),\r
+ em = _doc.getElementsByTagName("embed");\r
+ for (var i=0,j=0;img[i];++i) {\r
+ /*img要素の処理*/\r
+ if (img[i].getAttribute("src").indexOf(".svg") > -1) { //拡張子があればSVG画像と判断\r
+ t[j] = img[i];\r
+ ++j;\r
+ }\r
+ }\r
+ _search(t);\r
+ _search(em);\r
+ NAIBU._search = _search; //a要素がクリックされたときに使う関数\r
+ ob = em = t = img = _search = void 0;\r
+ for (var i=0;i<s.length;++i) {\r
+ /*あとで変数iが使われるために、次の条件分岐が必要*/\r
+ if (i < s.length-1) {\r
+ s[i]._next = s[i+1]\r
+ }\r
+ }\r
+ if (i > 0) {\r
+ s[0]._init(); //初期化作業を開始\r
+ }\r
+ s = void 0;\r
+ }\r
+ } else {\r
+ var ob = _doc.getElementsByTagName("object");\r
+ for (var i=0;i<ob.length;++i) {\r
+ if (ob[i].contentDocument) {\r
+ NAIBU._fontSearchURI({target:{ownerDocument:ob[i].contentDocument}});\r
+ } else if (ob[i].getSVGDocument) {\r
+ ob[i].getSVGDocument()._docElement.addEventListener("SVGLoad", NAIBU._fontSearchURI, false);\r
+ } else {\r
+ }\r
+ }\r
+ }\r
+ xmlhttp = _doc = void 0;\r
+};\r
+NAIBU.addEvent("load", NAIBU._main);\r
+NAIBU.utf16 = function ( /*string*/ s) {\r
+ return unescape(s);\r
+}\r
+NAIBU.unescapeUTF16 = function ( /*string*/ s) {\r
+ return s.replace(/%u\w\w\w\w/g, NAIBU.utf16);\r
+};\r
+//Text2SVG機能。SVGのソース(文章)をSVG画像に変換できる。\r
+NAIBU.textToSVG = function ( /*string*/ source, /*float*/ w, /*float*/ h) {\r
+ /*Safari3.xでは、DOMParser方式だと、文字が表示されないバグがあるため、\r
+ *dataスキーム方式を採用する\r
+ */\r
+ if (navigator.userAgent.indexOf('WebKit') > -1 || navigator.userAgent.indexOf('Safari') > -1) { //WebKit系ならば\r
+ var data = 'data:image/svg+xml;charset=utf-8,' + NAIBU.unescapeUTF16(escape(source));\r
+ var ob = document.createElement("object");\r
+ ob.setAttribute("data",data);\r
+ ob.setAttribute("width",w);\r
+ ob.setAttribute("height",h);\r
+ ob.setAttribute("type","image/svg+xml");\r
+ return ob;\r
+ } else {\r
+ var doc = (new DOMParser()).parseFromString(source, "text/xml");\r
+ return (document.importNode(doc.documentElement, true));\r
+ }\r
+};\r
+NAIBU.addEvent("unload", unsvgtovml);\r
+//IEならばtrue\r
NAIBU.isMSIE = /*@cc_on!@*/false;
\ No newline at end of file