// General Notes and Questions

// **************************************** Globals

var daysCookie = 7;
var currentPage;
var photoCurrent;
var aAlbumIDs;
var aAlbumsToQuery;
var aPhotos;
var aPhotosSorted;
var nItemsPerPage;

/**
 * Document loaded
 */
$(document).ready(function() {

	// Define functions to UI elements
	build();

	// Initialize viewer
	init();
	
});

function init() {
	
	// Defaults
	var defaultItemsIndex = 1;
	
	// Initialize vars
	aAlbumIDs = new Array();
	aPhotos = new Array();

	// Restore cookied state
	// Future upgrade: Allow complex url's specifying these parameters (overrides cookies)
	$("#selector_decade").attr({selectedIndex:(readCookie("decade"))?readCookie("decade"):0});
	$("#selector_sort").attr({selectedIndex:(readCookie("sort"))?readCookie("sort"):0});
	$("#selector_items").attr({selectedIndex:(readCookie("items"))?readCookie("items"):defaultItemsIndex});
	
	nItemsPerPage = getItemsPerPage();
	currentPage = (readCookie("currentPage"))?readCookie("currentPage"):0;
	
	// Disable search button when field is blank
	updateSearchButton();
	
	// Get album data
	retrieveAlbumIDs();
	
}

// **************************************** Public Methods

function drawPage(nPage) {
	// Record state
	currentPage = nPage;
	createCookie("currentPage",currentPage);
  
	// Empty pagination div
	$('.pagination').empty();

	$("#feed").html("");
	var s = "";
	var c = "";
	
	var nThumbnail = 1;
		
	if (aPhotosSorted.length > 0) {
	
		
		var nStart = currentPage*getItemsPerPage();
		var nEnd = Math.min(nStart + getItemsPerPage(),aPhotosSorted.length);
		
		if (aPhotosSorted.length > 1) {
			c = c.concat("<p>Items " + String(nStart+1) + " - " + String(nEnd) + " (" + aPhotosSorted.length + " total)</p>");
		} else {
			c = c.concat("<p>One item found.</p>");
		}

		for (var i=nStart;i<nEnd;i++) {
			s = s.concat("<div class='element'><p class='thumbnail'>")
			// VERY IMPORTANT '?imgmax=800' must be tagged on the end of the url to allow embed and stop google server denying the request
			s = s.concat("<a href='"+ aPhotosSorted[i].getImage().url +"?imgmax=800' class='thickbox' rel='gallery' name='"+ aPhotosSorted[i].getCaption() + "'>")
			s = s.concat("<img src='" + aPhotosSorted[i].getThumbnails()[nThumbnail].url + "' />")
			s = s.concat("</a>")
		  s = s.concat("</p><p class='caption'>",parseCaption(aPhotosSorted[i].getCaption()),"</p></div>");
		}
		
	} else {
		s = "<p>No result found. Try broadening your search.</p>"
	}
	
	$("#resultsCount").html(c);
    $("#feed").html(s);
  
    paginate();
}

function nextPage() {
	var n = (currentPage < getPages())?currentPage+1:currentPage;
	drawPage(n);
}

function prevPage() {
	var n = (currentPage > 0)?currentPage-1:currentPage;
	drawPage(n);
}

function parseCaption(s) {
  var pattern = / - /g;
  return s.replace(pattern,"<br />");
}



// ******************************************************************************************** Getters / Setters

function getDecade() {
	return $("#selector_decade").attr("value");
}

function getSortBy() {
	return $("#selector_sort").attr("value");
}

function getItemsPerPage() {
	return ($("#selector_items").attr("value") == "all")?aPhotos.length:Number($("#selector_items").attr("value"));
}

function getPages() {
	var m = aPhotos.length;
	var n = getItemsPerPage();
	return Math.ceil(m/n);
}

// ******************************************************************************************** Handlers

function handleAlbumQuery(data) {
	var entries = data.feed.entry;
	for (var i=0;i<entries.length;i++) {
		aAlbumIDs.push(data.feed.entry[i].gphoto$id.$t);
	}
	retrievePhotos();
}

function handlePhotos(data) {
	var nResults = Number(data.feed.openSearch$totalResults.$t);
	if (nResults > 0) {
		var entries = data.feed.entry;
		for (var i=0;i<entries.length;i++) {
			aPhotos.push(new Photo(data.feed.entry[i]));
		}
	}
	retrievePhotosR();
}

function handleDecadeChange(newDecade) {
	decade = newDecade;
	retrievePhotos();
}

function handleSortChange() {
	sort(0);
}

function handleItemsPerPageChange() {
	var newCurrentPage = Math.floor(currentPage*nItemsPerPage/getItemsPerPage());
	nItemsPerPage = getItemsPerPage();
	drawPage(newCurrentPage);
}

function handleSearch() {
	retrievePhotos();
}


// ********************************************************************************** Helper Methods

/**
 * After a page has been drawn, update the pagination interface.
 */
function paginate() {

	// Create Pager Div
    var divPager = $('<div class="pager"></div>');
    
    // Create Page Number Sequence
    
    var nShow = 10;
    var nStart = Math.max(currentPage-Math.floor(nShow/2),0);
    var nEnd = Math.min(nStart+nShow,getPages());
    
    if (nEnd-1 > nStart) {
		for (var i=nStart; i<nEnd; i++) {
		  var thisClass = (i == currentPage)?"page-number active":"page-number";	
			
		  $('<span class="' + thisClass + '">' + (i + 1) + '</span>').bind('click', {'newPage':i},function(event) {
			if (event.data['newPage'] != currentPage) {
				drawPage(event.data['newPage']);
			}
		  }).appendTo(divPager);
		}
		
		// Create the Next and Back Buttons
		
		if (currentPage > 0) {
			 var prev = $('<span class="prev-page">prev</span>').click(function(event){ prevPage(); }).prependTo(divPager);
		}
		
		if (currentPage < getPages()-1) {
			var next = $('<span class="next-page">next</span>').click(function(event){ nextPage(); }).appendTo(divPager);
		}
	   
		$('.pagination').html(divPager);
    }    

    // Remove Loader Icon
    $('.element').css('background', 'none');

    // Init Thickbox
    thickbox_init();
    
}

function build() {

	$("#selector_decade").change(function() {
		createCookie("decade",this.selectedIndex,daysCookie);
		handleDecadeChange(this.options[this.selectedIndex].value);
	});

	$("#selector_sort").change(function() {
		createCookie("sort",this.selectedIndex,daysCookie);
		handleSortChange(this.options[this.selectedIndex].value);
	});

	$("#selector_items").change(function() {
		createCookie("items",this.selectedIndex,daysCookie);
		handleItemsPerPageChange(this.options[this.selectedIndex].value);
	});

	// Note: This doesn't work well.
	// The change event only occurs after the input field loses focus.
	
	
	$("input#search").change(function() {
		updateSearchButton();
				
		if (this.value == "") {
			handleSearch();
		}
	});

	$("#searchButton").click(function() {
		handleSearch();
	});

}


/**
 * Initial query to retrieve album id's
 */
function retrieveAlbumIDs() {
	$("#resultsCount").html("<p>Loading albums...</p>");
    $.getJSON("http://picasaweb.google.com/data/feed/api/user/gallery.frankbowling/?kind=album&access=public&alt=json&callback=?",handleAlbumQuery);    
}

function retrievePhotos() {
	
	// Determine which album(s) to query
	if (getDecade() == "all") {
		aAlbumsToQuery = aAlbumIDs.slice();
	} else if (Number(getDecade()) < 1990) {
		aAlbumsToQuery = new Array(aAlbumIDs[0]);
	} else {
		aAlbumsToQuery = new Array(aAlbumIDs[1]);
	}
	
	$("#resultsCount").html("<p>Retrieving images...</p>");
	
	// Clear photo array
	aPhotos = new Array();

	retrievePhotosR();
}

function retrievePhotosR() {	
	
	if (aAlbumsToQuery.length > 0) {
		var id = aAlbumsToQuery.pop();
		
		// If search box has entry, include in query
		var sQ = ($("#search").attr("value") == "")?"":"&q=" + $("#search").attr("value");
		
		// If decade is other than "all", refine by tag
		var sT = (getDecade() == "all")?"":"&tag=" + getDecade();
		
		//Something CRAZY is happening
		$.getJSON("http://picasaweb.google.com/data/feed/api/user/gallery.frankbowling/albumid/" + id + "/?kind=photo&access=public&alt=json&callback=?" + sQ + sT,handlePhotos);
		//$.getJSON("http://picasaweb.google.com/data/feed/api/user/gallery.frankbowling/albumid/" + id + "/?kind=photo&alt=json&callback=?",handlePhotos);
		
	} else {
		var nPage = (currentPage >= getPages())?0:currentPage;
		sort(nPage);
	}

}


function updateSearchButton() {
	// If search field is empty, disable button
	// Note: Disabled because update only occurs when text field blurs (clunky)
	/*
	$("#search").each(function() {
		var disabled = (this.value == "");
		$("#searchButton").each(function(){ this.disabled = disabled; });
	});
	*/
}

function sort(nPage) {
	// Sort photos (by year or title)
	aPhotosSorted = aPhotos.sort((getSortBy() == "title")?compareByTitle:compareByYear);
	drawPage(nPage);
}

// Sorting functions
// Use Array.sort(function)

function compareByYear(photo1,photo2) {
	var x;
	if (photo1.getYear() < photo2.getYear()) {
		x = -1;
	} else if (photo1.getYear() > photo2.getYear()) {
		x = 1;
	} else {
		x = 0;
	}
	return x;
}

function compareByTitle(photo1,photo2) {
	var x;
	if (photo1.getCaption().toLowerCase() < photo2.getCaption().toLowerCase()) {
		x = -1;
	} else if (photo1.getCaption().toLowerCase() > photo2.getCaption().toLowerCase()) {
		x = 1;
	} else {
		x = 0;
	}
	return x;
}


