/**
 * 功能：类似于java中的StringBuffer类的功能，用于字符串的拼接
 *       这种方式比直接用"+"性能要高出很多
 */
package("com.henry.ui");

com.henry.ui.KeyedTable = function(id) {
	//扩展定义
	var keyedTableInstance = this.constructor.extendInstance(new com.henry.ui.HTML("TABLE", id));
	var $super = keyedTableInstance.$super;
	var self = keyedTableInstance;
	
	//私有变量定义区	
	var _layout = [];
	var _nameIndexMap = {};
	var _indexNameMap = [];
		
	//方法定义区 
	{
		keyedTableInstance.addField = function(theField, layoutConstraint) {
			var label = theField.getFieldLabel();
			var el = theField.getFieldElement();
			
			if (!(label instanceof Array)) {
				label = [label];
			}
						
			var labelLayout = {};
			var elementLayout = {};
			
			Object.extend(labelLayout, layoutConstraint);
			Object.extend(elementLayout, layoutConstraint);
			
			if (labelLayout.colspan) {
				delete labelLayout.colspan;
			}
									
			if (labelLayout.endDesc) {
				delete labelLayout.endDesc;
			}
			
			labelLayout["class"] = "ITContext";
			elementLayout["class"] = "IInput";
			
			this.addComponent("lab-" + theField.getName(), label[0], labelLayout);

			if (label.length == 3) {
				elementLayout.endDesc = "openCell";
				this.addComponent("lab1-" + theField.getName(), label[1], elementLayout);
				this.addComponent("el-" + theField.getName(), el, {endDesc:"noCell"});
				this.addComponent("lab2-" + theField.getName(), label[2], {endDesc:"endCell"});				
			}
			else if (label.length == 2) {
				elementLayout.endDesc = "openCell";
				this.addComponent("el-" + theField.getName(), el, elementLayout);
				this.addComponent("lab2-" + theField.getName(), label[1], {endDesc:"endCell"});				
			}
			else {
				this.addComponent("el-" + theField.getName(), el, elementLayout);
			}
			
			return this;		
		} 

		keyedTableInstance.addFields = function(fields) {
			for (var i=0; i<fields.length; i++) {
				var lineFields = fields[i];
				for (var k=0; k<lineFields.length; k++) {
					if (lineFields[k]) {
						var layoutConstraint = {colspan:1, rowspan:1};
						var field = lineFields[k];
						if (field instanceof Array) {
							if (field[1]) {
								layoutConstraint.colspan = field[1];
							}
							if (field[2]) {
								layoutConstraint.rowspan = field[2];
							}
							field = field[0];
						}
						else if (field.field) {
							var afield = field.field;
							delete field.field;
							Object.extend(layoutConstraint, field);
							field = afield
						}
						
						this.addField(field, layoutConstraint);
					}
				}
				this.endLine();
				//layoutConstraint.endDesc = "endLine";
			}
			
			return this;
		}

		keyedTableInstance.addChild = function(childName, child, layoutConstraint) {
			$super.addChild(childName, child);
			if (!layoutConstraint) {
				layoutConstraint = {colspan:1, rowspan:1};
			}
			_layout.push(layoutConstraint);
			_nameIndexMap[childName] = _layout.length - 1;
			_indexNameMap.push(childName);
			return this;
		}
		
		keyedTableInstance.addComponent = function(childName, child, layoutConstraint) {
			return self.addChild(childName, child, layoutConstraint);
		}
				
		keyedTableInstance.endLine = function() {
			var layoutConstraint = _layout[_layout.length-1];
			layoutConstraint.endDesc = "endLine";
			
			return this;
		}

		keyedTableInstance.endCell = function() {
			var layoutConstraint = _layout[_layout.length-1];
			layoutConstraint.endDesc = "endCell";
			
			return this;
		}

		keyedTableInstance.openCell = function() {
			var layoutConstraint = _layout[_layout.length-1];
			layoutConstraint.endDesc = "openCell";
			
			return this;
		}

		keyedTableInstance.noCell = function() {
			var layoutConstraint = _layout[_layout.length-1];
			layoutConstraint.endDesc = "noCell";
			
			return this;
		}

		keyedTableInstance.innerHTML = function(buffer) {			
			if (!buffer) {
				buffer = new com.henry.lang.StringBuffer();
			}

			buffer.openTag("tr").closeTag();

			var tdOpenFlag = false;
			
			for (var i=0; i<_indexNameMap.length; i++) {
				var compName = _indexNameMap[i];
				var comp = self.getChild(compName);
				var layoutConstraint = _layout[i];

				var attributes = {};
				
				Object.extend(attributes, layoutConstraint);
				
				if (attributes.endDesc) {
					delete attributes.endDesc;
				}
								
				if (!layoutConstraint.endDesc || (layoutConstraint.endDesc != "noCell" && layoutConstraint.endDesc != "endCell")) {
					if (!tdOpenFlag) {
						buffer.openTag("td")
									.putAttributes(attributes)
									.closeTag();
						tdOpenFlag = true;
					}
				}

				if (comp.getId && !comp.getId()) {
					comp.setId(this.getId() + "-" + compName);
				}
				buffer.append(comp.toString());
				
				if (!layoutConstraint.endDesc || (layoutConstraint.endDesc != "openCell" && layoutConstraint.endDesc != "noCell")) {
					buffer.endTag("td");
					tdOpenFlag = false;
				}
				
				if (layoutConstraint.endDesc && layoutConstraint.endDesc == "endLine") {
					if (tdOpenFlag) {
						buffer.endTag("td");
						tdOpenFlag = false;
					}
					buffer.endTag("tr");
					if ((i+1) < _indexNameMap.length) {
						buffer.openTag("tr").closeTag();
					}
				}				
			}
			return buffer;
		}
				
		keyedTableInstance.toString = function() {
			try {
				var s = this.outerHTML().toString();
				return s;
			}
			catch (ex) {
				alert(ex);
			}
			finally {
			}
		}
	}
	
	//初始化区
	(function() {
		self.setAttribute("border", "0");
		self.setAttribute("cellPadding", "0");
		self.setAttribute("cellSpacing", "0");
		self.setAttribute("width", "100%");
	})();
				
	
	return keyedTableInstance;
}


