// ACHTUNG: The functions defined here depend on an object defined in tombstones.js,
//		so always be sure to include tombstones.js ahead of this one in your web page or template.

/**************************************
FUNCTION fsp	"filter, sort, and page"
PARAMETERS
	page			which page of tombstones (starting w/ 1) to display (defaults to 1)
	page_size	how many tombstones per page (see "Config" section below for default)
	
Calls fs to obtain a filtered, sorted array of tombstone image references,
then slices the array according to page selection and displays appropriate images.
***************************************/
function fsp( page, page_size ) {
	// Config:
	var page_size_default = 20;
	var image_dir = '/images/transactions/';

	// Init:
	page_size = (page_size || page_size_default);		//alert( 'page_size: ' + page_size );
	var ffe = document.forms['filter_form'].elements;
	var filters = [];

	for (var i = 0; i < ffe.length; i++) {
		var elm = ffe[i];
		if (elm.type != 'select-one') continue;

		if (elm.value) filters.push(elm.value);
	}																	//alert( 'filters: ' + filters );

	var index = fs(filters);

	//===== PAGE =====
	var page_count = Math.ceil(index.length / page_size);
	var pager = document.getElementById('pager');
	var pager_bottom = document.getElementById('pager_bottom');

	if (page_count > 1) {
		if (isNaN(page) || (page < 1) || (page > page_count)) page = 1;

		var page_links = new Array();

		for (var pg = 1; pg <= page_count; pg++) {
			if (pg == page) page_links.push('<span style="font-weight: bold;">' + pg + '</span>');
			else page_links.push('<a href="#" onclick="fsp( ' + pg + ' ); return false;">' + pg + '</a>');
		}

		if (page > 1) page_links.unshift(
			'<a href="#" onclick="fsp( ' + (page - 1) + ' ); return false;">&laquo;previous</a>&nbsp;'
		);

		if (page < page_count) page_links.push(
			'&nbsp;<a href="#" onclick="fsp( ' + (page + 1) + ' ); return false;">next&raquo;</a>'
		);

		pager.innerHTML = pager_bottom.innerHTML = 'page: ' + page_links.join(' ');

		var lb = (page - 1) * page_size;
		var ub = Math.min(page * page_size, index.length);
		index = index.slice(lb, ub);
	}
	else {
		pager.innerHTML = pager_bottom.innerHTML = '';
	}

	//===== DISPLAY RESULTS =====
	var images = [];

	for (var i in index) {
		var relpath = quickie( index[i] );

		images.push( '<img id="' + relpath + '" src="' + image_dir + relpath + '" class="tombstone"' +
			'" xxalt="' + index[i].replace( /:/g, '\n' ) + '"/>'
		);
	}

	document.getElementById('showme').innerHTML = images.join('');
	window.focus(); // removes focus from the <select/> element, so scroll wheel doesn't change view again
}

/**************************************
FUNCTION fs		"filter and sort"
PARAMETERS
	filters	array of strings containing names of tombstone categories on which to filter returned tombstone list
***************************************/
function fs( filters ) {
	var index = [];

	//=== FILTER ===
	PATH:		// Iterate through all tombstones:
	for (var path in tombstones) {
		var ts = tombstones[path];
		var keys = [];
		var unfiltered_rank = Number.MAX_VALUE;

		var dlm = new Date(ts._dlm);
		var now = new Date();
		var salty = normalize_key( Math.round( ( now - dlm ) / ( 24 * 60 * 60 * 1000 ) ) );

		if (filters.length) {
			// Build sorted array of rankings for current tombstone based on selected filter(s):
			for (var i in filters) {
				var f = filters[i];

				if (ts[f]) {
					keys.push(String('0000' + ts[f]).slice(-4));
				}
				else continue PATH; // skip non-matching tombstones if we have filters selected
			}

			keys.sort();
		}
		else {
			// Determine single best ranking for current tombstone based on any filter(s):
			for (var cat in ts) {
				if ( cat != '_dlm' ) unfiltered_rank = Math.min(unfiltered_rank, ts[cat]);
			}

			keys.push(String('0000' + unfiltered_rank).slice(-4));
		}

		// Add salt and pathname to our set of keys, then concatenate all to form master key:
		keys.push(salty);
		keys.push(path);		
		index.push( keys.join(':') );
	}

	//=== SORT ===
	index.sort();

	//=== CALLBACK ===
	return index;
}

/**************************************
FUNCTION get_sample
PARAMETERS
	filters	...
***************************************/
function get_sample(filters) {
	// Config:
	var sampler_pool_size = 3;
	
	// Do it:
	var index = fs(filters).slice(0, sampler_pool_size);		//alert('get_sample index: ' + index);
	var i = Math.floor(Math.random() * sampler_pool_size);	//alert( 'sample: ' + index[i] );

	return quickie( index[i] );
}

/**************************************
FUNCTION quickie
PARAMETERS
	string	...
***************************************/
function quickie(mystr) { return String( mystr ).replace(/^.*:/, ''); }

/**************************************
FUNCTION normalize_key
PARAMETERS
	string	...
***************************************/
function normalize_key(k) {
	var padding = '0000';
	return String(padding + k).slice(-padding.length);
}
