module OperaWatir
  # @private
  # This module is to share functions in the driver between modules so 
  # should not be in the documentation
  module DesktopCommon
    include DesktopEnums

private
    def opera_desktop_action(action_name, *params)
      data = 0
      data_string = ""
      data_string_param = ""
      
      # Sort the parameters into the variables based
      # on type and order
      params.each { |param| 
        if param.is_a? Integer
          data = param
        end

        if param.is_a? String
          if data_string.empty?
            data_string = param
          elsif 
            data_string_param = param
          end
        end
      }
      
      #puts "data: " + data.to_s
      #puts "data_string: " + data_string
      #puts "data_string_param: " + data_string_param
      
      @driver.operaDesktopAction(action_name, data, data_string, data_string_param)
    end

    def key_press_direct(key, *opts)
      list = Java::JavaUtil::ArrayList.new
      opts.each { |mod| list << KEYMODIFIER_ENUM_MAP[mod] }
      driver.keyPress(key, list)
    end
    
    def key_down(key, *opts)
      puts "keydown"
      list = Java::JavaUtil::ArrayList.new
      opts.each { |mod| list << KEYMODIFIER_ENUM_MAP[mod] }
      driver.keyDown(key, list)
    end
    
    def key_up(key, *opts)
      puts "keyup"
      list = Java::JavaUtil::ArrayList.new
      opts.each { |mod| list << KEYMODIFIER_ENUM_MAP[mod] }
      driver.keyUp(key, list)
    end
    
   # Private wait functions
    #
    def wait_start
      driver.waitStart()
    end
 
    def wait_for_window_shown(win_name = "")
      driver.waitForWindowShown(win_name)
    end
 
    def wait_for_window_updated(win_name = "")
      driver.waitForWindowUpdated(win_name)
    end
 
    def wait_for_window_activated(win_name = "")
      driver.waitForWindowActivated(win_name)
    end
 
    def wait_for_window_close(win_name = "")
      driver.waitForWindowClose(win_name)
    end
    
    def wait_for_window_loaded(win_name = "")
      win_id = driver.waitForWindowLoaded(win_name)
      # Hack to allow for Javascript focus events and the like
      # We need to increase this until we have fixed the bug with the 
      # tab title taking extra time to change
      sleep(0.5)
      win_id
    end
    
    def wait_for_widget_enabled
      max_timeout = 1.5
      curr_timeout = 0.0
      step = 0.1
      
      while curr_timeout < max_timeout  
        if element(true).isEnabled == true
          break
        end

        sleep(step)
        curr_timeout += step
      end
      
      # Check we didn't exceed the timeout
      if curr_timeout >= max_timeout
        return false
      end
      
      # Return true
      true
    end
  end
end