jui.define("util.svg.element", [], function() {
/**
* @class util.svg.element
* A model class wraps the SVG element
*
* @alias Element
*/
var Element = function() {
var events = [];
this.create = function(type, attr) {
// 퍼블릭 프로퍼티
this.element = document.createElementNS("http://www.w3.org/2000/svg", type);
this.children = [];
this.parent = null;
this.styles = {};
this.attributes = {};
this.order = 0;
// 기본 속성 설정
this.attr(attr);
};
this.each = function(callback) {
if(typeof(callback) != "function") return;
for(var i = 0, len = this.children.length; i < len; i++) {
var self = this.children[i];
callback.apply(self, [ i, self ]);
}
return this.children;
};
this.get = function(index) {
if(this.children[index]) {
return this.children[index];
}
return null;
}
this.index = function(obj) {
for(var i = 0; i < this.children.length; i++) {
if(obj == this.children[i]) {
return i;
}
}
return -1;
}
this.append = function(elem) {
if(elem instanceof Element) {
if (elem.parent) {
elem.remove();
}
this.children.push(elem);
elem.parent = this;
}
return this;
}
this.prepend = function(elem) {
return this.insert(0, elem);
}
this.insert = function(index, elem) {
if(elem.parent) {
elem.remove();
}
this.children.splice(index, 0, elem);
elem.parent = this;
return this;
}
this.remove = function() {
var index = 0,
nChild = [],
pChild = this.parent.children;
for(var i = 0; i < pChild.length; i++) {
if (pChild[i] == this) {
index = i;
break;
}
nChild.push(pChild[i]);
}
this.parent.children = nChild;
return this;
}
this.attr = function(attr) {
if(typeof attr == "undefined" || !attr) return;
if(typeof attr == "string") {
return this.attributes[attr] || this.element.getAttribute(attr);
}
for(var k in attr) {
this.attributes[k] = attr[k];
if(k.indexOf("xlink:") != -1) {
this.element.setAttributeNS("http://www.w3.org/1999/xlink", k, attr[k]);
} else {
this.element.setAttribute(k, attr[k]);
}
}
return this;
}
this.css = function(css) {
var list = [];
for(var k in css) {
this.styles[k] = css[k];
}
for(var k in css) {
list.push(k + ":" + css[k]);
}
this.attr({ style: list.join(";") });
return this;
}
this.html = function(html) { // @deprecated
this.element.innerHTML = html;
return this;
}
this.text = function(text) {
var children = this.element.childNodes;
for(var i = 0; i < children.length; i++) {
this.element.removeChild(children[i]);
}
this.element.appendChild(document.createTextNode(text));
return this;
}
this.on = function(type, handler) {
var callback = function(e) {
if(typeof(handler) == "function") {
handler.call(this, e);
}
}
this.element.addEventListener(type, callback, false);
events.push({ type: type, callback: callback });
return this;
}
this.off = function(type) {
if(!type) {
for (var i = 0, len = events.length; i < len; i++) {
var e = events.shift();
this.element.removeEventListener(e.type, e.callback, false);
}
} else {
var newEvents = [];
for (var i = 0, len = events.length; i < len; i++) {
var e = events[i];
if (e.type != type) {
newEvents.push(e);
} else {
this.element.removeEventListener(e.type, e.callback, false);
}
}
events = newEvents;
}
return this;
}
this.hover = function(overHandler, outHandler) {
var callback1 = function(e) {
if(typeof(overHandler) == "function") {
overHandler.call(this, e);
}
}
var callback2 = function(e) {
if(typeof(outHandler) == "function") {
outHandler.call(this, e);
}
}
this.element.addEventListener("mouseover", callback1, false);
this.element.addEventListener("mouseout", callback2, false);
events.push({ type: "mouseover", callback: callback1 });
events.push({ type: "mouseout", callback: callback2 });
return this;
}
this.size = function() {
var size = { width: 0, height: 0 },
rect = this.element.getBoundingClientRect();
if(!rect || (rect.width == 0 && rect.height == 0)) {
var height_list = [ "height", "paddingTop", "paddingBottom", "borderTopWidth", "borderBottomWidth" ],
width_list = [ "width", "paddingLeft", "paddingRight", "borderLeftWidth", "borderRightWidth" ];
var computedStyle = window.getComputedStyle(this.element);
for (var i = 0; i < height_list.length; i++) {
size.height += parseFloat(computedStyle[height_list[i]]);
}
for (var i = 0; i < width_list.length; i++) {
size.width += parseFloat(computedStyle[width_list[i]]);
}
size.width = size.width || this.element.getAttribute('width');
size.height = size.height || this.element.getAttribute('height');
} else {
size.width = rect.width;
size.height = rect.height;
}
if(isNaN(size.width)) size.width = 0;
if(isNaN(size.height)) size.height = 0;
return size;
}
this.is = function(moduleId) {
return this instanceof jui.include(moduleId);
}
}
return Element;
});