
/* study_materials.js
 * Author:      David Coleman
 * Purpose:     Gets the requested contents of the study 
 *				materials XML doc, builds, and displays
 *				an HTML table containing the data from 
 * 				the XML
 * Parameters:  this.getStudyMaterials(tabName) accepts the 
 *   			the tab name corresponding to the content
 *   			in the XML document i.e. <exams name="tabName">
 * Returns:     nothing, updates div's innerHTML with new table HTML
 */
var StudyMaterials = function() {
	var httpRequest = null;
	var selectedTabName = '';

    /* 
	*    init_xhr() 
	*    initializes XMLHTTP Request object 
	*/
	this.initXHR = function() {
		if (window.XMLHttpRequest) { // Mozilla, Safari,...
		    httpRequest = new XMLHttpRequest();
		    if (httpRequest.overrideMimeType) {
		        httpRequest.overrideMimeType('text/xml');
		    }
		} else if (window.ActiveXObject) { // IE
		    try {
		        httpRequest = new ActiveXObject("Msxml2.XMLHTTP");
		    } catch (e) {
		        try {
		            httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
		        } catch (e) {
			
				}
		    }
		}
		if (!httpRequest) {
			return false;
		}
		return true;
	}

	/*
	 * getStudyMaterials()
     * sends http request to get study materials xml document
	*/
	this.getStudyMaterials = function(tabName) {
		// tabName denotes link that user has clicked
		// used to change <span> in <h3>
		selectedTabName = tabName;

		if (!this.initXHR()) {
			return false;
		}
		httpRequest.onreadystatechange = this.parseResponse;
	    httpRequest.open('GET', 'downloads/study_materials.xml', true);
	    httpRequest.send(null);
	}

	/* 
	 *    parseResponse() 
	 *    -handles the http response, parsing the xml document for 
	 *    study materials elements 
     *    -builds the html for the study materials table
	 */
	this.parseResponse = function() {
		var xml;
		if (httpRequest.readyState == 4 && httpRequest.status == 200) {
            xml = httpRequest.responseXML;
   		}
		if (xml) {
			// good http xml response
			// get all <exams name="xyz"> elements
			var exams = xml.getElementsByTagName('exams');
			// find <exams> element that user is looking for 
			// by checking 'name' attr
			var selectedExams = null;
			var examsHeader = null;
			for (var i = 0; i < exams.length; i++) {
				if (exams[i].getAttribute('name') == selectedTabName) {
					selectedExams = exams[i].getElementsByTagName('exam');
					// determine correct header for <h3>
					switch(exams[i].getAttribute('name')) {
						case 'refreshed_exams':
							examsHeader = 'Exams Refreshed in 2008-2009';
							break;
						case 'business':
							examsHeader = 'Business Exams';
							break;
						case 'humanities':
							examsHeader = 'Humanities Exams';
							break;
						case 'natural_science':
							examsHeader = 'Natural Science Exams';
							break;
						case 'social_science':
							examsHeader = 'Social Science Exams';
							break;
						default:
							examsHeader = '...';
					}
				}
			}
			
			// build array of exam data from selected <exams> element's <exam> elements
			var tableRows = new Array();
			for (var i = 0; i < selectedExams.length; i++) {
			    var title         = selectedExams[i].getElementsByTagName("title")[0].childNodes[0] ? 
						                selectedExams[i].getElementsByTagName("title")[0].childNodes[0].nodeValue : 'No Title';
				var credit        = selectedExams[i].getElementsByTagName("credit")[0].childNodes[0] ?
										selectedExams[i].getElementsByTagName("credit")[0].childNodes[0].nodeValue : 'none';
			    var creditType    = selectedExams[i].getElementsByTagName('credit')[0] ? 
										selectedExams[i].getElementsByTagName('credit')[0].getAttribute('type') : 'x';
				var factsheets    = selectedExams[i].getElementsByTagName("factsheet");
				var practiceTest  = selectedExams[i].getElementsByTagName("practicetest")[0].childNodes[0] ?
										selectedExams[i].getElementsByTagName("practicetest")[0].childNodes[0].nodeValue : 'none';
				var courses       = selectedExams[i].getElementsByTagName("courses")[0].childNodes[0] ? 
										selectedExams[i].getElementsByTagName("courses")[0].childNodes[0].nodeValue : 'none';
				var studyGuide    = selectedExams[i].getElementsByTagName("studyguide")[0].childNodes[0] ? 
										selectedExams[i].getElementsByTagName("studyguide")[0].childNodes[0].nodeValue : 'none';

				tableRows.push({title: title, credit: credit, creditType: creditType, factsheets: factsheets, practiceTest: practiceTest, courses: courses, studyGuide: studyGuide});
			}
			// create table html
			var tableEl = new Element('table', {
				'cellpadding': '3',
				'cellspacing': '0',
				'class'		 : 'studymat'
			});
			var tableBodyEl = new Element('tbody', {
				'id': 'studyMaterialsTableBody'
			});

			// table header <tr> and <th>s
			var tableHeadRowEl = new Element('tr');

			var tableHeadTitleEl = new Element('th', {
				'class': 'studymat'
			});
			tableHeadTitleEl.innerHTML = 'Exam Title';
			tableHeadTitleEl.inject(tableHeadRowEl);

			var tableHeadCreditEl = new Element('th', {
				'class': 'studymat'
			});
			tableHeadCreditEl.innerHTML = 'ACE Recommendation for Credit';
			tableHeadCreditEl.inject(tableHeadRowEl);

			var tableHeadFactSheetEl = new Element('th', {
				'class': 'studymat'
			});
			tableHeadFactSheetEl.innerHTML = 'DSST Fact Sheet<br /> (includes recommended text books)';
			tableHeadFactSheetEl.inject(tableHeadRowEl);

			var tableHeadPracticeTestEl = new Element('th', {
				'class': 'studymat'
			});
			tableHeadPracticeTestEl.innerHTML = 'DSST Practice Exam';
			tableHeadPracticeTestEl.inject(tableHeadRowEl);

			var tableHeadCoursesEl = new Element('th', {
				'class': 'studymat'
			});
			tableHeadCoursesEl.innerHTML = 'iStudySmart Courses';
			tableHeadCoursesEl.inject(tableHeadRowEl);

			/* not displaying study guide col at this point in time
			var tableHeadStudyGuideEl = new Element('th');
			tableHeadStudyGuideEl.innerHTML = 'Peterson Study Guide';
			tableHeadStudyGuideEl.inject(tableHeadRowEl);
			*/

			// add table header row to table body
			tableHeadRowEl.inject(tableBodyEl);

			// build table rows
			for (var i = 0; i < tableRows.length - 1; i++) {
				var tableRowEl;
				if (i % 2 == 0) {
					tableRowEl = new Element('tr');
				} else {
					tableRowEl = new Element('tr', {
					    'class': 'studymat_altrow'
					});
				}

				// exam title col
				var tableDataTitleEl = new Element('td', {
					'class': 'studymat_leftcol'
				});
				tableDataTitleEl.innerHTML = tableRows[i]['title'];
				tableDataTitleEl.inject(tableRowEl);

				// recommended credits col
				var tableDataCreditEl = new Element('td');
				// add cap images for number of credits
				var numCredits = parseInt(tableRows[i]['credit']);
				// display credits as "TBD" if == 0
				if (numCredits == 0) {
				    numCredits = "TBD";
				}
				if (tableRows[i]['creditType'] == 'u') {
					// use the diploma gif for upper baccalaureate credits
					for (var j = 0; j < numCredits; j++) {
						new Element('img', {
							'src'  : '_images/diploma.gif',
							'styles': {
								'margin': '0px 1px 0px 1px'
							}
						}).inject(tableDataCreditEl);
					}
				} else if (tableRows[i]['creditType'] == 'b') {
					// use the cap png for regular baccalaureate credits
					for (var j = 0; j < numCredits; j++) {
						new Element('img', {
							'src': '_images/cap.png'
						}).inject(tableDataCreditEl);
					}
				}
				new Element('br').inject(tableDataCreditEl);
				if (tableRows[i]['creditType'] == 'u') {
					tableDataCreditEl.innerHTML += numCredits + ' Upper Baccalaureate';
				} else if (tableRows[i]['creditType'] == 'b') {
					tableDataCreditEl.innerHTML += numCredits + ' Baccalaureate';
				} else {
				    tableDataCreditEl.innerHTML += numCredits;
				}
				tableDataCreditEl.inject(tableRowEl);

				// fact sheet download col 
				// can contain more than one factsheet link
				var tableDataFactSheetEl = new Element('td');
				if (tableRows[i]['factsheets'].length > 0) {
				    var factsheets = tableRows[i]['factsheets'];
				    for (var j = 0; j < factsheets.length; j++) {
				        new Element('a', {
    						'href': factsheets[j].getAttribute('file'),
    						'target':'_pdf'
    					}).appendText(factsheets[j].getAttribute('title')).inject(tableDataFactSheetEl);
    					var pdfAnchorEl = new Element('a', {
    					    'href': factsheets[j].getAttribute('file'),
    						'target':'_pdf'
    					});
    					new Element ('img', {
    						'src'   : '_images/pdf.gif',
    						'border': '0'
    					}).inject(pdfAnchorEl);                  
    					pdfAnchorEl.inject(tableDataFactSheetEl);
    					new Element('br').inject(tableDataFactSheetEl);
				    }
				} else {
					tableDataFactSheetEl.innerHTML = '&nbsp;'
				}
				tableDataFactSheetEl.inject(tableRowEl);

				// practice exam link col
			   	var tableDataPracticeTestEl = new Element('td');
				if (tableRows[i]['practiceTest'] != 'none') {
					var arrowAnchorEl = new Element('a', {
						'href': tableRows[i]['practiceTest'],
						'target': '_ibtwin'
					});
					new Element('img', {
						'src': '_images/green_go.png'
					}).inject(arrowAnchorEl);
					arrowAnchorEl.inject(tableDataPracticeTestEl);
				} else {
					tableDataPracticeTestEl.innerHTML = '&nbsp;';
				}
				tableDataPracticeTestEl.inject(tableRowEl);

				// courses link col
				var tableDataCoursesEl = new Element('td');
				if (tableRows[i]['courses'] != 'none') {
					var arrowAnchorEl = new Element('a', {
						'href': tableRows[i]['courses'],
						'target': '_ibtwin'
					});
					new Element('img', {
						'src': '_images/green_go.png'
					}).inject(arrowAnchorEl);
					arrowAnchorEl.inject(tableDataCoursesEl);
				} else {
					tableDataCoursesEl.innerHTML = '&nbsp;';
				}                                       
				tableDataCoursesEl.inject(tableRowEl);

				// study guide link col
				// not displaying study guide at this point in time
				/*
				var tableDataStudyGuideTestEl = new Element('td');
				var arrowAnchorEl = new Element('a', {
					'href': ''
				});
				new Element('img', {
					'src': '_images/green_go.png'
				}).inject(arrowAnchorEl);
				arrowAnchorEl.inject(tableDataStudyGuideTestEl);
				tableDataStudyGuideTestEl.inject(tableRowEl);
				*/

				// add completed row to table body
				tableRowEl.inject(tableBodyEl);
			}

			// do the last row (apply bottom row styles)
			var lastRow = tableRows[tableRows.length - 1];
			if (tableRows.length % 2 == 0) {
				// if num of table rows is even, last row
				// will be the alternate row style
				tableRowEl = new Element('tr', {
					'class': 'studymat_altrow'
				});
			} else {
				// if num of table rows is odd, last
				// row be the default row style 
				// (same as first row)
				var tableRowEl = new Element('tr');
			}

			
			// exam title col
			var tableDataTitleEl = new Element('td', {
				'class': 'studymat_leftcol studymat_bottomrow'
			});
			tableDataTitleEl.innerHTML = lastRow['title'];
			tableDataTitleEl.inject(tableRowEl);

			// recommended credits col
			var tableDataCreditEl = new Element('td', {
				'class': 'studymat_bottomrow'
			});
			// add cap images for number of credits
			var numCredits = parseInt(lastRow['credit']);
			if (lastRow['creditType'] == 'u') {
				// use the diploma gif for upper baccalaureate credits
				for (var j = 0; j < numCredits; j++) {
					new Element('img', {
						'src'  : '_images/diploma.gif',
						'styles': {
							'margin': '0px 1px 0px 1px'
						}
					}).inject(tableDataCreditEl);
				}
			} else {
				// use the cap png for regular baccalaureate credits
				for (var j = 0; j < numCredits; j++) {
					new Element('img', {
						'src': '_images/cap.png'
					}).inject(tableDataCreditEl);
				}
			}
			new Element('br').inject(tableDataCreditEl);
			if (lastRow['creditType'] == 'u') {
				tableDataCreditEl.innerHTML += numCredits + ' Upper Baccalaureate';
			} else {
				tableDataCreditEl.innerHTML += numCredits + ' Baccalaureate';
			}
			tableDataCreditEl.inject(tableRowEl);

			// fact sheet download col   
			// can contain more than one factsheet link
			var tableDataFactSheetEl = new Element('td', {
			    'class': 'studymat_bottomrow'
			});
			if (tableRows[i]['factsheets'].length > 0) {
			    var factsheets = tableRows[i]['factsheets'];
			    for (var j = 0; j < factsheets.length; j++) {
			        new Element('a', {
						'href': factsheets[j].getAttribute('file'),
						'target':'_pdf'
					}).appendText(factsheets[j].getAttribute('title')).inject(tableDataFactSheetEl);
					var pdfAnchorEl = new Element('a', {
					    'href': factsheets[j].getAttribute('file'),
						'target':'_pdf'
					});
					new Element('img', {
						'src'   : '_images/pdf.gif',
						'border': '0'
					}).inject(pdfAnchorEl);
					pdfAnchorEl.inject(tableDataFactSheetEl);
					new Element('br').inject(tableDataFactSheetEl);
			    }
			    /*
				new Element('a', {
					'href': tableRows[i]['factsheet']
				}).appendText('Download').inject(tableDataFactSheetEl);
				var pdfAnchorEl = new Element('a', {
					'href': tableRows[i]['factsheet']
				});
				new Element ('img', {
					'src'   : '_images/pdf.gif',
					'border': '0'
				}).inject(pdfAnchorEl);
				pdfAnchorEl.inject(tableDataFactSheetEl);
				*/
			} else {
				tableDataFactSheetEl.innerHTML = '&nbsp;'
			}
			tableDataFactSheetEl.inject(tableRowEl);

			// practice test link col
		   	var tableDataPracticeTestEl = new Element('td', {
				'class': 'studymat_bottomrow'
			});
			if (lastRow['practiceTest'] != 'none') {
				var arrowAnchorEl = new Element('a', {
					'href': lastRow['practiceTest'],
					'target': '_ibtwin'
				});
				new Element('img', {
					'src': '_images/green_go.png'
				}).inject(arrowAnchorEl);
				arrowAnchorEl.inject(tableDataPracticeTestEl);
			} else {
				tableDataPracticeTestEl.innerHTML = '&nbsp;';
			}
			tableDataPracticeTestEl.inject(tableRowEl);

			// courses link col
			var tableDataCoursesEl = new Element('td', {
				'class': 'studymat_bottomrow'
			});
			if (lastRow['courses'] != 'none') {
				var arrowAnchorEl = new Element('a', {
					'href': lastRow['courses'],
					'target': '_ibtwin'
				});
				new Element('img', {
					'src': '_images/green_go.png'
				}).inject(arrowAnchorEl);
				arrowAnchorEl.inject(tableDataCoursesEl);
			} else {
			   	tableDataCoursesEl.innerHTML = '&nbsp;';
			}                                           
			tableDataCoursesEl.inject(tableRowEl);

			// study guide link col
			// not displaying study guide at this point in time
			/*
			var tableDataStudyGuideTestEl = new Element('td', {
				'class': 'studymat_bottomrow'
			});
			var arrowAnchorEl = new Element('a', {
				'href': ''
			});
			new Element('img', {
				'src': '_images/green_go.png'
			}).inject(arrowAnchorEl);
			arrowAnchorEl.inject(tableDataStudyGuideTestEl);
			tableDataStudyGuideTestEl.inject(tableRowEl);
			*/
			
			// add row to table body
			tableRowEl.inject(tableBodyEl);

			// done building table
			tableBodyEl.inject(tableEl);
			// set div's innerHTML to the new table's html
			$('studyMaterialsTable').innerHTML = '';
			tableEl.inject($('studyMaterialsTable'));
			// set <h3>'s header
			$('studyMaterialsHeader').innerHTML = examsHeader;
			

		} else {
			// bad http xml response
			return false;
		}
	}
}
