UnboxPack.minWidth = 150;

function UnboxPack(resizeContainer, table, imageCellContent, textCellContent, maxRows, maxColumns) {
	this.resizeContainer = resizeContainer;
	this.table = table;
	this.imageCellContent = imageCellContent;
	this.textCellContent = textCellContent;
	this.maxRows = maxRows;
	this.maxColumns = maxColumns;

	var obj = this;
	var resizeReference = this.resize;
	var callback = function(event) { resizeReference.call(obj, event);};
	addHandler(window, "resize", callback);
	addHandler(window, "load", callback);
}

UnboxPack.prototype.resize = function(event) {
	var maxCols = Math.min(this.maxColumns,
		this.imageCellContent.length,
		Math.floor(this.resizeContainer.offsetWidth / UnboxPack.minWidth));

	var numRows = 1;
	var numCols = maxCols;
	if (numCols * numRows < this.imageCellContent.length) {
		for (var ii = 1; ii <= this.maxRows; ii++) {
			var fitCols = Math.min(Math.floor(this.imageCellContent.length / ii), maxCols);
			if (fitCols * ii > numCols * numRows) {
				numRows = ii;
				numCols = fitCols;
			}
		}
	}
	var cellWidth = Math.floor(100 / numCols);

	while (this.table.rows.length) {
		this.table.deleteRow(0);
	}
	for (var ii = 0; ii < numRows; ii++) {
		var tr = this.table.insertRow(-1);
		for (var jj = 0; jj < numCols; jj++) {
			var td = tr.insertCell(-1);
			td.className = "pack_image_cell";
			td.style.width = cellWidth + "%";
			td.innerHTML = this.imageCellContent[numCols * ii + jj];
		}
		tr = this.table.insertRow(-1);
		for (var jj = 0; jj < numCols; jj++) {
			var td = tr.insertCell(-1);
			td.className = "pack_text_cell";
			td.innerHTML = this.textCellContent[numCols * ii + jj];
		}
	}

	if (!document.all) {
		this.table.style.tableLayout = "fixed";
		this.table.style.width = this.resizeContainer.offsetWidth;
	}
}

function isIE() {
	return !window.addEventListener;
}

function findPos(obj) {
	var curleft = curtop = 0;
	if (obj.offsetParent) {
		curleft = obj.offsetLeft
		curtop = obj.offsetTop
		while (obj = obj.offsetParent) {
			curleft += obj.offsetLeft
			curtop += obj.offsetTop
		}
	}
	
	return [curleft,curtop];
}

function hitTest(x, y, object, showOutput) {
	var coords = findPos(object);
	if (isIE()) {
		x--;
		y--;
	}

	//document.getElementById("output").innerHTML = y + " " + coords[1] + " " + (coords[1] + object.offsetHeight);
	//document.getElementById("pointer").style.top = y;
	//document.getElementById("pointer").style.left = x - 55;
	return x > coords[0] &&
		x < coords[0] + object.offsetWidth &&
		y > coords[1] &&
		y < coords[1] + object.offsetHeight;
}

function hitTestFixedCoords(curPosition, objPositionDimension) {
	var x = curPosition[0];
	var y = curPosition[1];

	var objX = objPositionDimension[0];
	var objY = objPositionDimension[1];
	
	var objWidth = objPositionDimension[2];
	var objHeight = objPositionDimension[3];

	return x >= objX &&
		x <= objX + objWidth &&
		y >= objY &&
		y <= objY + objHeight;
}

function addHandler(element, type, callback) {
	if (window.addEventListener) {
		element.addEventListener(type, callback, false);
	} else {
		element.attachEvent("on" + type, callback);
	}
}

function removeHandler(element, type, callback) {
	if (window.removeEventListener) {
		element.removeEventListener(type, callback, false);
	} else {
		element.detachEvent("on" + type, callback);
	}
}

function createClosure(object, functionRef, parameters) {
	return function() { functionRef.call(object, parameters); };
}

function getElem(elementID) {
	return document.getElementById(elementID);
}