$(document).ready(setup);

var $imageviewer;
var $imagemessage;
var $displayimage;
var $gallery;

var $thumbnails;
var $images;
var $folders;
var $files;
var $articles;
var $hrefs;

var pageNumber = 0;
var firstItem;
var lastItem;
var viewModeClass = "";
var $displayList;

var $imagesOnly;
var $foldersOnly;
var $articlesOnly;
var $hrefsOnly;
var $filterBox;

var $previousPage;
var $nextPage;

var $backTool;
var $tileView;
var $iconView;
var $listView;
var $filterTool;

var pagination = true;

function setup()
{
	createJQueryObjects();
	createChildren();
	attachEvents();
	
	paginate();
}

function createJQueryObjects()
{
	$permalink = $('#permalink');
	$imageviewer = $('#imageviewer');
	$gallery = $('div.gallery');
	
	$thumbnails = $('a.thumbnail', $gallery);
	$folders = $('a.thumbnail.folder', $gallery);
	$images = $('a.thumbnail.image', $gallery);
	$files = $('a.thumbnail.file', $gallery);
	$articles = $('a.thumbnail.article', $gallery);
	$hrefs = $('a.thumbnail.href', $gallery);
	
	$displayList = $thumbnails;
	
	if($.cookie) viewModeClass = $.cookie('viewModeClass');
}

function createChildren()
{
	$galleryBreadcrumbs = $('<div class="breadcrumbs"></div>');
	$galleryActionsTop = $('<div class="actionsbox"></div>');
	$galleryActionsBottom = $('<div class="actionsbox"></div>');

	createBreadcrumbs($galleryBreadcrumbs);

	$previousPage = $('<a class="action previousPage">&laquo; prev</a>');
	$nextPage = $('<a class="action nextPage">next &raquo;</a>');
	$paginationLabel = $('<a class="action paginationLabel">Pages</a>');

	$filterBox = $('<input class="action filterBox" name="filterBox" value="" />').css("width", "200px");
	$foldersOnly = $("div.tool.folders");
	$imagesOnly = $("div.tool.images");
	$articlesOnly = $("div.tool.articles");
	$hrefsOnly = $("div.tool.hrefs");
	
	$backTool = $("a.tool.parent");
	$tileView = $("a.tool.tileview");
	$iconView = $("a.tool.iconview");
	$listView = $("a.tool.listview");
	$filterTool = $("a.tool.filter");
	
	clearfix = '<div class="clearfix"></div>';

	if(pagination) $galleryActionsBottom.append($previousPage, $paginationLabel, $nextPage, clearfix);

	$thumbnails.each(function(index, item) {
		$(this).attr("title", $('label.title', this).text());
		$(this).append('<b class="listicon"></b>');
	});
	
	$images.each(function(index, item) {
		$(this).append('<b class="imagecover"></b>');
	});	
	$articles.each(function(index, item) {
		$(this).append('<b class="imagecover"></b>');
	});	
	$hrefs.each(function(index, item) {
		$(this).attr("target", "_blank");
	});	
	
	if($imageviewer.imagefit) $imageviewer.imagefit();
		
	$gallery.before($galleryBreadcrumbs);
	$gallery.before($filterBox);
	$gallery.after($galleryActionsBottom);
	
	hideFilterBox();
}

function createBreadcrumbs($box)
{
	var windowpath;
	var path; 
	var paths;
	var $breadcrumb;
	var $base;
	var baselen;
	var pathlen;
	
	$base = $('#base');
	if($base) baselen = $('#base').attr("href").length;
	else baselen = -1; 
	
	pathlen = Number(String(window.location).indexOf('/', 8)) + 1;

	if(baselen >= 0)
	{
		pathlen = baselen;
		if(String(window.location).indexOf('localhost') != -1)
			pathlen = pathlen;
		else if(String(window.location).indexOf('www.', 7) > 0)
			pathlen -= 4;
	}
	
	if($.URLDecode) windowpath = $.URLDecode(String(window.location).substr(pathlen));
	else windowpath = String(window.location).substring(pathlen);
	paths = windowpath.split("/");

	$box.append('<b class="breadcrumb">&raquo;</b> ');

	path = '';
	for(var i=0; i<paths.length - 1; i++)
	{
		path += paths[i] + '/';
		if(paths[i] != '')
		{
			$breadcrumb = $('<a href="' + path + '" class="breadcrumb">' + paths[i] + '/</a>');
			if(String(windowpath).indexOf(paths[i] + '/') != -1)
			{
				$box.append($breadcrumb);
			}
		}
	}
	if(windowpath.length > 0)
	{
		$breadcrumb = $('<a class="breadcrumb disabled">' + paths[i] + '</a>');
	}
	else
	{
		$breadcrumb = $('<a class="breadcrumb disabled" href="">home</a>');
	}
	$box.append($breadcrumb);
	$box.append('<div class="clearfix"></div>');
}

function attachEvents()
{
	var actions = $('a.action');

	actions.mouseover(function() { $(this).addClass('hover'); });
	actions.mouseout(function() { $(this).removeClass('hover').removeClass('down'); });
	actions.mousedown(function() { $(this).addClass('down'); });
	actions.mouseup(function() { $(this).removeClass('down'); });

	if($previousPage) $previousPage.click(function() { pageNumber--; paginate(); });
	if($nextPage) $nextPage.click(function() { pageNumber++; paginate(); });

	if($imagesOnly)	$imagesOnly.click(function() { $displayList = $images; pageNumber = 0; paginate(); });
	if($foldersOnly) $foldersOnly.click(function() { $displayList = $folders; pageNumber = 0; paginate(); });
	if($articlesOnly) $articlesOnly.click(function() { $displayList = $articles; pageNumber = 0; paginate(); });
	if($hrefsOnly) $hrefsOnly.click(function() { $displayList = $hrefs; pageNumber = 0; paginate(); });
	
	if($backTool) $backTool.click(function() { history.go(-1); });
	if($filterTool) $filterTool.click(function() { selectFilterBox(); });
	
	if($filterBox) $filterBox.keyup(function(e) { filter(); paginate(); 
		if(e.keyCode == 13) {
			if($displayList.length == 1)
			{
				$($displayList).click();
			}
		}
	});
	
	if($tileView) $tileView.click(function() { viewModeClass = ""; paginate(); });
	if($iconView) $iconView.click(function() { viewModeClass = "iconView"; paginate(); });
	if($listView) $listView.click(function() { viewModeClass = "listView"; paginate(); });
}

function selectFilterBox()
{
	$filterBox.attr("value", "");
	$filterBox.toggle();
	$filterBox.focus(); 
}

function hideFilterBox()
{
	$filterBox.css("display", "none");
}

function thumbnailFolderClicked()
{
	var dir = $(this).attr("href");
	window.location = dir;
	
	return false;
}

function thumbnailArticleClicked()
{
	return true;
}

function thumbnailImageClicked()
{
	imageurl = $(this).attr("href");
	title = $("label.title", this).text();
	permalink = $("label.permalink", this).text();

	$permalink.html("Permalink: " + permalink);
	$permalink.attr("href", permalink);
	
	$imagemessage = $('<p class="imageviewer"><img src="neuro/images/loading-animation.gif" alt="Loading animation" /> Loading ' + title + '</p>');

	$link = $('<a class="downloadImage" href="' + imageurl + '"></a>');
	$link.attr("title", "Download " + title);
	$link.attr("target", "_blank");
	
	$image = $('<img class="imageviewer" src="' + imageurl + '" alt="Display image" />');
	$image.css("width", "1px");
	$image.css("height", "100px");
	$image.load(function() {
		$(this).removeAttr("style");
		$(this).css("width", "100%");
		$(this).css("margin", "10px 0 0 0");
		$imagemessage.css("display", "none");
		$(this).hide();
		$(this).fadeIn(100);
	});

	$imageviewer.html("");
	$imageviewer.append($imagemessage, $link, clearfix);

	$link.append($image);
	
	return false;
}

function thumbnailFileClicked()
{
	return true;
}

function thumbnailHrefClicked()
{
	return true;
}

var term, filterCount;
function filter()
{
	$displayList = $thumbnails;

	term = $filterBox.attr("value");
	
	var $filtered = $('<div></div>');
	if(term.length < 1)
		return;
	
	var terms = String(term).split(' ');
	
	filterCount = 0;
	$displayList.each(function(i, item)
	{
		var href = $(item).attr("href").toLowerCase();
		var term;
		var matches = 0;
		var validterms = 0;
		for(var i=0; i<terms.length; i++)
		{
			term = terms[i];
			if(term == '' || term == false || term.substr(-1) == '\\')
			{
				// skip term
			}
			else
			{
				validterms++;
				if(href.match(term.toLowerCase()) != null)
				{
					matches++;
				}
			}
		}
		if(matches == validterms)
		{
			$filtered.append($(item));
			filterCount++;
		}
	});
	//if(filterCount > 0)
	$displayList = $('a.thumbnail', $filtered);
}

function paginate()
{
	var itemsPerPage;
	if($.cookie) $.cookie('viewModeClass', viewModeClass);
	if(viewModeClass == null) viewModeClass = '';
	
	if(viewModeClass == '')
	{
		itemsPerPage = 12;
		pagination = true;
	}
	else
	if(viewModeClass == 'iconView')
	{
		itemsPerPage = 25;
		pagination = true;
	}
	else
	if(viewModeClass == 'listView')
	{
		itemsPerPage = 14;
		pagination = true;
	}

	var numItems = $displayList.length;
	totalPages = Math.ceil(numItems / itemsPerPage);
	if(totalPages == 0)
		totalPages = 1;

	if(totalPages == 1 || pagination == false)
		$galleryActionsBottom.css("display", "none");
	else
		$galleryActionsBottom.css("display", "block");

	pageNumber = pageNumber % totalPages;
	if(pageNumber < 0)
		pageNumber = totalPages - 1;
	if(pageNumber >= totalPages)
		pageNumber = 0;
	
	firstItem = pageNumber * itemsPerPage;
	lastItem = firstItem + itemsPerPage - 1;
	
	if(numItems > 0)
	{
		$gallery.html("");
		$paginationLabel.html("Page " + (pageNumber + 1) + " of " + totalPages + "");
	}
	else
	{
		$gallery.html('<p style="clear:both;">No items matched for (' + term + ')</p>');
		$paginationLabel.html("No items");
		return;
	}

	$displayList.each(function(i, item)
	{
		if(pagination)
		{
			if((i >= firstItem && i <= lastItem) || pagination == false)
			{
				$gallery.append(item);
				$(item).removeClass("iconView").removeClass("listView").addClass(viewModeClass);
			}
		}
		else
		{
			$gallery.append(item);
			$(item).removeClass("iconView").removeClass("listView").addClass(viewModeClass);
		}
	});
	
	$('a.thumbnail.image', $gallery).each(function(i, item)
	{
			var thumbnail = $("label.thumbnail", item).text();
			
			if(thumbnail != "" && viewModeClass != "listView")
			{
				$(item).css("background-image", "url('" + thumbnail + "')");
				$(item).css("background-position", "center center");
				$('label.title', item).css("display", "none");
			}
			else
			{
				$(item).removeAttr("style");
				$('label.title', item).css("display", "block");
			}
	});
	$('a.thumbnail.article', $gallery).each(function(i, item)
	{
		var thumbnail = $("label.thumbnail", item).text();
		
		if(thumbnail != "" && viewModeClass != "listView")
		{
			$(item).css("background-image", "url('" + thumbnail + "')");
			$(item).css("background-position", "center center");
			$('label.title', item).css("display", "none");
		}
		else
		{
			$(item).removeAttr("style");
			$('label.title', item).css("display", "block");
		}
	});
	
	$('a.thumbnail.folder', $gallery).click(thumbnailFolderClicked);
	$('a.thumbnail.image', $gallery).click(thumbnailImageClicked);
	$('a.thumbnail.file', $gallery).click(thumbnailFileClicked);
	$('a.thumbnail.article', $gallery).click(thumbnailArticleClicked);
	$('a.thumbnail.href', $gallery).click(thumbnailHrefClicked);
}