//array -> object covertor
function oc(a)
{
  var o = {};
  for(var i=0;i<a.length;i++)
  {
    o[a[i]]='';
  }
  return o;
}

$(document).ready(function(){	
	
	//placeholder variables
	var authorArr = [], subjectArr = [];
	
	//$elements
	var $selTitle = $("#bookGallery .selectTitle select");
	var $selSubject = $("<select>").appendTo("#bookGallery .selectSubject");
	var $selAuthor = $("<select>").appendTo("#bookGallery .selectAuthor");
	var $sources = $("#bookGallery .bookList li");
	var $results = $("#bookGallery .resultsList");
	var $disclaimer = $("#bookGallery .disclaimer");
	
	//results formatter
	function formatResults($wrap,perRow){
		$wrap.find("li").each(function(i){
			var count = i+1;
			$(this).addClass("result"+count);
			if ((parseInt(count)%perRow) == 0){ 
				$("<div class='clr'/>").insertAfter($(this));
			}
		});
	}
	
	//sort&insert
	function sortInsert($wrap,$li){
		var $allResults = $wrap.find("li");
		var matchTitle = $li.find("span.title").text();
		matchTitle = jQuery.trim(matchTitle);

		if ($allResults.length == 0){
			$li.clone().appendTo($wrap);
		}
		$allResults.each(function(j){
			var loopTitle = $(this).find("span.title").text();
			loopTitle = jQuery.trim(loopTitle);
			if ( matchTitle < loopTitle ) {
				$li.clone().insertBefore($(this));
				return false;
			} else if ( j == $allResults.length - 1 ) {
				$li.clone().appendTo($wrap);
			} 
		});
	}
	
	//generate results
	function createResults($sources,$results,matchString,type) {
		var $title = $("<h2/>").appendTo($results);
		$("<span/>").appendTo($title).text(matchString);
		var $resultSet = $("<ul class='resultSet'/>").appendTo($results)
		$sources.each(function(i){
			var $li = $(this);
			var isMatch = false;
			switch(type) {
				case 'title':
				var titleFirst = $li.find("span.title").text().charAt(0).toLowerCase();
				var matchFirst = matchString.charAt(0).toLowerCase();
				var matchLast = matchString.charAt(matchString.length - 1).toLowerCase();
				isMatch = ((titleFirst >= matchFirst) && (titleFirst <= matchLast));
				break;
			
				case 'subject':
				var matchArray = $li.find("a").attr("ref");
				matchArray = (typeof matchArray=="undefined") ? ["Unknown"] : matchArray.split("|");
				for (var i=0;i<matchArray.length;i++) {
					isMatch = ( matchString == jQuery.trim(matchArray[i]) );
					if (isMatch){break};
				}
				break;
				
				case 'author':
				isMatch = ( matchString == $li.find("span.author").text() );
				break;
				
				default:
				isMatch = false;

			}
			if (isMatch) {
				sortInsert($resultSet,$li);
			}
		});
		formatResults($resultSet,3);
	}
	
	//generate pulldowns
	$("#bookGallery div.bookSelect").eq(0).css("display","block");
	
	$sources.each(function(){
		var thisSubjects = $(this).find("a").attr("ref");
		var thisAuthor = $(this).find("span.author").text();
		
		thisSubjects = (typeof thisSubjects=="undefined") ? ["Unknown"] : thisSubjects.split("|");
		thisAuthor = (typeof thisAuthor=="undefined") ? "Unknown" : thisAuthor;
		
		for (var i=0;i<thisSubjects.length;i++) {
			var currSubject = jQuery.trim(thisSubjects[i]);
			if (!(currSubject in oc(subjectArr))) {
				subjectArr.push(currSubject);
			}
		}		
		
		if (!(thisAuthor in oc(authorArr))) {
			authorArr.push(thisAuthor);
		}
	});
	
	subjectArr.sort();
	$("<option value='' selected='selected'>Select a subject...</option>").prependTo($selSubject);
	for(var i=0;i<subjectArr.length;i++) {
		$("<option />").text(subjectArr[i]).val(subjectArr[i]).appendTo($selSubject);
	}
	$("<option value='viewAll'>View All</option>").appendTo($selSubject);
	
	authorArr.sort();
	$("<option value='' selected='selected'>Select the author's last name...</option>").prependTo($selAuthor);
	for(var i=0;i<authorArr.length;i++) {
		$("<option />").text(authorArr[i]).val(authorArr[i]).appendTo($selAuthor);
	}
	$("<option value='viewAll'>View All</option>").appendTo($selAuthor);
	
	//Title dropdown
	$selTitle.change(function(){
		$disclaimer.hide();
		var sel = this.value;
		if (sel != '') {
			$selSubject.find("option").eq(0).attr('selected','selected');
			$selAuthor.find("option").eq(0).attr('selected','selected');
			$results.empty();
			createResults($sources,$results,sel,'title');
			if ($results.find("li").length == 0) {
				$results.append("<div class='noResults'>There are no books within this title range</div>");
			} else {
				$disclaimer.show();
			}
			
		}
	});
	
	//Subject dropdown
	$selSubject.change(function(){
		$disclaimer.hide();
		var sel = this.value;
		if (sel != '') {
			$selTitle.find("option").eq(0).attr('selected','selected');
			$selAuthor.find("option").eq(0).attr('selected','selected');
			$results.empty();
			if (sel == 'viewAll') {
				for(var i=0;i<subjectArr.length;i++) {
					createResults($sources,$results,subjectArr[i],'subject');
				}
			} else {
				createResults($sources,$results,sel,'subject');
			}
		}
		$disclaimer.show();
	});
	
	//Author dropdown
	$selAuthor.change(function(){
		var sel = this.value;
		if (sel != '') {
			$selTitle.find("option").eq(0).attr('selected','selected');
			$selSubject.find("option").eq(0).attr('selected','selected');
			$results.empty();
			if (sel == 'viewAll') {
				for(var i=0;i<authorArr.length;i++) {
					createResults($sources,$results,authorArr[i],'author');
				}
			} else {
				createResults($sources,$results,sel,'author');
			}
		}
		$disclaimer.show();
	});
	
	//Filter Tabs
	$("#bookGallery .filterNav a").each(function(i){
		$(this).click(function(){
			$disclaimer.hide();
			$results.empty();
			$("#bookGallery .filterNav li").removeClass("curr");
			$("#bookGallery div.bookSelect").css("display","none");
			$("#bookGallery div.bookSelect").eq(i).css("display","block");
			$(this).parents("li").addClass("curr");
			return false;
		});
	});
});

