// pedline.js - module to draw pedal lines instead of 'Ped .. *'
//
// Copyright (C) 2020-2023 Jean-Francois Moine
//
// This file is part of abc2svg.
//
// abc2svg is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// abc2svg is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with abc2svg.  If not, see <http://www.gnu.org/licenses/>.
//
// This module is loaded when "%%pedline" appears in a ABC source.
//
// Parameters
//	%%pedline 1

if (typeof abc2svg == "undefined")
    var	abc2svg = {}

abc2svg.pedline = {
    draw_all_deco: function(of) {
    var	de, i, x, dp, ds,
	a_de = this.a_de()

	if (!a_de.length)
		return			// no decoration in this music line
	if (this.cfmt().pedline) {
		for (i = 0; i < a_de.length; i++) {
			de = a_de[i]
			if (de.dd.name != "ped)")
				continue
			ds = de.start
			dp = de.prev
// ( .. ) ( .. )
//		\ de
//	  \ de.start
//	\ de.prev
// \ de.prev.start
// |_____/\____|
			if (dp && dp.dd.name == "ped)"
			 && dp.s.v == ds.s.v) {
				de.defl.nost =		// /\
					dp.defl.noen = 2
				de.x = ds.s.x - 10
				de.val = de.s.x - ds.s.x - 3
				dp.val = de.x - dp.x

				if (de.y > dp.y)
					de.y = dp.y
				dp.y = de.y
			} else {
				de.x = ds.s.x - 8
				if (!de.defl.noen)
					de.val = de.s.x - ds.s.x - de.s.wl
			}
		}
	}
	of()
    }, // draw_all_deco()

    out_lped: function(of, x, y, val, defl) {
	if (!this.cfmt().pedline) {
		of(x, y, val, defl)
		return
	}
	this.xypath(x, y + 8)
	if (defl.nost) {
		if (defl.nost == 2) {		// \
			this.out_svg("l2.5 6")
			val -= 2.5
		} else {
			this.out_svg("m0 6")
		}
	} else {
		this.out_svg("v6")
	}
	if (defl.noen) {
		if (defl.noen == 2) {		// /
			val -= 2.5
			this.out_svg("h" + val.toFixed(1) + 'l2.5 -6')
		} else {
			this.out_svg("h" + val.toFixed(1))
		}
	} else {
		this.out_svg("h" + val.toFixed(1) + 'v-6')
	}
	this.out_svg('"/>\n')
    }, // out_lped()

    set_fmt: function(of, cmd, param) {
	if (cmd == "pedline")
		this.cfmt().pedline = this.get_bool(param)
	else
		of(cmd, param)
    }, // set_fmt()

    set_hooks: function(abc) {
	abc.draw_all_deco = abc2svg.pedline.draw_all_deco.bind(abc, abc.draw_all_deco)
	abc.out_lped = abc2svg.pedline.out_lped.bind(abc, abc.out_lped)
	abc.set_format = abc2svg.pedline.set_fmt.bind(abc, abc.set_format)
    } // set_hooks()
} // pedline

if (!abc2svg.mhooks)
	abc2svg.mhooks = {}
abc2svg.mhooks.pedline = abc2svg.pedline.set_hooks