/**
 * jquery.loadAnimation 0.2
 *
 * Copyright (c) 2009 Jan Faessler
 *
 * Licensed under MIT
 * http://www.opensource.org/licenses/mit-license.php
 *
 * Launch  : April 2009
 * Version : 0.2
 */
(function($) {
	function callFunction(options, name, self)
	{
		var fn = options[name];
		if ($.isFunction(fn))
		{
			try
			{
				return fn.call(self);
			}
			catch (error)
			{
				if (options.eAlert)
					alert("Error calling loadAnimation." + name + ": " + error);
				else
					throw error;
				return false;
			}
		}
		return true;
	}
	// mask instance (singleton)
	var mask = null;
	// animated elements
	var animated, conf = null;
	var origIndex = 0;
	// global methods
	$.loadAnimation = {
		getVersion: function()
		{
			return [0, 2, 0];
		},
		getMask: function()
		{
			return mask;
		},
		getAnimated: function()
		{
			return animated;
		},
		getConf: function()
		{
			return conf;
		},
		isStarted: function()
		{
			return mask && mask.is(":visible");
		},
		start: function(target, options)
		{
			// already started ?
			if (this.isStarted()) return this;
			if (target) {
				animated = target;
				origIndex = animated.eq(0).css("zIndex");
				conf = options;
			} else {
				target = animated;
				options = conf;
			}
			if (!target || !target.length) return this;
			// setup mask if not already done
			if (!mask)
			{
				mask = $('
');
				if (options.image.src != '')
					img = $('![]() ')
							.attr('src',options.image.src)
							.attr('alt',options.image.alt);
			}
			// set mask css properties
			mask.css({
				position: 'absolute',
				top: target.offset().top,
				left: target.offset().left,
				width: target.width(),
				height: target.height(),
				display: 'none',
				opacity: 0,
				zIndex: options.zIndex,
				backgroundColor: options.color
			});
			// set image css properities
			img.css({
				zIndex: options.zIndex+1,
				position: 'absolute',
				top: (target.height()/2-options.image.size.height/2),
				left: (target.width()/2-options.image.size.width/2)
			});
			// insert image into mask and append mask to body
			mask.html(img);
			$("body").append(mask);
			// onBeforeLoad
			if (callFunction(options, "onBeforeLoad", this) === false) return this;
			// reveal mask
			if (!this.isStarted())
			{
				mask.css({opacity: 0, display: 'block'}).fadeTo(options.loadSpeed, options.opacity, function()
				{
					callFunction(options, "onLoad", $.loadAnimation);
				});
			}
			return this;
		},
		end: function()
		{
			var self = this;
			if (!this.isStarted()) { return self; }
			if (callFunction(conf, "onBeforeClose", self) === false) return self;
			mask.fadeOut(conf.closeSpeed, function()
			{
				animated.css({zIndex: false ? origIndex : null});
				callFunction(conf, "onClose", self);
			});
		}
	};
	// jQuery plugin initialization
	$.prototype.loadAnimation = function(conf)
	{
		// no elements to expose
		if (!this.length) return this;
		var options = {
			eAlert: true,
			// mask settings
			maskId: 'exposeMask',
			loadSpeed: 'slow',
			closeSpeed: 'fast',
			// css settings
			zIndex: 998,
			opacity: 0.9,
			color: '#ccc',
			// image settings
			image: {
				src: '',
				alt: 'loading...',
				size: {
					width: 100,
					height: 10
				}
			}
		};
		// save critical options
		if (typeof conf == 'string') conf = {color: conf};
		if (typeof conf.image == 'string') conf.image = { src: conf.image, alt: options.image.alt, size: options.image.size };
		if (conf.image.alt == undefined) conf.image.alt = options.image.alt;
		if (conf.image.size == undefined) conf.image.size = options.image.size;
		if (conf.image.size.width == undefined) conf.image.size.width = options.image.size.width;
		if (conf.image.size.height == undefined) conf.image.size.height = options.image.size.height;
		// extend and overwrite standard options with user config
		$.extend(options, conf);
		// start animation
		$.loadAnimation.start(this, options);
		// return jQuery object
		return this;
	};
})(jQuery);
')
							.attr('src',options.image.src)
							.attr('alt',options.image.alt);
			}
			// set mask css properties
			mask.css({
				position: 'absolute',
				top: target.offset().top,
				left: target.offset().left,
				width: target.width(),
				height: target.height(),
				display: 'none',
				opacity: 0,
				zIndex: options.zIndex,
				backgroundColor: options.color
			});
			// set image css properities
			img.css({
				zIndex: options.zIndex+1,
				position: 'absolute',
				top: (target.height()/2-options.image.size.height/2),
				left: (target.width()/2-options.image.size.width/2)
			});
			// insert image into mask and append mask to body
			mask.html(img);
			$("body").append(mask);
			// onBeforeLoad
			if (callFunction(options, "onBeforeLoad", this) === false) return this;
			// reveal mask
			if (!this.isStarted())
			{
				mask.css({opacity: 0, display: 'block'}).fadeTo(options.loadSpeed, options.opacity, function()
				{
					callFunction(options, "onLoad", $.loadAnimation);
				});
			}
			return this;
		},
		end: function()
		{
			var self = this;
			if (!this.isStarted()) { return self; }
			if (callFunction(conf, "onBeforeClose", self) === false) return self;
			mask.fadeOut(conf.closeSpeed, function()
			{
				animated.css({zIndex: false ? origIndex : null});
				callFunction(conf, "onClose", self);
			});
		}
	};
	// jQuery plugin initialization
	$.prototype.loadAnimation = function(conf)
	{
		// no elements to expose
		if (!this.length) return this;
		var options = {
			eAlert: true,
			// mask settings
			maskId: 'exposeMask',
			loadSpeed: 'slow',
			closeSpeed: 'fast',
			// css settings
			zIndex: 998,
			opacity: 0.9,
			color: '#ccc',
			// image settings
			image: {
				src: '',
				alt: 'loading...',
				size: {
					width: 100,
					height: 10
				}
			}
		};
		// save critical options
		if (typeof conf == 'string') conf = {color: conf};
		if (typeof conf.image == 'string') conf.image = { src: conf.image, alt: options.image.alt, size: options.image.size };
		if (conf.image.alt == undefined) conf.image.alt = options.image.alt;
		if (conf.image.size == undefined) conf.image.size = options.image.size;
		if (conf.image.size.width == undefined) conf.image.size.width = options.image.size.width;
		if (conf.image.size.height == undefined) conf.image.size.height = options.image.size.height;
		// extend and overwrite standard options with user config
		$.extend(options, conf);
		// start animation
		$.loadAnimation.start(this, options);
		// return jQuery object
		return this;
	};
})(jQuery);