// ---------------------------------------------------------------------------------------------
[lua]
function sliderGetMousePoint(e)
	-- マウス位置を取得する
	local pt = e:getMousePoint()
	-- Artemis変数に格納する
	e:tag{"var", name="t.x", data=pt.x}
	e:tag{"var", name="t.y", data=pt.y}
end
[/lua]
[lua]
-- マウスポイントからスライダーのvalueとposを計算
-- varname_btnpos, varname_valueに値を返納
-- inputは、mouse,layer_pos,base_width,btn_width,min,max
function sliderCalc(e, param)
	-- マウス
	local mx = tonumber(param.mouse)

	-- 全体位置
	local layer_pos = tonumber(param.layer_pos)

	-- 親ゲージ幅
	local base_width = tonumber(param.base_width)

	-- 子ゲージ幅
	local btn_width = tonumber(param.btn_width)

	-- 最小値・最大値
	local min = tonumber(param.min)
	local max = tonumber(param.max)

	-- マウス位置を補正
	mx = mx - layer_pos - btn_width / 2


	-- スライダーの返納値を計算
	if mx <= 0 then
		-- min方向に、はみ出ていた
		e:tag{"var", name = param.varname_value, data = min}
		e:tag{"var", name = param.varname_btnpos, data = 0}
	elseif mx >= (base_width - btn_width) then
		-- max方向に、はみ出ていた
		e:tag{"var", name = param.varname_value, data = max}
		e:tag{"var", name = param.varname_btnpos, data = base_width - btn_width}
	else
		-- ゲージの範囲内だったので計算
		if min < max then
			e:tag{"var", name = param.varname_value, data = math.floor(math.floor(2 * math.abs(max - min) * mx / (base_width - btn_width)) * ((math.abs(max - min) + 1) / (math.abs(max - min) * 2)) + 0.5) + min}
			-- 補正したマウス位置から、ボタンの正しい座標を返納
			e:tag{"var", name = param.varname_btnpos, data = mx}
		else
			e:tag{"var", name = param.varname_value, data = min - math.floor(math.floor(2 * math.abs(max - min) * mx / (base_width - btn_width)) * ((math.abs(max - min) + 1) / (math.abs(max - min) * 2)) + 0.5)}
			-- 補正したマウス位置から、ボタンの正しい座標を返納
			e:tag{"var", name = param.varname_btnpos, data = mx}
		end
	end

	-- for debug
	--e:tag{"caption", data = e:var(param.varname_btnpos) .. "/" .. e:var(param.varname_value)}
end


function mouseOnSlider(e)
	local pt = e:getMousePoint()
	e:debug{level = 3, data = "補正前mouse :" .. pt.x .. "." .. pt.y}
	-- 座標を補正する
	pt.x = pt.x - tonumber(e:var("t.root.left"))
	pt.y = pt.y - tonumber(e:var("t.root.top"))
	e:debug{level = 3, data = "補正後mouse :" .. pt.x .. "." .. pt.y}

	-- 画像の上に載ってるかどうか。
	if pt.x < 0 then
		e:debug{level = 3, data = "mouseOnSlider 0"}
		return 0
	elseif pt.x > tonumber(e:var("t.base.width")) then
		e:debug{level = 3, data = "mouseOnSlider 0"}
		return 0
	elseif pt.y < 0 then
		e:debug{level = 3, data = "mouseOnSlider 0"}
		return 0
	elseif pt.y > tonumber(e:var("t.base.height")) then
		e:debug{level = 3, data = "mouseOnSlider 0"}
		return 0
	else
		e:debug{level = 3, data = "mouseOnSlider 1"}
		return 1
	end
end

-- windowsではタッチパネルとマウスの見極めがつかないため
-- luaにて確認する
function windowsSliderCheck(e, param)

	-- 検索対象はwindowsのみ
	e:tag{"var", name = "t.os", system = "os"}
	if e:var("t.os") == 'windows' then
		e:debug{level = 3, data = "touch count : " .. e:getTouchCount()}

		e:debug{level = 3, data = "isDecide(1) : " .. tostring(e:isDecide(1))}
		-- 画面タッチされているかどうか
		if e:getTouchCount() == 1 then
			-- マウスも同時に押されているときはサポートしない
			if e:isDecide(1) == true then
				e:tag{"var", name = param.varname, data = 0}
			else
				-- 更に、押下された瞬間がオンマウスしてるか
				-- どうかもチェックする
				if mouseOnSlider(e) == 1 then
					e:tag{"var", name = param.varname, data = "touch"}
				else
					e:tag{"var", name = param.varname, data = 0}
				end
			end
		else
			e:tag{"var", name = param.varname, data = 0}
		end
	else
		-- Android iOSはタッチ判定確定なので、無条件でフラグを1に
		e:tag{"var", name = param.varname, data = 1}
	end
end

function sliderMouseEscape(e, param)
	e:tag{"var", name = "t.os", system = "os"}
	if e:var("t.os") == 'windows' then
		-- マウスカーソルがスライダー範囲内にあるときは
		-- 動かしてどかしてあげないと、winタブは気持ちよく動作しない
		if mouseOnSlider(e) == 1 then

			-- マウス移動
			local pt = e:getMousePoint()
			if param.slider == 'v' then
				e:tag{"mouse", left = tonumber(e:var("t.root.left")) - 1, top = pt.y}
				--e:debug{level = 1, data = "mouse位置left : " .. math.floor(pt.x) .. "→" .. tonumber(e:var("t.root.left")) - 1}
			elseif param.slider == 'h' then
				e:tag{"mouse", top = tonumber(e:var("t.root.top")) - 1, left = pt.x}
				--e:debug{level = 1, data = "mouse位置top : " .. math.floor(pt.y) .. "→" .. tonumber(e:var("t.root.top")) - 1}
			else
				e:debug{level = 3, data = "sliderMouseEscape の sliderパラメータがvでもhでもありません"}
			end
		end
	end
end

-- windowでクリック押下かタッチパネル押下かを切り分けるルーチン
-- タッチパネル押下のときは、touchをvarnameに返す
function basetouchNoMouse(e, param)
	e:tag{"var", name = "t.os", system = "os"}
	if e:var("t.os") == 'windows' then
		-- 決定認識があるのに押下認識がないときはマウスじゃない
		e:debug{level = 3, data = "isDecide : " .. tostring(e:isDecide(1)) .. "  isDown : " .. tostring(e:isDown(1))}
		if (e:isDecide(1) == true) and (e:isDown(1)) == false then
			-- タッチパネル認識
			e:tag{"var", name = param.varname, data = "touch"}
		end
	end
end
[/lua]

// ---------------------------------------------------------------------------------------------
*base_touch_h_mouse
[if estimate="$t.slider.sliding"]
	// 他のスライダの操作中は何もしない
	[return]
[/if]

// レイヤー情報を取得する
[var name="t.root"    system="get_layer_info" id="$t.slider.id"]
[var name="t.base"    system="get_layer_info" id="$t.slider.id + '.0'"]
[var name="t.rollout" system="get_layer_info" id="$t.slider.id + '.1'"]

// ウインドウズタッチパネルでこのイベントが呼び出されたときはフラグを立てる
[calllua function = "basetouchNoMouse" varname = "t.slider.windows"]

[jump label = "base_touch_h_next"]

*base_touch_h

[if estimate="$t.slider.sliding"]
	// 他のスライダの操作中は何もしない
	[return]
[/if]

// 先にレイヤー情報を取得する
[var name="t.root"    system="get_layer_info" id="$t.slider.id"]
[var name="t.base"    system="get_layer_info" id="$t.slider.id + '.0'"]
[var name="t.rollout" system="get_layer_info" id="$t.slider.id + '.1'"]

[calllua function = "windowsSliderCheck" varname = "t.slider.windows"]
// マウスクリックやタッチ認識がなければ終了
[if estimate = "$t.slider.windows == 0"]
	[return]
[/if]

*base_touch_h_next
// スライダー操作開始を格納しておく
[var name="t.slider.sliding" data="1"]

// ドラッグ許可
[lyprop id="$t.slider.id + '.1'" draggable = "1"]

// 現在のマウス位置を取得する
[calllua function="sliderGetMousePoint"]


// luaにて計算する
// varname_btnpos, varname_valueに値を返納
// inputは、mouse,layer_pos,base_width,btn_width,min,max
[calllua function = "sliderCalc" mouse = "$t.x" layer_pos = "$t.root.left" base_width = "$t.base.width" btn_width = "$t.rollout.width" min = "$slider.(t.slider.id).min" max = "$slider.(t.slider.id).max" varname_btnpos = "t.pos" varname_value = "t.slider.value"]

// ボタンの位置を補正する
[lyprop id="$t.slider.id + '.1'" left = "$t.pos" top = "0"]
//[lyprop id="$t.slider.id + '.2'" top="$t.pos"]

// ドラッグを開始する
[lydrag id="$t.slider.id + '.1'"]

// 画面に反映する
[flip]

// サブルーチンを呼び出す
[call file="$slider.(t.slider.id).file" label="$slider.(t.slider.id).label"]

[return]


// ---------------------------------------------------------------------------------------------
*drag_h

// スライダー操作開始を格納しておく
[var name="t.slider.sliding" data="1"]

// スライダー操作中はハイパーリンクを無効にする
[linkdisable]

// 内部処理を実行する
[call label="_h"]

[return]

// ---------------------------------------------------------------------------------------------
*dragout_h

// スライダー操作終了を格納しておく
[var name="t.slider.sliding" data="0"]

// スライダーの操作開始で無効にしたハイパーリンクを有効にする
[linkenable]

// 内部処理を実行する
[call label="_h"]

// ドラッグを終了
[lyprop id="$t.slider.id + '.1'" draggable = "0"]

// windows touch版はカーソルを移動しておく
[if estimate = "$t.slider.windows == 'touch'"]
	[calllua function = "sliderMouseEscape" slider = "h"]
	[var name = "t.slider.windows" data = "0"]
[/if]
[return]

// ---------------------------------------------------------------------------------------------
*_h

// 現在のマウス位置を取得する
[calllua function="sliderGetMousePoint"]

// レイヤー情報を取得する
[var name="t.base"    system="get_layer_info" id="$t.slider.id + '.0'"]
[var name="t.rollout" system="get_layer_info" id="$t.slider.id + '.1'"]

// luaにて計算する
// varname_btnpos, varname_valueに値を返納
// inputは、mouse,layer_pos,base_width,btn_width,min,max
[calllua function = "sliderCalc" mouse = "$t.x" layer_pos = "$t.root.left" base_width = "$t.base.width" btn_width = "$t.rollout.width" min = "$slider.(t.slider.id).min" max = "$slider.(t.slider.id).max" varname_btnpos = "t.pos" varname_value = "t.slider.value"]

// ボタンの位置を補正する
[lyprop id="$t.slider.id + '.1'" left = "$t.pos" top = "0"]
//[lyprop id="$t.slider.id + '.2'" top="$t.pos"]

// 画面に反映する
[flip]

// サブルーチンを呼び出す
[call file="$slider.(t.slider.id).file" label="$slider.(t.slider.id).label"]

[return]


// ---------------------------------------------------------------------------------------------
*base_touch_v_mouse
[if estimate="$t.slider.sliding"]

	// 他のスライダの操作中は何もしない
	[return]
[/if]

// レイヤー情報を取得する
[var name="t.root"    system="get_layer_info" id="$t.slider.id"]
[var name="t.base"    system="get_layer_info" id="$t.slider.id + '.0'"]
[var name="t.rollout" system="get_layer_info" id="$t.slider.id + '.1'"]


// ウインドウズタッチパネルでこのイベントが呼び出されたときはフラグを立てる
[calllua function = "basetouchNoMouse" varname = "t.slider.windows"]

[jump label = "base_touch_v_next"]

*base_touch_v

[if estimate="$t.slider.sliding"]
	// 他のスライダの操作中は何もしない
	[return]
[/if]

// レイヤー情報を取得する
[var name="t.root"    system="get_layer_info" id="$t.slider.id"]
[var name="t.base"    system="get_layer_info" id="$t.slider.id + '.0'"]
[var name="t.rollout" system="get_layer_info" id="$t.slider.id + '.1'"]

[calllua function = "windowsSliderCheck" varname = "t.slider.windows"]
// マウスクリックやタッチ認識がなければ終了
[if estimate = "$t.slider.windows == 0"]
	[return]
[/if]

*base_touch_v_next

// スライダー操作開始を格納しておく
[var name="t.slider.sliding" data="1"]

// ドラッグ許可
[lyprop id="$t.slider.id + '.1'" draggable = "1"]


// 現在のマウス位置を取得する
[calllua function="sliderGetMousePoint"]


// luaにて計算する
// varname_btnpos, varname_valueに値を返納
// inputは、mouse,layer_pos,base_width,btn_width,min,max
[calllua function = "sliderCalc" mouse = "$t.y" layer_pos = "$t.root.top" base_width = "$t.base.height" btn_width = "$t.rollout.height" min = "$slider.(t.slider.id).min" max = "$slider.(t.slider.id).max" varname_btnpos = "t.pos" varname_value = "t.slider.value"]

// ボタンの位置を補正する
[lyprop id="$t.slider.id + '.1'" left = "0" top = "$t.pos"]
//[lyprop id="$t.slider.id + '.2'" top="$t.pos"]

// ドラッグを開始する
[lydrag id="$t.slider.id + '.1'"]

// 画面に反映する
[flip]

// サブルーチンを呼び出す
[call file="$slider.(t.slider.id).file" label="$slider.(t.slider.id).label"]

[return]

// ---------------------------------------------------------------------------------------------
*drag_v

// スライダー操作開始を格納しておく
[var name="t.slider.sliding" data="1"]

// スライダー操作中はハイパーリンクを無効にする
[linkdisable]

// 内部処理を実行する
[call label="_v"]

[return]

// ---------------------------------------------------------------------------------------------
*dragout_v


// スライダー操作終了を格納しておく
[var name="t.slider.sliding" data="0"]

// スライダーの操作開始で無効にしたハイパーリンクを有効にする
[linkenable]

// 内部処理を実行する
[call label="_v"]

// ドラッグを終了
[lyprop id="$t.slider.id + '.1'" draggable = "0"]

// windows touch版はカーソルを移動しておく
[if estimate = "$t.slider.windows == 'touch'"]
	[calllua function = "sliderMouseEscape" slider = "v"]
	[var name = "t.slider.windows" data = "0"]
[/if]
[return]

// ---------------------------------------------------------------------------------------------
*_v

// 現在のマウス位置を取得する
[calllua function="sliderGetMousePoint"]

// レイヤー情報を取得する
[var name="t.base"    system="get_layer_info" id="$t.slider.id + '.0'"]
[var name="t.rollout" system="get_layer_info" id="$t.slider.id + '.1'"]


// luaにて計算する
// varname_btnpos, varname_valueに値を返納
// inputは、mouse,layer_pos,base_width,btn_width,min,max
[calllua function = "sliderCalc" mouse = "$t.y" layer_pos = "$t.root.top" base_width = "$t.base.height" btn_width = "$t.rollout.height" min = "$slider.(t.slider.id).min" max = "$slider.(t.slider.id).max" varname_btnpos = "t.pos" varname_value = "t.slider.value"]

// ボタンの位置を補正する
[lyprop id="$t.slider.id + '.1'" left = "0" top = "$t.pos"]
//[lyprop id="$t.slider.id + '.2'" top="$t.pos"]

// 画面に反映する
[flip]

// サブルーチンを呼び出す
[call file="$slider.(t.slider.id).file" label="$slider.(t.slider.id).label"]

[return]
// ---------------------------------------------------------------------------------------------
