/*
	[Start: Program Information Header]

		Name    : Photolibrary: Filters
		Purpose : Prototypes for DateTree, HardwareFilter, Recents and FilterDesc components
		Syntax  :

	[End: Program Information Header]

	[Start: Author Information Header]

		Name    : James D. Forrester
		E-mail  : james@jdforrester.org

		Name    : Ed Sanders
		E-mail  : ejsanders@gmail.com

	[End: Author Information Header]
*/

/**
 * DateTree - list of dates with photo counts for searching
 * @extends Component
*/
var DateTree = Class.create(Component);

DateTree.prototype.update = function(xml)
{
	var dateData = xml.getElementsByTagName('dates');
	if(dateData.length)
	{
		this.contents.removeChildren();

		var years = dateData[0].getElementsByTagName('year');
		if(years.length)
		{
			var yearList = new Element('ul');
			yearList.className = 'tree';

			for(var i = 0, il = years.length; i < il; i++)
			{
				var year = parseInt(years[i].getAttribute('value'));
				page = Math.ceil((1 + parseInt(years[i].getAttribute('count'))) / this.layout.photosPerPage);

				var yearLeaf = yearList.appendChild(new DateLeaf(this.layout, years[i].getAttribute('name'), years[i].getAttribute('photos'), page, year));

				var monthList = yearLeaf.appendChild(new Element('ul'));
				monthList.className = 'branch';

				var months = years[i].getElementsByTagName('month');
				for(var j = 0, jl = months.length; j < jl; j++)
				{
					var month = parseInt(months[j].getAttribute('value'));
					page = Math.ceil((1 + parseInt(months[j].getAttribute('count'))) / this.layout.photosPerPage);

					dayList = new Element('ul');
					dayList.className = 'branch hidden';

					var monthLeaf = monthList.appendChild(new DateLeaf(this.layout, months[j].getAttribute('name'), months[j].getAttribute('photos'), page, year, month, 0, dayList));
					monthLeaf.appendChild(dayList);

					var days = months[j].getElementsByTagName('day');
					for(var k = 0, kl = days.length; k < kl; k++)
					{
						var day = parseInt(days[k].getAttribute('value'));
						page = Math.ceil((1 + parseInt(days[k].getAttribute('count'))) / this.layout.photosPerPage);

						dayList.appendChild(new DateLeaf(this.layout, days[k].getAttribute('name'), days[k].getAttribute('photos'), page, year, month, day));
					}
				}
			}
			this.contents.appendChild($T(language('datefilter')));
			this.contents.appendChild(new Element('br'));
			this.contents.appendChild(yearList);
		}
	}
}

function DateLeaf(layout, text, photos, page, year, month, day, dayList)
{
	var leaf = new Element('li');
	leaf.className = 'leaf';
	var button = new TextButton(function () { layout.datePage(page, year, month, day, false, dayList); return false; }, text);
	leaf.appendChild(button);
	leaf.appendChild($T(' [' + photos + ']'));
	return leaf;
}

var HardwareFilter = Class.create(Component);

HardwareFilter.prototype.update = function(xml)
{
	var hardwareData = xml.getElementsByTagName('hardware');
	if(hardwareData.length)
	{
		this.contents.removeChildren();

		var hardwareList = this.contents.appendChild(new Element('select'));
		hardwareList.className = 'small';
		var allPhotos = 0;
		var allHardwareItem = hardwareList.appendChild(new Element('option'));

		var devices = hardwareData[0].getElementsByTagName('device');
		for(var i = 0, il = devices.length; i < il; i++)
		{
			var make = devices[i].getAttribute('make');
			var model = devices[i].getAttribute('model');
			var photos = parseInt(devices[i].getAttribute('photos'));
			allPhotos += photos;

			var hardwareItem = hardwareList.appendChild(new Element('option'));
			hardwareItem.value = make + ' || ' + model;

			if(make == this.layout.make && model == this.layout.model)
				hardwareItem.selected = true;

			if(make == "-1" && model == "-1")
			{
				make = "";
				model = "unknown device"; //lang
			}
			hardwareItem.appendChild($T((make + ' ' + model).substring(0, 27) + ((make + ' ' + model).length > 27 ? '...' : '') + ' [' + photos + ']'));
		}
		hardwareList.onchange = (function() {
			this.layout.setHardware(hardwareList.value);
		}).bind(this);
		allHardwareItem.value = '';
		allHardwareItem.appendChild($T(language('all') + ' [' + allPhotos + ']'));
		if(this.layout.make == '' && this.layout.model == '')
			allHardwareItem.selected = true;
	}
	this.setVisibility(this.layout.viewMode == 'list');
}

var Recents = Class.create(Component);

Recents.prototype.update = function(xml)
{
	var recentsData = xml.getElementsByTagName('recent');
	if(recentsData.length)
	{
		this.contents.removeChildren();
		var recentList = this.contents.appendChild(new Element('div'));
		for(var n = 0, nl = recentsData.length; n < nl; n++)
		{
			var categories = recentsData[n].getElementsByTagName('category');
			if(categories.length)
			{
				var cellWidth = Math.round(100 / categories.length);
				var recentBar = recentList.appendChild(new Element('div'));
				recentBar.className = 'bar top recent';

				recentBar.appendChild($T('Recent ' + recentsData[n].getAttribute('name')));
				var table = recentBar.appendChild(new Element('table'));
				var tbody = table.appendChild(new Element('tbody'));
				var row = tbody.appendChild(new Element('tr'));

				for(var i = 0, il = categories.length; i < il; i++)
				{
					var photo = categories[i].getElementsByTagName('photo')[0];
					var category = categories[i].getAttribute('category');
					var catName = categories[i].getAttribute('name');
					var cell = row.appendChild(new Element('td'));
					cell.style.width = cellWidth + '%';
					var d = cell.appendChild(new Element('div'));
					d.className = 'box';
					d.title = catName;
					d.style.backgroundImage = 'url(\'' + settings.thumbs_directory + '/' + filename(photo.getAttribute('hash')) + '.' + photo.getAttribute('type') + '?rot=' + photo.getAttribute('orientation') + '\')';
					d.clickHandler = this.layout.showCat.bind(this.layout, category);
					var c = cell.appendChild(new TextButton(this.layout.showCat.bind(this.layout, category), catName));
				}
			}
		}
	}
}

var FilterDesc = Class.create(Component);

FilterDesc.prototype.update = function(xml)
{
	this.contents.removeChildren();

	var filterDescBar = this.contents.appendChild(new Element('div'));
	filterDescBar.className = 'bar filters';

	var filterDescInstructions = filterDescBar.appendChild(new Span(language('filters') + ' (' + language('filters-instructions') + '):'));
	filterDescInstructions.className = 'small';

	var filterDescText = filterDescBar.appendChild(new Element('div'));
	filterDescText.appendChild($T(language('photos-of') + ' '));

	var categoryFilters = xml.getElementsByTagName('categoryfilters')[0];
	var filters = [];
	if(categoryFilters)
	{
		filters = categoryFilters.getElementsByTagName('filter');
		for(var i = 0, il = filters.length; i < il; i++)
		{
			if(i)
				filterDescText.appendChild($T(' and '));
			var button = new TextButton(this.layout.hideCat.bind(this.layout, parseInt(filters[i].getAttribute('category'))), filters[i].getAttribute('name'), language('filters-instructions'));
			filterDescText.appendChild(button);
		}
	}
	if(!filters.length)
		filterDescText.appendChild($T(language('everything')));

	var hardwareFilter = xml.getElementsByTagName('hardwarefilter')[0];
	if(hardwareFilter)
	{
		var make = hardwareFilter.getAttribute('make');
		var model = hardwareFilter.getAttribute('model');
		filterDescText.appendChild($T(' taken with a ')); //lang
		filterDescText.appendChild(new TextButton(this.layout.setHardware.bind(this.layout, ''), make + ' ' + model, language('filters-instructions')));
	}

}