--[[WORKING ON
doubleTap - UnFinished!
touchRendering - Broken
]]
function gui:TClickable(mx,my)
	local x,y,w,h=love.graphics.getScissor()
	if _GuiPro.HasStencel then
		local obj=_GuiPro.StencelHolder
		if self:isDescendant(obj) then
			return math.sqrt((mx-obj.x)^2+(my-obj.y)^2)<=(obj.offset.size.x or 0)
		end
	end
	if not(x) then
		return true
	end
	return not(mx>x+w or mx<x or my>y+h or my<y)
end
function gui:touchable(t)
	local touches = love.touch.getTouches()
	local x,y=0,0
	for i, id in ipairs(touches) do
		if self.id==id then
			x, y = love.touch.getPosition(id)
			return (x > self.x and x < self.x+self.width and y > self.y and y < self.y+self.height and self:TClickable(x,y) and self:eventable())
		end
	end
	self.id=-1
end
multi:newTask(function() -- A bit of post-loading haha
	gui.touchpressed=multi:newConnection()
	gui.touchreleased=multi:newConnection()
	gui.touchmoved=multi:newConnection()
	love.touchpressed=Library.convert(love.touchpressed or function() end)
	love.touchreleased=Library.convert(love.touchreleased or function() end)
	love.touchmoved=Library.convert(love.touchmoved or function() end)
	love.touchpressed:inject(function(id, x, y, dx, dy, pressure) gui.touchpressed:Fire(id, x, y, dx, dy, pressure) return {id, x, y, dx, dy, pressure} end,1)
	love.touchreleased:inject(function(id, x, y, dx, dy, pressure) gui.touchreleased:Fire(id, x, y, dx, dy, pressure) return {id, x, y, dx, dy, pressure} end,1)
	love.touchmoved:inject(function(id, x, y, dx, dy, pressure) gui.touchmoved:Fire(id, x, y, dx, dy, pressure) return {id, x, y, dx, dy, pressure} end,1)
	_GuiPro.TouchReady=true
	_GuiPro.TouchRegister={}
	gui.touchpressed:connect(function(id, x, y, dx, dy, pressure)
		for i,v in pairs(_GuiPro.TouchRegister) do
			if #v.tid==0 then
				if (x > v.x and x < v.x+v.width and y > v.y and y < v.y+v.height and v:TClickable(x,y) and v:eventable()) then 
					v:addTID(id)
					v.touchcount=1
					for i=1,#v.ToFuncP do
						v.ToFuncP[i](v,id, x-v.x, y-v.y, dx, dy or 0, pressure or 1)
					end
				end
			elseif not(v:hasTID(id)) then
				if (x > v.x and x < v.x+v.width and y > v.y and y < v.y+v.height and v:TClickable(x,y) and v:eventable()) then
					v:addTID(id)
					v.touchcount=v.touchcount+1
					for i=1,#v.ToFuncP do
						v.ToFuncP[i](v,id, x-v.x, y-v.y, dx, dy or 0, pressure or 1)
					end
				end
			end
		end
	end)
	gui.touchreleased:connect(function(id, x, y, dx, dy, pressure)
		for i,v in pairs(_GuiPro.TouchRegister) do
			if v:hasTID(id) then
				v:removeTID(id)
				for i=1,#v.ToFuncR do
					v.ToFuncR[i](v,id, x-v.x, y-v.y, dx, dy or 0, pressure or 1)
				end
			end
		end
	end)
	gui.touchmoved:connect(function(id, x, y, dx, dy, pressure)
		for i,v in pairs(_GuiPro.TouchRegister) do
			if v:hasTID(id) and (x > v.x and x < v.x+v.width and y > v.y and y < v.y+v.height and v:TClickable(x,y) and v:eventable()) then 
				for i=1,#v.ToFuncM do
					v.ToFuncM[i](v,id, x-v.x, y-v.y, dx, dy or 0, pressure or 1)
				end
			elseif v:hasTID(id) and not((x > v.x and x < v.x+v.width and y > v.y and y < v.y+v.height and v:TClickable(x,y) and v:eventable())) then 
				v:removeTID(id)
				for i=1,#v.ToFuncR do
					v.ToFuncR[i](v,id, x-v.x, y-v.y, dx, dy or 0, pressure or 1)
				end
			end
		end
	end)
end)
-- now that that is done lets set up some more post loading checks
_GuiPro.int=multi:newProcess()
_GuiPro.int:Start()
_GuiPro.int:setJobSpeed(.001)
_GuiPro.EXACT=0
_GuiPro.LAX=.01
_GuiPro.LAZY=.05
-- now lets define the reg function
function gui.Compare(a,b,v,tp)
	if tp==">" then
		if (a+v>b or a-v>b) then
			return true
		end
	elseif tp=="<" then
		if (a+v<b or a-v<b) then
			return true
		end
	elseif tp=="<=" then
		if (a+v<=b or a-v<=b) then
			return true
		end
	elseif tp==">=" then
		if (a+v>=b or a-v>=b) then
			return true
		end
	elseif tp=="==" then -- this one is gonna be tricky
		if (a>=b-v and a<=b+v) or (b>=a-v and b<=a+v) then
			return true
		end
	end
	return false
end
function gui:regesterTouch()
	local obj=self
	obj.ToFuncP={}
	obj.ToFuncM={}
	obj.ToFuncR={}
	obj.To2Func={}
	obj.ToDTFunc={}
	obj.touchRendering =_GuiPro.EXACT -- exact(0), lax(), #
	function obj:removeTID(id)
		for i=1,#self.tid do
			if self.tid[i]==id then
				table.remove(self.tid,i)
				self.touchcount=self.touchcount-1
				return
			end
		end
	end
	function obj:hasTID(id)
		for i=1,#self.tid do
			if self.tid[i]==id then
				return true
			end
		end
		return false
	end
	obj.txl1=0
	obj.tyl1=0
	obj.txl2=0
	obj.tyl2=0
	obj.LS=0
	obj:OnUpdate(function(self)
		if self.touchcount==2 then
			local x1,y1=love.touch.getPosition( self.tid[1] )
			local x2,y2=love.touch.getPosition( self.tid[2] )
			local CS=math.sqrt((x2-x1)^2+(y2-y1)^2)
			if gui.Compare(CS,self.LS,self.touchRendering,">") then
				for i=1,#self.To2Func do
					self.To2Func[i](self,CS,x1-self.x,y1-self.y,x2-self.x,y2-self.y)
				end
			elseif gui.Compare(CS,self.LS,self.touchRendering,"<") then
				for i=1,#self.To2Func do
					self.To2Func[i](self,-CS,x1-self.x,y1-self.y,x2-self.x,y2-self.y)
				end
			elseif gui.Compare(CS,self.LS,self.touchRendering,"==") then
				for i=1,#self.To2Func do
					self.To2Func[i](self,0,x1-self.x,y1-self.y,x2-self.x,y2-self.y)
				end
			end
			-- if self.txl1~=x1 or self.txl2~=x2 or self.tyl1~=y1 or self.tyl2~=y2 then
				-- for i=1,#self.To2Func do
					-- self.To2Func[i](self,0,x1-self.x,y1-self.y,x2-self.x,y2-self.y)
				-- end
			-- end
			self.LS=CS
			self.txl1=x1
			self.txl2=x2
			self.tyl1=y1
			self.tyl2=y2
		end
	end)
	function obj:OnDoubleTap(func)
		table.insert(self.ToDTFunc,func)
	end
	function obj:On2TouchMoved(func)
		table.insert(self.To2Func,func)
	end
	function obj:addTID(id)
		table.insert(self.tid,id)
	end
	function obj:OnTouchPressed(func)
		table.insert(self.ToFuncP,func) -- event for touches
	end
	function obj:OnTouchReleased(func) -- event for touches
		table.insert(self.ToFuncR,func)
	end
	function obj:OnTouchMoved(func) -- event for touches
		table.insert(self.ToFuncM,func)
	end
	if _GuiPro.TouchReady then -- my sneaky test
		print("Registred: "..tostring(obj))
		table.insert(_GuiPro.TouchRegister,obj)
	else
		print("Attempting to register: "..tostring(obj))
		_GuiPro.int:newJob(function() table.insert(_GuiPro.TouchRegister,obj) end) -- a sneaky way to ensure that your object gets registered eventually, even if you call the method before the touch patch was activated. 
	end
end
