// Orangeview Crosshair v1
// mouse icons, movement marker, carrying_element mouse drag
// (c) 2007 Christer Kaitila

// fixme: lowlevel routines (get element and style) should use sprite class

var xhairversion = "v1.14"; // buildable dragger and colliders and zsort! carrying is just a styled ele

var xhair_gets_pushed_away_from_colliders = true;
var xhair = null;	// html element that follows the mouse around
var ximg_ele = null;	// clipped sprite sheet
var xwalkto = null;	// html element that sits on the ground
var carrying_drag_offset = -16; // center the pickup while dragging
var cursor_offset = -32; // center the mouse and walk xhairs
var xhair_frame_height = 64; // for the x.png spritesheet
var previous_mousemove_function = null; // play nicely
var previous_mousedown_function = null; // with game engine
var xhair_x = 0;
var xhair_y = 0;

function xhair_init() // the only function that uses getElementById - but many use .style
{
	xhair = document.getElementById('x');
	ximg_ele = document.getElementById('ximg');
	xwalkto = document.getElementById('xwalkto');
	previous_mousemove_function = document.onmousemove;
	previous_mousedown_function = document.onmousedown;
	document.onmousemove = xhair_mousemove;
	document.onmousedown = xhair_mousedown;
}

function xhair_change_frame(fnum)
{
	if (ximg_ele) ximg_ele.style.top = (-1*fnum*xhair_frame_height)+'px';
}

function xhair_move(mx,my)
{	// this is already in world coordinates

	//alert('DEBUG: xhair_move: '+mx+','+my);
	mx = parseInt(mx);
	my = parseInt(my);
	if (xhair_x != mx)
	{
		xhair_x = mx;
		xhair.style.left = mx+cursor_offset+'px';
		if (window.carrying_element) carrying_element.style.left = mx+carrying_drag_offset+'px'; // +game.viewport_current_px
		//if (window.building_pending_sprite_being_dragged && window.building_pending_sprite) building_pending_sprite.el.style.left = mx+'px';
	}
	if (xhair_y != my)
	{
		xhair_y = my;
		xhair.style.top = my+cursor_offset+'px';
		if (window.carrying_element) carrying_element.style.top = my+carrying_drag_offset+'px'; // +game.viewport_current_py
		//if (window.building_pending_sprite_being_dragged && window.building_pending_sprite) building_pending_sprite.el.style.top = my+'px';
	}

	// this forces proper z sorting of sprites plus colliders in the right place
	if (window.carrying_element)
	{
		// not a sprite - an ele
		// carrying_element.move(mx+carrying_drag_offset,my+carrying_drag_offset);
		// carrying_element.push_away(); // collide
	}
	if (window.building_pending_sprite_being_dragged && window.building_pending_sprite)
	{
		building_pending_sprite.move(mx,my);
		building_pending_sprite.push_away(); // collide
	}

}

function xwalkto_move(mx,my) // fixme: one frame behind the action?
{
	if (window.game)
	{	// level coordinates, not screen coords
		mx = game.mouselevelx;
		my = game.mouselevely;
	}
	else
	{
		mx = parseInt(mx);
		my = parseInt(my);
	}
	// not a sprite, not z index sorted
	xwalkto.style.left = mx+cursor_offset+'px';
	xwalkto.style.top = my+cursor_offset+'px';
	// no zIndex required: always underneath
}

function xwalkto_hide()
{
	xwalkto.style.display='none';
}

function xwalkto_show()
{
	xwalkto.style.display='block';
}

function xhair_hide()
{
	xhsir.style.display='none';
}

function xhair_show()
{
	xhair.style.display='block';
}

function xhair_mousemove(anevent)
{
	if (anevent) // moz
	{
		mousex = anevent.pageX;
		mousey = anevent.pageY;
	}
	else // ie
	{
		mousex = window.event.clientX;
		mousey = window.event.clientY;
	}

	// collide and push

	// self-collisions happen
	/*
	var pushxy = [mousex+game.viewport_current_px,mousey+game.viewport_current_py];
	// push around colliders?
	if (xhair_gets_pushed_away_from_colliders)
	{
		if (window.vector_push_away)
			pushxy = vector_push_away(pushxy);
	}
	xhair_move(pushxy[0],pushxy[1]);
	*/
	xhair_move(mousex+game.viewport_current_px,mousey+game.viewport_current_py);

	// outside level
	//xhair_move(mousex,mousey);

	if (previous_mousemove_function) previous_mousemove_function(anevent);
}

function xhair_mousedown(anevent)
{
	if (window.gui_owns_clicks) return; // so you can give items to friends

	if (anevent) // moz
	{
		mousex = anevent.pageX;
		mousey = anevent.pageY;
	}
	else // ie
	{
		mousex = window.event.clientX;
		mousey = window.event.clientY;
	}

	if (window.currently_logged_in)
	{
		xwalkto_move(mousex+game.viewport_current_px,mousey+game.viewport_current_py);
		xwalkto_show();
		// maybe drop an item if we are carrying one (see inventory.js)
		if (window.carrying_element) drop_carrying_element(mousex+game.viewport_current_px,mousey+game.viewport_current_py);

		// move dupe? see mouseclick in engine
		//if (window.building_pending_sprite_being_dragged)
		//{
		//	window.building_pending_sprite_being_dragged = false;
		//	if (window.building_pending_sprite) building_pending_sprite.move(mousex+game.viewport_current_px,mousey+game.viewport_current_py);
		//}

	}

	if (previous_mousedown_function) previous_mousedown_function(anevent);
}

//alert('xhair loaded.');
xhair_init();
//alert('xhair inited.');
