/*******************************************************************************
 * Javascript utility functions to be used by multiple scripts.
 *******************************************************************************/

// ES: Needs organizing!

// Array of strings for converting notes from strings to numbers.
var noteArray = new Array("A", "A#", "B", "C", "C#", "D", "D#", "E", "F", "F#", "G", "G#");
// Array of strings for converting notes from strings to numbers, using flats.
var flatNoteArray = new Array("A", "Bb", "B", "C", "Db", "D", "Eb", "E", "F", "Gb", "G", "Ab");

// Convert a note name (A-G) with a sharp or flat sign into a note number (0-11).
function NoteNameToNum(noteName, sharpFlat)
{
  if (sharpFlat != null && noteName.length == 1) {
    noteName += sharpFlat;
  }

  var num = ArrayIndexOf(noteArray, noteName.toUpperCase());
  return num;
}

function NoteNumToName(noteNum, accidentalIn, includeOctave)
{
  if (!accidentalIn) accidentalIn = accidental;
  if (accidentalIn == '#') {
    ret =  noteArray[noteNum % 12];
  } else {
    ret = flatNoteArray[noteNum % 12];
  }
  if (includeOctave) {
    ret += Math.floor(noteNum / 12);
  }
  return ret;
}

// Find toFind in ar.
function ArrayIndexOf(ar, toFind)
{
  len = ar.length;
  for (i = 0; i < len; i++) {
    if (ar[i] == toFind) return i;
  }
  return -1;
}


var m2 = 1;
var maj2 = 2;
var m3 = 3;
var maj3 = 4;
var p4 = 5;
var aug4 = 6;
var p5 = 7;
var m6 = 8;
var maj6 = 9;
var m7 = 10;
var maj7 = 11;
var octave = 12;
var dim7 = maj6;
var dim5 = aug4;
var aug5 = m6;

var IntervalNames = ['b2',
		     '2',
		     'b3',
		     '3',
		     '4',
		     'b5',
		     '5',
		     '#5',
		     '6',
		     'b7',
		     '7'];


function IntervalToName(interval) {
  ret = IntervalNames[interval-1];
  return ret;
}


var LongIntervalNames = ['minor second',
			 'major second',
			 'minor third',
			 'major third',
			 'perfect fourth',
			 'diminished fifth',
			 'perfect fifth',
			 'minor sixth',
			 'major sixth',
			 'diminished seventh',
			 'major seventh',
			 'octave'];

function IntervalToLongName(interval)
{
  return LongIntervalNames[(interval - 1) % 12];
}

function ArrayRemove(array, el)
{
  var gotIt = false;

  while((index = ArrayIndexOf(array, el)) != -1) {
    gotIt = true;
    array.splice(index, 1);
  }
  return gotIt;
}

function RandomChoice(choices)
{
  var i = Math.floor(choices.length * Math.random());
  return choices[i];
}

function RandomInt(lower, upper)
{
  return Math.floor(Math.random() * (upper - lower)) + lower;
}


var chordTypes = [
		  ['', [maj3, p5], 'major'],
		  ['m', [m3, p5], 'minor'],
		  ['dim', [m3, dim5], 'diminished'],
		  ['aug', [maj3, aug5], 'augmented'],
		  ['7th', [maj3, p5, m7], 'seventh'],
		  ['m7th', [m3, p5, m7], 'minor seventh'],
		  ['maj7th', [maj3, p5, maj7], 'major seventh']
		  ]
