# -*- coding: ISO-8859-1 -*-
""" capellaScript -- 12.10.2005 Andreas Herzog
>>> Guitarrero 

    Mit diesem Skript kann man in capella Gitarrentabulatur erstellen.|
    |
    Achtung: die Bezeichnung der Zeile der Gitarrentabulatur darf nicht verändert werden, sonst greift das Skript nicht mehr.
    |
    Hinweis: Anmerkungen, Fehler und Frage bitte im Forum von Klaus Meglitsch posten!
    |
    Version 1.7B  |
    
    |
    Dank an: Brigitte Wahl, Thomas Rupp, Frank Rothe und Jørgen alias Bassklampfe

        |

<<<

# Version 1.0 = Ursprungsversion
# Version 1.1 = Bequeme Font-Auswahl-Möglichkeit integriert
# Version 1.1b= Nachbearbeitungsdialoge werden nun noch gezielter angesteuert, Speicherung der Auswahl bei oktavierendem Schlüssel
# Version 1.2 = Bearbeitung der gesamten Partitur möglich, unsichtbare Noten werden klein formatiert (Platzersparnis)
# Version 1.2a= Fehlerkorrektur: neue Routine für Zeitberechnung eingefügt
# Version 1.2b= Fehlerkorrektur: Problem mit anderen Taktarten behoben
# Version 1.2c= Fehlerkorrektur: Problem mit der Prozedur getFonts behoben
# Version 1.3 = Änderungen an der Dialog-Oberfläche, unfreiwilliges Löschen des Tab-Schlüssels verhindert
# Version 1.4 = Neue Funktion: Autoerkennen von römischen Ziffern (auch mit B) als Lagenwechsel
# Version 1.5 = ausführliche Hilfedatei wird mit angeboten, kleine Korrektur im Einzelkorrekturdialog
# Version 1.6 = bessere Auflösung von Noten, Schlüssel wird genauer gezeichnet, Problem mit B-Akkordangaben beseitigt, 
#			    Absturz beim Fehlen der Zeile bei Bearbeitung aller Systeme beseitigt, Fehler im Bearbeitungsmodus gelöst,
#               es können nun im Einzelkorrekturdialog Schlüssel eingefügt werden
# Version 1.6a= Fehlerhafte (leere) Textfelder führen nicht mehr zum Abbruch des Skripts
# Version 1.7=  Unterstüzung von 7saitigen Gitarren (zZt noch mit diversen Einschränkungen)
# Version 1.7a= Doppelsaiten-Bearbeitung nun auch bei 7saitigen Gitarren möglich, reiner TAB-Schlüssel möglich
# Version 1.7b= Kleine Bugbereinigung in der Nachbearbeitungsfunktion
"""

import xml.dom
import string
import tkFont
import Tkinter

from xml.dom.minidom import NodeList

Saiten = ['e','h','g','D','A','E','H']
SaitenHoehe = ['3.5','2.5','1.5','0.5','-0.5','-1.5','-2.5']

NeueStimmung = [[],[],[]]
FontList = []

Stimmung = []
StimmungEADGBE= [['Standard Stimmung (6)'],[28,33,38,43,47,52,100],['E','A','D','g','h','e']]
StimmungBEADGBE= [['Standard Stimmung (7)'],[23,28,33,38,43,47,52,100],['H','E','A','D','g','h','e']]
StimmungDADGBE= [['Drop-D Stimmung'],[26,33,38,43,47,52,100], ['D','A','D','g','h','e']]
StimmungDADGBD= [['Double Drop-D Stimmung'],[26,33,38,43,47,50,100],['D','A','D','g','h','d']]
StimmungCGDAEG= [['New Standard Stimmung'],[24,31,38,45,52,55,100],['C','G','D','a','e','g']]
StimmungDADfisad=[['Open-D Stimmung'],[26,33,38,42,45,50,100],['D','A','D','f#','a','d']]
StimmungDADfad=[['Open-D minor Stimmung'],[26,33,38,41,45,50,100],['D','A','D','f','a','d']]
StimmungEADgcf=[['Quartenstimmung'],[28,33,38,43,48,53,100],['E','A','D','g','c','f']]
StimmungEBEAbBE=[['Open-E Stimmung'],[28,35,40,44,47,52,100],['E','H','E','as','h','e']]
StimmungDGDGBE=[['G6 Stimmung'],[26,31,38,43,47,52,100],['D','G','D','g','h','e']]
StimmungDGDGBD=[['Open G Stimmung'],[26,31,38,43,47,50,100],['D','G','D','g','h','d']]
StimmungDGDGBbD=[['Open G minor Stimmung'],[26,31,38,43,46,50,100],['D','G','D','g','b','e']]
StimmungEAEACisE=[['Open A Stimmung'],[28,33,40,45,49,52,100],['E','A','E','a','c#','e']]
StimmungEAEACE=[['Open A minor Stimmung'],[28,33,40,45,48,52,100],['E','A','E','a','c','e']]
StimmungCGCGAE=[['C6 Stimmung'],[24,31,36,43,45,52,100],['C','G','C','g','a','e']]
StimmungCGCGCE=[['Open-C Stimmung'],[24,31,36,43,48,52,100],['C','G','C','g','c','e']]
StimmungCGDGAD=[['Low-C Stimmung'],[24,31,38,43,45,50,100],['C','G','D','g','a','d']]
StimmungEADGGG=[['Standard Bass-Stimmung (4)'],[16,21,26,31,31,31,100],['E','A','D','G','G','G']]
StimmungBEADGG=[['Standard Bass-Stimmung (5)'],[11,16,21,26,31,31,100],['H','E','A','D','G','G']]

Stimmungen = [StimmungEADGBE,StimmungBEADGBE, StimmungDADGBE,StimmungDADGBD,StimmungCGDAEG, StimmungDADfisad,StimmungDADfad,StimmungEADgcf,StimmungEBEAbBE, StimmungDGDGBE, StimmungDGDGBD, StimmungDGDGBbD, StimmungEAEACisE, StimmungEAEACE, StimmungCGCGAE, StimmungCGCGCE, StimmungCGDGAD,StimmungEADGGG,StimmungBEADGG]
Stimmungen2 = [[],[],[]]
Toene = [['C2-','B1#','D2s'],['C2#','B1x','D2b'],['D2-','C2x','E2s'],['D2#','F2s','E2b'],['E2-','D2x','F2b'],['F2-','E2#','G2s'],['F2#','E2x','G2b'],['G2-','F2x','A2s'],['G2#','---','A2b'],['A2-','G2x','B2s'],['A2#','C3s','B2b'],['B2-','A2x','C3b'],['C3-','B2#','D3s'],['C3#','B2x','D3b'],['D3-','C3x','E3s'],['D3#','F3s','E3b'],['E3-','D3x','F3b'],['F3-','E3#','G3s'],['F3#','E3x','G3b'],['G3-','F3x','A3s'],['G3#','---','A3b'],['A3-','G3x','B3s'],['A3#','C4s','B3b'],['B3-','A3x','C4b'],['C4-','B3#','D4s'],['C4#','B3x','D4b'],['D4-','C4x','E4s'],['D4#','F4s','E4b'],['E4-','D4x','F4b'],['F4-','E4#','G4s'],['F4#','E4x','G4b'],['G4-','F4x','A4s'],['G4#','---','A4b'],['A4-','G4x','B4s'],['A4#','C5s','B4b'],['B4-','A4x','C5b'],['C5-','B4#','D5s'],['C5#','B4x','D5b'],['D5-','C5x','E5s'],['D5#','F5s','E5b'],['E5-','D5x','F5b'],['F5-','E5#','G5s'],['F5#','E5x','G5b'],['G5-','F5x','A5s'],['G5#','---','A5b'],['A5-','G5x','B5s'],['A5#','C6s','B5b'],['B5-','A5x','C6b'],['C6-','B5#','D6s'],['C6#','B5x','D6b'],['D6-','C6x','E6s'],['D6#','F6s','E6b'],['E6-','D6x','F6b'],['F6-','E6#','G6s'],['F6#','E6x','G6b'],['G6-','F6x','A6s'],['G6#','---','A6b'],['A6-','G6x','B6s'],['A6#','C7s','B6b'],['B6-','A6x','C7b'],['C7-','B6#','D7s'],['C7#','B6x','D7b'],['D7-','C7x','E7s'],['D7#','F7s','E7b'],['E7-','D7x','F7b'],['F7-','E7#','G7s'],['F7#','E7x','G7b'],['G7-','F7x','A7s'],['G7#','---','A7b'],['A7-','G7x','B7s'],['A7#','C8s','B7b'],['B7-','A7x','C8b']]

Buende = [' ','0','1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','17','18','19','20','21','22','23','24','25','26']

CapoBuende = ['ohne', '1.Bund','2.Bund','3.Bund','4.Bund','5.Bund','6.Bund','7.Bund','8.Bund','9.Bund','10.Bund','11.Bund','12.Bund']

Lagen = ['I.Lage','II.Lage','III.Lage','IV.Lage','V.Lage','VI.Lage','VII.Lage','VIII.Lage','IX.Lage','X.Lage','XI.Lage','XII.Lage','XIII.Lage','XIV.Lage','XV.Lage','XVI.Lage','XVII.Lage','XVIII.Lage','XIX.Lage','XX.Lage']

DoppelSaiten =  [[],[],[],[],[],[],[]]
SimpleSaiten = [[],[],[],[],[],[],[]]

NotenlinienCode = ['__||||_____','__|||||____','__||||||___','__|||||||__']

LagenWechsel = []

LagenRoemisch = ['I','II','III','IV','V','VI','VII','VIII','IX','X','XI','XII','XIII','XIV','XV','XVI','XVII','XVIII','XIX','XX']

Daumensatz = ['D','M','Z','R','p','i','m','a']

# doc = [] # parentNode von score

def latin1_e(u):
    return u.encode('Latin-1')
def latin1_d(u):
    return u.decode('Latin-1')
    
class settings:
    def __init__(self):
        self.Leer = 0   
        
  
     
defaults = settings()
dlgSet = settings()

options = ScriptOptions() 
opt = options.get()

def Test(text):
	messageBox('Test',str(text))

class settings:
    def __init__(self):
    	self.Lage = 1.6
    	self.LeerSaiten = 1
    	self.StimmungsWahl = 0
    	self.HalsRichtung = 2
    	self.UserStimmungen = ''
    	self.SchluesselTyp = 0
    	self.CapoBund = 0
    	self.GitarreroSchriftgroesse=5
    	self.GitarreroSchriftFett = 0
    	self.GittareroGitarreroSchriftKursiv = 0
    	self.GittareroGitarreroSchriftart ='TimesNewRoman'
    	self.GitarreroAnzahlSaiten = 2
    	self.GitarreroOktaviert = 0
    	self.LagenAutomatik = 1
    	self.LagenAutomatikSchwelle = 4

def changeCapo(Stimmung, CapoBund, GitarreroOktaviert):
	i = 0
	while i < len(Stimmung):
		Stimmung[i] = Stimmung[i] + CapoBund - (12 * GitarreroOktaviert)
		i +=1
	
	return Stimmung

def encodeUserStimmung(name, zahlen,bezeichnungen):
	KompletteStimmung = ''
	
	
	Stimmungsname = name.replace(' ','~')
	Stimmungszahlen = ''
	Stimmungsbezeichnungen = ''
	
	Stimmungsname.replace(' ','~')
	i=0
	while (len(name) + i) <15:
		Stimmungsname += '~'
		i +=1
	j=0
	while j<6:
		if zahlen[j] < 10:
			zahl = '0' + str(zahlen[j])
		else:
			zahl = str(zahlen[j])
		Stimmungszahlen += zahl
		
		Stimmungsbezeichnungen += bezeichnungen[j].replace(' ','~')
		
		j+=1


	
	KompletteStimmung = Stimmungsname + Stimmungszahlen + Stimmungsbezeichnungen

	
	return KompletteStimmung
	
def decodeUserStimmung(UserStimmungenCode):

	EinzelneStimmungen = []
	AnwenderStimmungen = []
	AnwenderZahlenStr = []
	AnwenderZahlen = []
	AnwenderZahlenTemp = []
	AnwenderBezeichnungenTemp =[]
	AnwenderBezeichnungen = []
	i = 0
	while (i*45) < len(UserStimmungenCode):
		Start = i * 45
		Ende = (i+1) *45
		EinzelneStimmungen += [UserStimmungenCode[Start:Ende]]
		
		i+=1
		
	j = 0
	while j < len(EinzelneStimmungen):
		AnwenderStimmungen += [EinzelneStimmungen[j][0:15].replace('~',' ')]
		
		AnwenderZahlenTemp +=  [EinzelneStimmungen[j][15:27]]
		
		AnwenderBezeichnungenTemp +=  [EinzelneStimmungen[j][27:45]]
		
		Zahl1Temp = AnwenderZahlenTemp[j][0:2]
		Zahl2Temp = AnwenderZahlenTemp[j][2:4]
		Zahl3Temp = AnwenderZahlenTemp[j][4:6]
		Zahl4Temp = AnwenderZahlenTemp[j][6:8]
		Zahl5Temp = AnwenderZahlenTemp[j][8:10]
		Zahl6Temp = AnwenderZahlenTemp[j][10:12]
		
		Bezeichnung1Temp = AnwenderBezeichnungenTemp[j][0:3].replace('~',' ')
		Bezeichnung2Temp = AnwenderBezeichnungenTemp[j][3:6].replace('~',' ')
		Bezeichnung3Temp = AnwenderBezeichnungenTemp[j][6:9].replace('~',' ')
		Bezeichnung4Temp = AnwenderBezeichnungenTemp[j][9:12].replace('~',' ')
		Bezeichnung5Temp = AnwenderBezeichnungenTemp[j][12:15].replace('~',' ')
		Bezeichnung6Temp = AnwenderBezeichnungenTemp[j][15:18].replace('~',' ')
		
		AnwenderZahlenInt = [string.atoi(Zahl1Temp),string.atoi(Zahl2Temp),string.atoi(Zahl3Temp),string.atoi(Zahl4Temp),string.atoi(Zahl5Temp),string.atoi(Zahl6Temp)]
		AnwenderBez = [Bezeichnung1Temp,Bezeichnung2Temp,Bezeichnung3Temp,Bezeichnung4Temp,Bezeichnung5Temp,Bezeichnung6Temp]
		
		AnwenderZahlen += [AnwenderZahlenInt]
		AnwenderBezeichnungen += [AnwenderBez]
		
		j+=1	

	Stimmungen2[0] += AnwenderStimmungen
	Stimmungen2[1] += AnwenderZahlen
	Stimmungen2[2] += AnwenderBezeichnungen


def getOptions():
	global Lage, LeerSaiten, Stimmung, StimmungsWahl, HalsRichtung, UserStimmungen, SchluesselTyp, CapoBund
	global GitarreroSchriftgroesse, GitarreroSchriftFett, GitarreroSchriftKursiv, GitarreroSchriftart, GitarreroAnzahlSaiten
	global GitarreroOktaviert, LagenAutomatik,LagenAutomatikSchwelle, StimmungsWahl
        
	UserStimmungen = opt.get('UserStimmungen',str(UserStimmungen))
	Lage	= eval(opt.get('Lage',str(Lage)))

	LeerSaiten	= eval(opt.get('LeerSaiten',str(LeerSaiten)))
	StimmungsWahl	= eval(opt.get('StimmungsWahl',str(StimmungsWahl)))
	HalsRichtung	= eval(opt.get('HalsRichtung',str(HalsRichtung)))
	SchluesselTyp = eval(opt.get('SchluesselTyp',str(SchluesselTyp)))
	LagenAutomatik = eval(opt.get('LagenAutomatik',str(LagenAutomatik)))
	LagenAutomatikSchwelle = eval(opt.get('LagenAutomatikSchwelle',str(LagenAutomatikSchwelle)))
	CapoBund = eval(opt.get('CapoBund',str(CapoBund)))
	GitarreroSchriftgroesse = eval(opt.get('GitarreroSchriftgroesse',str(GitarreroSchriftgroesse)))
	GitarreroSchriftFett = eval(opt.get('GitarreroSchriftFett',str(GitarreroSchriftFett)))
	GitarreroSchriftKursiv = eval(opt.get('GitarreroSchriftKursiv',str(GitarreroSchriftKursiv)))
	GitarreroSchriftart = opt.get('GitarreroSchriftart',str(GitarreroSchriftart))
	GitarreroAnzahlSaiten = eval(opt.get('GitarreroAnzahlSaiten',str(GitarreroAnzahlSaiten)))
	GitarreroOktaviert = eval(opt.get('GitarreroOktaviert',str(GitarreroOktaviert)))
	decodeUserStimmung(UserStimmungen)
	
	
def setOptions():
    global dlgSet

    opt.update(dict(Lage= str(Lage),
	   				LeerSaiten = str(LeerSaiten),
	   				StimmungsWahl = str(StimmungsWahl),
	   				HalsRichtung = str(HalsRichtung),
	   				SchluesselTyp = str(SchluesselTyp),
	   				LagenAutomatik = str(LagenAutomatik),
	   				LagenAutomatikSchwelle = str(LagenAutomatikSchwelle),
	   				CapoBund = str(CapoBund),
	   				GitarreroSchriftgroesse = str(GitarreroSchriftgroesse),
	   				GitarreroSchriftKursiv = str(GitarreroSchriftKursiv),
	   				GitarreroSchriftFett = str(GitarreroSchriftFett),
	   				GitarreroSchriftart = str(GitarreroSchriftart),
	   				GitarreroAnzahlSaiten = str(GitarreroAnzahlSaiten),
	   				GitarreroOktaviert = str(GitarreroOktaviert)
                   ))
                

    options.set(opt)
    
def setOptions2():
    global dlgSet
    UserStimmungen = ''
    i = 0
    
    while i < len(Stimmungen2[0]):
    	UserStimmungen += encodeUserStimmung(Stimmungen2[0][i], Stimmungen2[1][i], Stimmungen2[2][i])
    	
    	i += 1
    	
    

    opt.update(dict(UserStimmungen = str(UserStimmungen)))
                

    options.set(opt)    
    
def addElementNode(el,tagName):
    # add new Node to el if Node "tagName" does not exist
    # otherwise return the existing Node
    global doc
    childs = el.childNodes
    for n in range(childs.length):
        if childs[n].nodeType ==childs[n].ELEMENT_NODE and childs[n].tagName == tagName:
            return childs[n]
    newChild = doc.createElement(tagName)
    el.appendChild(newChild)
    return newChild
    

def addNewElementNode(el,tagName):
    # add new Node with tagName "tagName" to el 
    global doc
    newChild = doc.createElement(tagName)
    el.appendChild(newChild)
    return newChild
    
def getFonts():
    root = Tkinter.Tk()
    FontListT= tkFont.families()
    FontList  = []
    FontList2  = []
    i=0
    while i < len(FontListT):
    	try: 
    		FontList += [latin1_e(FontListT[i])]
    	except:	
    		FontList += ['FEHLER']	
    	i+=1
    j=0
    while j < len(FontList):
    	FontName = FontList[j]
    	FontList[j] = FontName[0].upper() + FontName[1:]
    	j+=1   	
    FontList.sort()
    
    return FontList    

def setNewKey(score):
	sel = getCursor()
	if sel == None:
	        #
			return
	else:
		system = score.getElementsByTagName('system')[sel[0]]
		systemSel = system
		staff = system.getElementsByTagName('staff')[sel[1]]
		voice = staff.getElementsByTagName('voice')[sel[2]]
		noteObject = voice.getElementsByTagName('noteObjects')[0]
		objList = getElementObjects(noteObject.childNodes)
		if objList.length <= sel[3]:
			return
		obj = objList[sel[3]]
		setKey(obj)

def getDialogValues1(score):
	
    global NurLoeschen, SchluesselSetzen, Stimmung,  Lage, LeerSaiten, StimmungsWahl, StimmungsSaiten, HalsRichtung, AlleSysteme
    global SchluesselTyp, IntelligenteNummern, GitarreroOktaviert, CapoBund, GitarreroAnzahlSaiten,GitarreroOktaviert, LagenAutomatik,LagenAutomatikSchwelle
    global concurrenceIntelligent
    
    StimmungsBezeichnungen = []
    i = 0
    while i < len(Stimmungen):
    	StimmungsBezeichnungen += Stimmungen[i][0] 
    	StimmungsBezeichnungen[i] += '    '
    	j = 0
    	while j < len(Stimmungen[i][2]):
    		StimmungsBezeichnungen[i] +=  str(Stimmungen[i][2][j])
    		j+= 1
    	i+= 1
    StimmungsBezeichnungen += Stimmungen2[0]
    
    
    lableer1 = Label('Aus System mit Cursor Kopie erstellen.', width = 2)
    labSaitenAnzahl = Label('Saitenanzahl:', width = 2)
    labCapodaster = Label('Capodaster:', width = 0)
    labBassa = Label('   oktavierenden Violinschlüssel', width = 0)
    
    LagenAutomatikCheck = CheckBox('Lagen automatisch erkennnen, Leersaiten bis:', value=LagenAutomatik)
    SchluesselSetzenCheck = CheckBox('Schlüssel generieren', value=1)
    LeerSaitenCheck = CheckBox('Mit Leersaiten spielen', value = LeerSaiten)
    StemRadio = Radio(['Hälse nicht beeinflussen','Hälse nach unten ausrichten','Hälse unsichtbar'], value = HalsRichtung)
    AlleSystemeRadio = Radio(['nur System mit Cursor','alle Systeme'], text ='Zeile erstellen in:', value = AlleSysteme)
    AktionRadio = Radio(['Stimmung verändern','vorhandene Stimmung nutzen','nur Schlüssel setzen','Fontsetup'], text = 'Aktion', value = 1)
    SchluesselRadio = Radio(['Buchstaben','Zahlen','TAB'], text = 'Schlüsseltyp', value = 0)
    #NurLoeschenCheck = CheckBox('nur Löschen', value=0)
    concurrenceIntelligentCheck = CheckBox('Intelligent', value=1)
    IntelligenteNummernRadio = Radio(['einfärben              ','verhindern', 'ignorieren'],value=0)
    KeyBassa = CheckBox('Notenzeile verwendet oktavierenden Violinschlüssel', value=GitarreroOktaviert)
    
    GitarreroAnzahlSaitenBox = ComboBox(['4 Saiten','5 Saiten','6 Saiten','7 Saiten'], value = GitarreroAnzahlSaiten, width=12)
    StimmungBox = ComboBox(StimmungsBezeichnungen, value = StimmungsWahl, width=32)
    LageBox = ComboBox(Lagen, value = Lage, width=32)
    CapodasterBox = ComboBox(CapoBuende, value = CapoBund, width=14)
    LagenAutomatikSchwelleBox = ComboBox(Lagen, value = LagenAutomatikSchwelle, width=9)
    vbox01= VBox([SchluesselSetzenCheck,SchluesselRadio, ],  padding = 8)
    vbox02= VBox([IntelligenteNummernRadio,concurrenceIntelligentCheck],  padding = 8)
    vbox03= HBox([AktionRadio,AlleSystemeRadio],  padding = 8)
    
    hbox00a= HBox([vbox01], text='Schlüssel',padding = 8)
    hbox00b= HBox([vbox02], text='Doppelte Saitenbelegung',padding = 8)
    hbox01= HBox([hbox00a, hbox00b],padding = 8)
    hbox02= HBox([labCapodaster,CapodasterBox], padding = 5)
    hbox03= HBox([labSaitenAnzahl,GitarreroAnzahlSaitenBox], padding = 5)
    vbox04 = VBox([hbox03,StimmungBox, LageBox,hbox02,LeerSaitenCheck], padding = 8)
    hbox04 = HBox([vbox04], padding = 8, text = 'Instrument / Lage')
    hbox05 = HBox([LagenAutomatikCheck, LagenAutomatikSchwelleBox], padding = 4)
    vbox04= VBox([vbox03, hbox04,  hbox01,KeyBassa,hbox05],padding = 8)

    dialogbox= VBox([vbox04], padding = 15)
    
    dlg = Dialog('Bitte wählen: ', dialogbox)

	
    if dlg.run():
    	concurrenceIntelligent = concurrenceIntelligentCheck.value()
    	LagenAutomatikSchwelle = LagenAutomatikSchwelleBox.value()
    	LagenAutomatik = LagenAutomatikCheck.value()
    	SchluesselSetzen = SchluesselSetzenCheck.value()
    	Lage = LageBox.value()
    	StimmungsWahl = StimmungBox.value()
    	LeerSaiten = LeerSaitenCheck.value()
    	HalsRichtung = 0#StemRadio.value()
    	SchluesselTyp = SchluesselRadio.value()
    	IntelligenteNummern =IntelligenteNummernRadio.value()
    	CapoBund = CapodasterBox.value()
    	GitarreroOktaviert = KeyBassa.value()
    	GitarreroAnzahlSaiten = GitarreroAnzahlSaitenBox.value()
    	AlleSysteme= AlleSystemeRadio.value()
    	Aktion = AktionRadio.value()
    	if (GitarreroAnzahlSaiten == 3) and (StimmungsWahl <> 1):
    	
    		messageBox('Fehler','Gittarero kann zur Zeit nur eine Stimmung für 7saitige Gitarren bearbeiten. Bitte Stimmung Nr.2 wählen.')
    	
    		return False
    		
    	if (GitarreroAnzahlSaiten == 3) and (IntelligenteNummern < 2):
    	
    		#messageBox('Fehler','Gittarero kann zZt. doppelte Saitenbelegungen bei 7saitigen Gitarren nur ignorieren')
    	
    		#IntelligenteNummern = 2 	
    		eins=1
    	if Aktion == 0:
			StimmungsAktion = getDialogValues9()
			if StimmungsAktion <> 4:
				if StimmungsAktion == 0:
					getDialogValues5(-1)
		    	if (StimmungsAktion == 1) and (len(Stimmungen2[0]) > 0):
		    		getDialogValues6()
		       	if (StimmungsAktion == 2) and (len(Stimmungen2[0]) > 0):
		    		getDialogValues7a()
		    	if (StimmungsAktion == 1) and (len(Stimmungen2[0]) == 0):
		    		messageBox('Fehler','Sie haben noch keine Stimmung eingegeben')
		       	if (StimmungsAktion == 2) and (len(Stimmungen2[0]) == 0):
		    		messageBox('Fehler','Sie haben noch keine Stimmung eingegeben')
    	if Aktion == 1:	
    		if StimmungsWahl <len(Stimmungen):
				
				Stimmung = Stimmungen[StimmungsWahl][1]
				StimmungsSaiten = Stimmungen[StimmungsWahl][2]
				Stimmung = changeCapo(Stimmung, CapoBund, GitarreroOktaviert)

				return True
    		if StimmungsWahl >= len(Stimmungen):
    			
    			StimmungsWahl2 = StimmungsWahl - len(Stimmungen)
    			Stimmung = Stimmungen2[1][StimmungsWahl2]
    			Stimmung.append(100)
    			StimmungsSaiten = Stimmungen2[2][StimmungsWahl2]
    			Stimmung = changeCapo(Stimmung, CapoBund, GitarreroOktaviert)
    			return True
    			

    	if Aktion == 3:
    		getDialogValues8(score)		    	
    else:
        return False

def getDialogValues2(score):
	global Saite1, Saite2, Saite3, Saite4, Saite5, Saite6, Saite7, StimmungsWahl, StimmungsSaiten	
 
	AuswahlMenge = Buende + Daumensatz
	
	clefCheck = CheckBox('nur Schlüssel einfügen', value=0)
	StimmungsSaiten = Stimmungen[StimmungsWahl][2]
	

	if len(StimmungsSaiten) > 6: 
		lab7 = Label((StimmungsSaiten[6]+':'), width = 2)
	else: 
		lab7 = '-'
		Saite7 = ' '
	lab1 = Label((StimmungsSaiten[5]+':'), width = 2)
	lab2 = Label((StimmungsSaiten[4]+':'), width = 2)
	lab3 = Label((StimmungsSaiten[3]+':'), width = 2)
	lab4 = Label((StimmungsSaiten[2]+':'), width = 2)
	lab5 = Label((StimmungsSaiten[1]+':'), width = 2)
	lab6 = Label((StimmungsSaiten[0]+':'), width = 2)
	
	

	BundBox1 = ComboBox(AuswahlMenge, value=Saite1, width=10)
	BundBox2 = ComboBox(AuswahlMenge, value=Saite2, width=10)
	BundBox3 = ComboBox(AuswahlMenge, value=Saite3, width=10)
	BundBox4 = ComboBox(AuswahlMenge, value=Saite4, width=10)
	BundBox5 = ComboBox(AuswahlMenge, value=Saite5, width=10)
	BundBox6 = ComboBox(AuswahlMenge, value=Saite6, width=10)
	BundBox7 = ComboBox(AuswahlMenge, value=Saite7, width=10)
 
	
	hbox01= HBox([lab1, BundBox1],padding = 0)
	hbox02= HBox([lab2, BundBox2],padding = 0)
	hbox03= HBox([lab3, BundBox3],padding = 0)
	hbox04= HBox([lab4, BundBox4],padding = 0)
	hbox05= HBox([lab5, BundBox5],padding = 0)
	hbox06= HBox([lab6, BundBox6],padding = 0)
	hbox07= HBox([lab7, BundBox7],padding = 0)

	if len(StimmungsSaiten) > 6:
		dialogbox= VBox([ hbox07, hbox01, hbox02, hbox03, hbox04, hbox05, hbox06, clefCheck], padding = 12)
	else:
		dialogbox= VBox([hbox01, hbox02, hbox03, hbox04, hbox05, hbox06, clefCheck], padding = 12)
 
	dlg = Dialog('Bitte wählen: ', dialogbox)

	
	if dlg.run():
		#NurLoeschen = NurLoeschenCheck.value()
		Saite1 = BundBox1.value()
		Saite2 = BundBox2.value()
		Saite3 = BundBox3.value()
		Saite4 = BundBox4.value()
		Saite5 = BundBox5.value()
		Saite6 = BundBox6.value()
		Saite7 = BundBox7.value()
		if clefCheck.value() == 1:
			setNewKey(score)
			return False
    
		return True
	else:
		return False   
		     
def getDialogValues3():
    global alleSystemeJA, AlleSysteme

    result = -1
    if AlleSysteme == 0:
    	result = messageBox('ACHTUNG System Nr.'+ str(systemCount) , 'Sie sind dabei, die Zeile neu zu konvertieren. Eventuelle Änderungen gehen dabei verloren. Wollen Sie dies wirklich?', img=3, buttons=2, defBtn=0)
    if AlleSysteme == 1 and alleSystemeJA == 0:
		result = messageBox('ACHTUNG', 'Sie sind dabei, alle Zeile neu zu konvertieren. Eventuelle Änderungen gehen dabei verloren. Auch folgende Systeme mit Tabulatur werden neu berechnet. Wollen Sie dies wirklich?', img=3, buttons=2, defBtn=0)
		if result == 2:
			alleSystemeJA = 1
		if result == 3:
			alleSystemeJA = 2
			
    if result == 2 or alleSystemeJA == 1:
       	return True
    elif alleSystemeJA == 2:
    	return False
    else:
        return False

def getDialogValues4():
	
    global NurLoeschen,   Lage, LeerSaiten, Stimmung, StimmungsWahl, CapoBund,GitarreroOktaviert

    
    labCapodaster = Label('Capodaster:', width = 0)
    LeerSaitenCheck = CheckBox('Mit Leersaiten spielen', value = LeerSaiten)
    KeyBassa = CheckBox('Notenzeile verwendet oktavierenden Violinschlüssel', value=GitarreroOktaviert)
    LageBox = ComboBox(Lagen, value = Lage, width=32)
    CapodasterBox = ComboBox(CapoBuende, value = CapoBund, width=14)
    
    
    hbox01= HBox([labCapodaster,CapodasterBox], padding = 5)
    
    vbox01= VBox([LageBox, LeerSaitenCheck, hbox01, KeyBassa],padding = 8)

    dialogbox= VBox([vbox01], padding = 15)
    
    dlg = Dialog('Bitte wählen: ', dialogbox)

    if dlg.run():
    	Lage = LageBox.value()
    	LeerSaiten = LeerSaitenCheck.value()
    	CapoBund = CapodasterBox.value()
    	GitarreroOktaviert = KeyBassa.value()
    	if StimmungsWahl <len(Stimmungen):
				
			Stimmung = Stimmungen[StimmungsWahl][1]
			StimmungsSaiten = Stimmungen[StimmungsWahl][2]
			Stimmung = changeCapo(Stimmung, CapoBund, GitarreroOktaviert)

			return True
    	if StimmungsWahl >= len(Stimmungen):
    			
			StimmungsWahl2 = StimmungsWahl - len(Stimmungen)
			Stimmung = Stimmungen2[1][StimmungsWahl2]
			Stimmung.append(100)
			StimmungsSaiten = Stimmungen2[2][StimmungsWahl2]
			Stimmung = changeCapo(Stimmung, CapoBund, GitarreroOktaviert)
			
			return True
    
       	return True
    else:
        return False

def getDialogValues5(getStimmung):
		
	ToeneAuswahl = []
	i = 0
	while i < len(Toene):
		Ton1 = Toene[i][0]
		Ton2 = Toene[i][1]
		Ton3 = Toene[i][2]
		ToeneAuswahl += [(Ton1)]
		i += 1
	
	if getStimmung == -1:
		Saite1Combo = ComboBox(ToeneAuswahl, value = 0, width=7)
		Saite2Combo = ComboBox(ToeneAuswahl, value = 0, width=7)
		Saite3Combo = ComboBox(ToeneAuswahl, value = 0, width=7)
		Saite4Combo = ComboBox(ToeneAuswahl, value = 0, width=7)
		Saite5Combo = ComboBox(ToeneAuswahl, value = 0, width=7)
		Saite6Combo = ComboBox(ToeneAuswahl, value = 0, width=7)
		
		NameEdit = Edit(value='',width = 25)
		
		Saite1Edit = Edit(value='',width = 6)
		Saite2Edit = Edit(value='',width = 6)
		Saite3Edit = Edit(value='',width = 6)
		Saite4Edit = Edit(value='',width = 6)
		Saite5Edit = Edit(value='',width = 6)
		Saite6Edit = Edit(value='',width = 6)
		
	if getStimmung > -1:
		
		Saite1Combo = ComboBox(ToeneAuswahl, value = Stimmungen2[1][getStimmung][0], width=7)
		Saite2Combo = ComboBox(ToeneAuswahl, value = Stimmungen2[1][getStimmung][1], width=7)
		Saite3Combo = ComboBox(ToeneAuswahl, value = Stimmungen2[1][getStimmung][2], width=7)
		Saite4Combo = ComboBox(ToeneAuswahl, value = Stimmungen2[1][getStimmung][3], width=7)
		Saite5Combo = ComboBox(ToeneAuswahl, value = Stimmungen2[1][getStimmung][4], width=7)
		Saite6Combo = ComboBox(ToeneAuswahl, value = Stimmungen2[1][getStimmung][5], width=7)
		
		NameEdit = Edit(value=Stimmungen2[0][getStimmung],width = 25)
		

		Saite1Edit = Edit(value=Stimmungen2[2][getStimmung][0],width = 6)
		Saite2Edit = Edit(value=Stimmungen2[2][getStimmung][1],width = 6)
		Saite3Edit = Edit(value=Stimmungen2[2][getStimmung][2],width = 6)
		Saite4Edit = Edit(value=Stimmungen2[2][getStimmung][3],width = 6)
		Saite5Edit = Edit(value=Stimmungen2[2][getStimmung][4],width = 6)
		Saite6Edit = Edit(value=Stimmungen2[2][getStimmung][5],width = 6)
				
	LabLeer = Label(' ', width= 4)
	NameLabel1 = Label('Bezeichnung:   ', width= 4)
	NameLabel2 = Label('  (maximal 15 Zeichen)', width= 7)
	NameLabel3 = Label('Bezeichnung der Saiten', width= 7)
	NameLabel4 = Label('(jeweils max. 3 Zeichen)', width= 7)
	 
	hbox01= HBox([NameLabel1, NameEdit, NameLabel2], padding = 0)
	hbox02= HBox([Saite1Combo, Saite2Combo, Saite3Combo, Saite4Combo, Saite5Combo, Saite6Combo],padding = 8)
	hbox03= HBox([Saite1Edit,Saite2Edit,Saite3Edit,Saite4Edit,Saite5Edit,Saite6Edit],padding = 15)
	vbox01= VBox([NameLabel3, hbox03,NameLabel4], padding = 4)
	vbox02= VBox([hbox01, hbox02, vbox01,LabLeer], padding = 15)

	dialogbox= VBox([vbox02], padding = 15)
    
	dlg = Dialog('Neue Stimmung anlegen: ', dialogbox)

	
	if dlg.run():
		SaiteNr1 = Saite1Combo.value()
		SaiteNr2 = Saite2Combo.value()
		SaiteNr3 = Saite3Combo.value()
		SaiteNr4 = Saite4Combo.value()
		SaiteNr5 = Saite5Combo.value()
		SaiteNr6 = Saite6Combo.value()
		SaiteBez1 = Saite1Edit.value()[0:3]
		SaiteBez2 = Saite2Edit.value()[0:3]
		SaiteBez3 = Saite3Edit.value()[0:3]
		SaiteBez4 = Saite4Edit.value()[0:3]
		SaiteBez5 = Saite5Edit.value()[0:3]
		SaiteBez6 = Saite6Edit.value()[0:3]
		
		Stimmungsname = NameEdit.value()
		if Stimmungsname == '':
			messageBox('Fehler','Sie haben keinen Namen eingegeben!')
			return False
			
		
		NeueStimmung[0] = Stimmungsname[0:15]
		NeueStimmung[1] = [SaiteNr1, SaiteNr2, SaiteNr3, SaiteNr4, SaiteNr5, SaiteNr6]
		NeueStimmung[2] = [SaiteBez1, SaiteBez2, SaiteBez3, SaiteBez4, SaiteBez5, SaiteBez6]

		i = 0
		while i < 6:
			if len(NeueStimmung[2][i]) == 0:
				NeueStimmung[2][i] = '~~~'
			if len(NeueStimmung[2][i]) == 1:
				NeueStimmung[2][i] =str(NeueStimmung[2][i])[0] + '~~'	
			if len(NeueStimmung[2][i]) == 2:
				NeueStimmung[2][i] += '~'
			i+=1					
		if getStimmung == -1:
			Stimmungen2[0] += [NeueStimmung[0]]
			Stimmungen2[1] += [NeueStimmung[1]]
			Stimmungen2[2] += [NeueStimmung[2]]
		else: 	
			Stimmungen2[0][getStimmung] = NeueStimmung[0]
			Stimmungen2[1][getStimmung] = NeueStimmung[1]
			Stimmungen2[2][getStimmung] = NeueStimmung[2]
		
		setOptions2()
		
		return True
	else:
		return False

def getDialogValues6():

	StimmungenCombo = ComboBox(Stimmungen2[0], value = 0, width=18)

	vbox02= VBox([StimmungenCombo], padding = 15)

	dialogbox= VBox([vbox02], padding = 15)
    
	dlg = Dialog('Zu bearbeitende Stimmung auswählen', dialogbox)
	
	if dlg.run():
		getDialogValues5(StimmungenCombo.value())
		
		
		return True
	else:
		return False
		
def getDialogValues7a():

	StimmungenCombo = ComboBox(Stimmungen2[0], value = 0, width=18)

	vbox02= VBox([StimmungenCombo], padding = 15)

	dialogbox= VBox([vbox02], padding = 15)
    
	dlg = Dialog('Stimmung löschen ', dialogbox)
	
	if dlg.run():
		getDialogValues7b(StimmungenCombo.value())
	
		return True
	else:
		return False	
		
def getDialogValues7b(getStimmung):
 
    result = messageBox('ACHTUNG', 'Sie sind dabei, eine Stimmung zu löschen. Wollen Sie dies wirklich?', img=3, buttons=2, defBtn=0)

	
    if result == 2:
		Stimmungen2[0].remove(Stimmungen2[0][getStimmung])
		Stimmungen2[1].remove(Stimmungen2[1][getStimmung])
		Stimmungen2[2].remove(Stimmungen2[2][getStimmung])
		setOptions2()
    	
 		return True
    else:
        return False
        
def getDialogValues8(score):
	global GitarreroSchriftgroesse, GitarreroSchriftKursiv, GitarreroSchriftFett, GitarreroSchriftart, UpdateFont
	
	if GitarreroSchriftart in FontList:
		fontNumber = FontList.index(GitarreroSchriftart)
	else:
		fontNumber = 0
	
	GitarreroSchriftgroesseLabel = Label('Schriftgröße:  ')
	GitarreroSchriftartLabel = Label('Schriftart:  ')
	GitarreroSchriftgroesseEdit = Edit(value = str(GitarreroSchriftgroesse), min = 3, max=20, width=5)
	GitarreroSchriftartEdit = Edit(value = str(GitarreroSchriftart), width=15)
	GitarreroSchriftKursivCheck = CheckBox('Kursivschrift', value = GitarreroSchriftKursiv)
	GitarreroSchriftFettCheck = CheckBox('Fettschrift', value = GitarreroSchriftFett)
	comboFont = ComboBox(FontList, width=20, value=fontNumber)
	
	hbox01= HBox([GitarreroSchriftartLabel,comboFont], padding = 0)
	hbox02= HBox([GitarreroSchriftgroesseLabel,GitarreroSchriftgroesseEdit], padding = 0) 
	hbox03= HBox([GitarreroSchriftFettCheck], padding = 0)
	hbox04= HBox([GitarreroSchriftKursivCheck], padding = 0)
	vbox01= VBox([hbox01, hbox02, hbox03, hbox04],padding = 0)

	dialogbox= VBox([vbox01], padding = 12)
    
	dlg = Dialog('Fontsetup: ', dialogbox)
	
	if dlg.run():
		
		GitarreroSchriftgroesse = string.atoi(GitarreroSchriftgroesseEdit.value())
		
		GitarreroSchriftFett = GitarreroSchriftFettCheck.value()
		
		GitarreroSchriftKursiv = GitarreroSchriftKursivCheck.value() 
		
		GitarreroSchriftart = FontList[comboFont.value()]
		
		setOptions()
		
		UpdateFont = 1

		return True
	else:
		return False        	

def getDialogValues9():

	StimmungsAktionsRadio = Radio(['Neue Stimmung anlegen','Stimmungen bearbeiten','Stimmung löschen'], value = 0, width=18)

	vbox00= VBox([StimmungsAktionsRadio], padding = 15)

	dialogbox= VBox([vbox00], padding = 15)
    
	dlg = Dialog('Aktion auswählen ', dialogbox)
	
	if dlg.run():
	
		return StimmungsAktionsRadio.value()
	else:
		return 4		


    				
       
def newText(drawObjects,  width, height, contents, fontheight,IndexTag, face):
	global FontGroesse, LineWidth, StrichAbstand
	Gruppierung = 0
	
	if IndexTag[0] == '9':
		
		Gruppierung = 1
	
	
	if Gruppierung == 0:
		drawObj = addNewElementNode(drawObjects,'drawObj')
	
 	if Gruppierung == 1:
 		
 		groupDrawObj = addElementNode(drawObjects,'drawObj')
		group = addElementNode(groupDrawObj,'group')	
		drawObj = addNewElementNode(group,'drawObj')
		
	text = addElementNode(drawObj,'text')	
	
	text.setAttribute('x',str(width))
	text.setAttribute('y',str(height))

	content = addNewElementNode(text,'content')
	textNode = doc.createTextNode(latin1_d(contents))
	
	content.appendChild(textNode)
	text.setAttribute('align','center')
	GraficalTag = '56294-26'+str(IndexTag)
	basic = addElementNode(drawObj,'basic')							
	basic.setAttribute('tag',GraficalTag)
	
	if Gruppierung == 1:
		basic = addElementNode(groupDrawObj,'basic')							
		basic.setAttribute('tag','56294-2690')    
	font = addNewElementNode(text,'font')
	font.setAttribute('face',face)
	font.setAttribute('color','')
	font.setAttribute('height',str(fontheight))
	font.setAttribute('charSet','1')
	
	font.setAttribute('pitchAndFamily','2')	 

	return text

def getContent(chord):															# Holt die Werte einer eventuell bestehende Generalbass-
	global Register1, Register2, Register3, Register4	 						# bezifferung zurück
	global Saite1, Saite2, Saite3, Saite4, Saite5, Saite6, Saite7
	global Saite1o, Saite2o, Saite3o, Saite4o, Saite5o, Saite6o, Saite7o
	global DoppelSaiten 

	tag = '0'
	for drawObj in chord.getElementsByTagName('drawObj'):
		
		tag = '0'	
		for content in drawObj.getElementsByTagName('content'):
			ObjectContent = latin1_e(content.firstChild.nodeValue)
			
			
		for basic in drawObj.getElementsByTagName('basic'):
			tag = basic.getAttribute('tag')
		
		
		if (tag == '56294-2601'):
			 if ObjectContent in Buende:
			 	Saite1 = max(Buende.index(ObjectContent), Saite1)
			 	if not (Buende.index(ObjectContent) in DoppelSaiten[0]):
			 		DoppelSaiten[0] += [Buende.index(ObjectContent)]
		if (tag == '56294-2602'):
			 if ObjectContent in Buende:
			 	Saite2 = max(Buende.index(ObjectContent), Saite2)
			 	if not (Buende.index(ObjectContent) in DoppelSaiten[1]):
			 		DoppelSaiten[1] += [Buende.index(ObjectContent)]
	
		if (tag == '56294-2603'):
			 if ObjectContent in Buende:
			 	Saite3 = max(Buende.index(ObjectContent), Saite3)
			 	if not (Buende.index(ObjectContent) in DoppelSaiten[2]):
			 		DoppelSaiten[2] += [Buende.index(ObjectContent)]

		if (tag == '56294-2604'):
			 if ObjectContent in Buende:
			 	Saite4 = max(Buende.index(ObjectContent), Saite4)
			 	if not (Buende.index(ObjectContent) in DoppelSaiten[3]):
			 		DoppelSaiten[3] += [Buende.index(ObjectContent)]
		if (tag == '56294-2605'):
			 if ObjectContent in Buende:
			 	Saite5 = max(Buende.index(ObjectContent), Saite5)
			 	if not (Buende.index(ObjectContent) in DoppelSaiten[4]):
			 		DoppelSaiten[4] += [Buende.index(ObjectContent)]
		if (tag == '56294-2606'):
			 if ObjectContent in Buende:
			 	Saite6 = max(Buende.index(ObjectContent), Saite6)
			 	if not (Buende.index(ObjectContent) in DoppelSaiten[5]):
			 		DoppelSaiten[5] += [Buende.index(ObjectContent)]
		if (tag == '56294-2607'):
			 if ObjectContent in Buende:
			 	Saite7 = max(Buende.index(ObjectContent), Saite7)
			 	if not (Buende.index(ObjectContent) in DoppelSaiten[6]):
			 		DoppelSaiten[6] += [Buende.index(ObjectContent)]
		if (tag == '56294-2611'):
			 if ObjectContent in Daumensatz:
			 	DaumenNummer = Daumensatz.index(ObjectContent)
			 	Saite1= len(Buende) + DaumenNummer 
		if (tag == '56294-2612'):
			 if ObjectContent in Daumensatz:
			 	DaumenNummer = Daumensatz.index(ObjectContent)
			 	Saite2= len(Buende) + DaumenNummer 
		if (tag == '56294-2613'):
			 if ObjectContent in Daumensatz:
			 	DaumenNummer = Daumensatz.index(ObjectContent)
			 	Saite3= len(Buende) + DaumenNummer 			 	
		if (tag == '56294-2614'):
			 if ObjectContent in Daumensatz:
			 	DaumenNummer = Daumensatz.index(ObjectContent)
			 	Saite4= len(Buende) + DaumenNummer 
		if (tag == '56294-2615'):
			 if ObjectContent in Daumensatz:
			 	DaumenNummer = Daumensatz.index(ObjectContent)
			 	Saite5= len(Buende) + DaumenNummer 
		if (tag == '56294-2616'):
			 if ObjectContent in Daumensatz:
			 	DaumenNummer = Daumensatz.index(ObjectContent)
			 	Saite6= len(Buende) + DaumenNummer
	
			 				 				 			
def makeStemInvisible(chord):
	drawObjects = chord.getElementsByTagName('drawObjects')[0]
	if Glissando == 2:
		stem = addElementNode(chord,'stem')
		stem.setAttribute('invisible','true')

def createKey(rest):
	restDrawObjects = addNewElementNode(rest,'drawObjects')
	
	
def formatNumber(number):	
	global GitarreroSchriftgroesse, GitarreroSchriftFett, GitarreroSchriftKursiv,GitarreroSchriftart
	
	for font in number.getElementsByTagName('font'):
		font.setAttribute('height',str(GitarreroSchriftgroesse))
		font.setAttribute('face',str(GitarreroSchriftart))
		if GitarreroSchriftFett == 0:
			font.setAttribute('weight','')
		if GitarreroSchriftFett == 1:
			font.setAttribute('weight','700')			
		if GitarreroSchriftKursiv == 0:
			font.setAttribute('italic','')
		if GitarreroSchriftKursiv == 1:
			font.setAttribute('italic','true')
			
def setNumber(chord, contents, NoteY, NoteTag):
	drawObjects = addElementNode(chord,'drawObjects')
	Number = newText(drawObjects,  0, NoteY, contents,5,NoteTag, 'TimesNewRoman')
	
	formatNumber(Number)
	
	return Number
	
def setKey(element):
	global GitarreroAnzahlSaiten
	
	newRest = addNewElementNode(element.parentNode, 'rest')
	restDuration = addNewElementNode(newRest, 'duration')
	restDuration.setAttribute('base','/128')
	restDuration.setAttribute('noDuration','true')
	restDisplay = addNewElementNode(newRest,'display')
	restDisplay.setAttribute('small', 'true')
	restDisplay.setAttribute('invisible','true')
	newRest.parentNode.insertBefore(newRest, element)
	drawObjects = addElementNode(newRest,'drawObjects')
	Verschiebung = 0.55 * (2-GitarreroAnzahlSaiten)
	Key99 = newText(drawObjects,  1.5, -0.65+ Verschiebung, 'T',7,'99', 'TimesNewRoman')
	Key98 = newText(drawObjects,  1.5, -0.65+1.6+ Verschiebung, 'A',7,'98', 'TimesNewRoman')
	Key97 = newText(drawObjects,  1.5, -0.65+3.2+ Verschiebung, 'B',7,'97', 'TimesNewRoman')
	if SchluesselTyp == 0:
		if len(StimmungsSaiten) > 6:
			Saite7 = StimmungsSaiten[6]
		else:
			Saite7 = ' '
		Saite1 = StimmungsSaiten[5]
		Saite2 = StimmungsSaiten[4]
		Saite3 = StimmungsSaiten[3]
		Saite4 = StimmungsSaiten[2]
		Saite5 = StimmungsSaiten[1]
		Saite6 = StimmungsSaiten[0]
		
	if SchluesselTyp == 1:
		if GitarreroAnzahlSaiten <> 3:
			Saite1 = '1'
			Saite2 = '2'
			Saite3 = '3'
			Saite4 = '4'
			Saite5 = '5'
			Saite6 = '6'
			Saite7 = '7'
		if GitarreroAnzahlSaiten == 3:
			Saite1 = '2'
			Saite2 = '3'
			Saite3 = '4'
			Saite4 = '5'
			Saite5 = '6'
			Saite6 = '7'
			Saite7 = '1'
	if SchluesselTyp == 2:
			Saite1 = ' '
			Saite2 = ' '
			Saite3 = ' '
			Saite4 = ' '
			Saite5 = ' '
			Saite6 = ' '
			Saite7 = ' '	
	
	if GitarreroAnzahlSaiten < 3:
		Saite7 = ' '
	if GitarreroAnzahlSaiten < 2:
		Saite1 = ' '
	if GitarreroAnzahlSaiten < 1:
		Saite2 = ' '
		
	Key90 = newText(drawObjects,  0, string.atof(SaitenHoehe[6])-0.3, Saite7,4,'90', 'Arial')
	Key91 = newText(drawObjects,  0, string.atof(SaitenHoehe[5])-0.3, Saite1,4,'91', 'Arial')
	Key92 = newText(drawObjects,  0, string.atof(SaitenHoehe[4])-0.3, Saite2,4,'92', 'Arial')
	Key93 = newText(drawObjects,  0, string.atof(SaitenHoehe[3])-0.3, Saite3,4,'93', 'Arial')
	Key94 = newText(drawObjects,  0, string.atof(SaitenHoehe[2])-0.2, Saite4,4,'94', 'Arial')
	Key95 = newText(drawObjects,  0, string.atof(SaitenHoehe[1])-0.2, Saite5,4,'95', 'Arial')
	Key96 = newText(drawObjects,  0, string.atof(SaitenHoehe[0])-0.2, Saite6,4,'96', 'Arial')

	for font in Key99.getElementsByTagName('font'):
		font.setAttribute('weight','700')
	for font in Key98.getElementsByTagName('font'):
		font.setAttribute('weight','700')
	for font in Key97.getElementsByTagName('font'):
		font.setAttribute('weight','700')		
	for font in Key91.getElementsByTagName('font'):
		font.setAttribute('weight','700')	
	for font in Key92.getElementsByTagName('font'):
		font.setAttribute('weight','700')	
	for font in Key93.getElementsByTagName('font'):
		font.setAttribute('weight','700')	
	for font in Key94.getElementsByTagName('font'):
		font.setAttribute('weight','700')	
	for font in Key95.getElementsByTagName('font'):
		font.setAttribute('weight','700')	
	for font in Key96.getElementsByTagName('font'):
		font.setAttribute('weight','700')											
	

def getNote(head):
	
	Alteration = '-'
	for alter in head.getElementsByTagName('alter'):
		if alter.getAttribute('step') == '1':
			Alteration='#'
		if alter.getAttribute('step') == '-1':
			Alteration='b'
		if alter.getAttribute('step') == '2':
			Alteration='x'
		if alter.getAttribute('step') == '-2':
			Alteration='s'			
	HeadContent = str(head.getAttribute('pitch') + Alteration)

	return HeadContent 

def getNoteY(contents):
	Saitennummer = 0
	if contents in Saiten:
		Saitennummer = Saiten.index(contents)
		
	Hoehe[Saitennummer]
	
def changeLage(chord):
	global LeerSaiten, LagenAutomatikSchwelle
	
	chordTime = getTime(chord)

	LageFound = False
	
	LageIntern = Lage
	if LagenAutomatik == True:								# Errechnen der jeweiligen Lage
		i = 0
		while i < len(LagenWechsel) and LageFound == False:
			if chordTime < LagenWechsel[i][0]:
				LageIntern = LetzteLage
				LageFound = True
			if chordTime >= LagenWechsel[len(LagenWechsel)-1][0]:
				LageIntern = LagenWechsel[len(LagenWechsel)-1][1]
			LetzteLage = LagenWechsel[i][1]
			i+=1
		
	gefunden = 0
	
	for drawObjects in chord.getElementsByTagName('drawObjects'):
		drawObjects = chord.getElementsByTagName('drawObjects')[0]
		for drawObj in drawObjects.getElementsByTagName('drawObj'):
			tag = '0'	

			for content in drawObj.getElementsByTagName('content'):
				ObjectContent = latin1_e(content.firstChild.nodeValue)
				
			for basic in drawObj.getElementsByTagName('basic'):
				tag = basic.getAttribute('tag')
			Bund = 'xxx'
			if (tag == '56294-2601'):
				 if ObjectContent in Buende:
				 	Bund = ObjectContent
			if (tag == '56294-2602'):
				 if ObjectContent in Buende:
				 	Bund = ObjectContent
			if (tag == '56294-2603'):
				 if ObjectContent in Buende:
				 	Bund = ObjectContent
			if (tag == '56294-2604'):
				 if ObjectContent in Buende:
				 	Bund = ObjectContent
			if (tag == '56294-2605'):
				 if ObjectContent in Buende:
				 	Bund = ObjectContent
			if (tag == '56294-2606'):
				 if ObjectContent in Buende:
				 	Bund = ObjectContent
			if (tag == '56294-2607'):
				 if ObjectContent in Buende:
				 	Bund = ObjectContent			
			if (Bund <> 'xxx'): 
				if (LagenAutomatik == 0):
				
					BundZahl = string.atoi(Bund)
					
					i=0
					Saite = string.atoi(tag[9]) -1
					
					while ((i < 6) or ((BundZahl == 0) and (LeerSaiten == 0))) and (Saite<>6):
					
						if ((BundZahl <= LageIntern) and (BundZahl <> 0)) or ((BundZahl == 0) and (LeerSaiten == 0)):
			
							if (tag <> '56294-2606'):
								
								SaiteNeu = Saite + 1
								
								AlteSaiteStart = Stimmung[5-Saite]
								
								NeueSaiteStart = Stimmung[5-SaiteNeu]
								
								Differenz = AlteSaiteStart-NeueSaiteStart
								NeuerBund = BundZahl + Differenz
								for text in drawObj.getElementsByTagName('text'):
									text.setAttribute('y',SaitenHoehe[5-SaiteNeu])
								for basic in drawObj.getElementsByTagName('basic'):
									basic.setAttribute('tag',(tag[0:9] + str((SaiteNeu+1))))
										
								content.removeChild(content.firstChild)
								textNode = doc.createTextNode(latin1_d(str(NeuerBund)))
								content.appendChild(textNode)	
								
								BundZahl = NeuerBund
								Saite = SaiteNeu
						i+=1
						
				elif (LagenAutomatik == 1):
				
					BundZahl = string.atoi(Bund)
					
					i=0
					Saite = string.atoi(tag[9]) -1
					
					while ((i < 5) or ((BundZahl == 0) and (LagenAutomatikSchwelle < LageIntern))) and (Saite<>5):
					
						if ((BundZahl <= LageIntern) and (BundZahl <> 0)) or ((BundZahl == 0) and (LagenAutomatikSchwelle < LageIntern)):
			
							if (tag <> '56294-2606'):
								
								SaiteNeu = Saite + 1
								
								AlteSaiteStart = Stimmung[5-Saite]
								
								NeueSaiteStart = Stimmung[5-SaiteNeu]
								
								Differenz = AlteSaiteStart-NeueSaiteStart
								NeuerBund = BundZahl + Differenz
								for text in drawObj.getElementsByTagName('text'):
									text.setAttribute('y',SaitenHoehe[5-SaiteNeu])
								for basic in drawObj.getElementsByTagName('basic'):
									basic.setAttribute('tag',(tag[0:9] + str((SaiteNeu+1))))
										
								content.removeChild(content.firstChild)
								textNode = doc.createTextNode(latin1_d(str(NeuerBund)))
								content.appendChild(textNode)	
								
								BundZahl = NeuerBund
								Saite = SaiteNeu
						i+=1									
	return gefunden	
			
		

def clearNote(chord):
    for drawObjects in chord.getElementsByTagName('drawObjects'):					# Alle drawObj mit tag == GraficalTag löschen
          for drawObj in drawObjects.childNodes:
             if drawObj.nodeType == drawObj.ELEMENT_NODE and drawObj.tagName == 'drawObj':
             	for basic in drawObj.getElementsByTagName('basic'):
                     if basic.hasAttribute('tag') and basic.getAttribute('tag') == '56294-2600':
                        drawObjects.removeChild(drawObj)
              
    for drawObjects in chord.getElementsByTagName('drawObjects'):					# Alle drawObj mit tag == GraficalTag löschen
         for drawObj in drawObjects.childNodes:
             if drawObj.nodeType == drawObj.ELEMENT_NODE and drawObj.tagName == 'drawObj':
            	for basic in drawObj.getElementsByTagName('basic'):
                     if basic.hasAttribute('tag') and basic.getAttribute('tag')[0:8] == '56294-26':
                        
                        if not (basic.getAttribute('tag')[0:9] == '56294-269'):
                        	#Test(basic.getAttribute('tag')[0:9])
                        	drawObjects.removeChild(drawObj)     	
         	  		  	               
         if drawObjects.getElementsByTagName('drawObj').length == 0:					# Wenn drawObjects keine Elemente mehr enthält, dann löschen  
             drawObjects.parentNode.removeChild(drawObjects)
             
def handleNotes(chord):
    global Register1, Kopfform, AutoAnpassen, LeerSaiten
    
    clearNote(chord)
    

    drawObjs = chord.getElementsByTagName('drawObjs')
       			

    if NurLoeschen == 0:     

        for head in chord.getElementsByTagName('head'):
        	NoteY = -2.5
	    	NoteHight = getNote(head)

	    	NoteContent = '?'
	    	NoteTag = 00
	    	HeadNumber = findNote(NoteHight)
	    	if HeadNumber <> '':
	    		
	    		if not (HeadNumber < Stimmung[0]):
	    			i = 0
	    			
	    			while i + ((len(Stimmung)-4)-GitarreroAnzahlSaiten) <= (len(Stimmung)-1): 
		    			if not (HeadNumber >= Stimmung[i+1]) or (i + ((len(Stimmung)-4)-GitarreroAnzahlSaiten)== (len(Stimmung)-1)):
		    				
		    				NoteContent = str(HeadNumber - Stimmung[i])
		    				NoteY = SaitenHoehe[i]
		    				NoteTag = ('0' + str(6-i))
		    				if i == 6:
		    					NoteTag = ('07')
		    	
			
				    		if (HeadNumber - Stimmung[i]) >= 0:
				    			
				    			setNumber(chord,NoteContent, NoteY, NoteTag)
				    	i +=1



                        
def getCursor():
    sel = curSelection()
    result = None
    if sel == 0:
        messageBox('Fehler', 'keine aktive Partitur')
        return result
    #if sel[0] != sel[1]:
    #    messageBox('Fehler', 'Markierung ist nicht leer')
    #    return result
    result = sel[0]
    return result

def getElementObjects(objList):  # returns a List
    newList = NodeList()
    for n in range(objList.length):
        if objList[n].nodeType == objList[n].ELEMENT_NODE:
            newList.append(objList[n])
    return newList


def copyStaffLayout(score, layoutName):
	global GitarreroAnzahlSaiten
	
	layout = score.getElementsByTagName('layout')[0]
	
	distances =layout.getElementsByTagName('distances')[0]					# Kleine Notenzeile mit großem Abstand
	staffLines = distances.getElementsByTagName('staffLines')[0]
	staffLines.setAttribute('small','3')
		
	staves = layout.getElementsByTagName('staves')[0]
	
	staffCount = 0
	for staff in staves.getElementsByTagName('staffLayout'):
		staffCount+=1

	
	TabFound = 0
	staffCount2 = 0
	for staffLayout in score.getElementsByTagName('staffLayout'):
		if staffLayout.getAttribute('description') ==('Gittarero-Tabulatur' + ' ' + layoutName):
			staffLayoutClone = staffLayout
			notationClone = staffLayoutClone.getElementsByTagName('notation')[0]
			notationClone.setAttribute('notelines',NotenlinienCode[GitarreroAnzahlSaiten])
			barlinesClone = notationClone.getElementsByTagName('barlines')[0] 		# Taktstriche für entsprechend viele Zeilen
			barlinesClone.setAttribute('to',str(7-(2-GitarreroAnzahlSaiten)))

			TabFound = 1
	
	for staffLayout in score.getElementsByTagName('staffLayout'):
		staffCount2 += 1
		if staffLayout.getAttribute('description') == layoutName and TabFound == 0:
			staffLayoutClone = staffLayout.cloneNode(1)		
			staves.appendChild(staffLayoutClone)							# Kopie der Musterzeile
			if staffCount2 < staffCount:
				staves.insertBefore(staffLayoutClone, staffLayout.nextSibling)
	
			
			staffLayoutClone.setAttribute('description',('Gittarero-Tabulatur' + ' ' +staffLayoutClone.getAttribute('description')))
			distancesClone = staffLayoutClone.getElementsByTagName('distances')[0]	# Kleinformatierung der Musterzeile
			distancesClone.setAttribute('lineDist','small')
			distancesClone.setAttribute('top','8')
			notationClone = staffLayoutClone.getElementsByTagName('notation')[0]	# Notation der Musterzeile
			notationClone.setAttribute('defaultClef','N3') 
			notationClone.setAttribute('notelines',NotenlinienCode[GitarreroAnzahlSaiten]) 
			barlinesClone = notationClone.getElementsByTagName('barlines')[0] 		# Taktstriche für entsprechend viele  Zeilen
			barlinesClone.setAttribute('from','2')
			barlinesClone.setAttribute('to',str(7-(2-GitarreroAnzahlSaiten)))
	


def copyStaff(system, layoutName):			
	staves = system.getElementsByTagName('staves')[0]
	
	staffClone = False
	
	for staff in staves.getElementsByTagName('staff'):
		
		if staff.getAttribute('layout') == layoutName:
			getLagen(staff)
			staffClone = staff.cloneNode(1)
			staffClone.setAttribute('layout',('Gittarero-Tabulatur' + ' ' + staffClone.getAttribute('layout')))
			staves.appendChild(staffClone)
			
			for chord in staffClone.getElementsByTagName('chord'):
				makeNoteInvisible(chord)
	
	return staffClone
	
def getNoteLength(note):
	for duration in note.getElementsByTagName('duration'):
		notelength = duration.getAttribute('base')
	return notelength

def makeNoteInvisible(chord):
	display = addElementNode(chord, 'display')
	display.setAttribute('invisible','true')
	display.setAttribute('small','true')

def makeKeyClefInsivible(staff):
	for voice in staff.getElementsByTagName('voice'):
		for clefSing in voice.getElementsByTagName('clefSign'):
			clefSign = voice.getElementsByTagName('clefSign')[0]
			
			clefSign.setAttribute('clef','N3')
			for timeSign in voice.getElementsByTagName('timeSign'):
				
				objList = getElementObjects(staff.getElementsByTagName('noteObjects')[0].childNodes)
				i=0
				for obj in objList:	
					if i <= 2:
						if obj == timeSign:
							staff.setAttribute('defaultTime',timeSign.getAttribute('time'))
				i+=1
				timeSign.parentNode.removeChild(timeSign)
				

def makeRestInvisible(staff):
	for rest in staff.getElementsByTagName('rest'):
		display = addElementNode(rest, 'display')
		display.setAttribute('invisible', 'true')

def killKey(staff):
	for voice in staff.getElementsByTagName('voice'):
		for keySign in voice.getElementsByTagName('keySign'):
			keySign.parentNode.removeChild(keySign)

def killbarlines(staff):
	for voice in staff.getElementsByTagName('voice'):
		for barline in voice.getElementsByTagName('barline'):
			if barline.getAttribute('type') <> '':
				barline.setAttribute('type','')
			
def killdrawObjects(chord):
	for drawObjects in chord.getElementsByTagName('drawObjects'):
		drawObjects.parentNode.removeChild(drawObjects)		

def setNewNumber(chord):
	global Saite1, Saite2, Saite3, Saite4, Saite5, Saite6, Saite7

	clearNote(chord)
	SaitenSammlung = [Saite1, Saite2, Saite3, Saite4, Saite5, Saite6, Saite7]
	i = 0
	while i < len(SaitenSammlung):
		NoteContent = ' '
		if SaitenSammlung[i] > -1:
			NoteY =	SaitenHoehe[5-i]
			NoteTag = str('0' + str(i+1))
			if SaitenSammlung[i] < len(Buende):
				NoteContent = Buende[SaitenSammlung[i]]

			if SaitenSammlung[i] <> ' ':					
				if SaitenSammlung[i] >= len(Buende):
					DaumenNummer = SaitenSammlung[i] - len(Buende)
					NoteContent = Daumensatz[DaumenNummer]
					NoteTag = str('1' + str(i+1))
				if 	NoteContent <> ' ':
					setNumber(chord,NoteContent, NoteY, NoteTag)
		i +=1

def getTime(chord):			
	objList = getElementObjects(chord.parentNode.parentNode.getElementsByTagName('noteObjects')[0].childNodes)
	time = 0
	i = 0
	while chord <> objList[i]:
		objects = objList[i]
		addTime = getLength(objects)
		time +=  addTime
		i += 1
	return time

def getIrregular(object):
	irregular = float(1)
	count = 0
	tripartite = 'false'
	for duration in object.getElementsByTagName('duration'):
		for tuplet in duration.getElementsByTagName('tuplet'):
			count = string.atoi(tuplet.getAttribute('count'))
			tripartite = tuplet.getAttribute('tripartite')
				
	if count == 2 and tripartite == 'true':
		irregular = float(3) /float (4)
	elif count == 3:
		irregular =  float(2) /float (3)
	elif count == 5:
		irregular = float(4) /float (5)
	elif count == 7:
		irregular = float(4) /float (7)
	else:
		irregular = 1

	return irregular
	

def getLength(object):
	length = 0
	if object.tagName in ['chord','rest']:
		for duration in object.getElementsByTagName('duration'):
			if duration.getAttribute('noDuration') <> 'true':
				if not duration.getAttribute('base') in ['1']:
					length = 1 / string.atof(duration.getAttribute('base')[2:])

				else:
					length = 1
				dotsMult = 1
				if duration.getAttribute('dots') == '1':
					dotsMult = 1.5
				if duration.getAttribute('dots') == '2':
					dotsMult = 1.75					
				length = length * dotsMult
				length = length * getIrregular(object)

	return length

def killxShift(staff):
	for chord in staff.getElementsByTagName('chord'):
		for display in chord.getElementsByTagName('display'):
			display.setAttribute('xShift','')
		
def findNote(note):		
	result = ''
	
	
	k = 0
	while ((k < len(Toene)) and (k <1000)):
		m = 0
		while ((m < len(Toene[k])) and (m <1000)):
			if Toene[k][m] == note:
				result = k	
					
			m += 1
		k +=1
	
	
	return result

def getCursorRange():
    global t1, t2
	
    sel = curSelection()
    (sy1,st1,vo1,ob1),(sy2,st2,vo2,ob2) = sel
    sel = (min(sy1,sy1), min(st1,st2),min(vo1,vo2),min(ob1,ob2)),(max(sy1,sy1), max(st1,st2),max(vo1,vo2),max(ob1,ob2))
    (sy1,st1,vo1,ob1),(sy2,st2,vo2,ob2) = sel
    
    AuswahlJA = False
    if ob2 > ob1: # sonst wird Zeichen hinter rechtem Cursor auch bearbeitet
        ob2 -= 1
        sel = (sy1,st1,vo1,ob1),(sy2,st2,vo2,ob2)
        AuswahlJA = True
    if sel == 0:
        messageBox('Fehler', 'keine aktive Partitur')
        return (0,0,0,0),(0,0,0,0)
    if sel[0][0:3] <> sel[1][0:3]: # mehrere Stimmen markiert -> alle Noten
        ob1 = 0
        ob2 = 999
    if sel[0][0:2] <> sel[1][0:2]: # mehrere Notenzeilen markiert -> alle Stimmen
        vo1 = 0
        vo2 = 999
    if sel[0][0] <> sel[1][0]: # mehrere Systeme markiert -> alle Notenzeilen
        st1 = 0
        st2 = 999
    sel = (sy1,st1,vo1,ob1),(sy2,st2,vo2,ob2),AuswahlJA
    t1 = ob1
    t2 = ob2

    return sel

def cleanChord(chord):
	for obj in chord.getElementsByTagName('drawObj'):
		drawObjects = obj.parentNode
		for basic in obj.getElementsByTagName('basic'):
			
			if basic.getAttribute('tag')[0:9] == '56294-260':
				obj.parentNode.removeChild(obj)
				
		if drawObjects.getElementsByTagName('drawObj').length == 0:			# Wenn drawObjects keine Elemente mehr enthält, dann löschen  
			drawObjects.parentNode.removeChild(drawObjects)
			
def killExtraDistance(staff):
	for extraDistance in staff.getElementsByTagName('extraDistance'):
		staff.removeChild(extraDistance)

def concurrenceNotes(staff):
	global Saite1, Saite2, Saite3, Saite4, Saite5, Saite6, Saite7
	global Saite1o, Saite2o, Saite3o, Saite4o, Saite5o, Saite6o, Saite7o
	global IntelligenteNummern,concurrenceIntelligent
	
	noteObject = staff.getElementsByTagName('noteObjects')[0]
	objList = getElementObjects(noteObject.childNodes)
	
	i = 0
	for obj in objList:			
		#DoppelSaiten = [[],[],[],[],[],[],[]]
		Saite1 = 0
		Saite2 = 0
		Saite3 = 0
		Saite4 = 0
		Saite5 = 0
		Saite6 = 0
		Saite7 = 0
		Saite1o = 0
		Saite2o = 0
		Saite3o = 0
		Saite4o = 0
		Saite5o = 0
		Saite6o = 0
		Saite7o = 0
		SaiteTemp = []
		if obj.tagName == 'chord':
			
			
			Notenwert = getNoteLength(obj)
			
			getContent(obj)
			cursorTime = getTime(obj)
			
			for voices in staff.getElementsByTagName('voice'):
				noteObject2 = voices.getElementsByTagName('noteObjects')[0]
				objList2 = getElementObjects(noteObject2.childNodes)
				j=0
				while j < len(objList2):
					objects2 = objList2[j]
					if (objects2.tagName == 'chord'):
						if getTime(objects2) == cursorTime:
							getContent(objects2)
							cleanChord(objects2)
					j+=1
					
				
			
			cleanChord(obj)
			Saite1 -= 1 
			Saite2 -= 1
			Saite3 -= 1 
			Saite4 -= 1
			Saite5 -= 1 
			Saite6 -= 1
			Saite7 -= 1		
			SimpleSaiten = [Saite1, Saite2,Saite3,Saite4, Saite5, Saite6, Saite7]


			k = 0
			
			while k < 7:								# DoppelSaiten um 1 reduzieren
				if len(DoppelSaiten[k]) > 0:
					l = 0
					while l < len(DoppelSaiten[k]):
						DoppelSaiten[k][l] -=1
						
						l +=1
				k+=1


			p = 0
												# DoppelSaiten von Einzelsaiten befreien
			while p < 7:
				if len(DoppelSaiten[p]) > 0:
					if SimpleSaiten[p] in DoppelSaiten[p]:
						DoppelSaiten[p].remove(SimpleSaiten[p])						
				p +=1
	

			
			if concurrenceIntelligent == 1:

				p = 0
													# Doppelsaite in Einzelsaiten umwandeln
				if len(DoppelSaiten[6]) > 0:				# Bearbeitung einer eventuellen 7ten Saite	
						
						Differenz7zu6 = Stimmung[6-p] - Stimmung[5-p]
						#Test(Differenz7zu6)
						#Test(SimpleSaiten)
						if SimpleSaiten[0] == -1:
							k = 0
							while len(DoppelSaiten[6])>0:
								if (DoppelSaiten[6][k] > -1):
									DoppelSaiten[0] += [(DoppelSaiten[6][k]+Differenz7zu6)]
									DoppelSaiten[6].remove(DoppelSaiten[6][k])
								
							
							DoppelSaiten[0].sort()
							SimpleSaiten[0] = DoppelSaiten[0][0]
							DoppelSaiten[0].remove(DoppelSaiten[0][0])


				while p < 7:
					
																			

					
					if len(DoppelSaiten[p]) > 0 and p < 6:
						AlteSaiteStart = Stimmung[5-p]
						NeueSaiteStart = Stimmung[4-p]
					
						Differenz = AlteSaiteStart-NeueSaiteStart	
	
						if SimpleSaiten[p+1] == -1:
							k = 0
							while len(DoppelSaiten[p])>0:
								if (DoppelSaiten[p][k] > -1):
									DoppelSaiten[p+1] += [(DoppelSaiten[p][k]+Differenz)]
									DoppelSaiten[p].remove(DoppelSaiten[p][k])
								
							
							DoppelSaiten[p+1].sort()
							SimpleSaiten[p+1] = DoppelSaiten[p+1][0]
							DoppelSaiten[p+1].remove(DoppelSaiten[p+1][0])
					p +=1
			
				
				

			p = 0										# Doppelsaite in Rot/schwarz angehängen
			while p < 7:						
				if len(DoppelSaiten[p]) > 0:
					
					k = 0
					while len(DoppelSaiten[p]) > 0:

						NoteY = SaitenHoehe[5-p]
						if (DoppelSaiten[p][k] > -1) and (IntelligenteNummern <> 1):
							Number = setNumber(obj,str(DoppelSaiten[p][k]), NoteY, ('0' + str(p+1)))
							if IntelligenteNummern == 0:
								for font in Number.getElementsByTagName('font'):
									font.setAttribute('color','FF0000')
						DoppelSaiten[p].remove(DoppelSaiten[p][k])
									
						
				p +=1				


			m =0										# Einzelsaiten in Schwarz anhängen
			while m < 7:
				
				NoteY = SaitenHoehe[5-m]
				if SimpleSaiten[m] > -1:
					
					setNumber(obj,str(SimpleSaiten[m]), NoteY, ('0' + str(m+1)))
				m+=1

		i +=1 	

def getLagen(staff):
	global LagenWechsel, LageBeginOld
	

	beginningLageChanged = False
	
	for chord in staff.getElementsByTagName('chord'):
		for text in chord.getElementsByTagName('text'):
			for content in text.getElementsByTagName('content'):
				try: 
					ObjectContent = latin1_e(content.firstChild.nodeValue)
					if ObjectContent[0].upper() == 'B' and len(ObjectContent) > 1:												# Barree-Lagen
						ObjectContent = ObjectContent[1:]
						if ObjectContent[0] == ' ' and len(ObjectContent) > 1:
							ObjectContent = ObjectContent[1:]
					if ObjectContent in LagenRoemisch:
						LagenTime = getTime(chord)
						TimeAlreadySet = False
						i = 0
						while i < len(LagenWechsel):
							if (LagenWechsel[i][0] == LagenTime) and ((LagenTime <> 0) or LagenWechsel[i][2] == 'A'):
								TimeAlreadySet = True
							if (LagenTime == 0) and LagenWechsel[i][2] == 'M':
								LagenWechsel.sort()
								LageBeginOld = LagenWechsel[0]
								LagenWechsel[0] = [LagenTime,LagenRoemisch.index(ObjectContent), 'A']
								TimeAlreadySet = True
								LagenWechsel[i][2] = 'A'						
							i+=1
						if  TimeAlreadySet == False:
							LagenWechsel +=[[LagenTime,LagenRoemisch.index(ObjectContent),'A']] 
							LagenWechsel.sort()
				except:
					fake = True
	
	beforeFirstVoltaLage = LageBeginOld

	for voice in staff.getElementsByTagName('voice'):					
		firstVoltaFound = False
		for element in getElementObjects(voice.getElementsByTagName('noteObjects')[0].childNodes):
			if element.tagName in ['chord','rest']:
				for volta in element.getElementsByTagName('volta'):
					

					if volta.hasAttribute('firstNumber'):
						if volta.getAttribute('firstNumber') == '1':
							firstVoltaTime = getTime(element)
							firstVoltaFound = True
						 	i=0
						 	while i < len(LagenWechsel):
						 		if (LagenWechsel[i][0] < firstVoltaTime):
						 			beforeFirstVoltaLage = LagenWechsel[i]
						 			LageBeginOld = beforeFirstVoltaLage
						 			
						 		i += 1
						elif volta.getAttribute('firstNumber') <> '1':
					 		voltaAlreadySet = 0
					 		nextVoltaTime = getTime(element)
					 		
					 		i=0
						 	while i < len(LagenWechsel):
						 		if (LagenWechsel[i][0] == nextVoltaTime) and LagenWechsel[i][2] == 'A':
						 			voltaAlreadySet = 1
						 		if (LagenWechsel[i][0] == nextVoltaTime) and LagenWechsel[i][2] <> 'A':
						 			voltaAlreadySet = 2	
						 			voltaAlreadyPos = i	
						 		i+= 1
						 	if voltaAlreadySet == 0:
						 		if firstVoltaFound == True: 
								 		LagenWechsel +=[[nextVoltaTime,beforeFirstVoltaLage[1],'V']]
								 		LagenWechsel.sort()
						 		else: 
								 		LagenWechsel +=[[nextVoltaTime,LageBeginOld[1],'V']]
								 		LagenWechsel.sort()						 	
						 	
						 	if voltaAlreadySet == 2:
						 		if firstVoltaFound == True: 
								 		LagenWechsel[voltaAlreadyPos] =[nextVoltaTime,beforeFirstVoltaLage[1],'V']
								 		LagenWechsel.sort()
						 		else: 
								 		LagenWechsel[voltaAlreadyPos] =[nextVoltaTime,LageBeginOld[1],'V']
								 		LagenWechsel.sort()				
				 			
	
	#Test(LagenWechsel)


def changeDoc(score):
	global NurLoeschen, Lage
	global Saite1, Saite2, Saite3, Saite4, Saite5, Saite6, Saite7, SchluesselSetzen, LeerSaiten, StimmungsWahl, HalsRichtung, UpdateFont, AlleSysteme, systemCount
	global UserStimmungen, SchluesselTyp, IntelligenteNummern, DaumenNummer, GitarreroOktaviert, CapoBund, GitarreroAnzahlSaiten
	global Saite1o, Saite2o, Saite3o, Saite4o, Saite5o, Saite6o, Saite7o
	global GitarreroSchriftgroesse, GitarreroSchriftFett, GitarreroSchriftKursiv, GitarreroSchriftart, FontList
	global LagenWechsel, LagenAutomatik,LagenAutomatikSchwelle, alleSystemeJA,AlleSysteme, LageBeginOld

	LagenAutomatik = 1
	Saite1 = -1
	Saite2 = -1
	Saite3 = -1
	Saite4 = -1
	Saite5 = -1
	Saite6 = -1
	Saite7 = -1
	Saite1o = 100
	Saite2o = 100
	Saite3o = 100
	Saite4o = 100
	Saite5o = 100
	Saite6o = 100
	Saite7o = 100
	Lage = 0
	StimmungsWahl = 0
	LeerSaiten = 1
	HalsRichtung = 2
	UserStimmungen = ''
	NurLoeschen = 0
	SchluesselTyp = 0
	DaumenNummer = -1
	AlleSysteme = 0
	CapoBund = 0
	GitarreroOktaviert = 0
	GitarreroSchriftgroesse = 5
	GitarreroSchriftFett = 0
	GitarreroSchriftKursiv = 0
	GitarreroSchriftart = 'TimesNewRoman'
	GitarreroAnzahlSaiten = 2
	LagenAutomatikSchwelle = 4
	UpdateFont = 0
	alleSystemeJA = 0
	


	FontList += getFonts()

	
	getOptions()

	sel = getCursor()
	(sy1, st1, vo1, ob1),(sy2, st2, vo2, ob2),AuswahlJA = getCursorRange()
	getCursorRange()
	if sel == None:
        #
		return
	else:
		system = score.getElementsByTagName('system')[sel[0]]
		systemSel = system
		staff = system.getElementsByTagName('staff')[sel[1]]
		voice = staff.getElementsByTagName('voice')[sel[2]]
		noteObject = voice.getElementsByTagName('noteObjects')[0]
		
		layoutName = staff.getAttribute('layout')
		
		if not (layoutName[0:19] == 'Gittarero-Tabulatur'):
			Funktion = 1
		if layoutName[0:19] == 'Gittarero-Tabulatur':
			if not AuswahlJA:
				Funktion = 2
			if AuswahlJA:
				Funktion = 3
		
		if Funktion == 1:
			
			if getDialogValues1(score):
				LagenWechsel += [[0,Lage,'M']]
				LageBeginOld = [[0,Lage,'M']]
				copyStaffLayout(score, layoutName)
				systemCount = 0
				for systems in score.getElementsByTagName('system'):
					
					if systems == systemSel or AlleSysteme == 1:
						systemCount +=1
						system = systems
						stafffound = 0
						Kontrolle = True
						for stafffind in systems.getElementsByTagName('staff'):
							if 	stafffind.getAttribute('layout') == ('Gittarero-Tabulatur' + ' ' + layoutName):
								Kontrolle = getDialogValues3()
								if Kontrolle:
									stafffind.parentNode.removeChild(stafffind)
								else: 
									stafffound = 1			
						if Kontrolle:
							if stafffound == 0:
								staffClone = copyStaff(system, layoutName)
							if staffClone <> False:
								makeKeyClefInsivible(staffClone)
								makeRestInvisible(staffClone)
								killKey(staffClone)
								killxShift(staffClone)
								killExtraDistance(staffClone)
								for chord in staffClone.getElementsByTagName('chord'):
									
									killdrawObjects(chord)
									handleNotes(chord)
								if SchluesselSetzen == 1:
									for noteObjects2 in staffClone.getElementsByTagName('noteObjects'):
										noteObjectsChilds = getElementObjects(noteObjects2.childNodes)
									i = 0
									hasKey = 0
									for elements in noteObjectsChilds:
										for basic in elements.getElementsByTagName('basic'):
											if basic.getAttribute('tag') == '56294-2699':
												hasKey = 1
												
									for elements in noteObjectsChilds:
										if hasKey == 0:
											setKey(noteObjectsChilds[0])
											hasKey = 1
										i+= 1
								
								
								for chord in staffClone.getElementsByTagName('chord'):	
									changeLage(chord)
								for clefSign in staffClone.getElementsByTagName('clefSign'):	
									clefSign.parentNode.removeChild(clefSign)	
								if IntelligenteNummern < 2:
									concurrenceNotes(staffClone)
						LagenWechsel = [[0,LagenWechsel[len(LagenWechsel)-1][1],'M']]
						
		if Funktion == 2:
			objList = getElementObjects(noteObject.childNodes)
			if objList.length <= sel[3]:
				return
			obj = objList[sel[3]]
			
			
			if obj.tagName == 'chord':
				Notenwert = getNoteLength(obj)
				getContent(obj)
				cursorTime = getTime(obj)
				
				for voices in staff.getElementsByTagName('voice'):
					noteObject2 = voices.getElementsByTagName('noteObjects')[0]
					objList2 = getElementObjects(noteObject2.childNodes)
					j=0
					for objects2 in objList2:
						if (objects2.tagName == 'chord') or (objects2.tagName == 'rest'):
							if getTime(objects2) == cursorTime:
								getContent(objects2)
						j+=1	

				if getDialogValues2(score):
					for objects2 in objList2:
						if (objects2.tagName == 'chord') or (objects2.tagName == 'rest'):
							if getTime(objects2) == cursorTime:
								clearNote(objects2)
					setNewNumber(obj)
					


    

		if Funktion == 3:
			if getDialogValues4():
				sy = 0
				for system in score.getElementsByTagName('system'):
					if sy1 <= sy <= sy2:
						st = 0
						for staff in system.getElementsByTagName('staff'):
							if st1 <= st <= st2:
								vo = 0
								for voice in staff.getElementsByTagName('voice'):
									if vo1 <= vo <= vo2:
										
										noteObject = voice.getElementsByTagName('noteObjects')[0]
										objList = getElementObjects(noteObject.childNodes)
										if objList.length <= ob1:
											return									
										ob = 0
										for obj in objList:				
											if ob1 <= ob <= ob2:
												if obj.tagName == 'chord':
													chord = obj
													clearNote(chord)
													handleNotes(chord)
													changeLage(chord)
											ob += 1
									vo += 1

							st += 1
					sy += 1

				
				
				
				#handleNotes(score, voice, obj)
				#makeSingleLine(score, layoutName)
				#setOptions()
				#if InfoComment == 1:
				#	setScoreStyle(score)	

		if UpdateFont == 1:
			for system in score.getElementsByTagName('system'):
				for staff in system.getElementsByTagName('staff'):
					for voice in staff.getElementsByTagName('voice'):
						for chord in voice.getElementsByTagName('chord'):
							for obj in chord.getElementsByTagName('drawObj'):
								drawObjects = obj.parentNode
								for basic in obj.getElementsByTagName('basic'):
									tag = basic.getAttribute('tag')
									#Test(('Jetzt sollte die TabulaturGitarreroSchriftart formatiert werden'+','+ tag[0:9]))
									if tag <> '56294-2600':
										if tag[0:9] in ['56294-260','56294-261']:
											formatNumber(obj)
	setOptions()
		
# Hauptprogramm:

from caplib.capDOM import ScoreChange
import tempfile

class ScoreChange(ScoreChange):
	
	def changeScore(self, score):
	   global doc
	   doc = score.parentNode  
	   changeDoc(score)
		
        

if activeScore():
	
	activeScore().registerUndo("Gitarrero")
	tempInput = tempfile.mktemp('.capx')
	tempOutput = tempfile.mktemp('.capx')
	activeScore().write(tempInput)
	ScoreChange(tempInput, tempOutput)
	activeScore().read(tempOutput)
	os.remove(tempInput)
	os.remove(tempOutput)
