/* COPYRIGHT 2009 BY CHORDC, LLC */
var ChordFinder = {
	interface: {
		matchedDiagram 		: [], 	 // Array
		matchedChord 		: '',	 // String
		matchedSid 			: '',	 // String
		matchedD 			: '',	 // String
		diagram 			: '',	 // String
		currentFretNumber 	: 1,	 // Integer
		previousFretNumber 	: 1,  	 // Integer
		Messages            : {}    // Object, see finder-js-vars.php
	},
	findMatch:function(){
		for(var d in chordDia){
			for(var dia in chordDia[d]){
				if(ChordFinder.interface.diagram.match(chordDia[d][dia])){
					ChordFinder.interface.matchedDiagram.push(chordDia[d][dia]);
					ChordFinder.interface.matchedChord = dia.substring(0,1);
					ChordFinder.interface.matchedSid   = dia.substring(1);
					ChordFinder.interface.matchedD     = d;
				}
			}
		}
		if (ChordFinder.interface.matchedDiagram.length < 1) {
			$("#titleMsg").html('<span class="msg alert">'+ChordFinder.interface.Messages.msg1+' <em>'+ChordFinder.interface.Messages.msg2+'</em></span>'); // move text
			$("#chordPhoto").html('<span>'+ChordFinder.interface.Messages.msg3+'</span>'); // move text
			$("#chordFound").html(ChordFinder.interface.Messages.msg4); // move text
			$(".msgChordFinder").fadeOut();
			$("#listDiagrams").html('');
			$('#majors a').removeClass('sel');
			$('.types a').removeClass('sel');
		} else {
			var matches = { dia:[], img:[] } // Dictionary
			for(var i in chordJSON){
				if (ChordFinder.interface.matchedChord === chordJSON[i]['major'] && 
					ChordFinder.interface.matchedSid === chordJSON[i]['sId']) {
					matches.symbol 	 = chordJSON[i]['symbol'];
					matches.sId	 	 = chordJSON[i]['sId'];
					matches.major 	 = chordJSON[i]['major'];
					matches.fullName = chordJSON[i]['fullName'];
					matches.slugify  = chordJSON[i]['slugify'];
					matches.aka1 	 = chordJSON[i]['aka1'];
					matches.aka2	 = chordJSON[i]['aka2'];
					for (var t=1;t<6;t++) {
						matches.dia[t] = chordJSON[i]['d'+t]['d'+t];
						matches.img[t] = matches.major.toLowerCase()+"/"+chordJSON[i]['d'+t]['img'];
						if (ChordFinder.interface.matchedD === 'd'+t) {
							matches.image  = matches.major.toLowerCase()+"/"+chordJSON[i]['d'+t]['img'];
							matches.dia[0] = chordJSON[i]['d'+t]['d'+t];
						}
					}
				}
			}
			if (matches.aka1) {
				var aka1 = matches.major+matches.aka1;
			}
			if (matches.aka2) {
				var aka2 = ", " + matches.major+matches.aka2;
			} else {
				var aka2 = "";
			}
			if (matches.aka1 || matches.aka2) {
				var aka = "<em>("+aka1+aka2+")</em>";
			} else {
				var aka = "";
			}
			var chordFoundHTML      = '<a href="/guitar-chord/'+matches.major+'/'+matches.slugify+'/" title="'+ChordFinder.interface.Messages.msg5+'"><strong>'+matches.major+matches.symbol+' '+aka+'</strong></a>';
			var chordFoundPhotoHTML = '<img src="/img/share/chords/pics/'+matches.image+'" />';
			
			$("#titleMsg").html('<span class="msg alert">'+ChordFinder.interface.Messages.msg6+' &darr;</span>'); // move text
			$("#chordFound").html(ChordFinder.interface.Messages.msg7+" "+chordFoundHTML); // move text
			$("#chordPhoto").html(chordFoundPhotoHTML);
			$(".msgChordFinder").fadeIn();
			
			var selected = $('#chord'+matches.major+'_'+matches.sId);
			$('#majors a').removeClass('sel');
			$('#majors a:contains("'+matches.major+'")').addClass('sel');
			$('.types a').removeClass('sel');
			selected.addClass('sel');
			$('.types').css("display","none");
			$('#type'+matches.major).css("display","block");
			
			// set position of selected chord type
			$('#type'+matches.major).setScrollTop();
			ChordFinder.createDiagrams(matches.dia,matches.img);
		}
	},
	createDiagrams:function(dia,img){
		$.ajax({
			type:"POST",
			url:"/ajax-create-diagrams/", 
			cache: false,
			data: {
				dNum0: dia[0],
				dNum1: dia[1],
				dNum2: dia[2],
				dNum3: dia[3],
				dNum4: dia[4],
				dNum5: dia[5],
				dImg1: img[1],
				dImg2: img[2],
				dImg3: img[3],
				dImg4: img[4],
				dImg5: img[5]
			}, 
			error: function(){
				alert("Something went haywire. Please try again.");
			},
			success:function(data){
				$("#listDiagrams").html(data);
				$("#listDiagrams a.matchedImg").showMatchedImage();
				$("#listDiagrams a.matchedButton").showMatchedDiagram();
			}
		});
	},
	getDiagramBySymbol:function(major,symbol) {
		var diagram        = " ";
		var matchedDiagram = "";
		for(var i in chordJSON){
			if (major === chordJSON[i]['major'] && symbol === chordJSON[i]['symbol']) {
				matchedDiagram  = chordJSON[i]['d1']['d1'];
			}
		}
		// convert to fingerless diagram
		var matchedSplit = matchedDiagram.split(' ');
		var finger, string;
		for(var d in matchedSplit){
			finger = matchedSplit[d].substr(matchedSplit[d].length-1);
			string = matchedSplit[d].substr(0,matchedSplit[d].length-1);
			if(d < 1){
				ChordFinder.interface.currentFretNumber = matchedSplit[d];
			} else {
				if(finger == "o"){
					diagram += string+"o ";
				} else if(finger == "x"){
					diagram += string+"x ";
				} else {
					diagram += string+"0 ";
				}
			}
		}
		document.getElementById('fretChange').value = ChordFinder.interface.currentFretNumber;
		ChordFinder.interface.diagram = diagram;
		ChordFinder.setDiagramToFretboard( diagram );
		ChordFinder.findMatch();
	},
	setDiagramToFretboard:function( diagram ){
		var diagramSplit = diagram.split(" ");
		var finger, string, stringElm;
		
		ChordFinder.updateDiagram();
		
		ChordFinder.interface.diagram = diagram;
		
		var stringButtons = $('#chordFinder > div > b');
		stringButtons.removeClass('fx');
		stringButtons.removeClass('fo');
		stringButtons.removeClass('f0');
		stringButtons.removeClass('no');
		stringButtons.addClass('no');
		
		for(var i in diagramSplit){
			finger    = diagramSplit[i].substr(diagramSplit[i].length-1);
			string    = diagramSplit[i].substr(0,diagramSplit[i].length-1);
			stringElm = $('#chordFinder b.s'+string);
			
			if (finger == "o") {
				stringElm.removeClass('fx').removeClass('no').addClass('fo');
			} else if (finger == "x") {
				stringElm.removeClass('fo').removeClass('no').addClass('fx');
			} else if (finger == "0") {
				stringElm.removeClass('no').addClass('f0');
			}
		}
		
		ChordFinder.findMatch();
		ChordFinder.Notes.setNotes();
	},
	stringSelect:function(obj) {
		var stringElm             = $(obj),
			string                = stringElm.text(),
			stringRow 			  = parseInt(string) % 6,
			isLessThanStringSeven = parseInt(string) < 7,
			isLessThanFretSix 	  = ChordFinder.interface.currentFretNumber < 6,
			isSelected			  = stringElm.hasClass('f0'),
			isOpen                = (stringElm.hasClass('fo')) ? true : false,
			isMuted               = (stringElm.hasClass('fx')) ? true : false;              
			
		stringRow = (stringRow==0) ? 6 : stringRow;
		
		ChordFinder.unselectStrings(obj);
				
		if (isLessThanStringSeven) {
			if (isOpen) {
				stringElm.removeClass('no').removeClass('fo').addClass('fx');
			} else {
				stringElm.removeClass('no').removeClass('fx').addClass('fo');
			}
		} else {
			if (isSelected) {
				stringElm.removeClass('no').removeClass('f0').addClass('no');
				// morph stringElm to selected stringElm
				stringElm = $("b.s"+stringRow);
				string    = stringElm.text();
				stringElm.removeClass('no').addClass('fo');
			} else {
				stringElm.removeClass('no').removeClass('f0').addClass('f0');
			}
		}
		
		ChordFinder.checkIfSixStringsSelected();
		ChordFinder.Notes.setNote(stringElm, string, stringRow);
	},
	unselectStrings:function(obj) {
		var stringElm     = $(obj),
			thisObjString = "s"+stringElm.text(),
			stringNum	  = stringElm.text() % 6,
			newNum;
		
		// Check if same string
		for(var i = 1; i<127; i++){
			newNum = i % 6;
			if (newNum == stringNum) {
				if ($("b.s"+i).text() == stringElm.text()) {
					// do nothing
				} else {
					$("b.s"+i).removeClass('fx').removeClass('fo').removeClass('f0').removeClass('no').addClass('no');
				}
			}
		}
	},
	checkIfSixStringsSelected:function() {
		var diagram = " ";
		var stringButtons = $('#chordFinder > div > b');
		for(var b in stringButtons){
			if(stringButtons.eq(b).hasClass('fo')){
				diagram += stringButtons.eq(b).text()+"o ";
			} else if(stringButtons.eq(b).hasClass('fx')){
				diagram += stringButtons.eq(b).text()+"x ";
			} else if(stringButtons.eq(b).hasClass('f0')){
				diagram += stringButtons.eq(b).text()+"0 ";
			}
		}
		ChordFinder.interface.diagram = diagram;
		ChordFinder.interface.matchedDiagram = [];
		ChordFinder.findMatch();
	},
	reset:function(){
		ChordFinder.interface.matchedDiagram = []; 	 // Array
		ChordFinder.interface.matchedChord 	 = '';	 // String
		ChordFinder.interface.matchedSid 	 = '';	 // String
		ChordFinder.interface.matchedD 		 = '';	 // String
		ChordFinder.interface.diagram 		 = '';	 // String
		$("#listDiagrams").html('');
		$('#majors a').removeClass('sel');
		$('.types a').removeClass('sel');
		$('.types').css("display","none");
		$('#typeA').css("display","block");
	},
	updateDiagram:function(){
		//ChordFinder.reset();
		var stringButtons = $('#chordFinder > div > b'),
			inputSelect   = document.getElementById('fretChange'),
			newFretValue  = inputSelect.value,
			stringNum     = 0;
		
		for (var b in stringButtons) {
			if (parseInt(stringButtons.eq(b).text()) > 6) {
				stringNum = parseInt(stringButtons.eq(b).text());
				stringButtons.eq(b).removeClass('s'+stringNum);
				if (newFretValue == ChordFinder.interface.currentFretNumber) {
					stringNum =  Math.abs(stringNum + ((newFretValue - ChordFinder.interface.previousFretNumber) * 6));
				} else {
					stringNum =  Math.abs(stringNum + ((newFretValue - ChordFinder.interface.currentFretNumber) * 6));
				}
				stringButtons.eq(b).addClass('s'+stringNum);
				stringButtons.eq(b).text(stringNum);
			} 
			if (parseInt(stringButtons.eq(b).text()) < 7 && newFretValue > 5) {
				stringButtons.eq(b).removeClass('fo');
				stringButtons.eq(b).addClass('fx');
			}
		}
		
		ChordFinder.interface.currentFretNumber = newFretValue;
		document.getElementById('fretChange').value = ChordFinder.interface.currentFretNumber;
		
		// update fret number
		var dia        = inputSelect.parentNode,
			diaClass   = dia.className,
			diaFretNum = diaClass.substr(9);
			
		dia.className = diaClass.replace(diaFretNum, ChordFinder.interface.currentFretNumber);

		ChordFinder.checkIfSixStringsSelected();
		ChordFinder.Notes.setNotes();
	},
	selectChordMajor:function(obj) {
		var major = $(obj).text();
		$('#majors a').removeClass('sel');
		$(obj).addClass('sel');
		ChordFinder.selectChordType( $('#type'+major+' a:eq(0)') );
		$('.types').css("display","none");
		$('#type'+major).css("display","block");
	},
	selectChordType:function(obj) {
		var text   = $(obj).text();
		var major  = text.substr(0,1);
		var symbol = text.substr(1);
		$('#majors a').removeClass('sel');
		$('#'+major).addClass('sel');
		$('.types a').removeClass('sel');
		$(obj).addClass('sel');
		ChordFinder.getDiagramBySymbol(major,symbol);
	},
	viewDidLoad:function() {
		var stringButtons = $('#chordFinder > div > b');
		document.getElementById('fretChange').value = 1;
		
		// Gather up the string buttons and set their action
		stringButtons.click(function(){
			ChordFinder.stringSelect(this);
			return false;
		});
		
		// Set the select actions
		$('#fretChange').change(function(){
			ChordFinder.updateDiagram();
			return false;
		});
		/*$('#fretChange').focus(function(){
			ChordFinder.updateDiagram();
			return false;
		});*/
		
		// Reset Fretboard
		$('a.clearFretboard').click(function() {
			//ChordFinder.selectChordMajor( $('#majors a:eq(0)') );
			
			ChordFinder.reset();
			
			for (var b in stringButtons) {
				if (parseInt(stringButtons.eq(b).text()) < 7) {
					stringButtons.eq(b).removeClass('fx');
					stringButtons.eq(b).removeClass('no');
					stringButtons.eq(b).removeClass('fo');
					stringButtons.eq(b).addClass('fo');
				} else {
					stringButtons.eq(b).removeClass('f0');
					stringButtons.eq(b).removeClass('no');
					stringButtons.eq(b).addClass('no');
				}
			}
			document.getElementById('fretChange').value = 1;
			ChordFinder.updateDiagram();
			return false;
		});
		
		// Set action to chords list
		$('#majors a').click(function(){
			ChordFinder.selectChordMajor(this);
			return false;
		});
		$('.types a').click(function(){
			ChordFinder.selectChordType(this);
			return false;
		});
		
		// Show default Chord A
		ChordFinder.selectChordMajor( $('#majors a:eq(0)') );
	},

	Notes: {
		NoteE      : {'1':'E', '6':'E', '16':'E', '32':'E', '47':'E', '57':'E', '73':'E', '78':'E', '88':'E', '104':'E', '119':'E'},
		NoteB      : {'2':'B', '17':'B', '27':'B', '43':'B', '48':'B', '58':'B', '74':'B', '89':'B', '99':'B', '115':'B', '120':'B'},
		NoteG      : {'3':'G', '19':'G', '24':'G', '34':'G', '50':'G', '65':'G', '75':'G', '91':'G', '96':'G', '106':'G', '122':'G'},
		NoteD      : {'4':'D', '20':'D', '35':'D', '45':'D', '61':'D', '66':'D', '76':'D', '92':'D', '107':'D', '117':'D'},
		NoteA      : {'5':'A', '15':'A', '31':'A', '36':'A', '46':'A', '62':'A', '77':'A', '87':'A', '103':'A', '108':'A', '118':'A'},
		NoteF      : {'7':'F', '12':'F', '22':'F', '38':'F', '53':'F', '63':'F', '79':'F', '84':'F', '94':'F', '110':'F', '125':'F'},
		NoteC      : {'8':'C', '23':'C', '33':'C', '49':'C', '54':'C', '64':'C', '80':'C', '95':'C', '105':'C', '121':'C', '126':'C'},
		NoteGsharp : {'9':'G#', '25':'G#', '30':'G#', '40':'G#', '56':'G#', '71':'G#', '81':'G#', '97':'G#', '102':'G#', '112':'G#'},
		NoteDsharp : {'10':'D#', '26':'D#', '41':'D#', '51':'D#', '67':'D#', '72':'D#', '82':'D#', '98':'D#', '113':'D#', '123':'D#'},
		NoteAsharp : {'11':'A#', '21':'A#', '37':'A#', '42':'A#', '52':'A#', '68':'A#', '83':'A#', '93':'A#', '109':'A#', '114':'A#', '124':'A#'},
		NoteFsharp : {'13':'F#', '18':'F#', '28':'F#', '44':'F#', '59':'F#', '69':'F#', '85':'F#', '90':'F#', '100':'F#', '116':'F#'},
		NoteCsharp : {'14':'C#', '29':'C#', '39':'C#', '55':'C#', '60':'C#', '70':'C#', '86':'C#', '111':'C#', '101':'C#'},
		
		getNote:function(num) {
			var note = false;
			if (typeof this.NoteE[num] != "undefined") {
				note = this.NoteE[num];
			} else if (typeof this.NoteB[num] != "undefined") {
				note = this.NoteB[num];
			} else if (typeof this.NoteG[num] != "undefined") {
				note = this.NoteG[num];
			} else if (typeof this.NoteD[num] != "undefined") {
				note = this.NoteD[num];
			} else if (typeof this.NoteA[num] != "undefined") {
				note = this.NoteA[num];
			} else if (typeof this.NoteF[num] != "undefined") {
				note = this.NoteF[num];
			} else if (typeof this.NoteC[num] != "undefined") {
				note = this.NoteC[num];
			} else if (typeof this.NoteGsharp[num] != "undefined") {
				note = this.NoteGsharp[num];
			} else if (typeof this.NoteDsharp[num] != "undefined") {
				note = this.NoteDsharp[num];
			} else if (typeof this.NoteAsharp[num] != "undefined") {
				note = this.NoteAsharp[num];
			} else if (typeof this.NoteFsharp[num] != "undefined") {
				note = this.NoteFsharp[num];
			} else if (typeof this.NoteCsharp[num] != "undefined") {
				note = this.NoteCsharp[num];
			}
			return note;
		},
				
		setNote:function(stringElm, string, stringRow) {
			var noteElms = $('#chordFinder div.notes b');
			
			if (!noteElms.length) { return false; }
			
			string = string.replace(/x/ig, "").replace(/o/ig, "");
			
			var note     = this.getNote(string),
				noteElm  = noteElms.eq(stringRow-1);
			
			if (stringElm.hasClass('fx')) {
				noteElm.text('').attr('class','note');
			} else {
				noteElm.text(note).attr('class','').addClass('note n'+string);
			}
		},
		
		setNotes:function() {
			var selectedStrings = $('#chordFinder > div > b.fx, #chordFinder > div > b.fo, #chordFinder > div > b.f0'),
				stringElm,
				string,
				stringRow;
			
			selectedStrings.each(function(i, val) {
				stringElm = $(this);
				string    = stringElm.text();
				stringRow = parseInt(string) % 6;
				ChordFinder.Notes.setNote(stringElm, string, stringRow);
			});
		},
		
		// not in use
		clearNotes:function() {
			var noteElms = $('#chordFinder div.notes b');
			noteElms.text('').attr('class','note');
		},
		
		// not in use
		setOpenNotes:function() {
			var noteElms = $('#chordFinder div.notes b');
			noteElms.eq(0).text('E').attr('class','note n1');
			noteElms.eq(1).text('B').attr('class','note n2');
			noteElms.eq(2).text('G').attr('class','note n3');
			noteElms.eq(3).text('D').attr('class','note n4');
			noteElms.eq(4).text('A').attr('class','note n5');
			noteElms.eq(5).text('E').attr('class','note n6');
		}
	}
}

// ONLOAD FUNCTIONS
$(function(){ ChordFinder.viewDidLoad(); });
