var preloadImages = [];
var preloadImagesCount = -1;

preloadImagesCount++;
preloadImages[preloadImagesCount] = new Image();
preloadImages[preloadImagesCount].src = '/images/carousel1.jpg';

preloadImagesCount++;
preloadImages[preloadImagesCount] = new Image();
preloadImages[preloadImagesCount].src = '/images/carousel1_on.jpg';

preloadImagesCount++;
preloadImages[preloadImagesCount] = new Image();
preloadImages[preloadImagesCount].src = '/images/carousel2.jpg';

preloadImagesCount++;
preloadImages[preloadImagesCount] = new Image();
preloadImages[preloadImagesCount].src = '/images/carousel2_on.jpg';

preloadImagesCount++;
preloadImages[preloadImagesCount] = new Image();
preloadImages[preloadImagesCount].src = '/images/carousel3.jpg';

preloadImagesCount++;
preloadImages[preloadImagesCount] = new Image();
preloadImages[preloadImagesCount].src = '/images/carousel3_on.jpg';

preloadImagesCount++;
preloadImages[preloadImagesCount] = new Image();
preloadImages[preloadImagesCount].src = '/images/carousel4.jpg';

preloadImagesCount++;
preloadImages[preloadImagesCount] = new Image();
preloadImages[preloadImagesCount].src = '/images/carousel4_on.jpg';

preloadImagesCount++;
preloadImages[preloadImagesCount] = new Image();
preloadImages[preloadImagesCount].src = '/images/carousel5.jpg';

preloadImagesCount++;
preloadImages[preloadImagesCount] = new Image();
preloadImages[preloadImagesCount].src = '/images/carousel5_on.jpg';

preloadImagesCount++;
preloadImages[preloadImagesCount] = new Image();
preloadImages[preloadImagesCount].src = '/images/carousel6.jpg';

preloadImagesCount++;
preloadImages[preloadImagesCount] = new Image();
preloadImages[preloadImagesCount].src = '/images/carousel6_on.jpg';

preloadImagesCount++;
preloadImages[preloadImagesCount] = new Image();
preloadImages[preloadImagesCount].src = '/images/carousel7.jpg';

preloadImagesCount++;
preloadImages[preloadImagesCount] = new Image();
preloadImages[preloadImagesCount].src = '/images/carousel7_on.jpg';

var objCarousel = {
	timer: null,

	items: null,
	item_images: null,
	item_mirrors: null,
	item_labels: null,

	angles: [],
	positions: [],
	depths: [],
	fadingTextIn: [],

	interval: 25,
	duration: (($.browser.msie) ? 24000 : 30000),

	lowest_interval: 30,
	highest_interval: 500,

	width: 950,
	height: 231,
	center_x: 0,
	center_y: 0,
	
	item_width: 260,
	item_height: 180,
	item_x: 0,
	item_y: 0,

	image_width: 260,
	image_height: 140,

	radius_x: 326,			// the radius in the x direction of the circular path
	radius_y: 0,			// the radius in the y direction of the circular path
	angle_interval: 90,		// the distance in degrees between each item in the circular path
	angle_step: 0,			// how much to increase the angle of an item per millisecond

	starting_angle_offset: 20,
	opacity_offset: 0.2,
	lowest_opacity: 0.3,

	text_fadeIn_angle: 55,
	text_fadeOut_angle: 110,
	text_fadeIn_duration: 500,
	text_fadeOut_duration: 500,

	paused: false,

	loaded: false,
	debugMsg: '',
	debugOutput: 'output',
	showDebug: false,

	timeKeeper: new Date(),
	//resettingInterval: true,
	//idealInterval: 0,

	//intervalSum: 0,
	//stepsToCalculate: 50,

	step: 0,
	//steps_before_reset: 150,

	onetime: function()
	{
		objCarousel.items = $('.carousel-item');

		objCarousel.item_images = $('.carousel-item-image');
		objCarousel.item_mirrors= $('.carousel-item-mirror');
		objCarousel.item_labels = $('.carousel-item-text');

		objCarousel.angle_interval = degToRad((360 / objCarousel.items.length));

		var offset = degToRad(objCarousel.starting_angle_offset);
		for (var i = 0; i < objCarousel.items.length; i++)
		{
			objCarousel.items[i] = $(objCarousel.items[i]);
			objCarousel.item_images[i] = $(objCarousel.item_images[i]);
			objCarousel.item_mirrors[i] = $(objCarousel.item_mirrors[i]);
			objCarousel.item_labels[i] = $(objCarousel.item_labels[i]);

			objCarousel.positions[i] = { x: 0, y: 0 };
			objCarousel.angles[i] = i * objCarousel.angle_interval;
			objCarousel.depths[i] = 1000;
			objCarousel.fadingTextIn[i] = false;

			objCarousel.angles[i] += offset;
			if (objCarousel.angles[i] >= 360)
				objCarousel.angles[i] -= 360;
			else if (objCarousel.angles[i] < 0)
				objCarousel.angles[i] += 360;
		}

		$('.carousel-item').mouseover(function() 
		{
			objCarousel.paused = true;
			$(this).addClass('carousel-item-hover');
			$(this).children()[0].src = $(this).children()[0].src.replace('.jpg', '_on.jpg');
		});

		$('.carousel-item').mouseout(function() 
		{
			objCarousel.paused = false;
			$(this).removeClass('carousel-item-hover');
			$(this).children()[0].src = $(this).children()[0].src.replace('_on.jpg', '.jpg');
		});

		objCarousel.loaded = true;
	},

	restart: function()
	{
		objCarousel.stop();

		var offset = degToRad(objCarousel.starting_angle_offset);
		for (var i = 0; i < objCarousel.items.length; i++)
		{
			objCarousel.positions[i] = { x: 0, y: 0 };
			objCarousel.angles[i] = i * objCarousel.angle_interval;
			objCarousel.depths[i] = 1000;
			objCarousel.fadingTextIn[i] = false;

			objCarousel.angles[i] += offset;
			if (objCarousel.angles[i] >= 360)
				objCarousel.angles[i] -= 360;
			else if (objCarousel.angles[i] < 0)
				objCarousel.angles[i] += 360;
		}

		var image_text = $('.carousel-item-text');
		for (var i = 0; i < image_text.length; i++)
		{
			image_text[i].style.display = 'none';
		}

		objCarousel.init();
		objCarousel.start();
	},

	init: function()
	{
		if (!objCarousel.loaded)
			objCarousel.onetime();

		objCarousel.text_fadeIn_angle_rad = degToRad(objCarousel.text_fadeIn_angle);
		objCarousel.text_fadeOut_angle_rad = degToRad(objCarousel.text_fadeOut_angle);

		objCarousel.angle_step = degToRad(360 / objCarousel.duration);

		objCarousel.item_x = objCarousel.item_width / 2;
		objCarousel.item_y = objCarousel.item_height / 2;

		objCarousel.center_x = Math.round(objCarousel.width / 2);
		objCarousel.center_y = Math.round(objCarousel.height / 2);

		for (var i = 0; i < objCarousel.items.length; i++)
		{
			if (objCarousel.radius_x == 0)
				objCarousel.positions[i].x = 0 - objCarousel.item_x + objCarousel.center_x;
			if (objCarousel.radius_y == 0)
				objCarousel.positions[i].y = 0 - objCarousel.item_y + objCarousel.center_y;
		}
	},

	start: function()
	{
		objCarousel.paused = false;

		if (objCarousel.timer)
		{
			clearInterval(objCarousel.timer);
		}

		delete objCarousel.timeKeeper;	
		objCarousel.timeKeeper = new Date();

		objCarousel.timer = setInterval(function()
		{
			var elapsed = new Date() - objCarousel.timeKeeper;

			objCarousel.debugMsg = '';
			if (objCarousel.showDebug)
				objCarousel.debugMsg += 'Interval: ' + objCarousel.interval + '<br/>Time Elapsed: ' + (new Date() - objCarousel.timeKeeper ) + '<br/>Step: ' + objCarousel.step + '<br/>';

			/*if (objCarousel.resettingInterval && objCarousel.step < objCarousel.stepsToCalculate)
			{
				objCarousel.intervalSum += (((new Date() - objCarousel.timeKeeper) > objCarousel.highest_interval) ? objCarousel.highest_interval : (new Date() - objCarousel.timeKeeper));
			}
			else if (objCarousel.resettingInterval)
			{
				objCarousel.interval = Math.round(objCarousel.intervalSum / objCarousel.stepsToCalculate);
				objCarousel.interval = Math.round(objCarousel.interval - (objCarousel.interval * 0.05));
				if (objCarousel.interval < objCarousel.lowest_interval)
					objCarousel.interval = objCarousel.lowest_interval;
				else if (objCarousel.interval > objCarousel.highest_interval)
					objCarousel.interval = objCarousel.highest_interval

				objCarousel.angle_step = degToRad(360 / (objCarousel.duration / objCarousel.interval));

				objCarousel.resettingInterval = false;
				objCarousel.timeKeeper = new Date();
				objCarousel.start();
			}*/

			if (objCarousel.paused == false)
			{
				for (var i = 0; i < objCarousel.items.length; i++)
				{
					objCarousel.angles[i] = objCarousel.angles[i] + (objCarousel.angle_step * elapsed);
					if (objCarousel.angles[i] >= PI_TIMES_2)
						objCarousel.angles[i] -= PI_TIMES_2;
					else if (objCarousel.angles[i] < 0)
						objCarousel.angles[i] += PI_TIMES_2;
					
					if (objCarousel.radius_x != 0)
						objCarousel.positions[i].x = Math.round((objCarousel.radius_x * Math.cos(objCarousel.angles[i])) - objCarousel.item_x) + objCarousel.center_x;
					if (objCarousel.radius_y != 0)
						objCarousel.positions[i].y = Math.round((objCarousel.radius_y * Math.sin(objCarousel.angles[i])) - objCarousel.item_y) + objCarousel.center_y;
					objCarousel.depths[i] = Math.round(pctAwayFromAngle(objCarousel.angles[i], ANGLE_115) * 100 + 2000);

					objCarousel.item_images[i].css('opacity', ((pctAwayFromAngle(objCarousel.angles[i], ANGLE_90) * (1 - objCarousel.lowest_opacity)) + objCarousel.lowest_opacity) + objCarousel.opacity_offset + '');
					objCarousel.item_images[i].css('height', Math.round(((pctAwayFromAngle(objCarousel.angles[i], ANGLE_90) / 2) + 0.5) * objCarousel.image_height) + 'px');
					objCarousel.item_images[i].css('width', Math.round(((pctAwayFromAngle(objCarousel.angles[i], ANGLE_90) / 2) + 0.5) * objCarousel.image_width) + 'px');

					objCarousel.item_mirrors[i].css('height', Math.round(((pctAwayFromAngle(objCarousel.angles[i], ANGLE_90) / 2) + 0.5) * 55) + 'px');
					objCarousel.item_mirrors[i].css('width', objCarousel.item_images[i].width() + 'px');

					objCarousel.item_images[i].css('margin-top', Math.round((objCarousel.image_height - objCarousel.item_images[i].height()) / 2) + 'px');
					objCarousel.items[i].css('z-index', objCarousel.depths[i] + '');	
					objCarousel.items[i].css('left', objCarousel.positions[i].x + 'px');
					objCarousel.items[i].css('top', objCarousel.positions[i].y + 'px');
					objCarousel.items[i].css('visibility', 'visible');

					if (objCarousel.angles[i] > objCarousel.text_fadeIn_angle_rad && objCarousel.angles[i] < objCarousel.text_fadeOut_angle_rad && !objCarousel.fadingTextIn[i])
					{
						objCarousel.fadingTextIn[i] = true;
						objCarousel.item_labels[i].stop(true, true).show('slide', { percent: 100 }, objCarousel.text_fadeIn_duration);
					}
					else if (objCarousel.angles[i] > objCarousel.text_fadeOut_angle_rad && objCarousel.fadingTextIn[i])
					{
						objCarousel.fadingTextIn[i] = false;
						objCarousel.item_labels[i].stop(true, true).hide('blind', {}, objCarousel.text_fadeOut_duration);
					}

					if (objCarousel.showDebug)
					{
						objCarousel.debugMsg += '[' + i + '] = angle: ' + Math.round(objCarousel.angles[i] * (180 / Math.PI)) + ', x: ' + objCarousel.positions[i].x + ', y: ' + objCarousel.positions[i].y + ', z-index: ' + 
															 objCarousel.depths[i] + ', opacity: ' + (((pctAwayFromAngle(objCarousel.angles[i], ANGLE_90) * (1 - objCarousel.lowest_opacity)) + objCarousel.lowest_opacity) + objCarousel.opacity_offset) + 
															 '<br/>';
					}
				}

				if (objCarousel.showDebug && document.getElementById(objCarousel.debugOutput))
					document.getElementById(objCarousel.debugOutput).innerHTML = objCarousel.debugMsg;

				objCarousel.step++;
				/*if (objCarousel.step >= objCarousel.steps_before_reset)
				{
					objCarousel.step -= objCarousel.steps_before_reset;
					objCarousel.intervalSum = 0;
					//objCarousel.resettingInterval = true;
				}*/
			}
			else
			{
				/*if (objCarousel.resettingInterval)
				{
					objCarousel.step = 0;
					objCarousel.intervalSum = 0;
					objCarousel.timeKeeper = new Date();
				}*/
			}

			delete objCarousel.timeKeeper;
			objCarousel.timeKeeper = new Date();
		}, objCarousel.interval);
	},

	stop: function()
	{
		if (objCarousel.timer)
			clearInterval(objCarousel.timer);
	},

	pause: function(value)
	{
		objCarousel.paused = value;
	}
};

var PI_TIMES_2 = Math.PI * 2;
var ANGLE_90 = Math.PI / 2;
var ANGLE_115 = (Math.PI / 36) * 23;

function degToRad(x)
{
	return (x * (Math.PI / 180))
}

function pctAwayFromAngle(x, angle)
{
	var distance = x - angle;
	if (distance < 0)
		distance *= -1;

	if (distance > Math.PI)
		distance = -Math.PI + (distance - Math.PI);

	if (distance < 0)
		distance *= -1;

	return (1 - (distance / Math.PI));
}

$(document).ready(function() {
	var arVersion = navigator.appVersion.split("MSIE")
	var version = parseFloat(arVersion[1])
	if ((version >= 5.5) && (document.body.filters)) 
	{
		for(var i=0; i<document.images.length; i++)
		{
			var img = document.images[i]
			var imgName = img.src.toUpperCase()
			if (imgName.substring(imgName.length-3, imgName.length) == "PNG")
			{
				var imgID = (img.id) ? "id='" + img.id + "' " : ""
				var imgClass = (img.className) ? "class='" + img.className + "' " : ""
				var imgTitle = (img.title) ? "title='" + img.title + "' " : "title='" + img.alt + "' "
				var imgStyle = "display:inline-block;" + img.style.cssText 
				if (img.align == "left") imgStyle = "float:left;" + imgStyle
				if (img.align == "right") imgStyle = "float:right;" + imgStyle
				if (img.parentElement.href) imgStyle = "cursor:hand;" + imgStyle
				var strNewHTML = "<span " + imgID + imgClass + imgTitle
				+ " style=\"" + "width:" + img.width + "px; height:" + img.height + "px;" + imgStyle + ";"
				+ "filter:progid:DXImageTransform.Microsoft.AlphaImageLoader"
				+ "(src=\'" + img.src + "\', sizingMethod='scale');\"></span>" 
				img.outerHTML = strNewHTML
				i = i-1
			}
		}
	}  

	objCarousel.init();

	objCarousel.start();
});
