//var frets = new Array(10,52,116,175,232,283,334,378,421,462,502,538,573,607,639,668,697,724,748,772,794,816,835,854,871);
var frets = new Array(5,47,111,170,227,279,329,373,416,457,497,533,569,602,634,664,692,719,743,767,789,811,830,849,867);
var strings = new Array(70,58,46,34,23,11);

var notes = new Array("A","A#","B","C","C#","D","D#","E","F","F#","G","G#","A","A#","B","C","C#","D","D#","E","F","F#","G","G#","A","A#","B","C","C#","D","D#","E","F","F#","G","G#");

var tunings = new Array();
var scales = new Array();

var names = {
	"maj":"Major", "min":"Minor", "har":"Harmonic Minor","pmj":"Pentatonic Major", "pmn":"Pentatonic Minor", "bls":"Blues",
	"standard":"Standard","halfstep":"1/2 Step Down","dropD":"Drop D","ddropD":"Double Drop D","dropC":"Dropped C","dropB":"Dropped B","dropA":"Dropped A",
	"Atune":"A Tuning","Ebtune":"Eb Tuning","Dtune":"D Tuning","Dbtune":"Db Tuning","Ctune":"C Tuning","Bstandard":"B Standard Tuning","Bbtune":"Bb Tuning","Gtune":"G Tuning",
	"openA":"Open A Tuning","openC":"Open C Tuning","openD":"Open D Tuning","openDb":"Open Db Tuning","openE":"Open E Tuning","openF":"Open F Tuning","openG":"Open G Tuning",
	"dmodal":"D Modal Tuning"
};

// Define tunings
tunings["standard"] = new Array("E","A","D","G","B","E");
tunings["halfstep"] = new Array("D#","G#","C#","F#","A#","D#");
tunings["dropD"] = new Array("D","A","D","G","B","E");
tunings["ddropD"] = new Array("D","A","D","G","B","D");
tunings["dropC"] = new Array("C","G","C","F","A","D");
tunings["dropB"] = new Array("B","F#","B","E","G#","C#");
tunings["dropA"] = new Array("A","E","A","D","F#","B");

tunings["Atune"] = new Array("A","D","G","C","E","A");
tunings["Ebtune"] = new Array("D#","G#","C#","F#","A#","D#");
tunings["Dtune"] = new Array("D","G","C","F","A","D");
tunings["Dbtune"] = new Array("C#","F#","B","E","G#","C#");
tunings["Ctune"] = new Array("C","F","A#","D#","G","C");
tunings["Bstandard"] = new Array("B","E","A","D","F#","B");
tunings["Bbtune"] = new Array("D#","G#","C#","F#","A#","D#");
tunings["Gtune"] = new Array("D#","G#","C#","F#","A#","D#");

tunings["openA"] = new Array("E","A","E","A","C#","E");
tunings["openC"] = new Array("C","G","C","G","C","E");
tunings["openD"] = new Array("D","A","D","F#","A","D");
tunings["openDb"] = new Array("C#","G#","C#","F","G#","C#");
tunings["openE"] = new Array("E","B","E","G#","B","E");
tunings["openF"] = new Array("F","A","C","F","C","F");
tunings["openG"] = new Array("D","G","D","G","B","D");
tunings["dmodal"] = new Array("D","A","D","G","A","D");

// Define scale formula
scales["maj"] = new Array(2,2,1,2,2,2);
scales["min"] = new Array(2,1,2,2,1,2);
scales["har"] = new Array(2,1,2,2,1,3);
scales["pmj"] = new Array(2,2,3,2);
scales["pmn"] = new Array(3,2,2,3);
scales["bls"] = new Array(3,2,1,1,3);



var fretboard = null;
var noteImg = '/wp-content/plugins/scalefinder/note.png';
var rootImg = '/wp-content/plugins/scalefinder/root.png';


function initScalefinder() {
	fretboard = document.getElementById("fretboard");
	var form = document.getElementById("scale-canvas");
	generateNoteSelect(form);
	generateScaleSelect(form);
	generateTuningSelect(form);
}

function generateNoteSelect(form) {
	var sel = document.createElement("select");
	sel.name = "frm-sf-note";
	sel.id = "frm-sf-note";
	sel.addEventListener("click",function(){getScale()},false);
	for(var i=0; i<12; i++) {
		sel.options[i] = new Option(notes[i],notes[i]);
	}
	form.appendChild(sel);
}

function generateScaleSelect(form) {
	var sel = document.createElement("select");
	var count = 0;
	sel.name = "frm-sf-scale";
	sel.id = "frm-sf-scale";
	sel.addEventListener("click",function(){getScale()},false);
	for(i in scales) {
		sel.options[count] = new Option(names[i],i);
		count++
	}
	form.appendChild(sel);
}

function generateTuningSelect(form) {
	var sel = document.createElement("select");
	var count = 0;
	sel.name = "frm-sf-tuning";
	sel.id = "frm-sf-tuning";
	sel.addEventListener("click",function(){getScale()},false);
	for(i in tunings) {
		sel.options[count] = new Option(names[i],i);
		count++
	}
	form.appendChild(sel);				
}

function clearFretboard() {
	if(fretboard.hasChildNodes()) {
		while(fretboard.childNodes.length>= 1) {
			fretboard.removeChild(fretboard.firstChild);
		}
	}
}

function getScale() {
	var root = document.getElementById("frm-sf-note");
	var scale = document.getElementById("frm-sf-scale");
	var tuning = document.getElementById("frm-sf-tuning");
	clearFretboard();
	showScale(root[root.selectedIndex].value,scale[scale.selectedIndex].value,tuning[tuning.selectedIndex].value)
}

// Alerts the scale
function showScale(root,scale,tuning) {
	var total = scales[scale].length+1;
	var offset = notes.indexOf(root);
	var scalenotes = new Array();
	var tmp = '';
	var out = '';
				
	// Generate array of notes in the scale	
	for(i=0; i<total; i++) {
		if(scales[scale][i]!=0) {
			scalenotes.push(notes[offset]);
			offset += scales[scale][i];
		}
	}
	
	// Loop the strings and then loop through each fret
	for(string=6; string>0; string--) {
		var offset = notes.indexOf(tunings[tuning][string-1]);
		for(fret=0; fret<25; fret++) {
			var note = notes[fret+offset];
			//alert(note);
			// Check if the note is in the scale
			if(scalenotes.indexOf(note)!=-1) {
				//alert("yes "+note+" is in the scale");
				var img = new Image();
				/*if(note == scalenotes[0]) {
					img.src = rootImg;
				} else {
					img.src = noteImg;
				}*/
				img.src = noteImg;
				img.style.top = strings[string-1]+"px";
				img.style.left = frets[fret]+"px";
				fretboard.appendChild(img);
			}
		}
	}
}

