
function loadSong(songId) {
        var http = false;
        if (navigator.appName == "Microsoft Internet Explorer") {
                http = new ActiveXObject("Microsoft.XMLHTTP");
        } else {
                http = new XMLHttpRequest();
        }
        http.open("GET", "/dkwebapps/getsong?songId=" + songId, true);
        http.onreadystatechange = function() {
                if (http.readyState == 4) {
                        if (http.status == 200) {
			var song = eval('(' + data + ')');
			openSong(song);
			}
			else {
				alert("Failed to load song - code " + http.status);
			}
		}
	}
	http.send(null);
}

function setSearchString(query) {
	if (query.length == 1 && activeSearchTabIndex == 1)
		query = '^' + query;
	document.getElementById("query").value = query;
}

function doSearch() {
	if (activeSearchTabIndex == 0)
		doDKSearch();
	else
		doZingSearch();
}


//DK search -------------------------------------------

var searchResult;
var orderBy = "name";
var pageSize = 6;

function doDKSearch() {
	var query = document.getElementById("query").value;
	if (!searchResult || query != searchResult.query || orderBy != searchResult.orderBy) {
		searchResult = new Object();
		searchResult.query = query;
		searchResult.entries = new Array();
		searchResult.size = 0;
		searchResult.numPages = 0;
		searchResult.currentPage = 0;
		searchResult.orderBy = orderBy;
		loadDKSearchResult(searchResult.currentPage, 1);
	}
	else if (typeof(searchResult.entries[searchResult.currentPage]) == 'undefined') {
		loadDKSearchResult(searchResult.currentPage, 1);
	}
	else if (searchResult.entries[searchResult.currentPage] == 'loading') {
	}
	else {
		updateDKSearchResult();
		return;
	}
	document.getElementById("search-result").innerHTML = "<span style='color: red'>Searching...</span>";
}

function loadDKSearchResult(pageNum, numPages) {
	for (var i=0; i<numPages; i++)
		searchResult.entries[pageNum+i] = 'loading';
	var query = searchResult.query;
	var orderBy = searchResult.orderBy;

        var http = false;
        if (navigator.appName == "Microsoft Internet Explorer") {
                http = new ActiveXObject("Microsoft.XMLHTTP");
        } else {
                http = new XMLHttpRequest();
        }
        http.open("GET", "/dkwebapps/songsearch?query=" + encodeURIComponent(query) + "&offset=" + pageNum*pageSize + "&limit=" + pageSize*numPages + "&orderBy=" + orderBy + "&t=" + new Date().getTime(), true);
        http.onreadystatechange = function() {
                if (http.readyState == 4) {
		if (http.status == 200) {
			var result = eval('(' + http.responseText + ')');
			if (searchResult.query == query && searchResult.orderBy == orderBy) {
				searchResult.size = result.size;
				searchResult.numPages = Math.ceil(result.size/pageSize);
				for (var i=0; i<numPages && i*pageSize<result.itemList.length && pageNum+i<searchResult.numPages; i++)
					searchResult.entries[pageNum+i] = result.itemList.slice(i*pageSize, Math.min((i+1)*pageSize, result.itemList.length));
				if (searchResult.currentPage >= pageNum && searchResult.currentPage < pageNum+numPages)
					updateDKSearchResult();
			}
		}}
	}
	http.send(null);
}

function updateDKSearchResult() {
	var itemsPerRow = pageSize/2;
	var html = new StringBuilder();
	html.append("<table class='layout'>");
	for (var row=0; row<2; row++) {
		html.append("<tr>");
		for (var col=0; col<itemsPerRow; col++) {
			var index = row*itemsPerRow+col;
			var item = searchResult.entries[searchResult.currentPage][index];
			if (item) {
				html.append("<td valign='top'><table class='item'>");
				html.append("<tr><td><a href='javascript:openDKSearchResult(").append(index).append(")'><img class='song-thumbnail' src='http://").append(contentServer).append("/thumbs/").append(item.id).append(".jpg'/></a></td></tr>");
				html.append("<tr><td>");
				html.append("<span class='songTitle'>").append(item.name);
				if (item.leadSinger)
					html.append(" - ").append(item.leadSinger);
				html.append("</span>");
				html.append("</td></tr>");
				html.append("</table></td>");
			}
		}
		html.append("</tr>");
	}
	html.append("</table>");
	document.getElementById("search-result").innerHTML = html;
	updateDKSearchPages();
	
	if (searchResult.currentPage+1 < searchResult.numPages && typeof(searchResult.entries[searchResult.currentPage+1]) == 'undefined')
		loadDKSearchResult(searchResult.currentPage+1, 5);
}

function updateDKSearchPages() {
	var resultSize = searchResult.size;
	var currentPage = searchResult.currentPage;
	var numPages = searchResult.numPages;
	var currentChapter = Math.floor(currentPage/5);
	var chapterSize = 5;
	
	var html = new StringBuilder();
	if (currentPage > 0)
		html.append("<a href='javascript:setDKSearchPage(").append(currentPage-1).append(")'>&lt;</a>");
	else
		html.append("<span>&lt;</span>");
	for (var i=currentChapter*chapterSize; i<(currentChapter+1)*chapterSize; i++)
		if (i < numPages) {
			if (currentPage == i)
				html.append("<span><b>").append(i+1).append("</b></span>");
			else
				html.append("<a href='javascript:setDKSearchPage(").append(i).append(")'>").append(i+1).append("</a>");
		}
		else
			html.append("<span>&nbsp;</span>");
	if (currentPage+1 < numPages)
		html.append("<a href='javascript:setDKSearchPage(").append(currentPage+1).append(")'>&gt;</a>");
	else
		html.append("<span>&gt;</span>");
	document.getElementById("search-pager").innerHTML = html;
	document.getElementById("search-stats").innerHTML = (currentPage*pageSize+1) + "-" + Math.min(currentPage*pageSize+pageSize, resultSize) + " of " + resultSize;
}

function openDKSearchResult(index) {
	openSong(searchResult.entries[searchResult.currentPage][index]);
}

function setDKSearchPage(page) {
	if (page == searchResult.currentPage)
		alert("FATAL");
	searchResult.currentPage = page;
	doSearch();
}


//zing search --------------------------------------------------

var zingSearchResult;
var zingOrderBy = "title";
var zingPageSize = 6;

function doZingSearch() {
	var query = document.getElementById("query").value;
	if (!zingSearchResult || query != zingSearchResult.query || zingOrderBy != zingSearchResult.orderBy) {
		zingSearchResult = new Object();
		zingSearchResult.query = query;
		zingSearchResult.entries = new Array();
		zingSearchResult.size = 0;
		zingSearchResult.numPages = 0;
		zingSearchResult.currentPage = 0;
		zingSearchResult.orderBy = zingOrderBy;
		loadZingSearchResult(zingSearchResult.currentPage, 1);
	}
	else if (typeof(zingSearchResult.entries[zingSearchResult.currentPage]) == 'undefined') {
		loadZingSearchResult(zingSearchResult.currentPage, 1);
	}
	else if (zingSearchResult.entries[zingSearchResult.currentPage] == 'loading') {
	}
	else {
		updateZingSearchResult();
		return;
	}
	document.getElementById("search-result").innerHTML = "<span style='color: red'>Searching...</span>";
}

function loadZingSearchResult(pageNum, numPages) {
	for (var i=0; i<numPages; i++)
		zingSearchResult.entries[pageNum+i] = 'loading';
	var query = zingSearchResult.query;
	var orderBy = zingSearchResult.orderBy;

        var http = false;
        if (navigator.appName == "Microsoft Internet Explorer") {
                http = new ActiveXObject("Microsoft.XMLHTTP");
        } else {
                http = new XMLHttpRequest();
        }
        http.open("GET", "/dkwebapps/searchZingSongs?query=" + encodeURIComponent(query) + "&offset=" + pageNum*zingPageSize + "&limit=" + zingPageSize*numPages + "&orderBy=" + orderBy + "&t=" + new Date().getTime(), true);
        http.onreadystatechange = function() {
                if (http.readyState == 4) {
		if (http.status == 200) {
			var result = eval('(' + http.responseText + ')');
			if (zingSearchResult.query == query && zingSearchResult.orderBy == orderBy) {
				zingSearchResult.size = result.size;
				zingSearchResult.numPages = Math.ceil(result.size/zingPageSize);
				for (var i=0; i<numPages && i*zingPageSize<result.itemList.length && pageNum+i<zingSearchResult.numPages; i++)
					zingSearchResult.entries[pageNum+i] = result.itemList.slice(i*zingPageSize, Math.min((i+1)*zingPageSize, result.itemList.length));
				if (zingSearchResult.currentPage >= pageNum && zingSearchResult.currentPage < pageNum+numPages)
					updateZingSearchResult();
			}
		}}
	}
	http.send(null);
}

function updateZingSearchResult() {
	var html = new StringBuilder();
	html.append("<table class='zing-layout'>");
	for (var index=0; index<6; index++) {
		if (index%2 == 0)
			html.append("<tr class='even'>");
		else
			html.append("<tr class='odd'>");
		var item = zingSearchResult.entries[zingSearchResult.currentPage][index];
		if (item) {
			html.append("<td>");
			html.append("<a class='zing-song-title' href='javascript:openZingSearchResult(").append(index).append(")'>").append(item.title).append("</a><br/>");
			html.append("<span class='zing-lyric-preview'>").append(item.lyricPreview).append("</span>");
			html.append("</td>");
			html.append("<td>");
			html.append("<span class='zing-singer'>").append(item.singer).append("</span><br/>");
			html.append("<span class='zing-song-type'>").append(item.type).append("</span>");
			html.append("</td>");
		}
		html.append("</tr>");
	}
	html.append("</table>");
	document.getElementById("search-result").innerHTML = html;
	updateZingSearchPages();
	
	if (zingSearchResult.currentPage+1 < zingSearchResult.numPages && typeof(zingSearchResult.entries[zingSearchResult.currentPage+1]) == 'undefined')
		loadZingSearchResult(zingSearchResult.currentPage+1, 3);
}

function updateZingSearchPages() {
	var resultSize = zingSearchResult.size;
	var currentPage = zingSearchResult.currentPage;
	var numPages = zingSearchResult.numPages;
	var currentChapter = Math.floor(currentPage/5);
	var chapterSize = 5;
	
	var html = new StringBuilder();
	if (currentPage > 0)
		html.append("<a href='javascript:setZingSearchPage(").append(currentPage-1).append(")'>&lt;</a>");
	else
		html.append("<span>&lt;</span>");
	for (var i=currentChapter*chapterSize; i<(currentChapter+1)*chapterSize; i++)
		if (i < numPages) {
			if (currentPage == i)
				html.append("<span><b>").append(i+1).append("</b></span>");
			else
				html.append("<a href='javascript:setZingSearchPage(").append(i).append(")'>").append(i+1).append("</a>");
		}
		else
			html.append("<span>&nbsp;</span>");
	if (currentPage+1 < numPages)
		html.append("<a href='javascript:setZingSearchPage(").append(currentPage+1).append(")'>&gt;</a>");
	else
		html.append("<span>&gt;</span>");
	document.getElementById("search-pager").innerHTML = html;
	document.getElementById("search-stats").innerHTML = (currentPage*zingPageSize+1) + "-" + Math.min(currentPage*zingPageSize+zingPageSize, resultSize) + " of " + resultSize;
}

function openZingSearchResult(index) {
	openZingSong(zingSearchResult.entries[zingSearchResult.currentPage][index]);
}

function setZingSearchPage(page) {
	if (page == zingSearchResult.currentPage)
		alert("FATAL");
	zingSearchResult.currentPage = page;
	doSearch();
}


//search tabs -----------------------------------------

var searchTabs = [
	{title:"VOL. 1"},
	{title:"VOL. 2"}
];
var activeSearchTabIndex = 0;

function selectSearchTab(index) {
	if (index != activeSearchTabIndex) {
		activeSearchTabIndex = index;
		updateSearchTabs();
		doSearch();
	}
}

function updateSearchTabs() {
	var html = new StringBuilder();
	for (var i=0; i<searchTabs.length; i++) {
		if (i == activeSearchTabIndex)
			html.append("<span class='active'");
		else
			html.append("<span class='inactive'");
		html.append(" onMouseDown='selectSearchTab(").append(i).append(")'>").append(searchTabs[i].title);
		html.append("</span>");
	}
	document.getElementById("search-tabs").innerHTML = html.toString();
}
