SchmapKit = {Base:{},DOM: {}};
SchmapKit.Base.NAME = "SchmapKit.Base";
SchmapKit.Base.VERSION = "0.1";
SchmapKit.Base.__repr__ = function () {
    return "[" + this.NAME + " " + this.VERSION + "]";
};
SchmapKit.Base.toString = function () {
    return this.__repr__();
};
SchmapKit.Base.clone = function (obj) {
        var me = arguments.callee;
        if (arguments.length == 1) {
            me.prototype = obj;
            return new me();
        }
};
SchmapKit.Base.map = function (fn, lst) {
	var m = SchmapKit.Base;
	if (arguments.length <= 2) {
		var rval = [];
		for (var i = 0; i < lst.length; i++) {
			rval.push(fn(lst[i]));
		}
		return rval;
	}
}
SchmapKit.init = function () {
    this.DOM.init();
};
SchmapKit.Base.objToArray =  function (self, obj,skip) {
	if (!skip) {
		skip = 0;
	}
	if (obj) {
			var l = obj.length;
		 if (!self) {
			self = [];
		}
		for (var i = skip; i < l; i++) {
			self.push(obj[i]);
		}
	}
	return self;
};

SchmapKit.Base.updatetree = function (self, obj/*, ...*/) {
	if (self === null || self === undefined) {
		self = {};
	}
	for (var i = 1; i < arguments.length; i++) {
		var o = arguments[i];
		if (typeof(o) != 'undefined' && o !== null) {
			for (var k in o) {
				var v = o[k];
				if (typeof(self[k]) == 'object' && typeof(v) == 'object') {
					arguments.callee(self[k], v);
				} else {
					self[k] = v;
				}
			}
		}
	}
	return self;
};
SchmapKit.DOM.init = function(name){
    var __tmpElement = document.createElement("span");
     var attributeArray ={};
    if (__tmpElement && __tmpElement.attributes &&
                __tmpElement.attributes.length > 0) {
            attributeArray.compliant = false;
            attributeArray.renames = {
                "class": "className",
                "checked": "defaultChecked",
                "usemap": "useMap",
                "for": "htmlFor",
                "readonly": "readOnly",
                "colspan": "colSpan",
                "bgcolor": "bgColor",
                "cellspacing": "cellSpacing",
                "cellpadding": "cellPadding"
            };
    } else {
            attributeArray.compliant = true;
            attributeArray.renames = {};
    }
	this.attributeArray = attributeArray;
	var DOMfunNames = ['DIV','A','SPAN', 'IMG'];
	for(var i = 0; i < DOMfunNames.length; i++){
        var name = DOMfunNames[i];
	    this[name] = this.makeDomfun(name);
	}
}

SchmapKit.DOM.makeDomfun = function(name){
    this.name = name;
	this.c = function (attrs/*, nodes... */) {
	    var self = SchmapKit.DOM;
    	var elem;
                elem = document.createElement(name);
        if (attrs) {
            self.updateNodeAttributes(elem, attrs);
        }
        if (arguments.length <= 2) {
            var isTwo = true;
        }  
		var args = SchmapKit.Base.objToArray([], arguments,1);
		for(var i = 0; i < args.length; i++){
			var node = args[i]
			if(typeof(node) == 'string'){
			   if(isTwo){
				   elem.innerHTML = node;
				   }else {
			   elem.appendChild(document.createTextNode(node))
			   }
			} else {
			   elem.appendChild(node);
			}
		}
		return elem;
    }
	return this.c
}
SchmapKit.DOM.updateNodeAttributes = function (node, attrs) {
        var elem = node;
        var self = SchmapKit.DOM;
        if (typeof(node) == 'string') {
            elem = self.getElement(node);
        }
        if (attrs) {
            var updatetree = SchmapKit.Base.updatetree;
            if (self.attributeArray.compliant) {
                for (var k in attrs) {
                    var v = attrs[k];
                    if (typeof(v) == 'object' && typeof(elem[k]) == 'object') {
                        updatetree(elem[k], v);
                    } else if (k.substring(0, 2) == "on") {
                        if (typeof(v) == "string") {
                            v = new Function(v);
                        }
                        elem[k] = v;
                    } else {
                        elem.setAttribute(k, v);
                    }
                    if (typeof(elem[k]) == "string" && elem[k] != v) {
                        elem[k] = v;
                    }
                }
            } else {
                var renames = self.attributeArray.renames;
                for (var k in attrs) {
                    v = attrs[k];
                    var renamed = renames[k];
                    if (k == "style" && typeof(v) == "string") {
                        elem.style.cssText = v;
                    } else if (typeof(renamed) == "string") {
                        elem[renamed] = v;
                    } else if (typeof(elem[k]) == 'object'
                            && typeof(v) == 'object') {
                            updatetree(elem[k], v);
                    } else if (k.substring(0, 2) == "on") {
                        if (typeof(v) == "string") {
                            v = new Function(v);
                        }
                        elem[k] = v;
                    } else {
                        elem.setAttribute(k, v);
                    }
                    if (typeof(elem[k]) == "string" && elem[k] != v) {
                        elem[k] = v;
                    }
                }
            }
        }
        return elem;
    }
SchmapKit.DOM.getElement = function (id) {
   return typeof(id) == 'string' ? document.getElementById(id) : id;
}
SchmapKit.DOM.Coordinates = function (x,y) {
   this.x = x;
   this.y = y;
}
SchmapKit.DOM.Dimensions = function (w,h) {
   this.w = w;
   this.h = h;
}
SchmapKit.DOM.getElementDimensions = function (elem) {
    originalWidth = elem.offsetWidth || 0;
    originalHeight = elem.offsetHeight || 0;
	return {w:originalWidth, h: originalHeight}
}
SchmapKit.DOM.setElementDimensions =function (elem, newSize/* optional */, units) {
        elem = SchmapKit.DOM.getElement(elem);
        if (typeof(units) == 'undefined') {
            units = 'px';
        }
        var newStyle = {};
            newStyle['width'] = newSize.w + units;
			newStyle['height'] = newSize.h + units;
        SchmapKit.DOM.updateNodeAttributes(elem, {'style': newStyle});
    }
SchmapKit.DOM.getElementPosition = function (elem, /* optional */relativeTo) {
        var dom = SchmapKit.DOM;
        if (typeof(elem) == "string") {
            elem = dom.getElement(elem);
        }
        var c = {x: 0, y: 0};
        var box = null;
        var parent = null;

        var d = document;
        var de = d.documentElement;
        var b = d.body;

        if (!elem.parentNode && elem.x && elem.y) {
            c.x += elem.x || 0;
            c.y += elem.y || 0;
        } else if (elem.getBoundingClientRect) { // IE shortcut
            box = elem.getBoundingClientRect();
            c.x += box.left +
                (de.scrollLeft || b.scrollLeft) -
                (de.clientLeft || 0);
            c.y += box.top +
                (de.scrollTop || b.scrollTop) -
                (de.clientTop || 0);
        } else if (elem.offsetParent) {
            c.x += elem.offsetLeft;
            c.y += elem.offsetTop;
            parent = elem.offsetParent;
            if (parent != elem) {
                while (parent) {
                    c.x += parseInt(parent.style.borderLeftWidth) || 0;
                    c.y += parseInt(parent.style.borderTopWidth) || 0;
                    c.x += parent.offsetLeft;
                    c.y += parent.offsetTop;
                    parent = parent.offsetParent;
                }
            }
            }
        if (relativeTo) {
            relativeTo = arguments.callee(relativeTo);
            if (relativeTo) {
                c.x -= (relativeTo.x || 0);
                c.y -= (relativeTo.y || 0);
            }
        }
        return c;
}
SchmapKit.DOM.setElementPosition = function (elem, newPos) {
	var elem = SchmapKit.DOM.getElement(elem);
	var newStyle = {};
	var units = 'px';
	newStyle['left'] = newPos.x + units;
	newStyle['top'] = newPos.y + units;
	SchmapKit.DOM.updateNodeAttributes(elem, {'style': newStyle});
}
SchmapKit.DOM.setStyle = function (elem, style) {
	elem = SchmapKit.DOM.getElement(elem);
	for (var name in style) {
		switch (name) {
		case 'opacity':
			SchmapKit.Style.setOpacity(elem, style[name]);
			break;
		case 'float':
		case 'cssFloat':
		case 'styleFloat':
			if (typeof(elem.style["float"]) != "undefined") {
				elem.style["float"] = style[name];
			} else if (typeof(elem.style.cssFloat) != "undefined") {
				elem.style.cssFloat = style[name];
			} else {
				elem.style.styleFloat = style[name];
			}
			break;
		default:
			elem.style[name] = style[name];
		}
	}
};
SchmapKit.init();
