/*
** Project Menu Interaction
** Bluewire Media Pty Ltd
** Project Manager: Sarah hyne (sarah.hyne@bluewiremedia.com.au)
** Developer: Jake Pospischil (jake.pospischil@bluewiremedia.com.au)
*/

// page & elements to activate on
var projectMenuActivePage = "Projects";
var masterElements = "#subMenu a";
var slaveElements = "#projectMenu a";

// map icon element reference
var mapIcon = "mapPoint";

// preview image area element reference
var previewImageArea = "#leftContent td";

// default preview image fade duration
var defaultImageDuration = 3000;

// project menu rel attributes
var projectRelMaster = "project-master";
var projectRelSlave = "project-slave";

// menu css classes
var currentClass = "current";
var selectedClass = "selected";
var disabledClass = "disabled";

// construct menu on DomReady
window.addEvent("domready", function() {
	
	// check for Projects page
	if (currentPage == projectMenuActivePage) {
		
		// get map point
		var mapPoint = $(mapIcon);
		
		// get preview image area
		var previewImageContainer = $$(previewImageArea)[0];
		
		// get master and slave links
		var masterLinks = $$(masterElements).filter(function(masterLink) {
			return masterLink.rel && masterLink.rel.test(projectRelMaster);
		});
		var slaveLinks = $$(slaveElements).filter(function(slaveLink) {
			return slaveLink.rel && slaveLink.rel.test(projectRelSlave);
		});
		
		// adds event listeners for master links
		masterLinks.each(function(masterLink) {
			
			// initializes forClass & disabled properties
			masterLink.forClass = masterLink.rel.replace(/^.*?c:(\w+).*?$/, "$1");
			masterLink.disabled = false;
			masterLink.selected = false;
			
			// MouseOver listener to set classes
			masterLink.addEvent("mouseover", function() {
				if (!this.disabled) {
					setClassCurrent(projectRelSlave, this.forClass, true);
				}
			});
			
			// MouseOut listener to remove classes
			masterLink.addEvent("mouseout", function() {
				if (!this.disabled && !this.selected) {
					setClassCurrent(projectRelSlave, this.forClass, false);
				}
			});
			
			// Click listener to add & remove selected/disabled classes
			masterLink.addEvent("click", function() {
				setSelected(this);
			});
			
		});
		
		// adds event listeners for slave links
		slaveLinks.each(function(slaveLink) {
			
			// initializes forClass values & map icon location
			slaveLink.forLocativeClass = slaveLink.rel.replace(/^.*?lc:(\w+).*?$/, "$1");
			slaveLink.forDescriptiveClass = slaveLink.rel.replace(/^.*?dc:(\w+).*?$/, "$1");
			slaveLink.mapPointX = Number(slaveLink.rel.replace(/^.*?x:(\d+).*?$/, "$1"));
			slaveLink.mapPointY = Number(slaveLink.rel.replace(/^.*?y:(\d+).*?$/, "$1"));
			
			// initializes and preloads preview image
			slaveLink.previewImage = new Asset.image(slaveLink.rel.replace(/^.*?i:(.*?)\].*?$/, "$1"));
			
			// MouseOver listener to set classes & map icon styles and show preview image
			slaveLink.addEvent("mouseover", function() {
				
				// adds current classes
				setClassCurrent(projectRelMaster, this.forLocativeClass, true);
				setClassCurrent(projectRelMaster, this.forDescriptiveClass, true);
				
				// displays and repositions map icon
				mapPoint.setStyles({
					display: "block",
					top: this.mapPointY,
					left: this.mapPointX
				});
				
				// adds preview image to container
				previewImageContainer.empty();
				if (this.previewImage == defaultImage) {
					defaultImageAnim.set(1);
					defaultImageAnim.cancel();
				}
				this.previewImage.inject(previewImageContainer);
				
			});
			
			// MouseOut listener to remove classes & map icon styles and hide preview image
			slaveLink.addEvent("mouseout", function() {
				
				// removes current classes
				setClassCurrent(projectRelMaster, this.forLocativeClass, false);
				setClassCurrent(projectRelMaster, this.forDescriptiveClass, false);
				
				// hides map icon
				mapPoint.setStyle("display", "none");
				
				// removes preview image
				previewImageContainer.empty();
				if (this.previewImage != defaultImage) {
					defaultImageAnim.set(0);
					defaultImageAnim.start(0, 1);
				}
				defaultImage.inject(previewImageContainer);
				
			});
			
		});
		
		// sets & displays default project image
		var defaultImage = slaveLinks[0].previewImage;
		defaultImage.inject(previewImageContainer);
		
		// initializes fade tween for default project image
		var defaultImageAnim = new Fx.Tween(defaultImage, {
			property: "opacity",
			unit: "",
			duration: defaultImageDuration,
			transition: Fx.Transitions.linear,
			link: "cancel"
		});
		
		// sets all elements of the specified type & class to current, or reverts to normal
		function setClassCurrent(linkType, className, setCurrent) {
			
			// initializes link array to apply classes to
			setLinks = (linkType == projectRelMaster)? masterLinks: slaveLinks;
			setLinks.each(function(setLink) {
									 
				// adds or removes current class from element
				if (className == "" || setLink.hasClass(className)) {
					if (setCurrent) {
						setLink.addClass(currentClass);
					}
					else {
						setLink.removeClass(currentClass);	
					}
				}
				
			});
			
		}
		
		// sets passed element to selected and others to disabled
		function setSelected(element) {
			
			// reset all if link is currently selected
			if (element.selected) {
				
				masterLinks.each(function(masterLink) {
					masterLink.selected = false;
					masterLink.disabled = false;
					masterLink.removeClass(selectedClass);
					masterLink.removeClass(disabledClass);
				});
				
			}
			
			// else set new link to current
			else {
				
				// remove classes from all slave links and set for current element's slaves
				setClassCurrent(projectRelSlave, "", false);
				setClassCurrent(projectRelSlave, element.forClass, true);
				
				// set classes on master links
				masterLinks.each(function(masterLink) {
					
					if (masterLink == element) {
						masterLink.selected = true;
						masterLink.disabled = false;
						masterLink.addClass(selectedClass);
						masterLink.removeClass(disabledClass);
					}
					else {
						masterLink.selected = false;
						masterLink.disabled = true;
						masterLink.removeClass(selectedClass);
						masterLink.addClass(disabledClass);
					}
					
				});
				
			}
			
		}
		
	}
	
});
