/** * EGroupware eTemplate2 - JS HBox object * * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License * @package etemplate * @subpackage api * @link http://www.egroupware.org * @author Andreas Stöckel * @copyright Stylite 2011 * @version $Id: et2_box.js 36147 2011-08-16 13:12:39Z igel457 $ */ "use strict"; /*egw:uses jquery.jquery; et2_core_baseWidget; */ /** * Class which implements hbox tag * * @augments et2_baseWidget */ var et2_hbox = et2_baseWidget.extend( { createNamespace: true, /** * Constructor * * @memberOf et2_hbox */ init: function() { this._super.apply(this, arguments); this.alignData = { "hasAlign": false, "hasLeft": false, "hasCenter": false, "hasRight": false, "lastAlign": "left" }; this.leftDiv = null; this.rightDiv = null; this.div = $j(document.createElement("div")) .addClass("et2_" + this._type) .addClass("et2_box_widget"); this.setDOMNode(this.div[0]); }, _buildAlignCells: function() { if (this.alignData.hasAlign) { // Check whether we have more than one type of align var mto = (this.alignData.hasLeft && this.alignData.hasRight) || (this.alignData.hasLeft && this.alignData.hasCenter) || (this.alignData.hasCenter && this.alignData.hasRight); if (!mto) { // If there is only one type of align, we simply have to set // the align of the top container if (this.alignData.lastAlign != "left") { this.div.addClass("et2_hbox_al_" + this.alignData.lastAlign); } } else { // Create an additional container for elements with align type // "right" if (this.alignData.hasRight) { this.rightDiv = $j(document.createElement("div")) .addClass("et2_hbox_right") .appendTo(this.div); } // Create an additional container for elements with align type // left, as the top container is used for the centered elements if (this.alignData.hasCenter) { // Create the left div if an element is centered this.leftDiv = $j(document.createElement("div")) .addClass("et2_hbox_left") .appendTo(this.div); this.div.addClass("et2_hbox_al_center"); } } } }, /** * The overwritten function checks whether any child element has * a special align value. * * @param {object} _node */ loadFromJSON: function(_node) { // Check whether any child node has an alignment tag et2_filteredNodeIterator(_node, function(_node) { var align = et2_readAttrWithDefault(_node, 'align',''); if (!align) { align = "left"; } if (align != "left") { this.alignData.hasAlign = true; } this.alignData.lastAlign = align; switch (align) { case "left": this.alignData.hasLeft = true; break; case "right": this.alignData.hasRight = true; break; case "center": this.alignData.hasCenter = true; break; } }, this); // Build the align cells this._buildAlignCells(); // Load the nodes as usual this._super.apply(this, arguments); }, assign: function(_obj) { // Copy the align data and the cells from the object which should be // assigned this.alignData = et2_cloneObject(_obj.alignData); this._buildAlignCells(); // Call the inherited assign function this._super.apply(this, arguments); }, getDOMNode: function(_sender) { // Return a special align container if this hbox needs it if (_sender != this && this.alignData.hasAlign) { // Check whether we've create a special container for the widget var align = (_sender.implements(et2_IAligned) ? _sender.get_align() : "left"); if (align == "left" && this.leftDiv != null) { return this.leftDiv[0]; } if (align == "right" && this.rightDiv != null) { return this.rightDiv[0]; } } // Normally simply return the hbox-div return this._super.apply(this, arguments); }, /** * Tables added to the root node need to be inline instead of blocks * * @param {et2_widget} child child-widget to add */ addChild: function(child) { this._super.apply(this, arguments); if(child.instanceOf && child.instanceOf(et2_grid) || child._type == 'et2_grid') { jQuery(child.getDOMNode(child)).css("display", "inline-table"); } } }); et2_register_widget(et2_hbox, ["hbox"]);