var currentArticleID = '';
var lastpage = '';
var tabItems = '';

/**
 * @author <a href="mailto:lee55@indiana.edu">Kenneth Lee</a>
 */
Ext.onReady(function() {
	/*
	 * DWRMetsObject.printJSON(successFunction);
	 * //DWRMetsObject.getTOC(successFunction); function successFunction(item){
	 * var json = item; var Tree = Ext.tree; var tree = new Tree.TreePanel({
	 * height: 400, width: 300, el: 'content', animate: true, enableDD: false,
	 * loader: new Tree.TreeLoader(), lines: true, selModel: new
	 * Ext.tree.MultiSelectionModel(), containerScroll: true, rootVisible: false
	 * }); // set the root node var root = new Tree.AsyncTreeNode({ text: 'TOC',
	 * draggable: false, id: 'source', children: json });
	 * tree.setRootNode(root); tree.render(); tree.expandAll(); }
	 */
	// ---------------------------------------------------------
	var tabs = new Ext.TabPanel({
		renderTo : 'tabs',
		width : 350,
		// height: 500,
		// autoScroll: true,
		autoHeight : true,
		activeTab : 0,
		frame : true,
		/* plain:true, */
		defaults : {
			autoHeight : true
		}
	});

	DWRMetsObject.getTab(function(obj) {
		var data = Ext.util.JSON.decode(obj);

		/* Search tab not ready yet, so only using first 2 tabs (Table of Contents, Article Description) */
		//for (var i = 0; i < data.tabs.length; i++) {
		for (var i = 0; i < 2; i++) {

			var newdiv = document.createElement('div');
			var divId = data.tabs[i].contentEl;
			newdiv.setAttribute('id', divId);
			document.getElementById('tabs').appendChild(newdiv);

			tabs.add({
				contentEl : data.tabs[i].contentEl,
				title : data.tabs[i].title,
				html : data.tabs[i].html
			}).show();
			tabs.setActiveTab(0);
		}

	});

	// var imageSize = Ext.get('imageSize');
	DWRMetsObject.getTocBySize(Ext.get("imageSize").dom.value, displayToc);
});

function displayToc(dataStr) {
	var output = '';
	var data = Ext.util.JSON.decode(dataStr);

	for (i = 0; i < data.toc.length; i++) {

		// remove white spaces for page id
		// data.toc[i].id = data.toc[i].id.replace(//,"");
		
		output += "<div id=div_" + data.toc[i].id + ">";
		output += "<a id=\"article_" + data.toc[i].id
				+ "\" href=\"#\" onclick=\"update('" + data.toc[i].id + "')\">"
				+ data.toc[i].title + "</a><br/>";

		if (data.toc[i].id.indexOf('VAA') >= 0) {

			output += data.toc[i].author;
			output += " (pp. " + data.toc[i].pages + ")<br/>";

			// render book reviews if any
			if (typeof data.toc[i].review != "undefined") {

				for (var j = 0; j < data.toc[i].review.length; j++) {

					// output += "<div style=\"margin-left:5px;
					// margin-right:3px; padding: 3px; border: 1px dashed
					// gray\">";
					output += data.toc[i].review[j].title;
					output += ", " + data.toc[i].review[j].author + "<br/>";
					// output += "</div><br/>";
				};
			}
		}
		output += "</div><br/>";

		// put the toc info to global variable data_toc for the use by page
		// navigation
		if (i == (data.toc.length - 1)) {
			lastpage = data.toc[i].lastPage;
		}
	}

	// determine if a user specifies an article to display
	var aid = Ext.get("article-id").dom.value;
	if (aid != '') {
		currentArticleID = aid;
		update(aid);
	} else {
		currentArticleID = data.toc[0].id;
		var currentPage = document.getElementsByName("pn")[0].value;

		// determine if page numbers comes from user's choice from the url
		if (currentPage != 1 && currentPage != '') {
			// handle if users specify a non-existent page
			if (currentPage > lastpage || currentPage < 1) {
				alert('Page doesn\'t exist');
				update(data.toc[0].id);
			} else {
				jumpPage(currentPage);
			}
		}
		// if user doesn't specify page nubmers in the url,
		// it will just set to page 1
		else {
			var pnbox = document.getElementsByName("pn");
			for (var i = 0; i < pnbox.length; i++) {
				pnbox[i].value = 1;
			};
			update(data.toc[0].id);
		}
	}

	divTOC = document.getElementById("toc").innerHTML = output;
	Ext.get('div_' + currentArticleID).dom.style.backgroundColor = "#cccccc";
}

function navigatePage(direction) {

	var id = parseInt(Ext.get("pn").dom.value);

	// determine navigation direction
	switch (direction) {
		case 'pn_fpage' :
			id = 1;
			break;
		case 'pn_ppage' :
			if (id != 1) {
				id = id - 1;
			}
			break;
		case 'pn_npage' :
			if (id != lastpage) {
				id = id + 1;
			}
			break;
		case 'pn_lpage' :
			id = lastpage;
			break;
	}

	// get page JSON
	DWRMetsObject.getPageBySize(id, Ext.get("imageSize").dom.value,
			currentArticleID, function(dataStr) {
				var data_page = Ext.util.JSON.decode((dataStr));

				// update page selection box
				changePageSelectBox(data_page);
				// update image
				changeImage(data_page);
				// update the back link				
			
				if (typeof data_page.article != "undefined") {
					// update div background
					changeDivBackground(data_page);
					updateCitation(data_page.article);
					if (data_page.article.id.indexOf("VAA") >= 0) {
						// enable the link
						Ext.get("linkBack").dom.href = "http://purl.dlib.indiana.edu/iudl/imh/"
								+ Ext.get("article-id").dom.value + "#" + data_page.page.pageId;
						Ext.get("linkBack").dom.innerHTML = "<< Back to full text";
					} else {
						// disalbe the link
						Ext.get("linkBack").dom.innerHTML = "";
					}
				} else {
					if (Ext.get("linkBack").dom.innerHTML != "") {
						Ext.get("linkBack").dom.href = "http://purl.dlib.indiana.edu/iudl/imh/"
								+ Ext.get("article-id").dom.value + "#" + data_page.page.pageId;
						Ext.get("linkBack").dom.innerHTML = "<< Back to full text";
					}		
				}				
				
			});
}

function jumpPage(pageNumber) {

	if (pageNumber.match(/\D|^\s*$/)
			|| ((pageNumber > lastpage) || (pageNumber < 1))) {
		alert('Please enter digits, \r\nor the valid page number');
	} else {
		DWRMetsObject.getPageBySize(pageNumber, Ext.get("imageSize").dom.value,
				currentArticleID, function(dataStr) {
					var data_page = Ext.util.JSON.decode((dataStr));

					// update page selection box
					changePageSelectBox(data_page);
					// update image
					changeImage(data_page);

					if (typeof data_page.article != "undefined") {
						// update div background
						changeDivBackground(data_page);
						// update the back link
						Ext.get('article-id').dom.value = data_page.article.id;
						if (data_page.article.id.indexOf("VAA") >= 0) {
							// enable the link
							Ext.get("linkBack").dom.href = "http://purl.dlib.indiana.edu/iudl/imh/"
									+ Ext.get("article-id").dom.value + "#" + data_page.page.pageId;
							Ext.get("linkBack").dom.innerHTML = "<< Back to full text";
						} else {
							// disalbe the link
							Ext.get("linkBack").dom.innerHTML = "";
						}
						updateCitation(data_page.article);
					}
				});
	}
}

// Update page with article information
function update(id) {
	// update the back link
	Ext.get('article-id').dom.value = id;


	// Getting article metadata through DWR and update page
	DWRMetsObject.getArticleBySize(id, Ext.get("imageSize").dom.value,
			function(dataStr) {

				var data_article = Ext.util.JSON.decode(dataStr);

				// update page selection box
				changePageSelectBox(data_article);
				// update image
				changeImage(data_article);
				// update div background
				changeDivBackground(data_article);

				var article_desc = '';

				// article_desc += '<b>ITEM DESCRIPTION</b><br/>';
				// article_desc += "id : " + data_article.article.id + "<br/>";
				if (typeof data_article.article.title != "undefined") {
					article_desc += "<b>Title:</b><br/> "
							+ data_article.article.title + "<br/>";
				}
				if (typeof data_article.article.author != "undefined") {
					article_desc += "<b>Author:</b><br/>"
							+ data_article.article.author + "<br/>";
				}
				if (typeof data_article.article.year != "undefined") {
					article_desc += "<b>Date:</b><br/>"
							+ data_article.article.year + "<br/>";
				}
				article_desc += "<b>Source:</b><br/>";
				article_desc += "<i>Indiana Magazine of History</i> ";
				if (typeof data_article.article.volume != "undefined") {
					article_desc += "Volume " + data_article.article.volume
							+ ", ";
				}
				if (typeof data_article.article.issue != "undefined") {
					article_desc += "Issue " + data_article.article.issue
							+ ", ";
				}
				if (typeof data_article.article.pages != "undefined") {
					article_desc += "pp. " + data_article.article.pages
							+ "<br/>";
				}
				// article_desc += "<b>Subjects:</b><br/>";
				if (typeof data_article.article.articleType != "undefined") {
					article_desc += "<b>Article Type:</b><br/> "
							+ data_article.article.articleType + "<br/>";
				}

				Ext.get('item_desc').dom.innerHTML = article_desc;

				updateCitation(data_article.article);
				
	if (id.indexOf("VAA") >= 0) {
		// enable the link
		Ext.get("linkBack").dom.href = "http://purl.dlib.indiana.edu/iudl/imh/"
				+ Ext.get("article-id").dom.value + "#" + data_article.page.pageId;
		Ext.get("linkBack").dom.innerHTML = "<< Back to full text";
	} else {
		// disalbe the link
		Ext.get("linkBack").dom.innerHTML = "";
	}				

			});

}

function updateCitation(articleData) {

	if (articleData.id.indexOf('VAA') >= 0) {
		var output = "";
		output += articleData.author;
		if (typeof articleData.author != "undefined" && articleData.author.length > 0) 
			output += ".";

		// render book reviews if any
		if (typeof articleData.review != "undefined") {

			for (var j = 0; j < articleData.review.length; j++) {
				output += ' "' + articleData.review[j].title + '"';
				output += " by ";
				for (var k = 0; k < articleData.review[j].author.length; k++) {
				    output += articleData.review[j].author[k];
				    if (k < articleData.review[j].author.length - 1) {
				    	output += ", ";
				    } 
				}
				if (j < articleData.review.length -1) {
					output += "; ";
				} else {
					output += ". ";
				}
			}
		} else {
			output += ' "' + articleData.title + '". ';
		}
		output += "<em>Indiana Magazine of History</em>, ";
		output += articleData.volume + ", " + articleData.issue;
		output += " (" + (1904 + parseInt(articleData.volume)) + "): "
				+ articleData.pages + ".";
		Ext.get('docDescription').dom.innerHTML = output;
	} else {
		var oid = Ext.get("metsnav-oid").dom.value;
		var regex = /VAA\d{4}-0*(\d+)-(\d)/;
		var result = oid.match(regex);
		source = "Indiana Magazine of History, Volume " + result[1]
				+ ", Issue " + result[2] + ".";
		Ext.get('docDescription').dom.innerHTML = source;
	}
}

function download() {
	var type = Ext.get("downloadType").dom.value;
	DWRMetsObject.download(currentArticleID, type, function(data) {
		window.open(data);
	});
	Ext.get('downloadType').dom.value = "";
}

function changeImageSize(size) {
	var sizeComboBox = document.getElementsByName("imageSize");
	for (var i = 0; i < sizeComboBox.length; i++) {
		sizeComboBox[i].value = size;
	};

	// get page JSON
	DWRMetsObject.getPageBySize(Ext.get("pn").dom.value,
			Ext.get("imageSize").dom.value, currentArticleID,
			function(dataStr) {
				var data_page = Ext.util.JSON.decode((dataStr));

				// update page selection box
				changePageSelectBox(data_page);
				// update image
				changeImage(data_page);
			});

	if (size == 'large') {
		Ext.get('displayNavigationLayout').dom.style.display = 'none';
		Ext.get('displayPageImageLayout').dom.style.width = '1000px';
	} else {
		Ext.get('displayNavigationLayout').dom.style.display = '';
		Ext.get('displayPageImageLayout').dom.style.width = '600px';
	}
}

// -------------------------------------------------------------
// internal functions

// update image
function changeImage(JSONObj) {
	Ext.get('article_image').dom.innerHTML = "<img src=\"" // +
			// data_page.page.imageURL
			// + " alt=\""
			// + data_page.page.imageText + "\"/>";
			+ JSONObj.page.imageURL + "\"/>";
}

// update pagination select box
function changePageSelectBox(JSONObj) {
	// getElementsByName will return an array containing all matched elements,
	// while getElementById just return an element with the unique id
	var pnbox = document.getElementsByName("pn");
	for (var i = 0; i < pnbox.length; i++) {
		pnbox[i].value = JSONObj.page.pageNumber;
	};
}

// update div background
function changeDivBackground(JSONObj) {
	Ext.get('div_' + currentArticleID).dom.style.backgroundColor = "#FFFFFF";
	Ext.get('div_' + JSONObj.article.id).dom.style.backgroundColor = "#cccccc";
	currentArticleID = JSONObj.article.id;
}
