rrequire 'test/unit/ui/console/testrunner'
require 'ci/reporter/rake/test_unit_loader.rb'
require 'test/unit'
require 'watir/Assertions'
require 'watir/testcase'

include Test::Unit::Assertions

 class Watir::Element


 	  def top_edge
		assert_exists
		assert_enabled
		ole_object.getBoundingClientRect.top.to_i
	  end

	  def top_edge_absolute
		top_edge + page_container.document.parentWindow.screenTop.to_i
	  end

	  def left_edge
		assert_exists
		assert_enabled
		ole_object.getBoundingClientRect.left.to_i
	  end

	  def left_edge_absolute
		left_edge + page_container.document.parentWindow.screenLeft.to_i
	  end

	  def mouse_hover(offsetX = 0, offsetY = 0)
		x = left_edge_absolute + offsetX
		y = top_edge_absolute + offsetY
		WindowsInput.move_mouse(x, y)
	  end

	  def mouse_click(offsetX = 0, offsetY = 0)
		x = left_edge_absolute
		y = top_edge_absolute
		WindowsInput.move_mouse(x, y)
		Watir.autoit.MouseClick("left", x+offsetX, y+offsetY, 1)
		sleep(2)
	  end

	  def right_click(offsetX = 0, offsetY = 0)
		x = left_edge_absolute
		y = top_edge_absolute
		WindowsInput.move_mouse(x+offsetX, y+offsetY)
		WindowsInput.right_click
	  end



end
 module WindowsInput

  # Windows API functions
  SetCursorPos = API.new('SetCursorPos', 'II', 'I', 'user32')
  SendInput = API.new('SendInput', 'IPI', 'I', 'user32')

  # Windows API constants
  INPUT_MOUSE = 0
  MOUSEEVENTF_LEFTDOWN = 0x0002
  MOUSEEVENTF_LEFTUP = 0x0004
  MOUSEEVENTF_RIGHTDOWN = 0x0008
  MOUSEEVENTF_RIGHTUP = 0x0010

  module_function

  def send_input(inputs)
	n = inputs.size
	ptr = inputs.collect {|i| i.to_s}.join # flatten arrays into single string
	SendInput.call(n, ptr, inputs[0].size)
  end

  def create_mouse_input(mouse_flag)
	mi = Array.new(7, 0)
	mi[0] = INPUT_MOUSE
	mi[4] = mouse_flag
	mi.pack('LLLLLLL') # Pack array into a binary sequence usable to SendInput
  end

  def move_mouse(x, y)
	SetCursorPos.call(x, y)
  end

  def right_click
	rightdown = create_mouse_input(MOUSEEVENTF_RIGHTDOWN)
	rightup = create_mouse_input(MOUSEEVENTF_RIGHTUP)
	send_input( [rightdown, rightup] )
	end

end


end


