var CX = 1;
var CY = 2;
var CW = 3;
var CH = 4;



var CORNER_BOTTOMRIGHT 	= 0;
var CORNER_TOPLEFT 				= 1;

var harmtile_padding  	= 1;
var harmtile_reversed 	= false;
var harmtile_corner 	= CORNER_BOTTOMRIGHT;

var dingen = new Array();

function addDing(ding) {
/*	var obj = document.getElementById(ding);
	obj.style.visibility = "hidden";*/
	dingen.push(ding);
}

function createElement(div, x,y,w,h) {
	return new Array(div,x,y,w,h);
}

function browserSize() {
  var myWidth = 0, myHeight = 0;
  if( typeof( window.innerWidth ) == 'number' ) {
    //Non-IE
    myWidth = window.innerWidth;
    myHeight = window.innerHeight;
  } else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
    //IE 6+ in 'standards compliant mode'
    myWidth = document.documentElement.clientWidth;
    myHeight = document.documentElement.clientHeight;
  } else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
    //IE 4 compatible
    myWidth = document.body.clientWidth;
    myHeight = document.body.clientHeight;
  }
  return new Array(myWidth,myHeight);
}

function arrange() {
//	var docw = window.innerWidth-16;
//	var doch = window.innerHeight-16;//document.height;
	var browserSizeArr = browserSize();
	var docw = browserSizeArr[0] - 32;
	var doch = browserSizeArr[1] - 32;	



	staticElements = new Array();
	var margin = 100;

	
	switch(harmtile_corner) {
		case CORNER_BOTTOMRIGHT:
			staticElements.push(	
				createElement("bottomLimit",	-margin,	doch, 			50000, 	margin				)
			);//bottom
			
			staticElements.push(
				createElement("rightLimit",		docw,		-margin,		margin, 		50000		)
			);//right
			break;

		case CORNER_TOPLEFT:
			staticElements.push(
				createElement("topLimit",		-margin,	-margin,		50000, 	margin				)
			);// top
			
			staticElements.push(
				createElement("leftLimit",		-margin,	-margin,		margin, 		50000		)
			);//left
			break;
	}
	
	if (harmtile_reversed) {
		dingen.reverse();
	}

	for (var i=0;i < dingen.length;i++) {
		var div = document.getElementById(dingen[i]);

		if (div != null) {
			doeDingGoed(div, i, docw, doch);
		}
	}
}

function trace(s) {
	var obj = document.getElementById("debug");
	obj.innerHTML += s + "<BR>";
}

function doeDingGoed(div,  index, canvasw, canvash) {
	var w = parseInt(div.clientWidth);
	var h = parseInt(div.clientHeight);	
		
	var startvalues = new Array(
		new Array(0,-12000),
		new Array(parseInt(canvasw)-w,12000)
	);

	var x = startvalues[harmtile_corner][0];
	var y = startvalues[harmtile_corner][1];

	w+=harmtile_padding ;
	h+=harmtile_padding ;
	var movingElement = createElement(div, x, y, w, h);
	var beweging = null;
	while (beweging || beweging == null) {
		switch(harmtile_corner) {
			case CORNER_BOTTOMRIGHT:
				beweging =  moveDown(movingElement) || moveRight(movingElement);
				break;
			case CORNER_TOPLEFT:
				beweging =  moveUp(movingElement) || moveLeft(movingElement);
				break;
		}
	}

	staticElements.push(movingElement);
	div.style.left = movingElement[CX] + "px";
	div.style.top = movingElement[CY] + "px";
	div.style.visibility = "visible";
}



function moveDown(movingElement) {
	var elementsBelow = new Array();
	
	var x = movingElement[CX];
	var y = movingElement[CY];
	var w = movingElement[CW];
	var h = movingElement[CH];


	for (var i=0;i < staticElements.length;i++) {
		var staticElement = staticElements[i];

		
		
		var x2 = staticElement[CX];
		var y2 = staticElement[CY];
		var w2 = staticElement[CW];
		var h2 = staticElement[CH];

		
		if (y2 >= y+h) {
			if (w > w2) {//test of punten van w2 op de lijn w liggen
				if (
					(x2 >= x && x2 <= x+w) ||
					(x2+w2 >= x && x2+w2 <= x+w)
				) {
					elementsBelow.push(staticElement);
				}
			} else {//test of punten van w op de lijn w2 liggen
				if (
					(x >= x2 && x <= x2+w2) ||
					(x+w >= x2 && x+w <= x2+w2)
				) {
					elementsBelow.push(staticElement);
				}
			}
		}
	}
	if (elementsBelow.length > 0) { // er is minstens 1 element gevonden dat zich onder het huidige element vindt en het niet raakt
		var bovensteElement = elementsBelow[0];
		for (var i=0;i < elementsBelow.length;i++) {
			if (elementsBelow[i][CY] < bovensteElement[CY]) {
				bovensteElement = elementsBelow[i];
			}
		}
		

		var newY = bovensteElement[CY]-movingElement[CH];
		if (newY != movingElement[CY]) {
			movingElement[CY] = newY;
			return true; 
		} else {
			return false;// nothing happened
		}	
	} else {

		return false;
	}
}



function moveUp(movingElement) {
	var elementsAbove = new Array();
	
	var x = movingElement[CX];
	var y = movingElement[CY];
	var w = movingElement[CW];
	var h = movingElement[CH];
	
	for (var i=0;i < staticElements.length;i++) {
		var staticElement = staticElements[i];

		var x2 = staticElement[CX];
		var y2 = staticElement[CY];
		var w2 = staticElement[CW];
		var h2 = staticElement[CH];

		if (y >= y2+h2) {
			if (w > w2) {//test of punten van w2 op de lijn w liggen
				if (
					(x2 > x && x2 < x+w) ||
					(x2+w2 > x && x2+w2 <= x+w)
				) {
					elementsAbove.push(staticElement);
				}
			} else {// test of punten van w op de lijn w2 liggen
				if (
					(x > x2 && x < x2+w2) ||
					(x+w > x2 && x+w <= x2+w2)
				) {
					elementsAbove.push(staticElement);
				}
			}
		}
	}
	
	if (elementsAbove.length > 0) { // er is minstens 1 element gevonden dat zich boven het huidige element vindt en het niet raakt
		var ondersteElement = elementsAbove[0];
		for (var i=0;i < elementsAbove.length;i++) {
			if (elementsAbove[i][CY] >=	ondersteElement[CY]) {
				ondersteElement = elementsAbove[i];
			}
		}

		var newY = ondersteElement[CY]+ondersteElement[CH];
		if (newY != movingElement[CY]) {
			movingElement[CY] = newY;
			return true; 
		} else {
			return false;// nothing happened
		}	
	} else {
		return false;
	}
}




function moveRight(movingElement) {
	var elementsBelow = new Array();
	
	var x = movingElement[CX];
	var y = movingElement[CY];
	var w = movingElement[CW];
	var h = movingElement[CH];
	

	for (var i=0;i < staticElements.length;i++) {
		var staticElement = staticElements[i];

		
		
		var x2 = staticElement[CX];
		var y2 = staticElement[CY];
		var w2 = staticElement[CW];
		var h2 = staticElement[CH];

		
		if (x2 >= x+w) {
			if (h > h2) {//test of punten van w2 op de lijn w liggen
				if (
					(y2 >= y && y2 <= y+h) ||
					(y2+h2 >= y && y2+h2 <= y+h)
				) {
					elementsBelow.push(staticElement);
				}
			} else {//test of punten van w op de lijn w2 liggen
				if (
					(y >= y2 && y <= y2+h2) ||
					(y+h >= y2 && y+h <= y2+h2)
				) {
					elementsBelow.push(staticElement);
				}
			}
		}
	}
	if (elementsBelow.length > 0) { // er is minstens 1 element gevonden dat zich onder het huidige element vindt en het niet raakt
		var bovensteElement = elementsBelow[0];
		for (var i=0;i < elementsBelow.length;i++) {
			if (elementsBelow[i][CX] < bovensteElement[CX]) {
				bovensteElement = elementsBelow[i];
			}
		}

		var newX = bovensteElement[CX]-movingElement[CW];
		if (newX != movingElement[CX]) {
			movingElement[CX] = newX	;
			return true; 
		} else {
			return false;// nothing happened
		}	
	} else {

		return false;
	}

}

function moveLeft(movingElement) {
	var elementsAbove = new Array();
	
	var x = movingElement[CX];
	var y = movingElement[CY];
	var w = movingElement[CW];
	var h = movingElement[CH];
	
	for (var i=0;i < staticElements.length;i++) {
		var staticElement = staticElements[i];

		var x2 = staticElement[CX];
		var y2 = staticElement[CY];
		var w2 = staticElement[CW];
		var h2 = staticElement[CH];

		if (x >= x2+w2) {
			if (h > h2) {//test of punten van w2 op de lijn w liggen
				if (
					(y2 > y && y2 < y+h) ||
					(y2+h2 > y && y2+h2 <= y+h)
				) {
					elementsAbove.push(staticElement);
				}
			} else {//test of punten van w op de lijn w2 liggen
				
				if (
					(y >= y2 && y <= y2+h2) ||
					(y+h >= y2 && y+h <= y2+h2)
				) {
					elementsAbove.push(staticElement);
				}
			}
		}
	}
	
	if (elementsAbove.length > 0) { 
		var ondersteElement = elementsAbove[0];
		for (var i=0;i < elementsAbove.length;i++) {
			if (elementsAbove[i][CX] >	ondersteElement[CX]) {
				ondersteElement = elementsAbove[i];
			}
		}

		var newX = ondersteElement[CX]+ondersteElement[CW];
		if (newX != movingElement[CX]) {
			movingElement[CX] = newX;
			return true; 
		} else {
			return false;// nothing happened
		}	
	} else {
		return false;
	}
}
		