<!--Hide from old browsers
// place your JavaScript code here (// are JavaScript comments, ! is HTML comment

// Copyright © 2007 Ronald Pulcer (Ron Pulcer Music)

// This Javascript file handles AJAX functionality for MTWS (Music Theory Web Service)

// NOTE: This Javascript file contains several functions that are common across
// all AJAX processing by MTWS.

var xmlHttp;
// var serverURL="http://zonorus.marlboro.edu/~rpulcer/capstone/mtws/design/cgi-bin/ajax_request_2servlet.cgi?";
// var serverURL="http://www.ronpulcer.com/music/mtws/cgi-bin/ajax_request_2servlet.cgi?";
var serverURL="http://www.ronpulcer.com/cgi/ajax_request_2servlet_eatj.cgi?";

function GetXmlHttpObject() {

// alert('Got here: GetXmlHttpObject()');

	try  {
		// Firefox, Opera 8.0+, Safari
		xmlHttp=new XMLHttpRequest();
	}
	catch (e) {
		// Internet Explorer 6.0.x
		try  {
			xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
		}
		catch (e) {
		// Internet Explorer 5.0.x
			try  {
				xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
			}
			catch (e) {
				alert ("Your browser does not support AJAX!");
				return null;
			}
		}
	}

	return xmlHttp;
}


function loadXMLFromFile(xmlFile)
{
	var xmlDoc;

	// code for IE
	if (window.ActiveXObject) {
		xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
		xmlDoc.async=false;
		xmlDoc.load(xmlFile);
		return xmlDoc;
	}
	// code for Mozilla, Firefox, Opera, etc.
	else if (document.implementation &&
				document.implementation.createDocument) {
		xmlDoc=document.implementation.createDocument("","",null);
		xmlDoc.load(xmlFile);
		return xmlDoc;
	}
	else {
		alert('Your browser cannot read XML documents');
		return null;
	}
}


function loadXMLFromText(text)
{
	var xmlDoc;

	// code for IE
	if (window.ActiveXObject) {
		xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
		xmlDoc.async=false;
		xmlDoc.loadXML(text);
		return xmlDoc;

	}
	// code for Mozilla, Firefox, Opera, etc.
	else if (document.implementation &&
				document.implementation.createDocument) {
		var parser=new DOMParser();
		xmlDoc=parser.parseFromString(text,"text/xml");
		return xmlDoc;

	}
	else {
		alert('Your browser cannot read XML documents');
		return null;
	}
}


function updateAjaxStatus() {

	var statusObj=document.getElementById('ajaxStatus');

	if(statusObj!=null) {
		if(xmlHttp.readyState==1)      { statusObj.innerHTML='<em>Ajax Request setup ...</em>'; }
		else if(xmlHttp.readyState==2) { statusObj.innerHTML='<em>Ajax Request sent ...</em>';  }
		else if(xmlHttp.readyState==3) { statusObj.innerHTML='<em>Ajax Request processing ...</em>'; }
		else if(xmlHttp.readyState==4) { statusObj.innerHTML='<em>Ajax Request completed!</em>'; }
		//	else { alert(xmlHttp.readyState); }
	}
}


function setServerURL(srvURL) {
	alert(srvURL);
	serverURL="http://www.ronpulcer.com/cgi/ajax_request_2servlet_" + srvURL + ".cgi?";
}


function getServerURL() {
	return serverURL;
}


function isAutoClear() {

	rbObj=document.getElementsByName('auto_clear_opt');
	if(rbObj!=null) {

		var rtn = false;
		for(var i=0; i<2; i++) { 
			if(rbObj[i].value=='yes' && rbObj[i].checked) { rtn = true; }
		}
		return rtn;
	}
	else {
		// If radio button option not present on page, Assume default of true
		return true;	
	}
}


function getInterval() {
	
	var intervalNum = 0;
	rbObj=document.getElementsByName('interval');
	if(rbObj!=null) {
		for(var i=0; i<rbObj.length; i++) { 
			if(rbObj[i].checked) { 
				intervalNum = rbObj[i].value;
				break;
			}
		}
	}
	return intervalNum;
}


function getIntervalDirection() {
	
	var intervalDir = 'up';
	rbObj=document.getElementsByName('interval_direction');
	if(rbObj!=null) {
		for(var i=0; i<rbObj.length; i++) { 
			if(rbObj[i].checked) { 
				intervalDir = rbObj[i].value;
				break;
			}
		}
	}
	return intervalDir;
}

// Note: These Scale intervals are temporary until the server sends this additional info within result
// Stub function
function onchange_scale_type(scale) { }


function display_interval_seq(scale) {
//alert(scale);

var interval_seq="";
// interval_seq=scale;

if(scale=='')             { interval_seq = ''; }
else if(scale=='major')   { interval_seq = 'W W H W W W H'; }
else if(scale=='natmin')  { interval_seq = 'W H W W H W W'; }
else if(scale=='harmin')  { interval_seq = 'W H W W H m3 H'; }
else if(scale=='melmin')  { interval_seq = 'W H W W W W H, descend Natural'; }

else if(scale=='chrom')   { interval_seq = 'H H H H H H H H H H H H'; }
else if(scale=='whole')   { interval_seq = 'W W W W W W'; }

else if(scale=='minpent') { interval_seq = 'm3 W W m3 W'; }
else if(scale=='blues')   { interval_seq = 'm3 W H H m3 W'; }
else if(scale=='majpent') { interval_seq = 'W W m3 W m3'; }
else if(scale=='bgrass')  { interval_seq = 'W H H m3 W m3'; }

else if(scale=='ion')     { interval_seq = 'W W H W W W H'; }
else if(scale=='dor')     { interval_seq = 'W H W W W H W'; }
else if(scale=='phy')     { interval_seq = 'H W W W H W W'; }
else if(scale=='lyd')     { interval_seq = 'W W W H W W H'; }
else if(scale=='mix')     { interval_seq = 'W W H W W H W'; }
else if(scale=='aeo')     { interval_seq = 'W H W W H W W'; }
else if(scale=='loc')     { interval_seq = 'H W W H W W W'; }

return interval_seq;
}


function ajaxGetFile(fileNameURL, func) {

// alert('Got here: ajaxGetFile()');

	if(fileNameURL=='') { return; }

	var ajaxMethod="GET";			// Can be changed to POST later on, if needed
	var spanObj = document.getElementById('ajaxStatus');
	if(spanObj!=null) { document.getElementById('ajaxStatus').innerHTML=''; }

	xmlHttp=GetXmlHttpObject();
	if (xmlHttp==null) { return; }

	xmlHttp.onreadystatechange=func;

	// alert("URL: " + fileNameURL);
	xmlHttp.open(ajaxMethod, fileNameURL, true);
	xmlHttp.send(null);
}


function commonAjaxFunction(action) {

// alert('Got here: commonAjaxFunction()');


	var url2run='';					// Specify URL along with handler function for xmlHttp.onreadystatechange
	var ajaxMethod="GET";			// Can be changed to POST later on, if needed

	var spanObj = document.getElementById('ajaxStatus');
	if(spanObj!=null) { document.getElementById('ajaxStatus').innerHTML=''; }

	xmlHttp=GetXmlHttpObject();
	if (xmlHttp==null) { return; }

	// Here are the possible values for the readyState propery:

	// 0 The request is not initialized 
	// 1 The request has been set up 
	// 2 The request has been sent 
	// 3 The request is in process 
	// 4 The request is complete 

	// One option is to specify an anonymous internal function

	//	xmlHttp.onreadystatechange=function() {
	//		if(xmlHttp.readyState==4) {
	//			document.myForm.time.value+=xmlHttp.responseText;
	//		}
	//	}

	// Another option is to specify an external function.
	// Based on different actions specified, you can assign different handler functions
	// if(document.myForm.action.value=='testAjax') {

	var outputFmt = '';
	if(action.indexOf('_xml')>=0) {
		outputFmt = 'xml';
		xmlHttp.onreadystatechange=UCIntervalXmlStateChanged;
	}
	else {
		outputFmt = 'txt';
		xmlHttp.onreadystatechange=UCIntervalTxtStateChanged;
	}

	if(action=='demo_uc_intervals_1_txt' || action=='demo_uc_intervals_1_xml') {

	// Use Case: Intervals I1
	// http://localhost:8080/mtws_servlet/mtws.do?
	// interval=1&output_fmt=txt&action=interval_getInfo&submit=View+Interval+Info

		var docObj = document.getElementById('interval');
		
		if(docObj!=null) {
			var intervalNum = docObj.value;
			var queryString = "action=interval_getInfo&interval=" + intervalNum + "&output_fmt=" + outputFmt;

			url2run = getServerURL() + queryString;
		}
		else {
			alert("Please select an Interval.");
			return;
		}
	}
	else if(action=='demo_uc_scales_1_txt' || action=='demo_uc_scales_1_xml') {

	// Use Case: Intervals S1
	// http://localhost:8080/mtws_servlet/mtws.do?
	// scale_type=major&output_fmt=txt&action=scale_getInfo&submit=View+Scale+Info

		var docObj = document.getElementById('scale_type');
		
		if(docObj!=null) {
			var scaleType = docObj.value;
			var queryString = "action=scale_getInfo&scale_type=" + scaleType + "&output_fmt=" + outputFmt;

			url2run = getServerURL() + queryString;
		}
		else {
			alert("Please select a Scale.");
			return;
		}
	}
	else if(action=='demo_uc_chords_1_txt' || action=='demo_uc_chords_1_xml') {

	// Use Case: Intervals C1
	// http://localhost:8080/mtws_servlet/mtws.do?
	// chord_type=dom7&output_fmt=xml&action=chord_getInfo&submit=View+Chord+Info

		var docObj = document.getElementById('chord_type');
		
		if(docObj!=null) {
			var scaleType = docObj.value;
			var queryString = "action=chord_getInfo&chord_type=" + scaleType + "&output_fmt=" + outputFmt;

			url2run = getServerURL() + queryString;
		}
		else {
			alert("Please select a Chord.");
			return;
		}
	}
	else {
		alert("Invalid action: " + action);
		return;
	}

	// alert("URL: " + url2run);
	xmlHttp.open(ajaxMethod, url2run, true);
	xmlHttp.send(null);
}


function UCIntervalTxtStateChanged() {

	if(xmlHttp.readyState==4) {
		document.getElementById('div_xml').innerHTML = 
			'<textarea cols="100" rows="5">\n<!--\n' + xmlHttp.responseText + '\n-->\n</textarea>\n';

//// Sample output from MTWS Servlet
//// Interval#,HS,WS,short name,long name,formal name,jazz name,alias name,isPerfect,perfect name,isAugDim,AugDim name
//// 4,4 Half-steps,2.0 Whole-steps,M3,Major 3rd,Major third,M3,,false,,false,,


		var resultRow = new Array();
		resultRow = xmlHttp.responseText.split('\n');
		var intervalTableRow = '';
		for(var r=0; r<resultRow.length; r++) {

			if(resultRow[r]!='') {

				var intervalInfo = new Array();
				intervalInfo = resultRow[r].split(',');

				if(intervalInfo.length==13) {

					// Handle optional fields
					if(intervalInfo[7]=='')  { intervalInfo[7]='&nbsp;'; }
					if(intervalInfo[9]=='')  { intervalInfo[9]='&nbsp;'; }
					if(intervalInfo[11]=='') { intervalInfo[11]='&nbsp;'; }

					intervalTableRow += '<tr><td align="right">'    + intervalInfo[0] + 
						'</td><td>' + intervalInfo[1]  + '</td><td>' + intervalInfo[2] + 
						'</td><td>' + intervalInfo[3]  + '</td><td>' + intervalInfo[4] + '</td><td>' + intervalInfo[5] + 
						'</td><td>' + intervalInfo[6]  + '</td><td>' + intervalInfo[7] + 
						'</td><td>' + intervalInfo[8]  + '</td><td>' + intervalInfo[9] + 
						'</td><td>' + intervalInfo[10] + '</td><td>' + intervalInfo[11] + '</td></tr>\n';
				}
			}
		}

		document.getElementById('span_interval_info').innerHTML = 
			'<table border="1">\n<tr>\n<th>Interval<br />#</th>\n' + 
			'<th>Half-<br />steps</th>\n' + '<th>Whole-<br />steps</th>\n' + 
			'<th>Short<br />Name</th>\n'  + '<th>Long<br />Name</th>\n' + '<th>Formal<br />Name</th>\n' + 
			'<th>Jazz<br />Name</th>\n'   + '<th>Alias<br />Name</th>\n' + 
			'<th>Is<br />Perfect?</th>\n' + '<th>Perfect<br />Name</th>\n' + 
			'<th>Is<br />Aug/Dim?</th>\n' + '<th>Aug/Dim<br />Name</th>\n</tr>\n' + 
			intervalTableRow + '</table>\n';
	}


	// Update status for all status values
	updateAjaxStatus();
}


function UCIntervalXmlStateChanged() {

	if(xmlHttp.readyState==4) {
		document.getElementById('div_xml').innerHTML = 
			'<textarea cols="100" rows="5">\n<!--\n' + xmlHttp.responseText + '\n-->\n</textarea>\n';

// Sample output from MTWS Servlet
// <mtws_result>
//  <intervals>
//  <interval_info>
//  <interval>4</interval> 
//  <half_steps>4 Half-steps</half_steps> 
//  <whole_steps>2.0 Whole-steps</whole_steps> 
//  <short_name>M3</short_name> 
//  <long_name>Major 3rd</long_name> 
//  <formal_name>Major third</formal_name> 
//  <jazz_name>M3</jazz_name> 
//  <alias_name /> 
//  <is_perfect>false</is_perfect> 
//  <perfect_name /> 
//  <is_aug_dim>false</is_aug_dim> 
//  <aug_dim_name /> 
//  </interval_info>
//  </intervals>
//  </mtws_result>


		var resultXML = loadXMLFromText(xmlHttp.responseText);

		var intervalTableRow = '';

		for(var r=0; r<resultXML.getElementsByTagName("interval").length; r++) {

			var intervalNum   = resultXML.getElementsByTagName("interval")[r].childNodes[0].nodeValue;
			var halfStepName  = resultXML.getElementsByTagName("half_steps")[r].childNodes[0].nodeValue;
			var wholeStepName = resultXML.getElementsByTagName("whole_steps")[r].childNodes[0].nodeValue;
			var shortName     = resultXML.getElementsByTagName("short_name")[r].childNodes[0].nodeValue;
			var longName      = resultXML.getElementsByTagName("long_name")[r].childNodes[0].nodeValue;
			var formalName    = resultXML.getElementsByTagName("formal_name")[r].childNodes[0].nodeValue;
			var jazzName      = resultXML.getElementsByTagName("jazz_name")[r].childNodes[0].nodeValue;
			var isPerfect     = resultXML.getElementsByTagName("is_perfect")[r].childNodes[0].nodeValue;
			var isAugDim      = resultXML.getElementsByTagName("is_aug_dim")[r].childNodes[0].nodeValue;

			// Handle optional fields
			var aliasName = '&nbsp;';
			if(resultXML.getElementsByTagName("alias_name")[r].childNodes[0]) {
				aliasName = resultXML.getElementsByTagName("alias_name")[r].childNodes[0].nodeValue;
			}

			var perfectName = '&nbsp;';
			if(resultXML.getElementsByTagName("perfect_name")[r].childNodes[0]) {
				 perfectName   = resultXML.getElementsByTagName("perfect_name")[r].childNodes[0].nodeValue;
			}

			var augDimName = '&nbsp;';
			if(resultXML.getElementsByTagName("aug_dim_name")[r].childNodes[0]) {
				augDimName    = resultXML.getElementsByTagName("aug_dim_name")[r].childNodes[0].nodeValue;
			}

			intervalTableRow += '<tr><td align="right">'   + intervalNum   + 
					'</td><td>' + halfStepName + '</td><td>' + wholeStepName + 
					'</td><td>' + shortName    + '</td><td>' + longName      + '</td><td>' + formalName + 
					'</td><td>' + jazzName     + '</td><td>' + aliasName     + 
					'</td><td>' + isPerfect    + '</td><td>' + perfectName   + 
					'</td><td>' + isAugDim     + '</td><td>' + augDimName    + '</td></tr>\n';
		}

		document.getElementById('span_interval_info').innerHTML = 
			'<table border="1">\n<tr>\n<th>Interval<br />#</th>\n' + 
			'<th>Half-<br />steps</th>\n' + '<th>Whole-<br />steps</th>\n' + 
			'<th>Short<br />Name</th>\n'  + '<th>Long<br />Name</th>\n' + '<th>Formal<br />Name</th>\n' + 
			'<th>Jazz<br />Name</th>\n'   + '<th>Alias<br />Name</th>\n' + 
			'<th>Is<br />Perfect?</th>\n' + '<th>Perfect<br />Name</th>\n' + 
			'<th>Is<br />Aug/Dim?</th>\n' + '<th>Aug/Dim<br />Name</th>\n</tr>\n' + 
			intervalTableRow + '</table>\n';
	}


	// Update status for all status values
	updateAjaxStatus();
}


// Copyright © 2007 Ronald Pulcer (Ron Pulcer Music)

//-->

