function EditorStep()
  palette = palette or false
  AnimateTiles()

  if Keybind:CheckPressed(Keybind.editor.palette) then
    if palette then
      palette = false
      palette_scroll_x = nil
      palette_scroll_y = nil
    else
      palette = true
      palette_scroll_x = 0
      palette_scroll_y = 0
    end
  end
  if love.keyboard.isDown('a',"left") then
    Camera.pos.x = Camera.pos.x - 3*game.scale
  end
  if love.keyboard.isDown('d',"right") then
  	Camera.pos.x = Camera.pos.x + 3*game.scale
  end
  if love.keyboard.isDown("up", "w") then
  	Camera.pos.y = Camera.pos.y - 3*game.scale
  end
	if love.keyboard.isDown("down", "s") then
		Camera.pos.y = Camera.pos.y + 3*game.scale
	end

  if palette then
    if Keybind:CheckPressed(Keybind.debug.debug) then
      local next = false
      local export = nil
      for k, v in pairs(tileset) do
        if export == nil then
          export = v
        end
        if next then
          LevelData.tileset = v
          next = false
          break
        end

        if v == LevelData.tileset then
          next = true
        end
      end
      if next then
        LevelData.tileset = export
      end
    	LevelGetTileData()
    	LevelIndexTiles()
    end
  end

  if Keybind:CheckPressed(Keybind.debug.reload) then
  	ExportLevel("test")
  end

  if Keybind:CheckPressed(Keybind.debug.editor) then
  	editor_mode = false
  	TileCreateObjects()
  end
end

function EditorScroll(y)
	if palette then
		if love.keyboard.isDown("lshift") then
			palette_scroll_y = palette_scroll_y + y
		else
			palette_scroll_x = palette_scroll_x + y
		end
	else
		local oscale = game.scale
	 	game.scale = math.max(0.1,game.scale + y/16)
	end
end

function EditorDraw()
  GameworldDrawPrepare()
  GameworldDrawBackground()
  GridDisplay()
  GameworldDrawForeground()
  GameworldDrawEnd()
  EditorDoEdit()

  DrawSelectingPaletteTile()
  if palette then
    EditorDoPalette()
  end
end

function EditorDoEdit()
  local mouse_x = love.mouse.getX()
  local mouse_y = love.mouse.getY()
  local horizontal = 1+math.floor(((mouse_x/game.scale) / tileProperties.width) + (Camera.pos.x / tileProperties.width))
  local vertical = 1+math.floor(((mouse_y/game.scale) / tileProperties.height) + (Camera.pos.y / tileProperties.height))
  local expand_h = 0
  local expand_v = 0
  local LevelWidth = LevelGetTileWidth()
  local LevelHeight = LevelGetTileHeight()

  if horizontal > LevelWidth then
	   expand_h = horizontal-LevelWidth
  elseif horizontal < 0 then
	   expand_h = horizontal
	end
	if vertical > LevelHeight then
	   expand_v = vertical-LevelHeight
	elseif vertical < 0 then
	   expand_v = vertical
	end
  love.graphics.print("> " .. horizontal .. ", " .. vertical .. "; " .. math.floor(mouse_x / game.scale + Camera.pos.x) .. ", " .. math.floor(mouse_y / game.scale + Camera.pos.y))
  love.graphics.print("> " .. LevelWidth .. "(" .. expand_h .. "), " .. LevelHeight .. "(".. expand_v .. ")", 0, 10)

  if not palette then
  	if 	LevelTiles[vertical] ~= nil
  	and LevelTiles[vertical][horizontal] ~= nil
  	and love.keyboard.isDown("lshift") ~= true
  	and love.keyboard.isDown("lctrl") ~= true
  	then
      if Keybind:CheckDown(Keybind.generic.lclick)
      and selecting_tile ~= nil
      then
        SetTile(vertical,horizontal,selecting_tile)
      elseif Keybind:CheckDown(Keybind.generic.rclick) then
        SetTile(vertical,horizontal,0)
      end
      LevelReloadTiles()

    elseif Keybind:CheckPressed(Keybind.generic.lshift) then
  	  LevelExpandCanvas(math.sign(expand_h),math.sign(expand_v))
      LevelReloadTiles()
    elseif Keybind:CheckPressed(Keybind.generic.lctrl) then
      LevelReduceCanvas(math.sign(expand_h),math.sign(expand_v))
      LevelReloadTiles()
    end
  end
end

function DrawSelectingPaletteTile()
  if selecting_tile ~= nil and selecting_tile ~= 0 then

    local mouse_x = love.mouse.getX()
    local mouse_y = love.mouse.getY()
    local horizontal = math.floor(((mouse_x/game.scale) / tileProperties.width) + (Camera.pos.x / tileProperties.width))
    local vertical = math.floor(((mouse_y/game.scale) / tileProperties.height) + (Camera.pos.y / tileProperties.height))
    local draw_x = tileProperties.width * horizontal - Camera.pos.x
    local draw_y = tileProperties.height * vertical - Camera.pos.y

    love.graphics.draw(
  		LevelData.tileset,
      TileIndex[selecting_tile],
      draw_x,
      draw_y
    )
  end
end

function EditorDoPalette()

  local width = LevelData.tileset:getPixelWidth()/tileProperties.width
	local height = LevelData.tileset:getPixelHeight()/tileProperties.height

  love.graphics.setColor(0,0,0,1)
  love.graphics.rectangle(
    "fill",
    (palette_scroll_x + 1) * (tileProperties.width+1),
    (palette_scroll_y + 1) * (tileProperties.height+1),
    1 + LevelData.tileset:getPixelWidth() * ((tileProperties.width+1) / tileProperties.width),
    1 + LevelData.tileset:getPixelHeight()* ((tileProperties.height+1) / tileProperties.height)
  )


  love.graphics.setColor(1,1,1,1)
  local position_x = 1
  local position_y = 1
  for i = 1, #TileIndex-width-1 do

    local tile_x = (palette_scroll_x + position_x) * (tileProperties.width+1)
    local tile_y = (palette_scroll_y + position_y) * (tileProperties.height+1)

    love.graphics.draw(
  		LevelData.tileset,
  		TileIndex[i],
  		tile_x,
  		tile_y,
  		0,
  		1,
  		1
  	)
    if Keybind:CheckDown(Keybind.generic.lclick) then
      local mouse_x = love.mouse.getX()
    	local mouse_y = love.mouse.getY()

    	if 	mouse_x > (tile_x) * game.scale
      and mouse_x < (tile_x + tileProperties.width) * game.scale
      and mouse_y > (tile_y) * game.scale
      and mouse_y < (tile_y + tileProperties.height) * game.scale
      then
        selecting_tile = position_x + ((position_y-1) * width)

        love.graphics.print(selecting_tile .. " | " .. tile_x .. ", " .. tile_y, 0, 20)
      end
    end

    if Keybind:CheckDown(Keybind.generic.rclick) then
      selecting_tile = nil
    end

    if selecting_tile ~= nil and selecting_tile ~= 0 and i == selecting_tile then
      love.graphics.setColor(1,0,1,1)
			love.graphics.rectangle(
				"line",
			  tile_x,
				tile_y,
				tileProperties.width,
				tileProperties.height
			)
      love.graphics.setColor(1,1,1,1)
    end

    position_x = position_x + 1

  	if position_x > width then
  		position_x = position_x - width
  		position_y = position_y + 1
  	end
	end


  love.graphics.rectangle(
	 "line",
   (palette_scroll_x + 1) * (tileProperties.width+1),
   (palette_scroll_y + 1) * (tileProperties.height+1),
   1 + LevelData.tileset:getPixelWidth() * ((tileProperties.width+1) / tileProperties.width),
   1 + LevelData.tileset:getPixelHeight()* ((tileProperties.height+1) / tileProperties.height)
	)
end
