		var rows=new Array();
		var scale=0;
		var offset=0;
		var scaleOffset=0;
		var chord=0;
		var chordOffset=0;
		var chordRootIndex=0;
		var showAllChord=0;
		var harmonica=1;
		var newGreen="#8FBC8F";
		var showAlt=0;
		var showOB=1;
		var showBend=1;
		var fromRoot=1;
		var notesUsed=0;
		var clear=1;

		newhar=document.location.hash.substr(1);
		harmonica=newhar?newhar:harmonica;

		function insRow(){
			loadHarmonica(harmonica);
			colNumbers=harmonicas[harmonica];
			turn=turns[harmonica];
			centerRow=centerRowHarmonica[harmonica];
			nrOfRows=nrOfRowsHarmonica[harmonica];

			var pos=(12+scaleOffset-offset)*7;
			while(pos>=12)pos-=12;

			if (clear) while (document.getElementById("myTable").rows.length)document.getElementById("myTable").deleteRow(0);
			while (document.getElementById("myInfo").rows.length)document.getElementById("myInfo").deleteRow(0);
		    while (document.getElementById("myInfoLow").rows.length)document.getElementById("myInfoLow").deleteRow(0);

			for (i=0;i<=7;i++){
				rows[i]=document.getElementById("myInfo").insertRow(i);
				var newCell=rows[i].insertCell(0);
				if (i>3) newCell.align="right";
				else rows[i].style.backgroundColor="#8FBC8F";
			}

			rows[0].cells[0].innerHTML="<p class=greenblock>"+notes[0][offset]+" harmonica</p>"
			// patent information
			if (states[(harmonica-1)*3][2])rows[1].cells[0].innerHTML="<p class=greenblock> tuning: "+ harmonicaNamesAll[harmonica]+"<br>"+states[(harmonica-1)*3][2]+"</p>";
			else rows[1].cells[0].innerHTML="<p class=greenblock> tuning: "+ harmonicaNamesAll[harmonica]+"</p>";
			if (scale)rows[2].cells[0].innerHTML="<p class=greenblock>"+notes[0][scaleOffset]+" "+scaleNames[scale]+" scale ("+positions[pos]+" position)</p>";
			else rows[2].cells[0].innerHTML="<p class=greenblock>no scale selected</a></p>";
			if (chord)rows[3].cells[0].innerHTML="<p class=greenblockred>"+notes[0][chordOffset]+chordNames[chord]+"</p>";
			else rows[3].cells[0].innerHTML="<p class=greenblock>no chord selected</p>"
			if(showBend)rows[4].cells[0].innerHTML="<p class=block><a href=# onClick=showBend=!showBend;insRow(); title=\"Hide the notes that can be played\nby using the bending technique\n(bend notes are indicated with a blue dot\">hide bend notes</a></p>"
			else rows[4].cells[0].innerHTML="<p class=block><a href=# onClick=showBend=!showBend;insRow(); title=\"Show the notes that can be played\nby using the bending technique\n(bend notes are indicated with a blue dot\">show bend notes</a></p>"
			if (showOB)rows[5].cells[0].innerHTML="<p class=block><a href=# onClick=showOB=!showOB;showAlt=0;insRow(); title=\"Hide the notes that can be played\nby using the overblow technique\n(overblown notes are indicated with a red dot)\">hide overblows</a></p>"
			else rows[5].cells[0].innerHTML="<p class=block><a href=# onClick=showOB=!showOB;insRow(); title=\"Show the notes that can be played\nby using the overblow technique\n(overblown notes are indicated with a red dot)\">show overblows</a></p>"
			if (showOB){
				if (showAlt)rows[6].cells[0].innerHTML="<p class=block><a href=# onClick=showAlt=!showAlt;insRow(); title=\"Hide the notes that can be played as overblows\nbut that are also available as normal draw or blow notes\n or as bend notes\n(overblown notes are indicated with a red dot)\">hide alternative overblows</a></p>"
				else rows[6].cells[0].innerHTML="<p class=block><a href=# onClick=showAlt=!showAlt;insRow(); title=\"Show the notes that can be played as overblows\nbut that are also available as normal draw or blow notes\n or as bend notes\n(overblown notes are indicated with a red dot)\">show alternative overblows</a></p>"
			}
			else rows[6].cells[0].innerHTML="<p class=emptylink>&nbsp;</p>"


			// find roots
			var firstroot=255;
			var lastroot=0;
			// find roots
			for (i=0;i<=nrOfRows;i++){
				for (k=0;k<colNumbers.length;k++){
					if (colNumbers[k][i]){
						noteNumber=colNumbers[k][i]+12;
						noteNumber-=scaleOffset;
						noteNumber+=offset;
						rootNumber=noteNumber;
						while (noteNumber>12)noteNumber-=12;
						if (noteNumber==1 && scales[scale][0]){
							if (firstroot>rootNumber)firstroot=rootNumber;
							if (lastroot<rootNumber)lastroot=rootNumber;
							//alert ("firstroot: "+firstroot);
							//alert ("lastroot: "+lastroot);
						}
					}
				}
			}

			// find chordNotes

			// chordnotes
			localChord=new Array();
			maxChordNote=0;
			maxNote=0;
			for (k=0;k<colNumbers.length;k++){
				for (i=0;i<=nrOfRows;i++){
					if (colNumbers[k][i]){
						noteNumber=colNumbers[k][i]+12;
						noteNumber-=chordOffset;
						noteNumber+=offset;
						if (offset>chordOffset)noteNumber-=12;
						localNumber=noteNumber;
						if (noteNumber>maxNote)maxNote=noteNumber;

						if (showAllChord){
								while (noteNumber>24)noteNumber-=12;
								for (cnname in chords[chord]){
									if (chordnr[chords[chord][cnname]]==noteNumber)localChord[localNumber]=chords[chord][cnname];
								}
								while (noteNumber>12)noteNumber-=12;
								for (cnname in chords[chord]){
									if (chordnr[chords[chord][cnname]]==noteNumber)localChord[localNumber]=chords[chord][cnname];
								}
						}else{
							chordRoot=1+12*(chordRootIndex+1);
							//if (offset>chordOffset)chordRoot+=12;
							if (noteNumber>=chordRoot && noteNumber<chordRoot+24){
								if (noteNumber>=(chordRoot+12)){
									while (noteNumber>24)noteNumber-=12;
									for (cnname in chords[chord]){
										if (chordnr[chords[chord][cnname]]==noteNumber){
											localChord[localNumber]=chords[chord][cnname];
											if (localNumber>maxChordNote)maxChordNote=localNumber
										}
									}
								}
								else {
									while (noteNumber>12)noteNumber-=12;
									for (cnname in chords[chord]){
										if (chordnr[chords[chord][cnname]]==noteNumber){
											localChord[localNumber]=chords[chord][cnname];
											if (localNumber>maxChordNote)maxChordNote=localNumber
										}
									}
								}
							}
						}
					}
				}
			}

			for (i=0;i<=nrOfRows;i++){
				rows[i]=document.getElementById("myTable").insertRow(i);
				for (k=0;k<colNumbers.length;k++){
					var newCell=rows[i].insertCell(k);
					newCell.align="center";
					newCell.vAlign="center";
					newCell.style.height=30+"px";
					newCell.style.width=29+"px";
					newCell.style.backgroundImage = "url('img/empty.gif')";
					newCell.style.backgroundRepeat="no-repeat";
					newCell.style.backgroundPosition="center center";
					newCell.style.color="#000000";

					for (m=0;m<turn.length;m++)
					if (k==turn[m]-1) {
						newCell.style.borderRightStyle="solid";
						newCell.style.borderRightWidth="4";
						newCell.style.borderRightColor="#FFFFFF";
					}

					var fileSuf='';
					if (i<=centerRow-1)fileSuf='blow';
					if (i==centerRow){
						newCell.innerHTML=k+1;
						newCell.style.backgroundImage = "url('img/number.gif')";
					}
					if (i>=centerRow+1)fileSuf='draw';

					if (colNumbers[k][i]){

						noteNumber=colNumbers[k][i];
						if (noteNumber){
							if (overblows[harmonica][k+1]==noteNumber) fileSuf="over"+fileSuf;
							else if (i!=centerRow-1 && i!=centerRow && i!=centerRow+1) fileSuf=fileSuf+"bend";
							if ((altoverblows[harmonica][k+1]==noteNumber))fileSuf="alt"+fileSuf;
							switch (fileSuf) {
								case 'blow':
								case 'draw': newCell.style.backgroundImage = "url('img/off.gif')";break;
								case 'blowbend':
								case 'drawbend': if (showBend) newCell.style.backgroundImage = "url('img/bendoff.gif')";break;
								case 'overblow':
								case 'overdraw': if (showOB) newCell.style.backgroundImage = "url('img/overblowoff.gif')";break;
								case 'altoverblow':
								case 'altoverdraw': if (showAlt && showOB){newCell.style.backgroundImage = "url('img/overblowoff.gif')";break;}
								default: newCell.style.backgroundImage = "url('img/empty.gif')";
							}

							//newCell.style.color="#FFFFFF";

							if (overblows[harmonica][k+1]==noteNumber){
								if ( showOB && (altoverblows[harmonica][k+1]!=noteNumber || showAlt)){
									if (notesUsed==1)noteNumber+=12-scaleOffset;
									noteNumber+=offset;
									while (noteNumber>12)noteNumber-=12;
									newCell.innerHTML=notes[notesUsed][noteNumber-1];
								}
							} else if ((i<centerRow-1)||(i>centerRow+1)){
								if (showBend){
									if (notesUsed==1)noteNumber+=12-scaleOffset;
									noteNumber+=offset;
									while (noteNumber>12)noteNumber-=12;
									newCell.innerHTML=notes[notesUsed][noteNumber-1];
								}
							} else {
								if (notesUsed==1)noteNumber+=12-scaleOffset;
								noteNumber+=offset;
								while (noteNumber>12)noteNumber-=12;
								newCell.innerHTML=notes[notesUsed][noteNumber-1];
							}
							//newCell.innerHTML=colNumbers[k][i];

							noteNumber=colNumbers[k][i]+12;
							noteNumber-=scaleOffset;
							noteNumber+=offset;

							// check if this note is a duplicate note
							if(!(doubledNotes[harmonica][k+1]&& i==centerRow-1) ||!fromRoot){
							if (noteNumber>firstroot && noteNumber<lastroot ||!fromRoot){
								while (noteNumber>12)noteNumber-=12;
								if (scales[scale][noteNumber-1]){
									switch(fileSuf) {
										case 'blow':
										case 'draw': newCell.style.backgroundImage = "url('img/on.gif')";break;
										case 'blowbend':
										case 'drawbend': if (showBend)newCell.style.backgroundImage = "url('img/bendon.gif')";break;
										case 'overblow':
										case 'overdraw': if (showOB)newCell.style.backgroundImage = "url('img/overblowon.gif')";break;
										case 'altoverblow':
										case 'altoverdraw': if(showAlt && showOB)newCell.style.backgroundImage = "url('img/overblowon.gif')";break;
										default: newCell.style.backgroundImage = "url('img/on.gif')";
									}
									newCell.style.color="#000000";
								}
							}
							while (noteNumber>12)noteNumber-=12;
							if (noteNumber==1 && scales[scale][0]) {
								switch (fileSuf) {
									case 'blow':
									case 'draw': newCell.style.backgroundImage = "url('img/root.gif')";break;
									case 'blowbend':
									case 'drawbend': if(showBend) newCell.style.backgroundImage = "url('img/bendroot.gif')";break;
									case 'overblow':
									case 'overdraw': if (showOB)newCell.style.backgroundImage = "url('img/overblowroot.gif')";break;
									case 'altoverblow':
									case 'altoverdraw': if (showAlt && showOB) newCell.style.backgroundImage = "url('img/overblowroot.gif')";break;
									default: newCell.style.backgroundImage = "url('img/root.gif')";
								}
								newCell.style.color="#000000";
							}
							}// doublenotes

		                    if(!(doubledNotes[harmonica][k+1]&& i==centerRow-1) ||showAllChord){
		                    	noteNumber=colNumbers[k][i]+12;
								noteNumber-=chordOffset;
								noteNumber+=offset;
								if (offset>chordOffset)noteNumber-=12;
								if (localChord[noteNumber]){
										newCell.style.color="red";
										newCell.style.fontSize="14";
									}
							} // doublenotes
						}
					}
				}
			}
			rows[0]=document.getElementById("myInfoLow").insertRow(0);
			var newCell=rows[0].insertCell(0);
			newCell.align="left";

			if (scale){
				if (fromRoot)newCell.innerHTML="<a href=# onClick=fromRoot=!fromRoot;insRow(); title=\"Show all notes of the presently highlighted scale\nthat are available on the harmonica\n(roots are indicated by a black dot)\">show all scale notes</a>"
				else newCell.innerHTML="<a href=# onClick=fromRoot=!fromRoot;insRow(); title=\"Show the highlighted scale starting and ending\non a root note\n(roots are indicated by a black dot)\">start at root</a>"
			} else newCell.innerHTML="<p class=emptylink>&nbsp;</p>"

			var newCell=rows[0].insertCell(1);
			newCell.align="right";

			if (chord){
				if (!showAllChord)newCell.innerHTML="<a href=# onClick=showAllChord=!showAllChord;insRow(); title=\"Show all notes of the presently highlighted chord\nthat are available on the harmonica\n(chordnotes are shown in red)\">show all chord notes</a>";
				else newCell.innerHTML="<a href=# onClick=showAllChord=!showAllChord;insRow(); title=\"Highlight the chords one by one,\n starting at the root of the chord\n(chordnotes are shown in red)\">show one chord</a>";
			} else newCell.innerHTML="<p class=emptylink>&nbsp;</p>"

			rows[1]=document.getElementById("myInfoLow").insertRow(1);
			var newCell=rows[1].insertCell(0);
			newCell.align="left";
			if (notesUsed==3)newCell.innerHTML="<a href=# onClick=notesUsed=0;insRow();writeScales(); title=\"Use standard western note names\">use note names</a>"
			else if (notesUsed==0) newCell.innerHTML="<a href=# onClick=notesUsed=1;insRow();writeScales(); title=\"Use solf&egrave;ge names to indicate the notes.\nDo is placed on the root of the highlighted scale\">movable do</a>"
			else if (notesUsed==1) newCell.innerHTML="<a href=# onClick=notesUsed=2;insRow();writeScales(); title=\"Use solf&egrave;ge names to indicate the notes.\nDo is fixed on C\">fixed do</a>"
			else if (notesUsed==2) newCell.innerHTML="<a href=# onClick=notesUsed=3;insRow();writeScales(); title=\"Use note names as they are used in hindustani music theory\">Hindustani names</a>"

		    var newCell=rows[1].insertCell(1);
			newCell.align="right";
			if (chord && !showAllChord){
				if ((maxChordNote+12)<maxNote)newCell.innerHTML="<a href=# onClick=chordRootIndex++;insRow(); title=\"(chordnotes are shown in red)\">show "+positions[chordRootIndex+1]+" chord occurence</a>"
				else if (chordRootIndex) newCell.innerHTML="<a href=# onClick=chordRootIndex=0;insRow(); title=\"(chordnotes are shown in red)\">show "+positions[0]+" chord occurence</a>"
				else newCell.innerHTML="<p class=emptylink>&nbsp;</p>"
			} else newCell.innerHTML="<p class=emptylink>&nbsp;</p>"

		}// einde insrow()


		function writeHarNames(all){
			while (document.getElementById("myHarm").rows.length)document.getElementById("myHarm").deleteRow(0);
			if (all) harNames=harmonicaNamesAll;
			else harNames=harmonicaNames;
			rows[0]=document.getElementById("myHarm").insertRow(0);
			var newCell=rows[0].insertCell(0);
			newCell.innerHTML="<p id=greenblockright class=greenblock><span>The tunings listed here are from <a href=http://www.patmissin.com target=_blank>Pat Missin\'s </a>Altered States.<br>To view the complete listing with comments and tips, go to Pat Missin's website: <a href=http://www.patmissin.com target=_blank>www.patmissin.com </a></span><br><br><span class=configurator><a href=\"http://www.seydel1847.de/epages/Seydel.sf?ObjectPath=/Shops/Seydel&ChangeAction=SessionAffiliate&AID=1411799\" target=\"_blank\"><img src=\"site/img/SEYDEKconfigurator.gif\"></a></span><span class=seydell>It used to be that you had to build the tunings listed on this page yourself. That took a lot of hard work with files and sandpaper. Now you can order special tunings directly from <a href=\"http://www.seydel1847.de/epages/Seydel.sf?ObjectPath=/Shops/Seydel&ChangeAction=SessionAffiliate&AID=1411799\" target=\"_blank\"> C.A. Seydel S&#246;hne</a>, pick any model diatonic harmonica and look for the harp-configurator logo to select you custom tuning.</span></p><br>";

			rows[0]=document.getElementById("myHarm").insertRow(1);
			var newCell=rows[0].insertCell(0);
			newCell.align="right";
			newCell.innerHTML="<a href=# onClick=blur();parent.location=\"?menuid=26&type=xb40\" title=\"Switch to the layout page for the XB40\">XB40</a>";

			rows[0]=document.getElementById("myHarm").insertRow(2);
			var newCell=rows[0].insertCell(0);
			newCell.align="right";
			newCell.innerHTML="<a href=# onClick=blur();location=\"?menuid=26&type=chrom\" title=\"Switch to the layout page for chromatic harmonicas\">chromatic</a>";

			rows[0]=document.getElementById("myHarm").insertRow(3);
			var newCell=rows[0].insertCell(0);
			newCell.align="right";
			if (all) newCell.innerHTML="<a href=# onClick=blur();writeHarNames(0); title=\"Collapse the list of alternate tunings\">show/hide</a><br>";
			else newCell.innerHTML="<a href=# onClick=blur();writeHarNames(1); title=\"Show the full list of alternate tunings\">show/hide</a><br>";

			i=1;
			while (i<harNames.length){
				rows[i]=document.getElementById("myHarm").insertRow(i+3);
				if (harNames[i]){
					newCell=rows[i].insertCell(0);
					newCell.className='harmtd';
					newCell.innerHTML+="<a id=harmonica href=#"+i+" onClick=blur();setHarmonica("+i+","+all+")>"+harNames[i]+"</a>";
					harmonicaNames[harmonica]
					if ((i==harmonica && !all)||(!all && !harmonicaNames[harmonica] && harmonicaNumbers[harmonica]==harmonicaNumbers[i])){
						j=i+1;
						while (harmonicaNumbers[j]==harmonicaNumbers[i]){
							rows[j]=document.getElementById("myHarm").insertRow(j+3);
							newCell=rows[j].insertCell(0);
							newCell.innerHTML="<a class=sub id=harmonica href=#"+j+" onClick=blur();setHarmonicaSub("+j+")>"+harmonicaNamesAll[j]+"</a>";
							j++;
						}
						if (j>i+1)newCell.innerHTML+="<br>";
						i=j-1;
					}
				}
				i++;
			}
			setBGHarm(harmonica);
			return true;
		}

		writeScales();
		insRow();

		writeHarNames(0);
