/* 
 * some (much?) of the following is taken and or modified from:
 * http://developer.apple.com/internet/webcontent/xmlhttpreq.html
 * 
 * there would be a lot less code if I were a better js programmer.
 * 
 *  aaron evans:  (aarone at cis.upenn.edu)  9/17/2004
 */


var isIE = false;
var albumsFoArtist;
var artistsList;
var songsForArtist;


/*
 *  artistsList lists all artist and keys
 *  albumsForArtist maps artist key to album list and album keys pairs
 *  songsForArtist maps an album key to a list of songs for that album
 * 
 */


/* called from html on page load */
function loadArtistDoc() {
	try {
		loadArtistList("artists.xml");
	} catch(e) {
		var msg = (typeof e == "string") ? e: ((e.message) ?e.message : "Unknown Error");
		alert("Unable to get XML data: \n" + msg);
	}
}

/* this opens an xml file containing a list of artists and associated keys */
function loadArtistList(url) {
    // branch for native XMLHttpRequest object
	if (window.XMLHttpRequest) {        
		artistsList = new XMLHttpRequest();
		artistsList.onreadystatechange = processArtistReqChange;
		artistsList.open("GET", url, true);
		artistsList.send(null);
	// branch for IE/Windows ActiveX version
	} else if (window.ActiveXObject) {
		isIE = true;
		artistsList = new ActiveXObject("Microsoft.XMLHTTP");
		if (artistsList) {
			artistsList.onreadystatechange = processArtistReqChange;
			artistsList.open("GET", url, true);
			artistsList.send();
		}
	}
}

/* when artists xml is loaded, this is called */
function processArtistReqChange() {
	if(artistsList.readyState == 4 ) {
		clearArtistList();
		buildArtistList();
 	}
}

function clearArtistList() {
	var select = document.getElementById("artists");
	while(select.length > 0) {
	  select.remove(0);
	}
}

function buildArtistList() {
	var items;
	var select = document.getElementById("artists");

	items = artistsList.responseXML.getElementsByTagName("artist");

	for(var i=0; i<items.length; i++) {
		appendToSelect(select, getElementTextNS("","artist_key", items[i],0), document.createTextNode(getElementTextNS("", "artist_name", items[i], 0)));
	}
	document.getElementById("songs").innerHTML = "";
}


/* end artist list stuff */
/* begin album list stuff */

function loadAlbum(evt) {
  evt = (evt) ? evt : ((window.event) ? window.event: null);

  if(evt) {
    var elem = (evt.target) ? evt.target: ((evt.srcElement)? evt.srcElement : null);
	if(elem) {
	  try {
	   if(elem.selectedIndex >= 0) {
	     loadAlbumListFromXML(elem.options[elem.selectedIndex].value);
		 }
	   } catch(e) {
	   	var msg = (typeof e == "string") ? e: ((e.message) ?e.message : "Unknown Error");
		alert("Unable to get find key: \n" + msg);
		}
	 }
	}	
}


/* function for loading album list */
function loadAlbumListFromXML(url) {
    // branch for native XMLHttpRequest object
	if (window.XMLHttpRequest) {        
		albumsFoArtist = new XMLHttpRequest();
		albumsFoArtist.onreadystatechange = processReqAlbumChange;
		albumsFoArtist.open("GET", url, true);
		albumsFoArtist.send(null);
	// branch for IE/Windows ActiveX version
	} else if (window.ActiveXObject) {
		isIE = true;
		albumsFoArtist = new ActiveXObject("Microsoft.XMLHTTP");
		if (albumsFoArtist) {
			albumsFoArtist.onreadystatechange = processReqAlbumChange;
			albumsFoArtist.open("GET", url, true);
			albumsFoArtist.send();
		}
	}
}

/* when artists xml is loaded, this is called */
function processReqAlbumChange() {
	if(albumsFoArtist.readyState == 4 ) {
	  clearAlbumList();
	  buildAlbumList();
	}
}


function clearAlbumList() {
	var select = document.getElementById("albums");
	while(select.length > 0) {
	  select.remove(0);
	}
}

function buildAlbumList() {
	var select = document.getElementById("albums");
	var items = albumsFoArtist.responseXML.getElementsByTagName("album");

	for(var i=0; i<items.length; i++) {
		appendToSelect(select, getElementTextNS("","album_key", items[i], 0), document.createTextNode(getElementTextNS("", "album_n", items[i], 0)));
	}
	document.getElementById("songs").innerHTML = "";
}


/* end album stuff */
/* begin songs stuff */

function loadSongs(evt) {
  evt = (evt) ? evt : ((window.event) ? window.event: null);

  if(evt) {
    var elem = (evt.target) ? evt.target: ((evt.srcElement)? evt.srcElement : null);
	if(elem) {
	  try {
	   if(elem.selectedIndex >= 0) {
	     loadSongListFromXML(elem.options[elem.selectedIndex].value);
		 }
	   } catch(e) {
	   	var msg = (typeof e == "string") ? e: ((e.message) ?e.message : "Unknown Error");
		alert("Unable to get find key: \n" + msg);
		}
	 }
	}	
}

/* this opens an xml file containing a songs from an album */
function loadSongListFromXML(url) {
    // branch for native XMLHttpRequest object
	if (window.XMLHttpRequest) {        
		songsForArtist= new XMLHttpRequest();
		songsForArtist.onreadystatechange = processSongsReqChange;
		songsForArtist.open("GET", url, true);
		songsForArtist.send(null);
	// branch for IE/Windows ActiveX version
	} else if (window.ActiveXObject) {
		isIE = true;
		songsForArtist = new ActiveXObject("Microsoft.XMLHTTP");
		if (songsForArtist) {
			songsForArtist.onreadystatechange = processSongsReqChange;
			songsForArtist.open("GET", url, true);
			songsForArtist.send();
		}
	}
}

function processSongsReqChange() {
	if(songsForArtist.readyState == 4 ) {
	  writeSongs();
	}
}

/* 
 * convert songs from XML entries to HTML table for display 
 */
function writeSongs() {
	var items, content, div;
	var oddRow = 1;
	content = "<table =\"songs\">\n";
	content += "<col id=\"col1\"><COL id=\"col2\"><COL id=\"col3\"><COL id=\"col4\"><COL id=\"col5\">\n";
	content += "<tr id=\"header\"><td id=\"name\">Song Name</td><td id=\"artist\">Artist</td><td id=\"album\">Album</td><td id=\"time\">Total Time</td><td id=\"track_no\">Track #</td></tr>\n";

	items = songsForArtist.responseXML.getElementsByTagName("song");
	for(var i=0; i<items.length; i++) {
		var track_time = getElementTextNS("", "total_time", items[i], 0);
		var min = Math.floor(track_time / 1000 / 60);
		var sec = Math.round(((track_time / 1000 / 60) - min) * 60);
		if(sec < 10) { 
		sec = sec + "0";
		}
		track_time = min + ":" + sec;
		if(oddRow) { content += "<tr id=\"odd\">"; oddRow=0;}
		else {content += "<tr id=\"even\">"; oddRow=1; }
		
		content += "<td>" + getElementTextNS("", "name", items[i], 0) + "</td>";
		content += "<td>" + getElementTextNS("", "artist", items[i], 0) + "</td>";
		content += "<td>" + getElementTextNS("", "album", items[i], 0) + "</td>";
		content += "<td>" +  track_time + "</td>";
		content += "<td>" + getElementTextNS("", "track_number", items[i], 0) + "</td>";
		content += "</tr>\n";
	}
	content += "</table>\n";
	div = document.getElementById("songs");
	div.innerHTML = content;
}


/* general purpose stuff */
function getElementTextNS(prefix, local, parentElem, index) {
	var result = "";
	if (prefix && isIE) {
		result = parentElem.getElementsByTagName(prefix + ":" + local)[index];
	} else {
		result = parentElem.getElementsByTagName(local)[index];
	}
	if(result) {
	   if(result.childNodes.length > 1) {
	      return result.childNodes[1].nodeValue;
		} else {
		  return result.firstChild.nodeValue;
		}
	} else {
		return "n/a";
	}
}

/* general purpose, reusable append */
function appendToSelect(select, value, content) {
	var opt;
	opt = document.createElement("option");
	opt.value = value;
	opt.appendChild(content);
	select.appendChild(opt);
}

