var imagesXml;
var albumXsl;
var galleryXsl;
var currentAlbum = "";
var innerHtmlToSet = "";
var galleryFolder = "";

function initImageGallery()
{
	addListener(this, "load", function() { getXml(); hookButtons(); });
}

function hookButtons()
{
	/*
	var nextAlbumButton = $('topNextAlbumButton');
	if (nextAlbumButton)
	{
		addListener(nextAlbumButton, "click", function() { getNextAlbum(currentAlbum); });
	}
	*/

	var nextAlbumButton = $('bottomNextAlbumButton');
	if (nextAlbumButton)
	{
		addListener(nextAlbumButton, "click", function() { getNextAlbum(currentAlbum); });
	}

	/*
	var previousAlbumButton = $('topPreviousAlbumButton');
	if (previousAlbumButton)
	{
		addListener(previousAlbumButton, "click", function() { getPreviousAlbum(currentAlbum); });
	}

	previousAlbumButton = $('bottomPreviousAlbumButton');
	if (previousAlbumButton)
	{
		addListener(previousAlbumButton, "click", function() { getPreviousAlbum(currentAlbum); });
	}
	*/
}

function addListener(element, event, listener, bubble) {
  if(element.addEventListener) {
    if(typeof(bubble) == "undefined") bubble = false;
    element.addEventListener(event, listener, bubble);
  } else if(this.attachEvent) {
    element.attachEvent("on" + event, listener);
  }
}

function getXml()
{
	if (imagesXml == null || albumsXsl == null || galleryXsl == null)
	{
		new Ajax.Request('xml/images.xml',
		  {
			method:'get',
			onSuccess: function(transport){
			  imagesXml = transport.responseText || "<?xml version=\"1.0\"?><images></images>";
			  new Ajax.Request('xml/gallery.xsl',
				{
				  method:'get',
				  onSuccess: function(transport){
					  galleryXsl = transport.responseText || "<?xml version=\"1.0\"?><p></p>";
      			  new Ajax.Request('xml/album.xsl',
      				{
      				  method:'get',
      				  onSuccess: function(transport){
      					  albumXsl = transport.responseText || "<?xml version=\"1.0\"?><p></p>";
      					  if (findGalleryFolder());
                    createGallery();
      				  },
      				  onFailure: function(){ alert('Failed to load the album style sheet!') }
      				});
				  },
				  onFailure: function(){ alert('Failed to load the gallery style sheet!') }
				});
			},
			onFailure: function(){ alert('Failed to load the image gallery!') }	
		  });
	}
	else
	{
		createAlbum();
		Effect.toggle('album', 'appear');
	}
}

function createGallery()
{
  var xml = parseXml(imagesXml);
  var xsl = parseXml(galleryXsl);
	var transform = transformXml(xml, xsl, false);
	innerHtmlToSet = new XMLSerializer().serializeToString(transform);

	//Hack for IE6 and below... stupid HTML doesn't want to refresh immediately.
	setTimeout("doFill('gallery')", 50);    
}

function createAlbum()
{
	var xml = parseXml(imagesXml);
	var xsl = parseXml(albumXsl);

	if (currentAlbum == "")
	{
		xml.setProperty("SelectionLanguage", "XPath");
		var firstAlbumNode = xml.selectSingleNode("folder[@name='" + galleryFolder + "']/folder[1]");
		currentAlbum = firstAlbumNode.getAttribute("name");
	}

	var transform = transformXml(xml, xsl, true);

	innerHtmlToSet = new XMLSerializer().serializeToString(transform);

	//Hack for IE6 and below... stupid HTML doesn't want to refresh immediately.
	setTimeout("doFill('fullAlbum')", 50); 
}

function doFill(elementId) {
	$(elementId).innerHTML = innerHtmlToSet;
	myLytebox.updateLyteboxItems();
} 

function parseXml(xml)
{
	var parser = new DOMParser();
	var doc = parser.parseFromString(xml,"text/xml");
	return doc;
}

function transformXml(xml, xsl, setCurrentAlbum)
{
	var processor = new XSLTProcessor();
	processor.importStylesheet(xsl);
	if (setCurrentAlbum)
	 processor.setParameter(null, "currentAlbum", currentAlbum);
    
	var newDocument;
	try
	{
		newDocument = processor.transformToDocument(xml);
	}
	catch (e)
	{
		alert(e);
		return;
	}

	return newDocument.documentElement;
}

function findGalleryFolder()
{
  var xml = parseXml(imagesXml);
  xml.setProperty("SelectionLanguage", "XPath");
  
  var count = xml.childNodes.length;
  for (i=0;i<count;i++)
  {
    var node = xml.childNodes[i];
    if (node.nodeType == 1 && node.getAttribute("name") && node.getAttribute("name").toLowerCase() == 'galleries')
    {
      galleryFolder = node.getAttribute("name");
      return true;
    }
  }
  
  if (galleryFolder == "")
  {
    alert("The root folder must be named 'galleries'");
    return false;
  }
}

function getNextAlbum(oldAlbum)
{
	var xml = parseXml(imagesXml);
	xml.setProperty("SelectionLanguage", "XPath");

	if (oldAlbum == "")
	{
		var oldAlbumNode = xml.selectSingleNode("folder[@name='" + galleryFolder + "']/folder[1]");		
		currentAlbum = oldAlbumNode.getAttribute("name");
	}
	else
	{
		var oldAlbumNode = xml.selectSingleNode("//folder[@name='" + oldAlbum + "']");
	}


	if (oldAlbumNode)
	{
		var lastAlbumNode = xml.selectSingleNode("folder[@name='" + galleryFolder + "']/folder[last()]");
		if (lastAlbumNode && lastAlbumNode.getAttribute("name") == oldAlbumNode.getAttribute("name"))
		{
			var newAlbumNode = xml.selectSingleNode("folder[@name='" + galleryFolder + "']/folder[1]");
			if (newAlbumNode)
			{
				currentAlbum = newAlbumNode.getAttribute("name");
				createAlbum();
			}
		}
		else
		{
			var newAlbumNode = xml.selectSingleNode("//folder[@name='" + currentAlbum + "']/following-sibling::*[1]");
			if (newAlbumNode)
			{
				currentAlbum = newAlbumNode.getAttribute("name");
				createAlbum();
			}
		}
	}

	//Effect.toggle('album', 'appear');
}

function getPreviousAlbum(oldAlbum)
{
	var xml = parseXml(imagesXml);
	xml.setProperty("SelectionLanguage", "XPath");

	if (oldAlbum == "")
	{
		var oldAlbumNode = xml.selectSingleNode("folder[@name='" + galleryFolder + "']/folder[1]");
		currentAlbum = oldAlbumNode.getAttribute("name");
	}
	else
	{
		var oldAlbumNode = xml.selectSingleNode("//folder[@name='" + oldAlbum + "']");
	}


	if (oldAlbumNode)
	{
		var firstAlbumNode = xml.selectSingleNode("folder[@name='" + galleryFolder + "']/folder[1]");
		if (firstAlbumNode && firstAlbumNode.getAttribute("name") == oldAlbumNode.getAttribute("name"))
		{
			var newAlbumNode = xml.selectSingleNode("folder[@name='" + galleryFolder + "']/folder[last()]");
			if (newAlbumNode)
			{
				currentAlbum = newAlbumNode.getAttribute("name");
				createAlbum();
			}
		}
		else
		{
			var newAlbumNode = xml.selectSingleNode("//folder[@name='" + currentAlbum + "']/preceding-sibling::*[1]");
			if (newAlbumNode)
			{
				currentAlbum = newAlbumNode.getAttribute("name");
				createAlbum();
			}
		}
	}
}

function toggleAlbumIndex(showAlbum)
{
	if (imagesXml != null && albumXsl != null)
	{
		Effect.toggle('gallery', 'appear');
		Effect.toggle('singleAlbum', 'appear');
		if (showAlbum)
		{
			currentAlbum = showAlbum;
			createAlbum();
		}
	}
}
