var jed = function()
{
	var URL_PREFIX = 'ads/';
	var FADE_OUT_TIME = 1000;
	var FADE_IN_TIME = 1000;

	var numAds = {};
	var rescheduleCallback = function() {};
	var data = {};

	//generates a random number between 1 and max (inclusive)
	function getRandomNumber(max)
	{
		return Math.floor((Math.random()*max)+1)
	}

	function getType(adRotater)
	{
		var cls = $(adRotater).attr('class');
		return cls.substring(cls.indexOf("-")+1);
	}
	
	function getAdUrl(adRotator)
	{
		var type = getType(adRotator);
		var adNumber = getRandomNumber(numAds[type]);
		var url = URL_PREFIX + type + '/ad' + adNumber + '.html?id=' + getRandomNumber(4294967295);
		return url;
	}

	function fadeOutAds()
	{
		$('div[class|=adRotater]').each(
			function()
			{
				var type = getType(this);
				if(numAds[type] > 1)
				{
					var url = getAdUrl(this);
					data[getType(this)].newsrc = url; 
					if(url != data[getType(this)].oldsrc)
					{	
						$(this).fadeOut(FADE_OUT_TIME);
					}
				}
			});
		setTimeout(function() { changeAds(); }, FADE_OUT_TIME);
	}
	
	function fadeInAds()
	{
		$('div[class|=adRotater]').each(
			function()
			{
				var type = getType(this);
				if(numAds[type] > 1)
					$(this).fadeIn(FADE_IN_TIME);
			}); 
		rescheduleCallback();
	}

	function changeAds()
	{
		$('div[class|=adRotater]').each(
			function()
			{
				var oldsrc = data[getType(this)].oldsrc;
				var newsrc = data[getType(this)].newsrc;
				var adContainer = this;
				
				if(newsrc != oldsrc)
				{
					data[getType(this)].oldsrc = newsrc;
					$.get(newsrc, function(newAd)
						{
							$(adContainer).html(newAd);
						});
				}
			});
		fadeInAds();
	}

	return {
		getAdRotator : function()
		{
			return {
				setNumAds : function(size, num)
				{
					numAds[size] = num;
				},

				setReschedulingCallback : function(callback)
				{
					rescheduleCallback = callback;
				},

				rotateAds : function()
				{
					fadeOutAds();
				},

				initAds : function()
				{
					$('div[class|=adRotater]').each(
						function()
						{
							var newObj = {};
							newObj['oldsrc'] = '';
							newObj['newsrc'] = getAdUrl(this);
							data[getType(this)] = newObj;
						});
					changeAds();
				}
			};
		}
	};
}();
