
var dataArray, titles;

var topX = 55;
var topY = 150;
var sideX = 30;
var sideY = 175;
var topCX = 103;
var topCY = 21;
var sideCX = 21;
var sideCY = 101;

var dragDiv = null;
var dragId = null;
var dragCX, dragCY, dragArea;

var side0 = [0];
var side1 = [1, 2];
var order = [0, 1, 2];

// recuperation eventuelle de l'etat du dashboard.
cookieTable = document.cookie.split(';');
for (var i=0; i < cookieTable.length; i++) {
    eval(cookieTable[i]);
}

function switchSides(theIndex, theSide) {
	var fromSide = side1;
	var toSide = side0;

	if (theSide == 1) {
		fromSide = side0;
		toSide = side1;
	}

	isPresent = false;
	for (var i = 0; i < toSide.length; i++) {
		if (toSide[i] == theIndex) {
			isPresent = true;
		}
	}

	if (isPresent) {
		fromSide = toSide;
	}

	var newArray = new Array();
	for (var i = 0; i < fromSide.length; i++) {
		if (fromSide[i] != theIndex) {
			newArray[newArray.length] = fromSide[i];
		}
	}
	fromSide.length = 0;
	for (var i = 0; i < newArray.length; i++) {
		fromSide[i] = newArray[i];
	}

	var isOk = false;
	var comp1 = 0;
	var comp2 = 0;
	if (theSide == 0) {
		comp1 = document.getElementById("tab" + theIndex).style.pixelTop;
	} else {
		comp1 = document.getElementById("tab" + theIndex).style.pixelLeft;
	}
	for (i = toSide.length - 1; i >= 0; i--) {
		if (theSide == 0) {
			comp2 = document.getElementById("tab" + toSide[i]).style.pixelTop;
		} else {
			comp2 = document.getElementById("tab" + toSide[i]).style.pixelLeft;
		}
		if (comp1 < comp2) {
			toSide[i + 1] = toSide[i];
			toSide[i] = theIndex;
			isOk = true;
		}
	}
	if (!isOk) {
		toSide[toSide.length] = theIndex;
	}

	order.length = 0;
	for (var i = 0; i < side0.length; i++) {
		order[i] = side0[i];
	}
	for (var i = 0; i < side1.length; i++) {
		order[order.length] = side1[i];
	}
}

function countAbove(theLevel, theArray) {
	var theCount = 1;

	for (var i = (theLevel - 1); i >= 0; i--) {
		theCount *= titles[theArray[i]].length;
	}

	return theCount;
}

function countBelow(theLevel, theArray) {
	var theCount = 1;

	for (var i = (theLevel + 1); i < theArray.length; i++) {
		theCount *= titles[theArray[i]].length;
	}

	return theCount;
}

function getHeader() {
    var theHTML = "";

    for (var i = 0; i < side1.length; i++) {
	theHTML += "<tr>";
	var repeat = 1;
	if (i > 0) {
	    repeat = countAbove(i, side1);
	} else if (side0.length > 0) {
	    theHTML += "<td colspan=" + side0.length + " rowspan=" + 
		       side1.length + " class='tablehead0h' " +
		       "style='border-bottom: 1px solid #ffffff;'>&nbsp;</td>";
	}
	var theSpan = countBelow(i, side1);
	for (j = 0; j < repeat; j++) {
	    for (var k = 0; k < titles[side1[i]].length; k++) {
		theHTML += "<td colspan=" + theSpan + 
		           " valign=top class='tablehead" + i + "h'>";
		// false pour désactivation ...
    		if (false && (side0.length == 1 && (theSpan == 1) &&
		    (order[1] == 2 || order[2] == 2))) {
	    	    theHTML += '<a href="javascript:sortTable(' + j + ', ' +
		               k + ');" class="tablehead1h">';
    		    theHTML += titles[side1[i]][k]; 
	    	    theHTML += '</a>';
		} else {
    		    theHTML += titles[side1[i]][k]; 
		}
		theHTML += "</td>";
	    }
	}
	theHTML += "</tr>\n";
    }

    return theHTML;
}

function getPlot() {
    var theHTML = "";
    var theHeader = "";
    var theData = "dataArray";
    var theAxes = ["y", "x", "z"];

    for (var i = 0; i < theAxes.length; i++) {
	for (var j = 0; j < order.length; j++) {
	    if (order[j] == i) {
		theData += "[" + theAxes[j] + "]";
	    }
	}
    }

    for (var y = 0; y < titles[order[0]].length; y++) {
	theHeader += "<td rowspan=" + countBelow(0, side0) + 
	             " valign=top class='tablehead0' " +
		     "style='border-bottom: 1px solid #ffffff;'>" +
		     titles[order[0]][y] + "</td>";
	if (side0.length == 1) {
	    theHTML += "<tr>" + theHeader;
	}
	for (var x = 0; x < titles[order[1]].length; x++) {
	    theHeader += "<td rowspan=" + countBelow(1, side0) + 
	                 " valign=top class='tablehead1' " +
			 "style='border-bottom: 1px solid #ffffff;'>" +
			 titles[order[1]][x] + "</td>";
	    if (side0.length == 2) {
		theHTML += "<tr>" + theHeader;
	    }
	    for (var z = 0; z < titles[order[2]].length; z++) {
		theHeader += "<td rowspan=" + countBelow(2, side0) + 
			     " valign=top class='tablehead2' " + 
			     "style='border-bottom: 1px solid #ffffff;'>" + 
			     titles[order[2]][z] + "</td>";
		if (side0.length == 3) {
		    theHTML += "<tr>" + theHeader;
		}
		theDataCell = eval(theData);
		theHTML += "<td align=right class='tablecell'>" + 
			   theDataCell + "</td>";
		if (side0.length == 3) {
		    theHTML += "</tr>\n";
		    theHeader = "";
		}
	    }
	    if (side0.length == 2) {
		theHTML += "</tr>\n";
		theHeader = "";
	    }
	}
	if (side0.length == 1) {
	    theHTML += "</tr>\n";
	    theHeader = "";
	}
    }

    return theHTML;
}

function showTable() {

	var newHeader = getHeader();
	var newHTML = getPlot();

	snapTabs();
	document.getElementById("datatable").innerHTML = "<table border=0 cellpadding=5 cellspacing=0>\n" + newHeader + newHTML + "</table>";
}

function setSide(theIndex, theSide) {
	switchSides(theIndex, theSide);

	// memo de la config.
	document.cookie = 'order=[' + order + ']';
	document.cookie = 'side0=[' + side0 + ']';
	document.cookie = 'side1=[' + side1 + ']';

	showTable();
}

function snapTabs() {
	for (var i = 0; i < side0.length; i++) {
		document.getElementById("tab" + side0[i]).style.pixelLeft = sideX;
		document.getElementById("tab" + side0[i]).style.pixelTop = sideY + (i * sideCY);
		document.getElementById("tab" + side0[i] + "h").style.visibility = "hidden";
		document.getElementById("tab" + side0[i] + "v").style.visibility = "hidden";
	}

	for (var i = 0; i < side1.length; i++) {
		document.getElementById("tab" + side1[i]).style.pixelLeft = topX + (i * topCX);
		document.getElementById("tab" + side1[i]).style.pixelTop = topY;
		document.getElementById("tab" + side1[i] + "v").style.visibility = "hidden";
		document.getElementById("tab" + side1[i] + "h").style.visibility = "hidden";
	}
}

function hitArea(x, y) {
	var theArea = -1;

	if ((x >= (topX - 20)) && (y <= (topY + topCY))) {
		theArea = 1;
	}
	if ((x <= (sideX + sideCX)) && (y >= (sideY - 20))) {
		theArea = 0;
	}

	return theArea;
}


function beginDrag(theDiv, theId) {
	var mouseX = (event.clientX + document.body.scrollLeft);
	var mouseY = (event.clientY + document.body.scrollTop);

	dragDiv = theDiv;
	dragDiv.style.zIndex++;
	dragId = theId;
	dragCX = dragDiv.style.pixelLeft - mouseX;
	dragCY = dragDiv.style.pixelTop - mouseY;
	if (document.getElementById("tab" + dragId + "v").style.visibility != "hidden") {
		dragArea = 0;
	} else {
		dragArea = 1;
	}

	document.onmousemove = moveDrag;
	document.onmouseup = endDrag;
}

function moveDrag() {
	var mouseX = (event.clientX + document.body.scrollLeft);
	var mouseY = (event.clientY + document.body.scrollTop);

	dragDiv.style.pixelLeft = mouseX + dragCX;
	dragDiv.style.pixelTop = mouseY + dragCY;

	var theArea = hitArea(mouseX, mouseY);
	if (theArea == -1) {
		theArea = dragArea;
	}
	if ((theArea == 0) && (document.getElementById("tab" + dragId + "h").style.visibility != "hidden")) {
		var temp = dragCY;
		dragCY = dragCX;
		dragCX = temp;
		document.getElementById("tab" + dragId + "h").style.visibility = "hidden";
		document.getElementById("tab" + dragId + "v").style.visibility = "hidden";
		dragDiv.style.pixelLeft = mouseX + dragCX;
		dragDiv.style.pixelTop = mouseY + dragCY;
	}
	if ((theArea == 1) && (document.getElementById("tab" + dragId + "v").style.visibility != "hidden")) {
		var temp = dragCY;
		dragCY = dragCX;
		dragCX = temp;
		document.getElementById("tab" + dragId + "v").style.visibility = "hidden";
		document.getElementById("tab" + dragId + "h").style.visibility = "hidden";
		dragDiv.style.pixelLeft = mouseX + dragCX;
		dragDiv.style.pixelTop = mouseY + dragCY;
	}

	event.returnValue = false;
}

function endDrag() {
	var mouseX = (event.clientX + document.body.scrollLeft);
	var mouseY = (event.clientY + document.body.scrollTop);

	document.onmousemove = null;
	document.onmouseup = null;

	if (dragId != null) {
		dragDiv.style.zIndex--;
		var theArea = hitArea(mouseX, mouseY);
		if (theArea != -1) {
			setSide(dragId, theArea);
		}
	}
	dragId = null;

	snapTabs();
}

// tri le dataArray pour order[1] et order[2] fixes.
function sortTable(order1value, order2value) {

    var orderValues = new Array();
    orderValues[order[1]]  = order1value;
    orderValues[order[2]]  = order2value;
    var oVref = new Array();
    oVref[order[1]]  = order1value;
    oVref[order[2]]  = order2value;

    for (var i = 0; i < titles[order[0]].length; i++) {
	oVref[order[0]] = i;
    	valref = dataArray[oVref[0]][oVref[1]][oVref[2]];
	for (var j = i + 1; j < titles[order[0]].length; j++) {
	    orderValues[order[0]] = j;
	    if (dataArray[orderValues[0]][orderValues[1]][orderValues[2]] <
	        valref) {

		// permutation dataArray
		permuteDataArray(i, j);
		valref = dataArray[oVref[0]][oVref[1]][oVref[2]];

		// permutation titles
		var buf = titles[order[0]][i];
		titles[order[0]][i] = titles[order[0]][j];
		titles[order[0]][j] = buf;
	    }
	}
    }

    showTable();
}

function permuteDataArray(order0ind1, order0ind2) {

    var orderValues = new Array();
    orderValues[order[0]]  = order0ind2;
    orderValues[order[1]]  = 0;
    orderValues[order[2]]  = 0;
    var oVref = new Array();
    oVref[order[0]]  = order0ind1;
    oVref[order[1]]  = 0;
    oVref[order[2]]  = 0;

//ici a faire permuter tous les ligne du tableau.
    var valref = dataArray[oVref[0]][oVref[1]][oVref[2]];
    dataArray[oVref[0]][oVref[1]][oVref[2]] =
	dataArray[orderValues[0]][orderValues[1]][orderValues[2]];
    dataArray[orderValues[0]][orderValues[1]][orderValues[2]] =
	valref;

}


