function displayMyPreviewInterface(event, itemTitle, itemID, itemType, subItem, url)
{
	// Make sure we've got an event to play with
	if(!event)
		var event = window.event;

	// Get the x and y co-ords
	var x, y;
	if(event.pageX)
	{
		x = event.pageX;
		y = event.pageY;
	}
	else
	{
		x = event.clientX + (document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft);
		y = event.clientY + (document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop);
	}
	
	x -= 5;
	y -= 5;
	
	// Build the interface
	var select = pregoCreateElement('SELECT');
	select.id = 'mpSectionInput';

	select.options[0] = new Option('My Preview', '0');
	
	var optIndex = 1;
	for(var i = 0; i < mpFolders.length; i++)
		select.options[optIndex++] = new Option(mpFolders[i].name, mpFolders[i].id);
	
	select.options[optIndex++] = new Option('New folder...', '_new');
	
	select.onchange = function()
	{
		var display;
		if(this.value == '_new')
			display = 'inline';
		else
			display = 'none';
			
		var inputs = this.parentNode.getElementsByTagName('LABEL');
		for(var i = 0, ipt; ipt = inputs[i]; i++)
			ipt.style.display = display;
	}
	
	var input = pregoCreateElement('INPUT');
	input.type = 'text';
	input.id = 'mpNewSectionInput';
	
	var label = pregoCreateElement('LABEL', ['New folder name: ', input]);
	label.style.display = 'none';
	
	var submit = pregoCreateElement('INPUT');
	submit.type = 'submit';
	submit.className = 'submit';
	submit.value = 'Go';
	
	submit.previewItemTitle = itemTitle;
	submit.previewItemID = itemID;
	submit.previewItemType = itemType;
	submit.previewSubItem = subItem;
	submit.previewURL = url ? url : window.location.href;
	
	submit.onclick = function()
	{
		// Retrieve the details of what we're adding
		var itemType = this.previewItemType;
		var itemID = this.previewItemID;
		var subItem = this.previewSubItem;
		var url = this.previewURL;
	
		// Get the section we're adding to
		var section = document.getElementById('mpSectionInput').value;
		var newSection = document.getElementById('mpNewSectionInput').value;
	
		url = url.replace(/=/g, '%3D');
		url = url.replace(/&/g, '%26');
	
		// Actually submit the request
		var params = 'function=add&mode=ajax&section=' + encodeURI(section) + '&id=' + encodeURI(itemID) + '&type=' + encodeURI(itemType) + '&new-section=' + encodeURI(newSection) + '&link=' + encodeURI(url);
		
		if(typeof(subItem) != 'undefined')
			params += '&category=' + subItem;
		
		var addCompleteFunction = function(xml, text, error)
		{
			var container = document.getElementById('mp-container');
			while(container.firstChild)
				container.removeChild(container.firstChild);
				
			if(error)
			{
				pregoUniversalAppend(container, [
					pregoCreateElement('STRONG', 'Error:'),
					' ',
					error,
					pregoCreateElement('BR'),
					'Please try again later.'
				]);
			}
			else
			{
				mpReloadFolders();
				pregoUniversalAppend(container, text);
			}
				
			var link = pregoCreateLink('#close', 'Close');
			link.onclick = function()
			{
				var p = this.parentNode;
				while(!p.close)
					p = p.parentNode;
				p.close();
			}
			
			pregoUniversalAppend(container, [pregoCreateElement('BR'), link]);
		}
		
		pregoAjaxPostRequest('action.mypreview.php', params, addCompleteFunction);

		var container = document.getElementById('mp-container');
		while(container.firstChild)
			container.removeChild(container.firstChild);
		pregoUniversalAppend(container, 'Processing...');
	}
	
	var container = pregoCreateElement('DIV', [
		'Add ', pregoCreateElement('STRONG', itemTitle), ' to...',
		pregoCreateElement('BR'),
		select,
		pregoCreateElement('BR'),
		label,
		pregoCreateElement('BR'),
		submit
	]);
	container.id = 'mp-container';
	
	// Display the popup
	displayPopup(x, y, 'Add to My Preview', container);
	
	return false;
}





function displayPopup(x, y, title, contents)
{	
	// Make the close button
	var close = pregoCreateElement('A', 'x');
	close.className = 'close';
	close.title = 'Close';
	close.onclick = function()
	{
		this.parentNode.close();
	}
	
	// Make the container
	var container = pregoCreateElement('DIV', [
		close,
		pregoCreateElement('H4', title),
		contents
	]);

	// Set up the container
	container.style.zIndex = '200';
	container.style.left = x+'px';
	container.style.top = y+'px';
	container.className = 'popup';
	container.close = function()
	{
		var mask = this.parentNode;
		mask.parentNode.removeChild(mask);
	}
	
	// Make the mask
	var mask = pregoCreateElement('DIV', container);
	mask.style.position = 'absolute';
	mask.style.zIndex = '150';
	mask.style.left = '0';
	mask.style.top = '0';
	mask.style.width = '100%';
	mask.style.height = document.body.clientHeight + 'px';
	
	// Throw it into the document
	document.getElementsByTagName('BODY')[0].appendChild(mask);	
}


var mpReloadFoldersComplete;
function mpReloadFolders()
{
	mpReloadFoldersComplete = false;
	var reloadComplete = function(xml, text, error)
	{
		mpFolders = [];
		var folders = xml.getElementsByTagName('folder');
		for(var i = 0, f; f = folders[i]; i++)
		{
			mpFolders[i] = {
				'id' :  folders[i].getAttribute('id'),
				'name' : folders[i].getAttribute('name')
			};
		}
		mpReloadFoldersComplete = true;
	}
	
	pregoAjaxPostRequest('action.mypreview.php', 'mode=ajax&function=folders', reloadComplete);
}

function mpGUICheckForNewFolders(itemCount)
{
	if(!mpReloadFoldersComplete)
	{
		setTimeout('mpGUICheckForNewFolders('+itemCount+');', 100);
		return;
	}

	for(var i = 0; i < mpFolders.length; i++)
	{
		if(!document.getElementById('folder.'+mpFolders[i].id))
			mpGUIAddFolder(mpFolders[i].id, mpFolders[i].name, itemCount);
	}
}

function mpSelectAll()
{
	var inputs = document.getElementsByTagName('INPUT');
	for(var i = 0, node; node = inputs[i]; i++)
	{
		if(node.type == 'checkbox' && node.name == 'mp-selection[]')
			node.checked = true;
	}
}

function mpSelectNone()
{
	var inputs = document.getElementsByTagName('INPUT');
	for(var i = 0, node; node = inputs[i]; i++)
	{
		if(node.type == 'checkbox' && node.name == 'mp-selection[]')
			node.checked = false;
	}
}

function mpSelectInvert()
{
	var inputs = document.getElementsByTagName('INPUT');
	for(var i = 0, node; node = inputs[i]; i++)
	{
		if(node.type == 'checkbox' && node.name == 'mp-selection[]')
			node.checked = !node.checked;
	}
}

function mpSelectFolders()
{
	var inputs = document.getElementsByTagName('INPUT');
	for(var i = 0, node; node = inputs[i]; i++)
	{
		if(node.type == 'checkbox' && node.name == 'mp-selection[]')
			node.checked = (node.value.search(/^folder\.[0-9]+$/) != -1);
	}
}

function mpSelectImages()
{
	var inputs = document.getElementsByTagName('INPUT');
	for(var i = 0, node; node = inputs[i]; i++)
	{
		if(node.type == 'checkbox' && node.name == 'mp-selection[]')
			node.checked = (node.value.search(/^folder\.[0-9]+$/) == -1);
	}
}

function mpGetSelected()
{
	var inputs = document.getElementsByTagName('INPUT');
	var values = [];
	var valueIndex = 0;
	for(var i = 0, node; node = inputs[i]; i++)
	{
		if(node.type == 'checkbox' && node.name == 'mp-selection[]' && node.checked)
			values[valueIndex++] = node.value;
	}
	
	return values;
}

function mpDeleteSelected()
{
	var values = mpGetSelected();

	if(values.length == 0)
	{
		alert('Nothing is selected!');
		return;
	}
	else 
	{
		var confirmMsg = 'Are you sure you want to remove the '+values.length+' selected items from My Preview?';
		
		for(var i = 0; i < values.length; i++)
		{
			if(values[i].match(/^folder\.[0-9]+$/))
			{
				confirmMsg += '\n\nNOTE: By deleting a folder you will also remove all the items that the folder contains from My Preview.'
				break;
			}
		}
	
		if(!confirm(confirmMsg))
			return;
	}

	var params = 'function=delete&mode=ajax&items=' + encodeURI(values.join(','));
		
	var deleteCompleteFunction = function(xml, text, error)
	{
		if(error)
		{
			alert(error);
			return;
		}
		else if(text != 'OK')
		{
			alert(text);
			return;
		}
		
		var oldSelectedFolder = mpGetSelectedFolder();
		mpGUIRemoveSelected();
		
		if(mpGetSelectedFolder() != oldSelectedFolder)
			window.location = 'mypreview.php';
	}
	
	pregoAjaxPostRequest('action.mypreview.php', params, deleteCompleteFunction);
}

function mpGUIRemoveSelected()
{
	var inputs = document.getElementsByTagName('INPUT');
	var removeCount = 0;
	
	for(var i = 0, node; node = inputs[i]; i++)
	{
		if(node.type == 'checkbox' && node.name == 'mp-selection[]' && node.checked)
		{
			var p = node.parentNode;
			while(p.className != 'item' && p.className != 'folder' && p.className != 'selected-folder')
				p = p.parentNode;
			p.parentNode.removeChild(p);
			i--;
			
			if(p.className == 'item')
				removeCount++;
		}
	}
	
	if(removeCount)
		mpGUIUpdateItemCount(mpGetSelectedFolder(), -removeCount);
		
	return removeCount;
}

function mpGUIUpdateItemCount(folderID, increment)
{
	var container = document.getElementById('item-count.'+folderID);
	if(!container)
		return;
		
	var count = parseInt(container.firstChild.nodeValue);
	container.firstChild.nodeValue = count + increment;
	
	if(increment > 0)
	{
		container.style.color = 'red';
		setTimeout('document.getElementById("item-count.'+folderID+'").style.color = "white";', 500);
	}
}

function mpGUIAddFolder(id, name, itemCount)
{
	var container = document.getElementById('mp-folder-container');
	if(!container)
		return;

	var fCheck = pregoCreateElement('INPUT');
	fCheck.type = 'checkbox';
	fCheck.name = 'mp-selection[]';
	fCheck.value = 'folder.'+id;
	
	var fSpan = pregoCreateElement('SPAN', itemCount);
	fSpan.id = 'item-count.'+id;
	
	var fLink = pregoCreateLink('mypreview.php?folder='+id, [
		pregoCreateElement('STRONG', name),
		pregoCreateElement('BR'),
		fSpan, 
		' Items'
	]);

	var fPara = pregoCreateElement('P', [fCheck, fLink]);

	var fContainer = pregoCreateElement('DIV', fPara);
	fContainer.className = 'folder';
	fContainer.id = 'folder.'+id;
	
	container.insertBefore(fContainer, container.lastChild);
}

function mpGetSelectedFolder()
{
	var container = document.getElementById('mp-folder-container');
	var divs = container.getElementsByTagName('DIV');
	for(var i = 0, d; d = divs[i]; i++)
	{
		if(d.className == 'selected-folder')
			return parseInt(d.id.split('.')[1]);
	}
	
	return 0;
}

function mpPrintSelected()
{
	var values = mpGetSelected();

	if(values.length == 0)
	{
		alert('Nothing is selected!');
		return;
	}
	
	printView(values);
}

function mpDownloadSelected()
{
	var values = mpGetSelected();

	if(values.length == 0)
	{
		alert('Nothing is selected!');
		return;
	}
	
	download(values);
}

var mpMoveFolderID;
function mpMoveSelected(event)
{
	// Get the selected items
	var values = mpGetSelected();

	if(values.length == 0)
	{
		alert('Nothing is selected!');
		return;
	}
	
	for(var i = 0; i < values.length; i++)
	{
		if(values[i].search(/^folder\.[0-9]+$/) != -1)
		{
			alert('You cannot move folders!\nPlease select some images to move and try again.');
			return;
		}
	}

	// Make sure we've got an event to play with
	if(!event)
		var event = window.event;

	// Get the x and y co-ords
	var x, y;
	if(event.pageX)
	{
		x = event.pageX;
		y = event.pageY;
	}
	else
	{
		x = event.clientX + (document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft);
		y = event.clientY + (document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop);
	}
	
	x -= 5;
	y -= 5;
	
	// Build the interface
	var select = pregoCreateElement('SELECT');
	select.id = 'mpSectionInput';

	// Populate the folder list
	select.options[0] = new Option('My Preview', '0');
	
	var optIndex = 1;
	for(var i = 0; i < mpFolders.length; i++)
		select.options[optIndex++] = new Option(mpFolders[i].name, mpFolders[i].id);
	
	select.options[optIndex++] = new Option('New folder...', '_new');
	
	select.onchange = function()
	{
		var display;
		if(this.value == '_new')
			display = 'inline';
		else
			display = 'none';
			
		var inputs = this.parentNode.getElementsByTagName('LABEL');
		for(var i = 0, ipt; ipt = inputs[i]; i++)
			ipt.style.display = display;
	}
	
	// New folder input
	var input = pregoCreateElement('INPUT');
	input.type = 'text';
	input.id = 'mpNewSectionInput';
	
	var label = pregoCreateElement('LABEL', ['New folder name: ', input]);
	label.style.display = 'none';
	
	// Submit button
	var submit = pregoCreateElement('INPUT');
	submit.type = 'submit';
	submit.className = 'submit';
	submit.value = 'Go';
	
	submit.setAttribute('itemValues', values);
	
	submit.onclick = function()
	{
	
		// Retrieve the details of what we're moving
		var itemValues = this.getAttribute('itemValues');
	
		// Get the section we're moving to
		var section = document.getElementById('mpSectionInput').value;
		var newSection = document.getElementById('mpNewSectionInput').value;
	
		// Check we're not moving from the selected folder to the selected folder
		if(mpGetSelectedFolder() == section)
		{
			alert('Cannot move items from this folder into this folder!');
			return;
		}
	
		// Actually submit the request
		var params = 'function=move&mode=ajax&destination=' + encodeURI(section) + '&items=' + encodeURI(values.join(',')) + '&new-section=' + encodeURI(newSection);
		
		mpMoveFolderID = section;
		var moveCompleteFunction = function(xml, text, error)
		{		
			var container = document.getElementById('mp-container');
			while(container.firstChild)
				container.removeChild(container.firstChild);
				
			if(error)
			{
				pregoUniversalAppend(container, [
					pregoCreateElement('STRONG', 'Error:'),
					' ',
					error,
					pregoCreateElement('BR'),
					'Please try again later.'
				]);
			}
			else if(text == 'OK')
			{
				var removeCount = mpGUIRemoveSelected();
				if(mpMoveFolderID == '_new')
				{
					mpReloadFolders();
					mpGUICheckForNewFolders(removeCount);
				}
				else
					mpGUIUpdateItemCount(mpMoveFolderID, removeCount);
				
				var p = container.parentNode;
				while(!p.close)
					p = p.parentNode;
				p.close();
				
				return;
			}
			else
			{
				pregoUniversalAppend(container, text);
			}	
				
			var link = pregoCreateLink('#close', 'Close');
			link.onclick = function()
			{
				var p = this.parentNode;
				while(!p.close)
					p = p.parentNode;
				p.close();
			}
			
			pregoUniversalAppend(container, [pregoCreateElement('BR'), link]);
		}
		
		pregoAjaxPostRequest('action.mypreview.php', params, moveCompleteFunction);

		var container = document.getElementById('mp-container');
		while(container.firstChild)
			container.removeChild(container.firstChild);
		pregoUniversalAppend(container, 'Processing...');
	}
	
	var container = pregoCreateElement('DIV', [
		'Move ', pregoCreateElement('STRONG', values.length+' items'), ' to...',
		pregoCreateElement('BR'),
		select,
		pregoCreateElement('BR'),
		label,
		pregoCreateElement('BR'),
		submit
	]);
	container.id = 'mp-container';
	
	// Display the popup
	displayPopup(x, y, 'Move', container);
	
	return false;
}


function mpCreateFolder(event)
{	
	// Make sure we've got an event to play with
	if(!event)
		var event = window.event;

	// Get the x and y co-ords
	var x, y;
	if(event.pageX)
	{
		x = event.pageX;
		y = event.pageY;
	}
	else
	{
		x = event.clientX + (document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft);
		y = event.clientY + (document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop);
	}
	
	x -= 5;
	y -= 5;
	
	// Build the interface
	
	// New folder input
	var input = pregoCreateElement('INPUT');
	input.type = 'text';
	input.id = 'mpNewSectionInput';
	
	var label = pregoCreateElement('LABEL', ['New folder name: ', input]);
	
	// Submit button
	var submit = pregoCreateElement('INPUT');
	submit.type = 'submit';
	submit.className = 'submit';
	submit.value = 'Go';
	
	submit.onclick = function()
	{
		// Get the new folder name
		var newSection = document.getElementById('mpNewSectionInput').value;
	
		// Actually submit the request
		var params = 'function=new-section&mode=ajax&new-section=' + encodeURI(newSection);
		
		var createCompleteFunction = function(xml, text, error)
		{		
			var container = document.getElementById('mp-container');
			while(container.firstChild)
				container.removeChild(container.firstChild);
				
			if(error)
			{
				pregoUniversalAppend(container, [
					pregoCreateElement('STRONG', 'Error:'),
					' ',
					error,
					pregoCreateElement('BR'),
					'Please try again later.'
				]);
			}
			else if(text == 'OK')
			{
				mpReloadFolders();
				mpGUICheckForNewFolders(0);
				
				var p = container.parentNode;
				while(!p.close)
					p = p.parentNode;
				p.close();
				
				return;
			}
			else
			{
				pregoUniversalAppend(container, text);
			}	
				
			var link = pregoCreateLink('#close', 'Close');
			link.onclick = function()
			{
				var p = this.parentNode;
				while(!p.close)
					p = p.parentNode;
				p.close();
			}
			
			pregoUniversalAppend(container, [pregoCreateElement('BR'), link]);
		}
		
		pregoAjaxPostRequest('action.mypreview.php', params, createCompleteFunction);

		var container = document.getElementById('mp-container');
		while(container.firstChild)
			container.removeChild(container.firstChild);
		pregoUniversalAppend(container, 'Processing...');
	}
	
	var container = pregoCreateElement('DIV', [
		'Create new folder...',
		pregoCreateElement('BR'),
		label,
		pregoCreateElement('BR'),
		submit
	]);
	container.id = 'mp-container';
	
	// Display the popup
	displayPopup(x, y, 'My Preview', container);
	
	return false;
}