/*
 * jQuery Livion Gallery (C) 2011 Livion, http://livion.fi
 */

(function($) {
	$.fn.livionGallery = function(arg, arg2) {
		var gallery = $(this);
		
		if ( arg == 'category' ) {
			gallery.find('.category').hide();
			var thumbs = gallery.find('#' + arg2);
			thumbs.show();
			gallery.livionGallery('view', $(thumbs.children()[0]).data('origSrc'));
		} else if ( arg == 'view' ) {
			var image = gallery.find('.galleryImage');
			if ( gallery.data('animations') == 0 ) {
				if ( getInternetExplorerVersion() == -1 ) {
					var count = image.children().length;
					image.children().css('background-image', 'url(' + arg2 + ')');
					var width = image.width();
					var height = image.height();
					gallery.data('animations', count);
					for ( var i = 0; i < count; i++ ) {
						var overlay = $(image.children()[i]);
						
						var left = i / count * width + 'px';
						overlay.css('left', left);
						overlay.css('right', width - (i + 1.0) / count * width + 'px');
						overlay.css('background-position', "-" + left + " 0px");
						overlay.css('top', 0);
						overlay.css('bottom', 0);
						overlay.css('opacity', 0);
						
						overlay.animate({opacity: 1}, 1000 - i * 900 / count, function() {
							var a = gallery.data('animations') - 1;
							gallery.data('animations', a);
							if ( a == 0 ) {
								image.css('background-image', 'url(' + arg2 + ')');
								image.children().css('opacity', 0);
							}
						});
					}
				} else {
					image.animate({opacity: 0}, 400, function() {
						image.css('background-image', 'url(' + arg2 + ')');
						image.animate({opacity: 1}, 400);
					});
				}
				return true;
			}
			return false;
		} else {
			var config = {
				thumbnailHeight: '100px'
			}
			$.extend(config, arg);
		
			// Construct simple data model from dom
			var model = {};
			var cats = [];
			$(this).children().each( function() {
				var cat = $(this).find('h2').html();
				var images = [];
				$(this).find('img').each( function() {
					images.push($(this).attr('src'));
				});
				model[cat] = images;
				cats.push(cat);
			});
			
			// Destroy the original dom (we'll build a new shinier one)
			gallery.children().remove();
			
			// Category selector
			if ( cats.length > 1 ) {
				var catDiv = $('<div class="categories" />');
				for ( var cat in model ) {
					var item = $('<a href="#">' + cat + '</a>');
					item.data('cat', cat);
					item.click( function() {
						gallery.livionGallery('category', $(this).data('cat'));
					});
					catDiv.append(item);
					catDiv.append(' ');
				}
				gallery.append(catDiv);
			}
			
			// Main image
			var image = $('<div class="galleryImage" style="position: relative" />');
			image.css('margin-bottom', '5px');
			image.css('background-position', 'center');
			image.css('background-repeat', 'no-repeat');
			image.css('background-color', 'white');
			gallery.append(image);
			for ( var i = 0; i < 5; i++ ) {
				image.append($('<div style="position: absolute" />'));
			}
			
			// Category thumbnails
			for ( var cat in model ) {
				var div = $('<div class="category" id="' + cat + '" />');
				var imgs = model[cat];
				
				for ( var i in imgs ) {
					var tokens = imgs[i].split('.');
					tokens[tokens.length-2] += '-thumb';
					var img = $('<img src="' + tokens.join('.') + '" alt="" title="">');
					img.data('origSrc', imgs[i]);
					img.css('height', config.thumbnailHeight);
					img.css('width', 'auto');
					img.css('margin', '3px 3px 3px 3px');
					img.css('cursor', 'pointer');
					img.click( function() {
						if ( gallery.livionGallery('view', $(this).data('origSrc')) ) {
							div.children().css('margin', '3px 3px 3px 3px').css('border', 'none');
							$(this).css('margin', '0 0 0 0');
							$(this).css('border', '3px solid #444');
						}
					});
					div.append(img);
					div.append(' ');
				}
				gallery.append(div);
				div.hide();
			}
			
			// Show first category
			gallery.data('animations', 0);
			gallery.livionGallery('category', cats[0]);
		}
	}
})(jQuery);

function getInternetExplorerVersion()
// Returns the version of Internet Explorer or a -1
// (indicating the use of another browser).
{
  var rv = -1; // Return value assumes failure.
  if (navigator.appName == 'Microsoft Internet Explorer')
  {
    var ua = navigator.userAgent;
    var re  = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})");
    if (re.exec(ua) != null)
      rv = parseFloat( RegExp.$1 );
  }
  return rv;
}
