function DomTools() {
    
}


DomTools.isIE = function () {
	return false;
}
/*@cc_on @*/
/*@if (@_jscript_version >= 1)
	DomTools.isIE = function () {
	    return true;
	}
@end @*/

DomTools.isKHTML = function () {
	return false;
}

if (/Konqueror|Safari|KHTML/.test(navigator.userAgent)) {
	DomTools.isKHTML = function () {
		return true;
	}
}


DomTools.getBody = function() {
    var doc = document;
    
    if (arguments.length > 1) {
        doc = arguments[1];
    }
    
    var nl = doc.getElementsByTagName('body');
    
    if (nl.length < 1) {
        return null;
    }
    
    return nl[0];
}


DomTools.getHead = function() {
    var doc = document;
    
    if (arguments.length > 1) {
        doc = arguments[1];
    }
    
    var nl = doc.getElementsByTagName('head');
    
    if (nl.length < 1) {
        return null;
    }
    
    return nl[0];
}

DomTools.getElementsByClassName = function (className) {
    var children = document.getElementsByTagName('*') || document.all;
    var elements = new Array();
    
    var child = null;
    
    for (var i = 0; i < children.length; i++) {
        child = children[i];
        
        if (child.className.findWord(className) != true) {
            continue;
        }
        DomTools.addHelpers(child);
        elements.push(child);
        
    }

    return elements;
}
/*
DomTools.getPosition = function (node) {
    DomTools.msg('DomTools.getPosition('+node.nodeName+')');
    
    var result = new Point2D(node.offsetLeft, node.offsetTop);
    
    var parent = new Point2D(0, 0);
    
    
    if (node.parentNode) {
        parent = DomTools.getPosition(node.parentNode);
    }
    
    
    //if (anElement.nodeName.toUpperCase() == 'FORM') {
    //    elementLeft=0;
    //    elementTop=0;
    //}
    
    result.x = result.x + parent.x;
    result.y = result.y + parent.y;
    
    return result;
}
*/
DomTools.getPositionX = function (node) {
    var result = 0;
    
    if (node.offsetParent) {
        while (node.offsetParent) {
            result += Number.parse.integer(node.offsetLeft, 0);
            
            
            node = node.offsetParent;
        }
        
    } else if (node.x) {
        result += Number.parse.integer(node.x, 0);
    }
    
    return result;
}

DomTools.getPositionY = function (node) {
    var result = 0;
    
    if (node.offsetParent) {
        while (node.offsetParent) {
            result += Number.parse.integer(node.offsetTop, 10);
            
            node = node.offsetParent;
        }
    } else if (node.y) {
        result += Number.parse.integer(node.y, 10);
    }
    
    return result;
}



DomTools.getPosition = function (node) {
    
    var result = new Point2D();
    result.x = DomTools.getPositionX(node);
    result.y = DomTools.getPositionY(node);
    
    return result;
}
/*
DomTools.getPosition = function (node) {
    var result = new Point2D(node.offsetLeft, node.offsetTop);
    var scroll = new Point2D();
    
    var parent = new Point2D();
    
    
    if (node.parentNode) {
        parent = DomTools.getPosition(node.parentNode);
    }
    
    return result;
    
    //if (anElement.nodeName.toUpperCase() == 'FORM') {
    //    elementLeft=0;
    //    elementTop=0;
    //}
    
    if (node.scrollTop) {
        scroll.y = Number.parse.integer(node.scrollTop, 10);
    }
    if (node.scrollLeft) {
        scroll.y = Number.parse.integer(node.scrollLeft, 10);
    }
    
    result.x = result.x + parent.x - scroll.x;
    result.y = result.y + parent.y - scroll.y;
    
    
    return result;
}
*/
DomTools.getBounds = function (node) {
    var position = DomTools.getPosition(node);
    
    
    var result = new Rectangle2D();
    result.setTopLeft(position);
    
    result.width = node.offsetWidth;
    result.height = node.offsetHeight;
    
    return result;
}



DomTools.getMyStyle = function(node, styleProp) {
    if (!node.style) {
        DomTools.msg('DomTools.getMyStyle(node, '+styleProp+')');
        return null;
    }
    
    var result = null;
    
    if (node.currentStyle) {
        result = node.currentStyle[styleProp.normalizeCodeVariable()];
    
    } else if (document.defaultView && document.defaultView.getComputedStyle) {
        result = document.defaultView.getComputedStyle(node, null).getPropertyValue(styleProp);
        
    } else if (window.getComputedStyle) {
        result = window.getComputedStyle(node, null).getPropertyValue(styleProp);
        
    }
    
    
    if (window.opera
            && (-1 < ['left', 'top', 'right', 'bottom'].indexOf(styleProp))
            && (DomTools.getStyle(node, 'position') == 'static')) {
        result = null;
    }
    
    if (result == null) {
        return null;
    }
    
    return (result == 'auto') ? null : result;
}

DomTools.addEventHelpers = function (obj) {
    if (obj.appendMyEvent) {
        return true;
    }
    
    obj.appendMyEvent = function (eventWithoutOn, functionDef) {
            if (this.addEventListener) {
                this.addEventListener(eventWithoutOn, functionDef, false);
                return true;
            }
            
            if (this.attachEvent) {
                this.attachEvent("on" + eventWithoutOn, functionDef);
                return true;
            }
            
            return false;
        }
    
    obj.removeMyEvent = function (eventWithoutOn, functionDef) {
        if (this.removeEventListener) {
            this.removeEventListener(eventWithoutOn, functionDef, false);
            return true;
        }
        
        if (this.attachEvent) {
            this.detachEvent('on'+eventWithoutOn, functionDef);
        }
        
        return false;
        
    }
    
    /*
    obj.appendMyEvent = function (eventWithoutOn, functionDef) {
        var self = this;
        
        if (self.attachEvent) {
            self['e'+eventWithoutOn+functionDef] = functionDef;
            
            self[eventWithoutOn+functionDef] = function(){
                self['e'+eventWithoutOn+functionDef](window.event);
            }
            
            self.attachEvent( 'on'+eventWithoutOn, self[eventWithoutOn+functionDef] );
            
        } else {
        self.addEventListener(eventWithoutOn, functionDef, false);
            
        }
    }
    */
    /*
    obj.removeMyEvent = function (eventWithoutOn, functionDef) {
        var self = this;
        
        if (self.detachEvent) {
            self.detachEvent( 'on'+eventWithoutOn, functionDef );
            //self[eventWithoutOn+functionDef] = null;
            //delete self[eventWithoutOn+functionDef];
            
        } else {
            self.removeEventListener( eventWithoutOn, functionDef, false );
        }
        
    }
    */
    return true;
}


/**
 * functionDef = function (currentNode, startNode) {return true | false;}
*/
DomTools.findAncestor = function (node, functionDef) {
    if (Function.isInstance(functionDef) != true) {
        return null;
    }
    
    
    var target = arguments[2] || null;
    
    
    if (functionDef.apply(target, [node, node]) == true) {
        return node;
    }
    
    var parent = node;
    
    while (parent.parentNode) {
        if (functionDef.apply(target, [parent.parentNode, node]) == true) {
            return parent.parentNode;
        }
        
        parent = parent.parentNode;
    }
    
    
    return null;
    
}


DomTools.findParent = function (id, tag) {
    var searchedTag = tag.toLowerCase();
    
    var parent = null;
    var node = null;
    
    if (!id.nodeName) {
        node = document.getElementById(id);
        
    } else {
        node = id;
        
    }
    
    if (!node.nodeName) {
        return null;
    }
    
    var fr = null;
    
    if (node.nodeName.toLowerCase() == searchedTag) {
        return node;
        
    }
    parent = node;
    
    while (parent.parentNode) {
        if (parent.parentNode.nodeName.toLowerCase() == searchedTag) {
            return parent.parentNode;
        }
        
        parent = parent.parentNode;
    }
    
    return null;
}

DomTools.findForm = function (id) {
    var parent = null;
    var node = null;
    
    if (!id.nodeName) {
        node = document.getElementById(id);
    }
    
    if (!node.nodeName) {
        return null;
    }
    
    var fr = null;
    
    if (node.nodeName.toLowerCase() == 'form') {
        fr = node;
        
    } else {
        parent = node;
        
        while (parent.parentNode) {
            if (parent.parentNode.nodeName.toLowerCase() == 'form') {
                fr = parent.parentNode;
                break;
            }
            
            parent = parent.parentNode;
        }
        
    }
    
    return fr;
}

if (DomTools.isKHTML() == true) {
    DomTools.getPositionX = function (node) {
        var result = 0;
        
        if (node.offsetParent) {
            while (node.offsetParent) {
                result += Number.parse.integer(node.offsetLeft, 0);
                
                if ((node.offsetParent == document.body)
                        && (node.getMyStyle('position') == 'absolute')) {
                    break;
                    
                }
                
                node = node.offsetParent;
                DomTools.addHelpers(node);
            }
            
        } else if (node.x) {
            result += Number.parse.integer(node.x, 0);
        }
        
        return result;
    }

    DomTools.getPositionY = function (node) {
        var result = 0;
        
        if (node.offsetParent) {
            while (node.offsetParent) {
                result += Number.parse.integer(node.offsetTop, 10);
                
                if ((node.offsetParent == document.body)
                        && (node.getMyStyle('position') == 'absolute')) {
                    break;
                    
                }
                
                node = node.offsetParent;
                DomTools.addHelpers(node);
            }
        } else if (node.y) {
            result += Number.parse.integer(node.y, 10);
        }
        
        return result;
    }
    
}

DomTools.addHelpers = function (node) {
    if (DomTools.isElement(node) != true) {
        return;
    }
    
    if (!node.hasDomToolsFeatures) {
        node.hasDomToolsFeatures = function () {
            return true;
        }
        
    } else {
        return;
        
    }
    
    if (!node.findAncestor) {
        node.findAncestor = function (functionDef) {
            var target = arguments[1] || null;
            
            return DomTools.findAncestor(this, functionDef, target);
        }
    }
    
    if (!node.findParent) {
        node.findParent = function (tag) {
            return DomTools.findParent(this, tag);
        }
    }
    
    if (!node.contains) {
        node.contains = function (nd) {
            if (this.compareDocumentPosition) {
                return !!(this.compareDocumentPosition(nd) & 16)
            }
            
            return false;
        }
        
    }
    
    if (!node.getPositionX) {
        node.getPositionX = function () {
            return DomTools.getPositionX(this);
        }
    }
    
    if (!node.getPositionY) {
        node.getPositionY = function () {
            return DomTools.getPositionY(this);
        }
    }
    
    if (!node.getPosition) {
        node.getPosition = function () {
            return DomTools.getPosition(this);
        }
    }
    
    if (!node.getBounds) {
        node.getBounds = function () {
            var position = this.getPosition();
            
            var vs = this.getVisualBox();
            
            vs.setTopLeft(position);
            
            return vs;
        }
    }
    
    if (!node.getVisualBox) {
        node.getVisualBox = function () {
                return new Rectangle2D(
                    0, 0,
                    (this.clientWidth || -1),
                    (this.clientHeight || -1));
            }
    }
    
    if (!node.getVirtualBox) {
        node.getVirtualBox = function () {
                return new Rectangle2D(0, 0,
                    (this.scrollWidth || -1),
                    (this.scrollHeight || -1));
            }
    }
    
    if (!node.hasScrollX) {
        node.hasScrollX = function () {
                var vs = this.getVisualBox();
                var vr = this.getVirtualBox();
                
                if (vs.width < vr.width) {
                    return true;
                }
                
                
                return false;
            }
    }
    
    if (!node.hasScrollY) {
        node.hasScrollY = function () {
                var vs = this.getVisualBox();
                var vr = this.getVirtualBox();
                
                if (vs.height < vr.height) {
                    return true;
                }
                
                
                return false;
            }
    }
    
    if (!node.hasScroll) {
        node.hasScroll = function () {
                return (this.hasScrollX() || this.hasScrollY());
            }
    }
    
    if (!node.getMaxScroll) {
        node.getMaxScroll = function () {
                var result = new Point2D();
                if (this.hasScroll() == false) {
                    return result;
                }
                
                var vs = this.getVisualBox();
                var vr = this.getVirtualBox();
                
                result.x = vr.width - vs.width;
                result.y = vr.height - vs.height;
                
                return result;
            }
    }
    
    
    if (!node.scrollTo) {
        node.scrollTo = function () {
                var x = Number.parse.integer((arguments[0] || this.scrollLeft || 0), (this.scrollLeft || 0));
                var y = Number.parse.integer((arguments[1] || this.scrollTop || 0), (this.scrollTop || 0));
                
                var max = this.getMaxScroll();
                
                if (max.x < x) {
                    x = max.x;
                }
                if (max.y < y) {
                    y = max.y;
                }
                
                this.scrollLeft = x;
                this.scrollTop = y;
                
            }
    }
    
    
    if (!node.scrollBy) {
        node.scrollBy = function () {
                var x = Number.parse.integer((arguments[0] || 0), 0);
                var y = Number.parse.integer((arguments[1] || 0), 0);
                
                var cx = this.scrollLeft || 0;
                var cy = this.scrollTop || 0;
                
                this.scrollTo(cx + x, cy + y);
                
            }
    }
    
    
    if (!node.setFloatStyle) {
        node.setFloatStyle = function(floatValue) {
            if (!this.style) {
                
                return;
            }
            
            this.style.styleFloat = floatValue;
            this.style.cssFloat = floatValue;
            
        }
    }
    
    if (!node.setOpacityStyle) {
        node.setOpacityStyle = function (opacityValue) {
            if (!this.style) {
                return false;
            }
            
            opacityValue = Number.parse.integer(opacityValue, 1);
            
            if (opacityValue < 0) {
                opacityValue = 0;
            }
            
            if (DomTools.isIE() == true) {
                
                var str = new String(this.style.filter);
                
                if (str.match(/progid:DXImageTransform\.Microsoft\.Alpha\(opacity=\d+\)/)) {
                    str = str.replace(
                        /progid:DXImageTransform\.Microsoft\.Alpha\(opacity=\d+\)/,
                        'progid:DXImageTransform.Microsoft.Alpha(opacity=' + opacityValue + ')');
                    
                } else if (0 < str.length) {
                    str = str + ';progid:DXImageTransform.Microsoft.Alpha(opacity=' + opacityValue + ')';
                    
                } else {
                    str = 'progid:DXImageTransform.Microsoft.Alpha(opacity=' + opacityValue + ')';
                }
                
                this.style.filter = str;
                
                return true;
                
            }
            
            this.style.opacity = (opacityValue / 100);
            
            return true;
        }
    }
    
    if (!node.getOpacityStyle) {
        node.getOpacityStyle = function () {
            if (!this.style) {
                return null;
            }
            
            
            if (DomTools.isIE() == true) {
                var str = new String(this.getMyStyle('filter'));
                
                var result = str.match(/progid:DXImageTransform\.Microsoft\.Alpha\(opacity=(\d+)\)/);
                
                if (result) {
                    return result[1] || 100;
                    
                } else {
                    return 100;
                    
                }
                
                return 100;
                
                
            }
            
            return this.style.opacity * 100;
            
        }
    }
    
    if (!node.appendText) {
        node.appendText = function(text) {
            this.appendChild(document.createTextNode(text));
        }
    }
    
    if (!node.appendBreak) {
        node.appendBreak = function() {
            this.appendChild(document.createElement('br'));
        }
    }
    
    if (!node.appendLineBreak) {
        node.appendLineBreak = function() {
            this.appendChild(document.createElement('hr'));
        }
    }
    
    if (!node.getBounds) {
        node.getBounds = function () {
            return DomTools.getBounds(this);
        }
    }
    
    if (!node.getMyStyle) {
        node.getMyStyle = function(styleProp) {
            return DomTools.getMyStyle(this, styleProp);
            /*
            if (this.currentStyle) {
                return this.currentStyle[styleProp];
                
            } else if (window.getComputedStyle) {
                return document.defaultView.getComputedStyle(this, null).getPropertyValue(styleProp);
                
            }
            
            return null;
            */
        }
    }
    
    DomTools.addEventHelpers(node);
    
    if (!node.getFirstElementByTagName) {
        node.getFirstElementByTagName = function (name) {
            var result = this.getElementsByTagName(name);
            if (result.length < 1) {
                return null;
            }
            
            return result[0];
        }
        
    }
    
    if (!node.getLastElementByTagName) {
        node.getLastElementByTagName = function (name) {
            var result = this.getElementsByTagName(name);
            if (result.length < 1) {
                return null;
            }
            
            return result[result.length - 1];
        }
        
    }
    
    if (!node.getElementsByClassName) {
        node.getElementsByClassName = function (className) {
            var onlyTag = arguments[1] || null;
            
            if (onlyTag != null) {
                onlyTag = onlyTag.toLowerCase();
            }
            
            var sz = this.childNodes.length;
            var i = 0;
            
            var sz2 = 0;
            var j = 0;
            
            var childResult = null;
            var elements = new Array();
            
            var child = null;
            
            for (i = 0; i < sz; i++) {
                child = this.childNodes[i];
                
                if (child.nodeType != 1) {
                    continue;
                }
                
                DomTools.addHelpers(child);
                
                if (child.className.findWord(className) == true) {
                    if (onlyTag == null) {
                        DomTools.addHelpers(child);
                        elements.push(child);
                        
                    } else if (child.nodeName.toLowerCase() == onlyTag) {
                        DomTools.addHelpers(child);
                        elements.push(child);
                        
                    }
                }
                
                childResult = child.getElementsByClassName(className);
                
                sz2 = childResult.length;
                
                if (sz2 < 1) {
                    continue;
                }
                
                for (j = 0; j < sz2; j++) {
                    DomTools.addHelpers(childResult[j]);
                    elements.push(childResult[j]);
                    
                }
                
                
            }
            
            return elements;
        }
    }
    
    if (!node.removeAllChildren) {
        node.removeAllChildren = function() {
            var start = this.childNodes.length - 1;
            
            var i = 0;
            
            for (i = start; i >= 0; i--) {
                this.removeChild(this.childNodes[i]);
                
            }
            
        }
    }
    
}

DomTools.createEntryAction = function(parent) {
    var doc = document;
    
    if (arguments.length > 1) {
        doc = arguments[1];
    }
    
    var result = DomTools.createEntry(parent, doc);
    
    result.style.cursor = 'pointer';
    result.style.backgroundColor = '';
    result.style.color = '';
    result.style.paddingLeft = '0.5em';
    result.style.borderBottom = '1px solid black';
    
    result.onmouseover = function() {
            this.style.backgroundColor = 'Highlight';
            this.style.color = 'HighlightText';
        }
    
    result.onmouseout = function() {
            this.style.backgroundColor = '';
            this.style.color = '';
        }
    
    return result;
}


DomTools.createEntry = function(parent) {
    var doc = document;
    
    if (arguments.length > 1) {
        doc = arguments[1];
    }
    
    var result = null;
    
    
    result = DomTools.create('div', doc);
    
    
    parent.appendChild(result);
    
    return result;
}

DomTools.create = function(nodeName) {
    var doc = document;
    
    if (arguments.length > 1) {
        doc = arguments[1];
    }
    
    
    var result = doc.createElement(nodeName);
    DomTools.addHelpers(result);
    
    return result;
}

DomTools.createFieldSet = function(title) {
    var doc = document;
    
    if (arguments.length > 1) {
        doc = arguments[1];
    }
    
    var result = DomTools.create('fieldset', doc);
    var legend = DomTools.create('legend', doc);
    legend.appendText(title);
    
    result.appendChild(legend);
    
    return result;
}
/*
DomTools.createEvent = function(e) {
    var ev = (!e) ? window.event : e;
    ev.getTarget = function() {
        var result = (this.target) ? this.target : this.srcElement;
        
        // defeat Safari bug
        if (result.nodeType == 3) {
            result = result.parentNode;
        }
        
        return result;
    }
    
    
    ev.dispose = function() {
        this.cancelBubble = true;
        
        if (this.returnValue) {
            this.returnValue = false;
        }
        
        if (this.stopPropagation) {
            this.stopPropagation();
        }
    }
    
    return ev;
}
*/
DomTools.createEvent = function(e) {
    var ev = (!e) ? window.event : e;
    
    if (ev._alreadyGenerated) {
        return ev;
    }
    
    ev.constant = {
        key : {
            BACKSPACE: 8,
            TAB:       9,
            RETURN:   13,
            ESC:      27,
            LEFT:     37,
            UP:       38,
            RIGHT:    39,
            DOWN:     40,
            DELETE:   46
        }
    }
    
    
    ev._alreadyGenerated = true;
    
    ev.getTarget = function() {
        var result = (this.target) ? this.target : this.srcElement;
        
        // defeat Safari bug
        if (result.nodeType == 3) {
            result = result.parentNode;
        }
        
        if(result.tagName.toLowerCase()=='label') { 
            // when clicking a label, firefox fires the input onclick event
            // but the label remains the source of the event. In Opera and IE 
            // the source of the event is the input element. Which is the 
            // expected behavior, I suppose.
            if(result.getAttribute('for')) {
                result = document.getElementById(result.getAttribute('for'));
            }
        }
        
        if (DomTools.isElement(result) == true) {
            DomTools.addHelpers(result);
        }
        
        return result;
    }
    
    ev.isLeftClick = function () {
        return (((this.which) && (this.which == 1))
            || ((this.button) && (this.button == 1)));
    }

    ev.getPointerX = function () {
        if (this.pageX) {
            return this.pageX;
        }
        
        if (this.clientX) {
            return this.clientX
                + (document.body.scrollLeft || 0)
                + (document.documentElement.scrollLeft || 0);
        }
        
        return 0;
    }
    
    ev.getPointerY = function () {
        if (this.pageY) {
            return this.pageY;
        }
        
        if (this.clientY) {
            return this.clientY
                + (document.body.scrollTop || 0)
                + (document.documentElement.scrollTop || 0);
        }
        
        return 0;
    }
    
    ev.getPointer = function () {
        return new Point2D(this.getPointerX(), this.getPointerY());
    }
    
    ev.prevent = function () {
    	if (this.preventDefault) {
            this.preventDefault();
            
        } else {
            this.returnValue = false;
        }
        
    	return false;
        
    }
    
    ev.stop = function(e) {
        this.cancelBubble = true;
        
        if (this.stopPropagation) {
            this.stopPropagation();
        }
    }
    
    ev.dispose = function () {
        this.cancelBubble = true;
        
        if (this.returnValue) {
            this.returnValue = false;
        }
        
        if (this.preventDefault) {
            this.preventDefault(); 
            this.stopPropagation();
        }
        
        return true;
    }
    
    return ev;
}


DomTools.cancelEvent = function (e) {
        var ev = DomTools.createEvent(e);
        ev.dispose();
        return false;
    }

DomTools.isElement = function (element) {
    if (element == null) {
        return false;
    }
    
    if ((!element.nodeType)
            || (element.nodeType != 1)) {
        return false;
    }
    
    return true;
}


DomTools.insertStyleSheet = function (cssUrl) {
    var head = DomTools.getHead();
    
    if (head == null) {
        document.write('<link type="text/css" media="all" rel="stylesheet" href="' + cssUrl + '" />');
        return true;
    }
    
    var newLink = DomTools.create('link');
    newLink.rel = "stylesheet";
    newLink.media = "all";
    newLink.type = "text/css";
    newLink.href = cssUrl;
    
    head.appendChild(newLink);
    
    return true;
}

DomTools.insertScript = function (jsUrl) {
    var head = DomTools.getHead();
    
    if (head == null) {
        document.write('<script type="text/javascript" src="' + jsUrl + '" ><'+'/'+'sc'+'ript>');
        return true;
    }
    
    var newScript = DomTools.create('script');
    newScript.type = "text/javascript";
    newScript.src = jsUrl;
    
    head.appendChild(newScript);
    
    return true;
}


DomTools.inspect = function(object) {
    var props = [];
    
    var showFunctions = true;
    
    if (arguments.length > 1) {
        showFunctions = (arguments[1] == true) ? true : false;
    }
    
    for (var k in object) {
        var v = object[k];
        
        if ((typeof v == 'function')
                && (showFunctions == false)) {
            continue;
        }
        
        if (typeof v == 'object') {
            v = "\n"  + DomTools.inspect(v, showFunctions) + "\n";
        }
        
        props.push(k + ': "' + v + '"');
        
    }
    
    return '{ ' + props.join("\n") + ' }';
}

DomTools.printObject = function(obj) {
    var showFunctions = true;
    
    if (arguments.length > 1) {
        showFunctions = (arguments[1] == true) ? true : false;
    }
    
    DomTools.msg(DomTools.inspect(obj, showFunctions));
}

DomTools.messagePanelId = 'DomTools:msg:ui:container';

DomTools.getMessagePanel = function () {
    var result = document.getElementById(DomTools.messagePanelId);
    
    if (!result) {
        var tmp = DomTools.create('div');
        
        
        var tmp2 = DomTools.create('button');
        tmp2.appendText('clear');
        tmp2.setAttribute('type', 'button');
        tmp2.appendMyEvent('click', function() {
                var tmp = this.parentNode.getElementsByTagName('pre')[0];
                tmp.removeAllChildren();
            });
        
        
        var tmp3 = DomTools.create('hr');
        tmp.appendChild(tmp3);
        
        
        result = DomTools.create('pre');
        result.id = 'DomTools:msg:ui:container';
        
        
        tmp.appendChild(tmp2);
        tmp.appendChild(tmp3);
        tmp.appendChild(result);
        DomTools.getBody().appendChild(tmp);
        
    }
    
    return result;
}

DomTools.msg = function(text) {
    var msg = DomTools.getMessagePanel();
    if (!msg) {
        return;
    }
    
    var counter = msg.childNodes.length;
    
    
    msg.appendText(counter + " : ");
    
    if (typeof text == 'object') {
        text = DomTools.inspect(text);
    }
    
    msg.appendText(text + "\n");
    msg.appendLineBreak();
    
}



DomTools.htmlMsg = function(html) {
    var msg = DomTools.getMessagePanel();
    if (!msg) {
        return;
    }
    
    var tmp = DomTools.create('span');
    tmp.innerHTML = html;
    
    msg.appendChild(tmp);
    msg.appendLineBreak();
    
}


function $() {
    var result = new Array();
    var element = null;
    var i = 0;
    var sz = arguments.length;
    
    for (i = 0; i < sz; i++) {
        element = arguments[i];
        if (typeof element == 'string') {
            element = document.getElementById(element);
        }
        
        if (arguments.length == 1) {
            DomTools.addHelpers(element);
            return element;
        }
        
        DomTools.addHelpers(element);
        result.push(element);
    }

    return result;
}

function _$() {
    var result = new Array();
    var element = null;
    var i = 0;
    var sz = arguments.length;
    
    var j = null;
    var sz2 = null;
    
    for (i = 0; i < sz; i++) {
        element = arguments[i];
        if (typeof element != 'string') {
            continue;
        }
        
        element = DomTools.getElementsByClassName(element);
        
        if (sz == 1) {
            DomTools.addHelpers(element);
            return element;
        }
        
        sz2 = element.length;
        
        if (sz2 < 1) {
            continue;
        }
        
        for (j = 0; j < sz2; j++) {
            DomTools.addHelpers(element[j]);
            result.push(element[j]);
        }
        
        
    }

    return result;
}




window.isLoaded = false;
window.loadStack = new Array();
window.appendLoadEvent = function (my_event) {
    if (typeof my_event != 'function') {
        return true;
    }
    
    if (this.isLoaded == true) {
        my_event();
        return true;
    }
    
    this.loadStack.push(my_event);
    return true;
}


window.executeLoadEvents = function () {
    var i = 0;
    
    var current = null;
    
    for (i = 0; i  < this.loadStack.length; i++) {
        current = this.loadStack[i];
        if (typeof current != 'function') {
            continue;
        }
        
        this.loadStack[i]();
    }
    
    this.loadStack = new Array();
    
}




DomTools.addEventHelpers(document);
DomTools.addEventHelpers(window);
/*
window.appendMyEvent = function(eventWithoutOn, functionDef) {
    if (this.addEventListener) {
        this.addEventListener(eventWithoutOn, functionDef, false);
        return true;
    }
    
    if (this.attachEvent) {
        this.attachEvent("on" + eventWithoutOn, functionDef);
        return true;
    }
    
    return false;
}
*/
window.appendMyEvent('load',
    function() {
        DomTools.addEventHelpers(DomTools.getBody());
        window.executeLoadEvents();
        window.isLoaded = true;
        return true
    });




