// ===== Eurogamers Control Code ==============================================
// Word up! This is a big jumble of script which controls the Eurogamers front
// page.

var box, client, deltaX, deltaY, movecount;

var tempX = 0;
var tempY = 0;
var leftMargin = 0;

previousLeft = -1;
previousBlock = -1;
previousTop = 0;
var outerPadding = 35;

var page;
var blockPadding = 8;
var pagePadding = 0;
var pagePaddingDouble = pagePadding * 2;
var pageWidth = 1000;

var tempOnSelectStart;
var tempOnMouseDown;

var columns = new Array();
columns[0] = new Array();
columns[1] = new Array();
columns[2] = new Array();

var useBlanket	= false;
var useGhost	= true;		// use 'ghosted box' style temp instead of Windows style
var debug	= false;		// starts console logging.

document.onmousemove = mouseCoords;

function mouseCoords(ev)
{
	ev = ev || window.event;
	var theTarget = ev.target ? ev.target : ev.srcElement;
	if(ev.pageX || ev.pageY) //mozilla
	{
		tempX = ev.pageX;
		tempY = ev.pageY;
	}
	else //ie
	{
		tempX = ev.clientX + document.body.scrollLeft - document.body.clientLeft;
		tempY = ev.clientY + document.body.scrollTop  - document.body.clientTop;
	}	
	if(tempX == "NaN" || tempX < 0) tempX = -1;
	if(tempY == "NaN" || tempY < 0) tempY = -1;
}

// save all the positions in one POST rather than
// one for each block (much quicker this way)
function savePositions() {
	var block_list	= "";
	var params	= "action=update-blocks";
	
	for(i = 0; i < blocks.length; i++)
	{
		if(blocks[i].id != "temp")
		{
			block_list += blocks[i].id + ",";
			params += "&" + blocks[i].id + "-top=" + parseInt(blocks[i].style.top);
			params += "&" + blocks[i].id + "-left=" + parseInt(blocks[i].style.left);
			params += "&" + blocks[i].id + "-height=" + parseInt(blocks[i].offsetHeight);
		}
	}
	params += "&blocks=" + block_list;
	
	var superAjax =	new
		Ajax.Updater(
			"temp",
			"update.php",
			{
				method: 'post',
				parameters: params
			}
		);
}

function savePosition(position)
{
	if($(position))
	{
		if(left == "NaN") left = 0;	
		if(top  == "NaN") top  = 0;
		element = $(position);

		objectLeft	= getX(position);	
		objectTop	= getY(position);
		body	= element.innerHTML;
		params	= "&action=update-block" + 
			"&element=" + position +
			"&left=" + objectLeft +
			"&top=" + objectTop +
			"&body=" + escape(body) +
			"&height=" + element.offsetHeight;

		var superAjax =	new
			Ajax.Updater(
				position,
				"update.php",
				{
					method: 'post',
					parameters: params
				}
			);
	}
}

function setPosition(element, column, row, height)
{
	switch(column)
	{
		case 1:
			left = 0 + leftMargin;
			break;
		case 2:
			left = 305 + leftMargin;
			break;
		case 3:
			left = 610 + leftMargin;
			break;
		default:
			left = column;
			break;
	}

	element = $(element);
	element.style.left = left + "px";
	element.style.top  = row + "px";
	if(height == 25)
	{		
		element.style.height = "25px";
		minimize(element.id, false);
	}
	element.style.display = 'block';
}

function filterTempBlock( element, index, array ) {
	if(element[1] != "temp") {
		return element;
	}
}

function showTempBox( left, top, height )
{	
	$("temp").style.left = left + "px";
	$("temp").style.top = top + "px";
	$("temp").style.height = height + "px";
	$("temp").style.display = 'block';
}

var filtered = false;
var currentPosition = -1;

function checkColBounds(left, column, top, height) {

	// add new block into column array, and resort array
	// check to see the block it's in the same place as "temp" previously was
	// if it is, don't move temp box.

	// insert the temp block
	dummy = new Array(2);
	dummy[0] = top;
	dummy[1] = "temp";

	foundTemp = false;
	// strip out temp block

	filtered = columns[ column ];	
	for( i = 0; i < filtered.length; i ++ ) {
		if( filtered[ i ][ 1 ] == "temp" ) {
			filtered[ i ][ 0 ] = top;
			foundTemp = true;
		}
	}
	if( ! foundTemp ) {
		filtered.push( dummy );
	}
	filtered.sort(sortByTop);
	
	// find the new position of temp box
	for(i = 0; i < filtered.length; i++) {
		if( filtered[i][1] == "temp" ) {
			currentPosition = i;
		}
	}

	// what changed?
	
	if( left == -1 || currentPosition != previousBlock ) {
		//log( "HIT: " + previousBlock + ", " + currentPosition + "\n" );
		showTempBox( left, top, height );
		repositionBlock(left);
		previousBlock = currentPosition;
		if( left != previousLeft && previousLeft != -1 ) {
			//log( "Last col: " + previousLeft + ", " + left + "\n" );
			repositionBlock(previousLeft);
		}
		previousLeft = left;
		
	}
}

function killTempBox()
{	
	$("temp").style.display = 'none';
}

function kill(element)
{
	if(confirm("Really remove this block?" ) ) {
		if( $(element ) ) {
			page.removeChild($(element));
		}
		repositionBlocks();

		params	= "&action=remove-block" + 
			"&element=" + element;
			
		var superAjax =	new
			Ajax.Updater(
				"control-panel",
				"update.php",
				{
					method: 'post',
					parameters: params
				}
			);
	}
	killTooltip();
}

function checkBounds(box)
{
	objectLeft = parseInt(tempX);
	objectTop = parseInt(tempY);
	height = getOffsetHeight(box);	
	
	if(objectTop < 0) objectTop = 0;	
	if(objectLeft > (0 + leftMargin) && objectLeft <= (300 + leftMargin))
	{
		checkColBounds(0, 0, objectTop, height);
	}

	if(objectLeft >= (305 + leftMargin) && objectLeft <= (605 + leftMargin))
	{
		checkColBounds( 305, 1, objectTop, height);
	}

	if(objectLeft >= (610 + leftMargin))
	{
		checkColBounds(610, 2, objectTop, height);
	}
}

function edit(element)
{
	maximize(element);
	$(element).style.zIndex = 1000;

	$('edit-' + element).style.display = 'none';
	$('cancel-edit-' + element).style.display = 'block';	
	
	$('config-' + element).style.display = 'block';
	$('config-' + element).style.zIndex = 1001;
	repositionBlocks();
}

function cancel(element)
{
	$(element).style.zIndex = 100;

	$('edit-' + element).style.display = 'block';
	$('cancel-edit-' + element).style.display = 'none';

	$('config-' + element).style.display = 'none';
	$('config-' + element).style.zIndex = 100;

	$('edit-' + element).style.display = 'block';	

	if(useBlanket)
	{
		killBlanket();
		$(element).style.zIndex = 200;
	}	
	repositionBlocks();
}

function dragRelease(evt)
{
	column	= 0;
	evt	= new Evt(evt);
	element	= box.id;
	
	objectLeft	= parseInt(tempX);
	objectTop	= parseInt(tempY);
	
	if(objectLeft <= (305 + leftMargin))
	{
		column = 0;
	}
	else if(objectLeft >= (305 + leftMargin) && objectLeft <= (610 + leftMargin))
	{
		column = 305;
	}
	else if(objectLeft >= (610 + leftMargin))
	{
		column = 610;		
	}
	
	killTempBox();
	setX(element, column);	

	// might as well do them all
	repositionBlocks();
	$(element).style.zIndex = 150;	
	savePositions();

	reviveDrag(element);

	Evt.removeEventListener(document, "mousemove", dragMove, false);
	Evt.removeEventListener(document, "mouseup", dragRelease, false);	
}

function repositionBlock( left )
{
	switch( left ) {
		case 0:
			column = 0;
			break;
		case 305:
			column = 1;
			break;
		case 610:
			column = 2;
			break;
	}

	var heights = new Array( blocks.length + 1 );


	var i;
	for(i = 0; i < blocks.length; i++)
	{
		heights[i] = new Array(2);		
		if( parseInt( blocks[ i ].style.left ) == parseInt( left ) && blocks[ i ].style.display == 'block' ) {			
			heights[ i ][ 0 ] = parseInt( blocks[ i ].style.top );
			heights[ i ][ 1 ] = blocks[ i ].id;
		}
	}
	// the temp block is visible, so push it onto sorting list so that space is made for it
	if( parseInt( tempBlockObj.style.left ) == parseInt( left ) && tempBlockObj.style.display == 'block' ) {
		heights[i] = new Array(2);		
		heights[ i ][ 0 ] = parseInt( tempBlockObj.style.top );
		heights[ i ][ 1 ] = "temp";
	}

	heights = heights.filter( checkNull ).sort( sortByTop );

	elementsCounter = 0;
	var previousHeight = 0;
	counter = 0;

	// now the sidebar is on the homepage, we need to push the
	// third column blocks down even further
	var rightHeight = getSidebarHeight();
		
	columnheights[column] = 0;
	for(i = 0; i < heights.length; i++)
	{	
		if( $(heights[i][1]) )
		{
			details = new Array(2);
			details[0] = parseInt($(heights[i][1]).style.top);
			details[1] = heights[i][1];

			columns[column][i] = details;

			if( left == 610 ) {
				// add the sidebar height to the advert offset
				previousHeight = blockHeader + rightHeight;
			} else {
				previousHeight = blockHeader;
			}
						
			for( j = 0; j < i; j++ ) {
				if($(heights[j][1]))
				{					
					previousHeight += $(heights[j][1]).offsetHeight + blockMargin;
					elementsCounter++;
				}
			}
			
			// set the new height
			$( heights[i][1] ).style.top = previousHeight + "px";
			
			// display the block
			$( heights[i][1] ).style.display = "block";
			
			columnheights[column]+= $(heights[i][1]).offsetHeight + blockMargin;
		}
		
	}
}

function checkNull(element, index, array) {		
	if(element[1] != undefined) {
		return element;
	}
}

function sortByTop(a, b) {
	return a[0] - b[0];
}

function repositionBlocks() {
	// get a fresh set
	repositionBlock(0);
	repositionBlock(305);
	repositionBlock(610);
	repositionFooter();
}

function updateVars() {
	page = $('page');	
	if( notMoz ) {
		clientWidth = document.body.clientWidth;
	} else {
		clientWidth = document.documentElement.clientWidth;
	}
	leftMargin = ((clientWidth - pageWidth) / 2) + outerPadding;
}

function killDrag( element )
{
	tempOnSelectStart	= $(element).onselectstart;
	tempOnMouseDown		= $(element).onselectstart;
	$(element).onselectstart	= function() { return false; }
	$(element).onmousedown	= function() { return false; }
}

function reviveDrag( element )
{
	$(element).onselectstart	= tempOnSelectStart;
	$(element).onmousedown	= tempOnMouseDown;
}

function getOffsetHeight(node) {
	if(notMoz || (notMoz && $(node)))
	{
		if($(node))
		{
			return parseInt($(node).offsetHeight);
		}
	}
	return parseInt(node.offsetHeight);
}

function getX(node) {
	if(notMoz || $(node))
	{
		if($(node))
		{
			return parseInt($(node).style.left);
		}
	}
	return parseInt(node.style.left);
}

function getY(node) {
	if(notMoz || $(node))
	{
		if($(node))
		{
			return parseInt($(node).style.top);
		}
	}
	return parseInt(node.style.top);
}

function getWidth(node) {
	if(notMoz || (notMoz && $(node)))
	{
		return parseInt($(node).style.width);
	}
	return parseInt(node.style.width);
}

function getHeight(node) {
	if(notMoz || (notMoz && $(node)))
	{
		return parseInt($(node).style.height);
	}
	return parseInt(node.style.height);
}

function setX(node,x) {
	if(notMoz || (notMoz && $(node)))
	{
		if($(node))
		{
			$(node).style.left = ( x + pagePaddingDouble ) + "px";
		}
	}
	else
	{
		$(node).style.left = ( x + pagePaddingDouble ) + "px";
	}
}

function setY(node,y) {
	if(notMoz || (notMoz && $(node)))
	{
		if($(node))
		{
			$(node).style.top = y + "px";
		}
	}
	else
	{
		$(node).style.top = y + "px";
	}	
}

function Evt(evt) {	
	this.evt = evt ? evt : window.event;
	this.source = evt.target ? evt.target : evt.srcElement;
	if(notMoz)
	{
		this.source = window.event.srcElement.id;
	}	
	this.x = evt.pageX ? evt.pageX : evt.clientX;
	this.y = evt.pageY ? evt.pageY : evt.clientY;
}

Evt.prototype.toString = function () {
	return "Evt [ x = " + this.x + ", y = " + this.y + " ]";
};

Evt.prototype.consume = function () {
	if (this.evt.stopPropagation) {
		this.evt.stopPropagation();
		this.evt.preventDefault();
	} else if (this.evt.cancelBubble) {
		this.evt.cancelBubble = true;
		this.evt.returnValue  = false;
	}
};

Evt.addEventListener = function (target,type,func,bubbles) {
	if (document.addEventListener) {
		target.addEventListener(type,func,bubbles);
	} else if (document.attachEvent) {
		target.attachEvent("on"+type,func,bubbles);
	} else {
		target["on"+type] = func;
	}
};

Evt.removeEventListener = function (target,type,func,bubbles) {
	if (document.removeEventListener) {
		target.removeEventListener(type,func,bubbles);
	} else if (document.detachEvent) {
		target.detachEvent("on"+type,func,bubbles);
	} else {
		target["on"+type] = null;
	}	
};

function minimize(element, saveBlock)
{	
	$("show-" + element).style.display = 'block';
	$("hide-" + element).style.display = 'none';
	$(element).style.overflow = 'hidden';
	$(element).style.height = '23px';	
	repositionBlocks();
	if(saveBlock)
	{
		savePositions();
	}
}

function maximize(element)
{
	$("show-" + element).style.display = 'none';
	$("hide-" + element).style.display = 'block';
	$(element).style.overflow = 'visible';
	$(element).style.height = 'auto';
	repositionBlocks();
	savePositions();
}

function dragPress(evt, parent) {
	evt = new Evt(evt);
	if( parent ) {
		evt.source = parent;
		evt.source.id = parent;
	}

	box = evt.source;
	box = $(parent);

	if( evt.source.id ) {
		block = evt.source.id;		
	} else {
		block = evt.source;
		
	}

	block_id = block;
	if( block ) {
		if( $( block ) ) {
			killDrag( block );
			block = $(block).className;
		}
	}
	
	// match checks to make sure we're not dragging buttons we shouldn't.
	if( /community-block/.test( block ) ) {
		$( block_id ).style.zIndex = 1000;
		deltaX = evt.x - getX( box );
		deltaY = evt.y - getY( box );
		Evt.addEventListener( document, "mousemove", dragMove, false);
		Evt.addEventListener( document, "mouseup", dragRelease, false);	
	}
}

function dragMove( evt ) {
	evt = new Evt(evt);
	theParent = checkBounds( box );
	element = box.id;
	setX( element, evt.x - deltaX );
	setY( element, evt.y - deltaY );
	evt.consume();
}

function updateTickbox(element, platform)
{
	value = "";
	checked = false;
	for(i = 0; i < 100; i++)
	{
		if($(element + '-' + i) && $(element + '-' + i).checked)
		{
			value = value + $(element + '-' + i + '-data').value + ',';
			checked = true;
		}		
	}
	$(element).value = value;	
}

function updateAlert(element)
{
	value = "";
	checked = false;
	for(i = 0; i < 100; i++)
	{
		if($(element + '-' + i) && $(element + '-' + i).checked)
		{
			checked = true;
		}		
	}
	if(!checked)
	{
		alert("Sorry, you need at least one option checked.");
		return false;
	}
	return true;
}

// function to alleviate IE/Opera not having an array filter function
if (!Array.prototype.filter)
{
	Array.prototype.filter = function(fun /*, thisp*/)
	{
		var len = this.length;
		if (typeof fun != "function")
		{
			throw new TypeError();
		}

		var res = new Array();
		var thisp = arguments[1];
		for (var i = 0; i < len; i++)
		{
			if(i in this)
			{
				var val = this[i]; // in case fun mutates this
				if (fun.call(thisp, val, i, this))
				{
					res.push(val);
				}
			}
		}
		return res;
	};
}

function toggleControlPanel() {
	togglePanel("control-panel", toggleControlPanel);
}

function closeControlPanel() {
	toggleControlPanel();
}

var FadeInterval = 40;
var FadeIterations = 2;
var IterationsCompleted = 0;
var FadeSteps = new Array();
	FadeSteps[0] = "0";
	FadeSteps[1] = "0.1";
	FadeSteps[2] = "0.2";
	FadeSteps[3] = "0.3";
	FadeSteps[4] = "0.4";
	FadeSteps[5] = "0.5";
	FadeSteps[6] = "0.6";
	FadeSteps[7] = "0.7";
	FadeSteps[8] = "0.8";
	FadeSteps[9] = "0.9";
	FadeSteps[10] = "1";

function doFadeOut(colorId, targetId) {	
	if(IterationsCompleted < FadeIterations)
	{
		if(colorId >= 0)
		{
			setOpacity(targetId, FadeSteps[colorId]);
			colorId--;		
			// Wait a little bit and fade another shade
			setTimeout("doFadeOut("+colorId+",'"+targetId+"')", FadeInterval);
		}
		else
		{        	
			doFadeIn(0, targetId);
		}
	}
}

function doFadeIn(colorId, targetId) {	
	if(colorId <= 10)
	{
		setOpacity(targetId, FadeSteps[colorId]);
        	colorId++;		
        	// Wait a little bit and fade another shade
        	setTimeout("doFadeIn("+colorId+",'"+targetId+"')", FadeInterval);
        }
        else
        {
        	IterationsCompleted++;
		doFadeOut(10, targetId);
        }
}

function addBookmark(element)
{
	$(element).style.zIndex = 1000;
	$('bookmark-adder').style.zIndex = 10000;
	$('bookmark-adder').style.display = 'block';
}

function cancelBookmark(element)
{
	$(element).style.zIndex = 150;
	$('bookmark-adder').style.display = 'none';
}

function log(message)
{
	if(debug && $('console'))
	{
		$('console').value =  message + ' ' + $('console').value;
	}
}

function clearLog(message)
{
	if(debug && $('console'))
	{
		$('console').value =  '';
	}
}

function tooltip(element, caption, offset, width)
{
	if(! $('tooltip'))
	{
		var tooltip = document.createElement('p');
		tooltip.setAttribute('id','tooltip');
		tooltip.style.position = "absolute";
		tooltip.style.left = ( parseInt($(element).style.left) + offset ) + "px";
		tooltip.style.top = ( parseInt($(element).style.top) - 30) + "px";
		if(width > "")
		{
			tooltip.style.width = width + "px";
		}
		else
		{
			tooltip.style.width = "auto";
		}
		tooltip.style.zIndex = 1500;
		tooltip.style.display = 'block';
		tooltip.innerHTML = "<a href=\"#\"><span>" + caption + "</span></a>";
		$('page').appendChild(tooltip);
	}
}

function killTooltip()
{
	while($('tooltip'))
	{
		$('page').removeChild($('tooltip'));
	}
}

function switchLayout(overwrite)
{
	document.location = 'update.php?action=merge&overwrite=' + overwrite;
}

function confirmReset()
{
	if(confirm("Really reset your Homepage back to the Default Layout?"))
	{
		document.location = "customised.php?reset=true";
	}
}

function checkBookmarks()
{
	if($('bookmark-name').value == "")
	{
		alert("Please enter a name for the bookmark.");
		return false;
	}
	if($('bookmark-url').value == "" || $('bookmark-url').value == "http://")
	{
		alert("Please enter a URL to bookmark.");
		return false;
	}
	return true;
}