/*
Graham Bradley
[www.grahambradley.com]
*/


//Base URL.
var baseURL = "http://www.grahambradley.com/";


//Current project and current filter.
var currentProject = "no project";
var currentFilter = "";


//Configure page.
function configurePage() {
	
	//Listen for external change and internal change.
	$.address.externalChange(function(event) {
		externalChangeHandler();
	}).internalChange(function(event) {
		internalChangeHandler();
	})
	
	//Hide project information.
	$(".projectInformation").hide();
	
	//Close project details.
	closeProjectDetails();
	
	//Handle mouse overs in the project grid by hiding thumbnail and showing information.
	$(".singleProject").mouseover(function () {
		$(this).children(".projectThumbnail").hide();
		$(this).children(".projectInformation").show();
	});
	
	//Handle mouse outs in the project grid by hiding information and showing thumbnail.
	$(".singleProject").mouseout(function () {
		$(this).children(".projectInformation").hide();
		$(this).children(".projectThumbnail").show();
	});
	
}


//External address change handler.
function externalChangeHandler() {
	
	//Clean address and update state.
	cleanAddress();
	updateState();
	
	//Scroll to the top of the page.
	$("html").animate({scrollTop:0}, "slow");
	$("body").animate({scrollTop:0}, "slow");
	
}


//Internal address change handler.
function internalChangeHandler() {
	
	//Update state.
	updateState();
	
	//Scroll to the top of the page.
	$("html").animate({scrollTop:0}, "slow");
	$("body").animate({scrollTop:0}, "slow");
	
}


//Clean address.
function cleanAddress() {
	
	//Retrieve address information.
	var fullPath = $.address.value();
	var addressComponents = $.address.pathNames();
	var addressFilter = addressComponents[0];
	var addressProject = "graham_" + addressComponents[1] + "_" + addressComponents[2] + "_" + addressComponents[3];
	
	//If deep link is missing or invalid, replace URL.
	if ("/" == fullPath || validateFilter(addressFilter) == false) {
		location.replace(baseURL + "#/all");
	} else if (addressComponents.length > 1 && validateProject(addressFilter, addressProject) == false) {
		location.replace(baseURL + "#/" + addressFilter);	
	} else if (addressComponents.length > 4) {
		location.replace(baseURL + "#/" + addressFilter + "/" + addressComponents[1] + "/" + addressComponents[2] + "/" + addressComponents[3])	
	}
	
}


//Update state. ***ADDRESS MUST BE CLEAN***
function updateState() {
	
	//Retrieve address information.
	var addressComponents = $.address.pathNames();
	var addressFilter = addressComponents[0];
	if (1 == addressComponents.length) {
		var addressProject = "no project";	
	} else {
		var addressProject = "graham_" + addressComponents[1] + "_" + addressComponents[2] + "_" + addressComponents[3];
	}
	
	//Filter projects if necessary.
	if (currentFilter != addressFilter) {
		filterProjects(addressFilter);
	}
	
	//Display project or close project if necessary.
	if (currentProject != addressProject) {
		if ("no project" == addressProject)	{
			closeProjectDetails();	
		} else {
			displayProjectDetails(addressProject);
		}
	}
	
}


//Update page navigation.
function updatePageNav(pageTitle) {
	
	//Set default color for all links.
	$(".singlePageLink").css("color", "#000000");
	
	//Iterate over large tag links.
	$(".singlePageLink").each(function(index) {
		
		//If link contents match current filter, update link css.
		if ($(this).children("a").html().toLowerCase() == pageTitle) {
			$(this).css("color", "#FF0000");
		}
		
	});
	
}


//Update tag navigation.
function updateTagNav() {
	
	//Set default color for all links.
	$(".largeTagLink").css("color", "#999999");
	
	//Iterate over large tag links.
	$(".largeTagLink").each(function(index) {
		
		//If link contents match current filter, update link css.
		if ($(this).children("a").html().toLowerCase() == currentFilter) {
			$(this).css("color", "#000000");
		}
		
	});
	
}


//Validate filter. Arguments -- Tag Name (string).
function validateFilter(tagName) {
	
	//Look up filter in JSON data. Account for absence of "all" filter in the JSON data. Return true if found.
	if (projectsByTagJSON[tagName] || tagName == "all") {
		return true;
	}
	return false;
	
}


//Validate project. Arguments -- Tag Name (string), Project ID (string). *** FILTER MUST BE VALID ***
function validateProject(tagName, projectID) {
	
	//Look up project in JSON data. Return true if found.
	for (var i = 0; i < projectsByTagJSON[tagName].length; i++) {
		if (projectsByTagJSON[tagName][i] == projectID) {
			return true;
		}
	}
	return false;
	
}


//Filter projects. Arguments -- Tag Name (string)
function filterProjects(tagName) {
	
	//Hide all projects.
	$(".singleProject").hide();
	
	//Display all projects that match filter.
	var selectedProjects = projectsByTagJSON[tagName];
	for (var i = 0; i < selectedProjects.length; i++) {
		var projectSelector = "#" + selectedProjects[i];
		$(projectSelector).show();
	}
	
	//Set current filter and update tag navigation.
	currentFilter = tagName;
	updateTagNav();
	
}


//Close project details.
function closeProjectDetails() {
	
	//Hide project details and project details divider. Hide and empty project details link.
	$("#projectDetails").hide();
	$("#projectDetailsDivider").hide();
	$("#projectDetailsLink").hide();
	$("#projectDetailsLink").empty();
	
	//Set current project.
	currentProject = "no project";
	
}


//Display project details. Arguments -- Project ID (string).
function displayProjectDetails(projectID) {
	
	//Retrieve project information from HTML.
	var projectSelector = "#" + projectID;
	var projectTitle = $(projectSelector).children(".projectInformation").children(".projectTitle").children("a").html();
	var projectDate = $(projectSelector).children(".projectInformation").children(".projectDate").html();
	var projectTagsHTML = $(projectSelector).children(".projectInformation").children(".projectTags").html();
	
	//Rerieve project description and link information from JSON data.
	var projectDescription = projectDetailsJSON[projectID]["description"];
	var projectLinkData = projectDetailsJSON[projectID]["link"];
	
	//Create image HTML.
	var projectImagesHTML = "";
	var projectImagesData = projectDetailsJSON[projectID]["images"];
	for (var i = 0; i < projectImagesData.length; i++) {
		projectImagesHTML += "<div class=\"projectDetailsImage\"><img src=\"projects/" + projectID + "/images/" + projectImagesData[i] + "\" /></div>"
	}
	
	//Insert project information into HTML.
	$("#projectDetailsTitle").html(projectTitle);
	$("#projectDetailsDate").html(projectDate);
	$("#projectDetailsDescription").html(projectDescription);
	if ("NO" == projectLinkData) {
		$("#projectDetailsLink").empty();
		$("#projectDetailsLink").hide();
	} else {
		var projectLinkHTML = "<span class=\"projectDetailsLink\"><a href=\"" + projectLinkData + "\" target=\"_blank\">Open Website</a></span>";
		$("#projectDetailsLink").html(projectLinkHTML);
		$("#projectDetailsLink").show();
	}
	$("#projectDetailsTags").html(projectTagsHTML);
	$("#projectDetailsImages").html(projectImagesHTML);
	
	//Show project details. Show project details divider.
	$("#projectDetails").show();
	$("#projectDetailsDivider").show();
	
	//Set current project, check address, and scroll to the top.
	currentProject = projectID;
	
}


//Handle internal request for filtering. Arguments -- Tag Name (string). ***FILTER MUST BE VALID***
function requestFiltering(tagName) {
	
	//Update address to reflect requested state.
	$.address.value(tagName);
	
}


//Handle internal request for project details. Arguments -- Project ID (string). ***PROJECT ID MUST BE VALID***
function requestProjectDetails(projectID) {
	
	//Break apart projectID into separate components.
	var projectComponents = projectID.split("_");
	
	//Update address to reflect requested state.
	$.address.value(currentFilter + "/" + projectComponents[1] + "/" + projectComponents[2] + "/" + projectComponents[3]);
	
}


//Handle internal request for project details close.
function requestCloseProjectDetails() {

	//Update address to reflect requested state.
	$.address.value(currentFilter);
	
}





