// Melody editor
// By Michael Schierl and Rainer Typke

var keyboardLayouts = {
    de: "01234qwertzuiopüasdfghjklöäQWERTZUIOPÜASDFGHJKLÖÄx56789",
    us: "01234qwertyuiop[asdfghjkl;]QWERTYUIOP{ASDFGHJKL:}x56789",
    fr: "à&é\"'azertyuiop^qsdfghjklmùAZERTYUIOP¨QSDFGHJKLM%x(-è_ç"
};

var notes = 
    [{digits: "00", flats: "00",  name: "r",     keyindex: [0]},
     {digits: "88", flats: "88",  name: "c",     keyindex: []},
     {digits: "89", flats: "89b", name: "cis",   keyindex: []},
     {digits: "90", flats: "90",  name: "d",     keyindex: []},
     {digits: "91", flats: "91b", name: "dis",   keyindex: []},
     {digits: "92", flats: "92",  name: "e",     keyindex: []},
     {digits: "93", flats: "93",  name: "f",     keyindex: []},
     {digits: "94", flats: "94b", name: "fis",   keyindex: []},
     {digits: "95", flats: "95",  name: "g",     keyindex: []},
     {digits: "96", flats: "96b", name: "gis",   keyindex: []},
     {digits: "97", flats: "97",  name: "a",     keyindex: []},
     {digits: "98", flats: "98b", name: "ais",   keyindex: []},
     {digits: "99", flats: "99",  name: "b",     keyindex: []},
     {digits: "01", flats: "01",  name: "c'",    keyindex: [16]},
     {digits: "02", flats: "02b", name: "cis'",  keyindex: [6]},
     {digits: "03", flats: "03",  name: "d'",    keyindex: [17]},
     {digits: "04", flats: "04b", name: "dis'",  keyindex: [7]},
     {digits: "05", flats: "05",  name: "e'",    keyindex: [18]},
     {digits: "06", flats: "06",  name: "f'",    keyindex: [19]},
     {digits: "07", flats: "07b", name: "fis'",  keyindex: [9]},
     {digits: "08", flats: "08",  name: "g'",    keyindex: [20]},
     {digits: "09", flats: "09b", name: "gis'",  keyindex: [10]},
     {digits: "10", flats: "10",  name: "a'",    keyindex: [21]},
     {digits: "11", flats: "11b", name: "ais'",  keyindex: [11]},
     {digits: "12", flats: "12",  name: "b'",    keyindex: [22]},
     {digits: "13", flats: "13",  name: "c''",   keyindex: [23,38]},
     {digits: "14", flats: "14b", name: "cis''", keyindex: [13, 28]},
     {digits: "15", flats: "15",  name: "d''",   keyindex: [24, 39]},
     {digits: "16", flats: "16b", name: "dis''", keyindex: [14, 29]},
     {digits: "17", flats: "17",  name: "e''",   keyindex: [25, 40]},
     {digits: "18", flats: "18",  name: "f''",   keyindex: [26, 41]},
     {digits: "19", flats: "19b", name: "fis''", keyindex: [31]},
     {digits: "20", flats: "20",  name: "g''",   keyindex: [42]},
     {digits: "21", flats: "21b", name: "gis''", keyindex: [32]},
     {digits: "22", flats: "22",  name: "a''",   keyindex: [43]},
     {digits: "23", flats: "23b", name: "ais''", keyindex: [33]},
     {digits: "24", flats: "24",  name: "b''",   keyindex: [44]},
     {digits: "25", flats: "25",  name: "c'''",   keyindex: []},
     {digits: "26", flats: "26b", name: "cis'''", keyindex: []},
     {digits: "27", flats: "27",  name: "d'''",   keyindex: []},
     {digits: "28", flats: "28b", name: "dis'''", keyindex: []},
     {digits: "29", flats: "29",  name: "e'''",   keyindex: []},
     {digits: "30", flats: "30",  name: "f'''",   keyindex: []},
     {digits: "31", flats: "31b", name: "fis'''", keyindex: []}
     ];

var lengths= ["8", "4", "4.", "2", "32", "16", "8.", "2.", "1"];
var delays = [250, 500, 750, 1000, 62, 125, 375, 1500, 2000];

var current = [], aftercursor=[];
var kbd = keyboardLayouts.us;
var url = document.location.href;
if (url.indexOf('de.') > -1)
  kbd = keyboardLayouts.de;
if (url.indexOf('fr.') > -1)
  kbd = keyboardLayouts.fr;
var flats = false;

function setlayout() {
    kbd = keyboardLayouts[document.getElementById("layout").value];
}

function handleNote(note, add) {
    var idx = kbd.indexOf(note);
    if (kbd == -1) return false;
    for(var i=0; i< notes.length; i++) {
        for(var j=0; j< notes[i].keyindex.length; j++) {
            if(notes[i].keyindex[j] == idx) {
                if (add) {
                    play2(i, 1);
                } else {
                    test2(i)
                }
                return true;
            }
        }
    }
    return false;
}

function test(n) {
  if (document.getElementById("hoversoundon").checked)
    test2(n+12);
}

function test2(n) {
    soundManager.play("t"+notes[n].digits);
}

function play(n, l) {
    play2(n==0 ? n : n+12, l);
}

function play2(n, l) {
    test2(n);
    current.push({n: n, l: l});
    updateView();
}

function deleteNote() {
    if (current.length > 0) current.pop();
    updateView();
}

function updateView() {
    var s="", spos=0;
    var c = '<img src="/med/clef.gif" onclick="setCursor(0);" />';
    for(var i=0;i<current.length;i++) {
        c+=noteImage(current[i], i+1);
        s+=noteText(current[i])+" ";
    }
    c+='<img src="/med/cursor.gif" />';
    for(var i=0;i<aftercursor.length;i++) {
        c+=noteImage(aftercursor[i], i+1+current.length);
        s+=noteText(aftercursor[i])+" ";
    }
    document.getElementById("current").innerHTML=c;
    document.getElementById("music").value=s;
}

function noteText(note) {
    if (note.l == 0) {
        return note.name;
    } else {
        return notes[note.n].name+lengths[note.l-1];
    }
}

function handleKey(keychar) {
    if (keychar == ' ') {
        if (current.length>0) {
            var nn =current[current.length-1];
            if (nn.l<4) {
                nn.l++;
            } else {
                play(0, 1);
            }
        }
    } else if (keychar == kbd[49]) {
        deleteNote();
    } else if (keychar == kbd[1]) {
        setLength(1);
    } else if (keychar == kbd[2]) {
        setLength(2);
    } else if (keychar == kbd[3]) {
        setLength(3);
    } else if (keychar == kbd[4]) {
        setLength(4);
    } else if (keychar == kbd[50]) {
        setLength(5);
    } else if (keychar == kbd[51]) {
        setLength(6);
    } else if (keychar == kbd[52]) {
        setLength(7);
    } else if (keychar == kbd[53]) {
        setLength(8);
    } else if (keychar == kbd[54]) {
        setLength(9);
    }
    updateView();
}

function setLength(len) {
    var permlen=[-1,9,8,4,3,2,7,1,6,5];
    if (current.length>0) current[current.length-1].l=permlen[len];
    updateView();
}

function noteImage(note, pos) {
    return '<img src="note/'+
        (flats ? notes[note.n].flats : notes[note.n].digits)+
        '_'+ note.l+'.gif" onclick="setCursor('+pos+');" />';
}

var playing = [];

function playAll() {
    if(playing.length==0) {
        for(var i=0; i<current.length;i++) {
            playing.push(current[i]);
        }
        for(var i=0; i<aftercursor.length; i++) {
            playing.push(aftercursor[i]);
        }
        playArray();
    } else {
        alert("Still playing!");
    }
}

function playArray() {
    if (playing.length==0) return;
    var n = playing.shift();
    if (n.l==0) {
        playArray();
    } else {
        test2(n.n);
        setTimeout(playArray, delays[n.l-1]);
    }
}

function parse() {
    var newnotes = [];
    var nn = document.getElementById("music").value.split(/ /g);
    for(var i = 0; i< nn.length;i++) {
        if(nn[i] == "") continue;
        var found=0;
        for(var nt=0; nt<notes.length; nt++) {
            var nname = notes[nt].name;
            if (nn[i].substring(0, nname.length) == nname) {
                for (var len = 1; len <=lengths.length; len++) {
                    if (nn[i] == nname + lengths[len-1]) {
                        newnotes.push({n: nt, l:len});
                        found=1;
                        break;
                    }
                }
            }
            if (found==1) break;
        }
        if (found == 0) {
            newnotes.push({n: 0, l: 0, name: nn[i]});
        }
    }
    aftercursor = [];
    current = newnotes;
    updateView();
}

function setCursor(newpos) {
    var toadd = newpos - current.length;
    for(var i=0; i<toadd; i++) {
        current.push(aftercursor.shift());
    }
    for(var i=0; i<-toadd; i++) {
        aftercursor.unshift(current.pop());
    }
    updateView();
}

function shiftNote(diff) {
    if(current.length > 0) {
        var nn = current[current.length-1];
        if (nn.n == 0) return;
        nn.n += diff;
        if (nn.n<1) nn.n=1;
        if (nn.n>43) nn.n=43;
        test2(nn.n);
        updateView();
    }
}

function setFlats() {
    flats = document.getElementById("flats").checked;
    updateView();
}

function cssReplaceClass(oldClass, newClass) {
    cssReplaceClass2(document, oldClass, newClass);
}

function cssReplaceClass2(node, oldClass, newClass) {
    if (node.className == oldClass) {
        node.className = newClass;
    }
    for(var i=0; i<node.childNodes.length; i++) {
	cssReplaceClass2(node.childNodes[i], oldClass, newClass);
    }
}

function mousemode() {
    cssReplaceClass("mouseplay", "mouseplayvisible");
    cssReplaceClass("keyboardplayvisible", "keyboardplay");
}

function keyboardmode() {
    cssReplaceClass("keyboardplay", "keyboardplayvisible");
    cssReplaceClass("mouseplayvisible", "mouseplay");
    document.getElementById("real").focus();    
}

// initialization code
function playmusic_init() {
var kb = '<select name="layout" id="layout" onchange="setlayout()">';
for(var k in keyboardLayouts) {
    kb+='<option'+ (kbd==keyboardLayouts[k] ? ' selected="selected"':'') +'>'+k+'</option>';
}
kb+='</select>';
document.getElementById("kbdlayout").innerHTML=kb;

document.getElementById("test").onkeypress = function(evt) {
    evt = (evt) ? evt : ((event) ? event : null);
    var c = String.fromCharCode((evt.charCode != null) ? evt.charCode : evt.keyCode);
    handleNote(c, false);
    return false;
};

document.getElementById("real").onkeypress = function(evt) {
    evt = (evt) ? evt : ((event) ? event : null);
    var c = String.fromCharCode((evt.charCode != null) ? evt.charCode : evt.keyCode);
    if (!handleNote(c, true)) handleKey(c);
    return false;
};

document.getElementById("real").onkeydown = function(evt) {
    evt = (evt) ? evt : ((event) ? event : null);
    switch(evt.keyCode) {
    case 33: shiftNote(12); break;
    case 38: shiftNote(1); break;
    case 40: shiftNote(-1); break;
    case 34: shiftNote(-12); break;
    case 8: deleteNote(); break;
    case 37: if (current.length > 0) aftercursor.unshift(current.pop()); updateView(); break;
    case 39: if (aftercursor.length > 0) current.push(aftercursor.shift()); updateView(); break;
    default: return true;
    }
    return false;
}

cssReplaceClass("withjavascript", "withjavascriptvisible");
cssReplaceClass("mouseplay", "mouseplayvisible");

updateView();
//soundManagerInit();
 enable_search();
}




//
// Copyright 2006 by Rainer Typke. All rights reserved.
//

function searchingpleasewait() {
  var url=document.location.href;
  if (url.indexOf('de.') > -1)
    return "Suche l&auml;uft... Bitte warten.";
  if (url.indexOf('zh.') > -1)
    return "&#27491;&#22312;&#25628;&#32034;...&#35831;&#31245;&#20505;";
  if (url.indexOf('fr.') > -1)
    return "Recherche&nbsp;en&nbsp;cours...&nbsp;Veuillez&nbsp;patienter";
  return "Searching... Please Wait";
}
function directoryurl() {
  var url=document.location.href;
  if (url.indexOf('de.') > -1)
    return "verzeichnis";
  if (url.indexOf('zh.') > -1)
    return 'baike';
  if (url.indexOf('fr.') > -1)
    return "encyclopedie";
  return "directory";
}
function contoururl() {
  var url=document.location.href;
  if (url.indexOf('de.') > -1)
    return "kontur";
  if (url.indexOf('zh.') > -1)
    return 'contour';
  return "contour";
}
function searchmusipedia() {
  var url=document.location.href;
  if (url.indexOf('de.') > -1)
    return "Suche in Musipedia";
  if (url.indexOf('zh.') > -1)
    return '&#25628;&#32034; Musipedia';
  if (url.indexOf('fr.')>-1)
    return "Rechercher sur Musipedia";
  return "Search Musipedia";
}
function searchtheweb() {
  var url=document.location.href;
  if (url.indexOf('de.') > -1)
    return "Suche im Internet";
  if (url.indexOf('zh.') > -1)
    return '&#25628;&#32034;&#32593;&#39029;';
  if (url.indexOf('fr.')>-1)
    return "Rechercher sur le Web";
  return "Search the Web";
}
function pleaseenter() {
  var url=document.location.href;
  if (url.indexOf('melody_editor') > -1)
    return "";
  if (url.indexOf('de.') > -1)
    return "Bitte geben Sie mindestens 5 Noten ein.";
  if (url.indexOf('zh.') > -1)
    return '&#35831;&#36755;&#20837;&#33267;&#23569;5&#20010;&#38899;&#31526;';
  if (url.indexOf('fr.') > -1)
    return "Veuillez entrer au moins 5 notes avant de lancer la recherche.";
  return 'Please enter at least 5 notes before searching.';
}
function getplay() {
  var url=document.location.href;
  if (url.indexOf('de.') > -1)
    return "Abspielen";
  if (url.indexOf('zh.') > -1)
    return '&#28436;&#22863;';
  if (url.indexOf('fr.') > -1)
    return "Ecouter";
  return 'Play';
}
function getplaying() {
  var url=document.location.href;
  if (url.indexOf('de.') > -1)
    return "Abspielen l&auml;uft...";
  if (url.indexOf('zh.') > -1)
    return '&#27491;&#22312;&#28436;&#22863;...';
  if (url.indexOf('fr.') > -1)
    return "Ecoute en cours";
  return 'Playing...';
}
function gettapping() {
  var url=document.location.href;
  if (url.indexOf('de.') > -1)
    return "Rhythmus-Aufnahme l&auml;uft. Bitte dr&uuml;cken Sie eine beliebige Taste im gew&uuml;nschten Rhythmus.<br/><b>Wenn Sie fertig sind, klicken Sie hier!</b>";
  if (url.indexOf('zh.') > -1)
    return '&#27491;&#22312;&#24405;&#21046;...&#35831;&#25353;&#24076;&#26395;&#30340;&#33410;&#22863;&#36731;&#25293;&#20219;&#24847;&#38190;&#12290;&#23436;&#25104;&#21518;&#28857;&#20987;"&#20572;&#27490;&#36731;&#25970;"&#12290;';
  if (url.indexOf('fr.') > -1)
    return "Enregistrement... Tapez le rythme souhait&eacute; avec n'importe quelle touche.<br/><b>Cliquez ici</b> pour terminer!";
  return 'Recording... Please tap any key in the desired rhythm.<br/><b>Click here</b> when you are done!';
}
function getthisisrh() {
  var url=document.location.href;
  if (url.indexOf('de.') > -1)
    return "Sie k&ouml;nnen jetzt:<ul><li>entweder gleich auf den Suchknopf unten rechts klicken</li><li>oder vorher noch Suchphrasen eingeben, falls gew&uuml;nscht</li></ul>";
  if (url.indexOf('zh.') > -1)
    return '<ul><li>&#29616;&#22312;&#20320;&#21487;&#20197;&#28857;&#20987;&#21491;&#19979;&#26041;&#30340;&#25628;&#32034;&#25353;&#38062;</li><li>&#25110;&#22312;&#25628;&#32034;&#21069;&#36755;&#20837;&#20851;&#38190;&#23383;&#12289;&#25628;&#32034;&#30701;&#35821;&#21644;/&#25110;&#25628;&#32034;&#31867;&#21035;&#12290;</li></ul>';
  if (url.indexOf('fr.') > -1)
    return "<ul><li>Vous pouvez d&egrave;s maintenant cliquer sur le bouton Rechercher en bas &agrave; droite</li><li>ou pr&eacute;ciser des mots-cl&eacute;s"+//, une expression, et/ou des cat&eacute;gories 
" avant de lancer la recherche.</li></ul>";
  return '<ul><li>You can now click on the search button at the bottom right</li><li>or enter keywords or search phrases before searching.</li></ul>';
}
function getstarttapping() {
  var url=document.location.href;
  if (url.indexOf('de.') > -1)
    return "Rhythmus aufnehmen";
  if (url.indexOf('zh.') > -1)
    return '&#24320;&#22987;&#36731;&#25970;';
  if (url.indexOf('fr.') > -1)
    return "Enregistrer le rythme";
  return 'Start Tapping';
}
function getstoptapping() {
  var url=document.location.href;
  if (url.indexOf('de.') > -1)
    return "Aufnahme beenden";
  if (url.indexOf('zh.') > -1)
    return '&#20572;&#27490;&#36731;&#25970;';
  if (url.indexOf('fr.') > -1)
    return "Arr&ecirc;ter l'enregistrement";
  return 'Stop Tapping';
}
function getfinishing() {
  var url=document.location.href;
  if (url.indexOf('de.') > -1)
    return "Aufnahme wird beendet. Bitte einen Moment Geduld...";
  if (url.indexOf('zh.') > -1)
    return '&#27491;&#22312;&#20572;&#27490;...&#35831;&#31245;&#20505;';
  if (url.indexOf('fr.') > -1)
    return "Arr&ecirc;t en cours. Veuillez patienter...";
  return 'Stopping. Please wait...';
}


var flashinstalled = 0;
var flashversion = 0;
MSDetect = "false";
if (navigator.plugins && navigator.plugins.length)
{
	x = navigator.plugins["Shockwave Flash"];
	if (x)
	{
		flashinstalled = 2;
		if (x.description)
		{
			y = x.description;
			flashversion = y.charAt(y.indexOf('.')-1);
		}
	}
	else
		flashinstalled = 1;
	if (navigator.plugins["Shockwave Flash 2.0"])
	{
		flashinstalled = 2;
		flashversion = 2;
	}
}
else if (navigator.mimeTypes && navigator.mimeTypes.length)
{
	x = navigator.mimeTypes['application/x-shockwave-flash'];
	if (x && x.enabledPlugin)
		flashinstalled = 2;
	else
		flashinstalled = 1;
}
else
	MSDetect = "true";


function gh(notes){
  A=notes.split(/\s+/);
  var res='';
  for (i=0; i<A.length; ++i) {
    if (A[i] != '')
      res = res+'<img src="/med/'+A[i]+'.gif">';
  } // for
  return '<img src="/med/clef.gif">'+res;
}

function cntn() {
   var lily = document.getElementById("music");
   A = lily.value.split(/\s+/);
   var cnt = 0;
   for(i=0; i<A.length; i++) {
     if (A[i].match(/^\s*(.)(is|es|s)?(\'*)(\d*)(\.?)\s*$/))
	 //.substring(0,1) != 'r' && A[i].substring(0,1) != ' ')
	 cnt++;
   }
   return cnt;
}

function sch(coll) {
  var lily=document.getElementById("music");
  var butt=document.getElementById("search");
  var wbutt=document.getElementById("wsearch");
  /* var catC=document.getElementById("CatClass").checked?"C":"";
  var catP=document.getElementById("CatPop").checked?"P":"";
  var catF=document.getElementById("CatFolk").checked?"F":"";
  var catH=document.getElementById("CatHymn").checked?"H":"";
  var catA=document.getElementById("CatNA").checked?"A":"";*/
  var filt=document.getElementById("filtertext");
  var omf=document.getElementById("onlymatchfr").value;

  var cnt = cntn();
  if (cnt > 0 && cnt < 5) {
    var notes = document.getElementById("current");
    notes.innerHTML += '&nbsp;<b><font color="red">'+pleaseenter()+'</font></b>';
    return;
  }
  
  butt.innerHTML = searchingpleasewait();
  wbutt.innerHTML = '';
  //  alert(directoryurl());
  //alert("/"+directoryurl()+"/lily"+lily.value.replace(/\s+/g,"+")+"&categories="+catC+catP+catF+catH+catA+"&filtertext="+filt.value.replace(/\s+/g,"+")+"&coll="+coll);
  document.location.href = "/"+directoryurl()+"/lily"+lily.value.replace(/\s+/g,"+")+//"&categories="+catC+catP+catF+catH+catA+
"&filtertext="+filt.value.replace(/\s+/g,"+")+"&coll="+coll+"&onlymatchfrom="+omf;
}




function dragsch(coll) {
  var butt=document.getElementById("search");
  var wbutt=document.getElementById("wsearch");
  var filt=document.getElementById("filtertext");
  var omf=document.getElementById("onlymatchfr").value;

  var cnt = onsets.length;
  if (cnt > 0 && cnt < 5) {
    var notes = document.getElementById("current");
    notes.innerHTML += '&nbsp;<b><font color="red">'+pleaseenter()+'</font></b>';
    return;
  }
  
  butt.innerHTML = searchingpleasewait();
  wbutt.innerHTML = '';

  var hum = "";
  var from = 1;
  for (n = 0; n<onsets.length; n++) {
    var i=0;
    var next = 600;
    for (j=0; j<onsets.length; j++)
      if (onsets[j] > from && onsets[j] < next) {
	next = onsets[j];
	i = j;
      }
    hum += "/"+onsets[i]+"-"+pitches[i]+"-7";
    from = next+1;
  }

  document.location.href= "/"+directoryurl()+"/hum "+hum.substring(1)+"&coll="+coll+"&filtertext="+filt.value.replace(/\s+/g,"+")+"&onlymatchfrom="+omf;
  //http://www.musipedia.org/search.0.html?sourceid=melody-url&tx_mpsearch_pi1%5bsubmit_button%5d=Search&tx_mpsearch_pi1%5bpc%5d=hum+0-79-0.374%2F0.938-74-0.187%2F1.25-79-0.374%2F2.19-74-0.187%2F2.5-79-0.187%2F2.81-74-0.187%2F3.12-79-0.187%2F3.44-83-0.187%2F3.75-86-0.374%2F5-84-0.374%2F5.94-81-0.187%2F6.25-84-0.374%2F7.19-81-0.187%2F7.5-84-0.187%2F7.81-81-0.187%2F8.12-78-0.187%2F8.44-81-0.187%2F8.75-74-0.374&coll=w&categories=&L=

  //  document.location.href = "/"+directoryurl()+"/lily"+lily.value.replace(/\s+/g,"+")+//"&categories="+catC+catP+catF+catH+catA+
  //"&filtertext="+filt.value.replace(/\s+/g,"+")+"&coll="+coll+"&onlymatchfrom="+omf;
}






function gr(oldarr){
  return '<a href="#" onClick="rs('+"'"+oldarr.replace(/'/g, "y")+"'"+')"><img src="/med/dl.gif" border="0"></a>';
}
function grw(oldarr){
  return '<a href="#" onClick="rsw('+"'"+oldarr.replace(/'/g, "y")+"'"+')"><img src="/med/dl.gif" border="0"></a>';
}
function rs(rest_notes) {
   var notes = document.getElementById("current");
   var lily = document.getElementById("music");
   var srch = document.getElementById("search");
   var wsrch = document.getElementById("wsearch");
   //var play = document.getElementById("play");
   A = rest_notes.split(/\s+/);
   oneless = "";
   lily.value = "";
   for(i=0; i<A.length-1; ++i) {
     oneless = oneless + ' ' + A[i];
     lily.value = lily.value + " " + A[i].replace(/y/g,"'");
   }
   lily.value = lily.value + " " + A[A.length-1].replace(/y/g,"'");
   if (A.length>0) {
     srch.innerHTML = '<input type="submit" onclick="sch(\'m\')" value="'+searchmusipedia()+'">';
     wsrch.innerHTML = '<input type="submit" onclick="sch(\'w\')" value="'+searchtheweb()+'">';
   }
   else
     srch.innerHTML = pleaseenter();
   notes.innerHTML = gh(rest_notes.replace(/y/g,"'"));
   if (rest_notes != "")
     notes.innerHTML += gr(oneless);
   //   document.getElementById("arr").value = rest_notes;
   //play.innerHTML =    '<input type="submit" onclick="'+ playonclick() + '" value="'+getplay()+'">';
}
function rsw(rest_notes) {
   var notes = document.getElementById("current");
   var lily = document.getElementById("music");
   var srch = document.getElementById("search");
   var wsrch = document.getElementById("wsearch");
   var play = document.getElementById("play");
   A = rest_notes.split(/\s+/);
   oneless = "";
   lily.value = "";
   for(i=0; i<A.length-1; ++i) {
     oneless = oneless + ' ' + A[i];
     lily.value = lily.value + " " + A[i].replace(/y/g,"'");
   }
   lily.value = lily.value + " " + A[A.length-1].replace(/y/g,"'");
   notes.innerHTML = gh(rest_notes.replace(/y/g,"'"));
   if (rest_notes != "")
     notes.innerHTML += grw(oneless);
   //   document.getElementById("arr").value = rest_notes;
   play.innerHTML =   '<input type="submit" onclick="'+ playonclick() + '" value="'+getplay()+'">';
}
function CA() {
   var notes = document.getElementById("current");
   var lily = document.getElementById("music");
   var srch = document.getElementById("search");
   lily.value = "";
   srch.innerHTML = pleaseenter();
   document.getElementById("wsearch").innerHTML = "";
   notes.innerHTML = gh("");
   document.getElementById("play").innerHTML = "";
}
function CA_t() {
   var times = document.getElementById("times");
   var srch = document.getElementById("search");
   times.value='';
   document.getElementById("wsearch").innerHTML = "";
   document.getElementById("current").innerHTML = "";
   document.getElementById("filtertext").value = "";
   srch.innerHTML = "";
}

function enable_search() {
   var srch = document.getElementById("search");
   var wsrch = document.getElementById("wsearch");
   srch.innerHTML = '<input type="submit" onClick="sch(\'m\')" value="'+searchmusipedia()+'">';
   wsrch.innerHTML = '<input type="submit" onClick="sch(\'w\')" value="'+searchtheweb()+'">';
}

function enable_dragsearch() {
   var srch = document.getElementById("search");
   var wsrch = document.getElementById("wsearch");
   srch.innerHTML = '<input type="submit" onClick="dragsch(\'m\')" value="'+searchmusipedia()+'">';
   wsrch.innerHTML = '<input type="submit" onClick="dragsch(\'w\')" value="'+searchtheweb()+'">';
}

function AN(newnote) {
   var notes = document.getElementById("current");
   var lily = document.getElementById("music");
   //   var arr = document.getElementById("arr");
   var srch = document.getElementById("search");
   var wsrch = document.getElementById("wsearch");
   var play = document.getElementById("play");
   var nhtml = notes.innerHTML;
   var oldlily = lily.value;
   lily.value = lily.value+' '+newnote.replace(/y/g,"'");
   notes.innerHTML = gh(lily.value)+gr(oldlily);
   srch.innerHTML = '<input type="submit" onClick="sch(\'m\')" value="'+searchmusipedia()+'">';
   wsrch.innerHTML = '<input type="submit" onClick="sch(\'w\')" value="'+searchtheweb()+'">';
   play.innerHTML = '<input type="submit" onClick="' + playonclick() + '" value="'+getplay()+'">';
}
function ANw(newnote) {
   var notes = document.getElementById("current");
   var lily = document.getElementById("music");
   //   var arr = document.getElementById("arr");
   var srch = document.getElementById("search");
   var wsrch = document.getElementById("wsearch");
   var play = document.getElementById("play");
   var nhtml = notes.innerHTML;
   var oldlily = lily.value;
   lily.value = lily.value+' '+newnote.replace(/y/g,"'");
   notes.innerHTML = gh(lily.value)+grw(oldlily);


   play.innerHTML =  '<input type="submit" onclick="'+ playonclick() + '" value="'+getplay()+'">';//'<a class="butt" href="' + playurl() + '">'+getplay()+'</a>';
}

function pla() {
  pl(document.getElementById('music').value);
}

function pl(str) { 
  var play = document.getElementById("play");
  if (str.length < 2) {
    play.innerHTML =  '<input type="submit" onclick="' + playonclick() + '" value="'+getplay()+'">';
    return;
  }
  play.innerHTML =  '<input type="submit" onclick="document.location.href='+"'http://www.musipedia.org/fileadmin/scripts/play.cgi?lily=" + document.getElementById("music").value.replace(/ /g,"+").replace(/\'/g,'\\'+"'")+ "'" + '" value="'+getplaying()+'">';
  var notes=str.split(/\s+/);
  var note = notes.shift();
  var tn = note.match(/^(.)(is|es|s)?(\'*)(\d*)(\.?)$/);
  if (tn != null) {
    var dotted = tn[5] != "";
    var pitch = tn[1];
    if (tn[2] == "is" || tn[2] == "es" || tn[2] == "s")
      pitch += tn[2];
    var oct = tn[3];
    var dur = tn[4];
    soundManager.play(pitch+(oct.length)+'_8');
    var whole=dotted?3000:2000;
    window.setTimeout('pl("'+notes.join(" ")+'")', Math.round(whole/dur));
    //alert('pl("'+notes.join(" ")+'")'+ Math.round(whole/dur)); pl(notes.join(" "));
  } else
    pl(notes.join(" "));
}

function playonclick() {
  if (flashversion < 2) {
    var iesucks = document.getElementById("music").value.replace(/ /g,"+").replace(/\'/g, '\\'+"'");
    iesucks = "document.location.href='http://www.musipedia.org/fileadmin/scripts/play.cgi?lily="+iesucks+"';";
    return iesucks;// "document.location.href='http://www.musipedia.org/fileadmin/scripts/play.cgi?lily="+iesucks+"'";
  }
  return (flashversion < 2? 
	  "document.location.href='http://www.musipedia.org/fileadmin/scripts/play.cgi?lily=" + document.getElementById("music").value.replace(/ /g,"+").replace(/\'/g, '\\'+"'") + "'" :
	  'pla()');
}

function ls() {
  var srch = document.getElementById("search");
  var wsrch = document.getElementById("wsearch");
  var play = document.getElementById("play");
  wsrch.innerHTML = '<input type="submit" onClick="sch(\'w\')" value="'+searchtheweb()+'">';
  srch.innerHTML = '<input type="submit" onClick="sch(\'m\')" value="'+searchmusipedia()+'">';
  play.innerHTML =  '<input type="submit" onClick="' + playonclick() + '" value="'+getplay()+'">';
// '<a class="butt" href="' + playurl() + '">'+getplay()+'</a>';
}

function ts() { 
  var lily = document.getElementById("music");
  if (lily.value == "") {
    document.getElementById("search").innerHTML = '<input type="submit" onClick="sch(\'m\')" value="'+searchmusipedia()+'">';
     document.getElementById("wsearch").innerHTML = '<input type="submit" onClick="sch(\'w\')" value="'+searchtheweb()+'">';
  }
}

function ts2() { 
  document.getElementById("search").innerHTML = '<input type="submit" onClick="dragsch(\'m\')" value="'+searchmusipedia()+'">';
  document.getElementById("wsearch").innerHTML = '<input type="submit" onClick="dragsch(\'w\')" value="'+searchtheweb()+'">';
}

function query() {
  var query=this.location.search.substring(1);
  if (query.length > 0) {
    var params=query.split("&");
    for (var i=0 ; i<params.length ; i++){
      var pos = params[i].indexOf("=");
      var name = params[i].substring(0, pos);
      var value = params[i].substring(pos + 1);
      if (name == "lily")
	rs(((value.replace(/%25/g,"%")).replace(/\+/g," ")).replace(/%27/g,"'").replace(/%20/g," "));
      if (name == "filtertext")
        document.getElementById("filtertext").value=value.replace(/%20/," ");
      /*      if (name == "categories" && value != "") {
        document.getElementById("CatClass").checked = value.indexOf("C")>-1;
        document.getElementById("CatPop").checked = value.indexOf("P")>-1;
        document.getElementById("CatFolk").checked = value.indexOf("F")>-1;
        document.getElementById("CatHymn").checked = value.indexOf("H")>-1;
        document.getElementById("CatNA").checked = value.indexOf("A")>-1;
	}*/
    }
  }
}

var dts;

function tap(e) {
  var d = new Date();
  document.getElementById("times").value += "/"+d.valueOf();
  dts += ".";
  document.getElementById("dots").innerHTML = dts;
  return true;
}

function notap(e) {
  if(window.event)
      keynum = e.keyCode;
  else if(e.which) // Netscape/Firefox/Opera
      keynum = e.which;
  
  return keynum;
}

var orig_hand;

function statap() {
  var d = new Date();
  dts = "<br/>"; document.getElementById("dots").innerHTML = dts;
  document.getElementById("times").value = d.valueOf();
  orig_hand = document.onkeydown;
  document.onkeydown = tap;
  document.getElementById("tbutt").innerHTML='<input type="submit" onclick="stotap()" value="'+getstoptapping()+'">';
  document.getElementById("current").innerHTML='<a href="#" onclick="stotap()"><font color="green">'+gettapping()+'</font></a>';
}

function stotap() {
  document.getElementById("current").innerHTML=getfinishing();
  window.setTimeout("fintap()", 100);
}

function showrh() {
 var notes = document.getElementById("current");
  var tim = document.getElementById("times");
  var times = tim.value.split("/");
  var dur = times[times.length-1]-times[0];
  if (dur == 0) dur = 1;
  var totwidth = 400+((times[1]-times[0])/dur);
  notes.innerHTML = '<img src="/med/rclef.png" width="22" height="20"><img src="/med/tap.png" height="20" width="10">';
  for (i=2; i<times.length; i++)
    notes.innerHTML += '<img src="/med/rli.png" height="20" width="'+(totwidth*(times[i]-times[i-1])/dur)+'"><img src="/med/tap.png" height="20" width="10">';
  var qs = '';
  for (i=1; i<times.length; i++)
    qs += "/"+((diff=times[i]-times[0])/1000)+"-0-1";
  tim.value = qs.substr(1);
}

function fintap() {
  document.onkeydown = orig_hand;
  showrh();
  var times = document.getElementById("times").value.split("/");
  var srch=document.getElementById("search");
  if (times.length>=5) {
    srch.innerHTML = '<input type="submit" onClick="scht(\'m\')" value="'+searchmusipedia()+'">'; 
    document.getElementById("dots").innerHTML = '<font color="green">'+getthisisrh()+'</font>';
     //     wsrch.innerHTML = '<a class="butt" href="#" onClick="scht(\'w\')">'+searchtheweb()+'</a>';
   }
  else {
    srch.innerHTML = '';
    document.getElementById("dots").innerHTML = '<font color="red">'+pleaseenter()+'</font>';
  }
  document.getElementById("tbutt").innerHTML='<input type="submit" onclick="statap()" value="'+getstarttapping()+'">';
}

function scht() {
  var butt=document.getElementById("search");
  //  var wbutt=document.getElementById("wsearch");
  /*var catC=document.getElementById("CatClass").checked?"C":"";
  var catP=document.getElementById("CatPop").checked?"P":"";
  var catF=document.getElementById("CatFolk").checked?"F":"";
  var catH=document.getElementById("CatHymn").checked?"H":"";
  var catA=document.getElementById("CatNA").checked?"A":"";*/
  var filt=document.getElementById("filtertext");
  var omf=document.getElementById("onlymatchfr").value;
  
  butt.innerHTML = searchingpleasewait();
  //wbutt.innerHTML = '';
  document.location.href = "/"+directoryurl()+"/hum "+document.getElementById("times").value+
    //"&categories="+catC+catP+catF+catH+catA+
"&filtertext="+filt.value.replace(/\s+/g,"+")+"&coll=r&onlymatchfrom="+omf;
}




// This script determines correct code required to embed MEDIA files
// for a large number of browsers, including AOL and WebTV
// Windows Media Player is required and always used, except for WebTV
// Written by Les Gorven, http://midistudio.com/
// Ver. 3.0  Last Updated: January 17, 2006


function playMedia(mediaURL,height,width,from,to) {

  var mediaURL,height,width;

if (GetBrowser() == "Netscape")
	embedMPlayer(mediaURL,height,width);
if (GetBrowser() == "IE")
	embedIEobject(mediaURL,height,width);
if (navigator.appName.substring(0,5) == "WebTV")
  embedSource(mediaURL,height,width);
}

function embedSource(mediaURL,height,width,from,to) {

  var CodeGen = "";
  var mediaURL,height,width;
 		 	
	 CodeGen = '<embed src="' + mediaURL + '"' + '\n' ;
	 CodeGen += ' height=' + height + ' width=' + width + 'autostart="false" starttime="' + from+ '" ENDTIME="'+to+'" \n';
	 CodeGen += ' LOOP="false"' + //rpt +
 '>';
	
    document.write(CodeGen);

}


function embedMPlayer(mediaURL,height,width)	{


		CodeGen = "";
    	var mediaURL,height,width;
				 	
		CodeGen = '<embed type="application/x-mplayer2" ' + '\n' ;
		// http://www.microsoft.com/Windows/MediaPlayer/
    	CodeGen = CodeGen + 'pluginspage="http://www.apple.com/quicktime/download/" ' + '\n' ;
	 	CodeGen = CodeGen + 'Name="MediaPlayer" ' + 'src="' + mediaURL + '" '
+ '\n' ;
	 	CodeGen = CodeGen + 'autoStart=0 ' ;
		if ((height == 24) && (width == 299))
			CodeGen = CodeGen + 'ShowStatusBar=1 ';
		if ((height >= 50) && (width >= 200))
			CodeGen = CodeGen + 'ShowStatusBar=1 ';
		if ((height <= 49) && (width != 299))
			CodeGen = CodeGen + 'ShowStatusBar=0 ';
		
		CodeGen = CodeGen + 'playCount=1' + ' ' ;
		CodeGen = CodeGen + 'volume=-1 ' ;
		CodeGen = CodeGen + 'HEIGHT=20'  + ' WIDTH=' + width + '>'
				
		
		document.write(CodeGen)
	
}

function embedIEobject(mediaURL,height,width){


		CodeGen = ""
    	var mediaURL,height,width

		CodeGen = '<object id=Player' + '\n' ;
		CodeGen +=
'codeBase=http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=6,0,02,902'
+ '\n' ;
		CodeGen += 'type=application/x-oleobject height=' + height + ' width='
+ width + '\n' ;
		CodeGen += ' standby="Loading Microsoft® Windows® Media Player components..." ' + '\n' ;
		CodeGen += 'classid="CLSID:22D6F312-B0F6-11D0-94AB-0080C74C7E95"> ' +
'\n' ;
		CodeGen += '<param NAME="Filename" VALUE="' + mediaURL + '">' + '\n' ;
		if ((height == 24) && (width == 299))
			CodeGen += '<param NAME="ShowStatusBar" VALUE= "true">';
		if ((height >= 50) && (width >= 200))
			CodeGen += '<param NAME="ShowStatusBar" VALUE= "true">';
		if ((height <= 49) && (width != 299))
			CodeGen += '<param NAME="ShowStatusBar" VALUE= "false"> ';
		
		CodeGen += '<param NAME="autoStart" VALUE="false"><param NAME="Volume" VALUE="-1">' + '\n' ;
		CodeGen += '<param NAME="playCount" VALUE=1' + '></object>'
		
		  document.write(CodeGen);

}

function GetBrowser()
{
   var agt=navigator.userAgent.toLowerCase();
   if( ((agt.indexOf("msie") != -1) && (agt.indexOf("opera") == -1)) )
       return "IE";
   else if( ((agt.indexOf('mozilla')!=-1) && (agt.indexOf('spoofer')==-1)
         && (agt.indexOf('compatible') == -1) && (agt.indexOf('opera')==-1)
         && (agt.indexOf('webtv')==-1) && (agt.indexOf('hotjava')==-1)) )
       return "Netscape";
   else
       return "unknown";
}


