text: /**
   * 固定子组件上下左右的布局容器
   * @class BI.AbsoluteLayout
   * @extends BI.Layout
   */
  BI.AbsoluteLayout = BI.inherit(BI.Layout, {
      props: function () {
          return BI.extend(BI.AbsoluteLayout.superclass.props.apply(this, arguments), {
              baseCls: "bi-absolute-layout",
              hgap: null,
              vgap: null,
              lgap: null,
              rgap: null,
              tgap: null,
              bgap: null
          });
      },
      render: function () {
          BI.AbsoluteLayout.superclass.render.apply(this, arguments);
          this.populate(this.options.items);
      },
  
      _addElement: function (i, item) {
          var o = this.options;
          var w = BI.AbsoluteLayout.superclass._addElement.apply(this, arguments);
          var left = 0, right = 0, top = 0, bottom = 0;
          if (BI.isNotNull(item.left)) {
              w.element.css({left: item.left});
              left += item.left;
          }
          if (BI.isNotNull(item.right)) {
              w.element.css({right: item.right});
              right += item.right;
          }
          if (BI.isNotNull(item.top)) {
              w.element.css({top: item.top});
              top += item.top;
          }
          if (BI.isNotNull(item.bottom)) {
              w.element.css({bottom: item.bottom});
              bottom += item.bottom;
          }
  
          if (BI.isNotNull(o.hgap)) {
              left += o.hgap;
              w.element.css({left: left});
              right += o.hgap;
              w.element.css({right: right});
          }
          if (BI.isNotNull(o.vgap)) {
              top += o.vgap;
              w.element.css({top: top});
              bottom += o.vgap;
              w.element.css({bottom: bottom});
          }
  
          if (BI.isNotNull(o.lgap)) {
              left += o.lgap;
              w.element.css({left: left});
          }
          if (BI.isNotNull(o.rgap)) {
              right += o.rgap;
              w.element.css({right: right});
          }
          if (BI.isNotNull(o.tgap)) {
              top += o.tgap;
              w.element.css({top: top});
          }
          if (BI.isNotNull(o.bgap)) {
              bottom += o.bgap;
              w.element.css({bottom: bottom});
          }
  
  
          if (BI.isNotNull(item.width)) {
              w.element.css({width: item.width});
          }
          if (BI.isNotNull(item.height)) {
              w.element.css({height: item.height});
          }
          w.element.css({position: "absolute"});
          return w;
      },
  
      resize: function () {
          this.stroke(this.options.items);
      },
  
      stroke: function (items) {
          this.options.items = items || [];
          var self = this;
          BI.each(items, function (i, item) {
              if (item) {
                  if (!BI.isWidget(item) && !item.el) {
                      throw new Error("el must be exist");
                  }
                  self._addElement(i, item);
              }
          });
      },
  
      populate: function (items) {
          BI.AbsoluteLayout.superclass.populate.apply(this, arguments);
          this._mount();
      }
  });
  BI.shortcut("bi.absolute", BI.AbsoluteLayout);