//Inverts a table so that columns becomes rows, and rows columns.

// Version 1.3: Fixes problem with equal widths when sorting by columns
// Version 1.2: Fix that excludes cells with hidden parentNodes
// Version 1.1: Fix for DS-server: Inputs cannot be restructured for DS.
// Version 1.0: Basic functionality

//Runs initializeMultipleColumn automatically, check last line.
var MultipleColumn = {
  tableClassName : "answerColumns", //Editable
  multipleColumnClassName : "multipleColumns", //Editable
  
  debug : false,
  debugPreString : "c_multiplecolumn.js: ",
  debugPostString : "-error: ",

  initializeMultipleColumn : function() {
    try {
      var table = Utilities.getElementsByClassAndTagName(MultipleColumn.tableClassName, "TABLE");
      var inputs = Utilities.getElementsByClassAndTagName(MultipleColumn.tableClassName, "INPUT");
      var inputTables = MultipleColumn.getUniqueContainers(inputs, "TABLE", 5);
      table = table.concat(inputTables);
      for(var i=0; i<table.length; i++) {
      	var fakeArgs = Utilities.getFakeClassArguments(table[i], MultipleColumn.tableClassName);
      	if(fakeArgs.length == 3) {
  			var newTable = MultipleColumn.arrangeInColumns(table[i], fakeArgs[1], fakeArgs[2]);
  			newTable.className = table[i].className;
  			Utilities.addClassName(newTable, MultipleColumn.multipleColumnClassName);
  			table[i].parentNode.insertBefore(newTable, table[i]);
  			table[i].parentNode.removeChild(table[i]);
      	}	
      }
    } catch(err) {if(MultipleColumn.debug) alert(MultipleColumn.debugPreString + "initializeMultipleColumn" + MultipleColumn.debugPostString + err);}
  },
  
  arrangeInColumns : function(table, numberOfColumns, sortOrder) {
  	  var cells = table.getElementsByTagName("TD");
      var newTable = document.createElement("TABLE");
      var colWidth = parseInt(100 / numberOfColumns);
      try {
      var tbody = document.createElement("TBODY");
      newTable.appendChild(tbody);
      if(sortOrder == "rows") {
      	var colCount = numberOfColumns;
      	var currentRow;
      	for(var i=0; i<cells.length; i++) { 
      		if(colCount >= numberOfColumns) {
      			colCount = 0;
      			currentRow = document.createElement("TR");
      			tbody.appendChild(currentRow);
      		}  		
      		//TODO: Remove SPAN:s in TR:s
          if(cells[i].parentNode.style.display == "none") {
            var newCell = document.createElement("SPAN");
            newCell.style.display = "none";
          }
          else {
            var newCell = document.createElement("TD");
            newCell.className = cells[i].className;
			newCell.style.width = colWidth + "%";
			newCell.style.height = cells[i].style.height;
            colCount++;
          }
          Utilities.moveChildren(cells[i], newCell);
          currentRow.appendChild(newCell);
      	}
      }
      else {
      	  var visibleCells = 0;
          for(var c=0; c<cells.length; c++) {
            if(cells[c].parentNode.style.display != "none") visibleCells++;
          }
          var numberOfRows = parseInt(visibleCells / numberOfColumns);
      	  if (visibleCells % numberOfColumns !== 0) numberOfRows++;
          var currentInsideTbody = document.createElement("TBODY");
          var newRow = document.createElement("TR");
          var visible = 0;     	  
	        for(var c=0; c<cells.length; c++) {
	          var hidden = (cells[c].parentNode.style.display == "none");
	          var height = cells[c].style.height;
  	        if(visible%numberOfRows === 0 && !hidden) {
  	          var newCell = document.createElement("TD");
  	          newCell.style.verticalAlign = "top";
			        newCell.style.width = colWidth + "%";
  	          var insideTable = document.createElement("TABLE");
  	          insideTable.style.width = "100%";
              currentInsideTbody = document.createElement("TBODY");
              insideTable.appendChild(currentInsideTbody);
              newCell.appendChild(insideTable);
              newRow.appendChild(newCell); 
  	        }
            var insideRow = document.createElement("TR");	        
            var insideCell = document.createElement("TD");
            if(hidden) insideRow.style.display = "none";
            else visible++;
            insideCell.style.height = height;
            Utilities.moveChildren(cells[c], insideCell);
            insideCell.className = cells[c].className;
            insideRow.appendChild(insideCell);
            currentInsideTbody.appendChild(insideRow);
	        }
        tbody.appendChild(newRow); 	
      }
    } catch(err) {if(MultipleColumn.debug) alert(MultipleColumn.debugPreString + "arrangeInColumns" + MultipleColumn.debugPostString + err);}
    return newTable;
  },
  
  getUniqueContainers : function(items, containerTagName, stepLimit) {
    var uniqueContainers = new Array();
    try {
      var currentContainer;
      for(var i=0; i<items.length; i++) {
         var itemContainer = Utilities.getKin(items[i], "parent", containerTagName, undefined, stepLimit);
         if(itemContainer) {
           if(itemContainer != currentContainer || !currentContainer) {
             currentContainer = itemContainer;
             uniqueContainers.push(currentContainer);
             Utilities.addClassName(currentContainer, MultipleColumn.getFakeClassName(items[i]));             
           }
         }
      }
    } catch(err) {if(MultipleColumn.debug) alert(MultipleColumn.debugPreString + "getUniqueContainers" + MultipleColumn.debugPostString + err);}
    return uniqueContainers;
  },
  
  getFakeClassName : function(element) {
    var fakeArgumentClassString;
    try {
      var className = MultipleColumn.tableClassName;
      var classStartIndex = element.className.indexOf(className);
      var classEndIndex = element.className.indexOf(" ", classStartIndex);
      if(classEndIndex == -1) fakeArgumentClassString = element.className.substring(classStartIndex);
      else fakeArgumentClassString = element.className.substring(classStartIndex, classEndIndex);
    } catch(err) {if(MultipleColumn.debug) alert(MultipleColumn.debugPreString + "getFakeClassName" + MultipleColumn.debugPostString + err);}      
    return fakeArgumentClassString;
  }
};
if(typeof isTierIphone == 'undefined' || (!isTierIphone)) {
	MultipleColumn.initializeMultipleColumn();
}
