var moveLeftDiv;
var moveRightDiv;

var mouseOverPopup;

var map_move_tween;
var map_arrow_north;
var map_arrow_east;
var map_arrow_south;
var map_arrow_west;
var map_project_popup;
var map_project_popup_arrow_left;
var map_project_popup_arrow_right;

var mapImage;
var map_movementDistanceIncrement;
var map_allowedTopRange;
var map_allowedLeftRange;
var map_initialStartingLocation = [-250,0];

var movingImagesStart = 520;
var startDiv;
var imagesContainer;
var imgTween;
var imgTweenOptions = {"transition": Fx.Transitions.Expo.easeInOut, "duration": 800};

var cloud_fullImage;
var cloud_moreImages;
var cloud_leasingInfo;

var initProjectID = 1;
var currentImageNum;
var currentProjectID;
var projectIds;
var projectIdsIndex;

var projectPopupImages;

var projectFullImagePopup;

var projectMoreImagesPopup;
var projectMoreImages = [];
var projectMoreImagesIndex = 0;

var isProjectLoading = false;

window.addEvent("domready", body_DomReady);

function body_DomReady()
{
	initializeVariables();
	assignEventListeners();
	
	initProjectID = getStartProperty().get("ProjectID").toInt();
	if(location.hash != null && location.hash != "" && location.hash != "#")
	{
		initProjectID = location.hash.replace("#", "").toInt();
	}
	
	initializeWrapping();
	
	loadProjectFromID(initProjectID);
}

function initializeWrapping()
{
	var imagesChildren = imagesContainer.getChildren();
	var tmpPIDs = [];
	for(var i=1; i <= 4; i++)
	{
		tmpPIDs.unshift(projectIds.pop());
		imagesContainer.grab(imagesChildren.pop(), "top");
	}
	projectIds = tmpPIDs.combine(projectIds);
}

function initializeVariables()
{
	imagesContainer = $("imagesContainer");
	imgTween = new Fx.Tween(imagesContainer, imgTweenOptions);
	imgTween.addEvent("complete", move_Complete);
	// 182 for 169 + 10 gap + 2 border on each side + 1 for good measure ... get it ... measure? :)
	imagesContainer.style.width = imagesContainer.getChildren().length * 182 + "px";
	
	// set array of project ids for accurate project movement
	projectIds = [];
	var imagesChildren = imagesContainer.getChildren();
	for(var i=0 ; i < imagesChildren.length; i++)
	{
		var projectImage = $(imagesChildren[i]);
		projectImage.style.cursor = "pointer";
		projectIds.push(parseInt(projectImage.get("ProjectID")));
	}
	
	cloud_fullImage = $("ProjCloudLink_FullImage");
	cloud_moreImages = $("ProjCloudLink_MoreImages");
	cloud_leasingInfo = $("ProjCloudLink_LeasingInfo");
	
	mapImage = $("mapImage");
	
	map_move_tween = new Fx.Tween($("mapImage"), {transition: Fx.Transitions.Expo.easeInOut, duration: 450});
	
	moveRightDiv = $("moveRightDiv");
	moveLeftDiv = $("moveLeftDiv");
	
	map_arrow_north = $("map-arrow-north");
	map_arrow_east = $("map-arrow-east");
	map_arrow_south = $("map-arrow-south");
	map_arrow_west = $("map-arrow-west");
	
	// set map allowed range (based on image dimenstions and set current key accordingly
	map_movementDistanceIncrement = 100;
	var maxTop = (parseInt(mapImage.getSize().y) - $("SuffolkMap").getSize().y) * -1;
	var maxLeft = (parseInt(mapImage.getSize().x) - $("SuffolkMap").getSize().x) * -1;
	map_allowedTopRange = [maxTop,0];
	map_allowedLeftRange = [maxLeft,0];
	mapImage.style.margin = "0px 0px 0px 0px";
	mapImage.setStyle("margin-top", map_initialStartingLocation[0]);
	mapImage.setStyle("margin-left", map_initialStartingLocation[1]);
	calibrateMapKey({
			top: parseInt(mapImage.style.marginTop),
			left: parseInt(mapImage.style.marginLeft)
		});
	
	map_project_popup = $("map-project-popup");
	map_project_popup.set("opacity", 0);
	var popupSize = map_project_popup.getSize();
	map_project_popup.set("width", popupSize.x);
	map_project_popup.set("height", popupSize.y);
	
	map_project_popup_arrow_left = $("popup-arrow-left");
	map_project_popup_arrow_right = $("popup-arrow-right");
	
	mouseOverPopup = false;
	
	projectPopupImages = [];
	
	projectFullImagePopup = $("project-fullimage-popup");
	projectFullImagePopup.set("opacity", 0);
	
	projectMoreImagesPopup = $("project-moreimages-popup");
	projectMoreImagesPopup.set("opacity", 0);
	projectMoreImagesPopup.setStyle("top", (screen.availHeight / 2) - projectMoreImagesPopup.getSize().y / 2 - 150 );
	projectMoreImagesPopup.setStyle("left", (screen.availWidth / 2) - projectMoreImagesPopup.getSize().x / 2 - 190 );
}

function assignEventListeners()
{
	// info cloud
	cloud_fullImage.addEvent("click", function(event)
	{
		event.stop();
		
		var selectedImage = getImageFromProjectID(currentProjectID).getChildren()[0].getChildren()[0];
		var showImage = $(document.createElement("IMG"));
		showImage.set("src", selectedImage.get("src").replace("_small", ""));
		showImage.set("title", "Click to close");
		$("fullimage-image-container").set("html", "");
		$("fullimage-image-container").appendChild(showImage);
		projectFullImagePopup.setStyle("top", (screen.availHeight / 2) - projectFullImagePopup.getSize().y / 2 - 100 );
		projectFullImagePopup.setStyle("left", (screen.availWidth / 2) - projectFullImagePopup.getSize().x / 2 );
		projectFullImagePopup.fade(1);
		
		showImage.addEvent("click", function(event)
		{
			projectFullImagePopup.fade(0);
		});
	});
	cloud_moreImages.addEvent("click", function(event)
	{
		event.stop();
		loadMoreImagesPopup(currentProjectID);
	});
	cloud_leasingInfo.addEvent("click", function(event)
	{
		event.stop();
		location.href = "/index.cfm/Leasing?PropID=" + currentProjectID;
	});
	
	$("mapImage").addEvent("mousewheel", function(event)
	{
		event.stop();
		if(event.shift)
		{
			if(event.wheel > 0)
			{
				moveMap("east");
			}
			else
			{
				moveMap("west");
			}
		}
		else
		{
			if(event.wheel > 0)
			{
				moveMap("north");
			}
			else
			{
				moveMap("south");
			}
		}
	});
	
	moveLeftDiv.addEvent("click", function(event)
	{
		moveProjectSlider("left");
	});
	
	moveRightDiv.addEvent("click", function(event)
	{
		moveProjectSlider("right");
	});
	
	map_arrow_north.addEvent("click", function(event)
	{
		if(event.shift)
		{
			moveMap("reset");
		}
		else
		{
			moveMap("north");
		}
		
	});
	map_arrow_east.addEvent("click", function(event)
	{
		moveMap("east");
	});
	map_arrow_south.addEvent("click", function(event)
	{
		moveMap("south");
	});
	map_arrow_west.addEvent("click", function(event)
	{
		moveMap("west");
	});
	
	// a delay in label placement is needed because FF can't measure the labels quick enough if not cached
	placeMapLabels.delay(1800);
	
	var imagesChildren = imagesContainer.getChildren();
	for(var i=0 ; i < imagesChildren.length; i++)
	{
		var projectImage = $(imagesChildren[i]);
		projectImage.addEvent("click", function(event)
		{
			loadProjectFromID(this.get("ProjectID").toInt());
		});
	}
	
	map_project_popup.addEvent("mouseenter", function(event)
	{
		mouseOverPopup = true;
	});
	map_project_popup.addEvent("mouseleave", function(event)
	{
		mouseOverPopup = false;
		unloadPopup.delay(500);
	});
	
	map_project_popup_arrow_left.addEvent("click", function(event)
	{
		movePopupImages("left");
	});
	
	map_project_popup_arrow_right.addEvent("click", function(event)
	{
		movePopupImages("right");
	});
}

function placeMapLabels()
{
	var imgMapAreas = $("map-imagemap-locations").getChildren();
	for(var i=0; i < imgMapAreas.length; i++)
	{
		var area = $(imgMapAreas[i]);
		var star = area.getChildren()[1];
		var label = area.getChildren()[0];
		
		star.addEvent("mouseenter", imageMapStar_MouseEnter);
		star.addEvent("mouseleave", imageMapStar_MouseLeave);
		
		// move labels
		var labelWidth = label.getSize().x.toInt();
		label.setStyle("left", (labelWidth + 5) * -1);
		label.setStyle("opacity", 1);
	}
}

function movePopupImages(direction)
{
	var container = $("PopupImageSliderContainer");
	var distance = parseInt(container.getParent().getStyle("width"));
	var maxDistance = (container.getChildren().length - 1) * distance;
	var newLeft = parseInt(container.getStyle("margin-left"));
	if(isNaN(newLeft)){ newLeft = 0; }
	
	switch(direction.toLowerCase())
	{
		case "left":
			newLeft += distance;
		break;
		case "right":
			newLeft -= distance;
		break;
	}
	
	// if reached too far (but haven't clicked to try to move yet) disable arrow
	if(newLeft + distance > 0)
	{
		map_project_popup_arrow_left.fade(0.3);
	}
	else
	{
		map_project_popup_arrow_left.fade(1);
	}
	if(newLeft - distance < maxDistance * -1)
	{
		map_project_popup_arrow_right.fade(0.3);
	}
	else
	{
		map_project_popup_arrow_right.fade(1);
	}
	
	// don't move if too far
	if(newLeft > 0 || newLeft < maxDistance * -1)
	{
		return;
	}
	
	container.tween("margin-left", newLeft);
}

function imageMapStar_MouseEnter(event)
{
	var prnt = this.getParent();
	loadPopup(prnt.get("NeighborhoodID"), 
		prnt.getPosition().x.toInt(), 
		prnt.getPosition().y.toInt());
}
function imageMapStar_MouseLeave(event)
{
	mouseOverPopup = false;
	unloadPopup.delay(1000);
}

function loadMoreImagesPopup(id)
{
	// load images
	projectMoreImagesPopup.fade(1);
	var container = $("moreimages-image-container");
	if(projectMoreImages[id] == null)
	{
		container.set("html", "Retrieving...");
		var portproxy_Callback = function(result)
		{
			if(result == null)
			{
				portproxy_Error(0, "Result is null");
				return;
			}
			projectPopupImages[currentProjectID] = result.clean();
			loadMoreImagesPopupImages(projectPopupImages[currentProjectID]);
		}
		var portproxy_Error = function(errorCode, errorMessage)
		{
			alert("We are experiencing difficulties retrieving remote data.\n\nPlease check your Internet connection and try again.");
			var fadeOut = function(){ projectMoreImagesPopup.fade(0); }
			fadeOut.delay(10);
		}
		var portproxy = new CGPortfolioProxy();
		portproxy.setErrorHandler(portproxy_Error);
		portproxy.setCallbackHandler(portproxy_Callback);
		portproxy.GetPortfolioNeighborhoodImagesFromProjectID(id);
	}
	else
	{
		loadMoreImagesPopupImages(projectPopupImages[currentProjectID]);
	}
}
function loadMoreImagesPopupImages(images)
{
	var container = $("moreimages-image-container");
	var objImage = new Element("IMG");
	projectMoreImagesIndex = 0;
	
	// arrows
	a_left = $("moreimages-arrow-left");
	a_right = $("moreimages-arrow-right");
	
	a_left.setStyle("opacity", 0.3);
	a_right.setStyle("opacity", 1);
	
	// some values are blank strings, not null, so clean won't clean them
	images.each(function(item, index, array)
	{
		if(item == "")
		{
			array.erase(item);
		}
	});
	
	if(images.length <= 1)
	{
		if(images.length == 0)
		{
			container.set("html", "No images associated.");
			return;
		}
		if(images.length == 1)
		{
			a_left.setStyle("display", "none");
			a_right.setStyle("display", "none");
		}
	}
	else
	{
		a_left.setStyle("display", "");
		a_right.setStyle("display", "");
	}
	
	container.set("html", "");
	var containerSizes = container.getParent().getSize();
	
	objImage.set("src", "/graphics/portfolio/" + currentProjectID + "/" + images[0]);
	objImage.setStyle("cursor", "pointer");
	objImage.addEvent("click", function(event)
	{
		projectMoreImagesPopup.fade(0);
	});
	
	container.set("title", "Click to close");
	container.appendChild(objImage);
	
	a_left.removeEvents("click");
	a_right.removeEvents("click");
	
	a_left.addEvent("click", function(event)
	{
		if(projectMoreImagesIndex-1 < 0)
		{
			return;
		}
		moveMoreImages("left", objImage, images);
	});
	
	a_right.addEvent("click", function(event)
	{
		if(projectMoreImagesIndex+1 >= images.length)
		{
			return;
		}
		moveMoreImages("right", objImage, images);
	});
}

function moveMoreImages(direction, containerImg, images)
{
	var newIndex = projectMoreImagesIndex;
	switch(direction)
	{
		case "left":
			projectMoreImagesIndex--;
		break;
		case "right":
			projectMoreImagesIndex++;
		break;
	}
	
	if(projectMoreImagesIndex == 0)
	{
		a_left.fade(0.3);
	}
	else
	{
		a_left.fade(1);
	}
	
	if(projectMoreImagesIndex+1 == images.length)
	{
		a_right.fade(0.3);
	}
	else
	{
		a_right.fade(1);
	}
	
	containerImg.set("src", "/graphics/portfolio/" + currentProjectID + "/" + images[projectMoreImagesIndex]);
}

function loadPopup(id, x, y)
{
	mouseOverPopup = true;
	map_project_popup.setStyle("top", y);
	map_project_popup.setStyle("left", x);
	map_project_popup.fade(1);
	map_project_popup_arrow_left.setStyle("opacity", 0.3);
	map_project_popup_arrow_right.setStyle("opacity", 1);
	
	// load images
	var container = $("PopupImageSliderContainer");
	container.setStyle("margin-left", 0);
	if(projectPopupImages[id] == null)
	{
		container.set("html", "Retrieving...");
		var portproxy = new CGPortfolioProxy();
		var portproxy_Callback = function(result)
		{
			if(result == null)
			{
				portproxy_Error(0, "Result is null");
				return;
			}
			projectPopupImages[id] = result;
			loadPopupImages(projectPopupImages[id]);
		}
		var portproxy_Error = function(errorCode, errorMessage)
		{
			alert("We are experiencing difficulties retrieving remote data.\n\nPlease check your Internet connection and try again.");
			var fadeOut = function(){ map_project_popup.fade(0); }
			fadeOut.delay(10);
		}
		portproxy.setCallbackHandler(portproxy_Callback);
		portproxy.setErrorHandler(portproxy_Error);
		portproxy.GetPortfolioNeighborhoodImages(id);
	}
	else
	{
		loadPopupImages(projectPopupImages[id]);
	}
}
function unloadPopup()
{
	if (!mouseOverPopup)
	{
		map_project_popup.fade(0);
	}
}
function loadPopupImages(images)
{
	var container = $("PopupImageSliderContainer");
	if (images.length <= 1)
	{
		if(images.length == 1)
		{
			map_project_popup_arrow_left.setStyle("display", "none");
			map_project_popup_arrow_right.setStyle("display", "none");
		}
		if (images.length == 0) {
			container.set("html", "No images associated.");
			return;
		}
	}
	else
	{
		map_project_popup_arrow_left.setStyle("display", "");
		map_project_popup_arrow_right.setStyle("display", "");
	}
	
	// adjust popup location based on size from arrow display
	map_project_popup.setStyle("top", map_project_popup.getStyle("top").toInt() - map_project_popup.getSize().y - 10)
	map_project_popup.setStyle("left", map_project_popup.getStyle("left").toInt() - map_project_popup.getSize().x / 2 + 10)
	
	container.set("html", "");
	var containerSizes = container.getParent().getSize();
	container.setStyle("width", 0);
	for(var i=0; i < images.length; i++)
	{
		var image = images[i];
		if(image.IMAGE == null || image.IMAGE == "")
		{
			continue;
		}
		var img = $(document.createElement("IMG"));
		img.set("src", "/graphics/portfolio/" + image.PROJECTID + "/" + image.IMAGE);
		img.setStyle("width", containerSizes.x);
		img.setStyle("height", containerSizes.y);
		img.set("ProjectID", image.PROJECTID);
		img.setStyle("cursor", "pointer");
		img.addEvent("click", function(event)
		{
			loadProjectFromID(this.get("ProjectID"));
		});
		
		container.appendChild(img);
	}
	if(img == null)
	{
		container.set("html", "No images associated.");
		return;
	}
	container.setStyle("width", container.getChildren().length * parseInt(img.getStyle("width")))
	container.set("title", "Click to view property");
}

function loadProjectFromID(id)
{
	id = parseInt(id);
	
	// nothing else should try to load if another project is loading
	if(isProjectLoading)
	{
		return;
	}
	isProjectLoading = true;
	
	// if project id doesn't exist -- stop
	if(projectIds.length == 0)
	{
		return;
	}
	if(projectIds.indexOf(id) == -1)
	{
		if(currentProjectID == null)
		{
			id = projectIds[0];
		}
	}
	
	var initProj = new CGPortfolioProxy();
	var initProj_Callback = function(result)
	{
		if(result == null)
		{
			initProj_Error(0, "Result is null");
			return;
		}
		
		// set global variables
		currentProjectID = id;
		assignProjectIdsIndex();
		assignCurrentImageNumber(getImageFromProjectID(currentProjectID).get("ImageNumber"));
		location.hash = currentProjectID;
		
		var imagesChildren = imagesContainer.getChildren();
		if(projectIdsIndex < 4)
		{
			// prepend
			for(var i = 0; i < 4 - projectIdsIndex; i++)
			{
				var lastProjID = projectIds.pop();
				projectIds.unshift(lastProjID);
				
				var lastProj = imagesChildren.pop();
				
				var imgsWidth = parseInt(lastProj.getStyle("width"));
				
				imagesContainer.grab(lastProj, "top");
				shiftByProjects(-1);
			}
		}
		else if(projectIdsIndex > (imagesChildren.length - 5))
		{
			var addCount = projectIdsIndex - (imagesChildren.length - 5);
			for (var i = 0; i < addCount; i++)
			{
				// move project from front to end
				projectIds.push(projectIds.shift());
				
				imagesContainer.grab(imagesChildren.shift(), "bottom");
				shiftByProjects(1);
			}
		}
		
		//reassign current project index
		assignProjectIdsIndex();
		
		// move project image to current
		moveProjectSliderToProjectID(currentProjectID);
		
		// hide/show leasing info link
		var leasingLink = $("LeasingInfoLinkDiv");
		var leaseValue = Number(toBoolean(result.ISLEASING));
		leasingLink.fade(leaseValue);
		
		// set title
		$("ProjCloud_Title").set("text", result.TITLE);
		$("PortTitle").set("text", result.TITLE);
		// location
		var fullAddress = result.ADDRESS + " " + result.CITY
		if(result.hasOwnProperty("STATE") && result.STATE != '')
		{
			fullAddress += ", " + result.STATE;
		}
		$("ProjCloud_Location").set("text", fullAddress);
		$("PortLocation").set("text", fullAddress);
		// property type
		$("PortPropertyType").set("text", result.PROPERTYTYPE);
		// acq. date
		$("PortAcquisitionDate").set("text", result.ACQUISITIONDATE);
		// size
		$("PortSize").set("text", result.SIZE);
		// key tennants
		$("PortKeyTenantsUl").set("html", "");
		for(var i=0; i < result.KEYTENANTS.length; i++)
		{
			var ten = document.createElement("LI");
			var ten_text = document.createTextNode(result.KEYTENANTS[i]);
			ten.appendChild(ten_text);
			$("PortKeyTenantsUl").appendChild(ten);
		}
		// desc
		$("PortDescription").set("html", result.DESCRIPTION);
		// notes
		//$("PortNotes").set("html", result.NOTES);
		
		/*
		if(result.NOTES == "")
		{
			$("NotesDisplay").setStyle("display", "none");
		}
		*/
		if(result.DESCRIPTION == "")
		{
			$("DescriptionDisplay").setStyle("display", "none");
		}
		if(result.KEYTENANTS.length == 0)
		{
			$("KeyTenantsDisplay").setStyle("display", "none");
		}
		if(result.ACQUISITIONDATE == "")
		{
			$("AcquisitionDateDisplay").setStyle("display", "none");
		}
		if(result.SIZE == "0")
		{
			$("SizeDisplay").setStyle("display", "none");
		}
	}
	var initProj_Error = function(errorCode, errorMessage)
	{
		alert("We are experiencing difficulties retrieving remote data.\n\nPlease check your Internet connection and try again.");
	}
	
	initProj.setCallbackHandler(initProj_Callback);
	initProj.setErrorHandler(initProj_Error);
	// get initial project data
	initProj.setAsyncMode();
	initProj.GetProjectFromID(id);
}
function loadNextProject()
{
	// check project loading otherwise ID index will be increased w/o project load
	if(isProjectLoading){ return; }
	// load project
	loadProjectFromID(projectIds[++projectIdsIndex]);
}
function loadPreviousProject()
{
	// check project loading otherwise ID index will be increased w/o project load
	if(isProjectLoading){ return; }
	// load project
	loadProjectFromID(projectIds[--projectIdsIndex]);
}

function getStartProperty()
{
	return getNthProperty(4);
}

function getNthProperty(n)
{
	return imagesContainer.getChildren()[n-1]
}

function getFeaturedProperty(random)
{
	var imgs = imagesContainer.getChildren();
	var featured = [];
	for(var i=0; i < imgs.length; i++)
	{
		var property = imgs[i];
		if(property.get("FeaturedProperty") == "1")
		{
			if(random != null && random)
			{
				featured.push(property);
			}
			else
			{
				return property;
			}
		}
	}
	
	return featured.getRandom();
}

function getPropertySpotlight(random)
{
	var imgs = imagesContainer.getChildren();
	var spotlights = [];
	for(var i=0; i < imgs.length; i++)
	{
		var property = imgs[i];
		if(property.get("PropertySpotlight") == "1")
		{
			if(random != null && random)
			{
				spotlights.push(property);
			}
			else
			{
				return property;
			}
		}
	}
	
	return spotlights.getRandom();
}

function getImageFromProjectID(pid)
{
	var allDivs = $$("div");
	for(var i=0; i < allDivs.length; i++)
	{
		var div = allDivs[i];
		if(div.get("ProjectID") != null && div.get("ProjectID") == pid)
		{
			return div;
			break;
		}
	}
}

function getProjectIDFromIndexN(n)
{
	var nCount = 0;
	for(var index in projectIds)
	{
		if(nCount == n)
		{
			return parseInt(projectIds[nCount]);
			break;
		}
		nCount++;
	}
}

function incrementCurrentImageNumber()
{
	var projectsCount = imagesContainer.getChildren().length;
	if(currentImageNum+1 >= projectsCount)
	{
		currentImageNum = projectsCount;
	}
	else
	{
		assignCurrentImageNumber(++currentImageNum);
	}
	return currentImageNum;
}
function decrementCurrentImageNumber()
{
	if(currentImageNum-1 < 1)
	{
		currentImageNum = 1;
	}
	else
	{
		assignCurrentImageNumber(--currentImageNum);
	}
	return currentImageNum;
}
function assignCurrentImageNumber(value)
{
	currentImageNum = parseInt(value);
	
	return currentImageNum;
}

function assignProjectIdsIndex()
{
	/*for(var i=0; i < projectIds.length; i++)
	{
		if(projectIds[i] == currentProjectID)
		{
			projectIdsIndex = i;
			return projectIdsIndex;
			break;
		}
	}*/
	projectIdsIndex = projectIds.indexOf(currentProjectID);
	return projectIdsIndex;
}

function moveMap(direction)
{
	var mapImage = $("mapImage");
	var currentTop = parseInt(mapImage.style.marginTop);
	var currentLeft = parseInt(mapImage.style.marginLeft);
	
	var style = "";
	var styleValue = "";
	switch(direction.toLowerCase())
	{
		case "reset":
			map_move_tween.start("margin-top",map_initialStartingLocation[0]).chain(
				function()
				{
					map_move_tween.start("margin-left",map_initialStartingLocation[1]);
				});
			calibrateMapKey({top:map_initialStartingLocation[0], left:map_initialStartingLocation[1]});
		break;
		case "south":
			style = "margin-top";
			styleValue = currentTop - map_movementDistanceIncrement;
			if(styleValue < map_allowedTopRange[0])
			{
				styleValue = map_allowedTopRange[0];
			}
		break;
		case "north":
			style = "margin-top";
			styleValue = currentTop + map_movementDistanceIncrement;
			if(styleValue > map_allowedTopRange[1])
			{
				styleValue = map_allowedTopRange[1];
			}
		break;
		case "east":
			style = "margin-left";
			styleValue = currentLeft + map_movementDistanceIncrement;
			if(styleValue > map_allowedLeftRange[1])
			{
				styleValue = map_allowedLeftRange[1];
			}
		break;
		case "west":
			style = "margin-left";
			styleValue = currentLeft - map_movementDistanceIncrement;
			if(styleValue < map_allowedLeftRange[0])
			{
				styleValue = map_allowedLeftRange[0];
			}
		break;
	}
	
	switch(style)
	{
		case "margin-top":
			calibrateMapKey({top: styleValue, left: currentLeft});
		break;
		case "margin-left":
			calibrateMapKey({top: currentTop, left: styleValue});
		break;
	}
	
	map_move_tween.start(style,styleValue + "px");
}

/*
 * coordData = {top: value, left: value}
 */
function calibrateMapKey(coordData)
{
	if(coordData.top != null)
	{
		if(coordData.top == map_allowedTopRange[0])
		{
			map_arrow_south.fade(0.3);
		}
		else
		{
			map_arrow_south.fade(1);
		}
		
		if(coordData.top == map_allowedTopRange[1])
		{
			map_arrow_north.fade(0.3);
		}
		else
		{
			map_arrow_north.fade(1);
		}
	}
	
	if(coordData.left != null)
	{
		if(coordData.left == map_allowedLeftRange[0])
		{
			map_arrow_west.fade(0.3);
		}
		else
		{
			map_arrow_west.fade(1);
		}
		
		if(coordData.left == map_allowedLeftRange[1])
		{
			map_arrow_east.fade(0.3);
		}
		else
		{
			map_arrow_east.fade(1);
		}
	}
}

function moveProjectSlider(direction)
{
	switch(direction.toLowerCase())
	{
		case "right":
			loadNextProject();
		break;
		case "left":
			loadPreviousProject();
		break;
	}
}

function moveProjectSliderToProjectID(id)
{
	//moveProjectSliderToImageNumber(getImageFromProjectID(id).get("ImageNumber"));
	moveProjectSliderToImageNumber(projectIds.indexOf(currentProjectID) + 1);
}

/*
 * Image number is the metric used to calculate project image location
 * This is always the last function called where image number or project id's are still known
 */
function moveProjectSliderToImageNumber(num)
{
	// equation (where i is the zero-based index of the image)
	// (w)i [w = width of each image] + 10i [10 is the gap between each image] + 2i [1px border on right side of i-1 and left side of i] + (w/2) [middle of current image]
	// ----> 181i + 100
	var imgsWidth = parseInt(imagesContainer.getChildren()[0].getStyle("width"));
	moveByPixels(movingImagesStart - ((imgsWidth + 10 + 2) * (num-1) + (imgsWidth/2)));
	assignCurrentImageNumber(num);
}

/*
 * All MOVE functions eventually call this function
 */
function moveByPixels(distance)
{
	imgTween.start("margin-left", distance + "px");
}

/*
 * Moves slider by a specified amount of projects -- DOES NOT ANIMATE
 * Negative numbers move the slider to the left
 */
function shiftByProjects(amount)
{
	var imgsWidth = parseInt(imagesContainer.getChildren()[0].getStyle("width"));
	var moveValue = parseInt( imagesContainer.getStyle("margin-left"));
	moveValue -= (imgsWidth + (10 + 2)) * (amount * -1);
	imagesContainer.setStyle("margin-left", moveValue);
}

//***************************//
//***** EVENT HANDLERS ******//
//***************************//

function move_Complete(event)
{
	var currentLeft = parseInt(imagesContainer.style.marginLeft);
	if(isNaN(currentLeft))
	{
		currentLeft = 0;
		imagesContainer.style.marginLeft = "0px";
	}
	
	if(currentLeft == 0)
	{
		moveRightDiv.fade(0.3);
	}
	else
	{
		moveRightDiv.fade(1);
	}
	// PROJECT LOADED
	isProjectLoading = false;
}


//***************************//
//******** UTILITIES ********//
//***************************//

function toBoolean(value)
{
	var lvalue = value;
	if (isNaN(lvalue.toInt()))
	{
		var lvalue = value.toLowerCase();
	}
	return (lvalue == "true" || lvalue == 1 || lvalue == "yes");
}

//***************************//
//********* CLASSES *********//
//***************************//

// EVENTS

