if ( !framework.isDeclared("org.iit.Widget") ) {

framework.declareClass("org.iit.Widget", null, 
    function(config) {
        this.id = config.id;
        this._element = config.element;
        if ( this.id ) {
            org.iit.Widget._widgets[this.id] = this;
        }
        this._tempDiv = null;
        this.items = [];
        this.beforeResize = new framework.event.Event();
        this.afterResize = new framework.event.Event();
        this.beforeSetPosition = new framework.event.Event();
        this.afterSetPosition = new framework.event.Event();
        this.width = 0;
        this.height = 0;
        this.x = 0;
        this.y = 0;
        this.layout = null;
    },
    {
        findByRole: function(role, tagName) {
            var nodes = this._element.getElementsByTagName(tagName||"*");
            var result = [];
            for ( var i = 0; i < nodes.length; i++ ) {
                if ( nodes[i].getAttribute("widgetRole") == role ) {
                    result.push(nodes[i]);
                }
            }
            return result;
        },
        getElement: function() {
            return this._element;
        },
        createElements: function(html) {
            if ( !this._tempDiv ) this._tempDiv = document.createElement("DIV");
            this._tempDiv.innerHTML = html;
            var nodes = [], i, l = this._tempDiv.childNodes.length;
            for ( i = 0; i < l; i++ ) {
                nodes[i] = this._tempDiv.childNodes[i];
            }
            for ( i = l-1; i >= 0; i-- ) {
                this._tempDiv.removeChild(nodes[i]);
            }
            return nodes;
        },
        getContentSize: function() {
            return { w:0, h:0 };
        },
        /* protected */
        onSetSize: function(w, h) {
            this.width = w;
            this.height = h;

            var mbp = framework.dom.getMBP(this._element);
            this._element.style.width = (w - mbp.w) + "px";
            this._element.style.height = (h - mbp.h) + "px";

            if ( this.layout ) {
                this.layout.layout();
            }
        },
        setSize: function(w, h) {
            this.beforeResize.fire({w: w, h: h});
            this.onSetSize(w, h);
            this.afterResize.fire({w: w, h: h});
        },
        /* protected */
        onSetPosition: function(x, y) {
        },
        setPosition: function(x, y) {
            this.beforeSetPosition.fire({x: x, y: y});
            this.onSetPosition(x, y);
            this.afterSetPosition.fire({x: x, y: y});
        },
        getItems: function(nodes) {
            this.items = [];
            for ( var i = 0, l = nodes.length; i < l; i++ ) {
                if ( nodes[i].nodeType == 1 ) {
                    this.items.push(nodes[i]);
                }
            }
            return this.items;
        },
        setLayout: function(layout) {
            if ( framework.isDeclared(layout) ) {
                var clazz = eval(layout);
                this.layout = new clazz({ container: this });
            }
        }
    },
    {
        _widgets: [],
        get: function(id) {
            if ( org.iit.Widget._widgets[id] ) {
                return org.iit.Widget._widgets[id];
            }
            return null;
        },
        byId: function(id) {
            return org.iit.Widget.get(id);
        },
        createFromHtml: function(node) {
        },
        onLoad: new framework.event.OnLoadEvent(),
        createWidgets: function() {
            var l, i, className, widgets = [];
            widgets = framework.query("*[widgetClass]");
            l = widgets.length;
            for ( i = 0; i < l; i++ ) {
                className = widgets[i].getAttribute("widgetClass");
                var clazz = eval(className);
                if ( clazz ) {
                    clazz.createFromHtml(widgets[i]);
                } else {
                    throw new Error("class " + className + " not found");
                }
            }
            org.iit.Widget.onLoad.fire();
        }
    }
);

framework.onLoad.add(org.iit.Widget.createWidgets);

}
