/* * === Cross Browser Class === * IE4, IE5, IE5.5, IE6, IE6sp2 * NN4.78, NS6, NS7 * Opera7 * * updated 2003/07/20 * * mail : peace@skipup.com * home : http://www.skipup.com/~peace/ */ /** * HTMLElementを汎用的に操作可能にする. * * 属性 * String id HTMLElementのID. * Object layer HTMLElement. * Object style HTMLElementのStyleオブジェクト. * NNの場合,layerプロパティと同じ */ function class__JElement__(window) { var classId = Object.getClassName(arguments.callee); var document = window.document; var BW = new JClient(window); var nn = BW.nn; var ie = BW.ie; var gk = BW.gk; var op = BW.op; var dom = BW.dom; var $listeners = Object.privateId(); function errorMessage(message) { if (location.protocol != "file:") return; alert(message); } /** * String toHex(number n) */ function toHex(p) { p = parseInt(p); return p <= 0x00 ? "00" : (p < 0x10 ? '0' + p.toString(16) : (p <= 0xff ? p.toString(16) : "ff")); } /** * エレメントを取得. * HTMLElement getLayer(String id) * @param id HTMLElementのid属性.name属性ではないことに注意. * @return idの付いたエレメントが * 見つからないとき,null. */ function getLayer(id) { if (ie) { var e = document.all[id]; return e !== void 0 ? e : null; } else if (nn) { var e = function(ls, id) { for (var i = 0, n = ls.length; i < n; i++) { if (ls[i].name == id) { return ls[i]; } else if (ls[i].document.layers.length != 0) { var l = arguments.callee( ls[i].document.layers, id); if (l != null) return l; } } return null; }(document.layers, id); return e; } else if (dom) { return document.getElementById(id); } else { return null; } } var user_create_element_number = 0; /** * コンストラクタ * JElement(String id) * JElement(HTMLElement layer) * JElement(JElement element) */ var F = window[classId] = function(p) { if (this.constructor !== F) this.constructor = F; switch ((typeof p).charAt(0)) { case 's' : this.id = p; this.layer = getLayer(this.id); break; case 'o' : if (p === null) break; if (p.constructor === F) { // JElement this.id = p.id; this.layer = p.layer; this.style = p.xtyle; return; } else { // Layer this.id = p.id !== void 0 ? p.id : p.name; this.layer = p; } break; } if (Boolean(this.layer)) { this.style = this.layer.style !== void 0 ? this.layer.style : this.layer; } else { // $ERROR$ errorMessage( "Error@" + classId + "\n\nAn element(id=[" + this.id + "]) can\'t be acquired."); } }; var FP = F.prototype; F.zIndex = 0; /** * レイヤーの生成. * ページ読み込み完了後は動的に生成する. * 生成されたレイヤー(JElement)は不可視の状態になっている. */ F.createInstance = function() { var id = "_js_layer_" + user_create_element_number++; var s = "position:absolute;" + ("left:0px;top:0px;z-index:" + F.zIndex + ";") + "width:0px;height:0px;" + "visibility:hidden;"; if (window.isLoaded !== void 0 && window.isLoaded()) { var layer = null; if (ie) { document.body.insertAdjacentHTML( "BeforeEnd", ("
<\/div>") + (BW.mac ? ' ' : '')); layer = document.all[id]; } else if (dom) { layer = document.createElement("div"); layer.setAttribute("id", id); layer.setAttribute("style", s); document.body.appendChild(layer); } else if (nn) { layer = new Layer(0); layer.zIndex = F.zIndex; } return new F(layer); } else { document.writeln( "
"); return new F(id); } }; /** * ドキュメント全体のid属性のついたHTML要素を全て取得する. * 使用例) * var elements = new Object(); * getAllElements(elements); * 又は * var elements = getAllElements(new Object()); * 取得後のElementの参照方法(eはJElement型). * var e = elements["myID"]; * * Object getAllElements(final Object ELEMENTS); * @param ELEMENTS HTML要素を格納するオブジェクト. * 返り値はこの引数の参照となることに注意. * @return Object id属性付き全HTML要素を内容とするObject. * 取得後はHTML要素をidの連想配列として参照できる. * 引数ELEMENTSの参照であることに注意. */ F.getAllElements = function(ELEMENTS) { if (ELEMENTS === null || ELEMENTS.constructor !== Object) return ELEMENTS; ELEMENTS.length = 0; // lengthプロパティの追加 if (ie) { for (var id in document.all) { var l = document.all[id]; if (typeof l == "object" && Boolean(l.id)) { ELEMENTS[l.id] = new JElement(l); ELEMENTS.length++; } } return ELEMENTS; } else if (nn) { return function(ls, ES) { for (var i = 0, n = ls.length; i < n; i++) { var l = ls[i]; if (l.name !== "") { ES[l.name] = new JElement(l); ES.length++; if (l.document.layers.length != 0) ES = arguments.callee(l.document.layers, ES); } } return ES; }(document.layers, ELEMENTS); } else if (dom) { var PATTERN = new RegExp(""); PATTERN.compile("\\[object HTML\\w*Element\\]"); return function(cs, ES) { for (var i = 0, n = cs.length; i < n; i++) { var c = cs[i]; if (c.toString().match(PATTERN) != null && c.id !== "") { ES[c.id] = new JElement(c); ES.length++; if (c.childNodes.length != 0) ES = arguments.callee(c.childNodes, ES); } } return ES; }(document.body.childNodes, ELEMENTS); } return ELEMENTS; }; /** * String f() */ FP.getId = function() { return this.id; }; /** * HTMLElement f() */ FP.getLayer = function() { return this.layer; }; /** * フラットなレイヤーにする. * void toLaserElement() */ FP.toLaserElement = function() { if (this.layer.style === void 0) return; var s = this.style; s.fontSize = 0 + "px"; s.padding = 0 +"px"; s.margin = 0 + "px"; }; /** * 可視属性設定. * void setVisibility(boolean visibility) */ FP.setVisibility = function(v) { if (ie || dom) this.style.visibility = v ? "visible" : "hidden"; else if (nn) this.layer.visibility = v ? "inherit" : "hide"; }; /** * 可視属性取得. * boolean getVisibility() */ FP.getVisibility = function() { var v = this.style.visibility; return v == "visible" || v == "inherit" || v == "show"; }; /** * void setBackgroundColor(NegativeObject no) * 透過色に設定. * * void setBackgroundColor(String htmlColor) * void setBackgroundColor(JColor color) */ FP.setBackgroundColor = function(v) { var c = ""; if (Boolean(v)) { if (typeof v == "string") c = v.charAt(0) != '#' ? "#" + v : v; else c = v.toHtmlColor(); } else c = BW.getTransparency(); if (ie || dom) this.style.backgroundColor = c; else if (nn) this.layer.bgColor = c; }; /** * 16進法6桁の色文字列の桁合わせに使用する. */ var ZEROS = new Array("", "0", "00", "000", "0000", "00000", "000000"); /** * 背景色の取得. * String getBackgroundColor() * @return 背景色を16進法6桁の文字列で返す. * 透過色又は未設定の場合,null. */ FP.getBackgroundColor = function() { var c = ie || dom ? this.style.backgroundColor : (nn ? this.layer.bgColor : ""); if (!Boolean(c) && (nn && c !== 0)) return null; if (gk) { var v = c.substring(4, c.length - 1).split(','); return toHex(v[0]) + "" + toHex(v[1]) + "" + toHex(v[2]); } else if (ie || dom) { return c.substring(1); } else if (nn) { var t = c.toString(16); return ZEROS[6 - t.length] + t; } return "000000"; }; /** * void setBackgroundImage(String uri) * イメージまでの(絶対又は相対)パスを指定. * * void setBackgroundImage(Image img) * * void setBackgroundImage(NegativeObject none) */ FP.setBackgroundImage = function(v) { var p = Boolean(v) ? (typeof v == "string" ? v : v.src) : ""; if (ie || dom) this.style.backgroundImage = Boolean(p) ? "url(" + p + ")" : ""; else if (nn) this.style.background.src = Boolean(p) ? p : null; }; /** * 背景画像の絶対パス(文字列)を返す. * String getBackgroundImage() * @return 取得出来なかった場合,null. */ FP.getBackgroundImage = function() { if (ie || dom) { var v = this.style.backgroundImage; if (Boolean(v)) { var p = v.substring(4, v.length - 1); if (ie) { var r = new Image(); r.src = p; p = r.src; r.src = null; r = null; } return p; } return null; } else if (nn) { return this.layer.background.src; } return null; }; /** * void initPosition() */ FP.initPosition = function() { if (ie || op) { this.style.pixelLeft = this.layer.offsetLeft; this.style.pixelTop = this.layer.offsetTop; } else if (dom) { this.style.left = this.layer.offsetLeft + "px"; this.style.top = this.layer.offsetTop + "px"; } }; /** * void setX(number l) */ FP.setX = function(l) { if (ie || op) this.style.pixelLeft = l; else if (dom) this.style.left = l + "px"; else if (nn) this.layer.left = l; }; /** * void setY(number t) */ FP.setY = function(t) { if (ie || op) this.style.pixelTop = t; else if (dom) this.style.top = t + "px"; else if (nn) this.layer.top = t; }; /** * void setZ() * デフォルト値(クラスフィールド:zIndex)に設定. * * void setZ(int zIndex) */ FP.setZ = function(d) { this.style.zIndex = d === void 0 ? F.zIndex : d; }; /** * void setPosition(Point p) * void setPosition(number x, number y) */ FP.setPosition = function() { var l, t; var a = arguments; switch (a.length) { case 1 : l = a[0].x; t = a[0].y; break; case 2 : l = a[0]; t = a[1]; break; default : return; } if (ie || op) { this.style.pixelLeft = l; this.style.pixelTop = t; } else if (dom) { this.style.left = l + "px"; this.style.top = t + "px"; } else if (nn) { this.layer.moveTo(l, t); } }; /** * void setPoint(Point3 p); * void setPoint(number x, number y, number z); */ FP.setPoint = function() { var l, t, d; var a = arguments; switch (a.length) { case 1 : l = a[0].x; t = a[0].y; d = a[0].z; break; case 3 : l = a[0]; t = a[1]; d = a[2]; break; } var s = this.style; if (ie || op) { s.pixelLeft = l; s.pixelTop = t; } else if (dom) { s.left = l + "px"; s.top = t + "px"; } else if (nn) { s.moveTo(l, t); } s.zIndex = d; }; /** * int getX() */ FP.getX = function() { if (ie || op) return this.style.pixelLeft; else if (dom) return parseInt(this.style.left); else if (nn) return this.layer.left; return 0; }; /** * int getY() */ FP.getY = function() { if (ie || op) return this.style.pixelTop; else if (dom) return parseInt(this.style.top); else if (nn) return this.layer.top; return 0; }; /** * int getZ() */ FP.getZ = function() { return this.style.zIndex; }; /** * Point getPosition() */ FP.getPosition = function() { if (ie || op) return new Point(this.style.pixelLeft, this.style.pixelTop); else if (dom) return new Point( parseInt(this.style.left), parseInt(this.style.top)); else if (nn) return new Point(this.layer.left, this.layer.top); return new Point(); }; /** * Point3 getPoint() */ FP.getPoint = function() { var s = this.style; if (ie || op) return new Point3(s.pixelLeft, s.pixelTop, s.zIndex); else if (dom) return new Point3(parseInt(s.left), parseInt(s.top), s.zIndex); else if (nn) return new Point3(s.left, s.top, s.zIndex); return new Point3(); }; /** * void moveForward(JElement e) */ FP.moveForward = function(e) { this.setZ(e.getZ() + 1); }; /** * void moveBackward(JElement e) */ FP.moveBackward = function(e) { this.setZ(e.getZ() - 1); }; /** * void initSize() */ FP.initSize = function() { if (ie || op) { this.style.pixelWidth = this.layer.offsetWidth; this.style.pixelHeight = this.layer.offsetHeight; } else if (dom) { this.style.width = this.layer.offsetWidth + "px"; this.style.height = this.layer.offsetHeight + "px"; } }; /** * void setWidth(number w) */ FP.setWidth = function(w) { if (ie || op) this.style.pixelWidth = w; else if (dom) this.style.width = w + "px"; else if (nn) this.layer.clip.width = w; }; /** * void setHeight(number h) */ FP.setHeight = function(h) { if (ie || op) this.style.pixelHeight = h; else if (dom) this.style.height = h + "px"; else if (nn) this.layer.clip.height = h; }; /** * void setSize(Dimension size) * void setSize(number w, number h) */ FP.setSize = function() { var w, h; var a = arguments; switch (a.length) { case 1 : w = a[0].width; h = a[0].height; break; case 2 : w = a[0]; h = a[1]; break; } if (ie || op) { this.style.pixelWidth = w; this.style.pixelHeight = h; } else if (dom) { this.style.width = w + "px"; this.style.height = h + "px"; } else if (nn) this.layer.resizeTo(w, h); }; /** * int f() */ FP.getWidth = function() { if (ie || op) return this.style.pixelWidth; else if (dom) return parseInt(this.style.width); else if (nn) return this.layer.clip.width; return 0; }; /** * int f() */ FP.getHeight = function() { if (ie || op) return this.style.pixelHeight; else if (dom) return parseInt(this.style.height); else if (nn) return this.layer.clip.height; return 0; }; /** * Dimension getSize() */ FP.getSize = function() { if (ie || op) return new Dimension( this.style.pixelWidth, this.style.pixelHeight); else if (dom) return new Dimension( parseInt(this.style.width), parseInt(this.style.height)); else if (nn) return new Dimension( this.layer.clip.width, this.layer.clip.height); return new Dimension(); }; /** * void setTrim() * void setTrim(number[] ltrb) * void setTrim(Rectangle area) * void setTrim(Point lt, Point rb) * void setTrim(number l, number t, number r, number b) */ FP.setTrim = function() { var l, t, r, b; var a = arguments; switch (a.length) { case 0 : l = t = r = b = 0; break; case 1 : var p = a[0]; if (p.constructor === Array) { l = p[0]; t = p[1]; r = p[2]; b = p[3]; } else { l = p.x; t = p.y; r = l + p.width; b = t + p.height; } break; case 2 : l = a[0].x; t = a[0].y; r = a[1].x; b = a[1].y; break; case 4 : l = a[0]; t = a[1]; r = a[2]; b = a[3]; break; } if (ie || dom) { this.style.clip = "rect(" + t + " " + r + " " + b + " " + l + ")"; } else if (nn) { var c = this.layer.clip; c.left = l; c.top = t; c.right = r; c.bottom = b; } }; var TRIM_CORNER_SYMBOLS; { var S = TRIM_CORNER_SYMBOLS = new Object(); S["L"] = S["l"] = 0; S["T"] = S["t"] = 1; S["R"] = S["r"] = 2; S["B"] = S["b"] = 3; } /** * int[] getTrim() * int getTrim(char ltrb) */ FP.getTrim = function() { var a = arguments; switch (a.length) { case 0 : if (ie || dom) { var v = this.style.clip; var r = v.substring(5, v.length - 1).split(" "); return new Array( parseInt(r[3]), parseInt(r[0]), parseInt(r[1]), parseInt(r[2])); } else if (nn) { var c = this.style.clip; return new Array(c.left, c.top, c.right, c.bottom); } case 1 : return this.getTrim()[TRIM_CORNER_SYMBOLS[a[0]]]; } return null; }; /** * HTMLImageElement[] f() */ FP.getImages = function() { return BW.getElementsByTagName("img", this.layer); }; /** * HTMLImageElement f(String id) */ FP.getImage = function(id) { if (ie) { var image = document.images[id]; if (image !== void 0) return image; } else if (nn) { return this.layer.document.images[id]; } if (dom) { var image = document.getElementById(id); if (image !== null) return image; var images = document.getElementsByName(id); if (images.length != 0) return images[0]; } return null; }; /** * HTMLLinkElement[] f() */ FP.getLinks = function() { return BW.getElementsByTagName("a", this.layer); }; /** * void f() * void f(String body) */ FP.setBody = function(t) { if (t === void 0) t = ""; if (ie || dom) this.layer.innerHTML = t; else if (nn) { var d = this.layer.document; d.open("text/html", "replace"); d.write(t); d.close(); } }; /** * void f(String uri) */ FP.loadFile = function(p) { if (ie || dom) this.layer.innerHTML = ("<"+"iframe") + (" src=\"" + p + "\"") + " scrolling=\"no\" frameBorder=\"no\"" + " style=\"width:100%;height:100%;margin:0px;padding:0px;\"" +"><\/iframe>"; else if (nn) this.layer.src = p; }; /** * void f(String type, function listener) */ FP.setEventListener = function(t, l) { t = t.toLowerCase(); if (gk && t == "dblclick") { this.layer.addEventListener(t, l, true); } else { if (nn) { this.layer.document.captureEvents(Event[t.toUpperCase()]); this.layer.document["on" + t] = l; } this.layer["on" + t] = l; } }; /** * void f(String type); * void f(String type, function listener_dblclick); */ FP.clearEventListener = function(t) { t = t.toLowerCase(); if (gk && t == "dblclick") { this.layer.addEventListener(t, arguments[1], true); } else { if (nn) this.layer.document["on" + t] = null; this.layer["on" + t] = null; } }; /** * void f(String type, function listener) */ FP.addEventListener = function(t, l) { if (this[$listeners] === void 0) { this[$listeners] = new Object(); this[$listeners].listener = function(t) { var cp = this; return function(e) { for (var i = 0; i < cp[t].length; i++) if (Boolean(cp[t][i])) cp[t][i](e); }; }; } t = t.toLowerCase(); var listeners = this[$listeners]; if (listeners[t] === void 0) listeners[t] = new Array(); if (gk && t == "dblclick") this.layer.addEventListener(t, l, true); else { if (nn) { this.layer.document.captureEvents(Event[t.toUpperCase()]); this.layer.document["on" + t] = listeners.listener(t); } this.layer["on" + t] = listeners.listener(t); listeners[t][listeners[t].length] = l; } }; /** * boolean f(String type, function listener) * boolean f(String type, int index) */ FP.removeEventListener = function(t, l) { if (this[$listeners] === void 0) return false; t = t.toLowerCase(); var listeners = this[$listeners]; if (gk && t == "dblclick") return this.layer.removeEventListener(t, l, true); else { if (typeof l != "number") { for (var i = 0; i < listeners[t].length; i++) { if (listeners[t][i] === l) { listeners[t][i] = null; return true; } } return false; } else return Boolean(listeners[t][l]) ? this.removeEventListener(t, listeners[t][l]) : false; } }; var CORNER_SYMBOLS; { var S = CORNER_SYMBOLS = new Object(); S["$TL"] = S["$UL"] = 0; S["$TR"] = S["$UR"] = 1; S["$BL"] = S["$LL"] = 2; S["$BR"] = S["$LR"] = 3; for (var corner in S) { if (corner.charAt(0) != '$') continue; var C0 = corner.charAt(1), C1 = corner.charAt(2); var c0 = C0.toLowerCase(), c1 = C0.toLowerCase(); S["$" + C1 + C0] = S["$" + c0 + c1] = S["$" + c1 + c0] = S[corner]; } } /** * void setCornerPosition(String corner, Point p) */ FP.setCornerPosition = function(t, p) { var x = p.x, y = p.y; switch (CORNER_SYMBOLS["$" + t]) { case 0 : // Upper-Left this.setPosition(x, y); return; case 1 : // Upper-Right this.setPosition(x - this.getWidth(), y); return; case 2 : // Lower-Left this.setPosition(x, y - this.getHeight()); return; case 3 : // Lower-Right var d = this.getSize(); this.setPosition(x - d.x, y - d.y); return; default : // $ERROR$ errorMessage( "IllegalArguments@" + classId + "#setCornerPosition\n" + "arguments[0] = " + t); return; } }; /** * void setCenterPosition(Point p) */ FP.setCenterPosition = function(p) { var s = this.getSize(); this.setPosition(p.x - s.width / 2, p.y - s.height / 2); }; /** * void setCenterPoint(Point3 p) */ FP.setCenterPoint = function(p) { var s = this.getSize(); this.setPosition(p.x - s.width / 2, p.y - s.height / 2, p.z); }; /** * Point getCornerPosition(String corner) */ FP.getCornerPosition = function(t) { var p = this.getPosition(); switch (CORNER_SYMBOLS["$" + t]) { case 0 : // Upper-Left return p; case 1 : // Upper-Right p.x += this.getWidth(); return p; case 2 : // Lower-Left p.y += this.getHeight(); return p; case 3 : // Lower-Right var s = this.getSize(); p.x += s.width; p.y += s.height; return p; default : // $ERROR$ errorMessage( "IllegalArguments@" + classId + "#getCornerPosition\n" + "arguments[0] = " + t); return null; } }; /** * Point getCenterPosition() */ FP.getCenterPosition = function() { var p = this.getPosition(); var s = this.getSize(); p.x += s.width * 0.5; p.y += s.height * 0.5; return p; }; /** * boolean equals(Object e) */ FP.equals = function(e) { if (e == null || e.constructor !== F) return false; return this.layer === e.layer && this.style === e.style; }; /** * String toString() */ FP.toString = function() { return classId + " : " + this.id; }; /** * String paramString() */ FP.paramString = function() { var t = "id\t" + this.id + "\n" + "width\t" + this.getWidth() + "\n"; + "height\t" + this.getHeight() + "\n"; + "x\t" + this.getX() + "\n"; + "y\t" + this.getY() + "\n"; + "z\t" + this.getZ() + "\n"; + "visibility\t" + this.getVisibility() + "\n"; + "clip\t" + this.getTrim(); return t; }; } class__JElement__(window);