var WMX = WMX || { };

WMX.EvoxGallery5 = Class.create({
	initialize: function(vehicleArray, evoxVehicleDiv, zoomEvoxVehicleDiv)
	{
		// Initialize Variables //
		if (vehicleArray && evoxVehicleDiv && (vehicleArray.length > 0))
		{
			this.fixArray(vehicleArray);
	 	 	for (var i=0, j=vehicleArray.length; i < j; i++)
			{
				this.fixArray(vehicleArray[i].NormalPath);
	 	 		if (vehicleArray[i].ZoomPath)
				{
					this.fixArray(vehicleArray[i].ZoomPath);
				}
			}
	 	 	
			this.vehicles = vehicleArray;
			this.parentContainer = $(evoxVehicleDiv);
			this.zoomParentContainer = $(zoomEvoxVehicleDiv);
			this.finishValidator = 2;
			this.finishZoomValidator = 2;
			this.transitionToDrivingAngleComplete = 0;
			this.vehicleImageIsLoaded = false;
			this.vehicleDetailLinks = $A();
			this.evoxVehicleModelListHeight = 0;
			this.zoomEvoxVehicleModelListHeight = 0;
			this.evoxVehicleModelListIframesInitialized = false;
						
			this.currentVehicle = 0;
			this.currentVehicleAngle = 0;
			this.currentVehicleIndex = 0;
			this.currentVehicleColumn = 0;
			this.evoxGalleryControlsEnabled = true;
			this.defaultForwardDrivingAngle = 0;
			this.defaultReverseDrivingAngle = 4;
	 	 	
			this.xCenterOfEvoxGallery = new Number(Math.round($('evoxGallery5Wrapper').getWidth() / 2));
			this.yCenterOfEvoxGallery = new Number(Math.round($('evoxGallery5Wrapper').getHeight() / 2));
			this.xCenterOfVehicle = 0;
			this.yCenterOfVehicle = 0;
			 	 						
			this.vehiclePositions = {start: 0, center: 1, end: 2};
			this.currentVehiclePosition = this.vehiclePositions.start;
			this.vehicleDriveDirections = {forward: 0, reverse: 1};
			this.currentVehicleDriveDirection = this.vehicleDriveDirections.forward;
			
			if ($('evoxVehicleModelList'))
			{
				this.fillDropDown(this.vehicles, 'evoxVehicleModelList');
				$('evoxVehicleModelList').hide();
			}
	 	 	
			// attach event handlers for evoxGallery5Controls
			this.setOnEvent($('nextVehicle'),'click', this.nextVehicle.bind(this));
			this.setOnEvent($('previousVehicle'),'click', this.previousVehicle.bind(this));
			this.setOnEvent($('evoxNextVehicle_control'),'mouseover', this.activateControl.bind(this, 'evoxNextVehicle_control', 'active'));
			this.setOnEvent($('evoxNextVehicle_control'),'mouseout', this.deactivateControl.bind(this, 'evoxNextVehicle_control', 'active'));
			this.setOnEvent($('chooseModel'),'click', this.showHideVehicleModelList.bind(this));
			this.setOnEvent($('zoomVehicle'),'click', this.showHideVehicleModelList.bind(this));
			this.setOnEvent($('rotateVehicleLeft'),'click', this.nextAngle.bind(this));
			this.setOnEvent($('rotateVehicleRight'),'click', this.previousAngle.bind(this));
			this.setOnEvent($('evoxRotateVehicle_control'),'mouseover', this.activateControl.bind(this, 'evoxRotateVehicle_control', 'active'));
			this.setOnEvent($('evoxRotateVehicle_control'),'mouseout', this.deactivateControl.bind(this, 'evoxRotateVehicle_control', 'active'));
			this.setOnEvent($('getVehicleDetails'),'click', this.showHideVehicleModelList.bind(this, 'evoxVehicleModelList'));
			
			// Initialize zoomEvoxGallery section
			if (this.zoomParentContainer)
			{
				if ($('zoomEvoxVehicleModelList'))
				{
					this.fillDropDown(this.vehicles, 'zoomEvoxVehicleModelList');
					$('zoomEvoxVehicleModelList').hide();
				}
	 	 	
				// attach event handlers for zoomEvoxGallery5Controls
				this.setOnEvent($('zoomNextVehicle'),'click', this.nextVehicle.bind(this));
				this.setOnEvent($('zoomPreviousVehicle'),'click', this.previousVehicle.bind(this));
				this.setOnEvent($('zoomNextVehicle_control'),'mouseover', this.activateControl.bind(this, 'zoomNextVehicle_control', 'active'));
				this.setOnEvent($('zoomNextVehicle_control'),'mouseout', this.deactivateControl.bind(this, 'zoomNextVehicle_control', 'active'));
				this.setOnEvent($('zoomChooseModel'),'click', this.showHideVehicleModelList.bind(this));
				this.setOnEvent($('zoomRotateVehicleLeft'),'click', this.nextAngle.bind(this));
				this.setOnEvent($('zoomRotateVehicleRight'),'click', this.previousAngle.bind(this));
				this.setOnEvent($('zoomRotateVehicle_control'),'mouseover', this.activateControl.bind(this, 'zoomRotateVehicle_control', 'active'));
				this.setOnEvent($('zoomRotateVehicle_control'),'mouseout', this.deactivateControl.bind(this, 'zoomRotateVehicle_control', 'active'));
				this.setOnEvent($('zoomGetVehicleDetails'),'click', this.showHideVehicleModelList.bind(this));
				this.setOnEvent($('zoomGetVehicleDetails'),'click', this.navigateToInventorySearch.bind(this));
			}
			
			this.galleryLink = $('galleryLink').value;		
			this.changeImage(this.currentVehicle, this.currentVehicleAngle);
			this.startDrive(this.vehiclePositions.start);
		}
	},
	setOnEvent: function(element, onEvent, func)
	{
		if (element)
		{
			element.observe(onEvent, func);
		}
	},
	activateControl: function(elementId, className)
	{
		$(elementId).addClassName(className);
	},
	deactivateControl: function(elementId, className)
	{
		$(elementId).removeClassName(className);
	},
	afterChangeFinish: function(element)
	{
		$(element).remove();
		this.finishValidator = 2;
	},
	afterZoomChangeFinish: function(element)
	{
		$(element).remove();
		this.finishZoomValidator = 2;
	},
	changeVehicle: function(vehicleIndex, e)
	{	
		var selectedVehicleIndex = $(e).element().readAttribute("vehicleIndex");
		var selectedVehicleColumn = $(e).element().readAttribute("vehicleColumn"); 
		
		if (e)
		{
			e.stop();
		}
		
		if ($(e).element().descendantOf('evoxVehicleModelList'))
		{
			this.deactivateControl('evoxChooseModel_control', "active");
		}
		else if ($(e).element().descendantOf('zoomEvoxVehicleModelList'))
		{
			this.deactivateControl('zoomChooseModel_control', "active");
		}
		
		this.showHideVehicleModelList(this);
		if ((this.currentVehicleIndex != selectedVehicleIndex) || 
			(this.currentVehicleColumn != selectedVehicleColumn))
		{
			if ((this.currentVehicleIndex < selectedVehicleIndex) ||
				((this.currentVehicleIndex == selectedVehicleIndex) && (this.currentVehicleColumn < selectedVehicleColumn)))
			{
				this.moveVehicleInit(this.vehicleDriveDirections.forward, vehicleIndex, this.currentVehicleAngle); 	
			}
			else
			{
				this.moveVehicleInit(this.vehicleDriveDirections.reverse, vehicleIndex, this.currentVehicleAngle); 	
			}
			this.currentVehicle = vehicleIndex;
			this.currentVehicleIndex = selectedVehicleIndex;
			this.currentVehicleColumn = selectedVehicleColumn;
		}
	},
	updateVehicleDetailInfo: function(vehicleIndex)
	{
		var evoxMakeModel = this.vehicles[vehicleIndex].Make + ' ' + this.vehicles[vehicleIndex].Model;
		var evoxMake = this.vehicles[vehicleIndex].Make;
		var evoxMakeId = this.vehicles[vehicleIndex].MakeId;
		var evoxModel = this.vehicles[vehicleIndex].Model;
		var evoxModelId = this.vehicles[vehicleIndex].ModelId;
		var evoxStyleId = this.vehicles[vehicleIndex].StyleId;
		var evoxModelYear = this.vehicles[vehicleIndex].ModelYear;
		var linkTitle = "Click here to get more details on the " + evoxModelYear + " " + evoxMakeModel;
		var vehicleInfo = evoxModelYear + " " + evoxMakeModel;
		
		var vehicleHref = "http://" + location.host;
		if (location.host.lastIndexOf('/') != (location.host.length - 1))
		{
			vehicleHref += "/";
		}
		
		if (this.galleryLink.length < 1)
		{
			this.galleryLink = "New-Inventory";
		}
		
		vehicleHref += this.galleryLink + ".aspx?MakeId=" + evoxMakeId + "&Make=" + evoxMake + "&Model=" + evoxModel + "&ModelId=" + evoxModelId + "&StyleId=" + evoxStyleId;
		
		$('getVehicleDetails').setAttribute("title", linkTitle, 0);
		$('getVehicleDetails').href = vehicleHref;
		
		$('zoomGetVehicleDetails').setAttribute("title", linkTitle, 0);			
		$('zoomGetVehicleDetails').href = vehicleHref; 
		
		$(this.parentContainer).getElementsBySelector('img').each(function(img) { 
			$(img).writeAttribute("alt", vehicleInfo); 
		});		
		
		$(this.parentContainer).getElementsBySelector('a#vehicleLink')[0].href = $('getVehicleDetails').href;
		$(this.parentContainer).getElementsBySelector('a#vehicleLink')[0].writeAttribute("title", linkTitle, 0); 		
		
		$(this.zoomParentContainer).getElementsBySelector('img').each(function(zoomImg) { 
			$(zoomImg).writeAttribute("alt", vehicleInfo); 
		});		
		
		$(this.zoomParentContainer).getElementsBySelector('a#zoomVehicleLink')[0].href = $('getVehicleDetails').href;
		$(this.zoomParentContainer).getElementsBySelector('a#zoomVehicleLink')[0].writeAttribute("title", linkTitle, 0); 		
	},
	enableEvoxGalleryControls: function(enable)
	{
		if (enable)
		{
			$('previousVehicle').removeAttribute("onclick");
			$('previousVehicle').observe('click', this.previousVehicle.bind(this));
			$('nextVehicle').removeAttribute("onclick");
			$('nextVehicle').observe('click', this.nextVehicle.bind(this));
			$('chooseModel').removeAttribute("onclick");
			$('chooseModel').observe('click', this.showHideVehicleModelList.bind(this));
			$('rotateVehicleLeft').removeAttribute("onclick");
			$('rotateVehicleLeft').observe('click', this.nextAngle.bind(this));
			$('rotateVehicleRight').removeAttribute("onclick");
			$('rotateVehicleRight').observe('click', this.previousAngle.bind(this));
			$('getVehicleDetails').removeAttribute("onclick");
			$('getVehicleDetails').observe('click', this.showHideVehicleModelList.bind(this, 'evoxVehicleModelList'));
			$('zoomVehicle').removeAttribute("onclick");
		}
		else
		{
			Event.stopObserving('previousVehicle', 'click');
			$('previousVehicle').setAttribute("onclick","return false", 0);
			Event.stopObserving('nextVehicle', 'click');
			$('nextVehicle').setAttribute("onclick","return false", 0);
			Event.stopObserving('chooseModel', 'click');
			$('chooseModel').setAttribute("onclick","return false", 0);
			Event.stopObserving('rotateVehicleLeft', 'click');
			$('rotateVehicleLeft').setAttribute("onclick","return false", 0);
			Event.stopObserving('rotateVehicleRight', 'click');
			$('rotateVehicleRight').setAttribute("onclick","return false", 0);
			Event.stopObserving('getVehicleDetails', 'click');
			$('getVehicleDetails').setAttribute("onclick","return false", 0);
			$('zoomVehicle').setAttribute("onclick","return false", 0);
		}
		this.evoxGalleryControlsEnabled = enable;
	},
	fixArray: function (a)
	{
		if (!a[a.length - 1])
		{
			a.pop();
		}
	},
	fillDropDown: function(vehicles, el)
	{
		var maxColumns = 4;
		var maxVehiclesPerColumn = 9;
		var columnsNeeded = Math.ceil(vehicles.length / maxVehiclesPerColumn);
		var columns = (columnsNeeded < maxColumns)? columnsNeeded : maxColumns;
		var rows = Math.ceil(vehicles.length / columns);
		var index = 0;
		var iAllVehiclesAdded = false;
		
		var oTbl = new Element('table', {'border': 0, 'cellpadding': 0, 'cellspacing': 0 });
		var oTbody = new Element('tbody');
		var oTr = null;
		var oTd = null;
		var oA = null;
		var oDiv = null;
					
		var useOddSelection = true;
		
		for (var i=0; i < rows; i++)
		{
			oTr = new Element('tr');
			useOddSelection = !useOddSelection;								
			for (var j=0; j < columns; j++)
			{					  
				oTd = new Element('td', {'class': 'column'});
				if (useOddSelection && (j%2 == 1))
				{
					oTd.addClassName('alternateItem');
				}
				else if (!useOddSelection && (j%2 == 0))
				{
					oTd.addClassName('alternateItem');
				}
				if (index < vehicles.length)
				{
					oA = new Element('a', {'href': '#'}).update(vehicles[index].Make + ' ' + vehicles[index].Model).observe('click', this.changeVehicle.bind(this, index));
					$(oA).writeAttribute("vehicleIndex", i);
					$(oA).writeAttribute("vehicleColumn", j);
					$(oTd).insert(oA);
					index++;
				}
				$(oTr).insert(oTd);
			}
			$(oTbody).insert(oTr);			
		}
					
		$(oTbl).insert(oTbody);
			
		$(el).getElementsBySelector('div.modelList')[0].insert(oTbl);
		
		if (columns > 1)
		{
			$(el).addClassName('multi-list');
		} 		
		
		if ($(el).id == 'hiddenEvoxVehicleModelList')
		{
			this.evoxVehicleModelListHeight = $('hiddenEvoxVehicleModelList').getElementsBySelector('table')[0].getHeight();
			this.evoxVehicleModelListWidth = $('hiddenEvoxVehicleModelList').getElementsBySelector('table')[0].getWidth();
		}
		else
		{
			var oIframe = document.createElement('iframe');
			oIframe.id = el + "_iframe";
			oIframe.src = "javascript:' '";
			oIframe.allowTransparency = true;
			oIframe.frameBorder = 0;
			oIframe.scrolling = 'no';
			oIframe.style.filter = "progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=0)";
			
			$(el).insert(oIframe);
			$(el).insert({bottom: oIframe});
		}
		
		if (columnsNeeded >= maxColumns)
		{
			$(el).addClassName('columnLayout' + maxColumns);
		}
		else
		{
			$(el).addClassName('columnLayout' + columnsNeeded);
		}
	},	
	getVehicleInformation: function()
	{
		var oImgs = $(this.parentContainer).getElementsBySelector('img');
		var oImg = null;
		for (var i=0, j=oImgs.length; i < j; i++)
		{
			if ($(oImgs[i]).getHeight() > 0)
			{
				oImg = oImgs[i];
				break;
			}
		}
		if (oImg != null)
		{
			this.xCenterOfVehicle = new Number(Math.round($(oImg).getWidth() / 2));
			this.yCenterOfVehicle = new Number(Math.round($(oImg).getHeight() / 2));
		}
		
		this.xCenterOfEvoxGallery = new Number(Math.round($('evoxGallery5Wrapper').getWidth() / 2));
		this.yCenterOfEvoxGallery = new Number(Math.round($('evoxGallery5Wrapper').getHeight() / 2));
		if (Prototype.Browser.IE)
		{
			this.parentContainer.setStyle({ width: (this.xCenterOfVehicle * 2), height: (this.yCenterOfVehicle * 2)  });
		}
	},
	modifyVehicleModelListClass: function(elementId, className, addClass)
	{
		if (!addClass && $(elementId).hasClassName(className))
		{
			$(elementId).removeClassName(className);
		}
		else
		{
			$(elementId).addClassName(className);
		}
	},
	navigateToInventorySearch: function(e)
	{
		location.href = $('zoomGetVehicleDetails').href;
	},
	showHideVehicleModelList: function(e)
	{
		var showList = false;
		if (e.stop)
		{
			e.stop();
			if (e && ((e.element(e).id == 'chooseModel') ||
					  (e.element(e).descendantOf('chooseModel')) ||
					  (e.element(e).id == 'zoomChooseModel') ||
					  (e.element(e).descendantOf('zoomChooseModel'))))
			{
				showList = true;
			}
		}	
		
		var oDivId = null;
		if (showList && $(e).element().descendantOf('evoxChooseModel_control'))
		{
			oDivId = "evoxChooseModel_control";
		}
		else if (showList && $(e).element().descendantOf('zoomChooseModel_control'))
		{
			oDivId = "zoomChooseModel_control";
		}
		
		var vehicleModelListId = (!$('zoomEvoxGallery5Wrapper').visible() || 
								  ($('zoomEvoxGallery5Wrapper').getStyle('display') == 'none')) ? 'evoxVehicleModelList' : 'zoomEvoxVehicleModelList';
		if (showList &&	!$(vehicleModelListId).visible())
		{
			if (oDivId)
			{
				this.activateControl(oDivId, "active");
			}
			
			new Effect.Appear($(vehicleModelListId), { 
				direction: 'top-left',
				duration: 0.4,
				transition: Effect.Transitions.sinoidal,
				afterFinish: this.initializeEvoxVehicleModelListIframes.bind(this, vehicleModelListId)
			});
		}
		else
		{
			if (oDivId)
			{
				this.deactivateControl(oDivId, "active");
			}			
			
			new Effect.Fade($(vehicleModelListId), { 
				duration: 0.5,
				transition: Effect.Transitions.sinoidal
			});
		}
	},
	initializeEvoxVehicleModelListIframes: function()
	{
		if (!this.evoxVehicleModelListIframesInitialized && 
		   ($('zoomEvoxGallery5Wrapper').getStyle('display') != 'block'))
		{
			if (this.resizeWaiter)
			{
				this.resizeWaiter.stop();
			}
			
			var iModelListHeight = $('evoxVehicleModelList').getElementsBySelector('table')[0].getHeight();
			var iModelListWidth = $('evoxVehicleModelList').getElementsBySelector('table')[0].getWidth(); 
			
			if (iModelListHeight > 0)
			{
				var oIframe = $('evoxVehicleModelList').getElementsBySelector('iframe')[0];
				var oZoomIframe = $('zoomEvoxVehicleModelList').getElementsBySelector('iframe')[0];
				
				$(oIframe).setStyle({ 
					marginTop: (-iModelListHeight) + 'px', 
					height: iModelListHeight + 'px', 
					width: iModelListWidth + 'px'
					});
					
				$(oZoomIframe).setStyle({ 
					marginTop: (-iModelListHeight) + 'px', 
					height: iModelListHeight + 'px', 
					width: iModelListWidth + 'px'
					});
				
				this.resizeWaiter = null;
				this.evoxVehicleModelListIframesInitialized = true;					
			}
			else
			{
				this.resizeWaiter = new PeriodicalExecuter(this.displayEvoxVehicleModelListIframe.bind(this) , 0.1);
			}
		}
	},
	drive: function(vehiclePosition)
	{
		var xDistanceToMove = 0;
		var yDistanceToMove = 0;
		var iDuration = new Number(.8);
		var iDelay = new Number(0);
		
		this.currentVehiclePosition = vehiclePosition;
		
		switch(vehiclePosition)
		{
			case this.vehiclePositions.start: 
				this.driveToStart(xDistanceToMove, yDistanceToMove, iDuration, iDelay);
				break;
			case this.vehiclePositions.center:
				this.driveToCenter(xDistanceToMove, yDistanceToMove, iDuration, iDelay);
				break;
			case this.vehiclePositions.end:
				this.driveToEnd(xDistanceToMove, yDistanceToMove, iDuration, iDelay);
				break;
		}
	},
	driveToStart: function(xDistanceToMove, yDistanceToMove, iDuration, iDelay)
	{
		this.enableEvoxGalleryControls(false);
		this.getVehicleInformation();	
		
		if (this.currentVehicleDriveDirection == this.vehicleDriveDirections.forward)
		{
			xDistanceToMove = (this.xCenterOfEvoxGallery * 2);
			yDistanceToMove = -(this.yCenterOfVehicle);	
		}
		else
		{
			xDistanceToMove = -(this.xCenterOfVehicle * 2);
			yDistanceToMove = ((this.yCenterOfEvoxGallery * 2) - this.yCenterOfVehicle);
		}
		
		iDuration = .1;			
						
		if (Prototype.Browser.IE && !this.parentContainer.hasClassName('collapsed'))
		{
			this.parentContainer.addClassName('collapsed');				
		}
					
		if (this.isFirstDrive)
		{
			new Effect.Move(this.parentContainer.id, { x: xDistanceToMove, y: yDistanceToMove, mode: 'absolute',
				duration: iDuration, transition: Effect.Transitions.full, 
				afterFinish: this.drive.bind(this, this.vehiclePositions.center, this.currentVehicle), 
				queue: { position: 'end', scope: 'EvoxGallery5'}
			});
			this.isFirstDrive = false;			
		}
		else
		{
			new Effect.Move(this.parentContainer.id, { x: xDistanceToMove, y: yDistanceToMove, mode: 'absolute',
				duration: iDuration, transition: Effect.Transitions.full, 
				beforeStart: this.changeImage.bind(this, this.currentVehicle, this.currentVehicleAngle),
				afterFinish: this.drive.bind(this, this.vehiclePositions.center, this.currentVehicle), 
				queue: { position: 'end', scope: 'EvoxGallery5'}
			});			
		}	
	},
	driveToCenter: function(xDistanceToMove, yDistanceToMove, iDuration, iDelay)
	{
		if (this.driveWaiter)
		{
			this.driveWaiter.stop();
			this.driveWaiter = null;
		}
		if (!this.vehicleImageIsLoaded)
		{
			this.driveWaiter = 	new PeriodicalExecuter(this.driveToCenter.bind(this, xDistanceToMove, yDistanceToMove, iDuration, iDelay), 0.5);
			return;
		}
		else
		{
			this.updateVehicleDetailInfo(this.currentVehicle);
		}
		
		xDistanceToMove = (this.xCenterOfEvoxGallery - this.xCenterOfVehicle);
		yDistanceToMove = (this.yCenterOfEvoxGallery - this.yCenterOfVehicle);
		
		iDuration = 1.25;
		
		if (Prototype.Browser.IE && this.parentContainer.hasClassName('collapsed'))
		{
			this.parentContainer.removeClassName('collapsed');				
		}
		
		new Effect.Parallel([
			new Effect.Move($(this.parentContainer), { sync: true, delay: iDelay, x: xDistanceToMove, y: yDistanceToMove, mode: 'absolute',
				transition: Effect.Transitions.sinoidal }),
			new Effect.Appear($(this.parentContainer), { 
				sync: true, 
				afterFinish: this.changeVehicleToDefaultDrivingPositionPE.bind(this, true) 
				})
			], {
			afterFinish: this.enableEvoxGalleryControls.bind(this, true),
			duration: iDuration,
			queue: { position: 'end', scope: 'EvoxGallery5'}
		});
	},
	driveToEnd: function(xDistanceToMove, yDistanceToMove, iDuration, iDelay)
	{
		if (this.driveWaiter)
		{
			this.driveWaiter.stop();
			this.driveWaiter = null;
		}
		if (!this.vehicleImageIsLoaded)
		{
			this.driveWaiter = 	new PeriodicalExecuter(this.driveToEnd.bind(this, xDistanceToMove, yDistanceToMove, iDuration, iDelay), 0.5);
			return;
		}		
		
		this.enableEvoxGalleryControls(false);
		
		if (this.currentVehicleDriveDirection == this.vehicleDriveDirections.forward)
		{
			xDistanceToMove = -(this.xCenterOfVehicle * 2);
			yDistanceToMove = ((this.yCenterOfEvoxGallery * 2) - this.yCenterOfVehicle);
		}
		else
		{
			xDistanceToMove = (this.xCenterOfEvoxGallery * 2);
			yDistanceToMove = -(this.yCenterOfVehicle);	
		}
				
		iDuration = 1.0;
		
		if (!Prototype.Browser.IE)
		{
			new Effect.Parallel([
				new Effect.Move($(this.parentContainer), { sync: true, delay: iDelay, x: xDistanceToMove, y: yDistanceToMove, mode: 'absolute',
					transition: Effect.Transitions.sinoidal }),
				new Effect.Fade($(this.parentContainer), { sync: true })
				], {
				duration: iDuration,
				afterFinish: this.drive.bind(this, this.vehiclePositions.start, this.currentVehicle),
				queue: { position: 'end', scope: 'EvoxGallery5'}
			});
		}
		else
		{
			new Effect.Move($(this.parentContainer), { duration: iDuration, delay: iDelay, x: xDistanceToMove, y: yDistanceToMove, mode: 'absolute',
				transition: Effect.Transitions.sinoidal,
				afterFinish: this.drive.bind(this, this.vehiclePositions.start, this.currentVehicle),
				queue: { position: 'end', scope: 'EvoxGallery5'}
			});
		}
	},
	startDrive: function(vehiclePosition)
	{
		if (this.imageWaiter)
		{
			this.imageWaiter.stop();
		}
		if (this.currentImage && this.currentImage.complete)
		{
			if (this.parentContainer.hasClassName('collapsed')) 
			{
				this.getVehicleInformation();	
				this.isFirstDrive = true;			
				if (!Prototype.Browser.IE)
				{
					this.parentContainer.hide();
					this.parentContainer.removeClassName('collapsed');				
				}
			}		
			this.drive(vehiclePosition);	
		}
		else
		{
			this.imageWaiter = new PeriodicalExecuter(this.startDrive.bind(this, vehiclePosition), 0.5);
		}
	},
	nextAngle: function(e)
	{
		e.stop();
		this.showHideVehicleModelList(this);
		
		this.changeImage(this.currentVehicle, this.currentVehicleAngle - 1);
	},
	previousAngle: function(e)
	{
		e.stop();
		this.showHideVehicleModelList(this);
		this.changeImage(this.currentVehicle, this.currentVehicleAngle + 1);
	},
	nextVehicle: function(e)
	{
		e.stop();
		this.moveVehicleInit(this.vehicleDriveDirections.forward, this.currentVehicle + 1, this.currentVehicleAngle); 	
	},
	previousVehicle: function(e)
	{
		e.stop();
		this.moveVehicleInit(this.vehicleDriveDirections.reverse, this.currentVehicle - 1, this.currentVehicleAngle); 	
	},
	moveVehicleInit: function(direction, vehicleIndex, imageIndex)
	{
		this.currentVehicleDriveDirection = direction;
		if (!$('zoomEvoxGallery5Wrapper').visible() || 
			($('zoomEvoxGallery5Wrapper').getStyle('display') == 'none'))
		{
			this.moveVehicle(vehicleIndex);
		}
		else
		{
			this.showHideVehicleModelList(this);
			this.changeImage(vehicleIndex, imageIndex);
			this.updateVehicleDetailInfo(this.currentVehicle);
		}	
	},
	moveVehicle: function(vehicleIndex)
	{	
		this.showHideVehicleModelList(this);
		this.enableEvoxGalleryControls(false);
		
		if (((this.currentVehicleDriveDirection == this.vehicleDriveDirections.forward) &&
			 (this.currentVehicleAngle != this.defaultForwardDrivingAngle)) || 
			((this.currentVehicleDriveDirection == this.vehicleDriveDirections.reverse) &&
			 (this.currentVehicleAngle != this.defaultReverseDrivingAngle)))
		{
			var drivingAngle = (this.currentVehicleDriveDirection == this.vehicleDriveDirections.forward) ? 
				this.defaultForwardDrivingAngle : this.defaultReverseDrivingAngle;
			this.changeImage(this.currentVehicle, drivingAngle);
			this.moveVehiclePE(vehicleIndex);
		}
		else
		{
			this.currentVehicle = vehicleIndex;
		  	this.drive(this.vehiclePositions.end);
		}
	},
	moveVehiclePE: function(vehicleIndex)
	{
		if (this.moveVehicleWaiter)
		{
			this.moveVehicleWaiter.stop();
			this.moveVehicleWaiter = null;
		}
		else
		{
			this.moveVehicleWaiter = new PeriodicalExecuter(this.moveVehiclePE.bind(this, vehicleIndex), 0.8);
			return;
		}
		if (this.transitionToDrivingAngleComplete && this.currentImage.complete)
		{
			this.transitionToDrivingAngleComplete = 0;
			this.currentVehicle = vehicleIndex;
		  	this.drive(this.vehiclePositions.end);
		}
		else
		{
			this.moveVehicleWaiter = new PeriodicalExecuter(this.moveVehiclePE.bind(this, vehicleIndex), .5);
			return;
		}
	},
	changeVehicleToDefaultDrivingPositionPE: function(inCenterPosition)
	{
		if (inCenterPosition && (this.currentVehicleDriveDirection == this.vehicleDriveDirections.reverse))
		{
			if (this.changeVehicleToPositionWaiter)
			{
				this.changeVehicleToPositionWaiter.stop();		
				
				this.changeImage(this.currentVehicle, this.defaultForwardDrivingAngle);
		  		this.currentVehicleDriveDirection = this.vehicleDriveDirections.forward;
				this.currentVehicleAngle != this.defaultForwardDrivingAngle;
			}
			else
			{
				this.changeVehicleToPositionWaiter = new PeriodicalExecuter(this.changeVehicleToDefaultDrivingPositionPE.bind(this, inCenterPosition), .5);
				//return;
			}
		}
	},
	changeInfo: function(vehicleIndex)
	{
		var v = this.vehicles[vehicleIndex];		
			
		var ymmDiv = $('evoxVehicleYearMakeModel');
		if (ymmDiv)
		{
			ymmDiv.innerHTML = v.ModelYear + ' ' + v.Make + ' ' + v.Model;
		}
		
		var mpgDiv = $('evoxVehicleMPG');
		if (mpgDiv)
		{
			if ((v.FuelCity < 1) || (v.FuelHwy < 1))
			{
				mpgDiv.innerHTML = '';
			}
			else
			{
				mpgDiv.innerHTML = '<SPAN>CITY</SPAN> ' + v.FuelCity + ' MPG / <SPAN>HWY</SPAN> ' + v.FuelHwy + ' MPG';
			}
		}
	},
	changeImage: function(vehicleIndex, imageIndex)
	{
		this.vehicleImageIsLoaded = false;
		vehicleIndex = (vehicleIndex >= this.vehicles.length) ? 0 : vehicleIndex;
		vehicleIndex = (vehicleIndex < 0) ? (this.vehicles.length - 1) : vehicleIndex;
		imageIndex = (imageIndex >= this.vehicles[vehicleIndex].NormalPath.length) ? 0 : imageIndex;
		imageIndex = (imageIndex < 0) ? (this.vehicles[vehicleIndex].NormalPath.length - 1) : imageIndex;
		
		this.changeInfo(vehicleIndex);
		
			 	
		if (!this.currentImage)
		{
			this.currentImage = new Element('img', {'class': 'evoxVehicleImage', src: this.vehicles[vehicleIndex].NormalPath[imageIndex]});
			$(this.parentContainer).getElementsBySelector('a#vehicleLink')[0].insert(this.currentImage);
						
			this.currentVehicle = vehicleIndex;
			this.currentVehicleAngle = imageIndex;
			
			if (!$('zoomEvoxGallery5Wrapper').visible() || 
				($('zoomEvoxGallery5Wrapper').getStyle('display') == 'none'))
			{
				this.monitorLoadingImage();
			}
			this.changeZoomImage(vehicleIndex, imageIndex);
		}		
		else
		{
			this.preloadImages(vehicleIndex, imageIndex);		
			if (this.imageWaiter)
			{
				this.imageWaiter.stop();
			}
			if (this.vehicles[vehicleIndex].NormalImages[imageIndex])
			{
				this.newImage = this.vehicles[vehicleIndex].NormalImages[imageIndex];
				this.newImage.className = 'evoxVehicleImage';
			}
			if (this.newImage.complete && (this.finishValidator == 2)) 
			{
				this.finishValidator = 0;
				Effect.Queues.get($(this.parentContainer).identify()).each(function(e) { e.cancel(); });
	 			
				this.newImage.hide();
				$(this.parentContainer).getElementsBySelector('a#vehicleLink')[0].insert(this.newImage);
								  
				if (!Prototype.Browser.IE && 
					(!$('zoomEvoxGallery5Wrapper').visible() || 
					 ($('zoomEvoxGallery5Wrapper').getStyle('display') == 'none')))
				{
					new Effect.Parallel([
						new Effect.Appear($(this.newImage), { sync: true }),
						new Effect.Fade($(this.currentImage), { sync: true })
						], {
						duration: 0.5, 
						afterFinish: this.afterChangeFinish.bind(this, this.currentImage)
					});
				}
	 			else
	 			{
	 				$(this.currentImage).remove();
	 				this.newImage.show();
	 				this.finishValidator++;
					this.finishValidator++;
				}
				this.currentImage = this.newImage;
				
				this.currentVehicle = vehicleIndex;
				this.currentVehicleAngle = imageIndex;
				
				this.transitionToDrivingAngleComplete++;
	 			this.vehicleImageIsLoaded = true;
	 			this.changeZoomImage(vehicleIndex, imageIndex);
			}
			else if ($('zoomEvoxGallery5Wrapper').visible() || 
					($('zoomEvoxGallery5Wrapper').getStyle('display') != 'none'))
			{
				this.changeZoomImage(vehicleIndex, imageIndex);
			}
			else
			{
				this.imageWaiter = new PeriodicalExecuter(this.changeImage.bind(this, vehicleIndex, imageIndex), 0.5);
			}
		}
	},
	changeZoomImage: function(vehicleIndex, imageIndex)
	{
		if (!this.currentZoomImage)
		{
			this.currentZoomImage = new Element('img', {'class': 'zoomEvoxVehicleImage', src: this.vehicles[vehicleIndex].ZoomPath[imageIndex]});
			//this.zoomParentContainer.insert($(this.currentZoomImage));
			$(this.zoomParentContainer).getElementsBySelector('a#zoomVehicleLink')[0].insert(this.currentZoomImage);
			
			if ($('zoomEvoxGallery5Wrapper').visible() || 
			   ($('zoomEvoxGallery5Wrapper').getStyle('display') != 'none'))
			{
				this.monitorLoadingImage();
			}
			this.preloadImages(vehicleIndex, imageIndex);
		}		
		else
		{
			if (this.zoomImageWaiter)
			{
				this.zoomImageWaiter.stop();
			}
			if (this.vehicles[vehicleIndex].ZoomImages[imageIndex])
			{
				this.newZoomImage = this.vehicles[vehicleIndex].ZoomImages[imageIndex];
				this.newZoomImage.className = 'zoomEvoxVehicleImage';
			}
			if (this.newZoomImage.complete && (this.finishZoomValidator == 2)) 
			{
				this.finishZoomValidator = 0;
				Effect.Queues.get($(this.zoomParentContainer).identify()).each(function(e) { e.cancel(); });
	 			
				this.newZoomImage.hide();
				//this.zoomParentContainer.appendChild(this.newZoomImage);
				$(this.zoomParentContainer).getElementsBySelector('a#zoomVehicleLink')[0].insert(this.newZoomImage);
					 			
	 			if (!Prototype.Browser.IE && 
	 				($('zoomEvoxGallery5Wrapper').visible() || 
					($('zoomEvoxGallery5Wrapper').getStyle('display') != 'none')))
				{
					new Effect.Parallel([
						new Effect.Appear($(this.newZoomImage), { sync: true }),
						new Effect.Fade($(this.currentZoomImage), { sync: true })
						], {
						duration: 0.5, 
						afterFinish: this.afterZoomChangeFinish.bind(this, this.currentZoomImage)
					});
				}
	 			else
	 			{
	 				$(this.currentZoomImage).remove();
	 				this.newZoomImage.show();
	 				this.finishZoomValidator++;
					this.finishZoomValidator++;
				}
				
				this.currentZoomImage = this.newZoomImage;
				this.zoomVehicleImageIsLoaded = true;
				this.preloadImages(vehicleIndex, imageIndex);
			}
			else
			{
				this.zoomImageWaiter = new PeriodicalExecuter(this.changeZoomImage.bind(this, vehicleIndex, imageIndex), 0.5);
			}
	 	}
	},
	monitorLoadingImage: function()
	{
		if (this.imageLoadingMonitor)
		{
			this.imageLoadingMonitor.stop();
		}
		if (!$('zoomEvoxGallery5Wrapper').visible() || 
			($('zoomEvoxGallery5Wrapper').getStyle('display') == 'none'))
		{
			if ((this.parentContainer.getElementsBySelector('img').length > 0) &&
				(this.parentContainer.getElementsBySelector('img')[0].complete) && 
				(this.parentContainer.getElementsBySelector('img')[0].getHeight() > 0))
			{
				this.vehicleImageIsLoaded = true;
			}
		}
		else
		{
			if ((this.zoomParentContainer.getElementsBySelector('img').length > 0) &&
				(this.zoomParentContainer.getElementsBySelector('img')[0].complete) &&
				(this.zoomParentContainer.getElementsBySelector('img')[0].getHeight() > 0))
			{
				this.vehicleImageIsLoaded = true;	
			}
		}
		if (!this.vehicleImageIsLoaded)
		{
			this.imageLoadingMonitor = new PeriodicalExecuter(this.monitorLoadingImage.bind(this), .5);
		}
	},
	preloadImages: function(vehicleIndex, imageIndex)
	{
		var nextVehicleIndex = (vehicleIndex == (this.vehicles.length - 1)) ? 0 : vehicleIndex + 1;
		var previousVehicleIndex = (vehicleIndex == 0) ? (this.vehicles.length - 1) : vehicleIndex - 1;
		var nextImageIndex = (imageIndex == (this.vehicles[vehicleIndex].NormalPath.length - 1)) ? 0 : imageIndex + 1;
		var previousImageIndex = (imageIndex == 0) ? (this.vehicles[vehicleIndex].NormalPath.length - 1) : imageIndex - 1;
      
		if (this.vehicles[vehicleIndex].NormalImages && this.vehicles[vehicleIndex].NormalPath)
		{
			if (!this.vehicles[vehicleIndex].NormalImages[this.defaultForwardDrivingAngle])
			{
				var img = new Element('img', { src: this.vehicles[vehicleIndex].NormalPath[this.defaultForwardDrivingAngle] });
				this.vehicles[vehicleIndex].NormalImages[this.defaultForwardDrivingAngle] = $(img);
			}
			if (!this.vehicles[vehicleIndex].NormalImages[this.defaultReverseDrivingAngle])
			{
				var img = new Element('img', { src: this.vehicles[vehicleIndex].NormalPath[this.defaultReverseDrivingAngle] });
				this.vehicles[vehicleIndex].NormalImages[this.defaultReverseDrivingAngle] = $(img);
			}
			if (!this.vehicles[vehicleIndex].NormalImages[imageIndex])
			{
				var img = new Element('img', { src: this.vehicles[vehicleIndex].NormalPath[imageIndex] });
				this.vehicles[vehicleIndex].NormalImages[imageIndex] = $(img);
			}
			if (!this.vehicles[vehicleIndex].NormalImages[nextImageIndex])
			{
				var img = new Element('img', { src: this.vehicles[vehicleIndex].NormalPath[nextImageIndex] });
				this.vehicles[vehicleIndex].NormalImages[nextImageIndex] = $(img);
			}
			if (!this.vehicles[vehicleIndex].NormalImages[previousImageIndex])
			{
				var img = new Element('img', { src: this.vehicles[vehicleIndex].NormalPath[previousImageIndex] });
				this.vehicles[vehicleIndex].NormalImages[previousImageIndex] = $(img);
			}
			if (!this.vehicles[nextVehicleIndex].NormalImages[imageIndex])
			{
				var img = new Element('img', { src: this.vehicles[nextVehicleIndex].NormalPath[imageIndex] });
				this.vehicles[nextVehicleIndex].NormalImages[imageIndex] = $(img);
			}
			if (!this.vehicles[previousVehicleIndex].NormalImages[imageIndex])
			{
				var img = new Element('img', { src: this.vehicles[previousVehicleIndex].NormalPath[imageIndex] });
				this.vehicles[previousVehicleIndex].NormalImages[imageIndex] = $(img);
			}
		}
		  		
		if (this.vehicles[vehicleIndex].ZoomImages && this.vehicles[vehicleIndex].ZoomPath)
		{
			if (!this.vehicles[vehicleIndex].ZoomImages[imageIndex])
			{
				var img = new Element('img', { src: this.vehicles[vehicleIndex].ZoomPath[imageIndex] });
				this.vehicles[vehicleIndex].ZoomImages[imageIndex] = $(img);
			}
	 	 	if (!this.vehicles[vehicleIndex].ZoomImages[nextImageIndex])
			{
				var img = new Element('img', { src: this.vehicles[vehicleIndex].ZoomPath[nextImageIndex] });
				this.vehicles[vehicleIndex].ZoomImages[nextImageIndex] = $(img);
			}
	 	 	if (!this.vehicles[vehicleIndex].ZoomImages[previousImageIndex])
			{
				var img = new Element('img', { src: this.vehicles[vehicleIndex].ZoomPath[previousImageIndex] });
				this.vehicles[vehicleIndex].ZoomImages[previousImageIndex] = $(img);
			}
	 	 	if (!this.vehicles[nextVehicleIndex].ZoomImages[imageIndex])
			{
				var img = new Element('img', { src: this.vehicles[nextVehicleIndex].ZoomPath[imageIndex] });
				this.vehicles[nextVehicleIndex].ZoomImages[imageIndex] = $(img);
			}
	 	 	if (!this.vehicles[previousVehicleIndex].ZoomImages[imageIndex])
			{
				var img = new Element('img', { src: this.vehicles[previousVehicleIndex].ZoomPath[imageIndex] });
				this.vehicles[previousVehicleIndex].ZoomImages[imageIndex] = $(img);
			}
		}
	}
});